From d2dd6dc6ff8113be57b9f55d3188f766cce8052b Mon Sep 17 00:00:00 2001 From: sunag Date: Sat, 14 Mar 2026 03:28:07 -0300 Subject: [PATCH 1/5] Inspector: Introduce TSL Graph Addons (#33165) --- examples/files.json | 1 + examples/jsm/inspector/Inspector.js | 43 + .../addons/tsl-graph/TSLGraphEditor.js | 750 ++++++++++ .../addons/tsl-graph/TSLGraphLoader.js | 281 ++++ examples/jsm/inspector/ui/Profiler.js | 112 +- examples/jsm/inspector/ui/Style.js | 24 + examples/jsm/inspector/ui/Tab.js | 6 +- examples/screenshots/webgpu_tsl_graph.jpg | Bin 0 -> 43410 bytes examples/shaders/tsl-graphs.json | 1309 +++++++++++++++++ .../monochrome_studio_02_1k.hdr | Bin 0 -> 1562415 bytes examples/webgpu_tsl_graph.html | 401 +++++ src/nodes/utils/Remap.js | 2 +- src/renderers/common/InspectorBase.js | 7 +- 13 files changed, 2896 insertions(+), 40 deletions(-) create mode 100644 examples/jsm/inspector/addons/tsl-graph/TSLGraphEditor.js create mode 100644 examples/jsm/inspector/addons/tsl-graph/TSLGraphLoader.js create mode 100644 examples/screenshots/webgpu_tsl_graph.jpg create mode 100644 examples/shaders/tsl-graphs.json create mode 100644 examples/textures/equirectangular/monochrome_studio_02_1k.hdr create mode 100644 examples/webgpu_tsl_graph.html diff --git a/examples/files.json b/examples/files.json index 0d5047fcf322aa..c984fe0a55f4a3 100644 --- a/examples/files.json +++ b/examples/files.json @@ -479,6 +479,7 @@ "webgpu_tsl_earth", "webgpu_tsl_editor", "webgpu_tsl_galaxy", + "webgpu_tsl_graph", "webgpu_tsl_halftone", "webgpu_tsl_interoperability", "webgpu_tsl_procedural_terrain", diff --git a/examples/jsm/inspector/Inspector.js b/examples/jsm/inspector/Inspector.js index 482a7c137d328e..1d6fd9697ae614 100644 --- a/examples/jsm/inspector/Inspector.js +++ b/examples/jsm/inspector/Inspector.js @@ -44,6 +44,7 @@ class Inspector extends RendererInspector { // init profiler const profiler = new Profiler(); + profiler.addEventListener( 'resize', ( e ) => this.dispatchEvent( e ) ); const parameters = new Parameters( { builtin: true, @@ -111,6 +112,48 @@ class Inspector extends RendererInspector { } + hide() { + + this.profiler.hide(); + + } + + show() { + + this.profiler.show(); + + } + + getSize() { + + return this.profiler.getSize(); + + } + + setActiveTab( tab ) { + + this.profiler.setActiveTab( tab.id ); + + return this; + + } + + addTab( tab ) { + + this.profiler.addTab( tab ); + + return this; + + } + + removeTab( tab ) { + + this.profiler.removeTab( tab ); + + return this; + + } + resolveConsoleOnce( type, message ) { const key = type + message; diff --git a/examples/jsm/inspector/addons/tsl-graph/TSLGraphEditor.js b/examples/jsm/inspector/addons/tsl-graph/TSLGraphEditor.js new file mode 100644 index 00000000000000..e806c17687d955 --- /dev/null +++ b/examples/jsm/inspector/addons/tsl-graph/TSLGraphEditor.js @@ -0,0 +1,750 @@ +import { error } from 'three/webgpu'; +import { Tab } from '../../ui/Tab.js'; +import { TSLGraphLoader } from './TSLGraphLoader.js'; + +const HOST_SOURCE = 'tsl-graph-host'; +const EDITOR_SOURCE = 'tsl-graph-editor'; + +const _resposeByCommand = { + 'tsl:command:get-code': 'tsl:response:get-code', + 'tsl:command:set-root-material': 'tsl:response:set-root-material', + 'tsl:command:get-graph': 'tsl:response:get-graph', + 'tsl:command:load': 'tsl:response:load', + 'tsl:command:clear-graph': 'tsl:response:clear-graph' +}; + +const _refMaterials = new WeakMap(); + +export class TSLGraphEditor extends Tab { + + constructor( options = {} ) { + + super( 'TSL Graph', options ); + + const editorUrl = new URL( 'https://www.tsl-graph.xyz/editor/standalone' ); + editorUrl.searchParams.set( 'graphs', 'material' ); + editorUrl.searchParams.set( 'targetOrigin', '*' ); + + // UI Setup + this.content.style.display = 'flex'; + this.content.style.flexDirection = 'column'; + this.content.style.position = 'relative'; + + const headerDiv = document.createElement( 'div' ); + headerDiv.style.padding = '4px'; + headerDiv.style.backgroundColor = 'var(--profiler-header-bg, #2a2a33aa)'; + headerDiv.style.borderBottom = '1px solid var(--profiler-border, #4a4a5a)'; + headerDiv.style.display = 'flex'; + headerDiv.style.justifyContent = 'center'; + headerDiv.style.gap = '4px'; + + const importBtn = document.createElement( 'button' ); + importBtn.innerHTML = ''; + importBtn.className = 'panel-action-btn'; + importBtn.title = 'Import'; + importBtn.style.padding = '5px 8px'; + importBtn.onclick = () => this._importData(); + + const exportBtn = document.createElement( 'button' ); + exportBtn.innerHTML = ''; + exportBtn.className = 'panel-action-btn'; + exportBtn.title = 'Export'; + exportBtn.style.padding = '5px 8px'; + exportBtn.onclick = () => this._exportData(); + + const manageBtn = document.createElement( 'button' ); + manageBtn.innerHTML = ''; + manageBtn.className = 'panel-action-btn'; + manageBtn.title = 'Saved Materials'; + manageBtn.style.padding = '5px 8px'; + manageBtn.onclick = () => this._showManagerModal(); + + headerDiv.appendChild( importBtn ); + headerDiv.appendChild( exportBtn ); + headerDiv.appendChild( manageBtn ); + + this.content.appendChild( headerDiv ); + + this.iframe = document.createElement( 'iframe' ); + this.iframe.style.width = '100%'; + this.iframe.style.minHeight = '600px'; + this.iframe.style.border = 'none'; + this.iframe.style.flex = '1'; + this.iframe.src = editorUrl.toString(); + this.editorOrigin = new URL( this.iframe.src ).origin; + + this.content.appendChild( this.iframe ); + + this.material = null; + this.uniforms = null; + + this.isReady = false; + + this._codeData = null; + this._codeSaveTimeout = null; + + this._pending = new Map(); + + this._resolveReady = null; + this._editorReady = new Promise( ( resolve ) => { + + this._resolveReady = resolve; + + } ); + + window.addEventListener( 'message', this.onMessage.bind( this ) ); + + } + + get hasGraphs() { + + return TSLGraphLoader.hasGraphs; + + } + + apply( scene ) { + + const loader = new TSLGraphLoader(); + const applier = loader.parse( TSLGraphLoader.getCodes() ); + applier.apply( scene ); + + return this; + + } + + restoreMaterial( material ) { + + material.copy( new material.constructor() ); + material.needsUpdate = true; + + } + + async setMaterial( material ) { + + if ( this.material === material ) return; + + await this._setMaterial( material ); + + this.dispatchEvent( { type: 'change', material } ); + + } + + async loadGraph( graphData ) { + + await this.command( 'load', { graphData } ); + + } + + async command( type, payload ) { + + type = 'tsl:command:' + type; + + await this._editorReady; + + const requestId = this._makeRequestId(); + const expectedType = _resposeByCommand[ type ]; + + return new Promise( ( resolve, reject ) => { + + const timer = window.setTimeout( () => { + + if ( ! this._pending.has( requestId ) ) return; + this._pending.delete( requestId ); + reject( new Error( `Timeout for ${type}` ) ); + + }, 5000 ); + + this._pending.set( requestId, { expectedType, resolve, reject, timer } ); + + const message = { source: HOST_SOURCE, type, requestId }; + if ( payload !== undefined ) message.payload = payload; + + this._post( message ); + + } ); + + } + + async getCode() { + + return this.command( 'get-code' ); + + } + + async getTSLFunction() { + + const graphLoader = new TSLGraphLoader(); + const applier = graphLoader.parse( await this.getCode() ); + + return applier.tslGraphFns[ 'tslGraph' ]; + + } + + async getGraph() { + + return ( await this.command( 'get-graph' ) ).graphData; + + } + + async onResponse( /*type, payload*/ ) { + + + + } + + async onEvent( type, payload ) { + + if ( type === 'ready' ) { + + if ( ! this.isReady ) { + + this.isReady = true; + + this._resolveReady(); + + } + + } else if ( type === 'graph-changed' ) { + + if ( this.material === null ) return; + + await this._updateMaterial(); + + const graphData = await this.getGraph(); + + const graphId = this.material.userData.graphId; + + TSLGraphLoader.setGraph( graphId, graphData ); + + } else if ( type === 'uniforms-changed' ) { + + this._updateUniforms( payload.uniforms ); + + } + + } + + async onMessage( event ) { + + if ( event.origin !== this.editorOrigin ) return; + if ( ! this._isEditorMessage( event.data ) ) return; + + const msg = event.data; + + if ( msg.requestId && msg.type.startsWith( 'tsl:response:' ) ) { + + const waiter = this._pending.get( msg.requestId ); + if ( ! waiter ) return; + if ( msg.type !== waiter.expectedType ) return; + + this._pending.delete( msg.requestId ); + window.clearTimeout( waiter.timer ); + + if ( msg.error ) waiter.reject( new Error( msg.error ) ); + else waiter.resolve( msg.payload ); + + this.onResponse( msg.type.substring( 'tsl:response:'.length ), msg.payload ); + + } else if ( msg.type.startsWith( 'tsl:event:' ) ) { + + this.onEvent( msg.type.substring( 'tsl:event:'.length ), msg.payload ); + + } + + } + + async _setMaterial( material ) { + + if ( ! material ) { + + this.material = null; + this.materialDefault = null; + this.uniforms = null; + + await this.command( 'clear-graph' ); + + return; + + } + + if ( material.isNodeMaterial !== true ) { + + error( 'Inspector: "Material" needs be a "NodeMaterial".' ); + + return; + + } + + if ( material.userData.graphId === undefined ) { + + error( 'Inspector: "NodeMaterial" has no graphId. Set a "graphId" for the material in "material.userData.graphId".' ); + + return; + + } + + let materialDefault = _refMaterials.get( material ); + + if ( materialDefault === undefined ) { + + //materialDefault = material.clone(); + materialDefault = new material.constructor(); + materialDefault.userData = material.userData; + + _refMaterials.set( material, materialDefault ); + + } + + this.material = material; + this.materialDefault = materialDefault; + this.uniforms = null; + + const graphData = TSLGraphLoader.getGraph( this.material.userData.graphId ); + + if ( graphData ) { + + await this.loadGraph( graphData ); + + } else { + + await this.command( 'clear-graph' ); + + await this.command( 'set-root-material', { materialType: this._getGraphType( this.material ) } ); + + } + + } + + _getGraphType( material ) { + + if ( material.isMeshPhysicalNodeMaterial ) return 'material/physical'; + if ( material.isMeshStandardNodeMaterial ) return 'material/standard'; + if ( material.isMeshPhongNodeMaterial ) return 'material/phong'; + if ( material.isMeshBasicNodeMaterial ) return 'material/basic'; + if ( material.isSpriteNodeMaterial ) return 'material/sprite'; + + return 'material/node'; + + } + + _showManagerModal() { + + const overlay = document.createElement( 'div' ); + overlay.style.position = 'absolute'; + overlay.style.top = '0'; + overlay.style.left = '0'; + overlay.style.width = '100%'; + overlay.style.height = '100%'; + overlay.style.backgroundColor = 'rgba(0, 0, 0, 0.7)'; + overlay.style.zIndex = '100'; + overlay.style.display = 'flex'; + overlay.style.justifyContent = 'center'; + overlay.style.alignItems = 'center'; + overlay.onclick = ( e ) => { + + if ( e.target === overlay ) { + + this.content.removeChild( overlay ); + + } + + }; + + const modal = document.createElement( 'div' ); + modal.style.width = '80%'; + modal.style.maxWidth = '500px'; + modal.style.height = '400px'; + modal.style.backgroundColor = 'var(--profiler-bg, #1e1e24f5)'; + modal.style.border = '1px solid var(--profiler-border, #4a4a5a)'; + modal.style.borderRadius = '8px'; + modal.style.display = 'flex'; + modal.style.flexDirection = 'column'; + + const header = document.createElement( 'div' ); + header.style.padding = '15px'; + header.style.borderBottom = '1px solid var(--profiler-border, #4a4a5a)'; + header.style.display = 'flex'; + header.style.justifyContent = 'space-between'; + header.style.alignItems = 'center'; + header.style.gap = '15px'; + + const filterInput = document.createElement( 'input' ); + filterInput.type = 'text'; + filterInput.className = 'console-filter-input'; + filterInput.placeholder = 'Filter...'; + filterInput.style.flex = '1'; + + const closeBtn = document.createElement( 'button' ); + closeBtn.innerHTML = '✕'; + closeBtn.style.background = 'transparent'; + closeBtn.style.border = 'none'; + closeBtn.style.color = 'var(--text-secondary, #9a9aab)'; + closeBtn.style.cursor = 'pointer'; + closeBtn.style.fontSize = '16px'; + closeBtn.onmouseover = () => closeBtn.style.color = 'var(--text-primary, #e0e0e0)'; + closeBtn.onmouseout = () => closeBtn.style.color = 'var(--text-secondary, #9a9aab)'; + closeBtn.onclick = () => this.content.removeChild( overlay ); + + header.appendChild( filterInput ); + header.appendChild( closeBtn ); + + const codes = this.getCodes(); + const materialIds = Object.keys( codes.materials || {} ); + + if ( materialIds.length === 0 ) { + + const listContainer = document.createElement( 'div' ); + listContainer.style.padding = '10px'; + listContainer.style.flex = '1'; + + const emptyMsg = document.createElement( 'div' ); + emptyMsg.textContent = 'No saved materials found.'; + emptyMsg.style.color = 'var(--text-secondary, #9a9aab)'; + emptyMsg.style.padding = '10px'; + emptyMsg.style.textAlign = 'center'; + emptyMsg.style.fontFamily = 'var(--font-family, sans-serif)'; + emptyMsg.style.fontSize = '12px'; + listContainer.appendChild( emptyMsg ); + + modal.appendChild( header ); + modal.appendChild( listContainer ); + + } else { + + const listHeaderContainer = document.createElement( 'div' ); + listHeaderContainer.style.display = 'grid'; + listHeaderContainer.style.gridTemplateColumns = '1fr 80px'; + listHeaderContainer.style.gap = '10px'; + listHeaderContainer.style.padding = '10px 15px 8px 15px'; + listHeaderContainer.style.borderBottom = '1px solid var(--profiler-border, #4a4a5a)'; + listHeaderContainer.style.backgroundColor = 'var(--profiler-bg, #1e1e24f5)'; + listHeaderContainer.style.fontFamily = 'var(--font-family, sans-serif)'; + listHeaderContainer.style.fontSize = '11px'; + listHeaderContainer.style.fontWeight = 'bold'; + listHeaderContainer.style.textTransform = 'uppercase'; + listHeaderContainer.style.letterSpacing = '0.5px'; + listHeaderContainer.style.color = 'var(--text-secondary, #9a9aab)'; + listHeaderContainer.style.boxShadow = '0 2px 4px rgba(0,0,0,0.1)'; + listHeaderContainer.style.zIndex = '1'; + + const col1 = document.createElement( 'div' ); + col1.textContent = 'Material Name / ID'; + const col2 = document.createElement( 'div' ); + col2.textContent = 'Action'; + col2.style.textAlign = 'right'; + + listHeaderContainer.appendChild( col1 ); + listHeaderContainer.appendChild( col2 ); + + const scrollWrapper = document.createElement( 'div' ); + scrollWrapper.style.flex = '1'; + scrollWrapper.style.overflowY = 'auto'; + scrollWrapper.style.padding = '0'; + + const rows = []; + + for ( const id of materialIds ) { + + const itemRow = document.createElement( 'div' ); + itemRow.style.display = 'grid'; + itemRow.style.gridTemplateColumns = '1fr 80px'; + itemRow.style.gap = '10px'; + itemRow.style.alignItems = 'center'; + itemRow.style.padding = '8px 15px'; + itemRow.style.borderBottom = '1px solid rgba(74, 74, 90, 0.4)'; + itemRow.onmouseover = () => itemRow.style.backgroundColor = 'rgba(255, 255, 255, 0.04)'; + itemRow.onmouseout = () => itemRow.style.backgroundColor = 'transparent'; + + const nameSpan = document.createElement( 'span' ); + const materialData = codes.materials[ id ]; + const materialName = materialData.name || id; + nameSpan.textContent = materialName; + nameSpan.style.fontFamily = 'var(--font-mono, monospace)'; + nameSpan.style.fontSize = '12px'; + nameSpan.style.color = 'var(--text-primary, #e0e0e0)'; + nameSpan.style.userSelect = 'all'; + nameSpan.style.overflow = 'hidden'; + nameSpan.style.textOverflow = 'ellipsis'; + nameSpan.style.whiteSpace = 'nowrap'; + + const actionContainer = document.createElement( 'div' ); + actionContainer.style.textAlign = 'right'; + + const removeBtn = document.createElement( 'button' ); + removeBtn.textContent = 'Remove'; + removeBtn.style.background = 'rgba(244, 67, 54, 0.1)'; + removeBtn.style.border = '1px solid var(--color-red, #f44336)'; + removeBtn.style.color = 'var(--color-red, #f44336)'; + removeBtn.style.borderRadius = '4px'; + removeBtn.style.padding = '4px 8px'; + removeBtn.style.cursor = 'pointer'; + removeBtn.style.fontSize = '11px'; + removeBtn.onmouseover = () => removeBtn.style.background = 'rgba(244, 67, 54, 0.2)'; + removeBtn.onmouseout = () => removeBtn.style.background = 'rgba(244, 67, 54, 0.1)'; + + actionContainer.appendChild( removeBtn ); + + itemRow.appendChild( nameSpan ); + itemRow.appendChild( actionContainer ); + + scrollWrapper.appendChild( itemRow ); + + rows.push( { element: itemRow, text: materialName.toLowerCase() } ); + + removeBtn.onclick = async () => { + + delete codes.materials[ id ]; + TSLGraphLoader.setCodes( codes ); + TSLGraphLoader.deleteGraph( id ); + scrollWrapper.removeChild( itemRow ); + + const index = rows.findIndex( r => r.element === itemRow ); + if ( index > - 1 ) rows.splice( index, 1 ); + + if ( rows.length === 0 ) { + + modal.removeChild( listHeaderContainer ); + modal.removeChild( scrollWrapper ); + + const listContainer = document.createElement( 'div' ); + listContainer.style.padding = '10px'; + listContainer.style.flex = '1'; + + const emptyMsg = document.createElement( 'div' ); + emptyMsg.textContent = 'No saved materials found.'; + emptyMsg.style.color = 'var(--text-secondary, #9a9aab)'; + emptyMsg.style.padding = '10px'; + emptyMsg.style.textAlign = 'center'; + emptyMsg.style.fontFamily = 'var(--font-family, sans-serif)'; + emptyMsg.style.fontSize = '12px'; + + listContainer.appendChild( emptyMsg ); + modal.appendChild( listContainer ); + + } + + _refMaterials.delete( this.material ); + + if ( this.material && this.material.userData.graphId === id ) { + + this.restoreMaterial( this.material ); + + await this.setMaterial( null ); + + } + + this.dispatchEvent( { type: 'remove', graphId: id } ); + + }; + + } + + filterInput.addEventListener( 'input', ( e ) => { + + const term = e.target.value.toLowerCase(); + for ( const row of rows ) { + + row.element.style.display = row.text.includes( term ) ? 'grid' : 'none'; + + } + + } ); + + modal.appendChild( header ); + modal.appendChild( listHeaderContainer ); + modal.appendChild( scrollWrapper ); + + } + + overlay.appendChild( modal ); + + this.content.appendChild( overlay ); + + } + + _exportData() { + + const codes = this.getCodes(); + const materialIds = Object.keys( codes.materials || {} ); + + const exportPayload = { + codes: codes, + graphs: {} + }; + + for ( const id of materialIds ) { + + const graphData = TSLGraphLoader.getGraph( id ); + + if ( graphData ) { + + exportPayload.graphs[ id ] = graphData; + + } + + } + + const dataStr = 'data:text/json;charset=utf-8,' + encodeURIComponent( JSON.stringify( exportPayload, null, '\t' ) ); + const downloadAnchorNode = document.createElement( 'a' ); + downloadAnchorNode.setAttribute( 'href', dataStr ); + downloadAnchorNode.setAttribute( 'download', 'tsl-graphs.json' ); + document.body.appendChild( downloadAnchorNode ); + downloadAnchorNode.click(); + downloadAnchorNode.remove(); + + } + + _importData() { + + const fileInput = document.createElement( 'input' ); + fileInput.type = 'file'; + fileInput.accept = '.json'; + + fileInput.onchange = e => { + + const file = e.target.files[ 0 ]; + + if ( ! file ) return; + + const reader = new FileReader(); + reader.onload = async ( event ) => { + + try { + + const importedData = TSLGraphLoader.setGraphs( JSON.parse( event.target.result ) ); + + this._codeData = importedData.codes; + + // Reload visual state if we have a material open + if ( this.material ) { + + // refresh material + await this._setMaterial( this.material ); + + } + + } catch ( err ) { + + error( 'TSLGraph: Failed to parse or load imported JSON.', err ); + + } + + }; + + reader.readAsText( file ); + + }; + + fileInput.click(); + + } + + getCodes() { + + if ( this._codeData === null ) { + + this._codeData = TSLGraphLoader.getCodes(); + + } + + return this._codeData; + + } + + _saveCode() { + + const graphId = this.material.userData.graphId; + + clearTimeout( this._codeSaveTimeout ); + + this._codeSaveTimeout = setTimeout( async () => { + + if ( this.material === null || graphId !== this.material.userData.graphId ) return; + + const codes = this.getCodes(); + const codeData = await this.getCode(); + + codes.materials[ graphId ] = codeData.material; + + TSLGraphLoader.setCodes( codes ); + + }, 1000 ); + + } + + _restoreMaterial() { + + this.material.copy( this.materialDefault ); + + } + + async _updateMaterial() { + + this._restoreMaterial(); + + const applyNodes = await this.getTSLFunction(); + + const { uniforms } = applyNodes( this.material ); + + this.uniforms = uniforms; + this.material.needsUpdate = true; + + this._saveCode(); + + } + + _updateUniforms( uniforms ) { + + if ( this.uniforms === null ) return; + + for ( const uniform of uniforms ) { + + const uniformNode = this.uniforms[ uniform.name ]; + const uniformType = uniform.uniformType; + + const value = uniform.value; + + if ( uniformType.startsWith( 'vec' ) ) { + + uniformNode.value.fromArray( value ); + + } else if ( uniformType.startsWith( 'color' ) ) { + + uniformNode.value.setHex( parseInt( value.slice( 1 ), 16 ) ); + + } else { + + uniformNode.value = value; + + } + + } + + this._saveCode(); + + } + + _isEditorMessage( value ) { + + if ( ! value || typeof value !== 'object' ) return false; + return value.source === EDITOR_SOURCE && typeof value.type === 'string'; + + } + + _makeRequestId() { + + return `${Date.now()}-${Math.random().toString( 36 ).slice( 2, 10 )}`; + + } + + _post( message ) { + + if ( this.iframe.contentWindow ) { + + this.iframe.contentWindow.postMessage( message, this.editorOrigin ); + + } + + } + +} diff --git a/examples/jsm/inspector/addons/tsl-graph/TSLGraphLoader.js b/examples/jsm/inspector/addons/tsl-graph/TSLGraphLoader.js new file mode 100644 index 00000000000000..520e99a810d146 --- /dev/null +++ b/examples/jsm/inspector/addons/tsl-graph/TSLGraphLoader.js @@ -0,0 +1,281 @@ +import { FileLoader, error } from 'three'; + +import * as THREE from 'three'; +import * as TSL from 'three/tsl'; + +const _library = { + 'three/tsl': { ...TSL } +}; + +const STORAGE_PREFIX = 'tsl-graph'; +const STORAGE_CODE = 'tsl-graph-code'; + +function _storageKey( graphId ) { + + return `${STORAGE_PREFIX}:${graphId}`; + +} + +class TSLGraphLoaderApplier { + + constructor( tslGraphFns ) { + + this.tslGraphFns = tslGraphFns; + + } + + apply( scene ) { + + const tslGraphFns = this.tslGraphFns; + + scene.traverse( ( object ) => { + + if ( object.material && object.material.userData.graphId ) { + + if ( tslGraphFns[ object.material.userData.graphId ] ) { + + tslGraphFns[ object.material.userData.graphId ]( object.material ); + + object.material.needsUpdate = true; + + } + + } + + } ); + + } + +} + +export class TSLGraphLoader extends FileLoader { + + constructor( manager ) { + + super( manager ); + + } + + load( url, onLoad, onProgress, onError ) { + + super.load( url, ( text ) => { + + let json; + + try { + + json = JSON.parse( text ); + + } catch ( e ) { + + if ( onError ) onError( e ); + + return; + + } + + const applier = this.parse( json ); + + if ( onLoad ) onLoad( applier ); + + }, onProgress, onError ); + + } + + parseMaterial( json ) { + + const baseFn = 'tslGraph'; + + const imports = {}; + const materials = [ this._generateMaterialCode( json, baseFn, imports ) ]; + const code = this._generateCode( materials, imports ); + + const tslFunction = new Function( code )()( THREE, imports ); + + return tslFunction; + + } + + parseMaterials( json ) { + + const imports = {}; + const materials = []; + + for ( const [ name, material ] of Object.entries( json ) ) { + + materials.push( this._generateMaterialCode( material, name, imports ) ); + + } + + const code = this._generateCode( materials, imports ); + + const tslFunction = new Function( code )()( THREE, imports ); + + return tslFunction; + + } + + parse( json ) { + + let result; + + if ( json.material && json.material.code ) { + + result = this.parseMaterial( json.material ); + + } else if ( json.materials ) { + + result = this.parseMaterials( json.materials ); + + } else if ( json.codes && json.graphs ) { + + result = this.parseMaterials( json.codes.materials ); + + TSLGraphLoader.setGraphs( json ); + + } + + return new TSLGraphLoaderApplier( result ); + + } + + _generateMaterialCode( json, name = 'tslGraph', imports = {} ) { + + const code = json.code.replace( 'function tslGraph', `materials[ '${ name }' ] = function` ).replace( /\n|^/g, '\n\t' ); + + for ( const importData of json.imports ) { + + if ( _library[ importData.from ] ) { + + for ( const importName of importData.imports ) { + + if ( _library[ importData.from ][ importName ] ) { + + imports[ importName ] = _library[ importData.from ][ importName ]; + + } else { + + error( `TSLGraph: Import ${ importName } not found in ${ importData.from }.` ); + + } + + } + + } else { + + error( `TSLGraph: Library ${ importData.from } not found.` ); + + } + + } + + return code; + + } + + _generateCode( materials, imports ) { + + const fnCode = `return ( THREE, { ${ Object.keys( imports ).join( ', ' ) } } ) => {\n\n\tconst materials = {};\n${ materials.join( '\n' ) }\n\n\treturn materials;\n\n}`; + + return fnCode; + + } + + static get hasGraphs() { + + return Object.keys( TSLGraphLoader.getCodes().materials ).length > 0; + + } + + static getCodes() { + + const code = window.localStorage.getItem( STORAGE_CODE ); + + return code ? JSON.parse( code ) : { materials: {} }; + + } + + static setCodes( codes ) { + + window.localStorage.setItem( STORAGE_CODE, JSON.stringify( codes ) ); + + } + + static setGraph( graphId, graphData ) { + + window.localStorage.setItem( _storageKey( graphId ), JSON.stringify( graphData ) ); + + } + + static getGraph( graphId ) { + + const raw = window.localStorage.getItem( _storageKey( graphId ) ); + + if ( ! raw ) return null; + + try { + + return JSON.parse( raw ); + + } catch ( e ) { + + error( 'TSLGraph: Invalid graph JSON in localStorage, ignoring.', e ); + return null; + + } + + } + + static deleteGraph( graphId ) { + + window.localStorage.removeItem( _storageKey( graphId ) ); + + } + + static setGraphs( json ) { + + if ( ! json.codes || ! json.graphs ) { + + throw new Error( 'TSLGraph: Invalid import file structure.' ); + + } + + TSLGraphLoader.clearGraphs(); + + // Save imported graph visualizations + for ( const [ id, graphData ] of Object.entries( json.graphs ) ) { + + TSLGraphLoader.setGraph( id, graphData ); + + } + + // Fully overwrite codes + TSLGraphLoader.setCodes( json.codes ); + + return json; + + } + + static clearGraphs() { + + const keysToRemove = []; + for ( let i = 0; i < window.localStorage.length; i ++ ) { + + const key = window.localStorage.key( i ); + if ( key.startsWith( STORAGE_PREFIX ) ) { + + keysToRemove.push( key ); + + } + + } + + for ( const key of keysToRemove ) { + + window.localStorage.removeItem( key ); + + } + + } + +} diff --git a/examples/jsm/inspector/ui/Profiler.js b/examples/jsm/inspector/ui/Profiler.js index dae9349055fbb2..66b24f69342cef 100644 --- a/examples/jsm/inspector/ui/Profiler.js +++ b/examples/jsm/inspector/ui/Profiler.js @@ -1,9 +1,12 @@ +import { EventDispatcher } from 'three'; import { Style } from './Style.js'; -export class Profiler { +export class Profiler extends EventDispatcher { constructor() { + super(); + this.tabs = {}; this.activeTabId = null; this.isResizing = false; @@ -32,6 +35,26 @@ export class Profiler { } + getSize() { + + if ( this.panel.classList.contains( 'visible' ) === false || this.panel.classList.contains( 'no-tabs' ) ) { + + return { width: 0, height: 0 }; + + } + + if ( this.position === 'right' ) { + + return { width: this.panel.offsetWidth, height: 0 }; + + } else { + + return { width: 0, height: this.panel.offsetHeight }; + + } + + } + detectMobile() { // Check for mobile devices @@ -310,6 +333,8 @@ export class Profiler { } + this.dispatchEvent( { type: 'resize' } ); + }; const onEnd = () => { @@ -402,6 +427,49 @@ export class Profiler { } + this.dispatchEvent( { type: 'resize' } ); + + } + + hide() { + + this.miniPanel.classList.remove( 'visible' ); + + this.miniPanel.querySelectorAll( '.mini-panel-content' ).forEach( content => { + + content.style.display = 'none'; + + } ); + + this.builtinTabsContainer.querySelectorAll( '.builtin-tab-btn' ).forEach( btn => { + + btn.classList.remove( 'active' ); + + } ); + + } + + show( tab ) { + + this.hide(); + + tab.builtinButton.classList.add( 'active' ); + + if ( ! tab.miniContent.firstChild ) { + + const actualContent = tab.content.querySelector( '.list-scroll-wrapper' ) || tab.content.firstElementChild; + + if ( actualContent ) { + + tab.miniContent.appendChild( actualContent ); + + } + + } + + tab.miniContent.style.display = 'block'; + this.miniPanel.classList.add( 'visible' ); + } addTab( tab ) { @@ -488,47 +556,13 @@ export class Profiler { // Toggle mini-panel for this tab const isCurrentlyActive = miniContent.style.display !== 'none' && miniContent.children.length > 0; - // Hide all other mini-panel contents - this.miniPanel.querySelectorAll( '.mini-panel-content' ).forEach( content => { - - content.style.display = 'none'; - - } ); - - // Remove active state from all builtin buttons - this.builtinTabsContainer.querySelectorAll( '.builtin-tab-btn' ).forEach( btn => { - - btn.classList.remove( 'active' ); - - } ); - if ( isCurrentlyActive ) { - // Toggle off - hide mini-panel - this.miniPanel.classList.remove( 'visible' ); - miniContent.style.display = 'none'; + this.hide(); } else { - // Toggle on - show mini-panel with this tab's content - builtinButton.classList.add( 'active' ); - - // Move actual content to mini-panel (not clone) if not already there - if ( ! miniContent.firstChild ) { - - const actualContent = tab.content.querySelector( '.list-scroll-wrapper' ) || tab.content.firstElementChild; - - if ( actualContent ) { - - miniContent.appendChild( actualContent ); - - } - - } - - // Show after content is moved - miniContent.style.display = 'block'; - this.miniPanel.classList.add( 'visible' ); + this.show( tab ); } @@ -622,6 +656,8 @@ export class Profiler { } + this.dispatchEvent( { type: 'resize' } ); + } setupTabDragAndDrop( tab ) { @@ -1470,6 +1506,8 @@ export class Profiler { } ); + this.dispatchEvent( { type: 'resize' } ); + this.saveLayout(); } diff --git a/examples/jsm/inspector/ui/Style.js b/examples/jsm/inspector/ui/Style.js index 07ec9bfff63340..68fd27e88b0dea 100644 --- a/examples/jsm/inspector/ui/Style.js +++ b/examples/jsm/inspector/ui/Style.js @@ -1097,6 +1097,11 @@ export class Style { border-radius: 15px; } +.console-filter-input:focus { + outline: none; + border-color: var(--text-secondary); +} + .console-copy-button { background: transparent; border: none; @@ -1630,6 +1635,25 @@ body:has(#profiler-panel:not(.visible)) .detached-tab-panel { .detached-tab-content input[type="number"] { -moz-appearance: textfield; } + +.panel-action-btn { + background: transparent; + color: var(--text-primary); + border: 1px solid var(--profiler-border); + border-radius: 4px; + padding: 6px 12px; + cursor: pointer; + font-family: var(--font-family); + font-size: 12px; + transition: background-color 0.2s; + display: flex; + align-items: center; + justify-content: center; +} + +.panel-action-btn:hover { + background-color: rgba(255, 255, 255, 0.05); +} `; const styleElement = document.createElement( 'style' ); styleElement.id = 'profiler-styles'; diff --git a/examples/jsm/inspector/ui/Tab.js b/examples/jsm/inspector/ui/Tab.js index 018e7d7457fdfd..eebad749d32b15 100644 --- a/examples/jsm/inspector/ui/Tab.js +++ b/examples/jsm/inspector/ui/Tab.js @@ -1,3 +1,5 @@ +import { EventDispatcher } from 'three'; + /** * Tab class * @param {string} title - The title of the tab @@ -23,10 +25,12 @@ * tab3.showBuiltin(); // Show the builtin button and mini-content * tab3.hideBuiltin(); // Hide the builtin button and mini-content */ -export class Tab { +export class Tab extends EventDispatcher { constructor( title, options = {} ) { + super(); + this.id = title.toLowerCase(); this.button = document.createElement( 'button' ); this.button.className = 'tab-btn'; diff --git a/examples/screenshots/webgpu_tsl_graph.jpg b/examples/screenshots/webgpu_tsl_graph.jpg new file mode 100644 index 0000000000000000000000000000000000000000..884b19c65040e9ea01d19541eff7c35f6f0a3e58 GIT binary patch literal 43410 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

7SCGr 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%0DrH57KaD{yMBEC!-@}pQFWma4L&;Vf9 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 -Ac`-5 z-p%eim1-kJHU?EJsbX2pV$iJBN1}1lzJxO-lyHYsZX8gQ2!QPsWi{oKqg)Z@WHLmO zDdZ3Ng1%TbUa&zDMX>cIJRYKoys%}u!xM5J_^uBkyjL5zLSbK}l9)YqbQ+h-Z1Q-B zT~)Gp1}edVZ?}Q%>h$8|sOT?c^4!hK(L|*jZB&zCh>fu%(Fo2K5qBa$y9OjjD@m~i z5A?b;jH4>w;uUrY21d|U8b{n6a!|Zl_`*n?UKYujr0bz@xq8$&JbZCVJA0(Xm(JH< z?Kw3huQ161J(IgKQHu=$Q(>pq!(f=()9x8`a`S$^xI{N24k`$O=vhw3;11_qsW4#qJ|KCMTe-bH9YKerJ#XigY+(DaFnBp zA`StTO&`h;Z%WB{rkvM$)3C+jlwe@tVveNbH4#hV%oow4oYN+vv8>C8zb;CoEg9sA zV3HV(8nsHiJPqx3d}wUw^P7vSO2sU9mIv@0N%nTPHn+An89{^$=<4!Jh3&@ML2$q% z�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 Z|m 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≤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

sfd>Z1#(4MUdXmyZ3X47K`kjntq8(hu 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 }e$k#RhLWW6gexH#-o6iT#%iogB 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 {3M9&S#~E&&+pyZTb!9?f{JZ^ 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 z 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 E|l^|XgL|X%2 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Ⅱ$h?I-+*fS-RKCs|2r#oOWY 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 z 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

    b@jQ~JQ$XCI&ktEJ*`AgcJ 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 z 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 GrTPEuTT9ab literal 0 HcmV?d00001 diff --git a/examples/webgpu_tsl_graph.html b/examples/webgpu_tsl_graph.html new file mode 100644 index 00000000000000..ef3497b61dfa3e --- /dev/null +++ b/examples/webgpu_tsl_graph.html @@ -0,0 +1,401 @@ + + + + three.js webgpu - tsl graph + + + + + + + +

    + + +
    + three.jsTSL Graph +
    + + + TSL Graph Addons - www.tsl-graph.xyz + +
    + + + + + + + diff --git a/src/nodes/utils/Remap.js b/src/nodes/utils/Remap.js index b55bc10a3dc8ea..2ce85997739b2d 100644 --- a/src/nodes/utils/Remap.js +++ b/src/nodes/utils/Remap.js @@ -38,7 +38,7 @@ export const remap = /*@__PURE__*/ Fn( ( [ node, inLowNode, inHighNode, outLowNo * @param {?Node} [outHighNode=float(1)] - The target upper bound of the range. * @returns {Node} */ -function remapClamp( node, inLowNode, inHighNode, outLowNode = float( 0 ), outHighNode = float( 1 ) ) { +export function remapClamp( node, inLowNode, inHighNode, outLowNode = float( 0 ), outHighNode = float( 1 ) ) { return remap( node, inLowNode, inHighNode, outLowNode, outHighNode, true ); diff --git a/src/renderers/common/InspectorBase.js b/src/renderers/common/InspectorBase.js index 3c7737c83239b0..b1e61902c7df5a 100644 --- a/src/renderers/common/InspectorBase.js +++ b/src/renderers/common/InspectorBase.js @@ -1,15 +1,20 @@ +import { EventDispatcher } from '../../core/EventDispatcher.js'; + /** * InspectorBase is the base class for all inspectors. * * @class InspectorBase + * @augments EventDispatcher */ -class InspectorBase { +class InspectorBase extends EventDispatcher { /** * Creates a new InspectorBase. */ constructor() { + super(); + /** * The renderer associated with this inspector. * From 2d9a07bf7b242fdd6ec55aa72b994e4f896e01c7 Mon Sep 17 00:00:00 2001 From: sunag Date: Sat, 14 Mar 2026 03:23:54 -0300 Subject: [PATCH 2/5] Updated builds. --- build/three.cjs | 213 +++++++++++++++++++--------- build/three.core.js | 138 +++++++++++-------- build/three.core.min.js | 2 +- build/three.module.js | 77 ++++++++++- build/three.module.min.js | 2 +- build/three.webgpu.js | 237 +++++++++++++++++++------------- build/three.webgpu.min.js | 2 +- build/three.webgpu.nodes.js | 198 +++++++++++++------------- build/three.webgpu.nodes.min.js | 2 +- 9 files changed, 551 insertions(+), 320 deletions(-) diff --git a/build/three.cjs b/build/three.cjs index 8d841faa1a70fd..cab2802e7cdacb 100644 --- a/build/three.cjs +++ b/build/three.cjs @@ -3007,13 +3007,7 @@ const MathUtils = { */ class Vector2 { - /** - * Constructs a new 2D vector. - * - * @param {number} [x=0] - The x value of this vector. - * @param {number} [y=0] - The y value of this vector. - */ - constructor( x = 0, y = 0 ) { + static { /** * This flag can be used for type testing. @@ -3024,6 +3018,16 @@ class Vector2 { */ Vector2.prototype.isVector2 = true; + } + + /** + * Constructs a new 2D vector. + * + * @param {number} [x=0] - The x value of this vector. + * @param {number} [y=0] - The y value of this vector. + */ + constructor( x = 0, y = 0 ) { + /** * The x value of this vector. * @@ -4784,14 +4788,7 @@ class Quaternion { */ class Vector3 { - /** - * Constructs a new 3D vector. - * - * @param {number} [x=0] - The x value of this vector. - * @param {number} [y=0] - The y value of this vector. - * @param {number} [z=0] - The z value of this vector. - */ - constructor( x = 0, y = 0, z = 0 ) { + static { /** * This flag can be used for type testing. @@ -4802,6 +4799,17 @@ class Vector3 { */ Vector3.prototype.isVector3 = true; + } + + /** + * Constructs a new 3D vector. + * + * @param {number} [x=0] - The x value of this vector. + * @param {number} [y=0] - The y value of this vector. + * @param {number} [z=0] - The z value of this vector. + */ + constructor( x = 0, y = 0, z = 0 ) { + /** * The x value of this vector. * @@ -6042,6 +6050,19 @@ const _quaternion$5 = /*@__PURE__*/ new Quaternion(); */ class Matrix3 { + static { + + /** + * This flag can be used for type testing. + * + * @type {boolean} + * @readonly + * @default true + */ + Matrix3.prototype.isMatrix3 = true; + + } + /** * Constructs a new 3x3 matrix. The arguments are supposed to be * in row-major order. If no arguments are provided, the constructor @@ -6059,15 +6080,6 @@ class Matrix3 { */ constructor( n11, n12, n13, n21, n22, n23, n31, n32, n33 ) { - /** - * This flag can be used for type testing. - * - * @type {boolean} - * @readonly - * @default true - */ - Matrix3.prototype.isMatrix3 = true; - /** * A column-major list of matrix values. * @@ -8001,15 +8013,7 @@ Texture.DEFAULT_ANISOTROPY = 1; */ class Vector4 { - /** - * Constructs a new 4D vector. - * - * @param {number} [x=0] - The x value of this vector. - * @param {number} [y=0] - The y value of this vector. - * @param {number} [z=0] - The z value of this vector. - * @param {number} [w=1] - The w value of this vector. - */ - constructor( x = 0, y = 0, z = 0, w = 1 ) { + static { /** * This flag can be used for type testing. @@ -8020,6 +8024,18 @@ class Vector4 { */ Vector4.prototype.isVector4 = true; + } + + /** + * Constructs a new 4D vector. + * + * @param {number} [x=0] - The x value of this vector. + * @param {number} [y=0] - The y value of this vector. + * @param {number} [z=0] - The z value of this vector. + * @param {number} [w=1] - The w value of this vector. + */ + constructor( x = 0, y = 0, z = 0, w = 1 ) { + /** * The x value of this vector. * @@ -9816,6 +9832,19 @@ class WebGL3DRenderTarget extends WebGLRenderTarget { */ class Matrix4 { + static { + + /** + * This flag can be used for type testing. + * + * @type {boolean} + * @readonly + * @default true + */ + Matrix4.prototype.isMatrix4 = true; + + } + /** * Constructs a new 4x4 matrix. The arguments are supposed to be * in row-major order. If no arguments are provided, the constructor @@ -9840,15 +9869,6 @@ class Matrix4 { */ constructor( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 ) { - /** - * This flag can be used for type testing. - * - * @type {boolean} - * @readonly - * @default true - */ - Matrix4.prototype.isMatrix4 = true; - /** * A column-major list of matrix values. * @@ -13228,11 +13248,7 @@ class Object3D extends EventDispatcher { this.quaternion.copy( source.quaternion ); this.scale.copy( source.scale ); - if ( source.pivot !== null ) { - - this.pivot = source.pivot.clone(); - - } + this.pivot = ( source.pivot !== null ) ? source.pivot.clone() : null; this.matrix.copy( source.matrix ); this.matrixWorld.copy( source.matrixWorld ); @@ -44782,15 +44798,15 @@ class DataTextureLoader extends Loader { texData = scope.parse( buffer ); - } catch ( error ) { + } catch ( e ) { if ( onError !== undefined ) { - onError( error ); + onError( e ); } else { - error( error ); + error( e ); return; } @@ -56169,6 +56185,19 @@ class Cylindrical { */ class Matrix2 { + static { + + /** + * This flag can be used for type testing. + * + * @type {boolean} + * @readonly + * @default true + */ + Matrix2.prototype.isMatrix2 = true; + + } + /** * Constructs a new 2x2 matrix. The arguments are supposed to be * in row-major order. If no arguments are provided, the constructor @@ -56181,15 +56210,6 @@ class Matrix2 { */ constructor( n11, n12, n21, n22 ) { - /** - * This flag can be used for type testing. - * - * @type {boolean} - * @readonly - * @default true - */ - Matrix2.prototype.isMatrix2 = true; - /** * A column-major list of matrix values. * @@ -59561,6 +59581,7 @@ function WebGLAnimation() { if ( isAnimating === true ) return; if ( animationLoop === null ) return; + if ( context === null ) return; requestId = context.requestAnimationFrame( onAnimationFrame ); @@ -59570,7 +59591,7 @@ function WebGLAnimation() { stop: function () { - context.cancelAnimationFrame( requestId ); + if ( context !== null ) context.cancelAnimationFrame( requestId ); isAnimating = false; @@ -74401,7 +74422,11 @@ function WebGLMaterials( renderer, properties ) { function refreshMaterialUniforms( uniforms, material, pixelRatio, height, transmissionRenderTarget ) { - if ( material.isMeshBasicMaterial ) { + if ( material.isNodeMaterial ) { + + material.uniformsNeedUpdate = false; + + } else if ( material.isMeshBasicMaterial ) { refreshUniformsCommon( uniforms, material ); @@ -75096,6 +75121,11 @@ function WebGLUniformsGroups( gl, info, capabilities, state ) { uniform.__data[ 10 ] = value.elements[ 8 ]; uniform.__data[ 11 ] = 0; + } else if ( ArrayBuffer.isView( value ) ) { + + // copy the buffer data using "set" + uniform.__data.set( new value.constructor( value.buffer, value.byteOffset, uniform.__data.length ) ); + } else { value.toArray( uniform.__data, arrayOffset ); @@ -75131,6 +75161,10 @@ function WebGLUniformsGroups( gl, info, capabilities, state ) { cache[ indexString ] = value; + } else if ( ArrayBuffer.isView( value ) ) { + + cache[ indexString ] = value.slice(); + } else { cache[ indexString ] = value.clone(); @@ -75154,6 +75188,11 @@ function WebGLUniformsGroups( gl, info, capabilities, state ) { } + } else if ( ArrayBuffer.isView( value ) ) { + + // always update the array buffers + return true; + } else { if ( cachedObject.equals( value ) === false ) { @@ -75294,6 +75333,11 @@ function WebGLUniformsGroups( gl, info, capabilities, state ) { warn( 'WebGLRenderer: Texture samplers can not be part of an uniforms group.' ); + } else if ( ArrayBuffer.isView( value ) ) { + + info.boundary = 16; + info.storage = value.byteLength; + } else { warn( 'WebGLRenderer: Unsupported uniform value type.', value ); @@ -75630,6 +75674,7 @@ class WebGLRenderer { const _this = this; let _isContextLost = false; + let _nodesHandler = null; // internal state cache @@ -76380,6 +76425,20 @@ class WebGLRenderer { }; + /** + * Sets a compatibility node builder for rendering node materials with WebGLRenderer. + * This enables using TSL (Three.js Shading Language) node materials to prepare + * for migration to WebGPURenderer. + * + * @param {WebGLNodesHandler} nodesHandler - The node builder instance. + */ + this.setNodesHandler = function ( nodesHandler ) { + + nodesHandler.setRenderer( this ); + _nodesHandler = nodesHandler; + + }; + /** * Frees the GPU-related resources allocated by this instance. Call this * method whenever this instance is no longer used in your app. @@ -76940,6 +76999,13 @@ class WebGLRenderer { if ( _isContextLost === true ) return; + // update node builder if available + if ( _nodesHandler !== null ) { + + _nodesHandler.renderStart( scene, camera ); + + } + // use internal render target for HalfFloatType color buffer (only when tone mapping is enabled) const isXRPresenting = xr.enabled === true && xr.isPresenting === true; @@ -77133,6 +77199,12 @@ class WebGLRenderer { } + if ( _nodesHandler !== null ) { + + _nodesHandler.renderEnd(); + + } + }; function projectObject( object, camera, groupOrder, sortObjects ) { @@ -77509,6 +77581,13 @@ class WebGLRenderer { parameters.uniforms = programCache.getUniforms( material ); + // Use node builder for node materials if available + if ( _nodesHandler !== null && material.isNodeMaterial ) { + + _nodesHandler.build( material, object, parameters ); + + } + material.onBeforeCompile( parameters, _this ); program = programCache.acquireProgram( parameters, programCacheKey ); @@ -77774,6 +77853,14 @@ class WebGLRenderer { program = getProgram( material, scene, object ); + // notify the node builder that the program has changed so uniforms and update nodes can + // be cached and triggered. + if ( _nodesHandler && material.isNodeMaterial ) { + + _nodesHandler.onUpdateProgram( material, program, materialProperties ); + + } + } let refreshProgram = false; @@ -78003,7 +78090,7 @@ class WebGLRenderer { // UBOs - if ( material.isShaderMaterial || material.isRawShaderMaterial ) { + if ( material.uniformsGroups !== undefined ) { const groups = material.uniformsGroups; @@ -78579,6 +78666,8 @@ class WebGLRenderer { } + state.activeTexture( _gl.TEXTURE0 ); // see #33153 + _gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, dstTexture.flipY ); _gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, dstTexture.premultiplyAlpha ); _gl.pixelStorei( _gl.UNPACK_ALIGNMENT, dstTexture.unpackAlignment ); diff --git a/build/three.core.js b/build/three.core.js index 24c360e559783d..b819fee8eee8de 100644 --- a/build/three.core.js +++ b/build/three.core.js @@ -3027,13 +3027,7 @@ const MathUtils = { */ class Vector2 { - /** - * Constructs a new 2D vector. - * - * @param {number} [x=0] - The x value of this vector. - * @param {number} [y=0] - The y value of this vector. - */ - constructor( x = 0, y = 0 ) { + static { /** * This flag can be used for type testing. @@ -3044,6 +3038,16 @@ class Vector2 { */ Vector2.prototype.isVector2 = true; + } + + /** + * Constructs a new 2D vector. + * + * @param {number} [x=0] - The x value of this vector. + * @param {number} [y=0] - The y value of this vector. + */ + constructor( x = 0, y = 0 ) { + /** * The x value of this vector. * @@ -4804,14 +4808,7 @@ class Quaternion { */ class Vector3 { - /** - * Constructs a new 3D vector. - * - * @param {number} [x=0] - The x value of this vector. - * @param {number} [y=0] - The y value of this vector. - * @param {number} [z=0] - The z value of this vector. - */ - constructor( x = 0, y = 0, z = 0 ) { + static { /** * This flag can be used for type testing. @@ -4822,6 +4819,17 @@ class Vector3 { */ Vector3.prototype.isVector3 = true; + } + + /** + * Constructs a new 3D vector. + * + * @param {number} [x=0] - The x value of this vector. + * @param {number} [y=0] - The y value of this vector. + * @param {number} [z=0] - The z value of this vector. + */ + constructor( x = 0, y = 0, z = 0 ) { + /** * The x value of this vector. * @@ -6062,6 +6070,19 @@ const _quaternion$5 = /*@__PURE__*/ new Quaternion(); */ class Matrix3 { + static { + + /** + * This flag can be used for type testing. + * + * @type {boolean} + * @readonly + * @default true + */ + Matrix3.prototype.isMatrix3 = true; + + } + /** * Constructs a new 3x3 matrix. The arguments are supposed to be * in row-major order. If no arguments are provided, the constructor @@ -6079,15 +6100,6 @@ class Matrix3 { */ constructor( n11, n12, n13, n21, n22, n23, n31, n32, n33 ) { - /** - * This flag can be used for type testing. - * - * @type {boolean} - * @readonly - * @default true - */ - Matrix3.prototype.isMatrix3 = true; - /** * A column-major list of matrix values. * @@ -8021,15 +8033,7 @@ Texture.DEFAULT_ANISOTROPY = 1; */ class Vector4 { - /** - * Constructs a new 4D vector. - * - * @param {number} [x=0] - The x value of this vector. - * @param {number} [y=0] - The y value of this vector. - * @param {number} [z=0] - The z value of this vector. - * @param {number} [w=1] - The w value of this vector. - */ - constructor( x = 0, y = 0, z = 0, w = 1 ) { + static { /** * This flag can be used for type testing. @@ -8040,6 +8044,18 @@ class Vector4 { */ Vector4.prototype.isVector4 = true; + } + + /** + * Constructs a new 4D vector. + * + * @param {number} [x=0] - The x value of this vector. + * @param {number} [y=0] - The y value of this vector. + * @param {number} [z=0] - The z value of this vector. + * @param {number} [w=1] - The w value of this vector. + */ + constructor( x = 0, y = 0, z = 0, w = 1 ) { + /** * The x value of this vector. * @@ -9836,6 +9852,19 @@ class WebGL3DRenderTarget extends WebGLRenderTarget { */ class Matrix4 { + static { + + /** + * This flag can be used for type testing. + * + * @type {boolean} + * @readonly + * @default true + */ + Matrix4.prototype.isMatrix4 = true; + + } + /** * Constructs a new 4x4 matrix. The arguments are supposed to be * in row-major order. If no arguments are provided, the constructor @@ -9860,15 +9889,6 @@ class Matrix4 { */ constructor( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 ) { - /** - * This flag can be used for type testing. - * - * @type {boolean} - * @readonly - * @default true - */ - Matrix4.prototype.isMatrix4 = true; - /** * A column-major list of matrix values. * @@ -13248,11 +13268,7 @@ class Object3D extends EventDispatcher { this.quaternion.copy( source.quaternion ); this.scale.copy( source.scale ); - if ( source.pivot !== null ) { - - this.pivot = source.pivot.clone(); - - } + this.pivot = ( source.pivot !== null ) ? source.pivot.clone() : null; this.matrix.copy( source.matrix ); this.matrixWorld.copy( source.matrixWorld ); @@ -44802,15 +44818,15 @@ class DataTextureLoader extends Loader { texData = scope.parse( buffer ); - } catch ( error ) { + } catch ( e ) { if ( onError !== undefined ) { - onError( error ); + onError( e ); } else { - error( error ); + error( e ); return; } @@ -56189,6 +56205,19 @@ class Cylindrical { */ class Matrix2 { + static { + + /** + * This flag can be used for type testing. + * + * @type {boolean} + * @readonly + * @default true + */ + Matrix2.prototype.isMatrix2 = true; + + } + /** * Constructs a new 2x2 matrix. The arguments are supposed to be * in row-major order. If no arguments are provided, the constructor @@ -56201,15 +56230,6 @@ class Matrix2 { */ constructor( n11, n12, n21, n22 ) { - /** - * This flag can be used for type testing. - * - * @type {boolean} - * @readonly - * @default true - */ - Matrix2.prototype.isMatrix2 = true; - /** * A column-major list of matrix values. * diff --git a/build/three.core.min.js b/build/three.core.min.js index c0abbca15dbca2..908c7025c3a9e9 100644 --- a/build/three.core.min.js +++ b/build/three.core.min.js @@ -3,4 +3,4 @@ * Copyright 2010-2026 Three.js Authors * SPDX-License-Identifier: MIT */ -const t="184dev",e={LEFT:0,MIDDLE:1,RIGHT:2,ROTATE:0,DOLLY:1,PAN:2},i={ROTATE:0,PAN:1,DOLLY_PAN:2,DOLLY_ROTATE:3},s=0,r=1,n=2,a=3,o=0,h=1,l=2,c=3,u=0,d=1,p=2,m=0,y=1,g=2,f=3,x=4,b=5,v=6,w=100,M=101,S=102,_=103,A=104,T=200,z=201,C=202,I=203,B=204,k=205,O=206,P=207,R=208,N=209,V=210,E=211,F=212,L=213,j=214,D=0,W=1,U=2,q=3,J=4,X=5,Y=6,H=7,Z=0,G=1,$=2,Q=0,K=1,tt=2,et=3,it=4,st=5,rt=6,nt=7,at="attached",ot="detached",ht=300,lt=301,ct=302,ut=303,dt=304,pt=306,mt=1e3,yt=1001,gt=1002,ft=1003,xt=1004,bt=1004,vt=1005,wt=1005,Mt=1006,St=1007,_t=1007,At=1008,Tt=1008,zt=1009,Ct=1010,It=1011,Bt=1012,kt=1013,Ot=1014,Pt=1015,Rt=1016,Nt=1017,Vt=1018,Et=1020,Ft=35902,Lt=35899,jt=1021,Dt=1022,Wt=1023,Ut=1026,qt=1027,Jt=1028,Xt=1029,Yt=1030,Ht=1031,Zt=1032,Gt=1033,$t=33776,Qt=33777,Kt=33778,te=33779,ee=35840,ie=35841,se=35842,re=35843,ne=36196,ae=37492,oe=37496,he=37488,le=37489,ce=37490,ue=37491,de=37808,pe=37809,me=37810,ye=37811,ge=37812,fe=37813,xe=37814,be=37815,ve=37816,we=37817,Me=37818,Se=37819,_e=37820,Ae=37821,Te=36492,ze=36494,Ce=36495,Ie=36283,Be=36284,ke=36285,Oe=36286,Pe=2200,Re=2201,Ne=2202,Ve=2300,Ee=2301,Fe=2302,Le=2303,je=2400,De=2401,We=2402,Ue=2500,qe=2501,Je=0,Xe=1,Ye=2,He=3200,Ze=3201,Ge=3202,$e=3203,Qe=0,Ke=1,ti="",ei="srgb",ii="srgb-linear",si="linear",ri="srgb",ni="",ai="rg",oi="ga",hi=0,li=7680,ci=7681,ui=7682,di=7683,pi=34055,mi=34056,yi=5386,gi=512,fi=513,xi=514,bi=515,vi=516,wi=517,Mi=518,Si=519,_i=512,Ai=513,Ti=514,zi=515,Ci=516,Ii=517,Bi=518,ki=519,Oi=35044,Pi=35048,Ri=35040,Ni=35045,Vi=35049,Ei=35041,Fi=35046,Li=35050,ji=35042,Di="100",Wi="300 es",Ui=2e3,qi=2001,Ji={COMPUTE:"compute",RENDER:"render"},Xi={PERSPECTIVE:"perspective",LINEAR:"linear",FLAT:"flat"},Yi={NORMAL:"normal",CENTROID:"centroid",SAMPLE:"sample",FIRST:"first",EITHER:"either"},Hi={TEXTURE_COMPARE:"depthTextureCompare"};const Zi={Int8Array:Int8Array,Uint8Array:Uint8Array,Uint8ClampedArray:Uint8ClampedArray,Int16Array:Int16Array,Uint16Array:Uint16Array,Int32Array:Int32Array,Uint32Array:Uint32Array,Float32Array:Float32Array,Float64Array:Float64Array};function Gi(t,e){return new Zi[t](e)}function $i(t){return ArrayBuffer.isView(t)&&!(t instanceof DataView)}function Qi(t){return document.createElementNS("http://www.w3.org/1999/xhtml",t)}function Ki(){const t=Qi("canvas");return t.style.display="block",t}const ts={};let es=null;function is(t){es=t}function ss(){return es}function rs(...t){const e="THREE."+t.shift();es?es("log",e,...t):console.log(e,...t)}function ns(t){const e=t[0];if("string"==typeof e&&e.startsWith("TSL:")){const e=t[1];e&&e.isStackTrace?t[0]+=" "+e.getLocation():t[1]='Stack trace not available. Enable "THREE.Node.captureStackTrace" to capture stack traces.'}return t}function as(...t){const e="THREE."+(t=ns(t)).shift();if(es)es("warn",e,...t);else{const i=t[0];i&&i.isStackTrace?console.warn(i.getError(e)):console.warn(e,...t)}}function os(...t){const e="THREE."+(t=ns(t)).shift();if(es)es("error",e,...t);else{const i=t[0];i&&i.isStackTrace?console.error(i.getError(e)):console.error(e,...t)}}function hs(...t){const e=t.join(" ");e in ts||(ts[e]=!0,as(...t))}function ls(){return"undefined"!=typeof self&&void 0!==self.scheduler&&void 0!==self.scheduler.yield?self.scheduler.yield():new Promise(t=>{requestAnimationFrame(t)})}function cs(t,e,i){return new Promise(function(s,r){setTimeout(function n(){switch(t.clientWaitSync(e,t.SYNC_FLUSH_COMMANDS_BIT,0)){case t.WAIT_FAILED:r();break;case t.TIMEOUT_EXPIRED:setTimeout(n,i);break;default:s()}},i)})}const us={[D]:1,[U]:6,[J]:7,[q]:5,[W]:0,[Y]:2,[H]:4,[X]:3};class ds{addEventListener(t,e){void 0===this._listeners&&(this._listeners={});const i=this._listeners;void 0===i[t]&&(i[t]=[]),-1===i[t].indexOf(e)&&i[t].push(e)}hasEventListener(t,e){const i=this._listeners;return void 0!==i&&(void 0!==i[t]&&-1!==i[t].indexOf(e))}removeEventListener(t,e){const i=this._listeners;if(void 0===i)return;const s=i[t];if(void 0!==s){const t=s.indexOf(e);-1!==t&&s.splice(t,1)}}dispatchEvent(t){const e=this._listeners;if(void 0===e)return;const i=e[t.type];if(void 0!==i){t.target=this;const e=i.slice(0);for(let i=0,s=e.length;i>8&255]+ps[t>>16&255]+ps[t>>24&255]+"-"+ps[255&e]+ps[e>>8&255]+"-"+ps[e>>16&15|64]+ps[e>>24&255]+"-"+ps[63&i|128]+ps[i>>8&255]+"-"+ps[i>>16&255]+ps[i>>24&255]+ps[255&s]+ps[s>>8&255]+ps[s>>16&255]+ps[s>>24&255]).toLowerCase()}function xs(t,e,i){return Math.max(e,Math.min(i,t))}function bs(t,e){return(t%e+e)%e}function vs(t,e,i){return(1-i)*t+i*e}function ws(t,e){switch(e.constructor){case Float32Array:return t;case Uint32Array:return t/4294967295;case Uint16Array:return t/65535;case Uint8Array:return t/255;case Int32Array:return Math.max(t/2147483647,-1);case Int16Array:return Math.max(t/32767,-1);case Int8Array:return Math.max(t/127,-1);default:throw new Error("Invalid component type.")}}function Ms(t,e){switch(e.constructor){case Float32Array:return t;case Uint32Array:return Math.round(4294967295*t);case Uint16Array:return Math.round(65535*t);case Uint8Array:return Math.round(255*t);case Int32Array:return Math.round(2147483647*t);case Int16Array:return Math.round(32767*t);case Int8Array:return Math.round(127*t);default:throw new Error("Invalid component type.")}}const Ss={DEG2RAD:ys,RAD2DEG:gs,generateUUID:fs,clamp:xs,euclideanModulo:bs,mapLinear:function(t,e,i,s,r){return s+(t-e)*(r-s)/(i-e)},inverseLerp:function(t,e,i){return t!==e?(i-t)/(e-t):0},lerp:vs,damp:function(t,e,i,s){return vs(t,e,1-Math.exp(-i*s))},pingpong:function(t,e=1){return e-Math.abs(bs(t,2*e)-e)},smoothstep:function(t,e,i){return t<=e?0:t>=i?1:(t=(t-e)/(i-e))*t*(3-2*t)},smootherstep:function(t,e,i){return t<=e?0:t>=i?1:(t=(t-e)/(i-e))*t*t*(t*(6*t-15)+10)},randInt:function(t,e){return t+Math.floor(Math.random()*(e-t+1))},randFloat:function(t,e){return t+Math.random()*(e-t)},randFloatSpread:function(t){return t*(.5-Math.random())},seededRandom:function(t){void 0!==t&&(ms=t);let e=ms+=1831565813;return e=Math.imul(e^e>>>15,1|e),e^=e+Math.imul(e^e>>>7,61|e),((e^e>>>14)>>>0)/4294967296},degToRad:function(t){return t*ys},radToDeg:function(t){return t*gs},isPowerOfTwo:function(t){return!(t&t-1)&&0!==t},ceilPowerOfTwo:function(t){return Math.pow(2,Math.ceil(Math.log(t)/Math.LN2))},floorPowerOfTwo:function(t){return Math.pow(2,Math.floor(Math.log(t)/Math.LN2))},setQuaternionFromProperEuler:function(t,e,i,s,r){const n=Math.cos,a=Math.sin,o=n(i/2),h=a(i/2),l=n((e+s)/2),c=a((e+s)/2),u=n((e-s)/2),d=a((e-s)/2),p=n((s-e)/2),m=a((s-e)/2);switch(r){case"XYX":t.set(o*c,h*u,h*d,o*l);break;case"YZY":t.set(h*d,o*c,h*u,o*l);break;case"ZXZ":t.set(h*u,h*d,o*c,o*l);break;case"XZX":t.set(o*c,h*m,h*p,o*l);break;case"YXY":t.set(h*p,o*c,h*m,o*l);break;case"ZYZ":t.set(h*m,h*p,o*c,o*l);break;default:as("MathUtils: .setQuaternionFromProperEuler() encountered an unknown order: "+r)}},normalize:Ms,denormalize:ws};class _s{constructor(t=0,e=0){_s.prototype.isVector2=!0,this.x=t,this.y=e}get width(){return this.x}set width(t){this.x=t}get height(){return this.y}set height(t){this.y=t}set(t,e){return this.x=t,this.y=e,this}setScalar(t){return this.x=t,this.y=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;default:throw new Error("index is out of range: "+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;default:throw new Error("index is out of range: "+t)}}clone(){return new this.constructor(this.x,this.y)}copy(t){return this.x=t.x,this.y=t.y,this}add(t){return this.x+=t.x,this.y+=t.y,this}addScalar(t){return this.x+=t,this.y+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this}sub(t){return this.x-=t.x,this.y-=t.y,this}subScalar(t){return this.x-=t,this.y-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this}multiply(t){return this.x*=t.x,this.y*=t.y,this}multiplyScalar(t){return this.x*=t,this.y*=t,this}divide(t){return this.x/=t.x,this.y/=t.y,this}divideScalar(t){return this.multiplyScalar(1/t)}applyMatrix3(t){const e=this.x,i=this.y,s=t.elements;return this.x=s[0]*e+s[3]*i+s[6],this.y=s[1]*e+s[4]*i+s[7],this}min(t){return this.x=Math.min(this.x,t.x),this.y=Math.min(this.y,t.y),this}max(t){return this.x=Math.max(this.x,t.x),this.y=Math.max(this.y,t.y),this}clamp(t,e){return this.x=xs(this.x,t.x,e.x),this.y=xs(this.y,t.y,e.y),this}clampScalar(t,e){return this.x=xs(this.x,t,e),this.y=xs(this.y,t,e),this}clampLength(t,e){const i=this.length();return this.divideScalar(i||1).multiplyScalar(xs(i,t,e))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this}negate(){return this.x=-this.x,this.y=-this.y,this}dot(t){return this.x*t.x+this.y*t.y}cross(t){return this.x*t.y-this.y*t.x}lengthSq(){return this.x*this.x+this.y*this.y}length(){return Math.sqrt(this.x*this.x+this.y*this.y)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)}normalize(){return this.divideScalar(this.length()||1)}angle(){return Math.atan2(-this.y,-this.x)+Math.PI}angleTo(t){const e=Math.sqrt(this.lengthSq()*t.lengthSq());if(0===e)return Math.PI/2;const i=this.dot(t)/e;return Math.acos(xs(i,-1,1))}distanceTo(t){return Math.sqrt(this.distanceToSquared(t))}distanceToSquared(t){const e=this.x-t.x,i=this.y-t.y;return e*e+i*i}manhattanDistanceTo(t){return Math.abs(this.x-t.x)+Math.abs(this.y-t.y)}setLength(t){return this.normalize().multiplyScalar(t)}lerp(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this}lerpVectors(t,e,i){return this.x=t.x+(e.x-t.x)*i,this.y=t.y+(e.y-t.y)*i,this}equals(t){return t.x===this.x&&t.y===this.y}fromArray(t,e=0){return this.x=t[e],this.y=t[e+1],this}toArray(t=[],e=0){return t[e]=this.x,t[e+1]=this.y,t}fromBufferAttribute(t,e){return this.x=t.getX(e),this.y=t.getY(e),this}rotateAround(t,e){const i=Math.cos(e),s=Math.sin(e),r=this.x-t.x,n=this.y-t.y;return this.x=r*i-n*s+t.x,this.y=r*s+n*i+t.y,this}random(){return this.x=Math.random(),this.y=Math.random(),this}*[Symbol.iterator](){yield this.x,yield this.y}}class As{constructor(t=0,e=0,i=0,s=1){this.isQuaternion=!0,this._x=t,this._y=e,this._z=i,this._w=s}static slerpFlat(t,e,i,s,r,n,a){let o=i[s+0],h=i[s+1],l=i[s+2],c=i[s+3],u=r[n+0],d=r[n+1],p=r[n+2],m=r[n+3];if(c!==m||o!==u||h!==d||l!==p){let t=o*u+h*d+l*p+c*m;t<0&&(u=-u,d=-d,p=-p,m=-m,t=-t);let e=1-a;if(t<.9995){const i=Math.acos(t),s=Math.sin(i);e=Math.sin(e*i)/s,o=o*e+u*(a=Math.sin(a*i)/s),h=h*e+d*a,l=l*e+p*a,c=c*e+m*a}else{o=o*e+u*a,h=h*e+d*a,l=l*e+p*a,c=c*e+m*a;const t=1/Math.sqrt(o*o+h*h+l*l+c*c);o*=t,h*=t,l*=t,c*=t}}t[e]=o,t[e+1]=h,t[e+2]=l,t[e+3]=c}static multiplyQuaternionsFlat(t,e,i,s,r,n){const a=i[s],o=i[s+1],h=i[s+2],l=i[s+3],c=r[n],u=r[n+1],d=r[n+2],p=r[n+3];return t[e]=a*p+l*c+o*d-h*u,t[e+1]=o*p+l*u+h*c-a*d,t[e+2]=h*p+l*d+a*u-o*c,t[e+3]=l*p-a*c-o*u-h*d,t}get x(){return this._x}set x(t){this._x=t,this._onChangeCallback()}get y(){return this._y}set y(t){this._y=t,this._onChangeCallback()}get z(){return this._z}set z(t){this._z=t,this._onChangeCallback()}get w(){return this._w}set w(t){this._w=t,this._onChangeCallback()}set(t,e,i,s){return this._x=t,this._y=e,this._z=i,this._w=s,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._w)}copy(t){return this._x=t.x,this._y=t.y,this._z=t.z,this._w=t.w,this._onChangeCallback(),this}setFromEuler(t,e=!0){const i=t._x,s=t._y,r=t._z,n=t._order,a=Math.cos,o=Math.sin,h=a(i/2),l=a(s/2),c=a(r/2),u=o(i/2),d=o(s/2),p=o(r/2);switch(n){case"XYZ":this._x=u*l*c+h*d*p,this._y=h*d*c-u*l*p,this._z=h*l*p+u*d*c,this._w=h*l*c-u*d*p;break;case"YXZ":this._x=u*l*c+h*d*p,this._y=h*d*c-u*l*p,this._z=h*l*p-u*d*c,this._w=h*l*c+u*d*p;break;case"ZXY":this._x=u*l*c-h*d*p,this._y=h*d*c+u*l*p,this._z=h*l*p+u*d*c,this._w=h*l*c-u*d*p;break;case"ZYX":this._x=u*l*c-h*d*p,this._y=h*d*c+u*l*p,this._z=h*l*p-u*d*c,this._w=h*l*c+u*d*p;break;case"YZX":this._x=u*l*c+h*d*p,this._y=h*d*c+u*l*p,this._z=h*l*p-u*d*c,this._w=h*l*c-u*d*p;break;case"XZY":this._x=u*l*c-h*d*p,this._y=h*d*c-u*l*p,this._z=h*l*p+u*d*c,this._w=h*l*c+u*d*p;break;default:as("Quaternion: .setFromEuler() encountered an unknown order: "+n)}return!0===e&&this._onChangeCallback(),this}setFromAxisAngle(t,e){const i=e/2,s=Math.sin(i);return this._x=t.x*s,this._y=t.y*s,this._z=t.z*s,this._w=Math.cos(i),this._onChangeCallback(),this}setFromRotationMatrix(t){const e=t.elements,i=e[0],s=e[4],r=e[8],n=e[1],a=e[5],o=e[9],h=e[2],l=e[6],c=e[10],u=i+a+c;if(u>0){const t=.5/Math.sqrt(u+1);this._w=.25/t,this._x=(l-o)*t,this._y=(r-h)*t,this._z=(n-s)*t}else if(i>a&&i>c){const t=2*Math.sqrt(1+i-a-c);this._w=(l-o)/t,this._x=.25*t,this._y=(s+n)/t,this._z=(r+h)/t}else if(a>c){const t=2*Math.sqrt(1+a-i-c);this._w=(r-h)/t,this._x=(s+n)/t,this._y=.25*t,this._z=(o+l)/t}else{const t=2*Math.sqrt(1+c-i-a);this._w=(n-s)/t,this._x=(r+h)/t,this._y=(o+l)/t,this._z=.25*t}return this._onChangeCallback(),this}setFromUnitVectors(t,e){let i=t.dot(e)+1;return i<1e-8?(i=0,Math.abs(t.x)>Math.abs(t.z)?(this._x=-t.y,this._y=t.x,this._z=0,this._w=i):(this._x=0,this._y=-t.z,this._z=t.y,this._w=i)):(this._x=t.y*e.z-t.z*e.y,this._y=t.z*e.x-t.x*e.z,this._z=t.x*e.y-t.y*e.x,this._w=i),this.normalize()}angleTo(t){return 2*Math.acos(Math.abs(xs(this.dot(t),-1,1)))}rotateTowards(t,e){const i=this.angleTo(t);if(0===i)return this;const s=Math.min(1,e/i);return this.slerp(t,s),this}identity(){return this.set(0,0,0,1)}invert(){return this.conjugate()}conjugate(){return this._x*=-1,this._y*=-1,this._z*=-1,this._onChangeCallback(),this}dot(t){return this._x*t._x+this._y*t._y+this._z*t._z+this._w*t._w}lengthSq(){return this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w}length(){return Math.sqrt(this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w)}normalize(){let t=this.length();return 0===t?(this._x=0,this._y=0,this._z=0,this._w=1):(t=1/t,this._x=this._x*t,this._y=this._y*t,this._z=this._z*t,this._w=this._w*t),this._onChangeCallback(),this}multiply(t){return this.multiplyQuaternions(this,t)}premultiply(t){return this.multiplyQuaternions(t,this)}multiplyQuaternions(t,e){const i=t._x,s=t._y,r=t._z,n=t._w,a=e._x,o=e._y,h=e._z,l=e._w;return this._x=i*l+n*a+s*h-r*o,this._y=s*l+n*o+r*a-i*h,this._z=r*l+n*h+i*o-s*a,this._w=n*l-i*a-s*o-r*h,this._onChangeCallback(),this}slerp(t,e){let i=t._x,s=t._y,r=t._z,n=t._w,a=this.dot(t);a<0&&(i=-i,s=-s,r=-r,n=-n,a=-a);let o=1-e;if(a<.9995){const t=Math.acos(a),h=Math.sin(t);o=Math.sin(o*t)/h,e=Math.sin(e*t)/h,this._x=this._x*o+i*e,this._y=this._y*o+s*e,this._z=this._z*o+r*e,this._w=this._w*o+n*e,this._onChangeCallback()}else this._x=this._x*o+i*e,this._y=this._y*o+s*e,this._z=this._z*o+r*e,this._w=this._w*o+n*e,this.normalize();return this}slerpQuaternions(t,e,i){return this.copy(t).slerp(e,i)}random(){const t=2*Math.PI*Math.random(),e=2*Math.PI*Math.random(),i=Math.random(),s=Math.sqrt(1-i),r=Math.sqrt(i);return this.set(s*Math.sin(t),s*Math.cos(t),r*Math.sin(e),r*Math.cos(e))}equals(t){return t._x===this._x&&t._y===this._y&&t._z===this._z&&t._w===this._w}fromArray(t,e=0){return this._x=t[e],this._y=t[e+1],this._z=t[e+2],this._w=t[e+3],this._onChangeCallback(),this}toArray(t=[],e=0){return t[e]=this._x,t[e+1]=this._y,t[e+2]=this._z,t[e+3]=this._w,t}fromBufferAttribute(t,e){return this._x=t.getX(e),this._y=t.getY(e),this._z=t.getZ(e),this._w=t.getW(e),this._onChangeCallback(),this}toJSON(){return this.toArray()}_onChange(t){return this._onChangeCallback=t,this}_onChangeCallback(){}*[Symbol.iterator](){yield this._x,yield this._y,yield this._z,yield this._w}}class Ts{constructor(t=0,e=0,i=0){Ts.prototype.isVector3=!0,this.x=t,this.y=e,this.z=i}set(t,e,i){return void 0===i&&(i=this.z),this.x=t,this.y=e,this.z=i,this}setScalar(t){return this.x=t,this.y=t,this.z=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setZ(t){return this.z=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;case 2:this.z=e;break;default:throw new Error("index is out of range: "+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;case 2:return this.z;default:throw new Error("index is out of range: "+t)}}clone(){return new this.constructor(this.x,this.y,this.z)}copy(t){return this.x=t.x,this.y=t.y,this.z=t.z,this}add(t){return this.x+=t.x,this.y+=t.y,this.z+=t.z,this}addScalar(t){return this.x+=t,this.y+=t,this.z+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this.z=t.z+e.z,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this.z+=t.z*e,this}sub(t){return this.x-=t.x,this.y-=t.y,this.z-=t.z,this}subScalar(t){return this.x-=t,this.y-=t,this.z-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this.z=t.z-e.z,this}multiply(t){return this.x*=t.x,this.y*=t.y,this.z*=t.z,this}multiplyScalar(t){return this.x*=t,this.y*=t,this.z*=t,this}multiplyVectors(t,e){return this.x=t.x*e.x,this.y=t.y*e.y,this.z=t.z*e.z,this}applyEuler(t){return this.applyQuaternion(Cs.setFromEuler(t))}applyAxisAngle(t,e){return this.applyQuaternion(Cs.setFromAxisAngle(t,e))}applyMatrix3(t){const e=this.x,i=this.y,s=this.z,r=t.elements;return this.x=r[0]*e+r[3]*i+r[6]*s,this.y=r[1]*e+r[4]*i+r[7]*s,this.z=r[2]*e+r[5]*i+r[8]*s,this}applyNormalMatrix(t){return this.applyMatrix3(t).normalize()}applyMatrix4(t){const e=this.x,i=this.y,s=this.z,r=t.elements,n=1/(r[3]*e+r[7]*i+r[11]*s+r[15]);return this.x=(r[0]*e+r[4]*i+r[8]*s+r[12])*n,this.y=(r[1]*e+r[5]*i+r[9]*s+r[13])*n,this.z=(r[2]*e+r[6]*i+r[10]*s+r[14])*n,this}applyQuaternion(t){const e=this.x,i=this.y,s=this.z,r=t.x,n=t.y,a=t.z,o=t.w,h=2*(n*s-a*i),l=2*(a*e-r*s),c=2*(r*i-n*e);return this.x=e+o*h+n*c-a*l,this.y=i+o*l+a*h-r*c,this.z=s+o*c+r*l-n*h,this}project(t){return this.applyMatrix4(t.matrixWorldInverse).applyMatrix4(t.projectionMatrix)}unproject(t){return this.applyMatrix4(t.projectionMatrixInverse).applyMatrix4(t.matrixWorld)}transformDirection(t){const e=this.x,i=this.y,s=this.z,r=t.elements;return this.x=r[0]*e+r[4]*i+r[8]*s,this.y=r[1]*e+r[5]*i+r[9]*s,this.z=r[2]*e+r[6]*i+r[10]*s,this.normalize()}divide(t){return this.x/=t.x,this.y/=t.y,this.z/=t.z,this}divideScalar(t){return this.multiplyScalar(1/t)}min(t){return this.x=Math.min(this.x,t.x),this.y=Math.min(this.y,t.y),this.z=Math.min(this.z,t.z),this}max(t){return this.x=Math.max(this.x,t.x),this.y=Math.max(this.y,t.y),this.z=Math.max(this.z,t.z),this}clamp(t,e){return this.x=xs(this.x,t.x,e.x),this.y=xs(this.y,t.y,e.y),this.z=xs(this.z,t.z,e.z),this}clampScalar(t,e){return this.x=xs(this.x,t,e),this.y=xs(this.y,t,e),this.z=xs(this.z,t,e),this}clampLength(t,e){const i=this.length();return this.divideScalar(i||1).multiplyScalar(xs(i,t,e))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this.z=Math.trunc(this.z),this}negate(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this}dot(t){return this.x*t.x+this.y*t.y+this.z*t.z}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z}length(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)}normalize(){return this.divideScalar(this.length()||1)}setLength(t){return this.normalize().multiplyScalar(t)}lerp(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this.z+=(t.z-this.z)*e,this}lerpVectors(t,e,i){return this.x=t.x+(e.x-t.x)*i,this.y=t.y+(e.y-t.y)*i,this.z=t.z+(e.z-t.z)*i,this}cross(t){return this.crossVectors(this,t)}crossVectors(t,e){const i=t.x,s=t.y,r=t.z,n=e.x,a=e.y,o=e.z;return this.x=s*o-r*a,this.y=r*n-i*o,this.z=i*a-s*n,this}projectOnVector(t){const e=t.lengthSq();if(0===e)return this.set(0,0,0);const i=t.dot(this)/e;return this.copy(t).multiplyScalar(i)}projectOnPlane(t){return zs.copy(this).projectOnVector(t),this.sub(zs)}reflect(t){return this.sub(zs.copy(t).multiplyScalar(2*this.dot(t)))}angleTo(t){const e=Math.sqrt(this.lengthSq()*t.lengthSq());if(0===e)return Math.PI/2;const i=this.dot(t)/e;return Math.acos(xs(i,-1,1))}distanceTo(t){return Math.sqrt(this.distanceToSquared(t))}distanceToSquared(t){const e=this.x-t.x,i=this.y-t.y,s=this.z-t.z;return e*e+i*i+s*s}manhattanDistanceTo(t){return Math.abs(this.x-t.x)+Math.abs(this.y-t.y)+Math.abs(this.z-t.z)}setFromSpherical(t){return this.setFromSphericalCoords(t.radius,t.phi,t.theta)}setFromSphericalCoords(t,e,i){const s=Math.sin(e)*t;return this.x=s*Math.sin(i),this.y=Math.cos(e)*t,this.z=s*Math.cos(i),this}setFromCylindrical(t){return this.setFromCylindricalCoords(t.radius,t.theta,t.y)}setFromCylindricalCoords(t,e,i){return this.x=t*Math.sin(e),this.y=i,this.z=t*Math.cos(e),this}setFromMatrixPosition(t){const e=t.elements;return this.x=e[12],this.y=e[13],this.z=e[14],this}setFromMatrixScale(t){const e=this.setFromMatrixColumn(t,0).length(),i=this.setFromMatrixColumn(t,1).length(),s=this.setFromMatrixColumn(t,2).length();return this.x=e,this.y=i,this.z=s,this}setFromMatrixColumn(t,e){return this.fromArray(t.elements,4*e)}setFromMatrix3Column(t,e){return this.fromArray(t.elements,3*e)}setFromEuler(t){return this.x=t._x,this.y=t._y,this.z=t._z,this}setFromColor(t){return this.x=t.r,this.y=t.g,this.z=t.b,this}equals(t){return t.x===this.x&&t.y===this.y&&t.z===this.z}fromArray(t,e=0){return this.x=t[e],this.y=t[e+1],this.z=t[e+2],this}toArray(t=[],e=0){return t[e]=this.x,t[e+1]=this.y,t[e+2]=this.z,t}fromBufferAttribute(t,e){return this.x=t.getX(e),this.y=t.getY(e),this.z=t.getZ(e),this}random(){return this.x=Math.random(),this.y=Math.random(),this.z=Math.random(),this}randomDirection(){const t=Math.random()*Math.PI*2,e=2*Math.random()-1,i=Math.sqrt(1-e*e);return this.x=i*Math.cos(t),this.y=e,this.z=i*Math.sin(t),this}*[Symbol.iterator](){yield this.x,yield this.y,yield this.z}}const zs=new Ts,Cs=new As;class Is{constructor(t,e,i,s,r,n,a,o,h){Is.prototype.isMatrix3=!0,this.elements=[1,0,0,0,1,0,0,0,1],void 0!==t&&this.set(t,e,i,s,r,n,a,o,h)}set(t,e,i,s,r,n,a,o,h){const l=this.elements;return l[0]=t,l[1]=s,l[2]=a,l[3]=e,l[4]=r,l[5]=o,l[6]=i,l[7]=n,l[8]=h,this}identity(){return this.set(1,0,0,0,1,0,0,0,1),this}copy(t){const e=this.elements,i=t.elements;return e[0]=i[0],e[1]=i[1],e[2]=i[2],e[3]=i[3],e[4]=i[4],e[5]=i[5],e[6]=i[6],e[7]=i[7],e[8]=i[8],this}extractBasis(t,e,i){return t.setFromMatrix3Column(this,0),e.setFromMatrix3Column(this,1),i.setFromMatrix3Column(this,2),this}setFromMatrix4(t){const e=t.elements;return this.set(e[0],e[4],e[8],e[1],e[5],e[9],e[2],e[6],e[10]),this}multiply(t){return this.multiplyMatrices(this,t)}premultiply(t){return this.multiplyMatrices(t,this)}multiplyMatrices(t,e){const i=t.elements,s=e.elements,r=this.elements,n=i[0],a=i[3],o=i[6],h=i[1],l=i[4],c=i[7],u=i[2],d=i[5],p=i[8],m=s[0],y=s[3],g=s[6],f=s[1],x=s[4],b=s[7],v=s[2],w=s[5],M=s[8];return r[0]=n*m+a*f+o*v,r[3]=n*y+a*x+o*w,r[6]=n*g+a*b+o*M,r[1]=h*m+l*f+c*v,r[4]=h*y+l*x+c*w,r[7]=h*g+l*b+c*M,r[2]=u*m+d*f+p*v,r[5]=u*y+d*x+p*w,r[8]=u*g+d*b+p*M,this}multiplyScalar(t){const e=this.elements;return e[0]*=t,e[3]*=t,e[6]*=t,e[1]*=t,e[4]*=t,e[7]*=t,e[2]*=t,e[5]*=t,e[8]*=t,this}determinant(){const t=this.elements,e=t[0],i=t[1],s=t[2],r=t[3],n=t[4],a=t[5],o=t[6],h=t[7],l=t[8];return e*n*l-e*a*h-i*r*l+i*a*o+s*r*h-s*n*o}invert(){const t=this.elements,e=t[0],i=t[1],s=t[2],r=t[3],n=t[4],a=t[5],o=t[6],h=t[7],l=t[8],c=l*n-a*h,u=a*o-l*r,d=h*r-n*o,p=e*c+i*u+s*d;if(0===p)return this.set(0,0,0,0,0,0,0,0,0);const m=1/p;return t[0]=c*m,t[1]=(s*h-l*i)*m,t[2]=(a*i-s*n)*m,t[3]=u*m,t[4]=(l*e-s*o)*m,t[5]=(s*r-a*e)*m,t[6]=d*m,t[7]=(i*o-h*e)*m,t[8]=(n*e-i*r)*m,this}transpose(){let t;const e=this.elements;return t=e[1],e[1]=e[3],e[3]=t,t=e[2],e[2]=e[6],e[6]=t,t=e[5],e[5]=e[7],e[7]=t,this}getNormalMatrix(t){return this.setFromMatrix4(t).invert().transpose()}transposeIntoArray(t){const e=this.elements;return t[0]=e[0],t[1]=e[3],t[2]=e[6],t[3]=e[1],t[4]=e[4],t[5]=e[7],t[6]=e[2],t[7]=e[5],t[8]=e[8],this}setUvTransform(t,e,i,s,r,n,a){const o=Math.cos(r),h=Math.sin(r);return this.set(i*o,i*h,-i*(o*n+h*a)+n+t,-s*h,s*o,-s*(-h*n+o*a)+a+e,0,0,1),this}scale(t,e){return this.premultiply(Bs.makeScale(t,e)),this}rotate(t){return this.premultiply(Bs.makeRotation(-t)),this}translate(t,e){return this.premultiply(Bs.makeTranslation(t,e)),this}makeTranslation(t,e){return t.isVector2?this.set(1,0,t.x,0,1,t.y,0,0,1):this.set(1,0,t,0,1,e,0,0,1),this}makeRotation(t){const e=Math.cos(t),i=Math.sin(t);return this.set(e,-i,0,i,e,0,0,0,1),this}makeScale(t,e){return this.set(t,0,0,0,e,0,0,0,1),this}equals(t){const e=this.elements,i=t.elements;for(let t=0;t<9;t++)if(e[t]!==i[t])return!1;return!0}fromArray(t,e=0){for(let i=0;i<9;i++)this.elements[i]=t[i+e];return this}toArray(t=[],e=0){const i=this.elements;return t[e]=i[0],t[e+1]=i[1],t[e+2]=i[2],t[e+3]=i[3],t[e+4]=i[4],t[e+5]=i[5],t[e+6]=i[6],t[e+7]=i[7],t[e+8]=i[8],t}clone(){return(new this.constructor).fromArray(this.elements)}}const Bs=new Is,ks=(new Is).set(.4123908,.3575843,.1804808,.212639,.7151687,.0721923,.0193308,.1191948,.9505322),Os=(new Is).set(3.2409699,-1.5373832,-.4986108,-.9692436,1.8759675,.0415551,.0556301,-.203977,1.0569715);function Ps(){const t={enabled:!0,workingColorSpace:ii,spaces:{},convert:function(t,e,i){return!1!==this.enabled&&e!==i&&e&&i?(this.spaces[e].transfer===ri&&(t.r=Ns(t.r),t.g=Ns(t.g),t.b=Ns(t.b)),this.spaces[e].primaries!==this.spaces[i].primaries&&(t.applyMatrix3(this.spaces[e].toXYZ),t.applyMatrix3(this.spaces[i].fromXYZ)),this.spaces[i].transfer===ri&&(t.r=Vs(t.r),t.g=Vs(t.g),t.b=Vs(t.b)),t):t},workingToColorSpace:function(t,e){return this.convert(t,this.workingColorSpace,e)},colorSpaceToWorking:function(t,e){return this.convert(t,e,this.workingColorSpace)},getPrimaries:function(t){return this.spaces[t].primaries},getTransfer:function(t){return""===t?si:this.spaces[t].transfer},getToneMappingMode:function(t){return this.spaces[t].outputColorSpaceConfig.toneMappingMode||"standard"},getLuminanceCoefficients:function(t,e=this.workingColorSpace){return t.fromArray(this.spaces[e].luminanceCoefficients)},define:function(t){Object.assign(this.spaces,t)},_getMatrix:function(t,e,i){return t.copy(this.spaces[e].toXYZ).multiply(this.spaces[i].fromXYZ)},_getDrawingBufferColorSpace:function(t){return this.spaces[t].outputColorSpaceConfig.drawingBufferColorSpace},_getUnpackColorSpace:function(t=this.workingColorSpace){return this.spaces[t].workingColorSpaceConfig.unpackColorSpace},fromWorkingColorSpace:function(e,i){return hs("ColorManagement: .fromWorkingColorSpace() has been renamed to .workingToColorSpace()."),t.workingToColorSpace(e,i)},toWorkingColorSpace:function(e,i){return hs("ColorManagement: .toWorkingColorSpace() has been renamed to .colorSpaceToWorking()."),t.colorSpaceToWorking(e,i)}},e=[.64,.33,.3,.6,.15,.06],i=[.2126,.7152,.0722],s=[.3127,.329];return t.define({[ii]:{primaries:e,whitePoint:s,transfer:si,toXYZ:ks,fromXYZ:Os,luminanceCoefficients:i,workingColorSpaceConfig:{unpackColorSpace:ei},outputColorSpaceConfig:{drawingBufferColorSpace:ei}},[ei]:{primaries:e,whitePoint:s,transfer:ri,toXYZ:ks,fromXYZ:Os,luminanceCoefficients:i,outputColorSpaceConfig:{drawingBufferColorSpace:ei}}}),t}const Rs=Ps();function Ns(t){return t<.04045?.0773993808*t:Math.pow(.9478672986*t+.0521327014,2.4)}function Vs(t){return t<.0031308?12.92*t:1.055*Math.pow(t,.41666)-.055}let Es;class Fs{static getDataURL(t,e="image/png"){if(/^data:/i.test(t.src))return t.src;if("undefined"==typeof HTMLCanvasElement)return t.src;let i;if(t instanceof HTMLCanvasElement)i=t;else{void 0===Es&&(Es=Qi("canvas")),Es.width=t.width,Es.height=t.height;const e=Es.getContext("2d");t instanceof ImageData?e.putImageData(t,0,0):e.drawImage(t,0,0,t.width,t.height),i=Es}return i.toDataURL(e)}static sRGBToLinear(t){if("undefined"!=typeof HTMLImageElement&&t instanceof HTMLImageElement||"undefined"!=typeof HTMLCanvasElement&&t instanceof HTMLCanvasElement||"undefined"!=typeof ImageBitmap&&t instanceof ImageBitmap){const e=Qi("canvas");e.width=t.width,e.height=t.height;const i=e.getContext("2d");i.drawImage(t,0,0,t.width,t.height);const s=i.getImageData(0,0,t.width,t.height),r=s.data;for(let t=0;t1),this.pmremVersion=0}get width(){return this.source.getSize(Us).x}get height(){return this.source.getSize(Us).y}get depth(){return this.source.getSize(Us).z}get image(){return this.source.data}set image(t){this.source.data=t}updateMatrix(){this.matrix.setUvTransform(this.offset.x,this.offset.y,this.repeat.x,this.repeat.y,this.rotation,this.center.x,this.center.y)}addUpdateRange(t,e){this.updateRanges.push({start:t,count:e})}clearUpdateRanges(){this.updateRanges.length=0}clone(){return(new this.constructor).copy(this)}copy(t){return this.name=t.name,this.source=t.source,this.mipmaps=t.mipmaps.slice(0),this.mapping=t.mapping,this.channel=t.channel,this.wrapS=t.wrapS,this.wrapT=t.wrapT,this.magFilter=t.magFilter,this.minFilter=t.minFilter,this.anisotropy=t.anisotropy,this.format=t.format,this.internalFormat=t.internalFormat,this.type=t.type,this.offset.copy(t.offset),this.repeat.copy(t.repeat),this.center.copy(t.center),this.rotation=t.rotation,this.matrixAutoUpdate=t.matrixAutoUpdate,this.matrix.copy(t.matrix),this.generateMipmaps=t.generateMipmaps,this.premultiplyAlpha=t.premultiplyAlpha,this.flipY=t.flipY,this.unpackAlignment=t.unpackAlignment,this.colorSpace=t.colorSpace,this.renderTarget=t.renderTarget,this.isRenderTargetTexture=t.isRenderTargetTexture,this.isArrayTexture=t.isArrayTexture,this.userData=JSON.parse(JSON.stringify(t.userData)),this.needsUpdate=!0,this}setValues(t){for(const e in t){const i=t[e];if(void 0===i){as(`Texture.setValues(): parameter '${e}' has value of undefined.`);continue}const s=this[e];void 0!==s?s&&i&&s.isVector2&&i.isVector2||s&&i&&s.isVector3&&i.isVector3||s&&i&&s.isMatrix3&&i.isMatrix3?s.copy(i):this[e]=i:as(`Texture.setValues(): property '${e}' does not exist.`)}}toJSON(t){const e=void 0===t||"string"==typeof t;if(!e&&void 0!==t.textures[this.uuid])return t.textures[this.uuid];const i={metadata:{version:4.7,type:"Texture",generator:"Texture.toJSON"},uuid:this.uuid,name:this.name,image:this.source.toJSON(t).uuid,mapping:this.mapping,channel:this.channel,repeat:[this.repeat.x,this.repeat.y],offset:[this.offset.x,this.offset.y],center:[this.center.x,this.center.y],rotation:this.rotation,wrap:[this.wrapS,this.wrapT],format:this.format,internalFormat:this.internalFormat,type:this.type,colorSpace:this.colorSpace,minFilter:this.minFilter,magFilter:this.magFilter,anisotropy:this.anisotropy,flipY:this.flipY,generateMipmaps:this.generateMipmaps,premultiplyAlpha:this.premultiplyAlpha,unpackAlignment:this.unpackAlignment};return Object.keys(this.userData).length>0&&(i.userData=this.userData),e||(t.textures[this.uuid]=i),i}dispose(){this.dispatchEvent({type:"dispose"})}transformUv(t){if(this.mapping!==ht)return t;if(t.applyMatrix3(this.matrix),t.x<0||t.x>1)switch(this.wrapS){case mt:t.x=t.x-Math.floor(t.x);break;case yt:t.x=t.x<0?0:1;break;case gt:1===Math.abs(Math.floor(t.x)%2)?t.x=Math.ceil(t.x)-t.x:t.x=t.x-Math.floor(t.x)}if(t.y<0||t.y>1)switch(this.wrapT){case mt:t.y=t.y-Math.floor(t.y);break;case yt:t.y=t.y<0?0:1;break;case gt:1===Math.abs(Math.floor(t.y)%2)?t.y=Math.ceil(t.y)-t.y:t.y=t.y-Math.floor(t.y)}return this.flipY&&(t.y=1-t.y),t}set needsUpdate(t){!0===t&&(this.version++,this.source.needsUpdate=!0)}set needsPMREMUpdate(t){!0===t&&this.pmremVersion++}}qs.DEFAULT_IMAGE=null,qs.DEFAULT_MAPPING=ht,qs.DEFAULT_ANISOTROPY=1;class Js{constructor(t=0,e=0,i=0,s=1){Js.prototype.isVector4=!0,this.x=t,this.y=e,this.z=i,this.w=s}get width(){return this.z}set width(t){this.z=t}get height(){return this.w}set height(t){this.w=t}set(t,e,i,s){return this.x=t,this.y=e,this.z=i,this.w=s,this}setScalar(t){return this.x=t,this.y=t,this.z=t,this.w=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setZ(t){return this.z=t,this}setW(t){return this.w=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;case 2:this.z=e;break;case 3:this.w=e;break;default:throw new Error("index is out of range: "+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;case 2:return this.z;case 3:return this.w;default:throw new Error("index is out of range: "+t)}}clone(){return new this.constructor(this.x,this.y,this.z,this.w)}copy(t){return this.x=t.x,this.y=t.y,this.z=t.z,this.w=void 0!==t.w?t.w:1,this}add(t){return this.x+=t.x,this.y+=t.y,this.z+=t.z,this.w+=t.w,this}addScalar(t){return this.x+=t,this.y+=t,this.z+=t,this.w+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this.z=t.z+e.z,this.w=t.w+e.w,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this.z+=t.z*e,this.w+=t.w*e,this}sub(t){return this.x-=t.x,this.y-=t.y,this.z-=t.z,this.w-=t.w,this}subScalar(t){return this.x-=t,this.y-=t,this.z-=t,this.w-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this.z=t.z-e.z,this.w=t.w-e.w,this}multiply(t){return this.x*=t.x,this.y*=t.y,this.z*=t.z,this.w*=t.w,this}multiplyScalar(t){return this.x*=t,this.y*=t,this.z*=t,this.w*=t,this}applyMatrix4(t){const e=this.x,i=this.y,s=this.z,r=this.w,n=t.elements;return this.x=n[0]*e+n[4]*i+n[8]*s+n[12]*r,this.y=n[1]*e+n[5]*i+n[9]*s+n[13]*r,this.z=n[2]*e+n[6]*i+n[10]*s+n[14]*r,this.w=n[3]*e+n[7]*i+n[11]*s+n[15]*r,this}divide(t){return this.x/=t.x,this.y/=t.y,this.z/=t.z,this.w/=t.w,this}divideScalar(t){return this.multiplyScalar(1/t)}setAxisAngleFromQuaternion(t){this.w=2*Math.acos(t.w);const e=Math.sqrt(1-t.w*t.w);return e<1e-4?(this.x=1,this.y=0,this.z=0):(this.x=t.x/e,this.y=t.y/e,this.z=t.z/e),this}setAxisAngleFromRotationMatrix(t){let e,i,s,r;const n=.01,a=.1,o=t.elements,h=o[0],l=o[4],c=o[8],u=o[1],d=o[5],p=o[9],m=o[2],y=o[6],g=o[10];if(Math.abs(l-u)o&&t>f?tf?o1);this.dispose()}this.viewport.set(0,0,t,e),this.scissor.set(0,0,t,e)}clone(){return(new this.constructor).copy(this)}copy(t){this.width=t.width,this.height=t.height,this.depth=t.depth,this.scissor.copy(t.scissor),this.scissorTest=t.scissorTest,this.viewport.copy(t.viewport),this.textures.length=0;for(let e=0,i=t.textures.length;e>>0}enable(t){this.mask|=1<1){for(let t=0;t1){for(let t=0;t0&&(s.userData=this.userData),s.layers=this.layers.mask,s.matrix=this.matrix.toArray(),s.up=this.up.toArray(),null!==this.pivot&&(s.pivot=this.pivot.toArray()),!1===this.matrixAutoUpdate&&(s.matrixAutoUpdate=!1),void 0!==this.morphTargetDictionary&&(s.morphTargetDictionary=Object.assign({},this.morphTargetDictionary)),void 0!==this.morphTargetInfluences&&(s.morphTargetInfluences=this.morphTargetInfluences.slice()),this.isInstancedMesh&&(s.type="InstancedMesh",s.count=this.count,s.instanceMatrix=this.instanceMatrix.toJSON(),null!==this.instanceColor&&(s.instanceColor=this.instanceColor.toJSON())),this.isBatchedMesh&&(s.type="BatchedMesh",s.perObjectFrustumCulled=this.perObjectFrustumCulled,s.sortObjects=this.sortObjects,s.drawRanges=this._drawRanges,s.reservedRanges=this._reservedRanges,s.geometryInfo=this._geometryInfo.map(t=>({...t,boundingBox:t.boundingBox?t.boundingBox.toJSON():void 0,boundingSphere:t.boundingSphere?t.boundingSphere.toJSON():void 0})),s.instanceInfo=this._instanceInfo.map(t=>({...t})),s.availableInstanceIds=this._availableInstanceIds.slice(),s.availableGeometryIds=this._availableGeometryIds.slice(),s.nextIndexStart=this._nextIndexStart,s.nextVertexStart=this._nextVertexStart,s.geometryCount=this._geometryCount,s.maxInstanceCount=this._maxInstanceCount,s.maxVertexCount=this._maxVertexCount,s.maxIndexCount=this._maxIndexCount,s.geometryInitialized=this._geometryInitialized,s.matricesTexture=this._matricesTexture.toJSON(t),s.indirectTexture=this._indirectTexture.toJSON(t),null!==this._colorsTexture&&(s.colorsTexture=this._colorsTexture.toJSON(t)),null!==this.boundingSphere&&(s.boundingSphere=this.boundingSphere.toJSON()),null!==this.boundingBox&&(s.boundingBox=this.boundingBox.toJSON())),this.isScene)this.background&&(this.background.isColor?s.background=this.background.toJSON():this.background.isTexture&&(s.background=this.background.toJSON(t).uuid)),this.environment&&this.environment.isTexture&&!0!==this.environment.isRenderTargetTexture&&(s.environment=this.environment.toJSON(t).uuid);else if(this.isMesh||this.isLine||this.isPoints){s.geometry=r(t.geometries,this.geometry);const e=this.geometry.parameters;if(void 0!==e&&void 0!==e.shapes){const i=e.shapes;if(Array.isArray(i))for(let e=0,s=i.length;e0){s.children=[];for(let e=0;e0){s.animations=[];for(let e=0;e0&&(i.geometries=e),s.length>0&&(i.materials=s),r.length>0&&(i.textures=r),a.length>0&&(i.images=a),o.length>0&&(i.shapes=o),h.length>0&&(i.skeletons=h),l.length>0&&(i.animations=l),c.length>0&&(i.nodes=c)}return i.object=s,i;function n(t){const e=[];for(const i in t){const s=t[i];delete s.metadata,e.push(s)}return e}}clone(t){return(new this.constructor).copy(this,t)}copy(t,e=!0){if(this.name=t.name,this.up.copy(t.up),this.position.copy(t.position),this.rotation.order=t.rotation.order,this.quaternion.copy(t.quaternion),this.scale.copy(t.scale),null!==t.pivot&&(this.pivot=t.pivot.clone()),this.matrix.copy(t.matrix),this.matrixWorld.copy(t.matrixWorld),this.matrixAutoUpdate=t.matrixAutoUpdate,this.matrixWorldAutoUpdate=t.matrixWorldAutoUpdate,this.matrixWorldNeedsUpdate=t.matrixWorldNeedsUpdate,this.layers.mask=t.layers.mask,this.visible=t.visible,this.castShadow=t.castShadow,this.receiveShadow=t.receiveShadow,this.frustumCulled=t.frustumCulled,this.renderOrder=t.renderOrder,this.static=t.static,this.animations=t.animations.slice(),this.userData=JSON.parse(JSON.stringify(t.userData)),!0===e)for(let e=0;eo+l?(h.inputState.pinching=!1,this.dispatchEvent({type:"pinchend",handedness:t.handedness,target:this})):!h.inputState.pinching&&a<=o-l&&(h.inputState.pinching=!0,this.dispatchEvent({type:"pinchstart",handedness:t.handedness,target:this}))}else null!==o&&t.gripSpace&&(r=e.getPose(t.gripSpace,i),null!==r&&(o.matrix.fromArray(r.transform.matrix),o.matrix.decompose(o.position,o.rotation,o.scale),o.matrixWorldNeedsUpdate=!0,r.linearVelocity?(o.hasLinearVelocity=!0,o.linearVelocity.copy(r.linearVelocity)):o.hasLinearVelocity=!1,r.angularVelocity?(o.hasAngularVelocity=!0,o.angularVelocity.copy(r.angularVelocity)):o.hasAngularVelocity=!1,o.eventsEnabled&&o.dispatchEvent({type:"gripUpdated",data:t,target:this})));null!==a&&(s=e.getPose(t.targetRaySpace,i),null===s&&null!==r&&(s=r),null!==s&&(a.matrix.fromArray(s.transform.matrix),a.matrix.decompose(a.position,a.rotation,a.scale),a.matrixWorldNeedsUpdate=!0,s.linearVelocity?(a.hasLinearVelocity=!0,a.linearVelocity.copy(s.linearVelocity)):a.hasLinearVelocity=!1,s.angularVelocity?(a.hasAngularVelocity=!0,a.angularVelocity.copy(s.angularVelocity)):a.hasAngularVelocity=!1,this.dispatchEvent(zr)))}return null!==a&&(a.visible=null!==s),null!==o&&(o.visible=null!==r),null!==h&&(h.visible=null!==n),this}_getHandJoint(t,e){if(void 0===t.joints[e.jointName]){const i=new Tr;i.matrixAutoUpdate=!1,i.visible=!1,t.joints[e.jointName]=i,t.add(i)}return t.joints[e.jointName]}}const Ir={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074},Br={h:0,s:0,l:0},kr={h:0,s:0,l:0};function Or(t,e,i){return i<0&&(i+=1),i>1&&(i-=1),i<1/6?t+6*(e-t)*i:i<.5?e:i<2/3?t+6*(e-t)*(2/3-i):t}class Pr{constructor(t,e,i){return this.isColor=!0,this.r=1,this.g=1,this.b=1,this.set(t,e,i)}set(t,e,i){if(void 0===e&&void 0===i){const e=t;e&&e.isColor?this.copy(e):"number"==typeof e?this.setHex(e):"string"==typeof e&&this.setStyle(e)}else this.setRGB(t,e,i);return this}setScalar(t){return this.r=t,this.g=t,this.b=t,this}setHex(t,e=ei){return t=Math.floor(t),this.r=(t>>16&255)/255,this.g=(t>>8&255)/255,this.b=(255&t)/255,Rs.colorSpaceToWorking(this,e),this}setRGB(t,e,i,s=Rs.workingColorSpace){return this.r=t,this.g=e,this.b=i,Rs.colorSpaceToWorking(this,s),this}setHSL(t,e,i,s=Rs.workingColorSpace){if(t=bs(t,1),e=xs(e,0,1),i=xs(i,0,1),0===e)this.r=this.g=this.b=i;else{const s=i<=.5?i*(1+e):i+e-i*e,r=2*i-s;this.r=Or(r,s,t+1/3),this.g=Or(r,s,t),this.b=Or(r,s,t-1/3)}return Rs.colorSpaceToWorking(this,s),this}setStyle(t,e=ei){function i(e){void 0!==e&&parseFloat(e)<1&&as("Color: Alpha component of "+t+" will be ignored.")}let s;if(s=/^(\w+)\(([^\)]*)\)/.exec(t)){let r;const n=s[1],a=s[2];switch(n){case"rgb":case"rgba":if(r=/^\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(a))return i(r[4]),this.setRGB(Math.min(255,parseInt(r[1],10))/255,Math.min(255,parseInt(r[2],10))/255,Math.min(255,parseInt(r[3],10))/255,e);if(r=/^\s*(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(a))return i(r[4]),this.setRGB(Math.min(100,parseInt(r[1],10))/100,Math.min(100,parseInt(r[2],10))/100,Math.min(100,parseInt(r[3],10))/100,e);break;case"hsl":case"hsla":if(r=/^\s*(\d*\.?\d+)\s*,\s*(\d*\.?\d+)\%\s*,\s*(\d*\.?\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(a))return i(r[4]),this.setHSL(parseFloat(r[1])/360,parseFloat(r[2])/100,parseFloat(r[3])/100,e);break;default:as("Color: Unknown color model "+t)}}else if(s=/^\#([A-Fa-f\d]+)$/.exec(t)){const i=s[1],r=i.length;if(3===r)return this.setRGB(parseInt(i.charAt(0),16)/15,parseInt(i.charAt(1),16)/15,parseInt(i.charAt(2),16)/15,e);if(6===r)return this.setHex(parseInt(i,16),e);as("Color: Invalid hex color "+t)}else if(t&&t.length>0)return this.setColorName(t,e);return this}setColorName(t,e=ei){const i=Ir[t.toLowerCase()];return void 0!==i?this.setHex(i,e):as("Color: Unknown color "+t),this}clone(){return new this.constructor(this.r,this.g,this.b)}copy(t){return this.r=t.r,this.g=t.g,this.b=t.b,this}copySRGBToLinear(t){return this.r=Ns(t.r),this.g=Ns(t.g),this.b=Ns(t.b),this}copyLinearToSRGB(t){return this.r=Vs(t.r),this.g=Vs(t.g),this.b=Vs(t.b),this}convertSRGBToLinear(){return this.copySRGBToLinear(this),this}convertLinearToSRGB(){return this.copyLinearToSRGB(this),this}getHex(t=ei){return Rs.workingToColorSpace(Rr.copy(this),t),65536*Math.round(xs(255*Rr.r,0,255))+256*Math.round(xs(255*Rr.g,0,255))+Math.round(xs(255*Rr.b,0,255))}getHexString(t=ei){return("000000"+this.getHex(t).toString(16)).slice(-6)}getHSL(t,e=Rs.workingColorSpace){Rs.workingToColorSpace(Rr.copy(this),e);const i=Rr.r,s=Rr.g,r=Rr.b,n=Math.max(i,s,r),a=Math.min(i,s,r);let o,h;const l=(a+n)/2;if(a===n)o=0,h=0;else{const t=n-a;switch(h=l<=.5?t/(n+a):t/(2-n-a),n){case i:o=(s-r)/t+(s0&&(e.object.backgroundBlurriness=this.backgroundBlurriness),1!==this.backgroundIntensity&&(e.object.backgroundIntensity=this.backgroundIntensity),e.object.backgroundRotation=this.backgroundRotation.toArray(),1!==this.environmentIntensity&&(e.object.environmentIntensity=this.environmentIntensity),e.object.environmentRotation=this.environmentRotation.toArray(),e}}const Fr=new Ts,Lr=new Ts,jr=new Ts,Dr=new Ts,Wr=new Ts,Ur=new Ts,qr=new Ts,Jr=new Ts,Xr=new Ts,Yr=new Ts,Hr=new Js,Zr=new Js,Gr=new Js;class $r{constructor(t=new Ts,e=new Ts,i=new Ts){this.a=t,this.b=e,this.c=i}static getNormal(t,e,i,s){s.subVectors(i,e),Fr.subVectors(t,e),s.cross(Fr);const r=s.lengthSq();return r>0?s.multiplyScalar(1/Math.sqrt(r)):s.set(0,0,0)}static getBarycoord(t,e,i,s,r){Fr.subVectors(s,e),Lr.subVectors(i,e),jr.subVectors(t,e);const n=Fr.dot(Fr),a=Fr.dot(Lr),o=Fr.dot(jr),h=Lr.dot(Lr),l=Lr.dot(jr),c=n*h-a*a;if(0===c)return r.set(0,0,0),null;const u=1/c,d=(h*o-a*l)*u,p=(n*l-a*o)*u;return r.set(1-d-p,p,d)}static containsPoint(t,e,i,s){return null!==this.getBarycoord(t,e,i,s,Dr)&&(Dr.x>=0&&Dr.y>=0&&Dr.x+Dr.y<=1)}static getInterpolation(t,e,i,s,r,n,a,o){return null===this.getBarycoord(t,e,i,s,Dr)?(o.x=0,o.y=0,"z"in o&&(o.z=0),"w"in o&&(o.w=0),null):(o.setScalar(0),o.addScaledVector(r,Dr.x),o.addScaledVector(n,Dr.y),o.addScaledVector(a,Dr.z),o)}static getInterpolatedAttribute(t,e,i,s,r,n){return Hr.setScalar(0),Zr.setScalar(0),Gr.setScalar(0),Hr.fromBufferAttribute(t,e),Zr.fromBufferAttribute(t,i),Gr.fromBufferAttribute(t,s),n.setScalar(0),n.addScaledVector(Hr,r.x),n.addScaledVector(Zr,r.y),n.addScaledVector(Gr,r.z),n}static isFrontFacing(t,e,i,s){return Fr.subVectors(i,e),Lr.subVectors(t,e),Fr.cross(Lr).dot(s)<0}set(t,e,i){return this.a.copy(t),this.b.copy(e),this.c.copy(i),this}setFromPointsAndIndices(t,e,i,s){return this.a.copy(t[e]),this.b.copy(t[i]),this.c.copy(t[s]),this}setFromAttributeAndIndices(t,e,i,s){return this.a.fromBufferAttribute(t,e),this.b.fromBufferAttribute(t,i),this.c.fromBufferAttribute(t,s),this}clone(){return(new this.constructor).copy(this)}copy(t){return this.a.copy(t.a),this.b.copy(t.b),this.c.copy(t.c),this}getArea(){return Fr.subVectors(this.c,this.b),Lr.subVectors(this.a,this.b),.5*Fr.cross(Lr).length()}getMidpoint(t){return t.addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3)}getNormal(t){return $r.getNormal(this.a,this.b,this.c,t)}getPlane(t){return t.setFromCoplanarPoints(this.a,this.b,this.c)}getBarycoord(t,e){return $r.getBarycoord(t,this.a,this.b,this.c,e)}getInterpolation(t,e,i,s,r){return $r.getInterpolation(t,this.a,this.b,this.c,e,i,s,r)}containsPoint(t){return $r.containsPoint(t,this.a,this.b,this.c)}isFrontFacing(t){return $r.isFrontFacing(this.a,this.b,this.c,t)}intersectsBox(t){return t.intersectsTriangle(this)}closestPointToPoint(t,e){const i=this.a,s=this.b,r=this.c;let n,a;Wr.subVectors(s,i),Ur.subVectors(r,i),Jr.subVectors(t,i);const o=Wr.dot(Jr),h=Ur.dot(Jr);if(o<=0&&h<=0)return e.copy(i);Xr.subVectors(t,s);const l=Wr.dot(Xr),c=Ur.dot(Xr);if(l>=0&&c<=l)return e.copy(s);const u=o*c-l*h;if(u<=0&&o>=0&&l<=0)return n=o/(o-l),e.copy(i).addScaledVector(Wr,n);Yr.subVectors(t,r);const d=Wr.dot(Yr),p=Ur.dot(Yr);if(p>=0&&d<=p)return e.copy(r);const m=d*h-o*p;if(m<=0&&h>=0&&p<=0)return a=h/(h-p),e.copy(i).addScaledVector(Ur,a);const y=l*p-d*c;if(y<=0&&c-l>=0&&d-p>=0)return qr.subVectors(r,s),a=(c-l)/(c-l+(d-p)),e.copy(s).addScaledVector(qr,a);const g=1/(y+m+u);return n=m*g,a=u*g,e.copy(i).addScaledVector(Wr,n).addScaledVector(Ur,a)}equals(t){return t.a.equals(this.a)&&t.b.equals(this.b)&&t.c.equals(this.c)}}class Qr{constructor(t=new Ts(1/0,1/0,1/0),e=new Ts(-1/0,-1/0,-1/0)){this.isBox3=!0,this.min=t,this.max=e}set(t,e){return this.min.copy(t),this.max.copy(e),this}setFromArray(t){this.makeEmpty();for(let e=0,i=t.length;e=this.min.x&&t.x<=this.max.x&&t.y>=this.min.y&&t.y<=this.max.y&&t.z>=this.min.z&&t.z<=this.max.z}containsBox(t){return this.min.x<=t.min.x&&t.max.x<=this.max.x&&this.min.y<=t.min.y&&t.max.y<=this.max.y&&this.min.z<=t.min.z&&t.max.z<=this.max.z}getParameter(t,e){return e.set((t.x-this.min.x)/(this.max.x-this.min.x),(t.y-this.min.y)/(this.max.y-this.min.y),(t.z-this.min.z)/(this.max.z-this.min.z))}intersectsBox(t){return t.max.x>=this.min.x&&t.min.x<=this.max.x&&t.max.y>=this.min.y&&t.min.y<=this.max.y&&t.max.z>=this.min.z&&t.min.z<=this.max.z}intersectsSphere(t){return this.clampPoint(t.center,tn),tn.distanceToSquared(t.center)<=t.radius*t.radius}intersectsPlane(t){let e,i;return t.normal.x>0?(e=t.normal.x*this.min.x,i=t.normal.x*this.max.x):(e=t.normal.x*this.max.x,i=t.normal.x*this.min.x),t.normal.y>0?(e+=t.normal.y*this.min.y,i+=t.normal.y*this.max.y):(e+=t.normal.y*this.max.y,i+=t.normal.y*this.min.y),t.normal.z>0?(e+=t.normal.z*this.min.z,i+=t.normal.z*this.max.z):(e+=t.normal.z*this.max.z,i+=t.normal.z*this.min.z),e<=-t.constant&&i>=-t.constant}intersectsTriangle(t){if(this.isEmpty())return!1;this.getCenter(ln),cn.subVectors(this.max,ln),sn.subVectors(t.a,ln),rn.subVectors(t.b,ln),nn.subVectors(t.c,ln),an.subVectors(rn,sn),on.subVectors(nn,rn),hn.subVectors(sn,nn);let e=[0,-an.z,an.y,0,-on.z,on.y,0,-hn.z,hn.y,an.z,0,-an.x,on.z,0,-on.x,hn.z,0,-hn.x,-an.y,an.x,0,-on.y,on.x,0,-hn.y,hn.x,0];return!!pn(e,sn,rn,nn,cn)&&(e=[1,0,0,0,1,0,0,0,1],!!pn(e,sn,rn,nn,cn)&&(un.crossVectors(an,on),e=[un.x,un.y,un.z],pn(e,sn,rn,nn,cn)))}clampPoint(t,e){return e.copy(t).clamp(this.min,this.max)}distanceToPoint(t){return this.clampPoint(t,tn).distanceTo(t)}getBoundingSphere(t){return this.isEmpty()?t.makeEmpty():(this.getCenter(t.center),t.radius=.5*this.getSize(tn).length()),t}intersect(t){return this.min.max(t.min),this.max.min(t.max),this.isEmpty()&&this.makeEmpty(),this}union(t){return this.min.min(t.min),this.max.max(t.max),this}applyMatrix4(t){return this.isEmpty()||(Kr[0].set(this.min.x,this.min.y,this.min.z).applyMatrix4(t),Kr[1].set(this.min.x,this.min.y,this.max.z).applyMatrix4(t),Kr[2].set(this.min.x,this.max.y,this.min.z).applyMatrix4(t),Kr[3].set(this.min.x,this.max.y,this.max.z).applyMatrix4(t),Kr[4].set(this.max.x,this.min.y,this.min.z).applyMatrix4(t),Kr[5].set(this.max.x,this.min.y,this.max.z).applyMatrix4(t),Kr[6].set(this.max.x,this.max.y,this.min.z).applyMatrix4(t),Kr[7].set(this.max.x,this.max.y,this.max.z).applyMatrix4(t),this.setFromPoints(Kr)),this}translate(t){return this.min.add(t),this.max.add(t),this}equals(t){return t.min.equals(this.min)&&t.max.equals(this.max)}toJSON(){return{min:this.min.toArray(),max:this.max.toArray()}}fromJSON(t){return this.min.fromArray(t.min),this.max.fromArray(t.max),this}}const Kr=[new Ts,new Ts,new Ts,new Ts,new Ts,new Ts,new Ts,new Ts],tn=new Ts,en=new Qr,sn=new Ts,rn=new Ts,nn=new Ts,an=new Ts,on=new Ts,hn=new Ts,ln=new Ts,cn=new Ts,un=new Ts,dn=new Ts;function pn(t,e,i,s,r){for(let n=0,a=t.length-3;n<=a;n+=3){dn.fromArray(t,n);const a=r.x*Math.abs(dn.x)+r.y*Math.abs(dn.y)+r.z*Math.abs(dn.z),o=e.dot(dn),h=i.dot(dn),l=s.dot(dn);if(Math.max(-Math.max(o,h,l),Math.min(o,h,l))>a)return!1}return!0}const mn=yn();function yn(){const t=new ArrayBuffer(4),e=new Float32Array(t),i=new Uint32Array(t),s=new Uint32Array(512),r=new Uint32Array(512);for(let t=0;t<256;++t){const e=t-127;e<-27?(s[t]=0,s[256|t]=32768,r[t]=24,r[256|t]=24):e<-14?(s[t]=1024>>-e-14,s[256|t]=1024>>-e-14|32768,r[t]=-e-1,r[256|t]=-e-1):e<=15?(s[t]=e+15<<10,s[256|t]=e+15<<10|32768,r[t]=13,r[256|t]=13):e<128?(s[t]=31744,s[256|t]=64512,r[t]=24,r[256|t]=24):(s[t]=31744,s[256|t]=64512,r[t]=13,r[256|t]=13)}const n=new Uint32Array(2048),a=new Uint32Array(64),o=new Uint32Array(64);for(let t=1;t<1024;++t){let e=t<<13,i=0;for(;!(8388608&e);)e<<=1,i-=8388608;e&=-8388609,i+=947912704,n[t]=e|i}for(let t=1024;t<2048;++t)n[t]=939524096+(t-1024<<13);for(let t=1;t<31;++t)a[t]=t<<23;a[31]=1199570944,a[32]=2147483648;for(let t=33;t<63;++t)a[t]=2147483648+(t-32<<23);a[63]=3347054592;for(let t=1;t<64;++t)32!==t&&(o[t]=1024);return{floatView:e,uint32View:i,baseTable:s,shiftTable:r,mantissaTable:n,exponentTable:a,offsetTable:o}}function gn(t){Math.abs(t)>65504&&as("DataUtils.toHalfFloat(): Value out of range."),t=xs(t,-65504,65504),mn.floatView[0]=t;const e=mn.uint32View[0],i=e>>23&511;return mn.baseTable[i]+((8388607&e)>>mn.shiftTable[i])}function fn(t){const e=t>>10;return mn.uint32View[0]=mn.mantissaTable[mn.offsetTable[e]+(1023&t)]+mn.exponentTable[e],mn.floatView[0]}class xn{static toHalfFloat(t){return gn(t)}static fromHalfFloat(t){return fn(t)}}const bn=new Ts,vn=new _s;let wn=0;class Mn{constructor(t,e,i=!1){if(Array.isArray(t))throw new TypeError("THREE.BufferAttribute: array should be a Typed Array.");this.isBufferAttribute=!0,Object.defineProperty(this,"id",{value:wn++}),this.name="",this.array=t,this.itemSize=e,this.count=void 0!==t?t.length/e:0,this.normalized=i,this.usage=Oi,this.updateRanges=[],this.gpuType=Pt,this.version=0}onUploadCallback(){}set needsUpdate(t){!0===t&&this.version++}setUsage(t){return this.usage=t,this}addUpdateRange(t,e){this.updateRanges.push({start:t,count:e})}clearUpdateRanges(){this.updateRanges.length=0}copy(t){return this.name=t.name,this.array=new t.array.constructor(t.array),this.itemSize=t.itemSize,this.count=t.count,this.normalized=t.normalized,this.usage=t.usage,this.gpuType=t.gpuType,this}copyAt(t,e,i){t*=this.itemSize,i*=e.itemSize;for(let s=0,r=this.itemSize;sthis.radius*this.radius&&(e.sub(this.center).normalize(),e.multiplyScalar(this.radius).add(this.center)),e}getBoundingBox(t){return this.isEmpty()?(t.makeEmpty(),t):(t.set(this.center,this.center),t.expandByScalar(this.radius),t)}applyMatrix4(t){return this.center.applyMatrix4(t),this.radius=this.radius*t.getMaxScaleOnAxis(),this}translate(t){return this.center.add(t),this}expandByPoint(t){if(this.isEmpty())return this.center.copy(t),this.radius=0,this;Pn.subVectors(t,this.center);const e=Pn.lengthSq();if(e>this.radius*this.radius){const t=Math.sqrt(e),i=.5*(t-this.radius);this.center.addScaledVector(Pn,i/t),this.radius+=i}return this}union(t){return t.isEmpty()?this:this.isEmpty()?(this.copy(t),this):(!0===this.center.equals(t.center)?this.radius=Math.max(this.radius,t.radius):(Rn.subVectors(t.center,this.center).setLength(t.radius),this.expandByPoint(Pn.copy(t.center).add(Rn)),this.expandByPoint(Pn.copy(t.center).sub(Rn))),this)}equals(t){return t.center.equals(this.center)&&t.radius===this.radius}clone(){return(new this.constructor).copy(this)}toJSON(){return{radius:this.radius,center:this.center.toArray()}}fromJSON(t){return this.radius=t.radius,this.center.fromArray(t.center),this}}let Vn=0;const En=new Qs,Fn=new Ar,Ln=new Ts,jn=new Qr,Dn=new Qr,Wn=new Ts;class Un extends ds{constructor(){super(),this.isBufferGeometry=!0,Object.defineProperty(this,"id",{value:Vn++}),this.uuid=fs(),this.name="",this.type="BufferGeometry",this.index=null,this.indirect=null,this.indirectOffset=0,this.attributes={},this.morphAttributes={},this.morphTargetsRelative=!1,this.groups=[],this.boundingBox=null,this.boundingSphere=null,this.drawRange={start:0,count:1/0},this.userData={}}getIndex(){return this.index}setIndex(t){return Array.isArray(t)?this.index=new(function(t){for(let e=t.length-1;e>=0;--e)if(t[e]>=65535)return!0;return!1}(t)?In:zn)(t,1):this.index=t,this}setIndirect(t,e=0){return this.indirect=t,this.indirectOffset=e,this}getIndirect(){return this.indirect}getAttribute(t){return this.attributes[t]}setAttribute(t,e){return this.attributes[t]=e,this}deleteAttribute(t){return delete this.attributes[t],this}hasAttribute(t){return void 0!==this.attributes[t]}addGroup(t,e,i=0){this.groups.push({start:t,count:e,materialIndex:i})}clearGroups(){this.groups=[]}setDrawRange(t,e){this.drawRange.start=t,this.drawRange.count=e}applyMatrix4(t){const e=this.attributes.position;void 0!==e&&(e.applyMatrix4(t),e.needsUpdate=!0);const i=this.attributes.normal;if(void 0!==i){const e=(new Is).getNormalMatrix(t);i.applyNormalMatrix(e),i.needsUpdate=!0}const s=this.attributes.tangent;return void 0!==s&&(s.transformDirection(t),s.needsUpdate=!0),null!==this.boundingBox&&this.computeBoundingBox(),null!==this.boundingSphere&&this.computeBoundingSphere(),this}applyQuaternion(t){return En.makeRotationFromQuaternion(t),this.applyMatrix4(En),this}rotateX(t){return En.makeRotationX(t),this.applyMatrix4(En),this}rotateY(t){return En.makeRotationY(t),this.applyMatrix4(En),this}rotateZ(t){return En.makeRotationZ(t),this.applyMatrix4(En),this}translate(t,e,i){return En.makeTranslation(t,e,i),this.applyMatrix4(En),this}scale(t,e,i){return En.makeScale(t,e,i),this.applyMatrix4(En),this}lookAt(t){return Fn.lookAt(t),Fn.updateMatrix(),this.applyMatrix4(Fn.matrix),this}center(){return this.computeBoundingBox(),this.boundingBox.getCenter(Ln).negate(),this.translate(Ln.x,Ln.y,Ln.z),this}setFromPoints(t){const e=this.getAttribute("position");if(void 0===e){const e=[];for(let i=0,s=t.length;ie.count&&as("BufferGeometry: Buffer size too small for points data. Use .dispose() and create a new geometry."),e.needsUpdate=!0}return this}computeBoundingBox(){null===this.boundingBox&&(this.boundingBox=new Qr);const t=this.attributes.position,e=this.morphAttributes.position;if(t&&t.isGLBufferAttribute)return os("BufferGeometry.computeBoundingBox(): GLBufferAttribute requires a manual bounding box.",this),void this.boundingBox.set(new Ts(-1/0,-1/0,-1/0),new Ts(1/0,1/0,1/0));if(void 0!==t){if(this.boundingBox.setFromBufferAttribute(t),e)for(let t=0,i=e.length;t0&&(t.userData=this.userData),void 0!==this.parameters){const e=this.parameters;for(const i in e)void 0!==e[i]&&(t[i]=e[i]);return t}t.data={attributes:{}};const e=this.index;null!==e&&(t.data.index={type:e.array.constructor.name,array:Array.prototype.slice.call(e.array)});const i=this.attributes;for(const e in i){const s=i[e];t.data.attributes[e]=s.toJSON(t.data)}const s={};let r=!1;for(const e in this.morphAttributes){const i=this.morphAttributes[e],n=[];for(let e=0,s=i.length;e0&&(s[e]=n,r=!0)}r&&(t.data.morphAttributes=s,t.data.morphTargetsRelative=this.morphTargetsRelative);const n=this.groups;n.length>0&&(t.data.groups=JSON.parse(JSON.stringify(n)));const a=this.boundingSphere;return null!==a&&(t.data.boundingSphere=a.toJSON()),t}clone(){return(new this.constructor).copy(this)}copy(t){this.index=null,this.attributes={},this.morphAttributes={},this.groups=[],this.boundingBox=null,this.boundingSphere=null;const e={};this.name=t.name;const i=t.index;null!==i&&this.setIndex(i.clone());const s=t.attributes;for(const t in s){const i=s[t];this.setAttribute(t,i.clone(e))}const r=t.morphAttributes;for(const t in r){const i=[],s=r[t];for(let t=0,r=s.length;t0!=t>0&&this.version++,this._alphaTest=t}onBeforeRender(){}onBeforeCompile(){}customProgramCacheKey(){return this.onBeforeCompile.toString()}setValues(t){if(void 0!==t)for(const e in t){const i=t[e];if(void 0===i){as(`Material: parameter '${e}' has value of undefined.`);continue}const s=this[e];void 0!==s?s&&s.isColor?s.set(i):s&&s.isVector3&&i&&i.isVector3?s.copy(i):this[e]=i:as(`Material: '${e}' is not a property of THREE.${this.type}.`)}}toJSON(t){const e=void 0===t||"string"==typeof t;e&&(t={textures:{},images:{}});const i={metadata:{version:4.7,type:"Material",generator:"Material.toJSON"}};function s(t){const e=[];for(const i in t){const s=t[i];delete s.metadata,e.push(s)}return e}if(i.uuid=this.uuid,i.type=this.type,""!==this.name&&(i.name=this.name),this.color&&this.color.isColor&&(i.color=this.color.getHex()),void 0!==this.roughness&&(i.roughness=this.roughness),void 0!==this.metalness&&(i.metalness=this.metalness),void 0!==this.sheen&&(i.sheen=this.sheen),this.sheenColor&&this.sheenColor.isColor&&(i.sheenColor=this.sheenColor.getHex()),void 0!==this.sheenRoughness&&(i.sheenRoughness=this.sheenRoughness),this.emissive&&this.emissive.isColor&&(i.emissive=this.emissive.getHex()),void 0!==this.emissiveIntensity&&1!==this.emissiveIntensity&&(i.emissiveIntensity=this.emissiveIntensity),this.specular&&this.specular.isColor&&(i.specular=this.specular.getHex()),void 0!==this.specularIntensity&&(i.specularIntensity=this.specularIntensity),this.specularColor&&this.specularColor.isColor&&(i.specularColor=this.specularColor.getHex()),void 0!==this.shininess&&(i.shininess=this.shininess),void 0!==this.clearcoat&&(i.clearcoat=this.clearcoat),void 0!==this.clearcoatRoughness&&(i.clearcoatRoughness=this.clearcoatRoughness),this.clearcoatMap&&this.clearcoatMap.isTexture&&(i.clearcoatMap=this.clearcoatMap.toJSON(t).uuid),this.clearcoatRoughnessMap&&this.clearcoatRoughnessMap.isTexture&&(i.clearcoatRoughnessMap=this.clearcoatRoughnessMap.toJSON(t).uuid),this.clearcoatNormalMap&&this.clearcoatNormalMap.isTexture&&(i.clearcoatNormalMap=this.clearcoatNormalMap.toJSON(t).uuid,i.clearcoatNormalScale=this.clearcoatNormalScale.toArray()),this.sheenColorMap&&this.sheenColorMap.isTexture&&(i.sheenColorMap=this.sheenColorMap.toJSON(t).uuid),this.sheenRoughnessMap&&this.sheenRoughnessMap.isTexture&&(i.sheenRoughnessMap=this.sheenRoughnessMap.toJSON(t).uuid),void 0!==this.dispersion&&(i.dispersion=this.dispersion),void 0!==this.iridescence&&(i.iridescence=this.iridescence),void 0!==this.iridescenceIOR&&(i.iridescenceIOR=this.iridescenceIOR),void 0!==this.iridescenceThicknessRange&&(i.iridescenceThicknessRange=this.iridescenceThicknessRange),this.iridescenceMap&&this.iridescenceMap.isTexture&&(i.iridescenceMap=this.iridescenceMap.toJSON(t).uuid),this.iridescenceThicknessMap&&this.iridescenceThicknessMap.isTexture&&(i.iridescenceThicknessMap=this.iridescenceThicknessMap.toJSON(t).uuid),void 0!==this.anisotropy&&(i.anisotropy=this.anisotropy),void 0!==this.anisotropyRotation&&(i.anisotropyRotation=this.anisotropyRotation),this.anisotropyMap&&this.anisotropyMap.isTexture&&(i.anisotropyMap=this.anisotropyMap.toJSON(t).uuid),this.map&&this.map.isTexture&&(i.map=this.map.toJSON(t).uuid),this.matcap&&this.matcap.isTexture&&(i.matcap=this.matcap.toJSON(t).uuid),this.alphaMap&&this.alphaMap.isTexture&&(i.alphaMap=this.alphaMap.toJSON(t).uuid),this.lightMap&&this.lightMap.isTexture&&(i.lightMap=this.lightMap.toJSON(t).uuid,i.lightMapIntensity=this.lightMapIntensity),this.aoMap&&this.aoMap.isTexture&&(i.aoMap=this.aoMap.toJSON(t).uuid,i.aoMapIntensity=this.aoMapIntensity),this.bumpMap&&this.bumpMap.isTexture&&(i.bumpMap=this.bumpMap.toJSON(t).uuid,i.bumpScale=this.bumpScale),this.normalMap&&this.normalMap.isTexture&&(i.normalMap=this.normalMap.toJSON(t).uuid,i.normalMapType=this.normalMapType,i.normalScale=this.normalScale.toArray()),this.displacementMap&&this.displacementMap.isTexture&&(i.displacementMap=this.displacementMap.toJSON(t).uuid,i.displacementScale=this.displacementScale,i.displacementBias=this.displacementBias),this.roughnessMap&&this.roughnessMap.isTexture&&(i.roughnessMap=this.roughnessMap.toJSON(t).uuid),this.metalnessMap&&this.metalnessMap.isTexture&&(i.metalnessMap=this.metalnessMap.toJSON(t).uuid),this.emissiveMap&&this.emissiveMap.isTexture&&(i.emissiveMap=this.emissiveMap.toJSON(t).uuid),this.specularMap&&this.specularMap.isTexture&&(i.specularMap=this.specularMap.toJSON(t).uuid),this.specularIntensityMap&&this.specularIntensityMap.isTexture&&(i.specularIntensityMap=this.specularIntensityMap.toJSON(t).uuid),this.specularColorMap&&this.specularColorMap.isTexture&&(i.specularColorMap=this.specularColorMap.toJSON(t).uuid),this.envMap&&this.envMap.isTexture&&(i.envMap=this.envMap.toJSON(t).uuid,void 0!==this.combine&&(i.combine=this.combine)),void 0!==this.envMapRotation&&(i.envMapRotation=this.envMapRotation.toArray()),void 0!==this.envMapIntensity&&(i.envMapIntensity=this.envMapIntensity),void 0!==this.reflectivity&&(i.reflectivity=this.reflectivity),void 0!==this.refractionRatio&&(i.refractionRatio=this.refractionRatio),this.gradientMap&&this.gradientMap.isTexture&&(i.gradientMap=this.gradientMap.toJSON(t).uuid),void 0!==this.transmission&&(i.transmission=this.transmission),this.transmissionMap&&this.transmissionMap.isTexture&&(i.transmissionMap=this.transmissionMap.toJSON(t).uuid),void 0!==this.thickness&&(i.thickness=this.thickness),this.thicknessMap&&this.thicknessMap.isTexture&&(i.thicknessMap=this.thicknessMap.toJSON(t).uuid),void 0!==this.attenuationDistance&&this.attenuationDistance!==1/0&&(i.attenuationDistance=this.attenuationDistance),void 0!==this.attenuationColor&&(i.attenuationColor=this.attenuationColor.getHex()),void 0!==this.size&&(i.size=this.size),null!==this.shadowSide&&(i.shadowSide=this.shadowSide),void 0!==this.sizeAttenuation&&(i.sizeAttenuation=this.sizeAttenuation),1!==this.blending&&(i.blending=this.blending),0!==this.side&&(i.side=this.side),!0===this.vertexColors&&(i.vertexColors=!0),this.opacity<1&&(i.opacity=this.opacity),!0===this.transparent&&(i.transparent=!0),204!==this.blendSrc&&(i.blendSrc=this.blendSrc),205!==this.blendDst&&(i.blendDst=this.blendDst),100!==this.blendEquation&&(i.blendEquation=this.blendEquation),null!==this.blendSrcAlpha&&(i.blendSrcAlpha=this.blendSrcAlpha),null!==this.blendDstAlpha&&(i.blendDstAlpha=this.blendDstAlpha),null!==this.blendEquationAlpha&&(i.blendEquationAlpha=this.blendEquationAlpha),this.blendColor&&this.blendColor.isColor&&(i.blendColor=this.blendColor.getHex()),0!==this.blendAlpha&&(i.blendAlpha=this.blendAlpha),3!==this.depthFunc&&(i.depthFunc=this.depthFunc),!1===this.depthTest&&(i.depthTest=this.depthTest),!1===this.depthWrite&&(i.depthWrite=this.depthWrite),!1===this.colorWrite&&(i.colorWrite=this.colorWrite),255!==this.stencilWriteMask&&(i.stencilWriteMask=this.stencilWriteMask),519!==this.stencilFunc&&(i.stencilFunc=this.stencilFunc),0!==this.stencilRef&&(i.stencilRef=this.stencilRef),255!==this.stencilFuncMask&&(i.stencilFuncMask=this.stencilFuncMask),this.stencilFail!==li&&(i.stencilFail=this.stencilFail),this.stencilZFail!==li&&(i.stencilZFail=this.stencilZFail),this.stencilZPass!==li&&(i.stencilZPass=this.stencilZPass),!0===this.stencilWrite&&(i.stencilWrite=this.stencilWrite),void 0!==this.rotation&&0!==this.rotation&&(i.rotation=this.rotation),!0===this.polygonOffset&&(i.polygonOffset=!0),0!==this.polygonOffsetFactor&&(i.polygonOffsetFactor=this.polygonOffsetFactor),0!==this.polygonOffsetUnits&&(i.polygonOffsetUnits=this.polygonOffsetUnits),void 0!==this.linewidth&&1!==this.linewidth&&(i.linewidth=this.linewidth),void 0!==this.dashSize&&(i.dashSize=this.dashSize),void 0!==this.gapSize&&(i.gapSize=this.gapSize),void 0!==this.scale&&(i.scale=this.scale),!0===this.dithering&&(i.dithering=!0),this.alphaTest>0&&(i.alphaTest=this.alphaTest),!0===this.alphaHash&&(i.alphaHash=!0),!0===this.alphaToCoverage&&(i.alphaToCoverage=!0),!0===this.premultipliedAlpha&&(i.premultipliedAlpha=!0),!0===this.forceSinglePass&&(i.forceSinglePass=!0),!1===this.allowOverride&&(i.allowOverride=!1),!0===this.wireframe&&(i.wireframe=!0),this.wireframeLinewidth>1&&(i.wireframeLinewidth=this.wireframeLinewidth),"round"!==this.wireframeLinecap&&(i.wireframeLinecap=this.wireframeLinecap),"round"!==this.wireframeLinejoin&&(i.wireframeLinejoin=this.wireframeLinejoin),!0===this.flatShading&&(i.flatShading=!0),!1===this.visible&&(i.visible=!1),!1===this.toneMapped&&(i.toneMapped=!1),!1===this.fog&&(i.fog=!1),Object.keys(this.userData).length>0&&(i.userData=this.userData),e){const e=s(t.textures),r=s(t.images);e.length>0&&(i.textures=e),r.length>0&&(i.images=r)}return i}clone(){return(new this.constructor).copy(this)}copy(t){this.name=t.name,this.blending=t.blending,this.side=t.side,this.vertexColors=t.vertexColors,this.opacity=t.opacity,this.transparent=t.transparent,this.blendSrc=t.blendSrc,this.blendDst=t.blendDst,this.blendEquation=t.blendEquation,this.blendSrcAlpha=t.blendSrcAlpha,this.blendDstAlpha=t.blendDstAlpha,this.blendEquationAlpha=t.blendEquationAlpha,this.blendColor.copy(t.blendColor),this.blendAlpha=t.blendAlpha,this.depthFunc=t.depthFunc,this.depthTest=t.depthTest,this.depthWrite=t.depthWrite,this.stencilWriteMask=t.stencilWriteMask,this.stencilFunc=t.stencilFunc,this.stencilRef=t.stencilRef,this.stencilFuncMask=t.stencilFuncMask,this.stencilFail=t.stencilFail,this.stencilZFail=t.stencilZFail,this.stencilZPass=t.stencilZPass,this.stencilWrite=t.stencilWrite;const e=t.clippingPlanes;let i=null;if(null!==e){const t=e.length;i=new Array(t);for(let s=0;s!==t;++s)i[s]=e[s].clone()}return this.clippingPlanes=i,this.clipIntersection=t.clipIntersection,this.clipShadows=t.clipShadows,this.shadowSide=t.shadowSide,this.colorWrite=t.colorWrite,this.precision=t.precision,this.polygonOffset=t.polygonOffset,this.polygonOffsetFactor=t.polygonOffsetFactor,this.polygonOffsetUnits=t.polygonOffsetUnits,this.dithering=t.dithering,this.alphaTest=t.alphaTest,this.alphaHash=t.alphaHash,this.alphaToCoverage=t.alphaToCoverage,this.premultipliedAlpha=t.premultipliedAlpha,this.forceSinglePass=t.forceSinglePass,this.allowOverride=t.allowOverride,this.visible=t.visible,this.toneMapped=t.toneMapped,this.userData=JSON.parse(JSON.stringify(t.userData)),this}dispose(){this.dispatchEvent({type:"dispose"})}set needsUpdate(t){!0===t&&this.version++}}class Gn extends Zn{constructor(t){super(),this.isSpriteMaterial=!0,this.type="SpriteMaterial",this.color=new Pr(16777215),this.map=null,this.alphaMap=null,this.rotation=0,this.sizeAttenuation=!0,this.transparent=!0,this.fog=!0,this.setValues(t)}copy(t){return super.copy(t),this.color.copy(t.color),this.map=t.map,this.alphaMap=t.alphaMap,this.rotation=t.rotation,this.sizeAttenuation=t.sizeAttenuation,this.fog=t.fog,this}}const $n=new Ts,Qn=new Ts,Kn=new Ts,ta=new _s,ea=new _s,ia=new Qs,sa=new Ts,ra=new Ts,na=new Ts,aa=new _s,oa=new _s,ha=new _s;class la extends Ar{constructor(t=new Gn){if(super(),this.isSprite=!0,this.type="Sprite",void 0===Yn){Yn=new Un;const t=new Float32Array([-.5,-.5,0,0,0,.5,-.5,0,1,0,.5,.5,0,1,1,-.5,.5,0,0,1]),e=new qn(t,5);Yn.setIndex([0,1,2,0,2,3]),Yn.setAttribute("position",new Xn(e,3,0,!1)),Yn.setAttribute("uv",new Xn(e,2,3,!1))}this.geometry=Yn,this.material=t,this.center=new _s(.5,.5),this.count=1}raycast(t,e){null===t.camera&&os('Sprite: "Raycaster.camera" needs to be set in order to raycast against sprites.'),Qn.setFromMatrixScale(this.matrixWorld),ia.copy(t.camera.matrixWorld),this.modelViewMatrix.multiplyMatrices(t.camera.matrixWorldInverse,this.matrixWorld),Kn.setFromMatrixPosition(this.modelViewMatrix),t.camera.isPerspectiveCamera&&!1===this.material.sizeAttenuation&&Qn.multiplyScalar(-Kn.z);const i=this.material.rotation;let s,r;0!==i&&(r=Math.cos(i),s=Math.sin(i));const n=this.center;ca(sa.set(-.5,-.5,0),Kn,n,Qn,s,r),ca(ra.set(.5,-.5,0),Kn,n,Qn,s,r),ca(na.set(.5,.5,0),Kn,n,Qn,s,r),aa.set(0,0),oa.set(1,0),ha.set(1,1);let a=t.ray.intersectTriangle(sa,ra,na,!1,$n);if(null===a&&(ca(ra.set(-.5,.5,0),Kn,n,Qn,s,r),oa.set(0,1),a=t.ray.intersectTriangle(sa,na,ra,!1,$n),null===a))return;const o=t.ray.origin.distanceTo($n);ot.far||e.push({distance:o,point:$n.clone(),uv:$r.getInterpolation($n,sa,ra,na,aa,oa,ha,new _s),face:null,object:this})}copy(t,e){return super.copy(t,e),void 0!==t.center&&this.center.copy(t.center),this.material=t.material,this}}function ca(t,e,i,s,r,n){ta.subVectors(t,i).addScalar(.5).multiply(s),void 0!==r?(ea.x=n*ta.x-r*ta.y,ea.y=r*ta.x+n*ta.y):ea.copy(ta),t.copy(e),t.x+=ea.x,t.y+=ea.y,t.applyMatrix4(ia)}const ua=new Ts,da=new Ts;class pa extends Ar{constructor(){super(),this.isLOD=!0,this._currentLevel=0,this.type="LOD",Object.defineProperties(this,{levels:{enumerable:!0,value:[]}}),this.autoUpdate=!0}copy(t){super.copy(t,!1);const e=t.levels;for(let t=0,i=e.length;t0){let i,s;for(i=1,s=e.length;i0){ua.setFromMatrixPosition(this.matrixWorld);const i=t.ray.origin.distanceTo(ua);this.getObjectForDistance(i).raycast(t,e)}}update(t){const e=this.levels;if(e.length>1){ua.setFromMatrixPosition(t.matrixWorld),da.setFromMatrixPosition(this.matrixWorld);const i=ua.distanceTo(da)/t.zoom;let s,r;for(e[0].object.visible=!0,s=1,r=e.length;s=t))break;e[s-1].object.visible=!1,e[s].object.visible=!0}for(this._currentLevel=s-1;s0)if(c=n*o-a,u=n*a-o,p=r*l,c>=0)if(u>=-p)if(u<=p){const t=1/l;c*=t,u*=t,d=c*(c+n*u+2*a)+u*(n*c+u+2*o)+h}else u=r,c=Math.max(0,-(n*u+a)),d=-c*c+u*(u+2*o)+h;else u=-r,c=Math.max(0,-(n*u+a)),d=-c*c+u*(u+2*o)+h;else u<=-p?(c=Math.max(0,-(-n*r+a)),u=c>0?-r:Math.min(Math.max(-r,-o),r),d=-c*c+u*(u+2*o)+h):u<=p?(c=0,u=Math.min(Math.max(-r,-o),r),d=u*(u+2*o)+h):(c=Math.max(0,-(n*r+a)),u=c>0?r:Math.min(Math.max(-r,-o),r),d=-c*c+u*(u+2*o)+h);else u=n>0?-r:r,c=Math.max(0,-(n*u+a)),d=-c*c+u*(u+2*o)+h;return i&&i.copy(this.origin).addScaledVector(this.direction,c),s&&s.copy(ya).addScaledVector(ga,u),d}intersectSphere(t,e){ma.subVectors(t.center,this.origin);const i=ma.dot(this.direction),s=ma.dot(ma)-i*i,r=t.radius*t.radius;if(s>r)return null;const n=Math.sqrt(r-s),a=i-n,o=i+n;return o<0?null:a<0?this.at(o,e):this.at(a,e)}intersectsSphere(t){return!(t.radius<0)&&this.distanceSqToPoint(t.center)<=t.radius*t.radius}distanceToPlane(t){const e=t.normal.dot(this.direction);if(0===e)return 0===t.distanceToPoint(this.origin)?0:null;const i=-(this.origin.dot(t.normal)+t.constant)/e;return i>=0?i:null}intersectPlane(t,e){const i=this.distanceToPlane(t);return null===i?null:this.at(i,e)}intersectsPlane(t){const e=t.distanceToPoint(this.origin);if(0===e)return!0;return t.normal.dot(this.direction)*e<0}intersectBox(t,e){let i,s,r,n,a,o;const h=1/this.direction.x,l=1/this.direction.y,c=1/this.direction.z,u=this.origin;return h>=0?(i=(t.min.x-u.x)*h,s=(t.max.x-u.x)*h):(i=(t.max.x-u.x)*h,s=(t.min.x-u.x)*h),l>=0?(r=(t.min.y-u.y)*l,n=(t.max.y-u.y)*l):(r=(t.max.y-u.y)*l,n=(t.min.y-u.y)*l),i>n||r>s?null:((r>i||isNaN(i))&&(i=r),(n=0?(a=(t.min.z-u.z)*c,o=(t.max.z-u.z)*c):(a=(t.max.z-u.z)*c,o=(t.min.z-u.z)*c),i>o||a>s?null:((a>i||i!=i)&&(i=a),(o=0?i:s,e)))}intersectsBox(t){return null!==this.intersectBox(t,ma)}intersectTriangle(t,e,i,s,r){xa.subVectors(e,t),ba.subVectors(i,t),va.crossVectors(xa,ba);let n,a=this.direction.dot(va);if(a>0){if(s)return null;n=1}else{if(!(a<0))return null;n=-1,a=-a}fa.subVectors(this.origin,t);const o=n*this.direction.dot(ba.crossVectors(fa,ba));if(o<0)return null;const h=n*this.direction.dot(xa.cross(fa));if(h<0)return null;if(o+h>a)return null;const l=-n*fa.dot(va);return l<0?null:this.at(l/a,r)}applyMatrix4(t){return this.origin.applyMatrix4(t),this.direction.transformDirection(t),this}equals(t){return t.origin.equals(this.origin)&&t.direction.equals(this.direction)}clone(){return(new this.constructor).copy(this)}}class Ma extends Zn{constructor(t){super(),this.isMeshBasicMaterial=!0,this.type="MeshBasicMaterial",this.color=new Pr(16777215),this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.envMapRotation=new hr,this.combine=0,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.fog=!0,this.setValues(t)}copy(t){return super.copy(t),this.color.copy(t.color),this.map=t.map,this.lightMap=t.lightMap,this.lightMapIntensity=t.lightMapIntensity,this.aoMap=t.aoMap,this.aoMapIntensity=t.aoMapIntensity,this.specularMap=t.specularMap,this.alphaMap=t.alphaMap,this.envMap=t.envMap,this.envMapRotation.copy(t.envMapRotation),this.combine=t.combine,this.reflectivity=t.reflectivity,this.refractionRatio=t.refractionRatio,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.wireframeLinecap=t.wireframeLinecap,this.wireframeLinejoin=t.wireframeLinejoin,this.fog=t.fog,this}}const Sa=new Qs,_a=new wa,Aa=new Nn,Ta=new Ts,za=new Ts,Ca=new Ts,Ia=new Ts,Ba=new Ts,ka=new Ts,Oa=new Ts,Pa=new Ts;class Ra extends Ar{constructor(t=new Un,e=new Ma){super(),this.isMesh=!0,this.type="Mesh",this.geometry=t,this.material=e,this.morphTargetDictionary=void 0,this.morphTargetInfluences=void 0,this.count=1,this.updateMorphTargets()}copy(t,e){return super.copy(t,e),void 0!==t.morphTargetInfluences&&(this.morphTargetInfluences=t.morphTargetInfluences.slice()),void 0!==t.morphTargetDictionary&&(this.morphTargetDictionary=Object.assign({},t.morphTargetDictionary)),this.material=Array.isArray(t.material)?t.material.slice():t.material,this.geometry=t.geometry,this}updateMorphTargets(){const t=this.geometry.morphAttributes,e=Object.keys(t);if(e.length>0){const i=t[e[0]];if(void 0!==i){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let t=0,e=i.length;t(t.far-t.near)**2)return}Sa.copy(r).invert(),_a.copy(t.ray).applyMatrix4(Sa),null!==i.boundingBox&&!1===_a.intersectsBox(i.boundingBox)||this._computeIntersections(t,e,_a)}}_computeIntersections(t,e,i){let s;const r=this.geometry,n=this.material,a=r.index,o=r.attributes.position,h=r.attributes.uv,l=r.attributes.uv1,c=r.attributes.normal,u=r.groups,d=r.drawRange;if(null!==a)if(Array.isArray(n))for(let r=0,o=u.length;ri.far?null:{distance:l,point:Pa.clone(),object:t}}(t,e,i,s,za,Ca,Ia,Oa);if(c){const t=new Ts;$r.getBarycoord(Oa,za,Ca,Ia,t),r&&(c.uv=$r.getInterpolatedAttribute(r,o,h,l,t,new _s)),n&&(c.uv1=$r.getInterpolatedAttribute(n,o,h,l,t,new _s)),a&&(c.normal=$r.getInterpolatedAttribute(a,o,h,l,t,new Ts),c.normal.dot(s.direction)>0&&c.normal.multiplyScalar(-1));const e={a:o,b:h,c:l,normal:new Ts,materialIndex:0};$r.getNormal(za,Ca,Ia,e.normal),c.face=e,c.barycoord=t}return c}const Va=new Js,Ea=new Js,Fa=new Js,La=new Js,ja=new Qs,Da=new Ts,Wa=new Nn,Ua=new Qs,qa=new wa;class Ja extends Ra{constructor(t,e){super(t,e),this.isSkinnedMesh=!0,this.type="SkinnedMesh",this.bindMode=at,this.bindMatrix=new Qs,this.bindMatrixInverse=new Qs,this.boundingBox=null,this.boundingSphere=null}computeBoundingBox(){const t=this.geometry;null===this.boundingBox&&(this.boundingBox=new Qr),this.boundingBox.makeEmpty();const e=t.getAttribute("position");for(let t=0;t1?null:e.copy(t.start).addScaledVector(i,r)}intersectsLine(t){const e=this.distanceToPoint(t.start),i=this.distanceToPoint(t.end);return e<0&&i>0||i<0&&e>0}intersectsBox(t){return t.intersectsPlane(this)}intersectsSphere(t){return t.intersectsPlane(this)}coplanarPoint(t){return t.copy(this.normal).multiplyScalar(-this.constant)}applyMatrix4(t,e){const i=e||ho.getNormalMatrix(t),s=this.coplanarPoint(ao).applyMatrix4(t),r=this.normal.applyMatrix3(i).normalize();return this.constant=-s.dot(r),this}translate(t){return this.constant-=t.dot(this.normal),this}equals(t){return t.normal.equals(this.normal)&&t.constant===this.constant}clone(){return(new this.constructor).copy(this)}}const co=new Nn,uo=new _s(.5,.5),po=new Ts;class mo{constructor(t=new lo,e=new lo,i=new lo,s=new lo,r=new lo,n=new lo){this.planes=[t,e,i,s,r,n]}set(t,e,i,s,r,n){const a=this.planes;return a[0].copy(t),a[1].copy(e),a[2].copy(i),a[3].copy(s),a[4].copy(r),a[5].copy(n),this}copy(t){const e=this.planes;for(let i=0;i<6;i++)e[i].copy(t.planes[i]);return this}setFromProjectionMatrix(t,e=2e3,i=!1){const s=this.planes,r=t.elements,n=r[0],a=r[1],o=r[2],h=r[3],l=r[4],c=r[5],u=r[6],d=r[7],p=r[8],m=r[9],y=r[10],g=r[11],f=r[12],x=r[13],b=r[14],v=r[15];if(s[0].setComponents(h-n,d-l,g-p,v-f).normalize(),s[1].setComponents(h+n,d+l,g+p,v+f).normalize(),s[2].setComponents(h+a,d+c,g+m,v+x).normalize(),s[3].setComponents(h-a,d-c,g-m,v-x).normalize(),i)s[4].setComponents(o,u,y,b).normalize(),s[5].setComponents(h-o,d-u,g-y,v-b).normalize();else if(s[4].setComponents(h-o,d-u,g-y,v-b).normalize(),e===Ui)s[5].setComponents(h+o,d+u,g+y,v+b).normalize();else{if(e!==qi)throw new Error("THREE.Frustum.setFromProjectionMatrix(): Invalid coordinate system: "+e);s[5].setComponents(o,u,y,b).normalize()}return this}intersectsObject(t){if(void 0!==t.boundingSphere)null===t.boundingSphere&&t.computeBoundingSphere(),co.copy(t.boundingSphere).applyMatrix4(t.matrixWorld);else{const e=t.geometry;null===e.boundingSphere&&e.computeBoundingSphere(),co.copy(e.boundingSphere).applyMatrix4(t.matrixWorld)}return this.intersectsSphere(co)}intersectsSprite(t){co.center.set(0,0,0);const e=uo.distanceTo(t.center);return co.radius=.7071067811865476+e,co.applyMatrix4(t.matrixWorld),this.intersectsSphere(co)}intersectsSphere(t){const e=this.planes,i=t.center,s=-t.radius;for(let t=0;t<6;t++){if(e[t].distanceToPoint(i)0?t.max.x:t.min.x,po.y=s.normal.y>0?t.max.y:t.min.y,po.z=s.normal.z>0?t.max.z:t.min.z,s.distanceToPoint(po)<0)return!1}return!0}containsPoint(t){const e=this.planes;for(let i=0;i<6;i++)if(e[i].distanceToPoint(t)<0)return!1;return!0}clone(){return(new this.constructor).copy(this)}}const yo=new Qs,go=new mo;class fo{constructor(){this.coordinateSystem=Ui}intersectsObject(t,e){if(!e.isArrayCamera||0===e.cameras.length)return!1;for(let i=0;i=r.length&&r.push({start:-1,count:-1,z:-1,index:-1});const a=r[this.index];n.push(a),this.index++,a.start=t,a.count=e,a.z=i,a.index=s}reset(){this.list.length=0,this.index=0}}const Mo=new Qs,So=new Pr(1,1,1),_o=new mo,Ao=new fo,To=new Qr,zo=new Nn,Co=new Ts,Io=new Ts,Bo=new Ts,ko=new wo,Oo=new Ra,Po=[];function Ro(t,e,i=0){const s=e.itemSize;if(t.isInterleavedBufferAttribute||t.array.constructor!==e.array.constructor){const r=t.count;for(let n=0;n65535?new Uint32Array(s):new Uint16Array(s);e.setIndex(new Mn(t,1))}this._geometryInitialized=!0}}_validateGeometry(t){const e=this.geometry;if(Boolean(t.getIndex())!==Boolean(e.getIndex()))throw new Error('THREE.BatchedMesh: All geometries must consistently have "index".');for(const i in e.attributes){if(!t.hasAttribute(i))throw new Error(`THREE.BatchedMesh: Added geometry missing "${i}". All geometries must have consistent attributes.`);const s=t.getAttribute(i),r=e.getAttribute(i);if(s.itemSize!==r.itemSize||s.normalized!==r.normalized)throw new Error("THREE.BatchedMesh: All attributes must have a consistent itemSize and normalized value.")}}validateInstanceId(t){const e=this._instanceInfo;if(t<0||t>=e.length||!1===e[t].active)throw new Error(`THREE.BatchedMesh: Invalid instanceId ${t}. Instance is either out of range or has been deleted.`)}validateGeometryId(t){const e=this._geometryInfo;if(t<0||t>=e.length||!1===e[t].active)throw new Error(`THREE.BatchedMesh: Invalid geometryId ${t}. Geometry is either out of range or has been deleted.`)}setCustomSort(t){return this.customSort=t,this}computeBoundingBox(){null===this.boundingBox&&(this.boundingBox=new Qr);const t=this.boundingBox,e=this._instanceInfo;t.makeEmpty();for(let i=0,s=e.length;i=this.maxInstanceCount&&0===this._availableInstanceIds.length)throw new Error("THREE.BatchedMesh: Maximum item count reached.");const e={visible:!0,active:!0,geometryIndex:t};let i=null;this._availableInstanceIds.length>0?(this._availableInstanceIds.sort(xo),i=this._availableInstanceIds.shift(),this._instanceInfo[i]=e):(i=this._instanceInfo.length,this._instanceInfo.push(e));const s=this._matricesTexture;Mo.identity().toArray(s.image.data,16*i),s.needsUpdate=!0;const r=this._colorsTexture;return r&&(So.toArray(r.image.data,4*i),r.needsUpdate=!0),this._visibilityChanged=!0,i}addGeometry(t,e=-1,i=-1){this._initializeGeometry(t),this._validateGeometry(t);const s={vertexStart:-1,vertexCount:-1,reservedVertexCount:-1,indexStart:-1,indexCount:-1,reservedIndexCount:-1,start:-1,count:-1,boundingBox:null,boundingSphere:null,active:!0},r=this._geometryInfo;s.vertexStart=this._nextVertexStart,s.reservedVertexCount=-1===e?t.getAttribute("position").count:e;const n=t.getIndex();if(null!==n&&(s.indexStart=this._nextIndexStart,s.reservedIndexCount=-1===i?n.count:i),-1!==s.indexStart&&s.indexStart+s.reservedIndexCount>this._maxIndexCount||s.vertexStart+s.reservedVertexCount>this._maxVertexCount)throw new Error("THREE.BatchedMesh: Reserved space request exceeds the maximum buffer size.");let a;return this._availableGeometryIds.length>0?(this._availableGeometryIds.sort(xo),a=this._availableGeometryIds.shift(),r[a]=s):(a=this._geometryCount,this._geometryCount++,r.push(s)),this.setGeometryAt(a,t),this._nextIndexStart=s.indexStart+s.reservedIndexCount,this._nextVertexStart=s.vertexStart+s.reservedVertexCount,a}setGeometryAt(t,e){if(t>=this._geometryCount)throw new Error("THREE.BatchedMesh: Maximum geometry count reached.");this._validateGeometry(e);const i=this.geometry,s=null!==i.getIndex(),r=i.getIndex(),n=e.getIndex(),a=this._geometryInfo[t];if(s&&n.count>a.reservedIndexCount||e.attributes.position.count>a.reservedVertexCount)throw new Error("THREE.BatchedMesh: Reserved space not large enough for provided geometry.");const o=a.vertexStart,h=a.reservedVertexCount;a.vertexCount=e.getAttribute("position").count;for(const t in i.attributes){const s=e.getAttribute(t),r=i.getAttribute(t);Ro(s,r,o);const n=s.itemSize;for(let t=s.count,e=h;t=e.length||!1===e[t].active)return this;const i=this._instanceInfo;for(let e=0,s=i.length;ee).sort((t,e)=>i[t].vertexStart-i[e].vertexStart),r=this.geometry;for(let n=0,a=i.length;n=this._geometryCount)return null;const i=this.geometry,s=this._geometryInfo[t];if(null===s.boundingBox){const t=new Qr,e=i.index,r=i.attributes.position;for(let i=s.start,n=s.start+s.count;i=this._geometryCount)return null;const i=this.geometry,s=this._geometryInfo[t];if(null===s.boundingSphere){const e=new Nn;this.getBoundingBoxAt(t,To),To.getCenter(e.center);const r=i.index,n=i.attributes.position;let a=0;for(let t=s.start,i=s.start+s.count;tt.active);if(Math.max(...i.map(t=>t.vertexStart+t.reservedVertexCount))>t)throw new Error(`BatchedMesh: Geometry vertex values are being used outside the range ${e}. Cannot shrink further.`);if(this.geometry.index){if(Math.max(...i.map(t=>t.indexStart+t.reservedIndexCount))>e)throw new Error(`BatchedMesh: Geometry index values are being used outside the range ${e}. Cannot shrink further.`)}const s=this.geometry;s.dispose(),this._maxVertexCount=t,this._maxIndexCount=e,this._geometryInitialized&&(this._geometryInitialized=!1,this.geometry=new Un,this._initializeGeometry(s));const r=this.geometry;s.index&&No(s.index.array,r.index.array);for(const t in s.attributes)No(s.attributes[t].array,r.attributes[t].array)}raycast(t,e){const i=this._instanceInfo,s=this._geometryInfo,r=this.matrixWorld,n=this.geometry;Oo.material=this.material,Oo.geometry.index=n.index,Oo.geometry.attributes=n.attributes,null===Oo.geometry.boundingBox&&(Oo.geometry.boundingBox=new Qr),null===Oo.geometry.boundingSphere&&(Oo.geometry.boundingSphere=new Nn);for(let n=0,a=i.length;n({...t,boundingBox:null!==t.boundingBox?t.boundingBox.clone():null,boundingSphere:null!==t.boundingSphere?t.boundingSphere.clone():null})),this._instanceInfo=t._instanceInfo.map(t=>({...t})),this._availableInstanceIds=t._availableInstanceIds.slice(),this._availableGeometryIds=t._availableGeometryIds.slice(),this._nextIndexStart=t._nextIndexStart,this._nextVertexStart=t._nextVertexStart,this._geometryCount=t._geometryCount,this._maxInstanceCount=t._maxInstanceCount,this._maxVertexCount=t._maxVertexCount,this._maxIndexCount=t._maxIndexCount,this._geometryInitialized=t._geometryInitialized,this._multiDrawCounts=t._multiDrawCounts.slice(),this._multiDrawStarts=t._multiDrawStarts.slice(),this._indirectTexture=t._indirectTexture.clone(),this._indirectTexture.image.data=this._indirectTexture.image.data.slice(),this._matricesTexture=t._matricesTexture.clone(),this._matricesTexture.image.data=this._matricesTexture.image.data.slice(),null!==this._colorsTexture&&(this._colorsTexture=t._colorsTexture.clone(),this._colorsTexture.image.data=this._colorsTexture.image.data.slice()),this}dispose(){this.geometry.dispose(),this._matricesTexture.dispose(),this._matricesTexture=null,this._indirectTexture.dispose(),this._indirectTexture=null,null!==this._colorsTexture&&(this._colorsTexture.dispose(),this._colorsTexture=null)}onBeforeRender(t,e,i,s,r){if(!this._visibilityChanged&&!this.perObjectFrustumCulled&&!this.sortObjects)return;const n=s.getIndex();let a=null===n?1:n.array.BYTES_PER_ELEMENT,o=1;r.wireframe&&(o=2,a=s.attributes.position.count>65535?4:2);const h=this._instanceInfo,l=this._multiDrawStarts,c=this._multiDrawCounts,u=this._geometryInfo,d=this.perObjectFrustumCulled,p=this._indirectTexture,m=p.image.data,y=i.isArrayCamera?Ao:_o;d&&!i.isArrayCamera&&(Mo.multiplyMatrices(i.projectionMatrix,i.matrixWorldInverse).multiply(this.matrixWorld),_o.setFromProjectionMatrix(Mo,i.coordinateSystem,i.reversedDepth));let g=0;if(this.sortObjects){Mo.copy(this.matrixWorld).invert(),Co.setFromMatrixPosition(i.matrixWorld).applyMatrix4(Mo),Io.set(0,0,-1).transformDirection(i.matrixWorld).transformDirection(Mo);for(let t=0,e=h.length;t0){const i=t[e[0]];if(void 0!==i){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let t=0,e=i.length;ts)return;Uo.applyMatrix4(t.matrixWorld);const h=e.ray.origin.distanceTo(Uo);return he.far?void 0:{distance:h,point:qo.clone().applyMatrix4(t.matrixWorld),index:a,face:null,faceIndex:null,barycoord:null,object:t}}const Yo=new Ts,Ho=new Ts;class Zo extends Jo{constructor(t,e){super(t,e),this.isLineSegments=!0,this.type="LineSegments"}computeLineDistances(){const t=this.geometry;if(null===t.index){const e=t.attributes.position,i=[];for(let t=0,s=e.count;t0){const i=t[e[0]];if(void 0!==i){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let t=0,e=i.length;tr.far)return;n.push({distance:h,distanceToRay:Math.sqrt(o),point:i,index:e,face:null,faceIndex:null,barycoord:null,object:a})}}class rh extends qs{constructor(t,e,i,s,r=1006,n=1006,a,o,h){super(t,e,i,s,r,n,a,o,h),this.isVideoTexture=!0,this.generateMipmaps=!1,this._requestVideoFrameCallbackId=0;const l=this;"requestVideoFrameCallback"in t&&(this._requestVideoFrameCallbackId=t.requestVideoFrameCallback(function e(){l.needsUpdate=!0,l._requestVideoFrameCallbackId=t.requestVideoFrameCallback(e)}))}clone(){return new this.constructor(this.image).copy(this)}update(){const t=this.image;!1==="requestVideoFrameCallback"in t&&t.readyState>=t.HAVE_CURRENT_DATA&&(this.needsUpdate=!0)}dispose(){0!==this._requestVideoFrameCallbackId&&(this.source.data.cancelVideoFrameCallback(this._requestVideoFrameCallbackId),this._requestVideoFrameCallbackId=0),super.dispose()}}class nh extends rh{constructor(t,e,i,s,r,n,a,o){super({},t,e,i,s,r,n,a,o),this.isVideoFrameTexture=!0}update(){}clone(){return(new this.constructor).copy(this)}setFrame(t){this.image=t,this.needsUpdate=!0}}class ah extends qs{constructor(t,e){super({width:t,height:e}),this.isFramebufferTexture=!0,this.magFilter=ft,this.minFilter=ft,this.generateMipmaps=!1,this.needsUpdate=!0}}class oh extends qs{constructor(t,e,i,s,r,n,a,o,h,l,c,u){super(null,n,a,o,h,l,s,r,c,u),this.isCompressedTexture=!0,this.image={width:e,height:i},this.mipmaps=t,this.flipY=!1,this.generateMipmaps=!1}}class hh extends oh{constructor(t,e,i,s,r,n){super(t,e,i,r,n),this.isCompressedArrayTexture=!0,this.image.depth=s,this.wrapR=yt,this.layerUpdates=new Set}addLayerUpdate(t){this.layerUpdates.add(t)}clearLayerUpdates(){this.layerUpdates.clear()}}class lh extends oh{constructor(t,e,i){super(void 0,t[0].width,t[0].height,e,i,lt),this.isCompressedCubeTexture=!0,this.isCubeTexture=!0,this.image=t}}class ch extends qs{constructor(t=[],e=301,i,s,r,n,a,o,h,l){super(t,e,i,s,r,n,a,o,h,l),this.isCubeTexture=!0,this.flipY=!1}get images(){return this.image}set images(t){this.image=t}}class uh extends qs{constructor(t,e,i,s,r,n,a,o,h){super(t,e,i,s,r,n,a,o,h),this.isCanvasTexture=!0,this.needsUpdate=!0}}class dh extends qs{constructor(t,e,i=1014,s,r,n,a=1003,o=1003,h,l=1026,c=1){if(l!==Ut&&1027!==l)throw new Error("DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat");super({width:t,height:e,depth:c},s,r,n,a,o,l,i,h),this.isDepthTexture=!0,this.flipY=!1,this.generateMipmaps=!1,this.compareFunction=null}copy(t){return super.copy(t),this.source=new js(Object.assign({},t.image)),this.compareFunction=t.compareFunction,this}toJSON(t){const e=super.toJSON(t);return null!==this.compareFunction&&(e.compareFunction=this.compareFunction),e}}class ph extends dh{constructor(t,e=1014,i=301,s,r,n=1003,a=1003,o,h=1026){const l={width:t,height:t,depth:1},c=[l,l,l,l,l,l];super(t,t,e,i,s,r,n,a,o,h),this.image=c,this.isCubeDepthTexture=!0,this.isCubeTexture=!0}get images(){return this.image}set images(t){this.image=t}}class mh extends qs{constructor(t=null){super(),this.sourceTexture=t,this.isExternalTexture=!0}copy(t){return super.copy(t),this.sourceTexture=t.sourceTexture,this}}class yh extends Un{constructor(t=1,e=1,i=1,s=1,r=1,n=1){super(),this.type="BoxGeometry",this.parameters={width:t,height:e,depth:i,widthSegments:s,heightSegments:r,depthSegments:n};const a=this;s=Math.floor(s),r=Math.floor(r),n=Math.floor(n);const o=[],h=[],l=[],c=[];let u=0,d=0;function p(t,e,i,s,r,n,p,m,y,g,f){const x=n/y,b=p/g,v=n/2,w=p/2,M=m/2,S=y+1,_=g+1;let A=0,T=0;const z=new Ts;for(let n=0;n<_;n++){const a=n*b-w;for(let o=0;o0?1:-1,l.push(z.x,z.y,z.z),c.push(o/y),c.push(1-n/g),A+=1}}for(let t=0;t0){const t=(f-1)*m;for(let e=0;e0||0!==s)&&(l.push(n,a,h),x+=3),(e>0||s!==r-1)&&(l.push(a,o,h),x+=3)}h.addGroup(g,x,0),g+=x}(),!1===n&&(t>0&&f(!0),e>0&&f(!1)),this.setIndex(l),this.setAttribute("position",new kn(c,3)),this.setAttribute("normal",new kn(u,3)),this.setAttribute("uv",new kn(d,2))}copy(t){return super.copy(t),this.parameters=Object.assign({},t.parameters),this}static fromJSON(t){return new xh(t.radiusTop,t.radiusBottom,t.height,t.radialSegments,t.heightSegments,t.openEnded,t.thetaStart,t.thetaLength)}}class bh extends xh{constructor(t=1,e=1,i=32,s=1,r=!1,n=0,a=2*Math.PI){super(0,t,e,i,s,r,n,a),this.type="ConeGeometry",this.parameters={radius:t,height:e,radialSegments:i,heightSegments:s,openEnded:r,thetaStart:n,thetaLength:a}}static fromJSON(t){return new bh(t.radius,t.height,t.radialSegments,t.heightSegments,t.openEnded,t.thetaStart,t.thetaLength)}}class vh extends Un{constructor(t=[],e=[],i=1,s=0){super(),this.type="PolyhedronGeometry",this.parameters={vertices:t,indices:e,radius:i,detail:s};const r=[],n=[];function a(t,e,i,s){const r=s+1,n=[];for(let s=0;s<=r;s++){n[s]=[];const a=t.clone().lerp(i,s/r),o=e.clone().lerp(i,s/r),h=r-s;for(let t=0;t<=h;t++)n[s][t]=0===t&&s===r?a:a.clone().lerp(o,t/h)}for(let t=0;t.9&&a<.1&&(e<.2&&(n[t+0]+=1),i<.2&&(n[t+2]+=1),s<.2&&(n[t+4]+=1))}}()}(),this.setAttribute("position",new kn(r,3)),this.setAttribute("normal",new kn(r.slice(),3)),this.setAttribute("uv",new kn(n,2)),0===s?this.computeVertexNormals():this.normalizeNormals()}copy(t){return super.copy(t),this.parameters=Object.assign({},t.parameters),this}static fromJSON(t){return new vh(t.vertices,t.indices,t.radius,t.detail)}}class wh extends vh{constructor(t=1,e=0){const i=(1+Math.sqrt(5))/2,s=1/i;super([-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,0,-s,-i,0,-s,i,0,s,-i,0,s,i,-s,-i,0,-s,i,0,s,-i,0,s,i,0,-i,0,-s,i,0,-s,-i,0,s,i,0,s],[3,11,7,3,7,15,3,15,13,7,19,17,7,17,6,7,6,15,17,4,8,17,8,10,17,10,6,8,0,16,8,16,2,8,2,10,0,12,1,0,1,18,0,18,16,6,10,2,6,2,13,6,13,15,2,16,18,2,18,3,2,3,13,18,1,9,18,9,11,18,11,3,4,14,12,4,12,0,4,0,8,11,9,5,11,5,19,11,19,7,19,5,14,19,14,4,19,4,17,1,12,14,1,14,5,1,5,9],t,e),this.type="DodecahedronGeometry",this.parameters={radius:t,detail:e}}static fromJSON(t){return new wh(t.radius,t.detail)}}const Mh=new Ts,Sh=new Ts,_h=new Ts,Ah=new $r;class Th extends Un{constructor(t=null,e=1){if(super(),this.type="EdgesGeometry",this.parameters={geometry:t,thresholdAngle:e},null!==t){const i=4,s=Math.pow(10,i),r=Math.cos(ys*e),n=t.getIndex(),a=t.getAttribute("position"),o=n?n.count:a.count,h=[0,0,0],l=["a","b","c"],c=new Array(3),u={},d=[];for(let t=0;t0)){h=s;break}h=s-1}if(s=h,i[s]===n)return s/(r-1);const l=i[s];return(s+(n-l)/(i[s+1]-l))/(r-1)}getTangent(t,e){const i=1e-4;let s=t-i,r=t+i;s<0&&(s=0),r>1&&(r=1);const n=this.getPoint(s),a=this.getPoint(r),o=e||(n.isVector2?new _s:new Ts);return o.copy(a).sub(n).normalize(),o}getTangentAt(t,e){const i=this.getUtoTmapping(t);return this.getTangent(i,e)}computeFrenetFrames(t,e=!1){const i=new Ts,s=[],r=[],n=[],a=new Ts,o=new Qs;for(let e=0;e<=t;e++){const i=e/t;s[e]=this.getTangentAt(i,new Ts)}r[0]=new Ts,n[0]=new Ts;let h=Number.MAX_VALUE;const l=Math.abs(s[0].x),c=Math.abs(s[0].y),u=Math.abs(s[0].z);l<=h&&(h=l,i.set(1,0,0)),c<=h&&(h=c,i.set(0,1,0)),u<=h&&i.set(0,0,1),a.crossVectors(s[0],i).normalize(),r[0].crossVectors(s[0],a),n[0].crossVectors(s[0],r[0]);for(let e=1;e<=t;e++){if(r[e]=r[e-1].clone(),n[e]=n[e-1].clone(),a.crossVectors(s[e-1],s[e]),a.length()>Number.EPSILON){a.normalize();const t=Math.acos(xs(s[e-1].dot(s[e]),-1,1));r[e].applyMatrix4(o.makeRotationAxis(a,t))}n[e].crossVectors(s[e],r[e])}if(!0===e){let e=Math.acos(xs(r[0].dot(r[t]),-1,1));e/=t,s[0].dot(a.crossVectors(r[0],r[t]))>0&&(e=-e);for(let i=1;i<=t;i++)r[i].applyMatrix4(o.makeRotationAxis(s[i],e*i)),n[i].crossVectors(s[i],r[i])}return{tangents:s,normals:r,binormals:n}}clone(){return(new this.constructor).copy(this)}copy(t){return this.arcLengthDivisions=t.arcLengthDivisions,this}toJSON(){const t={metadata:{version:4.7,type:"Curve",generator:"Curve.toJSON"}};return t.arcLengthDivisions=this.arcLengthDivisions,t.type=this.type,t}fromJSON(t){return this.arcLengthDivisions=t.arcLengthDivisions,this}}class Ch extends zh{constructor(t=0,e=0,i=1,s=1,r=0,n=2*Math.PI,a=!1,o=0){super(),this.isEllipseCurve=!0,this.type="EllipseCurve",this.aX=t,this.aY=e,this.xRadius=i,this.yRadius=s,this.aStartAngle=r,this.aEndAngle=n,this.aClockwise=a,this.aRotation=o}getPoint(t,e=new _s){const i=e,s=2*Math.PI;let r=this.aEndAngle-this.aStartAngle;const n=Math.abs(r)s;)r-=s;r0?0:(Math.floor(Math.abs(h)/r)+1)*r:0===l&&h===r-1&&(h=r-2,l=1),this.closed||h>0?a=s[(h-1)%r]:(kh.subVectors(s[0],s[1]).add(s[0]),a=kh);const c=s[h%r],u=s[(h+1)%r];if(this.closed||h+2s.length-2?s.length-1:n+1],c=s[n>s.length-3?s.length-1:n+2];return i.set(Vh(a,o.x,h.x,l.x,c.x),Vh(a,o.y,h.y,l.y,c.y)),i}copy(t){super.copy(t),this.points=[];for(let e=0,i=t.points.length;e=i){const t=s[r]-i,n=this.curves[r],a=n.getLength(),o=0===a?0:1-t/a;return n.getPointAt(o,e)}r++}return null}getLength(){const t=this.getCurveLengths();return t[t.length-1]}updateArcLengths(){this.needsUpdate=!0,this.cacheLengths=null,this.getCurveLengths()}getCurveLengths(){if(this.cacheLengths&&this.cacheLengths.length===this.curves.length)return this.cacheLengths;const t=[];let e=0;for(let i=0,s=this.curves.length;i1&&!e[e.length-1].equals(e[0])&&e.push(e[0]),e}copy(t){super.copy(t),this.curves=[];for(let e=0,i=t.curves.length;e0){const t=h.getPoint(0);t.equals(this.currentPoint)||this.lineTo(t.x,t.y)}this.curves.push(h);const l=h.getPoint(1);return this.currentPoint.copy(l),this}copy(t){return super.copy(t),this.currentPoint.copy(t.currentPoint),this}toJSON(){const t=super.toJSON();return t.currentPoint=this.currentPoint.toArray(),t}fromJSON(t){return super.fromJSON(t),this.currentPoint.fromArray(t.currentPoint),this}}class Zh extends Hh{constructor(t){super(t),this.uuid=fs(),this.type="Shape",this.holes=[]}getPointsHoles(t){const e=[];for(let i=0,s=this.holes.length;i80*i){o=t[0],h=t[1];let e=o,s=h;for(let n=i;ne&&(e=i),r>s&&(s=r)}l=Math.max(e-o,s-h),l=0!==l?32767/l:0}return Kh(n,a,i,o,h,l,0),a}function $h(t,e,i,s,r){let n;if(r===function(t,e,i,s){let r=0;for(let n=e,a=i-s;n0)for(let r=e;r=e;r-=s)n=bl(r/s|0,t[r],t[r+1],n);return n&&pl(n,n.next)&&(vl(n),n=n.next),n}function Qh(t,e){if(!t)return t;e||(e=t);let i,s=t;do{if(i=!1,s.steiner||!pl(s,s.next)&&0!==dl(s.prev,s,s.next))s=s.next;else{if(vl(s),s=e=s.prev,s===s.next)break;i=!0}}while(i||s!==e);return e}function Kh(t,e,i,s,r,n,a){if(!t)return;!a&&n&&function(t,e,i,s){let r=t;do{0===r.z&&(r.z=ol(r.x,r.y,e,i,s)),r.prevZ=r.prev,r.nextZ=r.next,r=r.next}while(r!==t);r.prevZ.nextZ=null,r.prevZ=null,function(t){let e,i=1;do{let s,r=t;t=null;let n=null;for(e=0;r;){e++;let a=r,o=0;for(let t=0;t0||h>0&&a;)0!==o&&(0===h||!a||r.z<=a.z)?(s=r,r=r.nextZ,o--):(s=a,a=a.nextZ,h--),n?n.nextZ=s:t=s,s.prevZ=n,n=s;r=a}n.nextZ=null,i*=2}while(e>1)}(r)}(t,s,r,n);let o=t;for(;t.prev!==t.next;){const h=t.prev,l=t.next;if(n?el(t,s,r,n):tl(t))e.push(h.i,t.i,l.i),vl(t),t=l.next,o=l.next;else if((t=l)===o){a?1===a?Kh(t=il(Qh(t),e),e,i,s,r,n,2):2===a&&sl(t,e,i,s,r,n):Kh(Qh(t),e,i,s,r,n,1);break}}}function tl(t){const e=t.prev,i=t,s=t.next;if(dl(e,i,s)>=0)return!1;const r=e.x,n=i.x,a=s.x,o=e.y,h=i.y,l=s.y,c=Math.min(r,n,a),u=Math.min(o,h,l),d=Math.max(r,n,a),p=Math.max(o,h,l);let m=s.next;for(;m!==e;){if(m.x>=c&&m.x<=d&&m.y>=u&&m.y<=p&&cl(r,o,n,h,a,l,m.x,m.y)&&dl(m.prev,m,m.next)>=0)return!1;m=m.next}return!0}function el(t,e,i,s){const r=t.prev,n=t,a=t.next;if(dl(r,n,a)>=0)return!1;const o=r.x,h=n.x,l=a.x,c=r.y,u=n.y,d=a.y,p=Math.min(o,h,l),m=Math.min(c,u,d),y=Math.max(o,h,l),g=Math.max(c,u,d),f=ol(p,m,e,i,s),x=ol(y,g,e,i,s);let b=t.prevZ,v=t.nextZ;for(;b&&b.z>=f&&v&&v.z<=x;){if(b.x>=p&&b.x<=y&&b.y>=m&&b.y<=g&&b!==r&&b!==a&&cl(o,c,h,u,l,d,b.x,b.y)&&dl(b.prev,b,b.next)>=0)return!1;if(b=b.prevZ,v.x>=p&&v.x<=y&&v.y>=m&&v.y<=g&&v!==r&&v!==a&&cl(o,c,h,u,l,d,v.x,v.y)&&dl(v.prev,v,v.next)>=0)return!1;v=v.nextZ}for(;b&&b.z>=f;){if(b.x>=p&&b.x<=y&&b.y>=m&&b.y<=g&&b!==r&&b!==a&&cl(o,c,h,u,l,d,b.x,b.y)&&dl(b.prev,b,b.next)>=0)return!1;b=b.prevZ}for(;v&&v.z<=x;){if(v.x>=p&&v.x<=y&&v.y>=m&&v.y<=g&&v!==r&&v!==a&&cl(o,c,h,u,l,d,v.x,v.y)&&dl(v.prev,v,v.next)>=0)return!1;v=v.nextZ}return!0}function il(t,e){let i=t;do{const s=i.prev,r=i.next.next;!pl(s,r)&&ml(s,i,i.next,r)&&fl(s,r)&&fl(r,s)&&(e.push(s.i,i.i,r.i),vl(i),vl(i.next),i=t=r),i=i.next}while(i!==t);return Qh(i)}function sl(t,e,i,s,r,n){let a=t;do{let t=a.next.next;for(;t!==a.prev;){if(a.i!==t.i&&ul(a,t)){let o=xl(a,t);return a=Qh(a,a.next),o=Qh(o,o.next),Kh(a,e,i,s,r,n,0),void Kh(o,e,i,s,r,n,0)}t=t.next}a=a.next}while(a!==t)}function rl(t,e){let i=t.x-e.x;if(0===i&&(i=t.y-e.y,0===i)){i=(t.next.y-t.y)/(t.next.x-t.x)-(e.next.y-e.y)/(e.next.x-e.x)}return i}function nl(t,e){const i=function(t,e){let i=e;const s=t.x,r=t.y;let n,a=-1/0;if(pl(t,i))return i;do{if(pl(t,i.next))return i.next;if(r<=i.y&&r>=i.next.y&&i.next.y!==i.y){const t=i.x+(r-i.y)*(i.next.x-i.x)/(i.next.y-i.y);if(t<=s&&t>a&&(a=t,n=i.x=i.x&&i.x>=h&&s!==i.x&&ll(rn.x||i.x===n.x&&al(n,i)))&&(n=i,c=e)}i=i.next}while(i!==o);return n}(t,e);if(!i)return e;const s=xl(i,t);return Qh(s,s.next),Qh(i,i.next)}function al(t,e){return dl(t.prev,t,e.prev)<0&&dl(e.next,t,t.next)<0}function ol(t,e,i,s,r){return(t=1431655765&((t=858993459&((t=252645135&((t=16711935&((t=(t-i)*r|0)|t<<8))|t<<4))|t<<2))|t<<1))|(e=1431655765&((e=858993459&((e=252645135&((e=16711935&((e=(e-s)*r|0)|e<<8))|e<<4))|e<<2))|e<<1))<<1}function hl(t){let e=t,i=t;do{(e.x=(t-a)*(n-o)&&(t-a)*(s-o)>=(i-a)*(e-o)&&(i-a)*(n-o)>=(r-a)*(s-o)}function cl(t,e,i,s,r,n,a,o){return!(t===a&&e===o)&&ll(t,e,i,s,r,n,a,o)}function ul(t,e){return t.next.i!==e.i&&t.prev.i!==e.i&&!function(t,e){let i=t;do{if(i.i!==t.i&&i.next.i!==t.i&&i.i!==e.i&&i.next.i!==e.i&&ml(i,i.next,t,e))return!0;i=i.next}while(i!==t);return!1}(t,e)&&(fl(t,e)&&fl(e,t)&&function(t,e){let i=t,s=!1;const r=(t.x+e.x)/2,n=(t.y+e.y)/2;do{i.y>n!=i.next.y>n&&i.next.y!==i.y&&r<(i.next.x-i.x)*(n-i.y)/(i.next.y-i.y)+i.x&&(s=!s),i=i.next}while(i!==t);return s}(t,e)&&(dl(t.prev,t,e.prev)||dl(t,e.prev,e))||pl(t,e)&&dl(t.prev,t,t.next)>0&&dl(e.prev,e,e.next)>0)}function dl(t,e,i){return(e.y-t.y)*(i.x-e.x)-(e.x-t.x)*(i.y-e.y)}function pl(t,e){return t.x===e.x&&t.y===e.y}function ml(t,e,i,s){const r=gl(dl(t,e,i)),n=gl(dl(t,e,s)),a=gl(dl(i,s,t)),o=gl(dl(i,s,e));return r!==n&&a!==o||(!(0!==r||!yl(t,i,e))||(!(0!==n||!yl(t,s,e))||(!(0!==a||!yl(i,t,s))||!(0!==o||!yl(i,e,s)))))}function yl(t,e,i){return e.x<=Math.max(t.x,i.x)&&e.x>=Math.min(t.x,i.x)&&e.y<=Math.max(t.y,i.y)&&e.y>=Math.min(t.y,i.y)}function gl(t){return t>0?1:t<0?-1:0}function fl(t,e){return dl(t.prev,t,t.next)<0?dl(t,e,t.next)>=0&&dl(t,t.prev,e)>=0:dl(t,e,t.prev)<0||dl(t,t.next,e)<0}function xl(t,e){const i=wl(t.i,t.x,t.y),s=wl(e.i,e.x,e.y),r=t.next,n=e.prev;return t.next=e,e.prev=t,i.next=r,r.prev=i,s.next=i,i.prev=s,n.next=s,s.prev=n,s}function bl(t,e,i,s){const r=wl(t,e,i);return s?(r.next=s.next,r.prev=s,s.next.prev=r,s.next=r):(r.prev=r,r.next=r),r}function vl(t){t.next.prev=t.prev,t.prev.next=t.next,t.prevZ&&(t.prevZ.nextZ=t.nextZ),t.nextZ&&(t.nextZ.prevZ=t.prevZ)}function wl(t,e,i){return{i:t,x:e,y:i,prev:null,next:null,z:0,prevZ:null,nextZ:null,steiner:!1}}class Ml{static triangulate(t,e,i=2){return Gh(t,e,i)}}class Sl{static area(t){const e=t.length;let i=0;for(let s=e-1,r=0;r2&&t[e-1].equals(t[0])&&t.pop()}function Al(t,e){for(let i=0;iNumber.EPSILON){const u=Math.sqrt(c),d=Math.sqrt(h*h+l*l),p=e.x-o/u,m=e.y+a/u,y=((i.x-l/d-p)*l-(i.y+h/d-m)*h)/(a*l-o*h);s=p+a*y-t.x,r=m+o*y-t.y;const g=s*s+r*r;if(g<=2)return new _s(s,r);n=Math.sqrt(g/2)}else{let t=!1;a>Number.EPSILON?h>Number.EPSILON&&(t=!0):a<-Number.EPSILON?h<-Number.EPSILON&&(t=!0):Math.sign(o)===Math.sign(l)&&(t=!0),t?(s=-o,r=a,n=Math.sqrt(c)):(s=a,r=o,n=Math.sqrt(c/2))}return new _s(s/n,r/n)}const k=[];for(let t=0,e=z.length,i=e-1,s=t+1;t=0;t--){const e=t/p,i=c*Math.cos(e*Math.PI/2),s=u*Math.sin(e*Math.PI/2)+d;for(let t=0,e=z.length;t=0;){const s=i;let r=i-1;r<0&&(r=t.length-1);for(let t=0,i=o+2*p;t0)&&d.push(e,r,h),(t!==i-1||o0&&(e.defines=this.defines),e.vertexShader=this.vertexShader,e.fragmentShader=this.fragmentShader,e.lights=this.lights,e.clipping=this.clipping;const i={};for(const t in this.extensions)!0===this.extensions[t]&&(i[t]=!0);return Object.keys(i).length>0&&(e.extensions=i),e}}class Hl extends Yl{constructor(t){super(t),this.isRawShaderMaterial=!0,this.type="RawShaderMaterial"}}class Zl extends Zn{constructor(t){super(),this.isMeshStandardMaterial=!0,this.type="MeshStandardMaterial",this.defines={STANDARD:""},this.color=new Pr(16777215),this.roughness=1,this.metalness=0,this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new Pr(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new _s(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.roughnessMap=null,this.metalnessMap=null,this.alphaMap=null,this.envMap=null,this.envMapRotation=new hr,this.envMapIntensity=1,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.flatShading=!1,this.fog=!0,this.setValues(t)}copy(t){return super.copy(t),this.defines={STANDARD:""},this.color.copy(t.color),this.roughness=t.roughness,this.metalness=t.metalness,this.map=t.map,this.lightMap=t.lightMap,this.lightMapIntensity=t.lightMapIntensity,this.aoMap=t.aoMap,this.aoMapIntensity=t.aoMapIntensity,this.emissive.copy(t.emissive),this.emissiveMap=t.emissiveMap,this.emissiveIntensity=t.emissiveIntensity,this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.roughnessMap=t.roughnessMap,this.metalnessMap=t.metalnessMap,this.alphaMap=t.alphaMap,this.envMap=t.envMap,this.envMapRotation.copy(t.envMapRotation),this.envMapIntensity=t.envMapIntensity,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.wireframeLinecap=t.wireframeLinecap,this.wireframeLinejoin=t.wireframeLinejoin,this.flatShading=t.flatShading,this.fog=t.fog,this}}class Gl extends Zl{constructor(t){super(),this.isMeshPhysicalMaterial=!0,this.defines={STANDARD:"",PHYSICAL:""},this.type="MeshPhysicalMaterial",this.anisotropyRotation=0,this.anisotropyMap=null,this.clearcoatMap=null,this.clearcoatRoughness=0,this.clearcoatRoughnessMap=null,this.clearcoatNormalScale=new _s(1,1),this.clearcoatNormalMap=null,this.ior=1.5,Object.defineProperty(this,"reflectivity",{get:function(){return xs(2.5*(this.ior-1)/(this.ior+1),0,1)},set:function(t){this.ior=(1+.4*t)/(1-.4*t)}}),this.iridescenceMap=null,this.iridescenceIOR=1.3,this.iridescenceThicknessRange=[100,400],this.iridescenceThicknessMap=null,this.sheenColor=new Pr(0),this.sheenColorMap=null,this.sheenRoughness=1,this.sheenRoughnessMap=null,this.transmissionMap=null,this.thickness=0,this.thicknessMap=null,this.attenuationDistance=1/0,this.attenuationColor=new Pr(1,1,1),this.specularIntensity=1,this.specularIntensityMap=null,this.specularColor=new Pr(1,1,1),this.specularColorMap=null,this._anisotropy=0,this._clearcoat=0,this._dispersion=0,this._iridescence=0,this._sheen=0,this._transmission=0,this.setValues(t)}get anisotropy(){return this._anisotropy}set anisotropy(t){this._anisotropy>0!=t>0&&this.version++,this._anisotropy=t}get clearcoat(){return this._clearcoat}set clearcoat(t){this._clearcoat>0!=t>0&&this.version++,this._clearcoat=t}get iridescence(){return this._iridescence}set iridescence(t){this._iridescence>0!=t>0&&this.version++,this._iridescence=t}get dispersion(){return this._dispersion}set dispersion(t){this._dispersion>0!=t>0&&this.version++,this._dispersion=t}get sheen(){return this._sheen}set sheen(t){this._sheen>0!=t>0&&this.version++,this._sheen=t}get transmission(){return this._transmission}set transmission(t){this._transmission>0!=t>0&&this.version++,this._transmission=t}copy(t){return super.copy(t),this.defines={STANDARD:"",PHYSICAL:""},this.anisotropy=t.anisotropy,this.anisotropyRotation=t.anisotropyRotation,this.anisotropyMap=t.anisotropyMap,this.clearcoat=t.clearcoat,this.clearcoatMap=t.clearcoatMap,this.clearcoatRoughness=t.clearcoatRoughness,this.clearcoatRoughnessMap=t.clearcoatRoughnessMap,this.clearcoatNormalMap=t.clearcoatNormalMap,this.clearcoatNormalScale.copy(t.clearcoatNormalScale),this.dispersion=t.dispersion,this.ior=t.ior,this.iridescence=t.iridescence,this.iridescenceMap=t.iridescenceMap,this.iridescenceIOR=t.iridescenceIOR,this.iridescenceThicknessRange=[...t.iridescenceThicknessRange],this.iridescenceThicknessMap=t.iridescenceThicknessMap,this.sheen=t.sheen,this.sheenColor.copy(t.sheenColor),this.sheenColorMap=t.sheenColorMap,this.sheenRoughness=t.sheenRoughness,this.sheenRoughnessMap=t.sheenRoughnessMap,this.transmission=t.transmission,this.transmissionMap=t.transmissionMap,this.thickness=t.thickness,this.thicknessMap=t.thicknessMap,this.attenuationDistance=t.attenuationDistance,this.attenuationColor.copy(t.attenuationColor),this.specularIntensity=t.specularIntensity,this.specularIntensityMap=t.specularIntensityMap,this.specularColor.copy(t.specularColor),this.specularColorMap=t.specularColorMap,this}}class $l extends Zn{constructor(t){super(),this.isMeshPhongMaterial=!0,this.type="MeshPhongMaterial",this.color=new Pr(16777215),this.specular=new Pr(1118481),this.shininess=30,this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new Pr(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new _s(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.envMapRotation=new hr,this.combine=0,this.reflectivity=1,this.envMapIntensity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.flatShading=!1,this.fog=!0,this.setValues(t)}copy(t){return super.copy(t),this.color.copy(t.color),this.specular.copy(t.specular),this.shininess=t.shininess,this.map=t.map,this.lightMap=t.lightMap,this.lightMapIntensity=t.lightMapIntensity,this.aoMap=t.aoMap,this.aoMapIntensity=t.aoMapIntensity,this.emissive.copy(t.emissive),this.emissiveMap=t.emissiveMap,this.emissiveIntensity=t.emissiveIntensity,this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.specularMap=t.specularMap,this.alphaMap=t.alphaMap,this.envMap=t.envMap,this.envMapRotation.copy(t.envMapRotation),this.combine=t.combine,this.reflectivity=t.reflectivity,this.envMapIntensity=t.envMapIntensity,this.refractionRatio=t.refractionRatio,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.wireframeLinecap=t.wireframeLinecap,this.wireframeLinejoin=t.wireframeLinejoin,this.flatShading=t.flatShading,this.fog=t.fog,this}}class Ql extends Zn{constructor(t){super(),this.isMeshToonMaterial=!0,this.defines={TOON:""},this.type="MeshToonMaterial",this.color=new Pr(16777215),this.map=null,this.gradientMap=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new Pr(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new _s(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.alphaMap=null,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.fog=!0,this.setValues(t)}copy(t){return super.copy(t),this.color.copy(t.color),this.map=t.map,this.gradientMap=t.gradientMap,this.lightMap=t.lightMap,this.lightMapIntensity=t.lightMapIntensity,this.aoMap=t.aoMap,this.aoMapIntensity=t.aoMapIntensity,this.emissive.copy(t.emissive),this.emissiveMap=t.emissiveMap,this.emissiveIntensity=t.emissiveIntensity,this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.alphaMap=t.alphaMap,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.wireframeLinecap=t.wireframeLinecap,this.wireframeLinejoin=t.wireframeLinejoin,this.fog=t.fog,this}}class Kl extends Zn{constructor(t){super(),this.isMeshNormalMaterial=!0,this.type="MeshNormalMaterial",this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new _s(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.wireframe=!1,this.wireframeLinewidth=1,this.flatShading=!1,this.setValues(t)}copy(t){return super.copy(t),this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.flatShading=t.flatShading,this}}class tc extends Zn{constructor(t){super(),this.isMeshLambertMaterial=!0,this.type="MeshLambertMaterial",this.color=new Pr(16777215),this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new Pr(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new _s(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.envMapRotation=new hr,this.combine=0,this.reflectivity=1,this.envMapIntensity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.flatShading=!1,this.fog=!0,this.setValues(t)}copy(t){return super.copy(t),this.color.copy(t.color),this.map=t.map,this.lightMap=t.lightMap,this.lightMapIntensity=t.lightMapIntensity,this.aoMap=t.aoMap,this.aoMapIntensity=t.aoMapIntensity,this.emissive.copy(t.emissive),this.emissiveMap=t.emissiveMap,this.emissiveIntensity=t.emissiveIntensity,this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.specularMap=t.specularMap,this.alphaMap=t.alphaMap,this.envMap=t.envMap,this.envMapRotation.copy(t.envMapRotation),this.combine=t.combine,this.reflectivity=t.reflectivity,this.envMapIntensity=t.envMapIntensity,this.refractionRatio=t.refractionRatio,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.wireframeLinecap=t.wireframeLinecap,this.wireframeLinejoin=t.wireframeLinejoin,this.flatShading=t.flatShading,this.fog=t.fog,this}}class ec extends Zn{constructor(t){super(),this.isMeshDepthMaterial=!0,this.type="MeshDepthMaterial",this.depthPacking=3200,this.map=null,this.alphaMap=null,this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.wireframe=!1,this.wireframeLinewidth=1,this.setValues(t)}copy(t){return super.copy(t),this.depthPacking=t.depthPacking,this.map=t.map,this.alphaMap=t.alphaMap,this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this}}class ic extends Zn{constructor(t){super(),this.isMeshDistanceMaterial=!0,this.type="MeshDistanceMaterial",this.map=null,this.alphaMap=null,this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.setValues(t)}copy(t){return super.copy(t),this.map=t.map,this.alphaMap=t.alphaMap,this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this}}class sc extends Zn{constructor(t){super(),this.isMeshMatcapMaterial=!0,this.defines={MATCAP:""},this.type="MeshMatcapMaterial",this.color=new Pr(16777215),this.matcap=null,this.map=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new _s(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.alphaMap=null,this.wireframe=!1,this.wireframeLinewidth=1,this.flatShading=!1,this.fog=!0,this.setValues(t)}copy(t){return super.copy(t),this.defines={MATCAP:""},this.color.copy(t.color),this.matcap=t.matcap,this.map=t.map,this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.alphaMap=t.alphaMap,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.flatShading=t.flatShading,this.fog=t.fog,this}}class rc extends Eo{constructor(t){super(),this.isLineDashedMaterial=!0,this.type="LineDashedMaterial",this.scale=1,this.dashSize=3,this.gapSize=1,this.setValues(t)}copy(t){return super.copy(t),this.scale=t.scale,this.dashSize=t.dashSize,this.gapSize=t.gapSize,this}}function nc(t,e){return t&&t.constructor!==e?"number"==typeof e.BYTES_PER_ELEMENT?new e(t):Array.prototype.slice.call(t):t}function ac(t){const e=t.length,i=new Array(e);for(let t=0;t!==e;++t)i[t]=t;return i.sort(function(e,i){return t[e]-t[i]}),i}function oc(t,e,i){const s=t.length,r=new t.constructor(s);for(let n=0,a=0;a!==s;++n){const s=i[n]*e;for(let i=0;i!==e;++i)r[a++]=t[s+i]}return r}function hc(t,e,i,s){let r=1,n=t[0];for(;void 0!==n&&void 0===n[s];)n=t[r++];if(void 0===n)return;let a=n[s];if(void 0!==a)if(Array.isArray(a))do{a=n[s],void 0!==a&&(e.push(n.time),i.push(...a)),n=t[r++]}while(void 0!==n);else if(void 0!==a.toArray)do{a=n[s],void 0!==a&&(e.push(n.time),a.toArray(i,i.length)),n=t[r++]}while(void 0!==n);else do{a=n[s],void 0!==a&&(e.push(n.time),i.push(a)),n=t[r++]}while(void 0!==n)}class lc{static convertArray(t,e){return nc(t,e)}static isTypedArray(t){return $i(t)}static getKeyframeOrder(t){return ac(t)}static sortedArray(t,e,i){return oc(t,e,i)}static flattenJSON(t,e,i,s){hc(t,e,i,s)}static subclip(t,e,i,s,r=30){return function(t,e,i,s,r=30){const n=t.clone();n.name=e;const a=[];for(let t=0;t=s)){h.push(e.times[t]);for(let i=0;in.tracks[t].times[0]&&(o=n.tracks[t].times[0]);for(let t=0;t=s.times[u]){const t=u*h+o,e=t+h-o;d=s.values.slice(t,e)}else{const t=s.createInterpolant(),e=o,i=h-o;t.evaluate(n),d=t.resultBuffer.slice(e,i)}"quaternion"===r&&(new As).fromArray(d).normalize().conjugate().toArray(d);const p=a.times.length;for(let t=0;t=r)){const a=e[1];t=r)break e}n=i,i=0;break i}break t}for(;i>>1;te;)--n;if(++n,0!==r||n!==s){r>=n&&(n=Math.max(n,1),r=n-1);const t=this.getValueSize();this.times=i.slice(r,n),this.values=this.values.slice(r*t,n*t)}return this}validate(){let t=!0;const e=this.getValueSize();e-Math.floor(e)!==0&&(os("KeyframeTrack: Invalid value size in track.",this),t=!1);const i=this.times,s=this.values,r=i.length;0===r&&(os("KeyframeTrack: Track is empty.",this),t=!1);let n=null;for(let e=0;e!==r;e++){const s=i[e];if("number"==typeof s&&isNaN(s)){os("KeyframeTrack: Time is not a valid number.",this,e,s),t=!1;break}if(null!==n&&n>s){os("KeyframeTrack: Out of order keys.",this,e,s,n),t=!1;break}n=s}if(void 0!==s&&$i(s))for(let e=0,i=s.length;e!==i;++e){const i=s[e];if(isNaN(i)){os("KeyframeTrack: Value is not a valid number.",this,e,i),t=!1;break}}return t}optimize(){const t=this.times.slice(),e=this.values.slice(),i=this.getValueSize(),s=this.getInterpolation()===Fe,r=t.length-1;let n=1;for(let a=1;a0){t[n]=t[r];for(let t=r*i,s=n*i,a=0;a!==i;++a)e[s+a]=e[t+a];++n}return n!==t.length?(this.times=t.slice(0,n),this.values=e.slice(0,n*i)):(this.times=t,this.values=e),this}clone(){const t=this.times.slice(),e=this.values.slice(),i=new(0,this.constructor)(this.name,t,e);return i.createInterpolant=this.createInterpolant,i}}yc.prototype.ValueTypeName="",yc.prototype.TimeBufferType=Float32Array,yc.prototype.ValueBufferType=Float32Array,yc.prototype.DefaultInterpolation=Ee;class gc extends yc{constructor(t,e,i){super(t,e,i)}}gc.prototype.ValueTypeName="bool",gc.prototype.ValueBufferType=Array,gc.prototype.DefaultInterpolation=Ve,gc.prototype.InterpolantFactoryMethodLinear=void 0,gc.prototype.InterpolantFactoryMethodSmooth=void 0;class fc extends yc{constructor(t,e,i,s){super(t,e,i,s)}}fc.prototype.ValueTypeName="color";class xc extends yc{constructor(t,e,i,s){super(t,e,i,s)}}xc.prototype.ValueTypeName="number";class bc extends cc{constructor(t,e,i,s){super(t,e,i,s)}interpolate_(t,e,i,s){const r=this.resultBuffer,n=this.sampleValues,a=this.valueSize,o=(i-e)/(s-e);let h=t*a;for(let t=h+a;h!==t;h+=4)As.slerpFlat(r,0,n,h-a,n,h,o);return r}}class vc extends yc{constructor(t,e,i,s){super(t,e,i,s)}InterpolantFactoryMethodLinear(t){return new bc(this.times,this.values,this.getValueSize(),t)}}vc.prototype.ValueTypeName="quaternion",vc.prototype.InterpolantFactoryMethodSmooth=void 0;class wc extends yc{constructor(t,e,i){super(t,e,i)}}wc.prototype.ValueTypeName="string",wc.prototype.ValueBufferType=Array,wc.prototype.DefaultInterpolation=Ve,wc.prototype.InterpolantFactoryMethodLinear=void 0,wc.prototype.InterpolantFactoryMethodSmooth=void 0;class Mc extends yc{constructor(t,e,i,s){super(t,e,i,s)}}Mc.prototype.ValueTypeName="vector";class Sc{constructor(t="",e=-1,i=[],s=2500){this.name=t,this.tracks=i,this.duration=e,this.blendMode=s,this.uuid=fs(),this.userData={},this.duration<0&&this.resetDuration()}static parse(t){const e=[],i=t.tracks,s=1/(t.fps||1);for(let t=0,r=i.length;t!==r;++t)e.push(_c(i[t]).scale(s));const r=new this(t.name,t.duration,e,t.blendMode);return r.uuid=t.uuid,r.userData=JSON.parse(t.userData||"{}"),r}static toJSON(t){const e=[],i=t.tracks,s={name:t.name,duration:t.duration,tracks:e,uuid:t.uuid,blendMode:t.blendMode,userData:JSON.stringify(t.userData)};for(let t=0,s=i.length;t!==s;++t)e.push(yc.toJSON(i[t]));return s}static CreateFromMorphTargetSequence(t,e,i,s){const r=e.length,n=[];for(let t=0;t1){const t=n[1];let e=s[t];e||(s[t]=e=[]),e.push(i)}}const n=[];for(const t in s)n.push(this.CreateFromMorphTargetSequence(t,s[t],e,i));return n}static parseAnimation(t,e){if(as("AnimationClip: parseAnimation() is deprecated and will be removed with r185"),!t)return os("AnimationClip: No animation in JSONLoader data."),null;const i=function(t,e,i,s,r){if(0!==i.length){const n=[],a=[];hc(i,n,a,s),0!==n.length&&r.push(new t(e,n,a))}},s=[],r=t.name||"default",n=t.fps||30,a=t.blendMode;let o=t.length||-1;const h=t.hierarchy||[];for(let t=0;t{e&&e(r),this.manager.itemEnd(t)},0),r;if(void 0!==Bc[t])return void Bc[t].push({onLoad:e,onProgress:i,onError:s});Bc[t]=[],Bc[t].push({onLoad:e,onProgress:i,onError:s});const n=new Request(t,{headers:new Headers(this.requestHeader),credentials:this.withCredentials?"include":"same-origin",signal:"function"==typeof AbortSignal.any?AbortSignal.any([this._abortController.signal,this.manager.abortController.signal]):this._abortController.signal}),a=this.mimeType,o=this.responseType;fetch(n).then(e=>{if(200===e.status||0===e.status){if(0===e.status&&as("FileLoader: HTTP Status 0 received."),"undefined"==typeof ReadableStream||void 0===e.body||void 0===e.body.getReader)return e;const i=Bc[t],s=e.body.getReader(),r=e.headers.get("X-File-Size")||e.headers.get("Content-Length"),n=r?parseInt(r):0,a=0!==n;let o=0;const h=new ReadableStream({start(t){!function e(){s.read().then(({done:s,value:r})=>{if(s)t.close();else{o+=r.byteLength;const s=new ProgressEvent("progress",{lengthComputable:a,loaded:o,total:n});for(let t=0,e=i.length;t{t.error(e)})}()}});return new Response(h)}throw new kc(`fetch for "${e.url}" responded with ${e.status}: ${e.statusText}`,e)}).then(t=>{switch(o){case"arraybuffer":return t.arrayBuffer();case"blob":return t.blob();case"document":return t.text().then(t=>(new DOMParser).parseFromString(t,a));case"json":return t.json();default:if(""===a)return t.text();{const e=/charset="?([^;"\s]*)"?/i.exec(a),i=e&&e[1]?e[1].toLowerCase():void 0,s=new TextDecoder(i);return t.arrayBuffer().then(t=>s.decode(t))}}}).then(e=>{Ac.add(`file:${t}`,e);const i=Bc[t];delete Bc[t];for(let t=0,s=i.length;t{const i=Bc[t];if(void 0===i)throw this.manager.itemError(t),e;delete Bc[t];for(let t=0,s=i.length;t{this.manager.itemEnd(t)}),this.manager.itemStart(t)}setResponseType(t){return this.responseType=t,this}setMimeType(t){return this.mimeType=t,this}abort(){return this._abortController.abort(),this._abortController=new AbortController,this}}class Pc extends Ic{constructor(t){super(t)}load(t,e,i,s){const r=this,n=new Oc(this.manager);n.setPath(this.path),n.setRequestHeader(this.requestHeader),n.setWithCredentials(this.withCredentials),n.load(t,function(i){try{e(r.parse(JSON.parse(i)))}catch(e){s?s(e):os(e),r.manager.itemError(t)}},i,s)}parse(t){const e=[];for(let i=0;i0:s.vertexColors=t.vertexColors),void 0!==t.uniforms)for(const e in t.uniforms){const r=t.uniforms[e];switch(s.uniforms[e]={},r.type){case"t":s.uniforms[e].value=i(r.value);break;case"c":s.uniforms[e].value=(new Pr).setHex(r.value);break;case"v2":s.uniforms[e].value=(new _s).fromArray(r.value);break;case"v3":s.uniforms[e].value=(new Ts).fromArray(r.value);break;case"v4":s.uniforms[e].value=(new Js).fromArray(r.value);break;case"m3":s.uniforms[e].value=(new Is).fromArray(r.value);break;case"m4":s.uniforms[e].value=(new Qs).fromArray(r.value);break;default:s.uniforms[e].value=r.value}}if(void 0!==t.defines&&(s.defines=t.defines),void 0!==t.vertexShader&&(s.vertexShader=t.vertexShader),void 0!==t.fragmentShader&&(s.fragmentShader=t.fragmentShader),void 0!==t.glslVersion&&(s.glslVersion=t.glslVersion),void 0!==t.extensions)for(const e in t.extensions)s.extensions[e]=t.extensions[e];if(void 0!==t.lights&&(s.lights=t.lights),void 0!==t.clipping&&(s.clipping=t.clipping),void 0!==t.size&&(s.size=t.size),void 0!==t.sizeAttenuation&&(s.sizeAttenuation=t.sizeAttenuation),void 0!==t.map&&(s.map=i(t.map)),void 0!==t.matcap&&(s.matcap=i(t.matcap)),void 0!==t.alphaMap&&(s.alphaMap=i(t.alphaMap)),void 0!==t.bumpMap&&(s.bumpMap=i(t.bumpMap)),void 0!==t.bumpScale&&(s.bumpScale=t.bumpScale),void 0!==t.normalMap&&(s.normalMap=i(t.normalMap)),void 0!==t.normalMapType&&(s.normalMapType=t.normalMapType),void 0!==t.normalScale){let e=t.normalScale;!1===Array.isArray(e)&&(e=[e,e]),s.normalScale=(new _s).fromArray(e)}return void 0!==t.displacementMap&&(s.displacementMap=i(t.displacementMap)),void 0!==t.displacementScale&&(s.displacementScale=t.displacementScale),void 0!==t.displacementBias&&(s.displacementBias=t.displacementBias),void 0!==t.roughnessMap&&(s.roughnessMap=i(t.roughnessMap)),void 0!==t.metalnessMap&&(s.metalnessMap=i(t.metalnessMap)),void 0!==t.emissiveMap&&(s.emissiveMap=i(t.emissiveMap)),void 0!==t.emissiveIntensity&&(s.emissiveIntensity=t.emissiveIntensity),void 0!==t.specularMap&&(s.specularMap=i(t.specularMap)),void 0!==t.specularIntensityMap&&(s.specularIntensityMap=i(t.specularIntensityMap)),void 0!==t.specularColorMap&&(s.specularColorMap=i(t.specularColorMap)),void 0!==t.envMap&&(s.envMap=i(t.envMap)),void 0!==t.envMapRotation&&s.envMapRotation.fromArray(t.envMapRotation),void 0!==t.envMapIntensity&&(s.envMapIntensity=t.envMapIntensity),void 0!==t.reflectivity&&(s.reflectivity=t.reflectivity),void 0!==t.refractionRatio&&(s.refractionRatio=t.refractionRatio),void 0!==t.lightMap&&(s.lightMap=i(t.lightMap)),void 0!==t.lightMapIntensity&&(s.lightMapIntensity=t.lightMapIntensity),void 0!==t.aoMap&&(s.aoMap=i(t.aoMap)),void 0!==t.aoMapIntensity&&(s.aoMapIntensity=t.aoMapIntensity),void 0!==t.gradientMap&&(s.gradientMap=i(t.gradientMap)),void 0!==t.clearcoatMap&&(s.clearcoatMap=i(t.clearcoatMap)),void 0!==t.clearcoatRoughnessMap&&(s.clearcoatRoughnessMap=i(t.clearcoatRoughnessMap)),void 0!==t.clearcoatNormalMap&&(s.clearcoatNormalMap=i(t.clearcoatNormalMap)),void 0!==t.clearcoatNormalScale&&(s.clearcoatNormalScale=(new _s).fromArray(t.clearcoatNormalScale)),void 0!==t.iridescenceMap&&(s.iridescenceMap=i(t.iridescenceMap)),void 0!==t.iridescenceThicknessMap&&(s.iridescenceThicknessMap=i(t.iridescenceThicknessMap)),void 0!==t.transmissionMap&&(s.transmissionMap=i(t.transmissionMap)),void 0!==t.thicknessMap&&(s.thicknessMap=i(t.thicknessMap)),void 0!==t.anisotropyMap&&(s.anisotropyMap=i(t.anisotropyMap)),void 0!==t.sheenColorMap&&(s.sheenColorMap=i(t.sheenColorMap)),void 0!==t.sheenRoughnessMap&&(s.sheenRoughnessMap=i(t.sheenRoughnessMap)),s}setTextures(t){return this.textures=t,this}createMaterialFromType(t){return uu.createMaterialFromType(t)}static createMaterialFromType(t){return new{ShadowMaterial:Wl,SpriteMaterial:Gn,RawShaderMaterial:Hl,ShaderMaterial:Yl,PointsMaterial:$o,MeshPhysicalMaterial:Gl,MeshStandardMaterial:Zl,MeshPhongMaterial:$l,MeshToonMaterial:Ql,MeshNormalMaterial:Kl,MeshLambertMaterial:tc,MeshDepthMaterial:ec,MeshDistanceMaterial:ic,MeshBasicMaterial:Ma,MeshMatcapMaterial:sc,LineDashedMaterial:rc,LineBasicMaterial:Eo,Material:Zn}[t]}}class du{static extractUrlBase(t){const e=t.lastIndexOf("/");return-1===e?"./":t.slice(0,e+1)}static resolveURL(t,e){return"string"!=typeof t||""===t?"":(/^https?:\/\//i.test(e)&&/^\//.test(t)&&(e=e.replace(/(^https?:\/\/[^\/]+).*/i,"$1")),/^(https?:)?\/\//i.test(t)||/^data:.*,.*$/i.test(t)||/^blob:.*$/i.test(t)?t:e+t)}}class pu extends Un{constructor(){super(),this.isInstancedBufferGeometry=!0,this.type="InstancedBufferGeometry",this.instanceCount=1/0}copy(t){return super.copy(t),this.instanceCount=t.instanceCount,this}toJSON(){const t=super.toJSON();return t.instanceCount=this.instanceCount,t.isInstancedBufferGeometry=!0,t}}class mu extends Ic{constructor(t){super(t)}load(t,e,i,s){const r=this,n=new Oc(r.manager);n.setPath(r.path),n.setRequestHeader(r.requestHeader),n.setWithCredentials(r.withCredentials),n.load(t,function(i){try{e(r.parse(JSON.parse(i)))}catch(e){s?s(e):os(e),r.manager.itemError(t)}},i,s)}parse(t){const e={},i={};function s(t,s){if(void 0!==e[s])return e[s];const r=t.interleavedBuffers[s],n=function(t,e){if(void 0!==i[e])return i[e];const s=t.arrayBuffers,r=s[e],n=new Uint32Array(r).buffer;return i[e]=n,n}(t,r.buffer),a=Gi(r.type,n),o=new qn(a,r.stride);return o.uuid=r.uuid,e[s]=o,o}const r=t.isInstancedBufferGeometry?new pu:new Un,n=t.data.index;if(void 0!==n){const t=Gi(n.type,n.array);r.setIndex(new Mn(t,1))}const a=t.data.attributes;for(const e in a){const i=a[e];let n;if(i.isInterleavedBufferAttribute){const e=s(t.data,i.data);n=new Xn(e,i.itemSize,i.offset,i.normalized)}else{const t=Gi(i.type,i.array);n=new(i.isInstancedBufferAttribute?$a:Mn)(t,i.itemSize,i.normalized)}void 0!==i.name&&(n.name=i.name),void 0!==i.usage&&n.setUsage(i.usage),r.setAttribute(e,n)}const o=t.data.morphAttributes;if(o)for(const e in o){const i=o[e],n=[];for(let e=0,r=i.length;e0){const i=new zc(e);r=new Vc(i),r.setCrossOrigin(this.crossOrigin);for(let e=0,i=t.length;e0){s=new Vc(this.manager),s.setCrossOrigin(this.crossOrigin);for(let e=0,s=t.length;e{let e=null,i=null;return void 0!==t.boundingBox&&(e=(new Qr).fromJSON(t.boundingBox)),void 0!==t.boundingSphere&&(i=(new Nn).fromJSON(t.boundingSphere)),{...t,boundingBox:e,boundingSphere:i}}),n._instanceInfo=t.instanceInfo,n._availableInstanceIds=t._availableInstanceIds,n._availableGeometryIds=t._availableGeometryIds,n._nextIndexStart=t.nextIndexStart,n._nextVertexStart=t.nextVertexStart,n._geometryCount=t.geometryCount,n._maxInstanceCount=t.maxInstanceCount,n._maxVertexCount=t.maxVertexCount,n._maxIndexCount=t.maxIndexCount,n._geometryInitialized=t.geometryInitialized,n._matricesTexture=c(t.matricesTexture.uuid),n._indirectTexture=c(t.indirectTexture.uuid),void 0!==t.colorsTexture&&(n._colorsTexture=c(t.colorsTexture.uuid)),void 0!==t.boundingSphere&&(n.boundingSphere=(new Nn).fromJSON(t.boundingSphere)),void 0!==t.boundingBox&&(n.boundingBox=(new Qr).fromJSON(t.boundingBox));break;case"LOD":n=new pa;break;case"Line":n=new Jo(h(t.geometry),l(t.material));break;case"LineLoop":n=new Go(h(t.geometry),l(t.material));break;case"LineSegments":n=new Zo(h(t.geometry),l(t.material));break;case"PointCloud":case"Points":n=new ih(h(t.geometry),l(t.material));break;case"Sprite":n=new la(l(t.material));break;case"Group":n=new Tr;break;case"Bone":n=new Xa;break;default:n=new Ar}if(n.uuid=t.uuid,void 0!==t.name&&(n.name=t.name),void 0!==t.matrix?(n.matrix.fromArray(t.matrix),void 0!==t.matrixAutoUpdate&&(n.matrixAutoUpdate=t.matrixAutoUpdate),n.matrixAutoUpdate&&n.matrix.decompose(n.position,n.quaternion,n.scale)):(void 0!==t.position&&n.position.fromArray(t.position),void 0!==t.rotation&&n.rotation.fromArray(t.rotation),void 0!==t.quaternion&&n.quaternion.fromArray(t.quaternion),void 0!==t.scale&&n.scale.fromArray(t.scale)),void 0!==t.up&&n.up.fromArray(t.up),void 0!==t.pivot&&(n.pivot=(new Ts).fromArray(t.pivot)),void 0!==t.morphTargetDictionary&&(n.morphTargetDictionary=Object.assign({},t.morphTargetDictionary)),void 0!==t.morphTargetInfluences&&(n.morphTargetInfluences=t.morphTargetInfluences.slice()),void 0!==t.castShadow&&(n.castShadow=t.castShadow),void 0!==t.receiveShadow&&(n.receiveShadow=t.receiveShadow),t.shadow&&(void 0!==t.shadow.intensity&&(n.shadow.intensity=t.shadow.intensity),void 0!==t.shadow.bias&&(n.shadow.bias=t.shadow.bias),void 0!==t.shadow.normalBias&&(n.shadow.normalBias=t.shadow.normalBias),void 0!==t.shadow.radius&&(n.shadow.radius=t.shadow.radius),void 0!==t.shadow.mapSize&&n.shadow.mapSize.fromArray(t.shadow.mapSize),void 0!==t.shadow.camera&&(n.shadow.camera=this.parseObject(t.shadow.camera))),void 0!==t.visible&&(n.visible=t.visible),void 0!==t.frustumCulled&&(n.frustumCulled=t.frustumCulled),void 0!==t.renderOrder&&(n.renderOrder=t.renderOrder),void 0!==t.static&&(n.static=t.static),void 0!==t.userData&&(n.userData=t.userData),void 0!==t.layers&&(n.layers.mask=t.layers),void 0!==t.children){const a=t.children;for(let t=0;t{if(!0!==bu.has(n))return e&&e(i),r.manager.itemEnd(t),i;s&&s(bu.get(n)),r.manager.itemError(t),r.manager.itemEnd(t)}):(setTimeout(function(){e&&e(n),r.manager.itemEnd(t)},0),n);const a={};a.credentials="anonymous"===this.crossOrigin?"same-origin":"include",a.headers=this.requestHeader,a.signal="function"==typeof AbortSignal.any?AbortSignal.any([this._abortController.signal,this.manager.abortController.signal]):this._abortController.signal;const o=fetch(t,a).then(function(t){return t.blob()}).then(function(t){return createImageBitmap(t,Object.assign(r.options,{colorSpaceConversion:"none"}))}).then(function(i){return Ac.add(`image-bitmap:${t}`,i),e&&e(i),r.manager.itemEnd(t),i}).catch(function(e){s&&s(e),bu.set(o,e),Ac.remove(`image-bitmap:${t}`),r.manager.itemError(t),r.manager.itemEnd(t)});Ac.add(`image-bitmap:${t}`,o),r.manager.itemStart(t)}abort(){return this._abortController.abort(),this._abortController=new AbortController,this}}let wu;class Mu{static getContext(){return void 0===wu&&(wu=new(window.AudioContext||window.webkitAudioContext)),wu}static setContext(t){wu=t}}class Su extends Ic{constructor(t){super(t)}load(t,e,i,s){const r=this,n=new Oc(this.manager);function a(e){s?s(e):os(e),r.manager.itemError(t)}n.setResponseType("arraybuffer"),n.setPath(this.path),n.setRequestHeader(this.requestHeader),n.setWithCredentials(this.withCredentials),n.load(t,function(t){try{const i=t.slice(0);Mu.getContext().decodeAudioData(i,function(t){e(t)}).catch(a)}catch(t){a(t)}},i,s)}}const _u=new Qs,Au=new Qs,Tu=new Qs;class zu{constructor(){this.type="StereoCamera",this.aspect=1,this.eyeSep=.064,this.cameraL=new Kc,this.cameraL.layers.enable(1),this.cameraL.matrixAutoUpdate=!1,this.cameraR=new Kc,this.cameraR.layers.enable(2),this.cameraR.matrixAutoUpdate=!1,this._cache={focus:null,fov:null,aspect:null,near:null,far:null,zoom:null,eyeSep:null}}update(t){const e=this._cache;if(e.focus!==t.focus||e.fov!==t.fov||e.aspect!==t.aspect*this.aspect||e.near!==t.near||e.far!==t.far||e.zoom!==t.zoom||e.eyeSep!==this.eyeSep){e.focus=t.focus,e.fov=t.fov,e.aspect=t.aspect*this.aspect,e.near=t.near,e.far=t.far,e.zoom=t.zoom,e.eyeSep=this.eyeSep,Tu.copy(t.projectionMatrix);const i=e.eyeSep/2,s=i*e.near/e.focus,r=e.near*Math.tan(ys*e.fov*.5)/e.zoom;let n,a;Au.elements[12]=-i,_u.elements[12]=i,n=-r*e.aspect+s,a=r*e.aspect+s,Tu.elements[0]=2*e.near/(a-n),Tu.elements[8]=(a+n)/(a-n),this.cameraL.projectionMatrix.copy(Tu),n=-r*e.aspect-s,a=r*e.aspect-s,Tu.elements[0]=2*e.near/(a-n),Tu.elements[8]=(a+n)/(a-n),this.cameraR.projectionMatrix.copy(Tu)}this.cameraL.matrixWorld.copy(t.matrixWorld).multiply(Au),this.cameraR.matrixWorld.copy(t.matrixWorld).multiply(_u)}}const Cu=-90;class Iu extends Ar{constructor(t,e,i){super(),this.type="CubeCamera",this.renderTarget=i,this.coordinateSystem=null,this.activeMipmapLevel=0;const s=new Kc(Cu,1,t,e);s.layers=this.layers,this.add(s);const r=new Kc(Cu,1,t,e);r.layers=this.layers,this.add(r);const n=new Kc(Cu,1,t,e);n.layers=this.layers,this.add(n);const a=new Kc(Cu,1,t,e);a.layers=this.layers,this.add(a);const o=new Kc(Cu,1,t,e);o.layers=this.layers,this.add(o);const h=new Kc(Cu,1,t,e);h.layers=this.layers,this.add(h)}updateCoordinateSystem(){const t=this.coordinateSystem,e=this.children.concat(),[i,s,r,n,a,o]=e;for(const t of e)this.remove(t);if(t===Ui)i.up.set(0,1,0),i.lookAt(1,0,0),s.up.set(0,1,0),s.lookAt(-1,0,0),r.up.set(0,0,-1),r.lookAt(0,1,0),n.up.set(0,0,1),n.lookAt(0,-1,0),a.up.set(0,1,0),a.lookAt(0,0,1),o.up.set(0,1,0),o.lookAt(0,0,-1);else{if(t!==qi)throw new Error("THREE.CubeCamera.updateCoordinateSystem(): Invalid coordinate system: "+t);i.up.set(0,-1,0),i.lookAt(-1,0,0),s.up.set(0,-1,0),s.lookAt(1,0,0),r.up.set(0,0,1),r.lookAt(0,1,0),n.up.set(0,0,-1),n.lookAt(0,-1,0),a.up.set(0,-1,0),a.lookAt(0,0,1),o.up.set(0,-1,0),o.lookAt(0,0,-1)}for(const t of e)this.add(t),t.updateMatrixWorld()}update(t,e){null===this.parent&&this.updateMatrixWorld();const{renderTarget:i,activeMipmapLevel:s}=this;this.coordinateSystem!==t.coordinateSystem&&(this.coordinateSystem=t.coordinateSystem,this.updateCoordinateSystem());const[r,n,a,o,h,l]=this.children,c=t.getRenderTarget(),u=t.getActiveCubeFace(),d=t.getActiveMipmapLevel(),p=t.xr.enabled;t.xr.enabled=!1;const m=i.texture.generateMipmaps;i.texture.generateMipmaps=!1;let y=!1;y=!0===t.isWebGLRenderer?t.state.buffers.depth.getReversed():t.reversedDepthBuffer,t.setRenderTarget(i,0,s),y&&!1===t.autoClear&&t.clearDepth(),t.render(e,r),t.setRenderTarget(i,1,s),y&&!1===t.autoClear&&t.clearDepth(),t.render(e,n),t.setRenderTarget(i,2,s),y&&!1===t.autoClear&&t.clearDepth(),t.render(e,a),t.setRenderTarget(i,3,s),y&&!1===t.autoClear&&t.clearDepth(),t.render(e,o),t.setRenderTarget(i,4,s),y&&!1===t.autoClear&&t.clearDepth(),t.render(e,h),i.texture.generateMipmaps=m,t.setRenderTarget(i,5,s),y&&!1===t.autoClear&&t.clearDepth(),t.render(e,l),t.setRenderTarget(c,u,d),t.xr.enabled=p,i.texture.needsPMREMUpdate=!0}}class Bu extends Kc{constructor(t=[]){super(),this.isArrayCamera=!0,this.isMultiViewCamera=!1,this.cameras=t}}class ku{constructor(){this._previousTime=0,this._currentTime=0,this._startTime=performance.now(),this._delta=0,this._elapsed=0,this._timescale=1,this._document=null,this._pageVisibilityHandler=null}connect(t){this._document=t,void 0!==t.hidden&&(this._pageVisibilityHandler=Ou.bind(this),t.addEventListener("visibilitychange",this._pageVisibilityHandler,!1))}disconnect(){null!==this._pageVisibilityHandler&&(this._document.removeEventListener("visibilitychange",this._pageVisibilityHandler),this._pageVisibilityHandler=null),this._document=null}getDelta(){return this._delta/1e3}getElapsed(){return this._elapsed/1e3}getTimescale(){return this._timescale}setTimescale(t){return this._timescale=t,this}reset(){return this._currentTime=performance.now()-this._startTime,this}dispose(){this.disconnect()}update(t){return null!==this._pageVisibilityHandler&&!0===this._document.hidden?this._delta=0:(this._previousTime=this._currentTime,this._currentTime=(void 0!==t?t:performance.now())-this._startTime,this._delta=(this._currentTime-this._previousTime)*this._timescale,this._elapsed+=this._delta),this}}function Ou(){!1===this._document.hidden&&this.reset()}const Pu=new Ts,Ru=new As,Nu=new Ts,Vu=new Ts,Eu=new Ts;class Fu extends Ar{constructor(){super(),this.type="AudioListener",this.context=Mu.getContext(),this.gain=this.context.createGain(),this.gain.connect(this.context.destination),this.filter=null,this.timeDelta=0,this._timer=new ku}getInput(){return this.gain}removeFilter(){return null!==this.filter&&(this.gain.disconnect(this.filter),this.filter.disconnect(this.context.destination),this.gain.connect(this.context.destination),this.filter=null),this}getFilter(){return this.filter}setFilter(t){return null!==this.filter?(this.gain.disconnect(this.filter),this.filter.disconnect(this.context.destination)):this.gain.disconnect(this.context.destination),this.filter=t,this.gain.connect(this.filter),this.filter.connect(this.context.destination),this}getMasterVolume(){return this.gain.gain.value}setMasterVolume(t){return this.gain.gain.setTargetAtTime(t,this.context.currentTime,.01),this}updateMatrixWorld(t){super.updateMatrixWorld(t),this._timer.update();const e=this.context.listener;if(this.timeDelta=this._timer.getDelta(),this.matrixWorld.decompose(Pu,Ru,Nu),Vu.set(0,0,-1).applyQuaternion(Ru),Eu.set(0,1,0).applyQuaternion(Ru),e.positionX){const t=this.context.currentTime+this.timeDelta;e.positionX.linearRampToValueAtTime(Pu.x,t),e.positionY.linearRampToValueAtTime(Pu.y,t),e.positionZ.linearRampToValueAtTime(Pu.z,t),e.forwardX.linearRampToValueAtTime(Vu.x,t),e.forwardY.linearRampToValueAtTime(Vu.y,t),e.forwardZ.linearRampToValueAtTime(Vu.z,t),e.upX.linearRampToValueAtTime(Eu.x,t),e.upY.linearRampToValueAtTime(Eu.y,t),e.upZ.linearRampToValueAtTime(Eu.z,t)}else e.setPosition(Pu.x,Pu.y,Pu.z),e.setOrientation(Vu.x,Vu.y,Vu.z,Eu.x,Eu.y,Eu.z)}}class Lu extends Ar{constructor(t){super(),this.type="Audio",this.listener=t,this.context=t.context,this.gain=this.context.createGain(),this.gain.connect(t.getInput()),this.autoplay=!1,this.buffer=null,this.detune=0,this.loop=!1,this.loopStart=0,this.loopEnd=0,this.offset=0,this.duration=void 0,this.playbackRate=1,this.isPlaying=!1,this.hasPlaybackControl=!0,this.source=null,this.sourceType="empty",this._startedAt=0,this._progress=0,this._connected=!1,this.filters=[]}getOutput(){return this.gain}setNodeSource(t){return this.hasPlaybackControl=!1,this.sourceType="audioNode",this.source=t,this.connect(),this}setMediaElementSource(t){return this.hasPlaybackControl=!1,this.sourceType="mediaNode",this.source=this.context.createMediaElementSource(t),this.connect(),this}setMediaStreamSource(t){return this.hasPlaybackControl=!1,this.sourceType="mediaStreamNode",this.source=this.context.createMediaStreamSource(t),this.connect(),this}setBuffer(t){return this.buffer=t,this.sourceType="buffer",this.autoplay&&this.play(),this}play(t=0){if(!0===this.isPlaying)return void as("Audio: Audio is already playing.");if(!1===this.hasPlaybackControl)return void as("Audio: this Audio has no playback control.");this._startedAt=this.context.currentTime+t;const e=this.context.createBufferSource();return e.buffer=this.buffer,e.loop=this.loop,e.loopStart=this.loopStart,e.loopEnd=this.loopEnd,e.onended=this.onEnded.bind(this),e.start(this._startedAt,this._progress+this.offset,this.duration),this.isPlaying=!0,this.source=e,this.setDetune(this.detune),this.setPlaybackRate(this.playbackRate),this.connect()}pause(){if(!1!==this.hasPlaybackControl)return!0===this.isPlaying&&(this._progress+=Math.max(this.context.currentTime-this._startedAt,0)*this.playbackRate,!0===this.loop&&(this._progress=this._progress%(this.duration||this.buffer.duration)),this.source.stop(),this.source.onended=null,this.isPlaying=!1),this;as("Audio: this Audio has no playback control.")}stop(t=0){if(!1!==this.hasPlaybackControl)return this._progress=0,null!==this.source&&(this.source.stop(this.context.currentTime+t),this.source.onended=null),this.isPlaying=!1,this;as("Audio: this Audio has no playback control.")}connect(){if(this.filters.length>0){this.source.connect(this.filters[0]);for(let t=1,e=this.filters.length;t0){this.source.disconnect(this.filters[0]);for(let t=1,e=this.filters.length;t0&&this._mixBufferRegionAdditive(i,s,this._addIndex*e,1,e);for(let t=e,r=e+e;t!==r;++t)if(i[t]!==i[t+e]){a.setValue(i,s);break}}saveOriginalState(){const t=this.binding,e=this.buffer,i=this.valueSize,s=i*this._origIndex;t.getValue(e,s);for(let t=i,r=s;t!==r;++t)e[t]=e[s+t%i];this._setIdentity(),this.cumulativeWeight=0,this.cumulativeWeightAdditive=0}restoreOriginalState(){const t=3*this.valueSize;this.binding.setValue(this.buffer,t)}_setAdditiveIdentityNumeric(){const t=this._addIndex*this.valueSize,e=t+this.valueSize;for(let i=t;i=.5)for(let s=0;s!==r;++s)t[e+s]=t[i+s]}_slerp(t,e,i,s){As.slerpFlat(t,e,t,e,t,i,s)}_slerpAdditive(t,e,i,s,r){const n=this._workIndex*r;As.multiplyQuaternionsFlat(t,n,t,e,t,i),As.slerpFlat(t,e,t,e,t,n,s)}_lerp(t,e,i,s,r){const n=1-s;for(let a=0;a!==r;++a){const r=e+a;t[r]=t[r]*n+t[i+a]*s}}_lerpAdditive(t,e,i,s,r){for(let n=0;n!==r;++n){const r=e+n;t[r]=t[r]+t[i+n]*s}}}const Yu="\\[\\]\\.:\\/",Hu=new RegExp("["+Yu+"]","g"),Zu="[^"+Yu+"]",Gu="[^"+Yu.replace("\\.","")+"]",$u=new RegExp("^"+/((?:WC+[\/:])*)/.source.replace("WC",Zu)+/(WCOD+)?/.source.replace("WCOD",Gu)+/(?:\.(WC+)(?:\[(.+)\])?)?/.source.replace("WC",Zu)+/\.(WC+)(?:\[(.+)\])?/.source.replace("WC",Zu)+"$"),Qu=["material","materials","bones","map"];class Ku{constructor(t,e,i){this.path=e,this.parsedPath=i||Ku.parseTrackName(e),this.node=Ku.findNode(t,this.parsedPath.nodeName),this.rootNode=t,this.getValue=this._getValue_unbound,this.setValue=this._setValue_unbound}static create(t,e,i){return t&&t.isAnimationObjectGroup?new Ku.Composite(t,e,i):new Ku(t,e,i)}static sanitizeNodeName(t){return t.replace(/\s/g,"_").replace(Hu,"")}static parseTrackName(t){const e=$u.exec(t);if(null===e)throw new Error("PropertyBinding: Cannot parse trackName: "+t);const i={nodeName:e[2],objectName:e[3],objectIndex:e[4],propertyName:e[5],propertyIndex:e[6]},s=i.nodeName&&i.nodeName.lastIndexOf(".");if(void 0!==s&&-1!==s){const t=i.nodeName.substring(s+1);-1!==Qu.indexOf(t)&&(i.nodeName=i.nodeName.substring(0,s),i.objectName=t)}if(null===i.propertyName||0===i.propertyName.length)throw new Error("PropertyBinding: can not parse propertyName from trackName: "+t);return i}static findNode(t,e){if(void 0===e||""===e||"."===e||-1===e||e===t.name||e===t.uuid)return t;if(t.skeleton){const i=t.skeleton.getBoneByName(e);if(void 0!==i)return i}if(t.children){const i=function(t){for(let s=0;s=r){const n=r++,l=t[n];e[l.uuid]=h,t[h]=l,e[o]=n,t[n]=a;for(let t=0,e=s;t!==e;++t){const e=i[t],s=e[n],r=e[h];e[h]=s,e[n]=r}}}this.nCachedObjects_=r}uncache(){const t=this._objects,e=this._indicesByUUID,i=this._bindings,s=i.length;let r=this.nCachedObjects_,n=t.length;for(let a=0,o=arguments.length;a!==o;++a){const o=arguments[a].uuid,h=e[o];if(void 0!==h)if(delete e[o],h0&&(e[a.uuid]=h),t[h]=a,t.pop();for(let t=0,e=s;t!==e;++t){const e=i[t];e[h]=e[r],e.pop()}}}this.nCachedObjects_=r}subscribe_(t,e){const i=this._bindingsIndicesByPath;let s=i[t];const r=this._bindings;if(void 0!==s)return r[s];const n=this._paths,a=this._parsedPaths,o=this._objects,h=o.length,l=this.nCachedObjects_,c=new Array(h);s=r.length,i[t]=s,n.push(t),a.push(e),r.push(c);for(let i=l,s=o.length;i!==s;++i){const s=o[i];c[i]=new Ku(s,t,e)}return c}unsubscribe_(t){const e=this._bindingsIndicesByPath,i=e[t];if(void 0!==i){const s=this._paths,r=this._parsedPaths,n=this._bindings,a=n.length-1,o=n[a];e[t[a]]=i,n[i]=o,n.pop(),r[i]=r[a],r.pop(),s[i]=s[a],s.pop()}}}class ed{constructor(t,e,i=null,s=e.blendMode){this._mixer=t,this._clip=e,this._localRoot=i,this.blendMode=s;const r=e.tracks,n=r.length,a=new Array(n),o={endingStart:je,endingEnd:je};for(let t=0;t!==n;++t){const e=r[t].createInterpolant(null);a[t]=e,e.settings&&Object.assign(o,e.settings),e.settings=o}this._interpolantSettings=o,this._interpolants=a,this._propertyBindings=new Array(n),this._cacheIndex=null,this._byClipCacheIndex=null,this._timeScaleInterpolant=null,this._weightInterpolant=null,this.loop=2201,this._loopCount=-1,this._startTime=null,this.time=0,this.timeScale=1,this._effectiveTimeScale=1,this.weight=1,this._effectiveWeight=1,this.repetitions=1/0,this.paused=!1,this.enabled=!0,this.clampWhenFinished=!1,this.zeroSlopeAtStart=!0,this.zeroSlopeAtEnd=!0}play(){return this._mixer._activateAction(this),this}stop(){return this._mixer._deactivateAction(this),this.reset()}reset(){return this.paused=!1,this.enabled=!0,this.time=0,this._loopCount=-1,this._startTime=null,this.stopFading().stopWarping()}isRunning(){return this.enabled&&!this.paused&&0!==this.timeScale&&null===this._startTime&&this._mixer._isActiveAction(this)}isScheduled(){return this._mixer._isActiveAction(this)}startAt(t){return this._startTime=t,this}setLoop(t,e){return this.loop=t,this.repetitions=e,this}setEffectiveWeight(t){return this.weight=t,this._effectiveWeight=this.enabled?t:0,this.stopFading()}getEffectiveWeight(){return this._effectiveWeight}fadeIn(t){return this._scheduleFading(t,0,1)}fadeOut(t){return this._scheduleFading(t,1,0)}crossFadeFrom(t,e,i=!1){if(t.fadeOut(e),this.fadeIn(e),!0===i){const i=this._clip.duration,s=t._clip.duration,r=s/i,n=i/s;t.warp(1,r,e),this.warp(n,1,e)}return this}crossFadeTo(t,e,i=!1){return t.crossFadeFrom(this,e,i)}stopFading(){const t=this._weightInterpolant;return null!==t&&(this._weightInterpolant=null,this._mixer._takeBackControlInterpolant(t)),this}setEffectiveTimeScale(t){return this.timeScale=t,this._effectiveTimeScale=this.paused?0:t,this.stopWarping()}getEffectiveTimeScale(){return this._effectiveTimeScale}setDuration(t){return this.timeScale=this._clip.duration/t,this.stopWarping()}syncWith(t){return this.time=t.time,this.timeScale=t.timeScale,this.stopWarping()}halt(t){return this.warp(this._effectiveTimeScale,0,t)}warp(t,e,i){const s=this._mixer,r=s.time,n=this.timeScale;let a=this._timeScaleInterpolant;null===a&&(a=s._lendControlInterpolant(),this._timeScaleInterpolant=a);const o=a.parameterPositions,h=a.sampleValues;return o[0]=r,o[1]=r+i,h[0]=t/n,h[1]=e/n,this}stopWarping(){const t=this._timeScaleInterpolant;return null!==t&&(this._timeScaleInterpolant=null,this._mixer._takeBackControlInterpolant(t)),this}getMixer(){return this._mixer}getClip(){return this._clip}getRoot(){return this._localRoot||this._mixer._root}_update(t,e,i,s){if(!this.enabled)return void this._updateWeight(t);const r=this._startTime;if(null!==r){const s=(t-r)*i;s<0||0===i?e=0:(this._startTime=null,e=i*s)}e*=this._updateTimeScale(t);const n=this._updateTime(e),a=this._updateWeight(t);if(a>0){const t=this._interpolants,e=this._propertyBindings;if(this.blendMode===qe)for(let i=0,s=t.length;i!==s;++i)t[i].evaluate(n),e[i].accumulateAdditive(a);else for(let i=0,r=t.length;i!==r;++i)t[i].evaluate(n),e[i].accumulate(s,a)}}_updateWeight(t){let e=0;if(this.enabled){e=this.weight;const i=this._weightInterpolant;if(null!==i){const s=i.evaluate(t)[0];e*=s,t>i.parameterPositions[1]&&(this.stopFading(),0===s&&(this.enabled=!1))}}return this._effectiveWeight=e,e}_updateTimeScale(t){let e=0;if(!this.paused){e=this.timeScale;const i=this._timeScaleInterpolant;if(null!==i){e*=i.evaluate(t)[0],t>i.parameterPositions[1]&&(this.stopWarping(),0===e?this.paused=!0:this.timeScale=e)}}return this._effectiveTimeScale=e,e}_updateTime(t){const e=this._clip.duration,i=this.loop;let s=this.time+t,r=this._loopCount;const n=2202===i;if(0===t)return-1===r||!n||1&~r?s:e-s;if(2200===i){-1===r&&(this._loopCount=0,this._setEndings(!0,!0,!1));t:{if(s>=e)s=e;else{if(!(s<0)){this.time=s;break t}s=0}this.clampWhenFinished?this.paused=!0:this.enabled=!1,this.time=s,this._mixer.dispatchEvent({type:"finished",action:this,direction:t<0?-1:1})}}else{if(-1===r&&(t>=0?(r=0,this._setEndings(!0,0===this.repetitions,n)):this._setEndings(0===this.repetitions,!0,n)),s>=e||s<0){const i=Math.floor(s/e);s-=e*i,r+=Math.abs(i);const a=this.repetitions-r;if(a<=0)this.clampWhenFinished?this.paused=!0:this.enabled=!1,s=t>0?e:0,this.time=s,this._mixer.dispatchEvent({type:"finished",action:this,direction:t>0?1:-1});else{if(1===a){const e=t<0;this._setEndings(e,!e,n)}else this._setEndings(!1,!1,n);this._loopCount=r,this.time=s,this._mixer.dispatchEvent({type:"loop",action:this,loopDelta:i})}}else this._loopCount=r,this.time=s;if(n&&!(1&~r))return e-s}return s}_setEndings(t,e,i){const s=this._interpolantSettings;i?(s.endingStart=De,s.endingEnd=De):(s.endingStart=t?this.zeroSlopeAtStart?De:je:We,s.endingEnd=e?this.zeroSlopeAtEnd?De:je:We)}_scheduleFading(t,e,i){const s=this._mixer,r=s.time;let n=this._weightInterpolant;null===n&&(n=s._lendControlInterpolant(),this._weightInterpolant=n);const a=n.parameterPositions,o=n.sampleValues;return a[0]=r,o[0]=e,a[1]=r+t,o[1]=i,this}}const id=new Float32Array(1);class sd extends ds{constructor(t){super(),this._root=t,this._initMemoryManager(),this._accuIndex=0,this.time=0,this.timeScale=1,"undefined"!=typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe",{detail:this}))}_bindAction(t,e){const i=t._localRoot||this._root,s=t._clip.tracks,r=s.length,n=t._propertyBindings,a=t._interpolants,o=i.uuid,h=this._bindingsByRootAndName;let l=h[o];void 0===l&&(l={},h[o]=l);for(let t=0;t!==r;++t){const r=s[t],h=r.name;let c=l[h];if(void 0!==c)++c.referenceCount,n[t]=c;else{if(c=n[t],void 0!==c){null===c._cacheIndex&&(++c.referenceCount,this._addInactiveBinding(c,o,h));continue}const s=e&&e._propertyBindings[t].binding.parsedPath;c=new Xu(Ku.create(i,h,s),r.ValueTypeName,r.getValueSize()),++c.referenceCount,this._addInactiveBinding(c,o,h),n[t]=c}a[t].resultBuffer=c.buffer}}_activateAction(t){if(!this._isActiveAction(t)){if(null===t._cacheIndex){const e=(t._localRoot||this._root).uuid,i=t._clip.uuid,s=this._actionsByClip[i];this._bindAction(t,s&&s.knownActions[0]),this._addInactiveAction(t,i,e)}const e=t._propertyBindings;for(let t=0,i=e.length;t!==i;++t){const i=e[t];0===i.useCount++&&(this._lendBinding(i),i.saveOriginalState())}this._lendAction(t)}}_deactivateAction(t){if(this._isActiveAction(t)){const e=t._propertyBindings;for(let t=0,i=e.length;t!==i;++t){const i=e[t];0===--i.useCount&&(i.restoreOriginalState(),this._takeBackBinding(i))}this._takeBackAction(t)}}_initMemoryManager(){this._actions=[],this._nActiveActions=0,this._actionsByClip={},this._bindings=[],this._nActiveBindings=0,this._bindingsByRootAndName={},this._controlInterpolants=[],this._nActiveControlInterpolants=0;const t=this;this.stats={actions:{get total(){return t._actions.length},get inUse(){return t._nActiveActions}},bindings:{get total(){return t._bindings.length},get inUse(){return t._nActiveBindings}},controlInterpolants:{get total(){return t._controlInterpolants.length},get inUse(){return t._nActiveControlInterpolants}}}}_isActiveAction(t){const e=t._cacheIndex;return null!==e&&e=0;--e)t[e].stop();return this}update(t){t*=this.timeScale;const e=this._actions,i=this._nActiveActions,s=this.time+=t,r=Math.sign(t),n=this._accuIndex^=1;for(let a=0;a!==i;++a){e[a]._update(s,t,r,n)}const a=this._bindings,o=this._nActiveBindings;for(let t=0;t!==o;++t)a[t].apply(n);return this}setTime(t){this.time=0;for(let t=0;t=this.min.x&&t.x<=this.max.x&&t.y>=this.min.y&&t.y<=this.max.y}containsBox(t){return this.min.x<=t.min.x&&t.max.x<=this.max.x&&this.min.y<=t.min.y&&t.max.y<=this.max.y}getParameter(t,e){return e.set((t.x-this.min.x)/(this.max.x-this.min.x),(t.y-this.min.y)/(this.max.y-this.min.y))}intersectsBox(t){return t.max.x>=this.min.x&&t.min.x<=this.max.x&&t.max.y>=this.min.y&&t.min.y<=this.max.y}clampPoint(t,e){return e.copy(t).clamp(this.min,this.max)}distanceToPoint(t){return this.clampPoint(t,xd).distanceTo(t)}intersect(t){return this.min.max(t.min),this.max.min(t.max),this.isEmpty()&&this.makeEmpty(),this}union(t){return this.min.min(t.min),this.max.max(t.max),this}translate(t){return this.min.add(t),this.max.add(t),this}equals(t){return t.min.equals(this.min)&&t.max.equals(this.max)}}const vd=new Ts,wd=new Ts,Md=new Ts,Sd=new Ts,_d=new Ts,Ad=new Ts,Td=new Ts;class zd{constructor(t=new Ts,e=new Ts){this.start=t,this.end=e}set(t,e){return this.start.copy(t),this.end.copy(e),this}copy(t){return this.start.copy(t.start),this.end.copy(t.end),this}getCenter(t){return t.addVectors(this.start,this.end).multiplyScalar(.5)}delta(t){return t.subVectors(this.end,this.start)}distanceSq(){return this.start.distanceToSquared(this.end)}distance(){return this.start.distanceTo(this.end)}at(t,e){return this.delta(e).multiplyScalar(t).add(this.start)}closestPointToPointParameter(t,e){vd.subVectors(t,this.start),wd.subVectors(this.end,this.start);const i=wd.dot(wd);let s=wd.dot(vd)/i;return e&&(s=xs(s,0,1)),s}closestPointToPoint(t,e,i){const s=this.closestPointToPointParameter(t,e);return this.delta(i).multiplyScalar(s).add(this.start)}distanceSqToLine3(t,e=Ad,i=Td){const s=1e-8*1e-8;let r,n;const a=this.start,o=t.start,h=this.end,l=t.end;Md.subVectors(h,a),Sd.subVectors(l,o),_d.subVectors(a,o);const c=Md.dot(Md),u=Sd.dot(Sd),d=Sd.dot(_d);if(c<=s&&u<=s)return e.copy(a),i.copy(o),e.sub(i),e.dot(e);if(c<=s)r=0,n=d/u,n=xs(n,0,1);else{const t=Md.dot(_d);if(u<=s)n=0,r=xs(-t/c,0,1);else{const e=Md.dot(Sd),i=c*u-e*e;r=0!==i?xs((e*d-t*u)/i,0,1):0,n=(e*r+d)/u,n<0?(n=0,r=xs(-t/c,0,1)):n>1&&(n=1,r=xs((e-t)/c,0,1))}}return e.copy(a).addScaledVector(Md,r),i.copy(o).addScaledVector(Sd,n),e.distanceToSquared(i)}applyMatrix4(t){return this.start.applyMatrix4(t),this.end.applyMatrix4(t),this}equals(t){return t.start.equals(this.start)&&t.end.equals(this.end)}clone(){return(new this.constructor).copy(this)}}const Cd=new Ts;class Id extends Ar{constructor(t,e){super(),this.light=t,this.matrixAutoUpdate=!1,this.color=e,this.type="SpotLightHelper";const i=new Un,s=[0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,-1,0,1,0,0,0,0,1,1,0,0,0,0,-1,1];for(let t=0,e=1,i=32;t1)for(let i=0;i.99999)this.quaternion.set(0,0,0,1);else if(t.y<-.99999)this.quaternion.set(1,0,0,0);else{tp.set(t.z,0,-t.x).normalize();const e=Math.acos(t.y);this.quaternion.setFromAxisAngle(tp,e)}}setLength(t,e=.2*t,i=.2*e){this.line.scale.set(1,Math.max(1e-4,t-e),1),this.line.updateMatrix(),this.cone.scale.set(i,e,i),this.cone.position.y=t,this.cone.updateMatrix()}setColor(t){this.line.material.color.set(t),this.cone.material.color.set(t)}copy(t){return super.copy(t,!1),this.line.copy(t.line),this.cone.copy(t.cone),this}dispose(){this.line.geometry.dispose(),this.line.material.dispose(),this.cone.geometry.dispose(),this.cone.material.dispose()}}class rp extends Zo{constructor(t=1){const e=[0,0,0,t,0,0,0,0,0,0,t,0,0,0,0,0,0,t],i=new Un;i.setAttribute("position",new kn(e,3)),i.setAttribute("color",new kn([1,0,0,1,.6,0,0,1,0,.6,1,0,0,0,1,0,.6,1],3));super(i,new Eo({vertexColors:!0,toneMapped:!1})),this.type="AxesHelper"}setColors(t,e,i){const s=new Pr,r=this.geometry.attributes.color.array;return s.set(t),s.toArray(r,0),s.toArray(r,3),s.set(e),s.toArray(r,6),s.toArray(r,9),s.set(i),s.toArray(r,12),s.toArray(r,15),this.geometry.attributes.color.needsUpdate=!0,this}dispose(){this.geometry.dispose(),this.material.dispose()}}class np{constructor(){this.type="ShapePath",this.color=new Pr,this.subPaths=[],this.currentPath=null}moveTo(t,e){return this.currentPath=new Hh,this.subPaths.push(this.currentPath),this.currentPath.moveTo(t,e),this}lineTo(t,e){return this.currentPath.lineTo(t,e),this}quadraticCurveTo(t,e,i,s){return this.currentPath.quadraticCurveTo(t,e,i,s),this}bezierCurveTo(t,e,i,s,r,n){return this.currentPath.bezierCurveTo(t,e,i,s,r,n),this}splineThru(t){return this.currentPath.splineThru(t),this}toShapes(t){function e(t,e){const i=e.length;let s=!1;for(let r=i-1,n=0;nNumber.EPSILON){if(h<0&&(i=e[n],o=-o,a=e[r],h=-h),t.ya.y)continue;if(t.y===i.y){if(t.x===i.x)return!0}else{const e=h*(t.x-i.x)-o*(t.y-i.y);if(0===e)return!0;if(e<0)continue;s=!s}}else{if(t.y!==i.y)continue;if(a.x<=t.x&&t.x<=i.x||i.x<=t.x&&t.x<=a.x)return!0}}return s}const i=Sl.isClockWise,s=this.subPaths;if(0===s.length)return[];let r,n,a;const o=[];if(1===s.length)return n=s[0],a=new Zh,a.curves=n.curves,o.push(a),o;let h=!i(s[0].getPoints());h=t?!h:h;const l=[],c=[];let u,d,p=[],m=0;c[m]=void 0,p[m]=[];for(let e=0,a=s.length;e1){let t=!1,i=0;for(let t=0,e=c.length;t0&&!1===t&&(p=l)}for(let t=0,e=c.length;te?(t.repeat.x=1,t.repeat.y=i/e,t.offset.x=0,t.offset.y=(1-t.repeat.y)/2):(t.repeat.x=e/i,t.repeat.y=1,t.offset.x=(1-t.repeat.x)/2,t.offset.y=0),t}(t,e)}static cover(t,e){return function(t,e){const i=t.image&&t.image.width?t.image.width/t.image.height:1;return i>e?(t.repeat.x=e/i,t.repeat.y=1,t.offset.x=(1-t.repeat.x)/2,t.offset.y=0):(t.repeat.x=1,t.repeat.y=i/e,t.offset.x=0,t.offset.y=(1-t.repeat.y)/2),t}(t,e)}static fill(t){return function(t){return t.repeat.x=1,t.repeat.y=1,t.offset.x=0,t.offset.y=0,t}(t)}static getByteLength(t,e,i,s){return op(t,e,i,s)}}"undefined"!=typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("register",{detail:{revision:t}})),"undefined"!=typeof window&&(window.__THREE__?as("WARNING: Multiple instances of Three.js being imported."):window.__THREE__=t);export{it as ACESFilmicToneMapping,w as AddEquation,$ as AddOperation,qe as AdditiveAnimationBlendMode,g as AdditiveBlending,rt as AgXToneMapping,jt as AlphaFormat,ki as AlwaysCompare,W as AlwaysDepth,Si as AlwaysStencilFunc,ou as AmbientLight,ed as AnimationAction,Sc as AnimationClip,Pc as AnimationLoader,sd as AnimationMixer,td as AnimationObjectGroup,lc as AnimationUtils,Ih as ArcCurve,Bu as ArrayCamera,sp as ArrowHelper,at as AttachedBindMode,Lu as Audio,Ju as AudioAnalyser,Mu as AudioContext,Fu as AudioListener,Su as AudioLoader,rp as AxesHelper,d as BackSide,He as BasicDepthPacking,o as BasicShadowMap,Vo as BatchedMesh,mc as BezierInterpolant,Xa as Bone,gc as BooleanKeyframeTrack,bd as Box2,Qr as Box3,Qd as Box3Helper,yh as BoxGeometry,$d as BoxHelper,Mn as BufferAttribute,Un as BufferGeometry,mu as BufferGeometryLoader,Ct as ByteType,Ac as Cache,Zc as Camera,Hd as CameraHelper,uh as CanvasTexture,gh as CapsuleGeometry,Nh as CatmullRomCurve3,et as CineonToneMapping,fh as CircleGeometry,yt as ClampToEdgeWrapping,md as Clock,Pr as Color,fc as ColorKeyframeTrack,Rs as ColorManagement,Hi as Compatibility,hh as CompressedArrayTexture,lh as CompressedCubeTexture,oh as CompressedTexture,Rc as CompressedTextureLoader,bh as ConeGeometry,L as ConstantAlphaFactor,E as ConstantColorFactor,ap as Controls,Iu as CubeCamera,ph as CubeDepthTexture,lt as CubeReflectionMapping,ct as CubeRefractionMapping,ch as CubeTexture,Ec as CubeTextureLoader,pt as CubeUVReflectionMapping,Lh as CubicBezierCurve,jh as CubicBezierCurve3,uc as CubicInterpolant,r as CullFaceBack,n as CullFaceFront,a as CullFaceFrontBack,s as CullFaceNone,zh as Curve,Yh as CurvePath,b as CustomBlending,st as CustomToneMapping,xh as CylinderGeometry,gd as Cylindrical,Gs as Data3DTexture,Hs as DataArrayTexture,Ya as DataTexture,Fc as DataTextureLoader,xn as DataUtils,di as DecrementStencilOp,mi as DecrementWrapStencilOp,Cc as DefaultLoadingManager,Ut as DepthFormat,qt as DepthStencilFormat,dh as DepthTexture,ot as DetachedBindMode,au as DirectionalLight,Jd as DirectionalLightHelper,pc as DiscreteInterpolant,wh as DodecahedronGeometry,p as DoubleSide,O as DstAlphaFactor,R as DstColorFactor,Li as DynamicCopyUsage,Pi as DynamicDrawUsage,Vi as DynamicReadUsage,Th as EdgesGeometry,Ch as EllipseCurve,Ti as EqualCompare,J as EqualDepth,xi as EqualStencilFunc,ut as EquirectangularReflectionMapping,dt as EquirectangularRefractionMapping,hr as Euler,ds as EventDispatcher,mh as ExternalTexture,Tl as ExtrudeGeometry,Oc as FileLoader,Bn as Float16BufferAttribute,kn as Float32BufferAttribute,Pt as FloatType,Vr as Fog,Nr as FogExp2,ah as FramebufferTexture,u as FrontSide,mo as Frustum,fo as FrustumArray,ld as GLBufferAttribute,Di as GLSL1,Wi as GLSL3,Ci as GreaterCompare,Y as GreaterDepth,Bi as GreaterEqualCompare,X as GreaterEqualDepth,Mi as GreaterEqualStencilFunc,vi as GreaterStencilFunc,jd as GridHelper,Tr as Group,Rt as HalfFloatType,Dc as HemisphereLight,Ld as HemisphereLightHelper,Cl as IcosahedronGeometry,vu as ImageBitmapLoader,Vc as ImageLoader,Fs as ImageUtils,ui as IncrementStencilOp,pi as IncrementWrapStencilOp,$a as InstancedBufferAttribute,pu as InstancedBufferGeometry,hd as InstancedInterleavedBuffer,no as InstancedMesh,Tn as Int16BufferAttribute,Cn as Int32BufferAttribute,Sn as Int8BufferAttribute,kt as IntType,qn as InterleavedBuffer,Xn as InterleavedBufferAttribute,cc as Interpolant,Le as InterpolateBezier,Ve as InterpolateDiscrete,Ee as InterpolateLinear,Fe as InterpolateSmooth,Yi as InterpolationSamplingMode,Xi as InterpolationSamplingType,yi as InvertStencilOp,li as KeepStencilOp,yc as KeyframeTrack,pa as LOD,Il as LatheGeometry,lr as Layers,Ai as LessCompare,U as LessDepth,zi as LessEqualCompare,q as LessEqualDepth,bi as LessEqualStencilFunc,fi as LessStencilFunc,jc as Light,cu as LightProbe,Jo as Line,zd as Line3,Eo as LineBasicMaterial,Dh as LineCurve,Wh as LineCurve3,rc as LineDashedMaterial,Go as LineLoop,Zo as LineSegments,Mt as LinearFilter,dc as LinearInterpolant,Tt as LinearMipMapLinearFilter,_t as LinearMipMapNearestFilter,At as LinearMipmapLinearFilter,St as LinearMipmapNearestFilter,ii as LinearSRGBColorSpace,K as LinearToneMapping,si as LinearTransfer,Ic as Loader,du as LoaderUtils,zc as LoadingManager,Pe as LoopOnce,Ne as LoopPingPong,Re as LoopRepeat,e as MOUSE,Zn as Material,v as MaterialBlending,uu as MaterialLoader,Ss as MathUtils,fd as Matrix2,Is as Matrix3,Qs as Matrix4,A as MaxEquation,Ra as Mesh,Ma as MeshBasicMaterial,ec as MeshDepthMaterial,ic as MeshDistanceMaterial,tc as MeshLambertMaterial,sc as MeshMatcapMaterial,Kl as MeshNormalMaterial,$l as MeshPhongMaterial,Gl as MeshPhysicalMaterial,Zl as MeshStandardMaterial,Ql as MeshToonMaterial,_ as MinEquation,gt as MirroredRepeatWrapping,G as MixOperation,x as MultiplyBlending,Z as MultiplyOperation,ft as NearestFilter,wt as NearestMipMapLinearFilter,bt as NearestMipMapNearestFilter,vt as NearestMipmapLinearFilter,xt as NearestMipmapNearestFilter,nt as NeutralToneMapping,_i as NeverCompare,D as NeverDepth,gi as NeverStencilFunc,m as NoBlending,ti as NoColorSpace,ni as NoNormalPacking,Q as NoToneMapping,Ue as NormalAnimationBlendMode,y as NormalBlending,oi as NormalGAPacking,ai as NormalRGPacking,Ii as NotEqualCompare,H as NotEqualDepth,wi as NotEqualStencilFunc,xc as NumberKeyframeTrack,Ar as Object3D,yu as ObjectLoader,Ke as ObjectSpaceNormalMap,Bl as OctahedronGeometry,z as OneFactor,j as OneMinusConstantAlphaFactor,F as OneMinusConstantColorFactor,P as OneMinusDstAlphaFactor,N as OneMinusDstColorFactor,k as OneMinusSrcAlphaFactor,I as OneMinusSrcColorFactor,ru as OrthographicCamera,h as PCFShadowMap,l as PCFSoftShadowMap,Hh as Path,Kc as PerspectiveCamera,lo as Plane,kl as PlaneGeometry,Kd as PlaneHelper,su as PointLight,Nd as PointLightHelper,ih as Points,$o as PointsMaterial,Dd as PolarGridHelper,vh as PolyhedronGeometry,qu as PositionalAudio,Ku as PropertyBinding,Xu as PropertyMixer,Uh as QuadraticBezierCurve,qh as QuadraticBezierCurve3,As as Quaternion,vc as QuaternionKeyframeTrack,bc as QuaternionLinearInterpolant,he as R11_EAC_Format,gs as RAD2DEG,ke as RED_GREEN_RGTC2_Format,Ie as RED_RGTC1_Format,t as REVISION,ce as RG11_EAC_Format,Ze as RGBADepthPacking,Wt as RGBAFormat,Gt as RGBAIntegerFormat,Se as RGBA_ASTC_10x10_Format,ve as RGBA_ASTC_10x5_Format,we as RGBA_ASTC_10x6_Format,Me as RGBA_ASTC_10x8_Format,_e as RGBA_ASTC_12x10_Format,Ae as RGBA_ASTC_12x12_Format,de as RGBA_ASTC_4x4_Format,pe as RGBA_ASTC_5x4_Format,me as RGBA_ASTC_5x5_Format,ye as RGBA_ASTC_6x5_Format,ge as RGBA_ASTC_6x6_Format,fe as RGBA_ASTC_8x5_Format,xe as RGBA_ASTC_8x6_Format,be as RGBA_ASTC_8x8_Format,Te as RGBA_BPTC_Format,oe as RGBA_ETC2_EAC_Format,re as RGBA_PVRTC_2BPPV1_Format,se as RGBA_PVRTC_4BPPV1_Format,Qt as RGBA_S3TC_DXT1_Format,Kt as RGBA_S3TC_DXT3_Format,te as RGBA_S3TC_DXT5_Format,Ge as RGBDepthPacking,Dt as RGBFormat,Zt as RGBIntegerFormat,ze as RGB_BPTC_SIGNED_Format,Ce as RGB_BPTC_UNSIGNED_Format,ne as RGB_ETC1_Format,ae as RGB_ETC2_Format,ie as RGB_PVRTC_2BPPV1_Format,ee as RGB_PVRTC_4BPPV1_Format,$t as RGB_S3TC_DXT1_Format,$e as RGDepthPacking,Yt as RGFormat,Ht as RGIntegerFormat,Hl as RawShaderMaterial,wa as Ray,ud as Raycaster,hu as RectAreaLight,Jt as RedFormat,Xt as RedIntegerFormat,tt as ReinhardToneMapping,Xs as RenderTarget,rd as RenderTarget3D,mt as RepeatWrapping,ci as ReplaceStencilOp,S as ReverseSubtractEquation,us as ReversedDepthFuncs,Ol as RingGeometry,le as SIGNED_R11_EAC_Format,Oe as SIGNED_RED_GREEN_RGTC2_Format,Be as SIGNED_RED_RGTC1_Format,ue as SIGNED_RG11_EAC_Format,ei as SRGBColorSpace,ri as SRGBTransfer,Er as Scene,Yl as ShaderMaterial,Wl as ShadowMaterial,Zh as Shape,Pl as ShapeGeometry,np as ShapePath,Sl as ShapeUtils,It as ShortType,Ga as Skeleton,Pd as SkeletonHelper,Ja as SkinnedMesh,js as Source,Nn as Sphere,Rl as SphereGeometry,yd as Spherical,lu as SphericalHarmonics3,Jh as SplineCurve,eu as SpotLight,Id as SpotLightHelper,la as Sprite,Gn as SpriteMaterial,B as SrcAlphaFactor,V as SrcAlphaSaturateFactor,C as SrcColorFactor,Fi as StaticCopyUsage,Oi as StaticDrawUsage,Ni as StaticReadUsage,zu as StereoCamera,ji as StreamCopyUsage,Ri as StreamDrawUsage,Ei as StreamReadUsage,wc as StringKeyframeTrack,M as SubtractEquation,f as SubtractiveBlending,i as TOUCH,Qe as TangentSpaceNormalMap,Nl as TetrahedronGeometry,qs as Texture,Lc as TextureLoader,hp as TextureUtils,ku as Timer,Ji as TimestampQuery,Vl as TorusGeometry,El as TorusKnotGeometry,$r as Triangle,Ye as TriangleFanDrawMode,Xe as TriangleStripDrawMode,Je as TrianglesDrawMode,Fl as TubeGeometry,ht as UVMapping,zn as Uint16BufferAttribute,In as Uint32BufferAttribute,_n as Uint8BufferAttribute,An as Uint8ClampedBufferAttribute,nd as Uniform,od as UniformsGroup,Xl as UniformsUtils,zt as UnsignedByteType,Lt as UnsignedInt101111Type,Et as UnsignedInt248Type,Ft as UnsignedInt5999Type,Ot as UnsignedIntType,Nt as UnsignedShort4444Type,Vt as UnsignedShort5551Type,Bt as UnsignedShortType,c as VSMShadowMap,_s as Vector2,Ts as Vector3,Js as Vector4,Mc as VectorKeyframeTrack,nh as VideoFrameTexture,rh as VideoTexture,$s as WebGL3DRenderTarget,Zs as WebGLArrayRenderTarget,Ui as WebGLCoordinateSystem,Ys as WebGLRenderTarget,qi as WebGPUCoordinateSystem,Cr as WebXRController,Ll as WireframeGeometry,We as WrapAroundEnding,je as ZeroCurvatureEnding,T as ZeroFactor,De as ZeroSlopeEnding,hi as ZeroStencilOp,Ul as cloneUniforms,Ki as createCanvasElement,Qi as createElementNS,os as error,op as getByteLength,ss as getConsoleFunction,Jl as getUnlitUniformColorSpace,$i as isTypedArray,rs as log,ql as mergeUniforms,cs as probeAsync,is as setConsoleFunction,as as warn,hs as warnOnce,ls as yieldToMain}; +const t="184dev",e={LEFT:0,MIDDLE:1,RIGHT:2,ROTATE:0,DOLLY:1,PAN:2},i={ROTATE:0,PAN:1,DOLLY_PAN:2,DOLLY_ROTATE:3},s=0,r=1,n=2,a=3,o=0,h=1,l=2,c=3,u=0,d=1,p=2,m=0,y=1,g=2,f=3,x=4,b=5,v=6,w=100,M=101,S=102,_=103,A=104,T=200,z=201,C=202,I=203,B=204,k=205,O=206,P=207,R=208,N=209,V=210,E=211,F=212,L=213,j=214,D=0,W=1,U=2,q=3,J=4,X=5,Y=6,H=7,Z=0,G=1,$=2,Q=0,K=1,tt=2,et=3,it=4,st=5,rt=6,nt=7,at="attached",ot="detached",ht=300,lt=301,ct=302,ut=303,dt=304,pt=306,mt=1e3,yt=1001,gt=1002,ft=1003,xt=1004,bt=1004,vt=1005,wt=1005,Mt=1006,St=1007,_t=1007,At=1008,Tt=1008,zt=1009,Ct=1010,It=1011,Bt=1012,kt=1013,Ot=1014,Pt=1015,Rt=1016,Nt=1017,Vt=1018,Et=1020,Ft=35902,Lt=35899,jt=1021,Dt=1022,Wt=1023,Ut=1026,qt=1027,Jt=1028,Xt=1029,Yt=1030,Ht=1031,Zt=1032,Gt=1033,$t=33776,Qt=33777,Kt=33778,te=33779,ee=35840,ie=35841,se=35842,re=35843,ne=36196,ae=37492,oe=37496,he=37488,le=37489,ce=37490,ue=37491,de=37808,pe=37809,me=37810,ye=37811,ge=37812,fe=37813,xe=37814,be=37815,ve=37816,we=37817,Me=37818,Se=37819,_e=37820,Ae=37821,Te=36492,ze=36494,Ce=36495,Ie=36283,Be=36284,ke=36285,Oe=36286,Pe=2200,Re=2201,Ne=2202,Ve=2300,Ee=2301,Fe=2302,Le=2303,je=2400,De=2401,We=2402,Ue=2500,qe=2501,Je=0,Xe=1,Ye=2,He=3200,Ze=3201,Ge=3202,$e=3203,Qe=0,Ke=1,ti="",ei="srgb",ii="srgb-linear",si="linear",ri="srgb",ni="",ai="rg",oi="ga",hi=0,li=7680,ci=7681,ui=7682,di=7683,pi=34055,mi=34056,yi=5386,gi=512,fi=513,xi=514,bi=515,vi=516,wi=517,Mi=518,Si=519,_i=512,Ai=513,Ti=514,zi=515,Ci=516,Ii=517,Bi=518,ki=519,Oi=35044,Pi=35048,Ri=35040,Ni=35045,Vi=35049,Ei=35041,Fi=35046,Li=35050,ji=35042,Di="100",Wi="300 es",Ui=2e3,qi=2001,Ji={COMPUTE:"compute",RENDER:"render"},Xi={PERSPECTIVE:"perspective",LINEAR:"linear",FLAT:"flat"},Yi={NORMAL:"normal",CENTROID:"centroid",SAMPLE:"sample",FIRST:"first",EITHER:"either"},Hi={TEXTURE_COMPARE:"depthTextureCompare"};const Zi={Int8Array:Int8Array,Uint8Array:Uint8Array,Uint8ClampedArray:Uint8ClampedArray,Int16Array:Int16Array,Uint16Array:Uint16Array,Int32Array:Int32Array,Uint32Array:Uint32Array,Float32Array:Float32Array,Float64Array:Float64Array};function Gi(t,e){return new Zi[t](e)}function $i(t){return ArrayBuffer.isView(t)&&!(t instanceof DataView)}function Qi(t){return document.createElementNS("http://www.w3.org/1999/xhtml",t)}function Ki(){const t=Qi("canvas");return t.style.display="block",t}const ts={};let es=null;function is(t){es=t}function ss(){return es}function rs(...t){const e="THREE."+t.shift();es?es("log",e,...t):console.log(e,...t)}function ns(t){const e=t[0];if("string"==typeof e&&e.startsWith("TSL:")){const e=t[1];e&&e.isStackTrace?t[0]+=" "+e.getLocation():t[1]='Stack trace not available. Enable "THREE.Node.captureStackTrace" to capture stack traces.'}return t}function as(...t){const e="THREE."+(t=ns(t)).shift();if(es)es("warn",e,...t);else{const i=t[0];i&&i.isStackTrace?console.warn(i.getError(e)):console.warn(e,...t)}}function os(...t){const e="THREE."+(t=ns(t)).shift();if(es)es("error",e,...t);else{const i=t[0];i&&i.isStackTrace?console.error(i.getError(e)):console.error(e,...t)}}function hs(...t){const e=t.join(" ");e in ts||(ts[e]=!0,as(...t))}function ls(){return"undefined"!=typeof self&&void 0!==self.scheduler&&void 0!==self.scheduler.yield?self.scheduler.yield():new Promise(t=>{requestAnimationFrame(t)})}function cs(t,e,i){return new Promise(function(s,r){setTimeout(function n(){switch(t.clientWaitSync(e,t.SYNC_FLUSH_COMMANDS_BIT,0)){case t.WAIT_FAILED:r();break;case t.TIMEOUT_EXPIRED:setTimeout(n,i);break;default:s()}},i)})}const us={[D]:1,[U]:6,[J]:7,[q]:5,[W]:0,[Y]:2,[H]:4,[X]:3};class ds{addEventListener(t,e){void 0===this._listeners&&(this._listeners={});const i=this._listeners;void 0===i[t]&&(i[t]=[]),-1===i[t].indexOf(e)&&i[t].push(e)}hasEventListener(t,e){const i=this._listeners;return void 0!==i&&(void 0!==i[t]&&-1!==i[t].indexOf(e))}removeEventListener(t,e){const i=this._listeners;if(void 0===i)return;const s=i[t];if(void 0!==s){const t=s.indexOf(e);-1!==t&&s.splice(t,1)}}dispatchEvent(t){const e=this._listeners;if(void 0===e)return;const i=e[t.type];if(void 0!==i){t.target=this;const e=i.slice(0);for(let i=0,s=e.length;i>8&255]+ps[t>>16&255]+ps[t>>24&255]+"-"+ps[255&e]+ps[e>>8&255]+"-"+ps[e>>16&15|64]+ps[e>>24&255]+"-"+ps[63&i|128]+ps[i>>8&255]+"-"+ps[i>>16&255]+ps[i>>24&255]+ps[255&s]+ps[s>>8&255]+ps[s>>16&255]+ps[s>>24&255]).toLowerCase()}function xs(t,e,i){return Math.max(e,Math.min(i,t))}function bs(t,e){return(t%e+e)%e}function vs(t,e,i){return(1-i)*t+i*e}function ws(t,e){switch(e.constructor){case Float32Array:return t;case Uint32Array:return t/4294967295;case Uint16Array:return t/65535;case Uint8Array:return t/255;case Int32Array:return Math.max(t/2147483647,-1);case Int16Array:return Math.max(t/32767,-1);case Int8Array:return Math.max(t/127,-1);default:throw new Error("Invalid component type.")}}function Ms(t,e){switch(e.constructor){case Float32Array:return t;case Uint32Array:return Math.round(4294967295*t);case Uint16Array:return Math.round(65535*t);case Uint8Array:return Math.round(255*t);case Int32Array:return Math.round(2147483647*t);case Int16Array:return Math.round(32767*t);case Int8Array:return Math.round(127*t);default:throw new Error("Invalid component type.")}}const Ss={DEG2RAD:ys,RAD2DEG:gs,generateUUID:fs,clamp:xs,euclideanModulo:bs,mapLinear:function(t,e,i,s,r){return s+(t-e)*(r-s)/(i-e)},inverseLerp:function(t,e,i){return t!==e?(i-t)/(e-t):0},lerp:vs,damp:function(t,e,i,s){return vs(t,e,1-Math.exp(-i*s))},pingpong:function(t,e=1){return e-Math.abs(bs(t,2*e)-e)},smoothstep:function(t,e,i){return t<=e?0:t>=i?1:(t=(t-e)/(i-e))*t*(3-2*t)},smootherstep:function(t,e,i){return t<=e?0:t>=i?1:(t=(t-e)/(i-e))*t*t*(t*(6*t-15)+10)},randInt:function(t,e){return t+Math.floor(Math.random()*(e-t+1))},randFloat:function(t,e){return t+Math.random()*(e-t)},randFloatSpread:function(t){return t*(.5-Math.random())},seededRandom:function(t){void 0!==t&&(ms=t);let e=ms+=1831565813;return e=Math.imul(e^e>>>15,1|e),e^=e+Math.imul(e^e>>>7,61|e),((e^e>>>14)>>>0)/4294967296},degToRad:function(t){return t*ys},radToDeg:function(t){return t*gs},isPowerOfTwo:function(t){return!(t&t-1)&&0!==t},ceilPowerOfTwo:function(t){return Math.pow(2,Math.ceil(Math.log(t)/Math.LN2))},floorPowerOfTwo:function(t){return Math.pow(2,Math.floor(Math.log(t)/Math.LN2))},setQuaternionFromProperEuler:function(t,e,i,s,r){const n=Math.cos,a=Math.sin,o=n(i/2),h=a(i/2),l=n((e+s)/2),c=a((e+s)/2),u=n((e-s)/2),d=a((e-s)/2),p=n((s-e)/2),m=a((s-e)/2);switch(r){case"XYX":t.set(o*c,h*u,h*d,o*l);break;case"YZY":t.set(h*d,o*c,h*u,o*l);break;case"ZXZ":t.set(h*u,h*d,o*c,o*l);break;case"XZX":t.set(o*c,h*m,h*p,o*l);break;case"YXY":t.set(h*p,o*c,h*m,o*l);break;case"ZYZ":t.set(h*m,h*p,o*c,o*l);break;default:as("MathUtils: .setQuaternionFromProperEuler() encountered an unknown order: "+r)}},normalize:Ms,denormalize:ws};class _s{static{_s.prototype.isVector2=!0}constructor(t=0,e=0){this.x=t,this.y=e}get width(){return this.x}set width(t){this.x=t}get height(){return this.y}set height(t){this.y=t}set(t,e){return this.x=t,this.y=e,this}setScalar(t){return this.x=t,this.y=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;default:throw new Error("index is out of range: "+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;default:throw new Error("index is out of range: "+t)}}clone(){return new this.constructor(this.x,this.y)}copy(t){return this.x=t.x,this.y=t.y,this}add(t){return this.x+=t.x,this.y+=t.y,this}addScalar(t){return this.x+=t,this.y+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this}sub(t){return this.x-=t.x,this.y-=t.y,this}subScalar(t){return this.x-=t,this.y-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this}multiply(t){return this.x*=t.x,this.y*=t.y,this}multiplyScalar(t){return this.x*=t,this.y*=t,this}divide(t){return this.x/=t.x,this.y/=t.y,this}divideScalar(t){return this.multiplyScalar(1/t)}applyMatrix3(t){const e=this.x,i=this.y,s=t.elements;return this.x=s[0]*e+s[3]*i+s[6],this.y=s[1]*e+s[4]*i+s[7],this}min(t){return this.x=Math.min(this.x,t.x),this.y=Math.min(this.y,t.y),this}max(t){return this.x=Math.max(this.x,t.x),this.y=Math.max(this.y,t.y),this}clamp(t,e){return this.x=xs(this.x,t.x,e.x),this.y=xs(this.y,t.y,e.y),this}clampScalar(t,e){return this.x=xs(this.x,t,e),this.y=xs(this.y,t,e),this}clampLength(t,e){const i=this.length();return this.divideScalar(i||1).multiplyScalar(xs(i,t,e))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this}negate(){return this.x=-this.x,this.y=-this.y,this}dot(t){return this.x*t.x+this.y*t.y}cross(t){return this.x*t.y-this.y*t.x}lengthSq(){return this.x*this.x+this.y*this.y}length(){return Math.sqrt(this.x*this.x+this.y*this.y)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)}normalize(){return this.divideScalar(this.length()||1)}angle(){return Math.atan2(-this.y,-this.x)+Math.PI}angleTo(t){const e=Math.sqrt(this.lengthSq()*t.lengthSq());if(0===e)return Math.PI/2;const i=this.dot(t)/e;return Math.acos(xs(i,-1,1))}distanceTo(t){return Math.sqrt(this.distanceToSquared(t))}distanceToSquared(t){const e=this.x-t.x,i=this.y-t.y;return e*e+i*i}manhattanDistanceTo(t){return Math.abs(this.x-t.x)+Math.abs(this.y-t.y)}setLength(t){return this.normalize().multiplyScalar(t)}lerp(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this}lerpVectors(t,e,i){return this.x=t.x+(e.x-t.x)*i,this.y=t.y+(e.y-t.y)*i,this}equals(t){return t.x===this.x&&t.y===this.y}fromArray(t,e=0){return this.x=t[e],this.y=t[e+1],this}toArray(t=[],e=0){return t[e]=this.x,t[e+1]=this.y,t}fromBufferAttribute(t,e){return this.x=t.getX(e),this.y=t.getY(e),this}rotateAround(t,e){const i=Math.cos(e),s=Math.sin(e),r=this.x-t.x,n=this.y-t.y;return this.x=r*i-n*s+t.x,this.y=r*s+n*i+t.y,this}random(){return this.x=Math.random(),this.y=Math.random(),this}*[Symbol.iterator](){yield this.x,yield this.y}}class As{constructor(t=0,e=0,i=0,s=1){this.isQuaternion=!0,this._x=t,this._y=e,this._z=i,this._w=s}static slerpFlat(t,e,i,s,r,n,a){let o=i[s+0],h=i[s+1],l=i[s+2],c=i[s+3],u=r[n+0],d=r[n+1],p=r[n+2],m=r[n+3];if(c!==m||o!==u||h!==d||l!==p){let t=o*u+h*d+l*p+c*m;t<0&&(u=-u,d=-d,p=-p,m=-m,t=-t);let e=1-a;if(t<.9995){const i=Math.acos(t),s=Math.sin(i);e=Math.sin(e*i)/s,o=o*e+u*(a=Math.sin(a*i)/s),h=h*e+d*a,l=l*e+p*a,c=c*e+m*a}else{o=o*e+u*a,h=h*e+d*a,l=l*e+p*a,c=c*e+m*a;const t=1/Math.sqrt(o*o+h*h+l*l+c*c);o*=t,h*=t,l*=t,c*=t}}t[e]=o,t[e+1]=h,t[e+2]=l,t[e+3]=c}static multiplyQuaternionsFlat(t,e,i,s,r,n){const a=i[s],o=i[s+1],h=i[s+2],l=i[s+3],c=r[n],u=r[n+1],d=r[n+2],p=r[n+3];return t[e]=a*p+l*c+o*d-h*u,t[e+1]=o*p+l*u+h*c-a*d,t[e+2]=h*p+l*d+a*u-o*c,t[e+3]=l*p-a*c-o*u-h*d,t}get x(){return this._x}set x(t){this._x=t,this._onChangeCallback()}get y(){return this._y}set y(t){this._y=t,this._onChangeCallback()}get z(){return this._z}set z(t){this._z=t,this._onChangeCallback()}get w(){return this._w}set w(t){this._w=t,this._onChangeCallback()}set(t,e,i,s){return this._x=t,this._y=e,this._z=i,this._w=s,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._w)}copy(t){return this._x=t.x,this._y=t.y,this._z=t.z,this._w=t.w,this._onChangeCallback(),this}setFromEuler(t,e=!0){const i=t._x,s=t._y,r=t._z,n=t._order,a=Math.cos,o=Math.sin,h=a(i/2),l=a(s/2),c=a(r/2),u=o(i/2),d=o(s/2),p=o(r/2);switch(n){case"XYZ":this._x=u*l*c+h*d*p,this._y=h*d*c-u*l*p,this._z=h*l*p+u*d*c,this._w=h*l*c-u*d*p;break;case"YXZ":this._x=u*l*c+h*d*p,this._y=h*d*c-u*l*p,this._z=h*l*p-u*d*c,this._w=h*l*c+u*d*p;break;case"ZXY":this._x=u*l*c-h*d*p,this._y=h*d*c+u*l*p,this._z=h*l*p+u*d*c,this._w=h*l*c-u*d*p;break;case"ZYX":this._x=u*l*c-h*d*p,this._y=h*d*c+u*l*p,this._z=h*l*p-u*d*c,this._w=h*l*c+u*d*p;break;case"YZX":this._x=u*l*c+h*d*p,this._y=h*d*c+u*l*p,this._z=h*l*p-u*d*c,this._w=h*l*c-u*d*p;break;case"XZY":this._x=u*l*c-h*d*p,this._y=h*d*c-u*l*p,this._z=h*l*p+u*d*c,this._w=h*l*c+u*d*p;break;default:as("Quaternion: .setFromEuler() encountered an unknown order: "+n)}return!0===e&&this._onChangeCallback(),this}setFromAxisAngle(t,e){const i=e/2,s=Math.sin(i);return this._x=t.x*s,this._y=t.y*s,this._z=t.z*s,this._w=Math.cos(i),this._onChangeCallback(),this}setFromRotationMatrix(t){const e=t.elements,i=e[0],s=e[4],r=e[8],n=e[1],a=e[5],o=e[9],h=e[2],l=e[6],c=e[10],u=i+a+c;if(u>0){const t=.5/Math.sqrt(u+1);this._w=.25/t,this._x=(l-o)*t,this._y=(r-h)*t,this._z=(n-s)*t}else if(i>a&&i>c){const t=2*Math.sqrt(1+i-a-c);this._w=(l-o)/t,this._x=.25*t,this._y=(s+n)/t,this._z=(r+h)/t}else if(a>c){const t=2*Math.sqrt(1+a-i-c);this._w=(r-h)/t,this._x=(s+n)/t,this._y=.25*t,this._z=(o+l)/t}else{const t=2*Math.sqrt(1+c-i-a);this._w=(n-s)/t,this._x=(r+h)/t,this._y=(o+l)/t,this._z=.25*t}return this._onChangeCallback(),this}setFromUnitVectors(t,e){let i=t.dot(e)+1;return i<1e-8?(i=0,Math.abs(t.x)>Math.abs(t.z)?(this._x=-t.y,this._y=t.x,this._z=0,this._w=i):(this._x=0,this._y=-t.z,this._z=t.y,this._w=i)):(this._x=t.y*e.z-t.z*e.y,this._y=t.z*e.x-t.x*e.z,this._z=t.x*e.y-t.y*e.x,this._w=i),this.normalize()}angleTo(t){return 2*Math.acos(Math.abs(xs(this.dot(t),-1,1)))}rotateTowards(t,e){const i=this.angleTo(t);if(0===i)return this;const s=Math.min(1,e/i);return this.slerp(t,s),this}identity(){return this.set(0,0,0,1)}invert(){return this.conjugate()}conjugate(){return this._x*=-1,this._y*=-1,this._z*=-1,this._onChangeCallback(),this}dot(t){return this._x*t._x+this._y*t._y+this._z*t._z+this._w*t._w}lengthSq(){return this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w}length(){return Math.sqrt(this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w)}normalize(){let t=this.length();return 0===t?(this._x=0,this._y=0,this._z=0,this._w=1):(t=1/t,this._x=this._x*t,this._y=this._y*t,this._z=this._z*t,this._w=this._w*t),this._onChangeCallback(),this}multiply(t){return this.multiplyQuaternions(this,t)}premultiply(t){return this.multiplyQuaternions(t,this)}multiplyQuaternions(t,e){const i=t._x,s=t._y,r=t._z,n=t._w,a=e._x,o=e._y,h=e._z,l=e._w;return this._x=i*l+n*a+s*h-r*o,this._y=s*l+n*o+r*a-i*h,this._z=r*l+n*h+i*o-s*a,this._w=n*l-i*a-s*o-r*h,this._onChangeCallback(),this}slerp(t,e){let i=t._x,s=t._y,r=t._z,n=t._w,a=this.dot(t);a<0&&(i=-i,s=-s,r=-r,n=-n,a=-a);let o=1-e;if(a<.9995){const t=Math.acos(a),h=Math.sin(t);o=Math.sin(o*t)/h,e=Math.sin(e*t)/h,this._x=this._x*o+i*e,this._y=this._y*o+s*e,this._z=this._z*o+r*e,this._w=this._w*o+n*e,this._onChangeCallback()}else this._x=this._x*o+i*e,this._y=this._y*o+s*e,this._z=this._z*o+r*e,this._w=this._w*o+n*e,this.normalize();return this}slerpQuaternions(t,e,i){return this.copy(t).slerp(e,i)}random(){const t=2*Math.PI*Math.random(),e=2*Math.PI*Math.random(),i=Math.random(),s=Math.sqrt(1-i),r=Math.sqrt(i);return this.set(s*Math.sin(t),s*Math.cos(t),r*Math.sin(e),r*Math.cos(e))}equals(t){return t._x===this._x&&t._y===this._y&&t._z===this._z&&t._w===this._w}fromArray(t,e=0){return this._x=t[e],this._y=t[e+1],this._z=t[e+2],this._w=t[e+3],this._onChangeCallback(),this}toArray(t=[],e=0){return t[e]=this._x,t[e+1]=this._y,t[e+2]=this._z,t[e+3]=this._w,t}fromBufferAttribute(t,e){return this._x=t.getX(e),this._y=t.getY(e),this._z=t.getZ(e),this._w=t.getW(e),this._onChangeCallback(),this}toJSON(){return this.toArray()}_onChange(t){return this._onChangeCallback=t,this}_onChangeCallback(){}*[Symbol.iterator](){yield this._x,yield this._y,yield this._z,yield this._w}}class Ts{static{Ts.prototype.isVector3=!0}constructor(t=0,e=0,i=0){this.x=t,this.y=e,this.z=i}set(t,e,i){return void 0===i&&(i=this.z),this.x=t,this.y=e,this.z=i,this}setScalar(t){return this.x=t,this.y=t,this.z=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setZ(t){return this.z=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;case 2:this.z=e;break;default:throw new Error("index is out of range: "+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;case 2:return this.z;default:throw new Error("index is out of range: "+t)}}clone(){return new this.constructor(this.x,this.y,this.z)}copy(t){return this.x=t.x,this.y=t.y,this.z=t.z,this}add(t){return this.x+=t.x,this.y+=t.y,this.z+=t.z,this}addScalar(t){return this.x+=t,this.y+=t,this.z+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this.z=t.z+e.z,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this.z+=t.z*e,this}sub(t){return this.x-=t.x,this.y-=t.y,this.z-=t.z,this}subScalar(t){return this.x-=t,this.y-=t,this.z-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this.z=t.z-e.z,this}multiply(t){return this.x*=t.x,this.y*=t.y,this.z*=t.z,this}multiplyScalar(t){return this.x*=t,this.y*=t,this.z*=t,this}multiplyVectors(t,e){return this.x=t.x*e.x,this.y=t.y*e.y,this.z=t.z*e.z,this}applyEuler(t){return this.applyQuaternion(Cs.setFromEuler(t))}applyAxisAngle(t,e){return this.applyQuaternion(Cs.setFromAxisAngle(t,e))}applyMatrix3(t){const e=this.x,i=this.y,s=this.z,r=t.elements;return this.x=r[0]*e+r[3]*i+r[6]*s,this.y=r[1]*e+r[4]*i+r[7]*s,this.z=r[2]*e+r[5]*i+r[8]*s,this}applyNormalMatrix(t){return this.applyMatrix3(t).normalize()}applyMatrix4(t){const e=this.x,i=this.y,s=this.z,r=t.elements,n=1/(r[3]*e+r[7]*i+r[11]*s+r[15]);return this.x=(r[0]*e+r[4]*i+r[8]*s+r[12])*n,this.y=(r[1]*e+r[5]*i+r[9]*s+r[13])*n,this.z=(r[2]*e+r[6]*i+r[10]*s+r[14])*n,this}applyQuaternion(t){const e=this.x,i=this.y,s=this.z,r=t.x,n=t.y,a=t.z,o=t.w,h=2*(n*s-a*i),l=2*(a*e-r*s),c=2*(r*i-n*e);return this.x=e+o*h+n*c-a*l,this.y=i+o*l+a*h-r*c,this.z=s+o*c+r*l-n*h,this}project(t){return this.applyMatrix4(t.matrixWorldInverse).applyMatrix4(t.projectionMatrix)}unproject(t){return this.applyMatrix4(t.projectionMatrixInverse).applyMatrix4(t.matrixWorld)}transformDirection(t){const e=this.x,i=this.y,s=this.z,r=t.elements;return this.x=r[0]*e+r[4]*i+r[8]*s,this.y=r[1]*e+r[5]*i+r[9]*s,this.z=r[2]*e+r[6]*i+r[10]*s,this.normalize()}divide(t){return this.x/=t.x,this.y/=t.y,this.z/=t.z,this}divideScalar(t){return this.multiplyScalar(1/t)}min(t){return this.x=Math.min(this.x,t.x),this.y=Math.min(this.y,t.y),this.z=Math.min(this.z,t.z),this}max(t){return this.x=Math.max(this.x,t.x),this.y=Math.max(this.y,t.y),this.z=Math.max(this.z,t.z),this}clamp(t,e){return this.x=xs(this.x,t.x,e.x),this.y=xs(this.y,t.y,e.y),this.z=xs(this.z,t.z,e.z),this}clampScalar(t,e){return this.x=xs(this.x,t,e),this.y=xs(this.y,t,e),this.z=xs(this.z,t,e),this}clampLength(t,e){const i=this.length();return this.divideScalar(i||1).multiplyScalar(xs(i,t,e))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this.z=Math.trunc(this.z),this}negate(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this}dot(t){return this.x*t.x+this.y*t.y+this.z*t.z}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z}length(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)}normalize(){return this.divideScalar(this.length()||1)}setLength(t){return this.normalize().multiplyScalar(t)}lerp(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this.z+=(t.z-this.z)*e,this}lerpVectors(t,e,i){return this.x=t.x+(e.x-t.x)*i,this.y=t.y+(e.y-t.y)*i,this.z=t.z+(e.z-t.z)*i,this}cross(t){return this.crossVectors(this,t)}crossVectors(t,e){const i=t.x,s=t.y,r=t.z,n=e.x,a=e.y,o=e.z;return this.x=s*o-r*a,this.y=r*n-i*o,this.z=i*a-s*n,this}projectOnVector(t){const e=t.lengthSq();if(0===e)return this.set(0,0,0);const i=t.dot(this)/e;return this.copy(t).multiplyScalar(i)}projectOnPlane(t){return zs.copy(this).projectOnVector(t),this.sub(zs)}reflect(t){return this.sub(zs.copy(t).multiplyScalar(2*this.dot(t)))}angleTo(t){const e=Math.sqrt(this.lengthSq()*t.lengthSq());if(0===e)return Math.PI/2;const i=this.dot(t)/e;return Math.acos(xs(i,-1,1))}distanceTo(t){return Math.sqrt(this.distanceToSquared(t))}distanceToSquared(t){const e=this.x-t.x,i=this.y-t.y,s=this.z-t.z;return e*e+i*i+s*s}manhattanDistanceTo(t){return Math.abs(this.x-t.x)+Math.abs(this.y-t.y)+Math.abs(this.z-t.z)}setFromSpherical(t){return this.setFromSphericalCoords(t.radius,t.phi,t.theta)}setFromSphericalCoords(t,e,i){const s=Math.sin(e)*t;return this.x=s*Math.sin(i),this.y=Math.cos(e)*t,this.z=s*Math.cos(i),this}setFromCylindrical(t){return this.setFromCylindricalCoords(t.radius,t.theta,t.y)}setFromCylindricalCoords(t,e,i){return this.x=t*Math.sin(e),this.y=i,this.z=t*Math.cos(e),this}setFromMatrixPosition(t){const e=t.elements;return this.x=e[12],this.y=e[13],this.z=e[14],this}setFromMatrixScale(t){const e=this.setFromMatrixColumn(t,0).length(),i=this.setFromMatrixColumn(t,1).length(),s=this.setFromMatrixColumn(t,2).length();return this.x=e,this.y=i,this.z=s,this}setFromMatrixColumn(t,e){return this.fromArray(t.elements,4*e)}setFromMatrix3Column(t,e){return this.fromArray(t.elements,3*e)}setFromEuler(t){return this.x=t._x,this.y=t._y,this.z=t._z,this}setFromColor(t){return this.x=t.r,this.y=t.g,this.z=t.b,this}equals(t){return t.x===this.x&&t.y===this.y&&t.z===this.z}fromArray(t,e=0){return this.x=t[e],this.y=t[e+1],this.z=t[e+2],this}toArray(t=[],e=0){return t[e]=this.x,t[e+1]=this.y,t[e+2]=this.z,t}fromBufferAttribute(t,e){return this.x=t.getX(e),this.y=t.getY(e),this.z=t.getZ(e),this}random(){return this.x=Math.random(),this.y=Math.random(),this.z=Math.random(),this}randomDirection(){const t=Math.random()*Math.PI*2,e=2*Math.random()-1,i=Math.sqrt(1-e*e);return this.x=i*Math.cos(t),this.y=e,this.z=i*Math.sin(t),this}*[Symbol.iterator](){yield this.x,yield this.y,yield this.z}}const zs=new Ts,Cs=new As;class Is{static{Is.prototype.isMatrix3=!0}constructor(t,e,i,s,r,n,a,o,h){this.elements=[1,0,0,0,1,0,0,0,1],void 0!==t&&this.set(t,e,i,s,r,n,a,o,h)}set(t,e,i,s,r,n,a,o,h){const l=this.elements;return l[0]=t,l[1]=s,l[2]=a,l[3]=e,l[4]=r,l[5]=o,l[6]=i,l[7]=n,l[8]=h,this}identity(){return this.set(1,0,0,0,1,0,0,0,1),this}copy(t){const e=this.elements,i=t.elements;return e[0]=i[0],e[1]=i[1],e[2]=i[2],e[3]=i[3],e[4]=i[4],e[5]=i[5],e[6]=i[6],e[7]=i[7],e[8]=i[8],this}extractBasis(t,e,i){return t.setFromMatrix3Column(this,0),e.setFromMatrix3Column(this,1),i.setFromMatrix3Column(this,2),this}setFromMatrix4(t){const e=t.elements;return this.set(e[0],e[4],e[8],e[1],e[5],e[9],e[2],e[6],e[10]),this}multiply(t){return this.multiplyMatrices(this,t)}premultiply(t){return this.multiplyMatrices(t,this)}multiplyMatrices(t,e){const i=t.elements,s=e.elements,r=this.elements,n=i[0],a=i[3],o=i[6],h=i[1],l=i[4],c=i[7],u=i[2],d=i[5],p=i[8],m=s[0],y=s[3],g=s[6],f=s[1],x=s[4],b=s[7],v=s[2],w=s[5],M=s[8];return r[0]=n*m+a*f+o*v,r[3]=n*y+a*x+o*w,r[6]=n*g+a*b+o*M,r[1]=h*m+l*f+c*v,r[4]=h*y+l*x+c*w,r[7]=h*g+l*b+c*M,r[2]=u*m+d*f+p*v,r[5]=u*y+d*x+p*w,r[8]=u*g+d*b+p*M,this}multiplyScalar(t){const e=this.elements;return e[0]*=t,e[3]*=t,e[6]*=t,e[1]*=t,e[4]*=t,e[7]*=t,e[2]*=t,e[5]*=t,e[8]*=t,this}determinant(){const t=this.elements,e=t[0],i=t[1],s=t[2],r=t[3],n=t[4],a=t[5],o=t[6],h=t[7],l=t[8];return e*n*l-e*a*h-i*r*l+i*a*o+s*r*h-s*n*o}invert(){const t=this.elements,e=t[0],i=t[1],s=t[2],r=t[3],n=t[4],a=t[5],o=t[6],h=t[7],l=t[8],c=l*n-a*h,u=a*o-l*r,d=h*r-n*o,p=e*c+i*u+s*d;if(0===p)return this.set(0,0,0,0,0,0,0,0,0);const m=1/p;return t[0]=c*m,t[1]=(s*h-l*i)*m,t[2]=(a*i-s*n)*m,t[3]=u*m,t[4]=(l*e-s*o)*m,t[5]=(s*r-a*e)*m,t[6]=d*m,t[7]=(i*o-h*e)*m,t[8]=(n*e-i*r)*m,this}transpose(){let t;const e=this.elements;return t=e[1],e[1]=e[3],e[3]=t,t=e[2],e[2]=e[6],e[6]=t,t=e[5],e[5]=e[7],e[7]=t,this}getNormalMatrix(t){return this.setFromMatrix4(t).invert().transpose()}transposeIntoArray(t){const e=this.elements;return t[0]=e[0],t[1]=e[3],t[2]=e[6],t[3]=e[1],t[4]=e[4],t[5]=e[7],t[6]=e[2],t[7]=e[5],t[8]=e[8],this}setUvTransform(t,e,i,s,r,n,a){const o=Math.cos(r),h=Math.sin(r);return this.set(i*o,i*h,-i*(o*n+h*a)+n+t,-s*h,s*o,-s*(-h*n+o*a)+a+e,0,0,1),this}scale(t,e){return this.premultiply(Bs.makeScale(t,e)),this}rotate(t){return this.premultiply(Bs.makeRotation(-t)),this}translate(t,e){return this.premultiply(Bs.makeTranslation(t,e)),this}makeTranslation(t,e){return t.isVector2?this.set(1,0,t.x,0,1,t.y,0,0,1):this.set(1,0,t,0,1,e,0,0,1),this}makeRotation(t){const e=Math.cos(t),i=Math.sin(t);return this.set(e,-i,0,i,e,0,0,0,1),this}makeScale(t,e){return this.set(t,0,0,0,e,0,0,0,1),this}equals(t){const e=this.elements,i=t.elements;for(let t=0;t<9;t++)if(e[t]!==i[t])return!1;return!0}fromArray(t,e=0){for(let i=0;i<9;i++)this.elements[i]=t[i+e];return this}toArray(t=[],e=0){const i=this.elements;return t[e]=i[0],t[e+1]=i[1],t[e+2]=i[2],t[e+3]=i[3],t[e+4]=i[4],t[e+5]=i[5],t[e+6]=i[6],t[e+7]=i[7],t[e+8]=i[8],t}clone(){return(new this.constructor).fromArray(this.elements)}}const Bs=new Is,ks=(new Is).set(.4123908,.3575843,.1804808,.212639,.7151687,.0721923,.0193308,.1191948,.9505322),Os=(new Is).set(3.2409699,-1.5373832,-.4986108,-.9692436,1.8759675,.0415551,.0556301,-.203977,1.0569715);function Ps(){const t={enabled:!0,workingColorSpace:ii,spaces:{},convert:function(t,e,i){return!1!==this.enabled&&e!==i&&e&&i?(this.spaces[e].transfer===ri&&(t.r=Ns(t.r),t.g=Ns(t.g),t.b=Ns(t.b)),this.spaces[e].primaries!==this.spaces[i].primaries&&(t.applyMatrix3(this.spaces[e].toXYZ),t.applyMatrix3(this.spaces[i].fromXYZ)),this.spaces[i].transfer===ri&&(t.r=Vs(t.r),t.g=Vs(t.g),t.b=Vs(t.b)),t):t},workingToColorSpace:function(t,e){return this.convert(t,this.workingColorSpace,e)},colorSpaceToWorking:function(t,e){return this.convert(t,e,this.workingColorSpace)},getPrimaries:function(t){return this.spaces[t].primaries},getTransfer:function(t){return""===t?si:this.spaces[t].transfer},getToneMappingMode:function(t){return this.spaces[t].outputColorSpaceConfig.toneMappingMode||"standard"},getLuminanceCoefficients:function(t,e=this.workingColorSpace){return t.fromArray(this.spaces[e].luminanceCoefficients)},define:function(t){Object.assign(this.spaces,t)},_getMatrix:function(t,e,i){return t.copy(this.spaces[e].toXYZ).multiply(this.spaces[i].fromXYZ)},_getDrawingBufferColorSpace:function(t){return this.spaces[t].outputColorSpaceConfig.drawingBufferColorSpace},_getUnpackColorSpace:function(t=this.workingColorSpace){return this.spaces[t].workingColorSpaceConfig.unpackColorSpace},fromWorkingColorSpace:function(e,i){return hs("ColorManagement: .fromWorkingColorSpace() has been renamed to .workingToColorSpace()."),t.workingToColorSpace(e,i)},toWorkingColorSpace:function(e,i){return hs("ColorManagement: .toWorkingColorSpace() has been renamed to .colorSpaceToWorking()."),t.colorSpaceToWorking(e,i)}},e=[.64,.33,.3,.6,.15,.06],i=[.2126,.7152,.0722],s=[.3127,.329];return t.define({[ii]:{primaries:e,whitePoint:s,transfer:si,toXYZ:ks,fromXYZ:Os,luminanceCoefficients:i,workingColorSpaceConfig:{unpackColorSpace:ei},outputColorSpaceConfig:{drawingBufferColorSpace:ei}},[ei]:{primaries:e,whitePoint:s,transfer:ri,toXYZ:ks,fromXYZ:Os,luminanceCoefficients:i,outputColorSpaceConfig:{drawingBufferColorSpace:ei}}}),t}const Rs=Ps();function Ns(t){return t<.04045?.0773993808*t:Math.pow(.9478672986*t+.0521327014,2.4)}function Vs(t){return t<.0031308?12.92*t:1.055*Math.pow(t,.41666)-.055}let Es;class Fs{static getDataURL(t,e="image/png"){if(/^data:/i.test(t.src))return t.src;if("undefined"==typeof HTMLCanvasElement)return t.src;let i;if(t instanceof HTMLCanvasElement)i=t;else{void 0===Es&&(Es=Qi("canvas")),Es.width=t.width,Es.height=t.height;const e=Es.getContext("2d");t instanceof ImageData?e.putImageData(t,0,0):e.drawImage(t,0,0,t.width,t.height),i=Es}return i.toDataURL(e)}static sRGBToLinear(t){if("undefined"!=typeof HTMLImageElement&&t instanceof HTMLImageElement||"undefined"!=typeof HTMLCanvasElement&&t instanceof HTMLCanvasElement||"undefined"!=typeof ImageBitmap&&t instanceof ImageBitmap){const e=Qi("canvas");e.width=t.width,e.height=t.height;const i=e.getContext("2d");i.drawImage(t,0,0,t.width,t.height);const s=i.getImageData(0,0,t.width,t.height),r=s.data;for(let t=0;t1),this.pmremVersion=0}get width(){return this.source.getSize(Us).x}get height(){return this.source.getSize(Us).y}get depth(){return this.source.getSize(Us).z}get image(){return this.source.data}set image(t){this.source.data=t}updateMatrix(){this.matrix.setUvTransform(this.offset.x,this.offset.y,this.repeat.x,this.repeat.y,this.rotation,this.center.x,this.center.y)}addUpdateRange(t,e){this.updateRanges.push({start:t,count:e})}clearUpdateRanges(){this.updateRanges.length=0}clone(){return(new this.constructor).copy(this)}copy(t){return this.name=t.name,this.source=t.source,this.mipmaps=t.mipmaps.slice(0),this.mapping=t.mapping,this.channel=t.channel,this.wrapS=t.wrapS,this.wrapT=t.wrapT,this.magFilter=t.magFilter,this.minFilter=t.minFilter,this.anisotropy=t.anisotropy,this.format=t.format,this.internalFormat=t.internalFormat,this.type=t.type,this.offset.copy(t.offset),this.repeat.copy(t.repeat),this.center.copy(t.center),this.rotation=t.rotation,this.matrixAutoUpdate=t.matrixAutoUpdate,this.matrix.copy(t.matrix),this.generateMipmaps=t.generateMipmaps,this.premultiplyAlpha=t.premultiplyAlpha,this.flipY=t.flipY,this.unpackAlignment=t.unpackAlignment,this.colorSpace=t.colorSpace,this.renderTarget=t.renderTarget,this.isRenderTargetTexture=t.isRenderTargetTexture,this.isArrayTexture=t.isArrayTexture,this.userData=JSON.parse(JSON.stringify(t.userData)),this.needsUpdate=!0,this}setValues(t){for(const e in t){const i=t[e];if(void 0===i){as(`Texture.setValues(): parameter '${e}' has value of undefined.`);continue}const s=this[e];void 0!==s?s&&i&&s.isVector2&&i.isVector2||s&&i&&s.isVector3&&i.isVector3||s&&i&&s.isMatrix3&&i.isMatrix3?s.copy(i):this[e]=i:as(`Texture.setValues(): property '${e}' does not exist.`)}}toJSON(t){const e=void 0===t||"string"==typeof t;if(!e&&void 0!==t.textures[this.uuid])return t.textures[this.uuid];const i={metadata:{version:4.7,type:"Texture",generator:"Texture.toJSON"},uuid:this.uuid,name:this.name,image:this.source.toJSON(t).uuid,mapping:this.mapping,channel:this.channel,repeat:[this.repeat.x,this.repeat.y],offset:[this.offset.x,this.offset.y],center:[this.center.x,this.center.y],rotation:this.rotation,wrap:[this.wrapS,this.wrapT],format:this.format,internalFormat:this.internalFormat,type:this.type,colorSpace:this.colorSpace,minFilter:this.minFilter,magFilter:this.magFilter,anisotropy:this.anisotropy,flipY:this.flipY,generateMipmaps:this.generateMipmaps,premultiplyAlpha:this.premultiplyAlpha,unpackAlignment:this.unpackAlignment};return Object.keys(this.userData).length>0&&(i.userData=this.userData),e||(t.textures[this.uuid]=i),i}dispose(){this.dispatchEvent({type:"dispose"})}transformUv(t){if(this.mapping!==ht)return t;if(t.applyMatrix3(this.matrix),t.x<0||t.x>1)switch(this.wrapS){case mt:t.x=t.x-Math.floor(t.x);break;case yt:t.x=t.x<0?0:1;break;case gt:1===Math.abs(Math.floor(t.x)%2)?t.x=Math.ceil(t.x)-t.x:t.x=t.x-Math.floor(t.x)}if(t.y<0||t.y>1)switch(this.wrapT){case mt:t.y=t.y-Math.floor(t.y);break;case yt:t.y=t.y<0?0:1;break;case gt:1===Math.abs(Math.floor(t.y)%2)?t.y=Math.ceil(t.y)-t.y:t.y=t.y-Math.floor(t.y)}return this.flipY&&(t.y=1-t.y),t}set needsUpdate(t){!0===t&&(this.version++,this.source.needsUpdate=!0)}set needsPMREMUpdate(t){!0===t&&this.pmremVersion++}}qs.DEFAULT_IMAGE=null,qs.DEFAULT_MAPPING=ht,qs.DEFAULT_ANISOTROPY=1;class Js{static{Js.prototype.isVector4=!0}constructor(t=0,e=0,i=0,s=1){this.x=t,this.y=e,this.z=i,this.w=s}get width(){return this.z}set width(t){this.z=t}get height(){return this.w}set height(t){this.w=t}set(t,e,i,s){return this.x=t,this.y=e,this.z=i,this.w=s,this}setScalar(t){return this.x=t,this.y=t,this.z=t,this.w=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setZ(t){return this.z=t,this}setW(t){return this.w=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;case 2:this.z=e;break;case 3:this.w=e;break;default:throw new Error("index is out of range: "+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;case 2:return this.z;case 3:return this.w;default:throw new Error("index is out of range: "+t)}}clone(){return new this.constructor(this.x,this.y,this.z,this.w)}copy(t){return this.x=t.x,this.y=t.y,this.z=t.z,this.w=void 0!==t.w?t.w:1,this}add(t){return this.x+=t.x,this.y+=t.y,this.z+=t.z,this.w+=t.w,this}addScalar(t){return this.x+=t,this.y+=t,this.z+=t,this.w+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this.z=t.z+e.z,this.w=t.w+e.w,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this.z+=t.z*e,this.w+=t.w*e,this}sub(t){return this.x-=t.x,this.y-=t.y,this.z-=t.z,this.w-=t.w,this}subScalar(t){return this.x-=t,this.y-=t,this.z-=t,this.w-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this.z=t.z-e.z,this.w=t.w-e.w,this}multiply(t){return this.x*=t.x,this.y*=t.y,this.z*=t.z,this.w*=t.w,this}multiplyScalar(t){return this.x*=t,this.y*=t,this.z*=t,this.w*=t,this}applyMatrix4(t){const e=this.x,i=this.y,s=this.z,r=this.w,n=t.elements;return this.x=n[0]*e+n[4]*i+n[8]*s+n[12]*r,this.y=n[1]*e+n[5]*i+n[9]*s+n[13]*r,this.z=n[2]*e+n[6]*i+n[10]*s+n[14]*r,this.w=n[3]*e+n[7]*i+n[11]*s+n[15]*r,this}divide(t){return this.x/=t.x,this.y/=t.y,this.z/=t.z,this.w/=t.w,this}divideScalar(t){return this.multiplyScalar(1/t)}setAxisAngleFromQuaternion(t){this.w=2*Math.acos(t.w);const e=Math.sqrt(1-t.w*t.w);return e<1e-4?(this.x=1,this.y=0,this.z=0):(this.x=t.x/e,this.y=t.y/e,this.z=t.z/e),this}setAxisAngleFromRotationMatrix(t){let e,i,s,r;const n=.01,a=.1,o=t.elements,h=o[0],l=o[4],c=o[8],u=o[1],d=o[5],p=o[9],m=o[2],y=o[6],g=o[10];if(Math.abs(l-u)o&&t>f?tf?o1);this.dispose()}this.viewport.set(0,0,t,e),this.scissor.set(0,0,t,e)}clone(){return(new this.constructor).copy(this)}copy(t){this.width=t.width,this.height=t.height,this.depth=t.depth,this.scissor.copy(t.scissor),this.scissorTest=t.scissorTest,this.viewport.copy(t.viewport),this.textures.length=0;for(let e=0,i=t.textures.length;e>>0}enable(t){this.mask|=1<1){for(let t=0;t1){for(let t=0;t0&&(s.userData=this.userData),s.layers=this.layers.mask,s.matrix=this.matrix.toArray(),s.up=this.up.toArray(),null!==this.pivot&&(s.pivot=this.pivot.toArray()),!1===this.matrixAutoUpdate&&(s.matrixAutoUpdate=!1),void 0!==this.morphTargetDictionary&&(s.morphTargetDictionary=Object.assign({},this.morphTargetDictionary)),void 0!==this.morphTargetInfluences&&(s.morphTargetInfluences=this.morphTargetInfluences.slice()),this.isInstancedMesh&&(s.type="InstancedMesh",s.count=this.count,s.instanceMatrix=this.instanceMatrix.toJSON(),null!==this.instanceColor&&(s.instanceColor=this.instanceColor.toJSON())),this.isBatchedMesh&&(s.type="BatchedMesh",s.perObjectFrustumCulled=this.perObjectFrustumCulled,s.sortObjects=this.sortObjects,s.drawRanges=this._drawRanges,s.reservedRanges=this._reservedRanges,s.geometryInfo=this._geometryInfo.map(t=>({...t,boundingBox:t.boundingBox?t.boundingBox.toJSON():void 0,boundingSphere:t.boundingSphere?t.boundingSphere.toJSON():void 0})),s.instanceInfo=this._instanceInfo.map(t=>({...t})),s.availableInstanceIds=this._availableInstanceIds.slice(),s.availableGeometryIds=this._availableGeometryIds.slice(),s.nextIndexStart=this._nextIndexStart,s.nextVertexStart=this._nextVertexStart,s.geometryCount=this._geometryCount,s.maxInstanceCount=this._maxInstanceCount,s.maxVertexCount=this._maxVertexCount,s.maxIndexCount=this._maxIndexCount,s.geometryInitialized=this._geometryInitialized,s.matricesTexture=this._matricesTexture.toJSON(t),s.indirectTexture=this._indirectTexture.toJSON(t),null!==this._colorsTexture&&(s.colorsTexture=this._colorsTexture.toJSON(t)),null!==this.boundingSphere&&(s.boundingSphere=this.boundingSphere.toJSON()),null!==this.boundingBox&&(s.boundingBox=this.boundingBox.toJSON())),this.isScene)this.background&&(this.background.isColor?s.background=this.background.toJSON():this.background.isTexture&&(s.background=this.background.toJSON(t).uuid)),this.environment&&this.environment.isTexture&&!0!==this.environment.isRenderTargetTexture&&(s.environment=this.environment.toJSON(t).uuid);else if(this.isMesh||this.isLine||this.isPoints){s.geometry=r(t.geometries,this.geometry);const e=this.geometry.parameters;if(void 0!==e&&void 0!==e.shapes){const i=e.shapes;if(Array.isArray(i))for(let e=0,s=i.length;e0){s.children=[];for(let e=0;e0){s.animations=[];for(let e=0;e0&&(i.geometries=e),s.length>0&&(i.materials=s),r.length>0&&(i.textures=r),a.length>0&&(i.images=a),o.length>0&&(i.shapes=o),h.length>0&&(i.skeletons=h),l.length>0&&(i.animations=l),c.length>0&&(i.nodes=c)}return i.object=s,i;function n(t){const e=[];for(const i in t){const s=t[i];delete s.metadata,e.push(s)}return e}}clone(t){return(new this.constructor).copy(this,t)}copy(t,e=!0){if(this.name=t.name,this.up.copy(t.up),this.position.copy(t.position),this.rotation.order=t.rotation.order,this.quaternion.copy(t.quaternion),this.scale.copy(t.scale),this.pivot=null!==t.pivot?t.pivot.clone():null,this.matrix.copy(t.matrix),this.matrixWorld.copy(t.matrixWorld),this.matrixAutoUpdate=t.matrixAutoUpdate,this.matrixWorldAutoUpdate=t.matrixWorldAutoUpdate,this.matrixWorldNeedsUpdate=t.matrixWorldNeedsUpdate,this.layers.mask=t.layers.mask,this.visible=t.visible,this.castShadow=t.castShadow,this.receiveShadow=t.receiveShadow,this.frustumCulled=t.frustumCulled,this.renderOrder=t.renderOrder,this.static=t.static,this.animations=t.animations.slice(),this.userData=JSON.parse(JSON.stringify(t.userData)),!0===e)for(let e=0;eo+l?(h.inputState.pinching=!1,this.dispatchEvent({type:"pinchend",handedness:t.handedness,target:this})):!h.inputState.pinching&&a<=o-l&&(h.inputState.pinching=!0,this.dispatchEvent({type:"pinchstart",handedness:t.handedness,target:this}))}else null!==o&&t.gripSpace&&(r=e.getPose(t.gripSpace,i),null!==r&&(o.matrix.fromArray(r.transform.matrix),o.matrix.decompose(o.position,o.rotation,o.scale),o.matrixWorldNeedsUpdate=!0,r.linearVelocity?(o.hasLinearVelocity=!0,o.linearVelocity.copy(r.linearVelocity)):o.hasLinearVelocity=!1,r.angularVelocity?(o.hasAngularVelocity=!0,o.angularVelocity.copy(r.angularVelocity)):o.hasAngularVelocity=!1,o.eventsEnabled&&o.dispatchEvent({type:"gripUpdated",data:t,target:this})));null!==a&&(s=e.getPose(t.targetRaySpace,i),null===s&&null!==r&&(s=r),null!==s&&(a.matrix.fromArray(s.transform.matrix),a.matrix.decompose(a.position,a.rotation,a.scale),a.matrixWorldNeedsUpdate=!0,s.linearVelocity?(a.hasLinearVelocity=!0,a.linearVelocity.copy(s.linearVelocity)):a.hasLinearVelocity=!1,s.angularVelocity?(a.hasAngularVelocity=!0,a.angularVelocity.copy(s.angularVelocity)):a.hasAngularVelocity=!1,this.dispatchEvent(zr)))}return null!==a&&(a.visible=null!==s),null!==o&&(o.visible=null!==r),null!==h&&(h.visible=null!==n),this}_getHandJoint(t,e){if(void 0===t.joints[e.jointName]){const i=new Tr;i.matrixAutoUpdate=!1,i.visible=!1,t.joints[e.jointName]=i,t.add(i)}return t.joints[e.jointName]}}const Ir={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074},Br={h:0,s:0,l:0},kr={h:0,s:0,l:0};function Or(t,e,i){return i<0&&(i+=1),i>1&&(i-=1),i<1/6?t+6*(e-t)*i:i<.5?e:i<2/3?t+6*(e-t)*(2/3-i):t}class Pr{constructor(t,e,i){return this.isColor=!0,this.r=1,this.g=1,this.b=1,this.set(t,e,i)}set(t,e,i){if(void 0===e&&void 0===i){const e=t;e&&e.isColor?this.copy(e):"number"==typeof e?this.setHex(e):"string"==typeof e&&this.setStyle(e)}else this.setRGB(t,e,i);return this}setScalar(t){return this.r=t,this.g=t,this.b=t,this}setHex(t,e=ei){return t=Math.floor(t),this.r=(t>>16&255)/255,this.g=(t>>8&255)/255,this.b=(255&t)/255,Rs.colorSpaceToWorking(this,e),this}setRGB(t,e,i,s=Rs.workingColorSpace){return this.r=t,this.g=e,this.b=i,Rs.colorSpaceToWorking(this,s),this}setHSL(t,e,i,s=Rs.workingColorSpace){if(t=bs(t,1),e=xs(e,0,1),i=xs(i,0,1),0===e)this.r=this.g=this.b=i;else{const s=i<=.5?i*(1+e):i+e-i*e,r=2*i-s;this.r=Or(r,s,t+1/3),this.g=Or(r,s,t),this.b=Or(r,s,t-1/3)}return Rs.colorSpaceToWorking(this,s),this}setStyle(t,e=ei){function i(e){void 0!==e&&parseFloat(e)<1&&as("Color: Alpha component of "+t+" will be ignored.")}let s;if(s=/^(\w+)\(([^\)]*)\)/.exec(t)){let r;const n=s[1],a=s[2];switch(n){case"rgb":case"rgba":if(r=/^\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(a))return i(r[4]),this.setRGB(Math.min(255,parseInt(r[1],10))/255,Math.min(255,parseInt(r[2],10))/255,Math.min(255,parseInt(r[3],10))/255,e);if(r=/^\s*(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(a))return i(r[4]),this.setRGB(Math.min(100,parseInt(r[1],10))/100,Math.min(100,parseInt(r[2],10))/100,Math.min(100,parseInt(r[3],10))/100,e);break;case"hsl":case"hsla":if(r=/^\s*(\d*\.?\d+)\s*,\s*(\d*\.?\d+)\%\s*,\s*(\d*\.?\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(a))return i(r[4]),this.setHSL(parseFloat(r[1])/360,parseFloat(r[2])/100,parseFloat(r[3])/100,e);break;default:as("Color: Unknown color model "+t)}}else if(s=/^\#([A-Fa-f\d]+)$/.exec(t)){const i=s[1],r=i.length;if(3===r)return this.setRGB(parseInt(i.charAt(0),16)/15,parseInt(i.charAt(1),16)/15,parseInt(i.charAt(2),16)/15,e);if(6===r)return this.setHex(parseInt(i,16),e);as("Color: Invalid hex color "+t)}else if(t&&t.length>0)return this.setColorName(t,e);return this}setColorName(t,e=ei){const i=Ir[t.toLowerCase()];return void 0!==i?this.setHex(i,e):as("Color: Unknown color "+t),this}clone(){return new this.constructor(this.r,this.g,this.b)}copy(t){return this.r=t.r,this.g=t.g,this.b=t.b,this}copySRGBToLinear(t){return this.r=Ns(t.r),this.g=Ns(t.g),this.b=Ns(t.b),this}copyLinearToSRGB(t){return this.r=Vs(t.r),this.g=Vs(t.g),this.b=Vs(t.b),this}convertSRGBToLinear(){return this.copySRGBToLinear(this),this}convertLinearToSRGB(){return this.copyLinearToSRGB(this),this}getHex(t=ei){return Rs.workingToColorSpace(Rr.copy(this),t),65536*Math.round(xs(255*Rr.r,0,255))+256*Math.round(xs(255*Rr.g,0,255))+Math.round(xs(255*Rr.b,0,255))}getHexString(t=ei){return("000000"+this.getHex(t).toString(16)).slice(-6)}getHSL(t,e=Rs.workingColorSpace){Rs.workingToColorSpace(Rr.copy(this),e);const i=Rr.r,s=Rr.g,r=Rr.b,n=Math.max(i,s,r),a=Math.min(i,s,r);let o,h;const l=(a+n)/2;if(a===n)o=0,h=0;else{const t=n-a;switch(h=l<=.5?t/(n+a):t/(2-n-a),n){case i:o=(s-r)/t+(s0&&(e.object.backgroundBlurriness=this.backgroundBlurriness),1!==this.backgroundIntensity&&(e.object.backgroundIntensity=this.backgroundIntensity),e.object.backgroundRotation=this.backgroundRotation.toArray(),1!==this.environmentIntensity&&(e.object.environmentIntensity=this.environmentIntensity),e.object.environmentRotation=this.environmentRotation.toArray(),e}}const Fr=new Ts,Lr=new Ts,jr=new Ts,Dr=new Ts,Wr=new Ts,Ur=new Ts,qr=new Ts,Jr=new Ts,Xr=new Ts,Yr=new Ts,Hr=new Js,Zr=new Js,Gr=new Js;class $r{constructor(t=new Ts,e=new Ts,i=new Ts){this.a=t,this.b=e,this.c=i}static getNormal(t,e,i,s){s.subVectors(i,e),Fr.subVectors(t,e),s.cross(Fr);const r=s.lengthSq();return r>0?s.multiplyScalar(1/Math.sqrt(r)):s.set(0,0,0)}static getBarycoord(t,e,i,s,r){Fr.subVectors(s,e),Lr.subVectors(i,e),jr.subVectors(t,e);const n=Fr.dot(Fr),a=Fr.dot(Lr),o=Fr.dot(jr),h=Lr.dot(Lr),l=Lr.dot(jr),c=n*h-a*a;if(0===c)return r.set(0,0,0),null;const u=1/c,d=(h*o-a*l)*u,p=(n*l-a*o)*u;return r.set(1-d-p,p,d)}static containsPoint(t,e,i,s){return null!==this.getBarycoord(t,e,i,s,Dr)&&(Dr.x>=0&&Dr.y>=0&&Dr.x+Dr.y<=1)}static getInterpolation(t,e,i,s,r,n,a,o){return null===this.getBarycoord(t,e,i,s,Dr)?(o.x=0,o.y=0,"z"in o&&(o.z=0),"w"in o&&(o.w=0),null):(o.setScalar(0),o.addScaledVector(r,Dr.x),o.addScaledVector(n,Dr.y),o.addScaledVector(a,Dr.z),o)}static getInterpolatedAttribute(t,e,i,s,r,n){return Hr.setScalar(0),Zr.setScalar(0),Gr.setScalar(0),Hr.fromBufferAttribute(t,e),Zr.fromBufferAttribute(t,i),Gr.fromBufferAttribute(t,s),n.setScalar(0),n.addScaledVector(Hr,r.x),n.addScaledVector(Zr,r.y),n.addScaledVector(Gr,r.z),n}static isFrontFacing(t,e,i,s){return Fr.subVectors(i,e),Lr.subVectors(t,e),Fr.cross(Lr).dot(s)<0}set(t,e,i){return this.a.copy(t),this.b.copy(e),this.c.copy(i),this}setFromPointsAndIndices(t,e,i,s){return this.a.copy(t[e]),this.b.copy(t[i]),this.c.copy(t[s]),this}setFromAttributeAndIndices(t,e,i,s){return this.a.fromBufferAttribute(t,e),this.b.fromBufferAttribute(t,i),this.c.fromBufferAttribute(t,s),this}clone(){return(new this.constructor).copy(this)}copy(t){return this.a.copy(t.a),this.b.copy(t.b),this.c.copy(t.c),this}getArea(){return Fr.subVectors(this.c,this.b),Lr.subVectors(this.a,this.b),.5*Fr.cross(Lr).length()}getMidpoint(t){return t.addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3)}getNormal(t){return $r.getNormal(this.a,this.b,this.c,t)}getPlane(t){return t.setFromCoplanarPoints(this.a,this.b,this.c)}getBarycoord(t,e){return $r.getBarycoord(t,this.a,this.b,this.c,e)}getInterpolation(t,e,i,s,r){return $r.getInterpolation(t,this.a,this.b,this.c,e,i,s,r)}containsPoint(t){return $r.containsPoint(t,this.a,this.b,this.c)}isFrontFacing(t){return $r.isFrontFacing(this.a,this.b,this.c,t)}intersectsBox(t){return t.intersectsTriangle(this)}closestPointToPoint(t,e){const i=this.a,s=this.b,r=this.c;let n,a;Wr.subVectors(s,i),Ur.subVectors(r,i),Jr.subVectors(t,i);const o=Wr.dot(Jr),h=Ur.dot(Jr);if(o<=0&&h<=0)return e.copy(i);Xr.subVectors(t,s);const l=Wr.dot(Xr),c=Ur.dot(Xr);if(l>=0&&c<=l)return e.copy(s);const u=o*c-l*h;if(u<=0&&o>=0&&l<=0)return n=o/(o-l),e.copy(i).addScaledVector(Wr,n);Yr.subVectors(t,r);const d=Wr.dot(Yr),p=Ur.dot(Yr);if(p>=0&&d<=p)return e.copy(r);const m=d*h-o*p;if(m<=0&&h>=0&&p<=0)return a=h/(h-p),e.copy(i).addScaledVector(Ur,a);const y=l*p-d*c;if(y<=0&&c-l>=0&&d-p>=0)return qr.subVectors(r,s),a=(c-l)/(c-l+(d-p)),e.copy(s).addScaledVector(qr,a);const g=1/(y+m+u);return n=m*g,a=u*g,e.copy(i).addScaledVector(Wr,n).addScaledVector(Ur,a)}equals(t){return t.a.equals(this.a)&&t.b.equals(this.b)&&t.c.equals(this.c)}}class Qr{constructor(t=new Ts(1/0,1/0,1/0),e=new Ts(-1/0,-1/0,-1/0)){this.isBox3=!0,this.min=t,this.max=e}set(t,e){return this.min.copy(t),this.max.copy(e),this}setFromArray(t){this.makeEmpty();for(let e=0,i=t.length;e=this.min.x&&t.x<=this.max.x&&t.y>=this.min.y&&t.y<=this.max.y&&t.z>=this.min.z&&t.z<=this.max.z}containsBox(t){return this.min.x<=t.min.x&&t.max.x<=this.max.x&&this.min.y<=t.min.y&&t.max.y<=this.max.y&&this.min.z<=t.min.z&&t.max.z<=this.max.z}getParameter(t,e){return e.set((t.x-this.min.x)/(this.max.x-this.min.x),(t.y-this.min.y)/(this.max.y-this.min.y),(t.z-this.min.z)/(this.max.z-this.min.z))}intersectsBox(t){return t.max.x>=this.min.x&&t.min.x<=this.max.x&&t.max.y>=this.min.y&&t.min.y<=this.max.y&&t.max.z>=this.min.z&&t.min.z<=this.max.z}intersectsSphere(t){return this.clampPoint(t.center,tn),tn.distanceToSquared(t.center)<=t.radius*t.radius}intersectsPlane(t){let e,i;return t.normal.x>0?(e=t.normal.x*this.min.x,i=t.normal.x*this.max.x):(e=t.normal.x*this.max.x,i=t.normal.x*this.min.x),t.normal.y>0?(e+=t.normal.y*this.min.y,i+=t.normal.y*this.max.y):(e+=t.normal.y*this.max.y,i+=t.normal.y*this.min.y),t.normal.z>0?(e+=t.normal.z*this.min.z,i+=t.normal.z*this.max.z):(e+=t.normal.z*this.max.z,i+=t.normal.z*this.min.z),e<=-t.constant&&i>=-t.constant}intersectsTriangle(t){if(this.isEmpty())return!1;this.getCenter(ln),cn.subVectors(this.max,ln),sn.subVectors(t.a,ln),rn.subVectors(t.b,ln),nn.subVectors(t.c,ln),an.subVectors(rn,sn),on.subVectors(nn,rn),hn.subVectors(sn,nn);let e=[0,-an.z,an.y,0,-on.z,on.y,0,-hn.z,hn.y,an.z,0,-an.x,on.z,0,-on.x,hn.z,0,-hn.x,-an.y,an.x,0,-on.y,on.x,0,-hn.y,hn.x,0];return!!pn(e,sn,rn,nn,cn)&&(e=[1,0,0,0,1,0,0,0,1],!!pn(e,sn,rn,nn,cn)&&(un.crossVectors(an,on),e=[un.x,un.y,un.z],pn(e,sn,rn,nn,cn)))}clampPoint(t,e){return e.copy(t).clamp(this.min,this.max)}distanceToPoint(t){return this.clampPoint(t,tn).distanceTo(t)}getBoundingSphere(t){return this.isEmpty()?t.makeEmpty():(this.getCenter(t.center),t.radius=.5*this.getSize(tn).length()),t}intersect(t){return this.min.max(t.min),this.max.min(t.max),this.isEmpty()&&this.makeEmpty(),this}union(t){return this.min.min(t.min),this.max.max(t.max),this}applyMatrix4(t){return this.isEmpty()||(Kr[0].set(this.min.x,this.min.y,this.min.z).applyMatrix4(t),Kr[1].set(this.min.x,this.min.y,this.max.z).applyMatrix4(t),Kr[2].set(this.min.x,this.max.y,this.min.z).applyMatrix4(t),Kr[3].set(this.min.x,this.max.y,this.max.z).applyMatrix4(t),Kr[4].set(this.max.x,this.min.y,this.min.z).applyMatrix4(t),Kr[5].set(this.max.x,this.min.y,this.max.z).applyMatrix4(t),Kr[6].set(this.max.x,this.max.y,this.min.z).applyMatrix4(t),Kr[7].set(this.max.x,this.max.y,this.max.z).applyMatrix4(t),this.setFromPoints(Kr)),this}translate(t){return this.min.add(t),this.max.add(t),this}equals(t){return t.min.equals(this.min)&&t.max.equals(this.max)}toJSON(){return{min:this.min.toArray(),max:this.max.toArray()}}fromJSON(t){return this.min.fromArray(t.min),this.max.fromArray(t.max),this}}const Kr=[new Ts,new Ts,new Ts,new Ts,new Ts,new Ts,new Ts,new Ts],tn=new Ts,en=new Qr,sn=new Ts,rn=new Ts,nn=new Ts,an=new Ts,on=new Ts,hn=new Ts,ln=new Ts,cn=new Ts,un=new Ts,dn=new Ts;function pn(t,e,i,s,r){for(let n=0,a=t.length-3;n<=a;n+=3){dn.fromArray(t,n);const a=r.x*Math.abs(dn.x)+r.y*Math.abs(dn.y)+r.z*Math.abs(dn.z),o=e.dot(dn),h=i.dot(dn),l=s.dot(dn);if(Math.max(-Math.max(o,h,l),Math.min(o,h,l))>a)return!1}return!0}const mn=yn();function yn(){const t=new ArrayBuffer(4),e=new Float32Array(t),i=new Uint32Array(t),s=new Uint32Array(512),r=new Uint32Array(512);for(let t=0;t<256;++t){const e=t-127;e<-27?(s[t]=0,s[256|t]=32768,r[t]=24,r[256|t]=24):e<-14?(s[t]=1024>>-e-14,s[256|t]=1024>>-e-14|32768,r[t]=-e-1,r[256|t]=-e-1):e<=15?(s[t]=e+15<<10,s[256|t]=e+15<<10|32768,r[t]=13,r[256|t]=13):e<128?(s[t]=31744,s[256|t]=64512,r[t]=24,r[256|t]=24):(s[t]=31744,s[256|t]=64512,r[t]=13,r[256|t]=13)}const n=new Uint32Array(2048),a=new Uint32Array(64),o=new Uint32Array(64);for(let t=1;t<1024;++t){let e=t<<13,i=0;for(;!(8388608&e);)e<<=1,i-=8388608;e&=-8388609,i+=947912704,n[t]=e|i}for(let t=1024;t<2048;++t)n[t]=939524096+(t-1024<<13);for(let t=1;t<31;++t)a[t]=t<<23;a[31]=1199570944,a[32]=2147483648;for(let t=33;t<63;++t)a[t]=2147483648+(t-32<<23);a[63]=3347054592;for(let t=1;t<64;++t)32!==t&&(o[t]=1024);return{floatView:e,uint32View:i,baseTable:s,shiftTable:r,mantissaTable:n,exponentTable:a,offsetTable:o}}function gn(t){Math.abs(t)>65504&&as("DataUtils.toHalfFloat(): Value out of range."),t=xs(t,-65504,65504),mn.floatView[0]=t;const e=mn.uint32View[0],i=e>>23&511;return mn.baseTable[i]+((8388607&e)>>mn.shiftTable[i])}function fn(t){const e=t>>10;return mn.uint32View[0]=mn.mantissaTable[mn.offsetTable[e]+(1023&t)]+mn.exponentTable[e],mn.floatView[0]}class xn{static toHalfFloat(t){return gn(t)}static fromHalfFloat(t){return fn(t)}}const bn=new Ts,vn=new _s;let wn=0;class Mn{constructor(t,e,i=!1){if(Array.isArray(t))throw new TypeError("THREE.BufferAttribute: array should be a Typed Array.");this.isBufferAttribute=!0,Object.defineProperty(this,"id",{value:wn++}),this.name="",this.array=t,this.itemSize=e,this.count=void 0!==t?t.length/e:0,this.normalized=i,this.usage=Oi,this.updateRanges=[],this.gpuType=Pt,this.version=0}onUploadCallback(){}set needsUpdate(t){!0===t&&this.version++}setUsage(t){return this.usage=t,this}addUpdateRange(t,e){this.updateRanges.push({start:t,count:e})}clearUpdateRanges(){this.updateRanges.length=0}copy(t){return this.name=t.name,this.array=new t.array.constructor(t.array),this.itemSize=t.itemSize,this.count=t.count,this.normalized=t.normalized,this.usage=t.usage,this.gpuType=t.gpuType,this}copyAt(t,e,i){t*=this.itemSize,i*=e.itemSize;for(let s=0,r=this.itemSize;sthis.radius*this.radius&&(e.sub(this.center).normalize(),e.multiplyScalar(this.radius).add(this.center)),e}getBoundingBox(t){return this.isEmpty()?(t.makeEmpty(),t):(t.set(this.center,this.center),t.expandByScalar(this.radius),t)}applyMatrix4(t){return this.center.applyMatrix4(t),this.radius=this.radius*t.getMaxScaleOnAxis(),this}translate(t){return this.center.add(t),this}expandByPoint(t){if(this.isEmpty())return this.center.copy(t),this.radius=0,this;Pn.subVectors(t,this.center);const e=Pn.lengthSq();if(e>this.radius*this.radius){const t=Math.sqrt(e),i=.5*(t-this.radius);this.center.addScaledVector(Pn,i/t),this.radius+=i}return this}union(t){return t.isEmpty()?this:this.isEmpty()?(this.copy(t),this):(!0===this.center.equals(t.center)?this.radius=Math.max(this.radius,t.radius):(Rn.subVectors(t.center,this.center).setLength(t.radius),this.expandByPoint(Pn.copy(t.center).add(Rn)),this.expandByPoint(Pn.copy(t.center).sub(Rn))),this)}equals(t){return t.center.equals(this.center)&&t.radius===this.radius}clone(){return(new this.constructor).copy(this)}toJSON(){return{radius:this.radius,center:this.center.toArray()}}fromJSON(t){return this.radius=t.radius,this.center.fromArray(t.center),this}}let Vn=0;const En=new Qs,Fn=new Ar,Ln=new Ts,jn=new Qr,Dn=new Qr,Wn=new Ts;class Un extends ds{constructor(){super(),this.isBufferGeometry=!0,Object.defineProperty(this,"id",{value:Vn++}),this.uuid=fs(),this.name="",this.type="BufferGeometry",this.index=null,this.indirect=null,this.indirectOffset=0,this.attributes={},this.morphAttributes={},this.morphTargetsRelative=!1,this.groups=[],this.boundingBox=null,this.boundingSphere=null,this.drawRange={start:0,count:1/0},this.userData={}}getIndex(){return this.index}setIndex(t){return Array.isArray(t)?this.index=new(function(t){for(let e=t.length-1;e>=0;--e)if(t[e]>=65535)return!0;return!1}(t)?In:zn)(t,1):this.index=t,this}setIndirect(t,e=0){return this.indirect=t,this.indirectOffset=e,this}getIndirect(){return this.indirect}getAttribute(t){return this.attributes[t]}setAttribute(t,e){return this.attributes[t]=e,this}deleteAttribute(t){return delete this.attributes[t],this}hasAttribute(t){return void 0!==this.attributes[t]}addGroup(t,e,i=0){this.groups.push({start:t,count:e,materialIndex:i})}clearGroups(){this.groups=[]}setDrawRange(t,e){this.drawRange.start=t,this.drawRange.count=e}applyMatrix4(t){const e=this.attributes.position;void 0!==e&&(e.applyMatrix4(t),e.needsUpdate=!0);const i=this.attributes.normal;if(void 0!==i){const e=(new Is).getNormalMatrix(t);i.applyNormalMatrix(e),i.needsUpdate=!0}const s=this.attributes.tangent;return void 0!==s&&(s.transformDirection(t),s.needsUpdate=!0),null!==this.boundingBox&&this.computeBoundingBox(),null!==this.boundingSphere&&this.computeBoundingSphere(),this}applyQuaternion(t){return En.makeRotationFromQuaternion(t),this.applyMatrix4(En),this}rotateX(t){return En.makeRotationX(t),this.applyMatrix4(En),this}rotateY(t){return En.makeRotationY(t),this.applyMatrix4(En),this}rotateZ(t){return En.makeRotationZ(t),this.applyMatrix4(En),this}translate(t,e,i){return En.makeTranslation(t,e,i),this.applyMatrix4(En),this}scale(t,e,i){return En.makeScale(t,e,i),this.applyMatrix4(En),this}lookAt(t){return Fn.lookAt(t),Fn.updateMatrix(),this.applyMatrix4(Fn.matrix),this}center(){return this.computeBoundingBox(),this.boundingBox.getCenter(Ln).negate(),this.translate(Ln.x,Ln.y,Ln.z),this}setFromPoints(t){const e=this.getAttribute("position");if(void 0===e){const e=[];for(let i=0,s=t.length;ie.count&&as("BufferGeometry: Buffer size too small for points data. Use .dispose() and create a new geometry."),e.needsUpdate=!0}return this}computeBoundingBox(){null===this.boundingBox&&(this.boundingBox=new Qr);const t=this.attributes.position,e=this.morphAttributes.position;if(t&&t.isGLBufferAttribute)return os("BufferGeometry.computeBoundingBox(): GLBufferAttribute requires a manual bounding box.",this),void this.boundingBox.set(new Ts(-1/0,-1/0,-1/0),new Ts(1/0,1/0,1/0));if(void 0!==t){if(this.boundingBox.setFromBufferAttribute(t),e)for(let t=0,i=e.length;t0&&(t.userData=this.userData),void 0!==this.parameters){const e=this.parameters;for(const i in e)void 0!==e[i]&&(t[i]=e[i]);return t}t.data={attributes:{}};const e=this.index;null!==e&&(t.data.index={type:e.array.constructor.name,array:Array.prototype.slice.call(e.array)});const i=this.attributes;for(const e in i){const s=i[e];t.data.attributes[e]=s.toJSON(t.data)}const s={};let r=!1;for(const e in this.morphAttributes){const i=this.morphAttributes[e],n=[];for(let e=0,s=i.length;e0&&(s[e]=n,r=!0)}r&&(t.data.morphAttributes=s,t.data.morphTargetsRelative=this.morphTargetsRelative);const n=this.groups;n.length>0&&(t.data.groups=JSON.parse(JSON.stringify(n)));const a=this.boundingSphere;return null!==a&&(t.data.boundingSphere=a.toJSON()),t}clone(){return(new this.constructor).copy(this)}copy(t){this.index=null,this.attributes={},this.morphAttributes={},this.groups=[],this.boundingBox=null,this.boundingSphere=null;const e={};this.name=t.name;const i=t.index;null!==i&&this.setIndex(i.clone());const s=t.attributes;for(const t in s){const i=s[t];this.setAttribute(t,i.clone(e))}const r=t.morphAttributes;for(const t in r){const i=[],s=r[t];for(let t=0,r=s.length;t0!=t>0&&this.version++,this._alphaTest=t}onBeforeRender(){}onBeforeCompile(){}customProgramCacheKey(){return this.onBeforeCompile.toString()}setValues(t){if(void 0!==t)for(const e in t){const i=t[e];if(void 0===i){as(`Material: parameter '${e}' has value of undefined.`);continue}const s=this[e];void 0!==s?s&&s.isColor?s.set(i):s&&s.isVector3&&i&&i.isVector3?s.copy(i):this[e]=i:as(`Material: '${e}' is not a property of THREE.${this.type}.`)}}toJSON(t){const e=void 0===t||"string"==typeof t;e&&(t={textures:{},images:{}});const i={metadata:{version:4.7,type:"Material",generator:"Material.toJSON"}};function s(t){const e=[];for(const i in t){const s=t[i];delete s.metadata,e.push(s)}return e}if(i.uuid=this.uuid,i.type=this.type,""!==this.name&&(i.name=this.name),this.color&&this.color.isColor&&(i.color=this.color.getHex()),void 0!==this.roughness&&(i.roughness=this.roughness),void 0!==this.metalness&&(i.metalness=this.metalness),void 0!==this.sheen&&(i.sheen=this.sheen),this.sheenColor&&this.sheenColor.isColor&&(i.sheenColor=this.sheenColor.getHex()),void 0!==this.sheenRoughness&&(i.sheenRoughness=this.sheenRoughness),this.emissive&&this.emissive.isColor&&(i.emissive=this.emissive.getHex()),void 0!==this.emissiveIntensity&&1!==this.emissiveIntensity&&(i.emissiveIntensity=this.emissiveIntensity),this.specular&&this.specular.isColor&&(i.specular=this.specular.getHex()),void 0!==this.specularIntensity&&(i.specularIntensity=this.specularIntensity),this.specularColor&&this.specularColor.isColor&&(i.specularColor=this.specularColor.getHex()),void 0!==this.shininess&&(i.shininess=this.shininess),void 0!==this.clearcoat&&(i.clearcoat=this.clearcoat),void 0!==this.clearcoatRoughness&&(i.clearcoatRoughness=this.clearcoatRoughness),this.clearcoatMap&&this.clearcoatMap.isTexture&&(i.clearcoatMap=this.clearcoatMap.toJSON(t).uuid),this.clearcoatRoughnessMap&&this.clearcoatRoughnessMap.isTexture&&(i.clearcoatRoughnessMap=this.clearcoatRoughnessMap.toJSON(t).uuid),this.clearcoatNormalMap&&this.clearcoatNormalMap.isTexture&&(i.clearcoatNormalMap=this.clearcoatNormalMap.toJSON(t).uuid,i.clearcoatNormalScale=this.clearcoatNormalScale.toArray()),this.sheenColorMap&&this.sheenColorMap.isTexture&&(i.sheenColorMap=this.sheenColorMap.toJSON(t).uuid),this.sheenRoughnessMap&&this.sheenRoughnessMap.isTexture&&(i.sheenRoughnessMap=this.sheenRoughnessMap.toJSON(t).uuid),void 0!==this.dispersion&&(i.dispersion=this.dispersion),void 0!==this.iridescence&&(i.iridescence=this.iridescence),void 0!==this.iridescenceIOR&&(i.iridescenceIOR=this.iridescenceIOR),void 0!==this.iridescenceThicknessRange&&(i.iridescenceThicknessRange=this.iridescenceThicknessRange),this.iridescenceMap&&this.iridescenceMap.isTexture&&(i.iridescenceMap=this.iridescenceMap.toJSON(t).uuid),this.iridescenceThicknessMap&&this.iridescenceThicknessMap.isTexture&&(i.iridescenceThicknessMap=this.iridescenceThicknessMap.toJSON(t).uuid),void 0!==this.anisotropy&&(i.anisotropy=this.anisotropy),void 0!==this.anisotropyRotation&&(i.anisotropyRotation=this.anisotropyRotation),this.anisotropyMap&&this.anisotropyMap.isTexture&&(i.anisotropyMap=this.anisotropyMap.toJSON(t).uuid),this.map&&this.map.isTexture&&(i.map=this.map.toJSON(t).uuid),this.matcap&&this.matcap.isTexture&&(i.matcap=this.matcap.toJSON(t).uuid),this.alphaMap&&this.alphaMap.isTexture&&(i.alphaMap=this.alphaMap.toJSON(t).uuid),this.lightMap&&this.lightMap.isTexture&&(i.lightMap=this.lightMap.toJSON(t).uuid,i.lightMapIntensity=this.lightMapIntensity),this.aoMap&&this.aoMap.isTexture&&(i.aoMap=this.aoMap.toJSON(t).uuid,i.aoMapIntensity=this.aoMapIntensity),this.bumpMap&&this.bumpMap.isTexture&&(i.bumpMap=this.bumpMap.toJSON(t).uuid,i.bumpScale=this.bumpScale),this.normalMap&&this.normalMap.isTexture&&(i.normalMap=this.normalMap.toJSON(t).uuid,i.normalMapType=this.normalMapType,i.normalScale=this.normalScale.toArray()),this.displacementMap&&this.displacementMap.isTexture&&(i.displacementMap=this.displacementMap.toJSON(t).uuid,i.displacementScale=this.displacementScale,i.displacementBias=this.displacementBias),this.roughnessMap&&this.roughnessMap.isTexture&&(i.roughnessMap=this.roughnessMap.toJSON(t).uuid),this.metalnessMap&&this.metalnessMap.isTexture&&(i.metalnessMap=this.metalnessMap.toJSON(t).uuid),this.emissiveMap&&this.emissiveMap.isTexture&&(i.emissiveMap=this.emissiveMap.toJSON(t).uuid),this.specularMap&&this.specularMap.isTexture&&(i.specularMap=this.specularMap.toJSON(t).uuid),this.specularIntensityMap&&this.specularIntensityMap.isTexture&&(i.specularIntensityMap=this.specularIntensityMap.toJSON(t).uuid),this.specularColorMap&&this.specularColorMap.isTexture&&(i.specularColorMap=this.specularColorMap.toJSON(t).uuid),this.envMap&&this.envMap.isTexture&&(i.envMap=this.envMap.toJSON(t).uuid,void 0!==this.combine&&(i.combine=this.combine)),void 0!==this.envMapRotation&&(i.envMapRotation=this.envMapRotation.toArray()),void 0!==this.envMapIntensity&&(i.envMapIntensity=this.envMapIntensity),void 0!==this.reflectivity&&(i.reflectivity=this.reflectivity),void 0!==this.refractionRatio&&(i.refractionRatio=this.refractionRatio),this.gradientMap&&this.gradientMap.isTexture&&(i.gradientMap=this.gradientMap.toJSON(t).uuid),void 0!==this.transmission&&(i.transmission=this.transmission),this.transmissionMap&&this.transmissionMap.isTexture&&(i.transmissionMap=this.transmissionMap.toJSON(t).uuid),void 0!==this.thickness&&(i.thickness=this.thickness),this.thicknessMap&&this.thicknessMap.isTexture&&(i.thicknessMap=this.thicknessMap.toJSON(t).uuid),void 0!==this.attenuationDistance&&this.attenuationDistance!==1/0&&(i.attenuationDistance=this.attenuationDistance),void 0!==this.attenuationColor&&(i.attenuationColor=this.attenuationColor.getHex()),void 0!==this.size&&(i.size=this.size),null!==this.shadowSide&&(i.shadowSide=this.shadowSide),void 0!==this.sizeAttenuation&&(i.sizeAttenuation=this.sizeAttenuation),1!==this.blending&&(i.blending=this.blending),0!==this.side&&(i.side=this.side),!0===this.vertexColors&&(i.vertexColors=!0),this.opacity<1&&(i.opacity=this.opacity),!0===this.transparent&&(i.transparent=!0),204!==this.blendSrc&&(i.blendSrc=this.blendSrc),205!==this.blendDst&&(i.blendDst=this.blendDst),100!==this.blendEquation&&(i.blendEquation=this.blendEquation),null!==this.blendSrcAlpha&&(i.blendSrcAlpha=this.blendSrcAlpha),null!==this.blendDstAlpha&&(i.blendDstAlpha=this.blendDstAlpha),null!==this.blendEquationAlpha&&(i.blendEquationAlpha=this.blendEquationAlpha),this.blendColor&&this.blendColor.isColor&&(i.blendColor=this.blendColor.getHex()),0!==this.blendAlpha&&(i.blendAlpha=this.blendAlpha),3!==this.depthFunc&&(i.depthFunc=this.depthFunc),!1===this.depthTest&&(i.depthTest=this.depthTest),!1===this.depthWrite&&(i.depthWrite=this.depthWrite),!1===this.colorWrite&&(i.colorWrite=this.colorWrite),255!==this.stencilWriteMask&&(i.stencilWriteMask=this.stencilWriteMask),519!==this.stencilFunc&&(i.stencilFunc=this.stencilFunc),0!==this.stencilRef&&(i.stencilRef=this.stencilRef),255!==this.stencilFuncMask&&(i.stencilFuncMask=this.stencilFuncMask),this.stencilFail!==li&&(i.stencilFail=this.stencilFail),this.stencilZFail!==li&&(i.stencilZFail=this.stencilZFail),this.stencilZPass!==li&&(i.stencilZPass=this.stencilZPass),!0===this.stencilWrite&&(i.stencilWrite=this.stencilWrite),void 0!==this.rotation&&0!==this.rotation&&(i.rotation=this.rotation),!0===this.polygonOffset&&(i.polygonOffset=!0),0!==this.polygonOffsetFactor&&(i.polygonOffsetFactor=this.polygonOffsetFactor),0!==this.polygonOffsetUnits&&(i.polygonOffsetUnits=this.polygonOffsetUnits),void 0!==this.linewidth&&1!==this.linewidth&&(i.linewidth=this.linewidth),void 0!==this.dashSize&&(i.dashSize=this.dashSize),void 0!==this.gapSize&&(i.gapSize=this.gapSize),void 0!==this.scale&&(i.scale=this.scale),!0===this.dithering&&(i.dithering=!0),this.alphaTest>0&&(i.alphaTest=this.alphaTest),!0===this.alphaHash&&(i.alphaHash=!0),!0===this.alphaToCoverage&&(i.alphaToCoverage=!0),!0===this.premultipliedAlpha&&(i.premultipliedAlpha=!0),!0===this.forceSinglePass&&(i.forceSinglePass=!0),!1===this.allowOverride&&(i.allowOverride=!1),!0===this.wireframe&&(i.wireframe=!0),this.wireframeLinewidth>1&&(i.wireframeLinewidth=this.wireframeLinewidth),"round"!==this.wireframeLinecap&&(i.wireframeLinecap=this.wireframeLinecap),"round"!==this.wireframeLinejoin&&(i.wireframeLinejoin=this.wireframeLinejoin),!0===this.flatShading&&(i.flatShading=!0),!1===this.visible&&(i.visible=!1),!1===this.toneMapped&&(i.toneMapped=!1),!1===this.fog&&(i.fog=!1),Object.keys(this.userData).length>0&&(i.userData=this.userData),e){const e=s(t.textures),r=s(t.images);e.length>0&&(i.textures=e),r.length>0&&(i.images=r)}return i}clone(){return(new this.constructor).copy(this)}copy(t){this.name=t.name,this.blending=t.blending,this.side=t.side,this.vertexColors=t.vertexColors,this.opacity=t.opacity,this.transparent=t.transparent,this.blendSrc=t.blendSrc,this.blendDst=t.blendDst,this.blendEquation=t.blendEquation,this.blendSrcAlpha=t.blendSrcAlpha,this.blendDstAlpha=t.blendDstAlpha,this.blendEquationAlpha=t.blendEquationAlpha,this.blendColor.copy(t.blendColor),this.blendAlpha=t.blendAlpha,this.depthFunc=t.depthFunc,this.depthTest=t.depthTest,this.depthWrite=t.depthWrite,this.stencilWriteMask=t.stencilWriteMask,this.stencilFunc=t.stencilFunc,this.stencilRef=t.stencilRef,this.stencilFuncMask=t.stencilFuncMask,this.stencilFail=t.stencilFail,this.stencilZFail=t.stencilZFail,this.stencilZPass=t.stencilZPass,this.stencilWrite=t.stencilWrite;const e=t.clippingPlanes;let i=null;if(null!==e){const t=e.length;i=new Array(t);for(let s=0;s!==t;++s)i[s]=e[s].clone()}return this.clippingPlanes=i,this.clipIntersection=t.clipIntersection,this.clipShadows=t.clipShadows,this.shadowSide=t.shadowSide,this.colorWrite=t.colorWrite,this.precision=t.precision,this.polygonOffset=t.polygonOffset,this.polygonOffsetFactor=t.polygonOffsetFactor,this.polygonOffsetUnits=t.polygonOffsetUnits,this.dithering=t.dithering,this.alphaTest=t.alphaTest,this.alphaHash=t.alphaHash,this.alphaToCoverage=t.alphaToCoverage,this.premultipliedAlpha=t.premultipliedAlpha,this.forceSinglePass=t.forceSinglePass,this.allowOverride=t.allowOverride,this.visible=t.visible,this.toneMapped=t.toneMapped,this.userData=JSON.parse(JSON.stringify(t.userData)),this}dispose(){this.dispatchEvent({type:"dispose"})}set needsUpdate(t){!0===t&&this.version++}}class Gn extends Zn{constructor(t){super(),this.isSpriteMaterial=!0,this.type="SpriteMaterial",this.color=new Pr(16777215),this.map=null,this.alphaMap=null,this.rotation=0,this.sizeAttenuation=!0,this.transparent=!0,this.fog=!0,this.setValues(t)}copy(t){return super.copy(t),this.color.copy(t.color),this.map=t.map,this.alphaMap=t.alphaMap,this.rotation=t.rotation,this.sizeAttenuation=t.sizeAttenuation,this.fog=t.fog,this}}const $n=new Ts,Qn=new Ts,Kn=new Ts,ta=new _s,ea=new _s,ia=new Qs,sa=new Ts,ra=new Ts,na=new Ts,aa=new _s,oa=new _s,ha=new _s;class la extends Ar{constructor(t=new Gn){if(super(),this.isSprite=!0,this.type="Sprite",void 0===Yn){Yn=new Un;const t=new Float32Array([-.5,-.5,0,0,0,.5,-.5,0,1,0,.5,.5,0,1,1,-.5,.5,0,0,1]),e=new qn(t,5);Yn.setIndex([0,1,2,0,2,3]),Yn.setAttribute("position",new Xn(e,3,0,!1)),Yn.setAttribute("uv",new Xn(e,2,3,!1))}this.geometry=Yn,this.material=t,this.center=new _s(.5,.5),this.count=1}raycast(t,e){null===t.camera&&os('Sprite: "Raycaster.camera" needs to be set in order to raycast against sprites.'),Qn.setFromMatrixScale(this.matrixWorld),ia.copy(t.camera.matrixWorld),this.modelViewMatrix.multiplyMatrices(t.camera.matrixWorldInverse,this.matrixWorld),Kn.setFromMatrixPosition(this.modelViewMatrix),t.camera.isPerspectiveCamera&&!1===this.material.sizeAttenuation&&Qn.multiplyScalar(-Kn.z);const i=this.material.rotation;let s,r;0!==i&&(r=Math.cos(i),s=Math.sin(i));const n=this.center;ca(sa.set(-.5,-.5,0),Kn,n,Qn,s,r),ca(ra.set(.5,-.5,0),Kn,n,Qn,s,r),ca(na.set(.5,.5,0),Kn,n,Qn,s,r),aa.set(0,0),oa.set(1,0),ha.set(1,1);let a=t.ray.intersectTriangle(sa,ra,na,!1,$n);if(null===a&&(ca(ra.set(-.5,.5,0),Kn,n,Qn,s,r),oa.set(0,1),a=t.ray.intersectTriangle(sa,na,ra,!1,$n),null===a))return;const o=t.ray.origin.distanceTo($n);ot.far||e.push({distance:o,point:$n.clone(),uv:$r.getInterpolation($n,sa,ra,na,aa,oa,ha,new _s),face:null,object:this})}copy(t,e){return super.copy(t,e),void 0!==t.center&&this.center.copy(t.center),this.material=t.material,this}}function ca(t,e,i,s,r,n){ta.subVectors(t,i).addScalar(.5).multiply(s),void 0!==r?(ea.x=n*ta.x-r*ta.y,ea.y=r*ta.x+n*ta.y):ea.copy(ta),t.copy(e),t.x+=ea.x,t.y+=ea.y,t.applyMatrix4(ia)}const ua=new Ts,da=new Ts;class pa extends Ar{constructor(){super(),this.isLOD=!0,this._currentLevel=0,this.type="LOD",Object.defineProperties(this,{levels:{enumerable:!0,value:[]}}),this.autoUpdate=!0}copy(t){super.copy(t,!1);const e=t.levels;for(let t=0,i=e.length;t0){let i,s;for(i=1,s=e.length;i0){ua.setFromMatrixPosition(this.matrixWorld);const i=t.ray.origin.distanceTo(ua);this.getObjectForDistance(i).raycast(t,e)}}update(t){const e=this.levels;if(e.length>1){ua.setFromMatrixPosition(t.matrixWorld),da.setFromMatrixPosition(this.matrixWorld);const i=ua.distanceTo(da)/t.zoom;let s,r;for(e[0].object.visible=!0,s=1,r=e.length;s=t))break;e[s-1].object.visible=!1,e[s].object.visible=!0}for(this._currentLevel=s-1;s0)if(c=n*o-a,u=n*a-o,p=r*l,c>=0)if(u>=-p)if(u<=p){const t=1/l;c*=t,u*=t,d=c*(c+n*u+2*a)+u*(n*c+u+2*o)+h}else u=r,c=Math.max(0,-(n*u+a)),d=-c*c+u*(u+2*o)+h;else u=-r,c=Math.max(0,-(n*u+a)),d=-c*c+u*(u+2*o)+h;else u<=-p?(c=Math.max(0,-(-n*r+a)),u=c>0?-r:Math.min(Math.max(-r,-o),r),d=-c*c+u*(u+2*o)+h):u<=p?(c=0,u=Math.min(Math.max(-r,-o),r),d=u*(u+2*o)+h):(c=Math.max(0,-(n*r+a)),u=c>0?r:Math.min(Math.max(-r,-o),r),d=-c*c+u*(u+2*o)+h);else u=n>0?-r:r,c=Math.max(0,-(n*u+a)),d=-c*c+u*(u+2*o)+h;return i&&i.copy(this.origin).addScaledVector(this.direction,c),s&&s.copy(ya).addScaledVector(ga,u),d}intersectSphere(t,e){ma.subVectors(t.center,this.origin);const i=ma.dot(this.direction),s=ma.dot(ma)-i*i,r=t.radius*t.radius;if(s>r)return null;const n=Math.sqrt(r-s),a=i-n,o=i+n;return o<0?null:a<0?this.at(o,e):this.at(a,e)}intersectsSphere(t){return!(t.radius<0)&&this.distanceSqToPoint(t.center)<=t.radius*t.radius}distanceToPlane(t){const e=t.normal.dot(this.direction);if(0===e)return 0===t.distanceToPoint(this.origin)?0:null;const i=-(this.origin.dot(t.normal)+t.constant)/e;return i>=0?i:null}intersectPlane(t,e){const i=this.distanceToPlane(t);return null===i?null:this.at(i,e)}intersectsPlane(t){const e=t.distanceToPoint(this.origin);if(0===e)return!0;return t.normal.dot(this.direction)*e<0}intersectBox(t,e){let i,s,r,n,a,o;const h=1/this.direction.x,l=1/this.direction.y,c=1/this.direction.z,u=this.origin;return h>=0?(i=(t.min.x-u.x)*h,s=(t.max.x-u.x)*h):(i=(t.max.x-u.x)*h,s=(t.min.x-u.x)*h),l>=0?(r=(t.min.y-u.y)*l,n=(t.max.y-u.y)*l):(r=(t.max.y-u.y)*l,n=(t.min.y-u.y)*l),i>n||r>s?null:((r>i||isNaN(i))&&(i=r),(n=0?(a=(t.min.z-u.z)*c,o=(t.max.z-u.z)*c):(a=(t.max.z-u.z)*c,o=(t.min.z-u.z)*c),i>o||a>s?null:((a>i||i!=i)&&(i=a),(o=0?i:s,e)))}intersectsBox(t){return null!==this.intersectBox(t,ma)}intersectTriangle(t,e,i,s,r){xa.subVectors(e,t),ba.subVectors(i,t),va.crossVectors(xa,ba);let n,a=this.direction.dot(va);if(a>0){if(s)return null;n=1}else{if(!(a<0))return null;n=-1,a=-a}fa.subVectors(this.origin,t);const o=n*this.direction.dot(ba.crossVectors(fa,ba));if(o<0)return null;const h=n*this.direction.dot(xa.cross(fa));if(h<0)return null;if(o+h>a)return null;const l=-n*fa.dot(va);return l<0?null:this.at(l/a,r)}applyMatrix4(t){return this.origin.applyMatrix4(t),this.direction.transformDirection(t),this}equals(t){return t.origin.equals(this.origin)&&t.direction.equals(this.direction)}clone(){return(new this.constructor).copy(this)}}class Ma extends Zn{constructor(t){super(),this.isMeshBasicMaterial=!0,this.type="MeshBasicMaterial",this.color=new Pr(16777215),this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.envMapRotation=new hr,this.combine=0,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.fog=!0,this.setValues(t)}copy(t){return super.copy(t),this.color.copy(t.color),this.map=t.map,this.lightMap=t.lightMap,this.lightMapIntensity=t.lightMapIntensity,this.aoMap=t.aoMap,this.aoMapIntensity=t.aoMapIntensity,this.specularMap=t.specularMap,this.alphaMap=t.alphaMap,this.envMap=t.envMap,this.envMapRotation.copy(t.envMapRotation),this.combine=t.combine,this.reflectivity=t.reflectivity,this.refractionRatio=t.refractionRatio,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.wireframeLinecap=t.wireframeLinecap,this.wireframeLinejoin=t.wireframeLinejoin,this.fog=t.fog,this}}const Sa=new Qs,_a=new wa,Aa=new Nn,Ta=new Ts,za=new Ts,Ca=new Ts,Ia=new Ts,Ba=new Ts,ka=new Ts,Oa=new Ts,Pa=new Ts;class Ra extends Ar{constructor(t=new Un,e=new Ma){super(),this.isMesh=!0,this.type="Mesh",this.geometry=t,this.material=e,this.morphTargetDictionary=void 0,this.morphTargetInfluences=void 0,this.count=1,this.updateMorphTargets()}copy(t,e){return super.copy(t,e),void 0!==t.morphTargetInfluences&&(this.morphTargetInfluences=t.morphTargetInfluences.slice()),void 0!==t.morphTargetDictionary&&(this.morphTargetDictionary=Object.assign({},t.morphTargetDictionary)),this.material=Array.isArray(t.material)?t.material.slice():t.material,this.geometry=t.geometry,this}updateMorphTargets(){const t=this.geometry.morphAttributes,e=Object.keys(t);if(e.length>0){const i=t[e[0]];if(void 0!==i){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let t=0,e=i.length;t(t.far-t.near)**2)return}Sa.copy(r).invert(),_a.copy(t.ray).applyMatrix4(Sa),null!==i.boundingBox&&!1===_a.intersectsBox(i.boundingBox)||this._computeIntersections(t,e,_a)}}_computeIntersections(t,e,i){let s;const r=this.geometry,n=this.material,a=r.index,o=r.attributes.position,h=r.attributes.uv,l=r.attributes.uv1,c=r.attributes.normal,u=r.groups,d=r.drawRange;if(null!==a)if(Array.isArray(n))for(let r=0,o=u.length;ri.far?null:{distance:l,point:Pa.clone(),object:t}}(t,e,i,s,za,Ca,Ia,Oa);if(c){const t=new Ts;$r.getBarycoord(Oa,za,Ca,Ia,t),r&&(c.uv=$r.getInterpolatedAttribute(r,o,h,l,t,new _s)),n&&(c.uv1=$r.getInterpolatedAttribute(n,o,h,l,t,new _s)),a&&(c.normal=$r.getInterpolatedAttribute(a,o,h,l,t,new Ts),c.normal.dot(s.direction)>0&&c.normal.multiplyScalar(-1));const e={a:o,b:h,c:l,normal:new Ts,materialIndex:0};$r.getNormal(za,Ca,Ia,e.normal),c.face=e,c.barycoord=t}return c}const Va=new Js,Ea=new Js,Fa=new Js,La=new Js,ja=new Qs,Da=new Ts,Wa=new Nn,Ua=new Qs,qa=new wa;class Ja extends Ra{constructor(t,e){super(t,e),this.isSkinnedMesh=!0,this.type="SkinnedMesh",this.bindMode=at,this.bindMatrix=new Qs,this.bindMatrixInverse=new Qs,this.boundingBox=null,this.boundingSphere=null}computeBoundingBox(){const t=this.geometry;null===this.boundingBox&&(this.boundingBox=new Qr),this.boundingBox.makeEmpty();const e=t.getAttribute("position");for(let t=0;t1?null:e.copy(t.start).addScaledVector(i,r)}intersectsLine(t){const e=this.distanceToPoint(t.start),i=this.distanceToPoint(t.end);return e<0&&i>0||i<0&&e>0}intersectsBox(t){return t.intersectsPlane(this)}intersectsSphere(t){return t.intersectsPlane(this)}coplanarPoint(t){return t.copy(this.normal).multiplyScalar(-this.constant)}applyMatrix4(t,e){const i=e||ho.getNormalMatrix(t),s=this.coplanarPoint(ao).applyMatrix4(t),r=this.normal.applyMatrix3(i).normalize();return this.constant=-s.dot(r),this}translate(t){return this.constant-=t.dot(this.normal),this}equals(t){return t.normal.equals(this.normal)&&t.constant===this.constant}clone(){return(new this.constructor).copy(this)}}const co=new Nn,uo=new _s(.5,.5),po=new Ts;class mo{constructor(t=new lo,e=new lo,i=new lo,s=new lo,r=new lo,n=new lo){this.planes=[t,e,i,s,r,n]}set(t,e,i,s,r,n){const a=this.planes;return a[0].copy(t),a[1].copy(e),a[2].copy(i),a[3].copy(s),a[4].copy(r),a[5].copy(n),this}copy(t){const e=this.planes;for(let i=0;i<6;i++)e[i].copy(t.planes[i]);return this}setFromProjectionMatrix(t,e=2e3,i=!1){const s=this.planes,r=t.elements,n=r[0],a=r[1],o=r[2],h=r[3],l=r[4],c=r[5],u=r[6],d=r[7],p=r[8],m=r[9],y=r[10],g=r[11],f=r[12],x=r[13],b=r[14],v=r[15];if(s[0].setComponents(h-n,d-l,g-p,v-f).normalize(),s[1].setComponents(h+n,d+l,g+p,v+f).normalize(),s[2].setComponents(h+a,d+c,g+m,v+x).normalize(),s[3].setComponents(h-a,d-c,g-m,v-x).normalize(),i)s[4].setComponents(o,u,y,b).normalize(),s[5].setComponents(h-o,d-u,g-y,v-b).normalize();else if(s[4].setComponents(h-o,d-u,g-y,v-b).normalize(),e===Ui)s[5].setComponents(h+o,d+u,g+y,v+b).normalize();else{if(e!==qi)throw new Error("THREE.Frustum.setFromProjectionMatrix(): Invalid coordinate system: "+e);s[5].setComponents(o,u,y,b).normalize()}return this}intersectsObject(t){if(void 0!==t.boundingSphere)null===t.boundingSphere&&t.computeBoundingSphere(),co.copy(t.boundingSphere).applyMatrix4(t.matrixWorld);else{const e=t.geometry;null===e.boundingSphere&&e.computeBoundingSphere(),co.copy(e.boundingSphere).applyMatrix4(t.matrixWorld)}return this.intersectsSphere(co)}intersectsSprite(t){co.center.set(0,0,0);const e=uo.distanceTo(t.center);return co.radius=.7071067811865476+e,co.applyMatrix4(t.matrixWorld),this.intersectsSphere(co)}intersectsSphere(t){const e=this.planes,i=t.center,s=-t.radius;for(let t=0;t<6;t++){if(e[t].distanceToPoint(i)0?t.max.x:t.min.x,po.y=s.normal.y>0?t.max.y:t.min.y,po.z=s.normal.z>0?t.max.z:t.min.z,s.distanceToPoint(po)<0)return!1}return!0}containsPoint(t){const e=this.planes;for(let i=0;i<6;i++)if(e[i].distanceToPoint(t)<0)return!1;return!0}clone(){return(new this.constructor).copy(this)}}const yo=new Qs,go=new mo;class fo{constructor(){this.coordinateSystem=Ui}intersectsObject(t,e){if(!e.isArrayCamera||0===e.cameras.length)return!1;for(let i=0;i=r.length&&r.push({start:-1,count:-1,z:-1,index:-1});const a=r[this.index];n.push(a),this.index++,a.start=t,a.count=e,a.z=i,a.index=s}reset(){this.list.length=0,this.index=0}}const Mo=new Qs,So=new Pr(1,1,1),_o=new mo,Ao=new fo,To=new Qr,zo=new Nn,Co=new Ts,Io=new Ts,Bo=new Ts,ko=new wo,Oo=new Ra,Po=[];function Ro(t,e,i=0){const s=e.itemSize;if(t.isInterleavedBufferAttribute||t.array.constructor!==e.array.constructor){const r=t.count;for(let n=0;n65535?new Uint32Array(s):new Uint16Array(s);e.setIndex(new Mn(t,1))}this._geometryInitialized=!0}}_validateGeometry(t){const e=this.geometry;if(Boolean(t.getIndex())!==Boolean(e.getIndex()))throw new Error('THREE.BatchedMesh: All geometries must consistently have "index".');for(const i in e.attributes){if(!t.hasAttribute(i))throw new Error(`THREE.BatchedMesh: Added geometry missing "${i}". All geometries must have consistent attributes.`);const s=t.getAttribute(i),r=e.getAttribute(i);if(s.itemSize!==r.itemSize||s.normalized!==r.normalized)throw new Error("THREE.BatchedMesh: All attributes must have a consistent itemSize and normalized value.")}}validateInstanceId(t){const e=this._instanceInfo;if(t<0||t>=e.length||!1===e[t].active)throw new Error(`THREE.BatchedMesh: Invalid instanceId ${t}. Instance is either out of range or has been deleted.`)}validateGeometryId(t){const e=this._geometryInfo;if(t<0||t>=e.length||!1===e[t].active)throw new Error(`THREE.BatchedMesh: Invalid geometryId ${t}. Geometry is either out of range or has been deleted.`)}setCustomSort(t){return this.customSort=t,this}computeBoundingBox(){null===this.boundingBox&&(this.boundingBox=new Qr);const t=this.boundingBox,e=this._instanceInfo;t.makeEmpty();for(let i=0,s=e.length;i=this.maxInstanceCount&&0===this._availableInstanceIds.length)throw new Error("THREE.BatchedMesh: Maximum item count reached.");const e={visible:!0,active:!0,geometryIndex:t};let i=null;this._availableInstanceIds.length>0?(this._availableInstanceIds.sort(xo),i=this._availableInstanceIds.shift(),this._instanceInfo[i]=e):(i=this._instanceInfo.length,this._instanceInfo.push(e));const s=this._matricesTexture;Mo.identity().toArray(s.image.data,16*i),s.needsUpdate=!0;const r=this._colorsTexture;return r&&(So.toArray(r.image.data,4*i),r.needsUpdate=!0),this._visibilityChanged=!0,i}addGeometry(t,e=-1,i=-1){this._initializeGeometry(t),this._validateGeometry(t);const s={vertexStart:-1,vertexCount:-1,reservedVertexCount:-1,indexStart:-1,indexCount:-1,reservedIndexCount:-1,start:-1,count:-1,boundingBox:null,boundingSphere:null,active:!0},r=this._geometryInfo;s.vertexStart=this._nextVertexStart,s.reservedVertexCount=-1===e?t.getAttribute("position").count:e;const n=t.getIndex();if(null!==n&&(s.indexStart=this._nextIndexStart,s.reservedIndexCount=-1===i?n.count:i),-1!==s.indexStart&&s.indexStart+s.reservedIndexCount>this._maxIndexCount||s.vertexStart+s.reservedVertexCount>this._maxVertexCount)throw new Error("THREE.BatchedMesh: Reserved space request exceeds the maximum buffer size.");let a;return this._availableGeometryIds.length>0?(this._availableGeometryIds.sort(xo),a=this._availableGeometryIds.shift(),r[a]=s):(a=this._geometryCount,this._geometryCount++,r.push(s)),this.setGeometryAt(a,t),this._nextIndexStart=s.indexStart+s.reservedIndexCount,this._nextVertexStart=s.vertexStart+s.reservedVertexCount,a}setGeometryAt(t,e){if(t>=this._geometryCount)throw new Error("THREE.BatchedMesh: Maximum geometry count reached.");this._validateGeometry(e);const i=this.geometry,s=null!==i.getIndex(),r=i.getIndex(),n=e.getIndex(),a=this._geometryInfo[t];if(s&&n.count>a.reservedIndexCount||e.attributes.position.count>a.reservedVertexCount)throw new Error("THREE.BatchedMesh: Reserved space not large enough for provided geometry.");const o=a.vertexStart,h=a.reservedVertexCount;a.vertexCount=e.getAttribute("position").count;for(const t in i.attributes){const s=e.getAttribute(t),r=i.getAttribute(t);Ro(s,r,o);const n=s.itemSize;for(let t=s.count,e=h;t=e.length||!1===e[t].active)return this;const i=this._instanceInfo;for(let e=0,s=i.length;ee).sort((t,e)=>i[t].vertexStart-i[e].vertexStart),r=this.geometry;for(let n=0,a=i.length;n=this._geometryCount)return null;const i=this.geometry,s=this._geometryInfo[t];if(null===s.boundingBox){const t=new Qr,e=i.index,r=i.attributes.position;for(let i=s.start,n=s.start+s.count;i=this._geometryCount)return null;const i=this.geometry,s=this._geometryInfo[t];if(null===s.boundingSphere){const e=new Nn;this.getBoundingBoxAt(t,To),To.getCenter(e.center);const r=i.index,n=i.attributes.position;let a=0;for(let t=s.start,i=s.start+s.count;tt.active);if(Math.max(...i.map(t=>t.vertexStart+t.reservedVertexCount))>t)throw new Error(`BatchedMesh: Geometry vertex values are being used outside the range ${e}. Cannot shrink further.`);if(this.geometry.index){if(Math.max(...i.map(t=>t.indexStart+t.reservedIndexCount))>e)throw new Error(`BatchedMesh: Geometry index values are being used outside the range ${e}. Cannot shrink further.`)}const s=this.geometry;s.dispose(),this._maxVertexCount=t,this._maxIndexCount=e,this._geometryInitialized&&(this._geometryInitialized=!1,this.geometry=new Un,this._initializeGeometry(s));const r=this.geometry;s.index&&No(s.index.array,r.index.array);for(const t in s.attributes)No(s.attributes[t].array,r.attributes[t].array)}raycast(t,e){const i=this._instanceInfo,s=this._geometryInfo,r=this.matrixWorld,n=this.geometry;Oo.material=this.material,Oo.geometry.index=n.index,Oo.geometry.attributes=n.attributes,null===Oo.geometry.boundingBox&&(Oo.geometry.boundingBox=new Qr),null===Oo.geometry.boundingSphere&&(Oo.geometry.boundingSphere=new Nn);for(let n=0,a=i.length;n({...t,boundingBox:null!==t.boundingBox?t.boundingBox.clone():null,boundingSphere:null!==t.boundingSphere?t.boundingSphere.clone():null})),this._instanceInfo=t._instanceInfo.map(t=>({...t})),this._availableInstanceIds=t._availableInstanceIds.slice(),this._availableGeometryIds=t._availableGeometryIds.slice(),this._nextIndexStart=t._nextIndexStart,this._nextVertexStart=t._nextVertexStart,this._geometryCount=t._geometryCount,this._maxInstanceCount=t._maxInstanceCount,this._maxVertexCount=t._maxVertexCount,this._maxIndexCount=t._maxIndexCount,this._geometryInitialized=t._geometryInitialized,this._multiDrawCounts=t._multiDrawCounts.slice(),this._multiDrawStarts=t._multiDrawStarts.slice(),this._indirectTexture=t._indirectTexture.clone(),this._indirectTexture.image.data=this._indirectTexture.image.data.slice(),this._matricesTexture=t._matricesTexture.clone(),this._matricesTexture.image.data=this._matricesTexture.image.data.slice(),null!==this._colorsTexture&&(this._colorsTexture=t._colorsTexture.clone(),this._colorsTexture.image.data=this._colorsTexture.image.data.slice()),this}dispose(){this.geometry.dispose(),this._matricesTexture.dispose(),this._matricesTexture=null,this._indirectTexture.dispose(),this._indirectTexture=null,null!==this._colorsTexture&&(this._colorsTexture.dispose(),this._colorsTexture=null)}onBeforeRender(t,e,i,s,r){if(!this._visibilityChanged&&!this.perObjectFrustumCulled&&!this.sortObjects)return;const n=s.getIndex();let a=null===n?1:n.array.BYTES_PER_ELEMENT,o=1;r.wireframe&&(o=2,a=s.attributes.position.count>65535?4:2);const h=this._instanceInfo,l=this._multiDrawStarts,c=this._multiDrawCounts,u=this._geometryInfo,d=this.perObjectFrustumCulled,p=this._indirectTexture,m=p.image.data,y=i.isArrayCamera?Ao:_o;d&&!i.isArrayCamera&&(Mo.multiplyMatrices(i.projectionMatrix,i.matrixWorldInverse).multiply(this.matrixWorld),_o.setFromProjectionMatrix(Mo,i.coordinateSystem,i.reversedDepth));let g=0;if(this.sortObjects){Mo.copy(this.matrixWorld).invert(),Co.setFromMatrixPosition(i.matrixWorld).applyMatrix4(Mo),Io.set(0,0,-1).transformDirection(i.matrixWorld).transformDirection(Mo);for(let t=0,e=h.length;t0){const i=t[e[0]];if(void 0!==i){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let t=0,e=i.length;ts)return;Uo.applyMatrix4(t.matrixWorld);const h=e.ray.origin.distanceTo(Uo);return he.far?void 0:{distance:h,point:qo.clone().applyMatrix4(t.matrixWorld),index:a,face:null,faceIndex:null,barycoord:null,object:t}}const Yo=new Ts,Ho=new Ts;class Zo extends Jo{constructor(t,e){super(t,e),this.isLineSegments=!0,this.type="LineSegments"}computeLineDistances(){const t=this.geometry;if(null===t.index){const e=t.attributes.position,i=[];for(let t=0,s=e.count;t0){const i=t[e[0]];if(void 0!==i){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let t=0,e=i.length;tr.far)return;n.push({distance:h,distanceToRay:Math.sqrt(o),point:i,index:e,face:null,faceIndex:null,barycoord:null,object:a})}}class rh extends qs{constructor(t,e,i,s,r=1006,n=1006,a,o,h){super(t,e,i,s,r,n,a,o,h),this.isVideoTexture=!0,this.generateMipmaps=!1,this._requestVideoFrameCallbackId=0;const l=this;"requestVideoFrameCallback"in t&&(this._requestVideoFrameCallbackId=t.requestVideoFrameCallback(function e(){l.needsUpdate=!0,l._requestVideoFrameCallbackId=t.requestVideoFrameCallback(e)}))}clone(){return new this.constructor(this.image).copy(this)}update(){const t=this.image;!1==="requestVideoFrameCallback"in t&&t.readyState>=t.HAVE_CURRENT_DATA&&(this.needsUpdate=!0)}dispose(){0!==this._requestVideoFrameCallbackId&&(this.source.data.cancelVideoFrameCallback(this._requestVideoFrameCallbackId),this._requestVideoFrameCallbackId=0),super.dispose()}}class nh extends rh{constructor(t,e,i,s,r,n,a,o){super({},t,e,i,s,r,n,a,o),this.isVideoFrameTexture=!0}update(){}clone(){return(new this.constructor).copy(this)}setFrame(t){this.image=t,this.needsUpdate=!0}}class ah extends qs{constructor(t,e){super({width:t,height:e}),this.isFramebufferTexture=!0,this.magFilter=ft,this.minFilter=ft,this.generateMipmaps=!1,this.needsUpdate=!0}}class oh extends qs{constructor(t,e,i,s,r,n,a,o,h,l,c,u){super(null,n,a,o,h,l,s,r,c,u),this.isCompressedTexture=!0,this.image={width:e,height:i},this.mipmaps=t,this.flipY=!1,this.generateMipmaps=!1}}class hh extends oh{constructor(t,e,i,s,r,n){super(t,e,i,r,n),this.isCompressedArrayTexture=!0,this.image.depth=s,this.wrapR=yt,this.layerUpdates=new Set}addLayerUpdate(t){this.layerUpdates.add(t)}clearLayerUpdates(){this.layerUpdates.clear()}}class lh extends oh{constructor(t,e,i){super(void 0,t[0].width,t[0].height,e,i,lt),this.isCompressedCubeTexture=!0,this.isCubeTexture=!0,this.image=t}}class ch extends qs{constructor(t=[],e=301,i,s,r,n,a,o,h,l){super(t,e,i,s,r,n,a,o,h,l),this.isCubeTexture=!0,this.flipY=!1}get images(){return this.image}set images(t){this.image=t}}class uh extends qs{constructor(t,e,i,s,r,n,a,o,h){super(t,e,i,s,r,n,a,o,h),this.isCanvasTexture=!0,this.needsUpdate=!0}}class dh extends qs{constructor(t,e,i=1014,s,r,n,a=1003,o=1003,h,l=1026,c=1){if(l!==Ut&&1027!==l)throw new Error("DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat");super({width:t,height:e,depth:c},s,r,n,a,o,l,i,h),this.isDepthTexture=!0,this.flipY=!1,this.generateMipmaps=!1,this.compareFunction=null}copy(t){return super.copy(t),this.source=new js(Object.assign({},t.image)),this.compareFunction=t.compareFunction,this}toJSON(t){const e=super.toJSON(t);return null!==this.compareFunction&&(e.compareFunction=this.compareFunction),e}}class ph extends dh{constructor(t,e=1014,i=301,s,r,n=1003,a=1003,o,h=1026){const l={width:t,height:t,depth:1},c=[l,l,l,l,l,l];super(t,t,e,i,s,r,n,a,o,h),this.image=c,this.isCubeDepthTexture=!0,this.isCubeTexture=!0}get images(){return this.image}set images(t){this.image=t}}class mh extends qs{constructor(t=null){super(),this.sourceTexture=t,this.isExternalTexture=!0}copy(t){return super.copy(t),this.sourceTexture=t.sourceTexture,this}}class yh extends Un{constructor(t=1,e=1,i=1,s=1,r=1,n=1){super(),this.type="BoxGeometry",this.parameters={width:t,height:e,depth:i,widthSegments:s,heightSegments:r,depthSegments:n};const a=this;s=Math.floor(s),r=Math.floor(r),n=Math.floor(n);const o=[],h=[],l=[],c=[];let u=0,d=0;function p(t,e,i,s,r,n,p,m,y,g,f){const x=n/y,b=p/g,v=n/2,w=p/2,M=m/2,S=y+1,_=g+1;let A=0,T=0;const z=new Ts;for(let n=0;n<_;n++){const a=n*b-w;for(let o=0;o0?1:-1,l.push(z.x,z.y,z.z),c.push(o/y),c.push(1-n/g),A+=1}}for(let t=0;t0){const t=(f-1)*m;for(let e=0;e0||0!==s)&&(l.push(n,a,h),x+=3),(e>0||s!==r-1)&&(l.push(a,o,h),x+=3)}h.addGroup(g,x,0),g+=x}(),!1===n&&(t>0&&f(!0),e>0&&f(!1)),this.setIndex(l),this.setAttribute("position",new kn(c,3)),this.setAttribute("normal",new kn(u,3)),this.setAttribute("uv",new kn(d,2))}copy(t){return super.copy(t),this.parameters=Object.assign({},t.parameters),this}static fromJSON(t){return new xh(t.radiusTop,t.radiusBottom,t.height,t.radialSegments,t.heightSegments,t.openEnded,t.thetaStart,t.thetaLength)}}class bh extends xh{constructor(t=1,e=1,i=32,s=1,r=!1,n=0,a=2*Math.PI){super(0,t,e,i,s,r,n,a),this.type="ConeGeometry",this.parameters={radius:t,height:e,radialSegments:i,heightSegments:s,openEnded:r,thetaStart:n,thetaLength:a}}static fromJSON(t){return new bh(t.radius,t.height,t.radialSegments,t.heightSegments,t.openEnded,t.thetaStart,t.thetaLength)}}class vh extends Un{constructor(t=[],e=[],i=1,s=0){super(),this.type="PolyhedronGeometry",this.parameters={vertices:t,indices:e,radius:i,detail:s};const r=[],n=[];function a(t,e,i,s){const r=s+1,n=[];for(let s=0;s<=r;s++){n[s]=[];const a=t.clone().lerp(i,s/r),o=e.clone().lerp(i,s/r),h=r-s;for(let t=0;t<=h;t++)n[s][t]=0===t&&s===r?a:a.clone().lerp(o,t/h)}for(let t=0;t.9&&a<.1&&(e<.2&&(n[t+0]+=1),i<.2&&(n[t+2]+=1),s<.2&&(n[t+4]+=1))}}()}(),this.setAttribute("position",new kn(r,3)),this.setAttribute("normal",new kn(r.slice(),3)),this.setAttribute("uv",new kn(n,2)),0===s?this.computeVertexNormals():this.normalizeNormals()}copy(t){return super.copy(t),this.parameters=Object.assign({},t.parameters),this}static fromJSON(t){return new vh(t.vertices,t.indices,t.radius,t.detail)}}class wh extends vh{constructor(t=1,e=0){const i=(1+Math.sqrt(5))/2,s=1/i;super([-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,0,-s,-i,0,-s,i,0,s,-i,0,s,i,-s,-i,0,-s,i,0,s,-i,0,s,i,0,-i,0,-s,i,0,-s,-i,0,s,i,0,s],[3,11,7,3,7,15,3,15,13,7,19,17,7,17,6,7,6,15,17,4,8,17,8,10,17,10,6,8,0,16,8,16,2,8,2,10,0,12,1,0,1,18,0,18,16,6,10,2,6,2,13,6,13,15,2,16,18,2,18,3,2,3,13,18,1,9,18,9,11,18,11,3,4,14,12,4,12,0,4,0,8,11,9,5,11,5,19,11,19,7,19,5,14,19,14,4,19,4,17,1,12,14,1,14,5,1,5,9],t,e),this.type="DodecahedronGeometry",this.parameters={radius:t,detail:e}}static fromJSON(t){return new wh(t.radius,t.detail)}}const Mh=new Ts,Sh=new Ts,_h=new Ts,Ah=new $r;class Th extends Un{constructor(t=null,e=1){if(super(),this.type="EdgesGeometry",this.parameters={geometry:t,thresholdAngle:e},null!==t){const i=4,s=Math.pow(10,i),r=Math.cos(ys*e),n=t.getIndex(),a=t.getAttribute("position"),o=n?n.count:a.count,h=[0,0,0],l=["a","b","c"],c=new Array(3),u={},d=[];for(let t=0;t0)){h=s;break}h=s-1}if(s=h,i[s]===n)return s/(r-1);const l=i[s];return(s+(n-l)/(i[s+1]-l))/(r-1)}getTangent(t,e){const i=1e-4;let s=t-i,r=t+i;s<0&&(s=0),r>1&&(r=1);const n=this.getPoint(s),a=this.getPoint(r),o=e||(n.isVector2?new _s:new Ts);return o.copy(a).sub(n).normalize(),o}getTangentAt(t,e){const i=this.getUtoTmapping(t);return this.getTangent(i,e)}computeFrenetFrames(t,e=!1){const i=new Ts,s=[],r=[],n=[],a=new Ts,o=new Qs;for(let e=0;e<=t;e++){const i=e/t;s[e]=this.getTangentAt(i,new Ts)}r[0]=new Ts,n[0]=new Ts;let h=Number.MAX_VALUE;const l=Math.abs(s[0].x),c=Math.abs(s[0].y),u=Math.abs(s[0].z);l<=h&&(h=l,i.set(1,0,0)),c<=h&&(h=c,i.set(0,1,0)),u<=h&&i.set(0,0,1),a.crossVectors(s[0],i).normalize(),r[0].crossVectors(s[0],a),n[0].crossVectors(s[0],r[0]);for(let e=1;e<=t;e++){if(r[e]=r[e-1].clone(),n[e]=n[e-1].clone(),a.crossVectors(s[e-1],s[e]),a.length()>Number.EPSILON){a.normalize();const t=Math.acos(xs(s[e-1].dot(s[e]),-1,1));r[e].applyMatrix4(o.makeRotationAxis(a,t))}n[e].crossVectors(s[e],r[e])}if(!0===e){let e=Math.acos(xs(r[0].dot(r[t]),-1,1));e/=t,s[0].dot(a.crossVectors(r[0],r[t]))>0&&(e=-e);for(let i=1;i<=t;i++)r[i].applyMatrix4(o.makeRotationAxis(s[i],e*i)),n[i].crossVectors(s[i],r[i])}return{tangents:s,normals:r,binormals:n}}clone(){return(new this.constructor).copy(this)}copy(t){return this.arcLengthDivisions=t.arcLengthDivisions,this}toJSON(){const t={metadata:{version:4.7,type:"Curve",generator:"Curve.toJSON"}};return t.arcLengthDivisions=this.arcLengthDivisions,t.type=this.type,t}fromJSON(t){return this.arcLengthDivisions=t.arcLengthDivisions,this}}class Ch extends zh{constructor(t=0,e=0,i=1,s=1,r=0,n=2*Math.PI,a=!1,o=0){super(),this.isEllipseCurve=!0,this.type="EllipseCurve",this.aX=t,this.aY=e,this.xRadius=i,this.yRadius=s,this.aStartAngle=r,this.aEndAngle=n,this.aClockwise=a,this.aRotation=o}getPoint(t,e=new _s){const i=e,s=2*Math.PI;let r=this.aEndAngle-this.aStartAngle;const n=Math.abs(r)s;)r-=s;r0?0:(Math.floor(Math.abs(h)/r)+1)*r:0===l&&h===r-1&&(h=r-2,l=1),this.closed||h>0?a=s[(h-1)%r]:(kh.subVectors(s[0],s[1]).add(s[0]),a=kh);const c=s[h%r],u=s[(h+1)%r];if(this.closed||h+2s.length-2?s.length-1:n+1],c=s[n>s.length-3?s.length-1:n+2];return i.set(Vh(a,o.x,h.x,l.x,c.x),Vh(a,o.y,h.y,l.y,c.y)),i}copy(t){super.copy(t),this.points=[];for(let e=0,i=t.points.length;e=i){const t=s[r]-i,n=this.curves[r],a=n.getLength(),o=0===a?0:1-t/a;return n.getPointAt(o,e)}r++}return null}getLength(){const t=this.getCurveLengths();return t[t.length-1]}updateArcLengths(){this.needsUpdate=!0,this.cacheLengths=null,this.getCurveLengths()}getCurveLengths(){if(this.cacheLengths&&this.cacheLengths.length===this.curves.length)return this.cacheLengths;const t=[];let e=0;for(let i=0,s=this.curves.length;i1&&!e[e.length-1].equals(e[0])&&e.push(e[0]),e}copy(t){super.copy(t),this.curves=[];for(let e=0,i=t.curves.length;e0){const t=h.getPoint(0);t.equals(this.currentPoint)||this.lineTo(t.x,t.y)}this.curves.push(h);const l=h.getPoint(1);return this.currentPoint.copy(l),this}copy(t){return super.copy(t),this.currentPoint.copy(t.currentPoint),this}toJSON(){const t=super.toJSON();return t.currentPoint=this.currentPoint.toArray(),t}fromJSON(t){return super.fromJSON(t),this.currentPoint.fromArray(t.currentPoint),this}}class Zh extends Hh{constructor(t){super(t),this.uuid=fs(),this.type="Shape",this.holes=[]}getPointsHoles(t){const e=[];for(let i=0,s=this.holes.length;i80*i){o=t[0],h=t[1];let e=o,s=h;for(let n=i;ne&&(e=i),r>s&&(s=r)}l=Math.max(e-o,s-h),l=0!==l?32767/l:0}return Kh(n,a,i,o,h,l,0),a}function $h(t,e,i,s,r){let n;if(r===function(t,e,i,s){let r=0;for(let n=e,a=i-s;n0)for(let r=e;r=e;r-=s)n=bl(r/s|0,t[r],t[r+1],n);return n&&pl(n,n.next)&&(vl(n),n=n.next),n}function Qh(t,e){if(!t)return t;e||(e=t);let i,s=t;do{if(i=!1,s.steiner||!pl(s,s.next)&&0!==dl(s.prev,s,s.next))s=s.next;else{if(vl(s),s=e=s.prev,s===s.next)break;i=!0}}while(i||s!==e);return e}function Kh(t,e,i,s,r,n,a){if(!t)return;!a&&n&&function(t,e,i,s){let r=t;do{0===r.z&&(r.z=ol(r.x,r.y,e,i,s)),r.prevZ=r.prev,r.nextZ=r.next,r=r.next}while(r!==t);r.prevZ.nextZ=null,r.prevZ=null,function(t){let e,i=1;do{let s,r=t;t=null;let n=null;for(e=0;r;){e++;let a=r,o=0;for(let t=0;t0||h>0&&a;)0!==o&&(0===h||!a||r.z<=a.z)?(s=r,r=r.nextZ,o--):(s=a,a=a.nextZ,h--),n?n.nextZ=s:t=s,s.prevZ=n,n=s;r=a}n.nextZ=null,i*=2}while(e>1)}(r)}(t,s,r,n);let o=t;for(;t.prev!==t.next;){const h=t.prev,l=t.next;if(n?el(t,s,r,n):tl(t))e.push(h.i,t.i,l.i),vl(t),t=l.next,o=l.next;else if((t=l)===o){a?1===a?Kh(t=il(Qh(t),e),e,i,s,r,n,2):2===a&&sl(t,e,i,s,r,n):Kh(Qh(t),e,i,s,r,n,1);break}}}function tl(t){const e=t.prev,i=t,s=t.next;if(dl(e,i,s)>=0)return!1;const r=e.x,n=i.x,a=s.x,o=e.y,h=i.y,l=s.y,c=Math.min(r,n,a),u=Math.min(o,h,l),d=Math.max(r,n,a),p=Math.max(o,h,l);let m=s.next;for(;m!==e;){if(m.x>=c&&m.x<=d&&m.y>=u&&m.y<=p&&cl(r,o,n,h,a,l,m.x,m.y)&&dl(m.prev,m,m.next)>=0)return!1;m=m.next}return!0}function el(t,e,i,s){const r=t.prev,n=t,a=t.next;if(dl(r,n,a)>=0)return!1;const o=r.x,h=n.x,l=a.x,c=r.y,u=n.y,d=a.y,p=Math.min(o,h,l),m=Math.min(c,u,d),y=Math.max(o,h,l),g=Math.max(c,u,d),f=ol(p,m,e,i,s),x=ol(y,g,e,i,s);let b=t.prevZ,v=t.nextZ;for(;b&&b.z>=f&&v&&v.z<=x;){if(b.x>=p&&b.x<=y&&b.y>=m&&b.y<=g&&b!==r&&b!==a&&cl(o,c,h,u,l,d,b.x,b.y)&&dl(b.prev,b,b.next)>=0)return!1;if(b=b.prevZ,v.x>=p&&v.x<=y&&v.y>=m&&v.y<=g&&v!==r&&v!==a&&cl(o,c,h,u,l,d,v.x,v.y)&&dl(v.prev,v,v.next)>=0)return!1;v=v.nextZ}for(;b&&b.z>=f;){if(b.x>=p&&b.x<=y&&b.y>=m&&b.y<=g&&b!==r&&b!==a&&cl(o,c,h,u,l,d,b.x,b.y)&&dl(b.prev,b,b.next)>=0)return!1;b=b.prevZ}for(;v&&v.z<=x;){if(v.x>=p&&v.x<=y&&v.y>=m&&v.y<=g&&v!==r&&v!==a&&cl(o,c,h,u,l,d,v.x,v.y)&&dl(v.prev,v,v.next)>=0)return!1;v=v.nextZ}return!0}function il(t,e){let i=t;do{const s=i.prev,r=i.next.next;!pl(s,r)&&ml(s,i,i.next,r)&&fl(s,r)&&fl(r,s)&&(e.push(s.i,i.i,r.i),vl(i),vl(i.next),i=t=r),i=i.next}while(i!==t);return Qh(i)}function sl(t,e,i,s,r,n){let a=t;do{let t=a.next.next;for(;t!==a.prev;){if(a.i!==t.i&&ul(a,t)){let o=xl(a,t);return a=Qh(a,a.next),o=Qh(o,o.next),Kh(a,e,i,s,r,n,0),void Kh(o,e,i,s,r,n,0)}t=t.next}a=a.next}while(a!==t)}function rl(t,e){let i=t.x-e.x;if(0===i&&(i=t.y-e.y,0===i)){i=(t.next.y-t.y)/(t.next.x-t.x)-(e.next.y-e.y)/(e.next.x-e.x)}return i}function nl(t,e){const i=function(t,e){let i=e;const s=t.x,r=t.y;let n,a=-1/0;if(pl(t,i))return i;do{if(pl(t,i.next))return i.next;if(r<=i.y&&r>=i.next.y&&i.next.y!==i.y){const t=i.x+(r-i.y)*(i.next.x-i.x)/(i.next.y-i.y);if(t<=s&&t>a&&(a=t,n=i.x=i.x&&i.x>=h&&s!==i.x&&ll(rn.x||i.x===n.x&&al(n,i)))&&(n=i,c=e)}i=i.next}while(i!==o);return n}(t,e);if(!i)return e;const s=xl(i,t);return Qh(s,s.next),Qh(i,i.next)}function al(t,e){return dl(t.prev,t,e.prev)<0&&dl(e.next,t,t.next)<0}function ol(t,e,i,s,r){return(t=1431655765&((t=858993459&((t=252645135&((t=16711935&((t=(t-i)*r|0)|t<<8))|t<<4))|t<<2))|t<<1))|(e=1431655765&((e=858993459&((e=252645135&((e=16711935&((e=(e-s)*r|0)|e<<8))|e<<4))|e<<2))|e<<1))<<1}function hl(t){let e=t,i=t;do{(e.x=(t-a)*(n-o)&&(t-a)*(s-o)>=(i-a)*(e-o)&&(i-a)*(n-o)>=(r-a)*(s-o)}function cl(t,e,i,s,r,n,a,o){return!(t===a&&e===o)&&ll(t,e,i,s,r,n,a,o)}function ul(t,e){return t.next.i!==e.i&&t.prev.i!==e.i&&!function(t,e){let i=t;do{if(i.i!==t.i&&i.next.i!==t.i&&i.i!==e.i&&i.next.i!==e.i&&ml(i,i.next,t,e))return!0;i=i.next}while(i!==t);return!1}(t,e)&&(fl(t,e)&&fl(e,t)&&function(t,e){let i=t,s=!1;const r=(t.x+e.x)/2,n=(t.y+e.y)/2;do{i.y>n!=i.next.y>n&&i.next.y!==i.y&&r<(i.next.x-i.x)*(n-i.y)/(i.next.y-i.y)+i.x&&(s=!s),i=i.next}while(i!==t);return s}(t,e)&&(dl(t.prev,t,e.prev)||dl(t,e.prev,e))||pl(t,e)&&dl(t.prev,t,t.next)>0&&dl(e.prev,e,e.next)>0)}function dl(t,e,i){return(e.y-t.y)*(i.x-e.x)-(e.x-t.x)*(i.y-e.y)}function pl(t,e){return t.x===e.x&&t.y===e.y}function ml(t,e,i,s){const r=gl(dl(t,e,i)),n=gl(dl(t,e,s)),a=gl(dl(i,s,t)),o=gl(dl(i,s,e));return r!==n&&a!==o||(!(0!==r||!yl(t,i,e))||(!(0!==n||!yl(t,s,e))||(!(0!==a||!yl(i,t,s))||!(0!==o||!yl(i,e,s)))))}function yl(t,e,i){return e.x<=Math.max(t.x,i.x)&&e.x>=Math.min(t.x,i.x)&&e.y<=Math.max(t.y,i.y)&&e.y>=Math.min(t.y,i.y)}function gl(t){return t>0?1:t<0?-1:0}function fl(t,e){return dl(t.prev,t,t.next)<0?dl(t,e,t.next)>=0&&dl(t,t.prev,e)>=0:dl(t,e,t.prev)<0||dl(t,t.next,e)<0}function xl(t,e){const i=wl(t.i,t.x,t.y),s=wl(e.i,e.x,e.y),r=t.next,n=e.prev;return t.next=e,e.prev=t,i.next=r,r.prev=i,s.next=i,i.prev=s,n.next=s,s.prev=n,s}function bl(t,e,i,s){const r=wl(t,e,i);return s?(r.next=s.next,r.prev=s,s.next.prev=r,s.next=r):(r.prev=r,r.next=r),r}function vl(t){t.next.prev=t.prev,t.prev.next=t.next,t.prevZ&&(t.prevZ.nextZ=t.nextZ),t.nextZ&&(t.nextZ.prevZ=t.prevZ)}function wl(t,e,i){return{i:t,x:e,y:i,prev:null,next:null,z:0,prevZ:null,nextZ:null,steiner:!1}}class Ml{static triangulate(t,e,i=2){return Gh(t,e,i)}}class Sl{static area(t){const e=t.length;let i=0;for(let s=e-1,r=0;r2&&t[e-1].equals(t[0])&&t.pop()}function Al(t,e){for(let i=0;iNumber.EPSILON){const u=Math.sqrt(c),d=Math.sqrt(h*h+l*l),p=e.x-o/u,m=e.y+a/u,y=((i.x-l/d-p)*l-(i.y+h/d-m)*h)/(a*l-o*h);s=p+a*y-t.x,r=m+o*y-t.y;const g=s*s+r*r;if(g<=2)return new _s(s,r);n=Math.sqrt(g/2)}else{let t=!1;a>Number.EPSILON?h>Number.EPSILON&&(t=!0):a<-Number.EPSILON?h<-Number.EPSILON&&(t=!0):Math.sign(o)===Math.sign(l)&&(t=!0),t?(s=-o,r=a,n=Math.sqrt(c)):(s=a,r=o,n=Math.sqrt(c/2))}return new _s(s/n,r/n)}const k=[];for(let t=0,e=z.length,i=e-1,s=t+1;t=0;t--){const e=t/p,i=c*Math.cos(e*Math.PI/2),s=u*Math.sin(e*Math.PI/2)+d;for(let t=0,e=z.length;t=0;){const s=i;let r=i-1;r<0&&(r=t.length-1);for(let t=0,i=o+2*p;t0)&&d.push(e,r,h),(t!==i-1||o0&&(e.defines=this.defines),e.vertexShader=this.vertexShader,e.fragmentShader=this.fragmentShader,e.lights=this.lights,e.clipping=this.clipping;const i={};for(const t in this.extensions)!0===this.extensions[t]&&(i[t]=!0);return Object.keys(i).length>0&&(e.extensions=i),e}}class Hl extends Yl{constructor(t){super(t),this.isRawShaderMaterial=!0,this.type="RawShaderMaterial"}}class Zl extends Zn{constructor(t){super(),this.isMeshStandardMaterial=!0,this.type="MeshStandardMaterial",this.defines={STANDARD:""},this.color=new Pr(16777215),this.roughness=1,this.metalness=0,this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new Pr(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new _s(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.roughnessMap=null,this.metalnessMap=null,this.alphaMap=null,this.envMap=null,this.envMapRotation=new hr,this.envMapIntensity=1,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.flatShading=!1,this.fog=!0,this.setValues(t)}copy(t){return super.copy(t),this.defines={STANDARD:""},this.color.copy(t.color),this.roughness=t.roughness,this.metalness=t.metalness,this.map=t.map,this.lightMap=t.lightMap,this.lightMapIntensity=t.lightMapIntensity,this.aoMap=t.aoMap,this.aoMapIntensity=t.aoMapIntensity,this.emissive.copy(t.emissive),this.emissiveMap=t.emissiveMap,this.emissiveIntensity=t.emissiveIntensity,this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.roughnessMap=t.roughnessMap,this.metalnessMap=t.metalnessMap,this.alphaMap=t.alphaMap,this.envMap=t.envMap,this.envMapRotation.copy(t.envMapRotation),this.envMapIntensity=t.envMapIntensity,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.wireframeLinecap=t.wireframeLinecap,this.wireframeLinejoin=t.wireframeLinejoin,this.flatShading=t.flatShading,this.fog=t.fog,this}}class Gl extends Zl{constructor(t){super(),this.isMeshPhysicalMaterial=!0,this.defines={STANDARD:"",PHYSICAL:""},this.type="MeshPhysicalMaterial",this.anisotropyRotation=0,this.anisotropyMap=null,this.clearcoatMap=null,this.clearcoatRoughness=0,this.clearcoatRoughnessMap=null,this.clearcoatNormalScale=new _s(1,1),this.clearcoatNormalMap=null,this.ior=1.5,Object.defineProperty(this,"reflectivity",{get:function(){return xs(2.5*(this.ior-1)/(this.ior+1),0,1)},set:function(t){this.ior=(1+.4*t)/(1-.4*t)}}),this.iridescenceMap=null,this.iridescenceIOR=1.3,this.iridescenceThicknessRange=[100,400],this.iridescenceThicknessMap=null,this.sheenColor=new Pr(0),this.sheenColorMap=null,this.sheenRoughness=1,this.sheenRoughnessMap=null,this.transmissionMap=null,this.thickness=0,this.thicknessMap=null,this.attenuationDistance=1/0,this.attenuationColor=new Pr(1,1,1),this.specularIntensity=1,this.specularIntensityMap=null,this.specularColor=new Pr(1,1,1),this.specularColorMap=null,this._anisotropy=0,this._clearcoat=0,this._dispersion=0,this._iridescence=0,this._sheen=0,this._transmission=0,this.setValues(t)}get anisotropy(){return this._anisotropy}set anisotropy(t){this._anisotropy>0!=t>0&&this.version++,this._anisotropy=t}get clearcoat(){return this._clearcoat}set clearcoat(t){this._clearcoat>0!=t>0&&this.version++,this._clearcoat=t}get iridescence(){return this._iridescence}set iridescence(t){this._iridescence>0!=t>0&&this.version++,this._iridescence=t}get dispersion(){return this._dispersion}set dispersion(t){this._dispersion>0!=t>0&&this.version++,this._dispersion=t}get sheen(){return this._sheen}set sheen(t){this._sheen>0!=t>0&&this.version++,this._sheen=t}get transmission(){return this._transmission}set transmission(t){this._transmission>0!=t>0&&this.version++,this._transmission=t}copy(t){return super.copy(t),this.defines={STANDARD:"",PHYSICAL:""},this.anisotropy=t.anisotropy,this.anisotropyRotation=t.anisotropyRotation,this.anisotropyMap=t.anisotropyMap,this.clearcoat=t.clearcoat,this.clearcoatMap=t.clearcoatMap,this.clearcoatRoughness=t.clearcoatRoughness,this.clearcoatRoughnessMap=t.clearcoatRoughnessMap,this.clearcoatNormalMap=t.clearcoatNormalMap,this.clearcoatNormalScale.copy(t.clearcoatNormalScale),this.dispersion=t.dispersion,this.ior=t.ior,this.iridescence=t.iridescence,this.iridescenceMap=t.iridescenceMap,this.iridescenceIOR=t.iridescenceIOR,this.iridescenceThicknessRange=[...t.iridescenceThicknessRange],this.iridescenceThicknessMap=t.iridescenceThicknessMap,this.sheen=t.sheen,this.sheenColor.copy(t.sheenColor),this.sheenColorMap=t.sheenColorMap,this.sheenRoughness=t.sheenRoughness,this.sheenRoughnessMap=t.sheenRoughnessMap,this.transmission=t.transmission,this.transmissionMap=t.transmissionMap,this.thickness=t.thickness,this.thicknessMap=t.thicknessMap,this.attenuationDistance=t.attenuationDistance,this.attenuationColor.copy(t.attenuationColor),this.specularIntensity=t.specularIntensity,this.specularIntensityMap=t.specularIntensityMap,this.specularColor.copy(t.specularColor),this.specularColorMap=t.specularColorMap,this}}class $l extends Zn{constructor(t){super(),this.isMeshPhongMaterial=!0,this.type="MeshPhongMaterial",this.color=new Pr(16777215),this.specular=new Pr(1118481),this.shininess=30,this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new Pr(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new _s(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.envMapRotation=new hr,this.combine=0,this.reflectivity=1,this.envMapIntensity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.flatShading=!1,this.fog=!0,this.setValues(t)}copy(t){return super.copy(t),this.color.copy(t.color),this.specular.copy(t.specular),this.shininess=t.shininess,this.map=t.map,this.lightMap=t.lightMap,this.lightMapIntensity=t.lightMapIntensity,this.aoMap=t.aoMap,this.aoMapIntensity=t.aoMapIntensity,this.emissive.copy(t.emissive),this.emissiveMap=t.emissiveMap,this.emissiveIntensity=t.emissiveIntensity,this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.specularMap=t.specularMap,this.alphaMap=t.alphaMap,this.envMap=t.envMap,this.envMapRotation.copy(t.envMapRotation),this.combine=t.combine,this.reflectivity=t.reflectivity,this.envMapIntensity=t.envMapIntensity,this.refractionRatio=t.refractionRatio,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.wireframeLinecap=t.wireframeLinecap,this.wireframeLinejoin=t.wireframeLinejoin,this.flatShading=t.flatShading,this.fog=t.fog,this}}class Ql extends Zn{constructor(t){super(),this.isMeshToonMaterial=!0,this.defines={TOON:""},this.type="MeshToonMaterial",this.color=new Pr(16777215),this.map=null,this.gradientMap=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new Pr(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new _s(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.alphaMap=null,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.fog=!0,this.setValues(t)}copy(t){return super.copy(t),this.color.copy(t.color),this.map=t.map,this.gradientMap=t.gradientMap,this.lightMap=t.lightMap,this.lightMapIntensity=t.lightMapIntensity,this.aoMap=t.aoMap,this.aoMapIntensity=t.aoMapIntensity,this.emissive.copy(t.emissive),this.emissiveMap=t.emissiveMap,this.emissiveIntensity=t.emissiveIntensity,this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.alphaMap=t.alphaMap,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.wireframeLinecap=t.wireframeLinecap,this.wireframeLinejoin=t.wireframeLinejoin,this.fog=t.fog,this}}class Kl extends Zn{constructor(t){super(),this.isMeshNormalMaterial=!0,this.type="MeshNormalMaterial",this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new _s(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.wireframe=!1,this.wireframeLinewidth=1,this.flatShading=!1,this.setValues(t)}copy(t){return super.copy(t),this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.flatShading=t.flatShading,this}}class tc extends Zn{constructor(t){super(),this.isMeshLambertMaterial=!0,this.type="MeshLambertMaterial",this.color=new Pr(16777215),this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new Pr(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new _s(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.envMapRotation=new hr,this.combine=0,this.reflectivity=1,this.envMapIntensity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.flatShading=!1,this.fog=!0,this.setValues(t)}copy(t){return super.copy(t),this.color.copy(t.color),this.map=t.map,this.lightMap=t.lightMap,this.lightMapIntensity=t.lightMapIntensity,this.aoMap=t.aoMap,this.aoMapIntensity=t.aoMapIntensity,this.emissive.copy(t.emissive),this.emissiveMap=t.emissiveMap,this.emissiveIntensity=t.emissiveIntensity,this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.specularMap=t.specularMap,this.alphaMap=t.alphaMap,this.envMap=t.envMap,this.envMapRotation.copy(t.envMapRotation),this.combine=t.combine,this.reflectivity=t.reflectivity,this.envMapIntensity=t.envMapIntensity,this.refractionRatio=t.refractionRatio,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.wireframeLinecap=t.wireframeLinecap,this.wireframeLinejoin=t.wireframeLinejoin,this.flatShading=t.flatShading,this.fog=t.fog,this}}class ec extends Zn{constructor(t){super(),this.isMeshDepthMaterial=!0,this.type="MeshDepthMaterial",this.depthPacking=3200,this.map=null,this.alphaMap=null,this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.wireframe=!1,this.wireframeLinewidth=1,this.setValues(t)}copy(t){return super.copy(t),this.depthPacking=t.depthPacking,this.map=t.map,this.alphaMap=t.alphaMap,this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this}}class ic extends Zn{constructor(t){super(),this.isMeshDistanceMaterial=!0,this.type="MeshDistanceMaterial",this.map=null,this.alphaMap=null,this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.setValues(t)}copy(t){return super.copy(t),this.map=t.map,this.alphaMap=t.alphaMap,this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this}}class sc extends Zn{constructor(t){super(),this.isMeshMatcapMaterial=!0,this.defines={MATCAP:""},this.type="MeshMatcapMaterial",this.color=new Pr(16777215),this.matcap=null,this.map=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new _s(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.alphaMap=null,this.wireframe=!1,this.wireframeLinewidth=1,this.flatShading=!1,this.fog=!0,this.setValues(t)}copy(t){return super.copy(t),this.defines={MATCAP:""},this.color.copy(t.color),this.matcap=t.matcap,this.map=t.map,this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.alphaMap=t.alphaMap,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.flatShading=t.flatShading,this.fog=t.fog,this}}class rc extends Eo{constructor(t){super(),this.isLineDashedMaterial=!0,this.type="LineDashedMaterial",this.scale=1,this.dashSize=3,this.gapSize=1,this.setValues(t)}copy(t){return super.copy(t),this.scale=t.scale,this.dashSize=t.dashSize,this.gapSize=t.gapSize,this}}function nc(t,e){return t&&t.constructor!==e?"number"==typeof e.BYTES_PER_ELEMENT?new e(t):Array.prototype.slice.call(t):t}function ac(t){const e=t.length,i=new Array(e);for(let t=0;t!==e;++t)i[t]=t;return i.sort(function(e,i){return t[e]-t[i]}),i}function oc(t,e,i){const s=t.length,r=new t.constructor(s);for(let n=0,a=0;a!==s;++n){const s=i[n]*e;for(let i=0;i!==e;++i)r[a++]=t[s+i]}return r}function hc(t,e,i,s){let r=1,n=t[0];for(;void 0!==n&&void 0===n[s];)n=t[r++];if(void 0===n)return;let a=n[s];if(void 0!==a)if(Array.isArray(a))do{a=n[s],void 0!==a&&(e.push(n.time),i.push(...a)),n=t[r++]}while(void 0!==n);else if(void 0!==a.toArray)do{a=n[s],void 0!==a&&(e.push(n.time),a.toArray(i,i.length)),n=t[r++]}while(void 0!==n);else do{a=n[s],void 0!==a&&(e.push(n.time),i.push(a)),n=t[r++]}while(void 0!==n)}class lc{static convertArray(t,e){return nc(t,e)}static isTypedArray(t){return $i(t)}static getKeyframeOrder(t){return ac(t)}static sortedArray(t,e,i){return oc(t,e,i)}static flattenJSON(t,e,i,s){hc(t,e,i,s)}static subclip(t,e,i,s,r=30){return function(t,e,i,s,r=30){const n=t.clone();n.name=e;const a=[];for(let t=0;t=s)){h.push(e.times[t]);for(let i=0;in.tracks[t].times[0]&&(o=n.tracks[t].times[0]);for(let t=0;t=s.times[u]){const t=u*h+o,e=t+h-o;d=s.values.slice(t,e)}else{const t=s.createInterpolant(),e=o,i=h-o;t.evaluate(n),d=t.resultBuffer.slice(e,i)}"quaternion"===r&&(new As).fromArray(d).normalize().conjugate().toArray(d);const p=a.times.length;for(let t=0;t=r)){const a=e[1];t=r)break e}n=i,i=0;break i}break t}for(;i>>1;te;)--n;if(++n,0!==r||n!==s){r>=n&&(n=Math.max(n,1),r=n-1);const t=this.getValueSize();this.times=i.slice(r,n),this.values=this.values.slice(r*t,n*t)}return this}validate(){let t=!0;const e=this.getValueSize();e-Math.floor(e)!==0&&(os("KeyframeTrack: Invalid value size in track.",this),t=!1);const i=this.times,s=this.values,r=i.length;0===r&&(os("KeyframeTrack: Track is empty.",this),t=!1);let n=null;for(let e=0;e!==r;e++){const s=i[e];if("number"==typeof s&&isNaN(s)){os("KeyframeTrack: Time is not a valid number.",this,e,s),t=!1;break}if(null!==n&&n>s){os("KeyframeTrack: Out of order keys.",this,e,s,n),t=!1;break}n=s}if(void 0!==s&&$i(s))for(let e=0,i=s.length;e!==i;++e){const i=s[e];if(isNaN(i)){os("KeyframeTrack: Value is not a valid number.",this,e,i),t=!1;break}}return t}optimize(){const t=this.times.slice(),e=this.values.slice(),i=this.getValueSize(),s=this.getInterpolation()===Fe,r=t.length-1;let n=1;for(let a=1;a0){t[n]=t[r];for(let t=r*i,s=n*i,a=0;a!==i;++a)e[s+a]=e[t+a];++n}return n!==t.length?(this.times=t.slice(0,n),this.values=e.slice(0,n*i)):(this.times=t,this.values=e),this}clone(){const t=this.times.slice(),e=this.values.slice(),i=new(0,this.constructor)(this.name,t,e);return i.createInterpolant=this.createInterpolant,i}}yc.prototype.ValueTypeName="",yc.prototype.TimeBufferType=Float32Array,yc.prototype.ValueBufferType=Float32Array,yc.prototype.DefaultInterpolation=Ee;class gc extends yc{constructor(t,e,i){super(t,e,i)}}gc.prototype.ValueTypeName="bool",gc.prototype.ValueBufferType=Array,gc.prototype.DefaultInterpolation=Ve,gc.prototype.InterpolantFactoryMethodLinear=void 0,gc.prototype.InterpolantFactoryMethodSmooth=void 0;class fc extends yc{constructor(t,e,i,s){super(t,e,i,s)}}fc.prototype.ValueTypeName="color";class xc extends yc{constructor(t,e,i,s){super(t,e,i,s)}}xc.prototype.ValueTypeName="number";class bc extends cc{constructor(t,e,i,s){super(t,e,i,s)}interpolate_(t,e,i,s){const r=this.resultBuffer,n=this.sampleValues,a=this.valueSize,o=(i-e)/(s-e);let h=t*a;for(let t=h+a;h!==t;h+=4)As.slerpFlat(r,0,n,h-a,n,h,o);return r}}class vc extends yc{constructor(t,e,i,s){super(t,e,i,s)}InterpolantFactoryMethodLinear(t){return new bc(this.times,this.values,this.getValueSize(),t)}}vc.prototype.ValueTypeName="quaternion",vc.prototype.InterpolantFactoryMethodSmooth=void 0;class wc extends yc{constructor(t,e,i){super(t,e,i)}}wc.prototype.ValueTypeName="string",wc.prototype.ValueBufferType=Array,wc.prototype.DefaultInterpolation=Ve,wc.prototype.InterpolantFactoryMethodLinear=void 0,wc.prototype.InterpolantFactoryMethodSmooth=void 0;class Mc extends yc{constructor(t,e,i,s){super(t,e,i,s)}}Mc.prototype.ValueTypeName="vector";class Sc{constructor(t="",e=-1,i=[],s=2500){this.name=t,this.tracks=i,this.duration=e,this.blendMode=s,this.uuid=fs(),this.userData={},this.duration<0&&this.resetDuration()}static parse(t){const e=[],i=t.tracks,s=1/(t.fps||1);for(let t=0,r=i.length;t!==r;++t)e.push(_c(i[t]).scale(s));const r=new this(t.name,t.duration,e,t.blendMode);return r.uuid=t.uuid,r.userData=JSON.parse(t.userData||"{}"),r}static toJSON(t){const e=[],i=t.tracks,s={name:t.name,duration:t.duration,tracks:e,uuid:t.uuid,blendMode:t.blendMode,userData:JSON.stringify(t.userData)};for(let t=0,s=i.length;t!==s;++t)e.push(yc.toJSON(i[t]));return s}static CreateFromMorphTargetSequence(t,e,i,s){const r=e.length,n=[];for(let t=0;t1){const t=n[1];let e=s[t];e||(s[t]=e=[]),e.push(i)}}const n=[];for(const t in s)n.push(this.CreateFromMorphTargetSequence(t,s[t],e,i));return n}static parseAnimation(t,e){if(as("AnimationClip: parseAnimation() is deprecated and will be removed with r185"),!t)return os("AnimationClip: No animation in JSONLoader data."),null;const i=function(t,e,i,s,r){if(0!==i.length){const n=[],a=[];hc(i,n,a,s),0!==n.length&&r.push(new t(e,n,a))}},s=[],r=t.name||"default",n=t.fps||30,a=t.blendMode;let o=t.length||-1;const h=t.hierarchy||[];for(let t=0;t{e&&e(r),this.manager.itemEnd(t)},0),r;if(void 0!==Bc[t])return void Bc[t].push({onLoad:e,onProgress:i,onError:s});Bc[t]=[],Bc[t].push({onLoad:e,onProgress:i,onError:s});const n=new Request(t,{headers:new Headers(this.requestHeader),credentials:this.withCredentials?"include":"same-origin",signal:"function"==typeof AbortSignal.any?AbortSignal.any([this._abortController.signal,this.manager.abortController.signal]):this._abortController.signal}),a=this.mimeType,o=this.responseType;fetch(n).then(e=>{if(200===e.status||0===e.status){if(0===e.status&&as("FileLoader: HTTP Status 0 received."),"undefined"==typeof ReadableStream||void 0===e.body||void 0===e.body.getReader)return e;const i=Bc[t],s=e.body.getReader(),r=e.headers.get("X-File-Size")||e.headers.get("Content-Length"),n=r?parseInt(r):0,a=0!==n;let o=0;const h=new ReadableStream({start(t){!function e(){s.read().then(({done:s,value:r})=>{if(s)t.close();else{o+=r.byteLength;const s=new ProgressEvent("progress",{lengthComputable:a,loaded:o,total:n});for(let t=0,e=i.length;t{t.error(e)})}()}});return new Response(h)}throw new kc(`fetch for "${e.url}" responded with ${e.status}: ${e.statusText}`,e)}).then(t=>{switch(o){case"arraybuffer":return t.arrayBuffer();case"blob":return t.blob();case"document":return t.text().then(t=>(new DOMParser).parseFromString(t,a));case"json":return t.json();default:if(""===a)return t.text();{const e=/charset="?([^;"\s]*)"?/i.exec(a),i=e&&e[1]?e[1].toLowerCase():void 0,s=new TextDecoder(i);return t.arrayBuffer().then(t=>s.decode(t))}}}).then(e=>{Ac.add(`file:${t}`,e);const i=Bc[t];delete Bc[t];for(let t=0,s=i.length;t{const i=Bc[t];if(void 0===i)throw this.manager.itemError(t),e;delete Bc[t];for(let t=0,s=i.length;t{this.manager.itemEnd(t)}),this.manager.itemStart(t)}setResponseType(t){return this.responseType=t,this}setMimeType(t){return this.mimeType=t,this}abort(){return this._abortController.abort(),this._abortController=new AbortController,this}}class Pc extends Ic{constructor(t){super(t)}load(t,e,i,s){const r=this,n=new Oc(this.manager);n.setPath(this.path),n.setRequestHeader(this.requestHeader),n.setWithCredentials(this.withCredentials),n.load(t,function(i){try{e(r.parse(JSON.parse(i)))}catch(e){s?s(e):os(e),r.manager.itemError(t)}},i,s)}parse(t){const e=[];for(let i=0;i0:s.vertexColors=t.vertexColors),void 0!==t.uniforms)for(const e in t.uniforms){const r=t.uniforms[e];switch(s.uniforms[e]={},r.type){case"t":s.uniforms[e].value=i(r.value);break;case"c":s.uniforms[e].value=(new Pr).setHex(r.value);break;case"v2":s.uniforms[e].value=(new _s).fromArray(r.value);break;case"v3":s.uniforms[e].value=(new Ts).fromArray(r.value);break;case"v4":s.uniforms[e].value=(new Js).fromArray(r.value);break;case"m3":s.uniforms[e].value=(new Is).fromArray(r.value);break;case"m4":s.uniforms[e].value=(new Qs).fromArray(r.value);break;default:s.uniforms[e].value=r.value}}if(void 0!==t.defines&&(s.defines=t.defines),void 0!==t.vertexShader&&(s.vertexShader=t.vertexShader),void 0!==t.fragmentShader&&(s.fragmentShader=t.fragmentShader),void 0!==t.glslVersion&&(s.glslVersion=t.glslVersion),void 0!==t.extensions)for(const e in t.extensions)s.extensions[e]=t.extensions[e];if(void 0!==t.lights&&(s.lights=t.lights),void 0!==t.clipping&&(s.clipping=t.clipping),void 0!==t.size&&(s.size=t.size),void 0!==t.sizeAttenuation&&(s.sizeAttenuation=t.sizeAttenuation),void 0!==t.map&&(s.map=i(t.map)),void 0!==t.matcap&&(s.matcap=i(t.matcap)),void 0!==t.alphaMap&&(s.alphaMap=i(t.alphaMap)),void 0!==t.bumpMap&&(s.bumpMap=i(t.bumpMap)),void 0!==t.bumpScale&&(s.bumpScale=t.bumpScale),void 0!==t.normalMap&&(s.normalMap=i(t.normalMap)),void 0!==t.normalMapType&&(s.normalMapType=t.normalMapType),void 0!==t.normalScale){let e=t.normalScale;!1===Array.isArray(e)&&(e=[e,e]),s.normalScale=(new _s).fromArray(e)}return void 0!==t.displacementMap&&(s.displacementMap=i(t.displacementMap)),void 0!==t.displacementScale&&(s.displacementScale=t.displacementScale),void 0!==t.displacementBias&&(s.displacementBias=t.displacementBias),void 0!==t.roughnessMap&&(s.roughnessMap=i(t.roughnessMap)),void 0!==t.metalnessMap&&(s.metalnessMap=i(t.metalnessMap)),void 0!==t.emissiveMap&&(s.emissiveMap=i(t.emissiveMap)),void 0!==t.emissiveIntensity&&(s.emissiveIntensity=t.emissiveIntensity),void 0!==t.specularMap&&(s.specularMap=i(t.specularMap)),void 0!==t.specularIntensityMap&&(s.specularIntensityMap=i(t.specularIntensityMap)),void 0!==t.specularColorMap&&(s.specularColorMap=i(t.specularColorMap)),void 0!==t.envMap&&(s.envMap=i(t.envMap)),void 0!==t.envMapRotation&&s.envMapRotation.fromArray(t.envMapRotation),void 0!==t.envMapIntensity&&(s.envMapIntensity=t.envMapIntensity),void 0!==t.reflectivity&&(s.reflectivity=t.reflectivity),void 0!==t.refractionRatio&&(s.refractionRatio=t.refractionRatio),void 0!==t.lightMap&&(s.lightMap=i(t.lightMap)),void 0!==t.lightMapIntensity&&(s.lightMapIntensity=t.lightMapIntensity),void 0!==t.aoMap&&(s.aoMap=i(t.aoMap)),void 0!==t.aoMapIntensity&&(s.aoMapIntensity=t.aoMapIntensity),void 0!==t.gradientMap&&(s.gradientMap=i(t.gradientMap)),void 0!==t.clearcoatMap&&(s.clearcoatMap=i(t.clearcoatMap)),void 0!==t.clearcoatRoughnessMap&&(s.clearcoatRoughnessMap=i(t.clearcoatRoughnessMap)),void 0!==t.clearcoatNormalMap&&(s.clearcoatNormalMap=i(t.clearcoatNormalMap)),void 0!==t.clearcoatNormalScale&&(s.clearcoatNormalScale=(new _s).fromArray(t.clearcoatNormalScale)),void 0!==t.iridescenceMap&&(s.iridescenceMap=i(t.iridescenceMap)),void 0!==t.iridescenceThicknessMap&&(s.iridescenceThicknessMap=i(t.iridescenceThicknessMap)),void 0!==t.transmissionMap&&(s.transmissionMap=i(t.transmissionMap)),void 0!==t.thicknessMap&&(s.thicknessMap=i(t.thicknessMap)),void 0!==t.anisotropyMap&&(s.anisotropyMap=i(t.anisotropyMap)),void 0!==t.sheenColorMap&&(s.sheenColorMap=i(t.sheenColorMap)),void 0!==t.sheenRoughnessMap&&(s.sheenRoughnessMap=i(t.sheenRoughnessMap)),s}setTextures(t){return this.textures=t,this}createMaterialFromType(t){return uu.createMaterialFromType(t)}static createMaterialFromType(t){return new{ShadowMaterial:Wl,SpriteMaterial:Gn,RawShaderMaterial:Hl,ShaderMaterial:Yl,PointsMaterial:$o,MeshPhysicalMaterial:Gl,MeshStandardMaterial:Zl,MeshPhongMaterial:$l,MeshToonMaterial:Ql,MeshNormalMaterial:Kl,MeshLambertMaterial:tc,MeshDepthMaterial:ec,MeshDistanceMaterial:ic,MeshBasicMaterial:Ma,MeshMatcapMaterial:sc,LineDashedMaterial:rc,LineBasicMaterial:Eo,Material:Zn}[t]}}class du{static extractUrlBase(t){const e=t.lastIndexOf("/");return-1===e?"./":t.slice(0,e+1)}static resolveURL(t,e){return"string"!=typeof t||""===t?"":(/^https?:\/\//i.test(e)&&/^\//.test(t)&&(e=e.replace(/(^https?:\/\/[^\/]+).*/i,"$1")),/^(https?:)?\/\//i.test(t)||/^data:.*,.*$/i.test(t)||/^blob:.*$/i.test(t)?t:e+t)}}class pu extends Un{constructor(){super(),this.isInstancedBufferGeometry=!0,this.type="InstancedBufferGeometry",this.instanceCount=1/0}copy(t){return super.copy(t),this.instanceCount=t.instanceCount,this}toJSON(){const t=super.toJSON();return t.instanceCount=this.instanceCount,t.isInstancedBufferGeometry=!0,t}}class mu extends Ic{constructor(t){super(t)}load(t,e,i,s){const r=this,n=new Oc(r.manager);n.setPath(r.path),n.setRequestHeader(r.requestHeader),n.setWithCredentials(r.withCredentials),n.load(t,function(i){try{e(r.parse(JSON.parse(i)))}catch(e){s?s(e):os(e),r.manager.itemError(t)}},i,s)}parse(t){const e={},i={};function s(t,s){if(void 0!==e[s])return e[s];const r=t.interleavedBuffers[s],n=function(t,e){if(void 0!==i[e])return i[e];const s=t.arrayBuffers,r=s[e],n=new Uint32Array(r).buffer;return i[e]=n,n}(t,r.buffer),a=Gi(r.type,n),o=new qn(a,r.stride);return o.uuid=r.uuid,e[s]=o,o}const r=t.isInstancedBufferGeometry?new pu:new Un,n=t.data.index;if(void 0!==n){const t=Gi(n.type,n.array);r.setIndex(new Mn(t,1))}const a=t.data.attributes;for(const e in a){const i=a[e];let n;if(i.isInterleavedBufferAttribute){const e=s(t.data,i.data);n=new Xn(e,i.itemSize,i.offset,i.normalized)}else{const t=Gi(i.type,i.array);n=new(i.isInstancedBufferAttribute?$a:Mn)(t,i.itemSize,i.normalized)}void 0!==i.name&&(n.name=i.name),void 0!==i.usage&&n.setUsage(i.usage),r.setAttribute(e,n)}const o=t.data.morphAttributes;if(o)for(const e in o){const i=o[e],n=[];for(let e=0,r=i.length;e0){const i=new zc(e);r=new Vc(i),r.setCrossOrigin(this.crossOrigin);for(let e=0,i=t.length;e0){s=new Vc(this.manager),s.setCrossOrigin(this.crossOrigin);for(let e=0,s=t.length;e{let e=null,i=null;return void 0!==t.boundingBox&&(e=(new Qr).fromJSON(t.boundingBox)),void 0!==t.boundingSphere&&(i=(new Nn).fromJSON(t.boundingSphere)),{...t,boundingBox:e,boundingSphere:i}}),n._instanceInfo=t.instanceInfo,n._availableInstanceIds=t._availableInstanceIds,n._availableGeometryIds=t._availableGeometryIds,n._nextIndexStart=t.nextIndexStart,n._nextVertexStart=t.nextVertexStart,n._geometryCount=t.geometryCount,n._maxInstanceCount=t.maxInstanceCount,n._maxVertexCount=t.maxVertexCount,n._maxIndexCount=t.maxIndexCount,n._geometryInitialized=t.geometryInitialized,n._matricesTexture=c(t.matricesTexture.uuid),n._indirectTexture=c(t.indirectTexture.uuid),void 0!==t.colorsTexture&&(n._colorsTexture=c(t.colorsTexture.uuid)),void 0!==t.boundingSphere&&(n.boundingSphere=(new Nn).fromJSON(t.boundingSphere)),void 0!==t.boundingBox&&(n.boundingBox=(new Qr).fromJSON(t.boundingBox));break;case"LOD":n=new pa;break;case"Line":n=new Jo(h(t.geometry),l(t.material));break;case"LineLoop":n=new Go(h(t.geometry),l(t.material));break;case"LineSegments":n=new Zo(h(t.geometry),l(t.material));break;case"PointCloud":case"Points":n=new ih(h(t.geometry),l(t.material));break;case"Sprite":n=new la(l(t.material));break;case"Group":n=new Tr;break;case"Bone":n=new Xa;break;default:n=new Ar}if(n.uuid=t.uuid,void 0!==t.name&&(n.name=t.name),void 0!==t.matrix?(n.matrix.fromArray(t.matrix),void 0!==t.matrixAutoUpdate&&(n.matrixAutoUpdate=t.matrixAutoUpdate),n.matrixAutoUpdate&&n.matrix.decompose(n.position,n.quaternion,n.scale)):(void 0!==t.position&&n.position.fromArray(t.position),void 0!==t.rotation&&n.rotation.fromArray(t.rotation),void 0!==t.quaternion&&n.quaternion.fromArray(t.quaternion),void 0!==t.scale&&n.scale.fromArray(t.scale)),void 0!==t.up&&n.up.fromArray(t.up),void 0!==t.pivot&&(n.pivot=(new Ts).fromArray(t.pivot)),void 0!==t.morphTargetDictionary&&(n.morphTargetDictionary=Object.assign({},t.morphTargetDictionary)),void 0!==t.morphTargetInfluences&&(n.morphTargetInfluences=t.morphTargetInfluences.slice()),void 0!==t.castShadow&&(n.castShadow=t.castShadow),void 0!==t.receiveShadow&&(n.receiveShadow=t.receiveShadow),t.shadow&&(void 0!==t.shadow.intensity&&(n.shadow.intensity=t.shadow.intensity),void 0!==t.shadow.bias&&(n.shadow.bias=t.shadow.bias),void 0!==t.shadow.normalBias&&(n.shadow.normalBias=t.shadow.normalBias),void 0!==t.shadow.radius&&(n.shadow.radius=t.shadow.radius),void 0!==t.shadow.mapSize&&n.shadow.mapSize.fromArray(t.shadow.mapSize),void 0!==t.shadow.camera&&(n.shadow.camera=this.parseObject(t.shadow.camera))),void 0!==t.visible&&(n.visible=t.visible),void 0!==t.frustumCulled&&(n.frustumCulled=t.frustumCulled),void 0!==t.renderOrder&&(n.renderOrder=t.renderOrder),void 0!==t.static&&(n.static=t.static),void 0!==t.userData&&(n.userData=t.userData),void 0!==t.layers&&(n.layers.mask=t.layers),void 0!==t.children){const a=t.children;for(let t=0;t{if(!0!==bu.has(n))return e&&e(i),r.manager.itemEnd(t),i;s&&s(bu.get(n)),r.manager.itemError(t),r.manager.itemEnd(t)}):(setTimeout(function(){e&&e(n),r.manager.itemEnd(t)},0),n);const a={};a.credentials="anonymous"===this.crossOrigin?"same-origin":"include",a.headers=this.requestHeader,a.signal="function"==typeof AbortSignal.any?AbortSignal.any([this._abortController.signal,this.manager.abortController.signal]):this._abortController.signal;const o=fetch(t,a).then(function(t){return t.blob()}).then(function(t){return createImageBitmap(t,Object.assign(r.options,{colorSpaceConversion:"none"}))}).then(function(i){return Ac.add(`image-bitmap:${t}`,i),e&&e(i),r.manager.itemEnd(t),i}).catch(function(e){s&&s(e),bu.set(o,e),Ac.remove(`image-bitmap:${t}`),r.manager.itemError(t),r.manager.itemEnd(t)});Ac.add(`image-bitmap:${t}`,o),r.manager.itemStart(t)}abort(){return this._abortController.abort(),this._abortController=new AbortController,this}}let wu;class Mu{static getContext(){return void 0===wu&&(wu=new(window.AudioContext||window.webkitAudioContext)),wu}static setContext(t){wu=t}}class Su extends Ic{constructor(t){super(t)}load(t,e,i,s){const r=this,n=new Oc(this.manager);function a(e){s?s(e):os(e),r.manager.itemError(t)}n.setResponseType("arraybuffer"),n.setPath(this.path),n.setRequestHeader(this.requestHeader),n.setWithCredentials(this.withCredentials),n.load(t,function(t){try{const i=t.slice(0);Mu.getContext().decodeAudioData(i,function(t){e(t)}).catch(a)}catch(t){a(t)}},i,s)}}const _u=new Qs,Au=new Qs,Tu=new Qs;class zu{constructor(){this.type="StereoCamera",this.aspect=1,this.eyeSep=.064,this.cameraL=new Kc,this.cameraL.layers.enable(1),this.cameraL.matrixAutoUpdate=!1,this.cameraR=new Kc,this.cameraR.layers.enable(2),this.cameraR.matrixAutoUpdate=!1,this._cache={focus:null,fov:null,aspect:null,near:null,far:null,zoom:null,eyeSep:null}}update(t){const e=this._cache;if(e.focus!==t.focus||e.fov!==t.fov||e.aspect!==t.aspect*this.aspect||e.near!==t.near||e.far!==t.far||e.zoom!==t.zoom||e.eyeSep!==this.eyeSep){e.focus=t.focus,e.fov=t.fov,e.aspect=t.aspect*this.aspect,e.near=t.near,e.far=t.far,e.zoom=t.zoom,e.eyeSep=this.eyeSep,Tu.copy(t.projectionMatrix);const i=e.eyeSep/2,s=i*e.near/e.focus,r=e.near*Math.tan(ys*e.fov*.5)/e.zoom;let n,a;Au.elements[12]=-i,_u.elements[12]=i,n=-r*e.aspect+s,a=r*e.aspect+s,Tu.elements[0]=2*e.near/(a-n),Tu.elements[8]=(a+n)/(a-n),this.cameraL.projectionMatrix.copy(Tu),n=-r*e.aspect-s,a=r*e.aspect-s,Tu.elements[0]=2*e.near/(a-n),Tu.elements[8]=(a+n)/(a-n),this.cameraR.projectionMatrix.copy(Tu)}this.cameraL.matrixWorld.copy(t.matrixWorld).multiply(Au),this.cameraR.matrixWorld.copy(t.matrixWorld).multiply(_u)}}const Cu=-90;class Iu extends Ar{constructor(t,e,i){super(),this.type="CubeCamera",this.renderTarget=i,this.coordinateSystem=null,this.activeMipmapLevel=0;const s=new Kc(Cu,1,t,e);s.layers=this.layers,this.add(s);const r=new Kc(Cu,1,t,e);r.layers=this.layers,this.add(r);const n=new Kc(Cu,1,t,e);n.layers=this.layers,this.add(n);const a=new Kc(Cu,1,t,e);a.layers=this.layers,this.add(a);const o=new Kc(Cu,1,t,e);o.layers=this.layers,this.add(o);const h=new Kc(Cu,1,t,e);h.layers=this.layers,this.add(h)}updateCoordinateSystem(){const t=this.coordinateSystem,e=this.children.concat(),[i,s,r,n,a,o]=e;for(const t of e)this.remove(t);if(t===Ui)i.up.set(0,1,0),i.lookAt(1,0,0),s.up.set(0,1,0),s.lookAt(-1,0,0),r.up.set(0,0,-1),r.lookAt(0,1,0),n.up.set(0,0,1),n.lookAt(0,-1,0),a.up.set(0,1,0),a.lookAt(0,0,1),o.up.set(0,1,0),o.lookAt(0,0,-1);else{if(t!==qi)throw new Error("THREE.CubeCamera.updateCoordinateSystem(): Invalid coordinate system: "+t);i.up.set(0,-1,0),i.lookAt(-1,0,0),s.up.set(0,-1,0),s.lookAt(1,0,0),r.up.set(0,0,1),r.lookAt(0,1,0),n.up.set(0,0,-1),n.lookAt(0,-1,0),a.up.set(0,-1,0),a.lookAt(0,0,1),o.up.set(0,-1,0),o.lookAt(0,0,-1)}for(const t of e)this.add(t),t.updateMatrixWorld()}update(t,e){null===this.parent&&this.updateMatrixWorld();const{renderTarget:i,activeMipmapLevel:s}=this;this.coordinateSystem!==t.coordinateSystem&&(this.coordinateSystem=t.coordinateSystem,this.updateCoordinateSystem());const[r,n,a,o,h,l]=this.children,c=t.getRenderTarget(),u=t.getActiveCubeFace(),d=t.getActiveMipmapLevel(),p=t.xr.enabled;t.xr.enabled=!1;const m=i.texture.generateMipmaps;i.texture.generateMipmaps=!1;let y=!1;y=!0===t.isWebGLRenderer?t.state.buffers.depth.getReversed():t.reversedDepthBuffer,t.setRenderTarget(i,0,s),y&&!1===t.autoClear&&t.clearDepth(),t.render(e,r),t.setRenderTarget(i,1,s),y&&!1===t.autoClear&&t.clearDepth(),t.render(e,n),t.setRenderTarget(i,2,s),y&&!1===t.autoClear&&t.clearDepth(),t.render(e,a),t.setRenderTarget(i,3,s),y&&!1===t.autoClear&&t.clearDepth(),t.render(e,o),t.setRenderTarget(i,4,s),y&&!1===t.autoClear&&t.clearDepth(),t.render(e,h),i.texture.generateMipmaps=m,t.setRenderTarget(i,5,s),y&&!1===t.autoClear&&t.clearDepth(),t.render(e,l),t.setRenderTarget(c,u,d),t.xr.enabled=p,i.texture.needsPMREMUpdate=!0}}class Bu extends Kc{constructor(t=[]){super(),this.isArrayCamera=!0,this.isMultiViewCamera=!1,this.cameras=t}}class ku{constructor(){this._previousTime=0,this._currentTime=0,this._startTime=performance.now(),this._delta=0,this._elapsed=0,this._timescale=1,this._document=null,this._pageVisibilityHandler=null}connect(t){this._document=t,void 0!==t.hidden&&(this._pageVisibilityHandler=Ou.bind(this),t.addEventListener("visibilitychange",this._pageVisibilityHandler,!1))}disconnect(){null!==this._pageVisibilityHandler&&(this._document.removeEventListener("visibilitychange",this._pageVisibilityHandler),this._pageVisibilityHandler=null),this._document=null}getDelta(){return this._delta/1e3}getElapsed(){return this._elapsed/1e3}getTimescale(){return this._timescale}setTimescale(t){return this._timescale=t,this}reset(){return this._currentTime=performance.now()-this._startTime,this}dispose(){this.disconnect()}update(t){return null!==this._pageVisibilityHandler&&!0===this._document.hidden?this._delta=0:(this._previousTime=this._currentTime,this._currentTime=(void 0!==t?t:performance.now())-this._startTime,this._delta=(this._currentTime-this._previousTime)*this._timescale,this._elapsed+=this._delta),this}}function Ou(){!1===this._document.hidden&&this.reset()}const Pu=new Ts,Ru=new As,Nu=new Ts,Vu=new Ts,Eu=new Ts;class Fu extends Ar{constructor(){super(),this.type="AudioListener",this.context=Mu.getContext(),this.gain=this.context.createGain(),this.gain.connect(this.context.destination),this.filter=null,this.timeDelta=0,this._timer=new ku}getInput(){return this.gain}removeFilter(){return null!==this.filter&&(this.gain.disconnect(this.filter),this.filter.disconnect(this.context.destination),this.gain.connect(this.context.destination),this.filter=null),this}getFilter(){return this.filter}setFilter(t){return null!==this.filter?(this.gain.disconnect(this.filter),this.filter.disconnect(this.context.destination)):this.gain.disconnect(this.context.destination),this.filter=t,this.gain.connect(this.filter),this.filter.connect(this.context.destination),this}getMasterVolume(){return this.gain.gain.value}setMasterVolume(t){return this.gain.gain.setTargetAtTime(t,this.context.currentTime,.01),this}updateMatrixWorld(t){super.updateMatrixWorld(t),this._timer.update();const e=this.context.listener;if(this.timeDelta=this._timer.getDelta(),this.matrixWorld.decompose(Pu,Ru,Nu),Vu.set(0,0,-1).applyQuaternion(Ru),Eu.set(0,1,0).applyQuaternion(Ru),e.positionX){const t=this.context.currentTime+this.timeDelta;e.positionX.linearRampToValueAtTime(Pu.x,t),e.positionY.linearRampToValueAtTime(Pu.y,t),e.positionZ.linearRampToValueAtTime(Pu.z,t),e.forwardX.linearRampToValueAtTime(Vu.x,t),e.forwardY.linearRampToValueAtTime(Vu.y,t),e.forwardZ.linearRampToValueAtTime(Vu.z,t),e.upX.linearRampToValueAtTime(Eu.x,t),e.upY.linearRampToValueAtTime(Eu.y,t),e.upZ.linearRampToValueAtTime(Eu.z,t)}else e.setPosition(Pu.x,Pu.y,Pu.z),e.setOrientation(Vu.x,Vu.y,Vu.z,Eu.x,Eu.y,Eu.z)}}class Lu extends Ar{constructor(t){super(),this.type="Audio",this.listener=t,this.context=t.context,this.gain=this.context.createGain(),this.gain.connect(t.getInput()),this.autoplay=!1,this.buffer=null,this.detune=0,this.loop=!1,this.loopStart=0,this.loopEnd=0,this.offset=0,this.duration=void 0,this.playbackRate=1,this.isPlaying=!1,this.hasPlaybackControl=!0,this.source=null,this.sourceType="empty",this._startedAt=0,this._progress=0,this._connected=!1,this.filters=[]}getOutput(){return this.gain}setNodeSource(t){return this.hasPlaybackControl=!1,this.sourceType="audioNode",this.source=t,this.connect(),this}setMediaElementSource(t){return this.hasPlaybackControl=!1,this.sourceType="mediaNode",this.source=this.context.createMediaElementSource(t),this.connect(),this}setMediaStreamSource(t){return this.hasPlaybackControl=!1,this.sourceType="mediaStreamNode",this.source=this.context.createMediaStreamSource(t),this.connect(),this}setBuffer(t){return this.buffer=t,this.sourceType="buffer",this.autoplay&&this.play(),this}play(t=0){if(!0===this.isPlaying)return void as("Audio: Audio is already playing.");if(!1===this.hasPlaybackControl)return void as("Audio: this Audio has no playback control.");this._startedAt=this.context.currentTime+t;const e=this.context.createBufferSource();return e.buffer=this.buffer,e.loop=this.loop,e.loopStart=this.loopStart,e.loopEnd=this.loopEnd,e.onended=this.onEnded.bind(this),e.start(this._startedAt,this._progress+this.offset,this.duration),this.isPlaying=!0,this.source=e,this.setDetune(this.detune),this.setPlaybackRate(this.playbackRate),this.connect()}pause(){if(!1!==this.hasPlaybackControl)return!0===this.isPlaying&&(this._progress+=Math.max(this.context.currentTime-this._startedAt,0)*this.playbackRate,!0===this.loop&&(this._progress=this._progress%(this.duration||this.buffer.duration)),this.source.stop(),this.source.onended=null,this.isPlaying=!1),this;as("Audio: this Audio has no playback control.")}stop(t=0){if(!1!==this.hasPlaybackControl)return this._progress=0,null!==this.source&&(this.source.stop(this.context.currentTime+t),this.source.onended=null),this.isPlaying=!1,this;as("Audio: this Audio has no playback control.")}connect(){if(this.filters.length>0){this.source.connect(this.filters[0]);for(let t=1,e=this.filters.length;t0){this.source.disconnect(this.filters[0]);for(let t=1,e=this.filters.length;t0&&this._mixBufferRegionAdditive(i,s,this._addIndex*e,1,e);for(let t=e,r=e+e;t!==r;++t)if(i[t]!==i[t+e]){a.setValue(i,s);break}}saveOriginalState(){const t=this.binding,e=this.buffer,i=this.valueSize,s=i*this._origIndex;t.getValue(e,s);for(let t=i,r=s;t!==r;++t)e[t]=e[s+t%i];this._setIdentity(),this.cumulativeWeight=0,this.cumulativeWeightAdditive=0}restoreOriginalState(){const t=3*this.valueSize;this.binding.setValue(this.buffer,t)}_setAdditiveIdentityNumeric(){const t=this._addIndex*this.valueSize,e=t+this.valueSize;for(let i=t;i=.5)for(let s=0;s!==r;++s)t[e+s]=t[i+s]}_slerp(t,e,i,s){As.slerpFlat(t,e,t,e,t,i,s)}_slerpAdditive(t,e,i,s,r){const n=this._workIndex*r;As.multiplyQuaternionsFlat(t,n,t,e,t,i),As.slerpFlat(t,e,t,e,t,n,s)}_lerp(t,e,i,s,r){const n=1-s;for(let a=0;a!==r;++a){const r=e+a;t[r]=t[r]*n+t[i+a]*s}}_lerpAdditive(t,e,i,s,r){for(let n=0;n!==r;++n){const r=e+n;t[r]=t[r]+t[i+n]*s}}}const Yu="\\[\\]\\.:\\/",Hu=new RegExp("["+Yu+"]","g"),Zu="[^"+Yu+"]",Gu="[^"+Yu.replace("\\.","")+"]",$u=new RegExp("^"+/((?:WC+[\/:])*)/.source.replace("WC",Zu)+/(WCOD+)?/.source.replace("WCOD",Gu)+/(?:\.(WC+)(?:\[(.+)\])?)?/.source.replace("WC",Zu)+/\.(WC+)(?:\[(.+)\])?/.source.replace("WC",Zu)+"$"),Qu=["material","materials","bones","map"];class Ku{constructor(t,e,i){this.path=e,this.parsedPath=i||Ku.parseTrackName(e),this.node=Ku.findNode(t,this.parsedPath.nodeName),this.rootNode=t,this.getValue=this._getValue_unbound,this.setValue=this._setValue_unbound}static create(t,e,i){return t&&t.isAnimationObjectGroup?new Ku.Composite(t,e,i):new Ku(t,e,i)}static sanitizeNodeName(t){return t.replace(/\s/g,"_").replace(Hu,"")}static parseTrackName(t){const e=$u.exec(t);if(null===e)throw new Error("PropertyBinding: Cannot parse trackName: "+t);const i={nodeName:e[2],objectName:e[3],objectIndex:e[4],propertyName:e[5],propertyIndex:e[6]},s=i.nodeName&&i.nodeName.lastIndexOf(".");if(void 0!==s&&-1!==s){const t=i.nodeName.substring(s+1);-1!==Qu.indexOf(t)&&(i.nodeName=i.nodeName.substring(0,s),i.objectName=t)}if(null===i.propertyName||0===i.propertyName.length)throw new Error("PropertyBinding: can not parse propertyName from trackName: "+t);return i}static findNode(t,e){if(void 0===e||""===e||"."===e||-1===e||e===t.name||e===t.uuid)return t;if(t.skeleton){const i=t.skeleton.getBoneByName(e);if(void 0!==i)return i}if(t.children){const i=function(t){for(let s=0;s=r){const n=r++,l=t[n];e[l.uuid]=h,t[h]=l,e[o]=n,t[n]=a;for(let t=0,e=s;t!==e;++t){const e=i[t],s=e[n],r=e[h];e[h]=s,e[n]=r}}}this.nCachedObjects_=r}uncache(){const t=this._objects,e=this._indicesByUUID,i=this._bindings,s=i.length;let r=this.nCachedObjects_,n=t.length;for(let a=0,o=arguments.length;a!==o;++a){const o=arguments[a].uuid,h=e[o];if(void 0!==h)if(delete e[o],h0&&(e[a.uuid]=h),t[h]=a,t.pop();for(let t=0,e=s;t!==e;++t){const e=i[t];e[h]=e[r],e.pop()}}}this.nCachedObjects_=r}subscribe_(t,e){const i=this._bindingsIndicesByPath;let s=i[t];const r=this._bindings;if(void 0!==s)return r[s];const n=this._paths,a=this._parsedPaths,o=this._objects,h=o.length,l=this.nCachedObjects_,c=new Array(h);s=r.length,i[t]=s,n.push(t),a.push(e),r.push(c);for(let i=l,s=o.length;i!==s;++i){const s=o[i];c[i]=new Ku(s,t,e)}return c}unsubscribe_(t){const e=this._bindingsIndicesByPath,i=e[t];if(void 0!==i){const s=this._paths,r=this._parsedPaths,n=this._bindings,a=n.length-1,o=n[a];e[t[a]]=i,n[i]=o,n.pop(),r[i]=r[a],r.pop(),s[i]=s[a],s.pop()}}}class ed{constructor(t,e,i=null,s=e.blendMode){this._mixer=t,this._clip=e,this._localRoot=i,this.blendMode=s;const r=e.tracks,n=r.length,a=new Array(n),o={endingStart:je,endingEnd:je};for(let t=0;t!==n;++t){const e=r[t].createInterpolant(null);a[t]=e,e.settings&&Object.assign(o,e.settings),e.settings=o}this._interpolantSettings=o,this._interpolants=a,this._propertyBindings=new Array(n),this._cacheIndex=null,this._byClipCacheIndex=null,this._timeScaleInterpolant=null,this._weightInterpolant=null,this.loop=2201,this._loopCount=-1,this._startTime=null,this.time=0,this.timeScale=1,this._effectiveTimeScale=1,this.weight=1,this._effectiveWeight=1,this.repetitions=1/0,this.paused=!1,this.enabled=!0,this.clampWhenFinished=!1,this.zeroSlopeAtStart=!0,this.zeroSlopeAtEnd=!0}play(){return this._mixer._activateAction(this),this}stop(){return this._mixer._deactivateAction(this),this.reset()}reset(){return this.paused=!1,this.enabled=!0,this.time=0,this._loopCount=-1,this._startTime=null,this.stopFading().stopWarping()}isRunning(){return this.enabled&&!this.paused&&0!==this.timeScale&&null===this._startTime&&this._mixer._isActiveAction(this)}isScheduled(){return this._mixer._isActiveAction(this)}startAt(t){return this._startTime=t,this}setLoop(t,e){return this.loop=t,this.repetitions=e,this}setEffectiveWeight(t){return this.weight=t,this._effectiveWeight=this.enabled?t:0,this.stopFading()}getEffectiveWeight(){return this._effectiveWeight}fadeIn(t){return this._scheduleFading(t,0,1)}fadeOut(t){return this._scheduleFading(t,1,0)}crossFadeFrom(t,e,i=!1){if(t.fadeOut(e),this.fadeIn(e),!0===i){const i=this._clip.duration,s=t._clip.duration,r=s/i,n=i/s;t.warp(1,r,e),this.warp(n,1,e)}return this}crossFadeTo(t,e,i=!1){return t.crossFadeFrom(this,e,i)}stopFading(){const t=this._weightInterpolant;return null!==t&&(this._weightInterpolant=null,this._mixer._takeBackControlInterpolant(t)),this}setEffectiveTimeScale(t){return this.timeScale=t,this._effectiveTimeScale=this.paused?0:t,this.stopWarping()}getEffectiveTimeScale(){return this._effectiveTimeScale}setDuration(t){return this.timeScale=this._clip.duration/t,this.stopWarping()}syncWith(t){return this.time=t.time,this.timeScale=t.timeScale,this.stopWarping()}halt(t){return this.warp(this._effectiveTimeScale,0,t)}warp(t,e,i){const s=this._mixer,r=s.time,n=this.timeScale;let a=this._timeScaleInterpolant;null===a&&(a=s._lendControlInterpolant(),this._timeScaleInterpolant=a);const o=a.parameterPositions,h=a.sampleValues;return o[0]=r,o[1]=r+i,h[0]=t/n,h[1]=e/n,this}stopWarping(){const t=this._timeScaleInterpolant;return null!==t&&(this._timeScaleInterpolant=null,this._mixer._takeBackControlInterpolant(t)),this}getMixer(){return this._mixer}getClip(){return this._clip}getRoot(){return this._localRoot||this._mixer._root}_update(t,e,i,s){if(!this.enabled)return void this._updateWeight(t);const r=this._startTime;if(null!==r){const s=(t-r)*i;s<0||0===i?e=0:(this._startTime=null,e=i*s)}e*=this._updateTimeScale(t);const n=this._updateTime(e),a=this._updateWeight(t);if(a>0){const t=this._interpolants,e=this._propertyBindings;if(this.blendMode===qe)for(let i=0,s=t.length;i!==s;++i)t[i].evaluate(n),e[i].accumulateAdditive(a);else for(let i=0,r=t.length;i!==r;++i)t[i].evaluate(n),e[i].accumulate(s,a)}}_updateWeight(t){let e=0;if(this.enabled){e=this.weight;const i=this._weightInterpolant;if(null!==i){const s=i.evaluate(t)[0];e*=s,t>i.parameterPositions[1]&&(this.stopFading(),0===s&&(this.enabled=!1))}}return this._effectiveWeight=e,e}_updateTimeScale(t){let e=0;if(!this.paused){e=this.timeScale;const i=this._timeScaleInterpolant;if(null!==i){e*=i.evaluate(t)[0],t>i.parameterPositions[1]&&(this.stopWarping(),0===e?this.paused=!0:this.timeScale=e)}}return this._effectiveTimeScale=e,e}_updateTime(t){const e=this._clip.duration,i=this.loop;let s=this.time+t,r=this._loopCount;const n=2202===i;if(0===t)return-1===r||!n||1&~r?s:e-s;if(2200===i){-1===r&&(this._loopCount=0,this._setEndings(!0,!0,!1));t:{if(s>=e)s=e;else{if(!(s<0)){this.time=s;break t}s=0}this.clampWhenFinished?this.paused=!0:this.enabled=!1,this.time=s,this._mixer.dispatchEvent({type:"finished",action:this,direction:t<0?-1:1})}}else{if(-1===r&&(t>=0?(r=0,this._setEndings(!0,0===this.repetitions,n)):this._setEndings(0===this.repetitions,!0,n)),s>=e||s<0){const i=Math.floor(s/e);s-=e*i,r+=Math.abs(i);const a=this.repetitions-r;if(a<=0)this.clampWhenFinished?this.paused=!0:this.enabled=!1,s=t>0?e:0,this.time=s,this._mixer.dispatchEvent({type:"finished",action:this,direction:t>0?1:-1});else{if(1===a){const e=t<0;this._setEndings(e,!e,n)}else this._setEndings(!1,!1,n);this._loopCount=r,this.time=s,this._mixer.dispatchEvent({type:"loop",action:this,loopDelta:i})}}else this._loopCount=r,this.time=s;if(n&&!(1&~r))return e-s}return s}_setEndings(t,e,i){const s=this._interpolantSettings;i?(s.endingStart=De,s.endingEnd=De):(s.endingStart=t?this.zeroSlopeAtStart?De:je:We,s.endingEnd=e?this.zeroSlopeAtEnd?De:je:We)}_scheduleFading(t,e,i){const s=this._mixer,r=s.time;let n=this._weightInterpolant;null===n&&(n=s._lendControlInterpolant(),this._weightInterpolant=n);const a=n.parameterPositions,o=n.sampleValues;return a[0]=r,o[0]=e,a[1]=r+t,o[1]=i,this}}const id=new Float32Array(1);class sd extends ds{constructor(t){super(),this._root=t,this._initMemoryManager(),this._accuIndex=0,this.time=0,this.timeScale=1,"undefined"!=typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe",{detail:this}))}_bindAction(t,e){const i=t._localRoot||this._root,s=t._clip.tracks,r=s.length,n=t._propertyBindings,a=t._interpolants,o=i.uuid,h=this._bindingsByRootAndName;let l=h[o];void 0===l&&(l={},h[o]=l);for(let t=0;t!==r;++t){const r=s[t],h=r.name;let c=l[h];if(void 0!==c)++c.referenceCount,n[t]=c;else{if(c=n[t],void 0!==c){null===c._cacheIndex&&(++c.referenceCount,this._addInactiveBinding(c,o,h));continue}const s=e&&e._propertyBindings[t].binding.parsedPath;c=new Xu(Ku.create(i,h,s),r.ValueTypeName,r.getValueSize()),++c.referenceCount,this._addInactiveBinding(c,o,h),n[t]=c}a[t].resultBuffer=c.buffer}}_activateAction(t){if(!this._isActiveAction(t)){if(null===t._cacheIndex){const e=(t._localRoot||this._root).uuid,i=t._clip.uuid,s=this._actionsByClip[i];this._bindAction(t,s&&s.knownActions[0]),this._addInactiveAction(t,i,e)}const e=t._propertyBindings;for(let t=0,i=e.length;t!==i;++t){const i=e[t];0===i.useCount++&&(this._lendBinding(i),i.saveOriginalState())}this._lendAction(t)}}_deactivateAction(t){if(this._isActiveAction(t)){const e=t._propertyBindings;for(let t=0,i=e.length;t!==i;++t){const i=e[t];0===--i.useCount&&(i.restoreOriginalState(),this._takeBackBinding(i))}this._takeBackAction(t)}}_initMemoryManager(){this._actions=[],this._nActiveActions=0,this._actionsByClip={},this._bindings=[],this._nActiveBindings=0,this._bindingsByRootAndName={},this._controlInterpolants=[],this._nActiveControlInterpolants=0;const t=this;this.stats={actions:{get total(){return t._actions.length},get inUse(){return t._nActiveActions}},bindings:{get total(){return t._bindings.length},get inUse(){return t._nActiveBindings}},controlInterpolants:{get total(){return t._controlInterpolants.length},get inUse(){return t._nActiveControlInterpolants}}}}_isActiveAction(t){const e=t._cacheIndex;return null!==e&&e=0;--e)t[e].stop();return this}update(t){t*=this.timeScale;const e=this._actions,i=this._nActiveActions,s=this.time+=t,r=Math.sign(t),n=this._accuIndex^=1;for(let a=0;a!==i;++a){e[a]._update(s,t,r,n)}const a=this._bindings,o=this._nActiveBindings;for(let t=0;t!==o;++t)a[t].apply(n);return this}setTime(t){this.time=0;for(let t=0;t=this.min.x&&t.x<=this.max.x&&t.y>=this.min.y&&t.y<=this.max.y}containsBox(t){return this.min.x<=t.min.x&&t.max.x<=this.max.x&&this.min.y<=t.min.y&&t.max.y<=this.max.y}getParameter(t,e){return e.set((t.x-this.min.x)/(this.max.x-this.min.x),(t.y-this.min.y)/(this.max.y-this.min.y))}intersectsBox(t){return t.max.x>=this.min.x&&t.min.x<=this.max.x&&t.max.y>=this.min.y&&t.min.y<=this.max.y}clampPoint(t,e){return e.copy(t).clamp(this.min,this.max)}distanceToPoint(t){return this.clampPoint(t,xd).distanceTo(t)}intersect(t){return this.min.max(t.min),this.max.min(t.max),this.isEmpty()&&this.makeEmpty(),this}union(t){return this.min.min(t.min),this.max.max(t.max),this}translate(t){return this.min.add(t),this.max.add(t),this}equals(t){return t.min.equals(this.min)&&t.max.equals(this.max)}}const vd=new Ts,wd=new Ts,Md=new Ts,Sd=new Ts,_d=new Ts,Ad=new Ts,Td=new Ts;class zd{constructor(t=new Ts,e=new Ts){this.start=t,this.end=e}set(t,e){return this.start.copy(t),this.end.copy(e),this}copy(t){return this.start.copy(t.start),this.end.copy(t.end),this}getCenter(t){return t.addVectors(this.start,this.end).multiplyScalar(.5)}delta(t){return t.subVectors(this.end,this.start)}distanceSq(){return this.start.distanceToSquared(this.end)}distance(){return this.start.distanceTo(this.end)}at(t,e){return this.delta(e).multiplyScalar(t).add(this.start)}closestPointToPointParameter(t,e){vd.subVectors(t,this.start),wd.subVectors(this.end,this.start);const i=wd.dot(wd);let s=wd.dot(vd)/i;return e&&(s=xs(s,0,1)),s}closestPointToPoint(t,e,i){const s=this.closestPointToPointParameter(t,e);return this.delta(i).multiplyScalar(s).add(this.start)}distanceSqToLine3(t,e=Ad,i=Td){const s=1e-8*1e-8;let r,n;const a=this.start,o=t.start,h=this.end,l=t.end;Md.subVectors(h,a),Sd.subVectors(l,o),_d.subVectors(a,o);const c=Md.dot(Md),u=Sd.dot(Sd),d=Sd.dot(_d);if(c<=s&&u<=s)return e.copy(a),i.copy(o),e.sub(i),e.dot(e);if(c<=s)r=0,n=d/u,n=xs(n,0,1);else{const t=Md.dot(_d);if(u<=s)n=0,r=xs(-t/c,0,1);else{const e=Md.dot(Sd),i=c*u-e*e;r=0!==i?xs((e*d-t*u)/i,0,1):0,n=(e*r+d)/u,n<0?(n=0,r=xs(-t/c,0,1)):n>1&&(n=1,r=xs((e-t)/c,0,1))}}return e.copy(a).addScaledVector(Md,r),i.copy(o).addScaledVector(Sd,n),e.distanceToSquared(i)}applyMatrix4(t){return this.start.applyMatrix4(t),this.end.applyMatrix4(t),this}equals(t){return t.start.equals(this.start)&&t.end.equals(this.end)}clone(){return(new this.constructor).copy(this)}}const Cd=new Ts;class Id extends Ar{constructor(t,e){super(),this.light=t,this.matrixAutoUpdate=!1,this.color=e,this.type="SpotLightHelper";const i=new Un,s=[0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,-1,0,1,0,0,0,0,1,1,0,0,0,0,-1,1];for(let t=0,e=1,i=32;t1)for(let i=0;i.99999)this.quaternion.set(0,0,0,1);else if(t.y<-.99999)this.quaternion.set(1,0,0,0);else{tp.set(t.z,0,-t.x).normalize();const e=Math.acos(t.y);this.quaternion.setFromAxisAngle(tp,e)}}setLength(t,e=.2*t,i=.2*e){this.line.scale.set(1,Math.max(1e-4,t-e),1),this.line.updateMatrix(),this.cone.scale.set(i,e,i),this.cone.position.y=t,this.cone.updateMatrix()}setColor(t){this.line.material.color.set(t),this.cone.material.color.set(t)}copy(t){return super.copy(t,!1),this.line.copy(t.line),this.cone.copy(t.cone),this}dispose(){this.line.geometry.dispose(),this.line.material.dispose(),this.cone.geometry.dispose(),this.cone.material.dispose()}}class rp extends Zo{constructor(t=1){const e=[0,0,0,t,0,0,0,0,0,0,t,0,0,0,0,0,0,t],i=new Un;i.setAttribute("position",new kn(e,3)),i.setAttribute("color",new kn([1,0,0,1,.6,0,0,1,0,.6,1,0,0,0,1,0,.6,1],3));super(i,new Eo({vertexColors:!0,toneMapped:!1})),this.type="AxesHelper"}setColors(t,e,i){const s=new Pr,r=this.geometry.attributes.color.array;return s.set(t),s.toArray(r,0),s.toArray(r,3),s.set(e),s.toArray(r,6),s.toArray(r,9),s.set(i),s.toArray(r,12),s.toArray(r,15),this.geometry.attributes.color.needsUpdate=!0,this}dispose(){this.geometry.dispose(),this.material.dispose()}}class np{constructor(){this.type="ShapePath",this.color=new Pr,this.subPaths=[],this.currentPath=null}moveTo(t,e){return this.currentPath=new Hh,this.subPaths.push(this.currentPath),this.currentPath.moveTo(t,e),this}lineTo(t,e){return this.currentPath.lineTo(t,e),this}quadraticCurveTo(t,e,i,s){return this.currentPath.quadraticCurveTo(t,e,i,s),this}bezierCurveTo(t,e,i,s,r,n){return this.currentPath.bezierCurveTo(t,e,i,s,r,n),this}splineThru(t){return this.currentPath.splineThru(t),this}toShapes(t){function e(t,e){const i=e.length;let s=!1;for(let r=i-1,n=0;nNumber.EPSILON){if(h<0&&(i=e[n],o=-o,a=e[r],h=-h),t.ya.y)continue;if(t.y===i.y){if(t.x===i.x)return!0}else{const e=h*(t.x-i.x)-o*(t.y-i.y);if(0===e)return!0;if(e<0)continue;s=!s}}else{if(t.y!==i.y)continue;if(a.x<=t.x&&t.x<=i.x||i.x<=t.x&&t.x<=a.x)return!0}}return s}const i=Sl.isClockWise,s=this.subPaths;if(0===s.length)return[];let r,n,a;const o=[];if(1===s.length)return n=s[0],a=new Zh,a.curves=n.curves,o.push(a),o;let h=!i(s[0].getPoints());h=t?!h:h;const l=[],c=[];let u,d,p=[],m=0;c[m]=void 0,p[m]=[];for(let e=0,a=s.length;e1){let t=!1,i=0;for(let t=0,e=c.length;t0&&!1===t&&(p=l)}for(let t=0,e=c.length;te?(t.repeat.x=1,t.repeat.y=i/e,t.offset.x=0,t.offset.y=(1-t.repeat.y)/2):(t.repeat.x=e/i,t.repeat.y=1,t.offset.x=(1-t.repeat.x)/2,t.offset.y=0),t}(t,e)}static cover(t,e){return function(t,e){const i=t.image&&t.image.width?t.image.width/t.image.height:1;return i>e?(t.repeat.x=e/i,t.repeat.y=1,t.offset.x=(1-t.repeat.x)/2,t.offset.y=0):(t.repeat.x=1,t.repeat.y=i/e,t.offset.x=0,t.offset.y=(1-t.repeat.y)/2),t}(t,e)}static fill(t){return function(t){return t.repeat.x=1,t.repeat.y=1,t.offset.x=0,t.offset.y=0,t}(t)}static getByteLength(t,e,i,s){return op(t,e,i,s)}}"undefined"!=typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("register",{detail:{revision:t}})),"undefined"!=typeof window&&(window.__THREE__?as("WARNING: Multiple instances of Three.js being imported."):window.__THREE__=t);export{it as ACESFilmicToneMapping,w as AddEquation,$ as AddOperation,qe as AdditiveAnimationBlendMode,g as AdditiveBlending,rt as AgXToneMapping,jt as AlphaFormat,ki as AlwaysCompare,W as AlwaysDepth,Si as AlwaysStencilFunc,ou as AmbientLight,ed as AnimationAction,Sc as AnimationClip,Pc as AnimationLoader,sd as AnimationMixer,td as AnimationObjectGroup,lc as AnimationUtils,Ih as ArcCurve,Bu as ArrayCamera,sp as ArrowHelper,at as AttachedBindMode,Lu as Audio,Ju as AudioAnalyser,Mu as AudioContext,Fu as AudioListener,Su as AudioLoader,rp as AxesHelper,d as BackSide,He as BasicDepthPacking,o as BasicShadowMap,Vo as BatchedMesh,mc as BezierInterpolant,Xa as Bone,gc as BooleanKeyframeTrack,bd as Box2,Qr as Box3,Qd as Box3Helper,yh as BoxGeometry,$d as BoxHelper,Mn as BufferAttribute,Un as BufferGeometry,mu as BufferGeometryLoader,Ct as ByteType,Ac as Cache,Zc as Camera,Hd as CameraHelper,uh as CanvasTexture,gh as CapsuleGeometry,Nh as CatmullRomCurve3,et as CineonToneMapping,fh as CircleGeometry,yt as ClampToEdgeWrapping,md as Clock,Pr as Color,fc as ColorKeyframeTrack,Rs as ColorManagement,Hi as Compatibility,hh as CompressedArrayTexture,lh as CompressedCubeTexture,oh as CompressedTexture,Rc as CompressedTextureLoader,bh as ConeGeometry,L as ConstantAlphaFactor,E as ConstantColorFactor,ap as Controls,Iu as CubeCamera,ph as CubeDepthTexture,lt as CubeReflectionMapping,ct as CubeRefractionMapping,ch as CubeTexture,Ec as CubeTextureLoader,pt as CubeUVReflectionMapping,Lh as CubicBezierCurve,jh as CubicBezierCurve3,uc as CubicInterpolant,r as CullFaceBack,n as CullFaceFront,a as CullFaceFrontBack,s as CullFaceNone,zh as Curve,Yh as CurvePath,b as CustomBlending,st as CustomToneMapping,xh as CylinderGeometry,gd as Cylindrical,Gs as Data3DTexture,Hs as DataArrayTexture,Ya as DataTexture,Fc as DataTextureLoader,xn as DataUtils,di as DecrementStencilOp,mi as DecrementWrapStencilOp,Cc as DefaultLoadingManager,Ut as DepthFormat,qt as DepthStencilFormat,dh as DepthTexture,ot as DetachedBindMode,au as DirectionalLight,Jd as DirectionalLightHelper,pc as DiscreteInterpolant,wh as DodecahedronGeometry,p as DoubleSide,O as DstAlphaFactor,R as DstColorFactor,Li as DynamicCopyUsage,Pi as DynamicDrawUsage,Vi as DynamicReadUsage,Th as EdgesGeometry,Ch as EllipseCurve,Ti as EqualCompare,J as EqualDepth,xi as EqualStencilFunc,ut as EquirectangularReflectionMapping,dt as EquirectangularRefractionMapping,hr as Euler,ds as EventDispatcher,mh as ExternalTexture,Tl as ExtrudeGeometry,Oc as FileLoader,Bn as Float16BufferAttribute,kn as Float32BufferAttribute,Pt as FloatType,Vr as Fog,Nr as FogExp2,ah as FramebufferTexture,u as FrontSide,mo as Frustum,fo as FrustumArray,ld as GLBufferAttribute,Di as GLSL1,Wi as GLSL3,Ci as GreaterCompare,Y as GreaterDepth,Bi as GreaterEqualCompare,X as GreaterEqualDepth,Mi as GreaterEqualStencilFunc,vi as GreaterStencilFunc,jd as GridHelper,Tr as Group,Rt as HalfFloatType,Dc as HemisphereLight,Ld as HemisphereLightHelper,Cl as IcosahedronGeometry,vu as ImageBitmapLoader,Vc as ImageLoader,Fs as ImageUtils,ui as IncrementStencilOp,pi as IncrementWrapStencilOp,$a as InstancedBufferAttribute,pu as InstancedBufferGeometry,hd as InstancedInterleavedBuffer,no as InstancedMesh,Tn as Int16BufferAttribute,Cn as Int32BufferAttribute,Sn as Int8BufferAttribute,kt as IntType,qn as InterleavedBuffer,Xn as InterleavedBufferAttribute,cc as Interpolant,Le as InterpolateBezier,Ve as InterpolateDiscrete,Ee as InterpolateLinear,Fe as InterpolateSmooth,Yi as InterpolationSamplingMode,Xi as InterpolationSamplingType,yi as InvertStencilOp,li as KeepStencilOp,yc as KeyframeTrack,pa as LOD,Il as LatheGeometry,lr as Layers,Ai as LessCompare,U as LessDepth,zi as LessEqualCompare,q as LessEqualDepth,bi as LessEqualStencilFunc,fi as LessStencilFunc,jc as Light,cu as LightProbe,Jo as Line,zd as Line3,Eo as LineBasicMaterial,Dh as LineCurve,Wh as LineCurve3,rc as LineDashedMaterial,Go as LineLoop,Zo as LineSegments,Mt as LinearFilter,dc as LinearInterpolant,Tt as LinearMipMapLinearFilter,_t as LinearMipMapNearestFilter,At as LinearMipmapLinearFilter,St as LinearMipmapNearestFilter,ii as LinearSRGBColorSpace,K as LinearToneMapping,si as LinearTransfer,Ic as Loader,du as LoaderUtils,zc as LoadingManager,Pe as LoopOnce,Ne as LoopPingPong,Re as LoopRepeat,e as MOUSE,Zn as Material,v as MaterialBlending,uu as MaterialLoader,Ss as MathUtils,fd as Matrix2,Is as Matrix3,Qs as Matrix4,A as MaxEquation,Ra as Mesh,Ma as MeshBasicMaterial,ec as MeshDepthMaterial,ic as MeshDistanceMaterial,tc as MeshLambertMaterial,sc as MeshMatcapMaterial,Kl as MeshNormalMaterial,$l as MeshPhongMaterial,Gl as MeshPhysicalMaterial,Zl as MeshStandardMaterial,Ql as MeshToonMaterial,_ as MinEquation,gt as MirroredRepeatWrapping,G as MixOperation,x as MultiplyBlending,Z as MultiplyOperation,ft as NearestFilter,wt as NearestMipMapLinearFilter,bt as NearestMipMapNearestFilter,vt as NearestMipmapLinearFilter,xt as NearestMipmapNearestFilter,nt as NeutralToneMapping,_i as NeverCompare,D as NeverDepth,gi as NeverStencilFunc,m as NoBlending,ti as NoColorSpace,ni as NoNormalPacking,Q as NoToneMapping,Ue as NormalAnimationBlendMode,y as NormalBlending,oi as NormalGAPacking,ai as NormalRGPacking,Ii as NotEqualCompare,H as NotEqualDepth,wi as NotEqualStencilFunc,xc as NumberKeyframeTrack,Ar as Object3D,yu as ObjectLoader,Ke as ObjectSpaceNormalMap,Bl as OctahedronGeometry,z as OneFactor,j as OneMinusConstantAlphaFactor,F as OneMinusConstantColorFactor,P as OneMinusDstAlphaFactor,N as OneMinusDstColorFactor,k as OneMinusSrcAlphaFactor,I as OneMinusSrcColorFactor,ru as OrthographicCamera,h as PCFShadowMap,l as PCFSoftShadowMap,Hh as Path,Kc as PerspectiveCamera,lo as Plane,kl as PlaneGeometry,Kd as PlaneHelper,su as PointLight,Nd as PointLightHelper,ih as Points,$o as PointsMaterial,Dd as PolarGridHelper,vh as PolyhedronGeometry,qu as PositionalAudio,Ku as PropertyBinding,Xu as PropertyMixer,Uh as QuadraticBezierCurve,qh as QuadraticBezierCurve3,As as Quaternion,vc as QuaternionKeyframeTrack,bc as QuaternionLinearInterpolant,he as R11_EAC_Format,gs as RAD2DEG,ke as RED_GREEN_RGTC2_Format,Ie as RED_RGTC1_Format,t as REVISION,ce as RG11_EAC_Format,Ze as RGBADepthPacking,Wt as RGBAFormat,Gt as RGBAIntegerFormat,Se as RGBA_ASTC_10x10_Format,ve as RGBA_ASTC_10x5_Format,we as RGBA_ASTC_10x6_Format,Me as RGBA_ASTC_10x8_Format,_e as RGBA_ASTC_12x10_Format,Ae as RGBA_ASTC_12x12_Format,de as RGBA_ASTC_4x4_Format,pe as RGBA_ASTC_5x4_Format,me as RGBA_ASTC_5x5_Format,ye as RGBA_ASTC_6x5_Format,ge as RGBA_ASTC_6x6_Format,fe as RGBA_ASTC_8x5_Format,xe as RGBA_ASTC_8x6_Format,be as RGBA_ASTC_8x8_Format,Te as RGBA_BPTC_Format,oe as RGBA_ETC2_EAC_Format,re as RGBA_PVRTC_2BPPV1_Format,se as RGBA_PVRTC_4BPPV1_Format,Qt as RGBA_S3TC_DXT1_Format,Kt as RGBA_S3TC_DXT3_Format,te as RGBA_S3TC_DXT5_Format,Ge as RGBDepthPacking,Dt as RGBFormat,Zt as RGBIntegerFormat,ze as RGB_BPTC_SIGNED_Format,Ce as RGB_BPTC_UNSIGNED_Format,ne as RGB_ETC1_Format,ae as RGB_ETC2_Format,ie as RGB_PVRTC_2BPPV1_Format,ee as RGB_PVRTC_4BPPV1_Format,$t as RGB_S3TC_DXT1_Format,$e as RGDepthPacking,Yt as RGFormat,Ht as RGIntegerFormat,Hl as RawShaderMaterial,wa as Ray,ud as Raycaster,hu as RectAreaLight,Jt as RedFormat,Xt as RedIntegerFormat,tt as ReinhardToneMapping,Xs as RenderTarget,rd as RenderTarget3D,mt as RepeatWrapping,ci as ReplaceStencilOp,S as ReverseSubtractEquation,us as ReversedDepthFuncs,Ol as RingGeometry,le as SIGNED_R11_EAC_Format,Oe as SIGNED_RED_GREEN_RGTC2_Format,Be as SIGNED_RED_RGTC1_Format,ue as SIGNED_RG11_EAC_Format,ei as SRGBColorSpace,ri as SRGBTransfer,Er as Scene,Yl as ShaderMaterial,Wl as ShadowMaterial,Zh as Shape,Pl as ShapeGeometry,np as ShapePath,Sl as ShapeUtils,It as ShortType,Ga as Skeleton,Pd as SkeletonHelper,Ja as SkinnedMesh,js as Source,Nn as Sphere,Rl as SphereGeometry,yd as Spherical,lu as SphericalHarmonics3,Jh as SplineCurve,eu as SpotLight,Id as SpotLightHelper,la as Sprite,Gn as SpriteMaterial,B as SrcAlphaFactor,V as SrcAlphaSaturateFactor,C as SrcColorFactor,Fi as StaticCopyUsage,Oi as StaticDrawUsage,Ni as StaticReadUsage,zu as StereoCamera,ji as StreamCopyUsage,Ri as StreamDrawUsage,Ei as StreamReadUsage,wc as StringKeyframeTrack,M as SubtractEquation,f as SubtractiveBlending,i as TOUCH,Qe as TangentSpaceNormalMap,Nl as TetrahedronGeometry,qs as Texture,Lc as TextureLoader,hp as TextureUtils,ku as Timer,Ji as TimestampQuery,Vl as TorusGeometry,El as TorusKnotGeometry,$r as Triangle,Ye as TriangleFanDrawMode,Xe as TriangleStripDrawMode,Je as TrianglesDrawMode,Fl as TubeGeometry,ht as UVMapping,zn as Uint16BufferAttribute,In as Uint32BufferAttribute,_n as Uint8BufferAttribute,An as Uint8ClampedBufferAttribute,nd as Uniform,od as UniformsGroup,Xl as UniformsUtils,zt as UnsignedByteType,Lt as UnsignedInt101111Type,Et as UnsignedInt248Type,Ft as UnsignedInt5999Type,Ot as UnsignedIntType,Nt as UnsignedShort4444Type,Vt as UnsignedShort5551Type,Bt as UnsignedShortType,c as VSMShadowMap,_s as Vector2,Ts as Vector3,Js as Vector4,Mc as VectorKeyframeTrack,nh as VideoFrameTexture,rh as VideoTexture,$s as WebGL3DRenderTarget,Zs as WebGLArrayRenderTarget,Ui as WebGLCoordinateSystem,Ys as WebGLRenderTarget,qi as WebGPUCoordinateSystem,Cr as WebXRController,Ll as WireframeGeometry,We as WrapAroundEnding,je as ZeroCurvatureEnding,T as ZeroFactor,De as ZeroSlopeEnding,hi as ZeroStencilOp,Ul as cloneUniforms,Ki as createCanvasElement,Qi as createElementNS,os as error,op as getByteLength,ss as getConsoleFunction,Jl as getUnlitUniformColorSpace,$i as isTypedArray,rs as log,ql as mergeUniforms,cs as probeAsync,is as setConsoleFunction,as as warn,hs as warnOnce,ls as yieldToMain}; diff --git a/build/three.module.js b/build/three.module.js index 7166f0ab0d6cd5..3dafce667b831f 100644 --- a/build/three.module.js +++ b/build/three.module.js @@ -3,7 +3,7 @@ * Copyright 2010-2026 Three.js Authors * SPDX-License-Identifier: MIT */ -import { Matrix3, Vector2, Color, mergeUniforms, Vector3, CubeUVReflectionMapping, Mesh, BoxGeometry, ShaderMaterial, BackSide, cloneUniforms, Matrix4, ColorManagement, SRGBTransfer, PlaneGeometry, FrontSide, getUnlitUniformColorSpace, IntType, warn, HalfFloatType, UnsignedByteType, FloatType, RGBAFormat, Plane, CubeReflectionMapping, CubeRefractionMapping, BufferGeometry, OrthographicCamera, PerspectiveCamera, NoToneMapping, MeshBasicMaterial, error, NoBlending, WebGLRenderTarget, BufferAttribute, LinearSRGBColorSpace, LinearFilter, CubeTexture, LinearMipmapLinearFilter, CubeCamera, EquirectangularReflectionMapping, EquirectangularRefractionMapping, warnOnce, Uint32BufferAttribute, Uint16BufferAttribute, Vector4, DataArrayTexture, Float32BufferAttribute, RawShaderMaterial, CustomToneMapping, NeutralToneMapping, AgXToneMapping, ACESFilmicToneMapping, CineonToneMapping, ReinhardToneMapping, LinearToneMapping, Data3DTexture, GreaterEqualCompare, LessEqualCompare, DepthTexture, Texture, GLSL3, VSMShadowMap, PCFShadowMap, AddOperation, MixOperation, MultiplyOperation, LinearTransfer, UniformsUtils, DoubleSide, NormalBlending, TangentSpaceNormalMap, ObjectSpaceNormalMap, Layers, RGFormat, RG11_EAC_Format, RED_GREEN_RGTC2_Format, Frustum, MeshDepthMaterial, MeshDistanceMaterial, PCFSoftShadowMap, DepthFormat, NearestFilter, CubeDepthTexture, UnsignedIntType, LessEqualDepth, ReverseSubtractEquation, SubtractEquation, AddEquation, OneMinusConstantAlphaFactor, ConstantAlphaFactor, OneMinusConstantColorFactor, ConstantColorFactor, OneMinusDstAlphaFactor, OneMinusDstColorFactor, OneMinusSrcAlphaFactor, OneMinusSrcColorFactor, DstAlphaFactor, DstColorFactor, SrcAlphaSaturateFactor, SrcAlphaFactor, SrcColorFactor, OneFactor, ZeroFactor, NotEqualDepth, GreaterDepth, GreaterEqualDepth, EqualDepth, LessDepth, AlwaysDepth, NeverDepth, CullFaceNone, CullFaceBack, CullFaceFront, CustomBlending, MultiplyBlending, SubtractiveBlending, AdditiveBlending, ReversedDepthFuncs, MinEquation, MaxEquation, MirroredRepeatWrapping, ClampToEdgeWrapping, RepeatWrapping, LinearMipmapNearestFilter, NearestMipmapLinearFilter, NearestMipmapNearestFilter, NotEqualCompare, GreaterCompare, EqualCompare, LessCompare, AlwaysCompare, NeverCompare, NoColorSpace, DepthStencilFormat, getByteLength, UnsignedInt248Type, UnsignedShortType, createElementNS, UnsignedShort4444Type, UnsignedShort5551Type, UnsignedInt5999Type, UnsignedInt101111Type, ByteType, ShortType, AlphaFormat, RGBFormat, RedFormat, RedIntegerFormat, RGIntegerFormat, RGBAIntegerFormat, RGB_S3TC_DXT1_Format, RGBA_S3TC_DXT1_Format, RGBA_S3TC_DXT3_Format, RGBA_S3TC_DXT5_Format, RGB_PVRTC_4BPPV1_Format, RGB_PVRTC_2BPPV1_Format, RGBA_PVRTC_4BPPV1_Format, RGBA_PVRTC_2BPPV1_Format, RGB_ETC1_Format, RGB_ETC2_Format, RGBA_ETC2_EAC_Format, R11_EAC_Format, SIGNED_R11_EAC_Format, SIGNED_RG11_EAC_Format, RGBA_ASTC_4x4_Format, RGBA_ASTC_5x4_Format, RGBA_ASTC_5x5_Format, RGBA_ASTC_6x5_Format, RGBA_ASTC_6x6_Format, RGBA_ASTC_8x5_Format, RGBA_ASTC_8x6_Format, RGBA_ASTC_8x8_Format, RGBA_ASTC_10x5_Format, RGBA_ASTC_10x6_Format, RGBA_ASTC_10x8_Format, RGBA_ASTC_10x10_Format, RGBA_ASTC_12x10_Format, RGBA_ASTC_12x12_Format, RGBA_BPTC_Format, RGB_BPTC_SIGNED_Format, RGB_BPTC_UNSIGNED_Format, RED_RGTC1_Format, SIGNED_RED_RGTC1_Format, SIGNED_RED_GREEN_RGTC2_Format, ExternalTexture, EventDispatcher, ArrayCamera, WebXRController, RAD2DEG, DataTexture, createCanvasElement, SRGBColorSpace, REVISION, log, WebGLCoordinateSystem, probeAsync } from './three.core.js'; +import { Matrix3, Vector2, Color, mergeUniforms, Vector3, CubeUVReflectionMapping, Mesh, BoxGeometry, ShaderMaterial, BackSide, cloneUniforms, Matrix4, ColorManagement, SRGBTransfer, PlaneGeometry, FrontSide, getUnlitUniformColorSpace, IntType, warn, HalfFloatType, UnsignedByteType, FloatType, RGBAFormat, Plane, CubeReflectionMapping, CubeRefractionMapping, BufferGeometry, OrthographicCamera, PerspectiveCamera, NoToneMapping, MeshBasicMaterial, error, NoBlending, WebGLRenderTarget, BufferAttribute, LinearSRGBColorSpace, LinearFilter, CubeTexture, LinearMipmapLinearFilter, CubeCamera, EquirectangularReflectionMapping, EquirectangularRefractionMapping, warnOnce, Uint32BufferAttribute, Uint16BufferAttribute, DataArrayTexture, Vector4, Float32BufferAttribute, RawShaderMaterial, CustomToneMapping, NeutralToneMapping, AgXToneMapping, ACESFilmicToneMapping, CineonToneMapping, ReinhardToneMapping, LinearToneMapping, Data3DTexture, GreaterEqualCompare, LessEqualCompare, DepthTexture, Texture, GLSL3, VSMShadowMap, PCFShadowMap, AddOperation, MixOperation, MultiplyOperation, LinearTransfer, UniformsUtils, DoubleSide, NormalBlending, TangentSpaceNormalMap, ObjectSpaceNormalMap, Layers, RGFormat, RG11_EAC_Format, RED_GREEN_RGTC2_Format, MeshDepthMaterial, MeshDistanceMaterial, PCFSoftShadowMap, DepthFormat, NearestFilter, CubeDepthTexture, UnsignedIntType, Frustum, LessEqualDepth, ReverseSubtractEquation, SubtractEquation, AddEquation, OneMinusConstantAlphaFactor, ConstantAlphaFactor, OneMinusConstantColorFactor, ConstantColorFactor, OneMinusDstAlphaFactor, OneMinusDstColorFactor, OneMinusSrcAlphaFactor, OneMinusSrcColorFactor, DstAlphaFactor, DstColorFactor, SrcAlphaSaturateFactor, SrcAlphaFactor, SrcColorFactor, OneFactor, ZeroFactor, NotEqualDepth, GreaterDepth, GreaterEqualDepth, EqualDepth, LessDepth, AlwaysDepth, NeverDepth, CullFaceNone, CullFaceBack, CullFaceFront, CustomBlending, MultiplyBlending, SubtractiveBlending, AdditiveBlending, ReversedDepthFuncs, MinEquation, MaxEquation, MirroredRepeatWrapping, ClampToEdgeWrapping, RepeatWrapping, LinearMipmapNearestFilter, NearestMipmapLinearFilter, NearestMipmapNearestFilter, NotEqualCompare, GreaterCompare, EqualCompare, LessCompare, AlwaysCompare, NeverCompare, NoColorSpace, DepthStencilFormat, getByteLength, UnsignedInt248Type, UnsignedShortType, createElementNS, UnsignedShort4444Type, UnsignedShort5551Type, UnsignedInt5999Type, UnsignedInt101111Type, ByteType, ShortType, AlphaFormat, RGBFormat, RedFormat, RedIntegerFormat, RGIntegerFormat, RGBAIntegerFormat, RGB_S3TC_DXT1_Format, RGBA_S3TC_DXT1_Format, RGBA_S3TC_DXT3_Format, RGBA_S3TC_DXT5_Format, RGB_PVRTC_4BPPV1_Format, RGB_PVRTC_2BPPV1_Format, RGBA_PVRTC_4BPPV1_Format, RGBA_PVRTC_2BPPV1_Format, RGB_ETC1_Format, RGB_ETC2_Format, RGBA_ETC2_EAC_Format, R11_EAC_Format, SIGNED_R11_EAC_Format, SIGNED_RG11_EAC_Format, RGBA_ASTC_4x4_Format, RGBA_ASTC_5x4_Format, RGBA_ASTC_5x5_Format, RGBA_ASTC_6x5_Format, RGBA_ASTC_6x6_Format, RGBA_ASTC_8x5_Format, RGBA_ASTC_8x6_Format, RGBA_ASTC_8x8_Format, RGBA_ASTC_10x5_Format, RGBA_ASTC_10x6_Format, RGBA_ASTC_10x8_Format, RGBA_ASTC_10x10_Format, RGBA_ASTC_12x10_Format, RGBA_ASTC_12x12_Format, RGBA_BPTC_Format, RGB_BPTC_SIGNED_Format, RGB_BPTC_UNSIGNED_Format, RED_RGTC1_Format, SIGNED_RED_RGTC1_Format, SIGNED_RED_GREEN_RGTC2_Format, ExternalTexture, EventDispatcher, ArrayCamera, WebXRController, RAD2DEG, DataTexture, createCanvasElement, SRGBColorSpace, REVISION, log, WebGLCoordinateSystem, probeAsync } from './three.core.js'; export { AdditiveAnimationBlendMode, AlwaysStencilFunc, AmbientLight, AnimationAction, AnimationClip, AnimationLoader, AnimationMixer, AnimationObjectGroup, AnimationUtils, ArcCurve, ArrowHelper, AttachedBindMode, Audio, AudioAnalyser, AudioContext, AudioListener, AudioLoader, AxesHelper, BasicDepthPacking, BasicShadowMap, BatchedMesh, BezierInterpolant, Bone, BooleanKeyframeTrack, Box2, Box3, Box3Helper, BoxHelper, BufferGeometryLoader, Cache, Camera, CameraHelper, CanvasTexture, CapsuleGeometry, CatmullRomCurve3, CircleGeometry, Clock, ColorKeyframeTrack, Compatibility, CompressedArrayTexture, CompressedCubeTexture, CompressedTexture, CompressedTextureLoader, ConeGeometry, Controls, CubeTextureLoader, CubicBezierCurve, CubicBezierCurve3, CubicInterpolant, CullFaceFrontBack, Curve, CurvePath, CylinderGeometry, Cylindrical, DataTextureLoader, DataUtils, DecrementStencilOp, DecrementWrapStencilOp, DefaultLoadingManager, DetachedBindMode, DirectionalLight, DirectionalLightHelper, DiscreteInterpolant, DodecahedronGeometry, DynamicCopyUsage, DynamicDrawUsage, DynamicReadUsage, EdgesGeometry, EllipseCurve, EqualStencilFunc, Euler, ExtrudeGeometry, FileLoader, Float16BufferAttribute, 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, InterpolateBezier, 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, MaterialBlending, MaterialLoader, MathUtils, Matrix2, MeshLambertMaterial, MeshMatcapMaterial, MeshNormalMaterial, MeshPhongMaterial, MeshPhysicalMaterial, MeshStandardMaterial, MeshToonMaterial, NearestMipMapLinearFilter, NearestMipMapNearestFilter, NeverStencilFunc, NoNormalPacking, NormalAnimationBlendMode, NormalGAPacking, NormalRGPacking, NotEqualStencilFunc, NumberKeyframeTrack, Object3D, ObjectLoader, OctahedronGeometry, Path, PlaneHelper, PointLight, PointLightHelper, Points, PointsMaterial, PolarGridHelper, PolyhedronGeometry, PositionalAudio, PropertyBinding, PropertyMixer, QuadraticBezierCurve, QuadraticBezierCurve3, Quaternion, QuaternionKeyframeTrack, QuaternionLinearInterpolant, RGBADepthPacking, RGBDepthPacking, RGBIntegerFormat, RGDepthPacking, 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, getConsoleFunction, setConsoleFunction } from './three.core.js'; function WebGLAnimation() { @@ -27,6 +27,7 @@ function WebGLAnimation() { if ( isAnimating === true ) return; if ( animationLoop === null ) return; + if ( context === null ) return; requestId = context.requestAnimationFrame( onAnimationFrame ); @@ -36,7 +37,7 @@ function WebGLAnimation() { stop: function () { - context.cancelAnimationFrame( requestId ); + if ( context !== null ) context.cancelAnimationFrame( requestId ); isAnimating = false; @@ -14867,7 +14868,11 @@ function WebGLMaterials( renderer, properties ) { function refreshMaterialUniforms( uniforms, material, pixelRatio, height, transmissionRenderTarget ) { - if ( material.isMeshBasicMaterial ) { + if ( material.isNodeMaterial ) { + + material.uniformsNeedUpdate = false; + + } else if ( material.isMeshBasicMaterial ) { refreshUniformsCommon( uniforms, material ); @@ -15562,6 +15567,11 @@ function WebGLUniformsGroups( gl, info, capabilities, state ) { uniform.__data[ 10 ] = value.elements[ 8 ]; uniform.__data[ 11 ] = 0; + } else if ( ArrayBuffer.isView( value ) ) { + + // copy the buffer data using "set" + uniform.__data.set( new value.constructor( value.buffer, value.byteOffset, uniform.__data.length ) ); + } else { value.toArray( uniform.__data, arrayOffset ); @@ -15597,6 +15607,10 @@ function WebGLUniformsGroups( gl, info, capabilities, state ) { cache[ indexString ] = value; + } else if ( ArrayBuffer.isView( value ) ) { + + cache[ indexString ] = value.slice(); + } else { cache[ indexString ] = value.clone(); @@ -15620,6 +15634,11 @@ function WebGLUniformsGroups( gl, info, capabilities, state ) { } + } else if ( ArrayBuffer.isView( value ) ) { + + // always update the array buffers + return true; + } else { if ( cachedObject.equals( value ) === false ) { @@ -15760,6 +15779,11 @@ function WebGLUniformsGroups( gl, info, capabilities, state ) { warn( 'WebGLRenderer: Texture samplers can not be part of an uniforms group.' ); + } else if ( ArrayBuffer.isView( value ) ) { + + info.boundary = 16; + info.storage = value.byteLength; + } else { warn( 'WebGLRenderer: Unsupported uniform value type.', value ); @@ -16096,6 +16120,7 @@ class WebGLRenderer { const _this = this; let _isContextLost = false; + let _nodesHandler = null; // internal state cache @@ -16846,6 +16871,20 @@ class WebGLRenderer { }; + /** + * Sets a compatibility node builder for rendering node materials with WebGLRenderer. + * This enables using TSL (Three.js Shading Language) node materials to prepare + * for migration to WebGPURenderer. + * + * @param {WebGLNodesHandler} nodesHandler - The node builder instance. + */ + this.setNodesHandler = function ( nodesHandler ) { + + nodesHandler.setRenderer( this ); + _nodesHandler = nodesHandler; + + }; + /** * Frees the GPU-related resources allocated by this instance. Call this * method whenever this instance is no longer used in your app. @@ -17406,6 +17445,13 @@ class WebGLRenderer { if ( _isContextLost === true ) return; + // update node builder if available + if ( _nodesHandler !== null ) { + + _nodesHandler.renderStart( scene, camera ); + + } + // use internal render target for HalfFloatType color buffer (only when tone mapping is enabled) const isXRPresenting = xr.enabled === true && xr.isPresenting === true; @@ -17599,6 +17645,12 @@ class WebGLRenderer { } + if ( _nodesHandler !== null ) { + + _nodesHandler.renderEnd(); + + } + }; function projectObject( object, camera, groupOrder, sortObjects ) { @@ -17975,6 +18027,13 @@ class WebGLRenderer { parameters.uniforms = programCache.getUniforms( material ); + // Use node builder for node materials if available + if ( _nodesHandler !== null && material.isNodeMaterial ) { + + _nodesHandler.build( material, object, parameters ); + + } + material.onBeforeCompile( parameters, _this ); program = programCache.acquireProgram( parameters, programCacheKey ); @@ -18240,6 +18299,14 @@ class WebGLRenderer { program = getProgram( material, scene, object ); + // notify the node builder that the program has changed so uniforms and update nodes can + // be cached and triggered. + if ( _nodesHandler && material.isNodeMaterial ) { + + _nodesHandler.onUpdateProgram( material, program, materialProperties ); + + } + } let refreshProgram = false; @@ -18469,7 +18536,7 @@ class WebGLRenderer { // UBOs - if ( material.isShaderMaterial || material.isRawShaderMaterial ) { + if ( material.uniformsGroups !== undefined ) { const groups = material.uniformsGroups; @@ -19045,6 +19112,8 @@ class WebGLRenderer { } + state.activeTexture( _gl.TEXTURE0 ); // see #33153 + _gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, dstTexture.flipY ); _gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, dstTexture.premultiplyAlpha ); _gl.pixelStorei( _gl.UNPACK_ALIGNMENT, dstTexture.unpackAlignment ); diff --git a/build/three.module.min.js b/build/three.module.min.js index 603c727fe2a7df..8c5ac4750421ba 100644 --- a/build/three.module.min.js +++ b/build/three.module.min.js @@ -3,4 +3,4 @@ * Copyright 2010-2026 Three.js Authors * SPDX-License-Identifier: MIT */ -import{Matrix3 as e,Vector2 as t,Color as n,mergeUniforms as i,Vector3 as r,CubeUVReflectionMapping as a,Mesh as o,BoxGeometry as s,ShaderMaterial as l,BackSide as c,cloneUniforms as d,Matrix4 as u,ColorManagement as f,SRGBTransfer as p,PlaneGeometry as m,FrontSide as h,getUnlitUniformColorSpace as _,IntType as g,warn as v,HalfFloatType as E,UnsignedByteType as S,FloatType as M,RGBAFormat as T,Plane as x,CubeReflectionMapping as A,CubeRefractionMapping as R,BufferGeometry as b,OrthographicCamera as C,PerspectiveCamera as P,NoToneMapping as L,MeshBasicMaterial as U,error as D,NoBlending as w,WebGLRenderTarget as I,BufferAttribute as N,LinearSRGBColorSpace as y,LinearFilter as F,CubeTexture as O,LinearMipmapLinearFilter as B,CubeCamera as G,EquirectangularReflectionMapping as H,EquirectangularRefractionMapping as V,warnOnce as W,Uint32BufferAttribute as k,Uint16BufferAttribute as z,Vector4 as X,DataArrayTexture as Y,Float32BufferAttribute as K,RawShaderMaterial as q,CustomToneMapping as j,NeutralToneMapping as Z,AgXToneMapping as $,ACESFilmicToneMapping as Q,CineonToneMapping as J,ReinhardToneMapping as ee,LinearToneMapping as te,Data3DTexture as ne,GreaterEqualCompare as ie,LessEqualCompare as re,DepthTexture as ae,Texture as oe,GLSL3 as se,VSMShadowMap as le,PCFShadowMap as ce,AddOperation as de,MixOperation as ue,MultiplyOperation as fe,LinearTransfer as pe,UniformsUtils as me,DoubleSide as he,NormalBlending as _e,TangentSpaceNormalMap as ge,ObjectSpaceNormalMap as ve,Layers as Ee,RGFormat as Se,RG11_EAC_Format as Me,RED_GREEN_RGTC2_Format as Te,Frustum as xe,MeshDepthMaterial as Ae,MeshDistanceMaterial as Re,PCFSoftShadowMap as be,DepthFormat as Ce,NearestFilter as Pe,CubeDepthTexture as Le,UnsignedIntType as Ue,LessEqualDepth as De,ReverseSubtractEquation as we,SubtractEquation as Ie,AddEquation as Ne,OneMinusConstantAlphaFactor as ye,ConstantAlphaFactor as Fe,OneMinusConstantColorFactor as Oe,ConstantColorFactor as Be,OneMinusDstAlphaFactor as Ge,OneMinusDstColorFactor as He,OneMinusSrcAlphaFactor as Ve,OneMinusSrcColorFactor as We,DstAlphaFactor as ke,DstColorFactor as ze,SrcAlphaSaturateFactor as Xe,SrcAlphaFactor as Ye,SrcColorFactor as Ke,OneFactor as qe,ZeroFactor as je,NotEqualDepth as Ze,GreaterDepth as $e,GreaterEqualDepth as Qe,EqualDepth as Je,LessDepth as et,AlwaysDepth as tt,NeverDepth as nt,CullFaceNone as it,CullFaceBack as rt,CullFaceFront as at,CustomBlending as ot,MultiplyBlending as st,SubtractiveBlending as lt,AdditiveBlending as ct,ReversedDepthFuncs as dt,MinEquation as ut,MaxEquation as ft,MirroredRepeatWrapping as pt,ClampToEdgeWrapping as mt,RepeatWrapping as ht,LinearMipmapNearestFilter as _t,NearestMipmapLinearFilter as gt,NearestMipmapNearestFilter as vt,NotEqualCompare as Et,GreaterCompare as St,EqualCompare as Mt,LessCompare as Tt,AlwaysCompare as xt,NeverCompare as At,NoColorSpace as Rt,DepthStencilFormat as bt,getByteLength as Ct,UnsignedInt248Type as Pt,UnsignedShortType as Lt,createElementNS as Ut,UnsignedShort4444Type as Dt,UnsignedShort5551Type as wt,UnsignedInt5999Type as It,UnsignedInt101111Type as Nt,ByteType as yt,ShortType as Ft,AlphaFormat as Ot,RGBFormat as Bt,RedFormat as Gt,RedIntegerFormat as Ht,RGIntegerFormat as Vt,RGBAIntegerFormat as Wt,RGB_S3TC_DXT1_Format as kt,RGBA_S3TC_DXT1_Format as zt,RGBA_S3TC_DXT3_Format as Xt,RGBA_S3TC_DXT5_Format as Yt,RGB_PVRTC_4BPPV1_Format as Kt,RGB_PVRTC_2BPPV1_Format as qt,RGBA_PVRTC_4BPPV1_Format as jt,RGBA_PVRTC_2BPPV1_Format as Zt,RGB_ETC1_Format as $t,RGB_ETC2_Format as Qt,RGBA_ETC2_EAC_Format as Jt,R11_EAC_Format as en,SIGNED_R11_EAC_Format as tn,SIGNED_RG11_EAC_Format as nn,RGBA_ASTC_4x4_Format as rn,RGBA_ASTC_5x4_Format as an,RGBA_ASTC_5x5_Format as on,RGBA_ASTC_6x5_Format as sn,RGBA_ASTC_6x6_Format as ln,RGBA_ASTC_8x5_Format as cn,RGBA_ASTC_8x6_Format as dn,RGBA_ASTC_8x8_Format as un,RGBA_ASTC_10x5_Format as fn,RGBA_ASTC_10x6_Format as pn,RGBA_ASTC_10x8_Format as mn,RGBA_ASTC_10x10_Format as hn,RGBA_ASTC_12x10_Format as _n,RGBA_ASTC_12x12_Format as gn,RGBA_BPTC_Format as vn,RGB_BPTC_SIGNED_Format as En,RGB_BPTC_UNSIGNED_Format as Sn,RED_RGTC1_Format as Mn,SIGNED_RED_RGTC1_Format as Tn,SIGNED_RED_GREEN_RGTC2_Format as xn,ExternalTexture as An,EventDispatcher as Rn,ArrayCamera as bn,WebXRController as Cn,RAD2DEG as Pn,DataTexture as Ln,createCanvasElement as Un,SRGBColorSpace as Dn,REVISION as wn,log as In,WebGLCoordinateSystem as Nn,probeAsync as yn}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,BezierInterpolant,Bone,BooleanKeyframeTrack,Box2,Box3,Box3Helper,BoxHelper,BufferGeometryLoader,Cache,Camera,CameraHelper,CanvasTexture,CapsuleGeometry,CatmullRomCurve3,CircleGeometry,Clock,ColorKeyframeTrack,Compatibility,CompressedArrayTexture,CompressedCubeTexture,CompressedTexture,CompressedTextureLoader,ConeGeometry,Controls,CubeTextureLoader,CubicBezierCurve,CubicBezierCurve3,CubicInterpolant,CullFaceFrontBack,Curve,CurvePath,CylinderGeometry,Cylindrical,DataTextureLoader,DataUtils,DecrementStencilOp,DecrementWrapStencilOp,DefaultLoadingManager,DetachedBindMode,DirectionalLight,DirectionalLightHelper,DiscreteInterpolant,DodecahedronGeometry,DynamicCopyUsage,DynamicDrawUsage,DynamicReadUsage,EdgesGeometry,EllipseCurve,EqualStencilFunc,Euler,ExtrudeGeometry,FileLoader,Float16BufferAttribute,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,InterpolateBezier,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,MaterialBlending,MaterialLoader,MathUtils,Matrix2,MeshLambertMaterial,MeshMatcapMaterial,MeshNormalMaterial,MeshPhongMaterial,MeshPhysicalMaterial,MeshStandardMaterial,MeshToonMaterial,NearestMipMapLinearFilter,NearestMipMapNearestFilter,NeverStencilFunc,NoNormalPacking,NormalAnimationBlendMode,NormalGAPacking,NormalRGPacking,NotEqualStencilFunc,NumberKeyframeTrack,Object3D,ObjectLoader,OctahedronGeometry,Path,PlaneHelper,PointLight,PointLightHelper,Points,PointsMaterial,PolarGridHelper,PolyhedronGeometry,PositionalAudio,PropertyBinding,PropertyMixer,QuadraticBezierCurve,QuadraticBezierCurve3,Quaternion,QuaternionKeyframeTrack,QuaternionLinearInterpolant,RGBADepthPacking,RGBDepthPacking,RGBIntegerFormat,RGDepthPacking,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,getConsoleFunction,setConsoleFunction}from"./three.core.min.js";function Fn(){let e=null,t=!1,n=null,i=null;function r(t,a){n(t,a),i=e.requestAnimationFrame(r)}return{start:function(){!0!==t&&null!==n&&(i=e.requestAnimationFrame(r),t=!0)},stop:function(){e.cancelAnimationFrame(i),t=!1},setAnimationLoop:function(e){n=e},setContext:function(t){e=t}}}function On(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 i=t.get(n);i&&(e.deleteBuffer(i.buffer),t.delete(n))},update:function(n,i){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 ) || defined( USE_COLOR_ALPHA )\n\tdiffuseColor *= vColor;\n#endif",color_pars_fragment:"#if defined( USE_COLOR ) || defined( USE_COLOR_ALPHA )\n\tvarying vec4 vColor;\n#endif",color_pars_vertex:"#if defined( USE_COLOR ) || defined( USE_COLOR_ALPHA ) || defined( USE_INSTANCING_COLOR ) || defined( USE_BATCHING_COLOR )\n\tvarying vec4 vColor;\n#endif",color_vertex:"#if defined( USE_COLOR ) || defined( USE_COLOR_ALPHA ) || defined( USE_INSTANCING_COLOR ) || defined( USE_BATCHING_COLOR )\n\tvColor = vec4( 1.0 );\n#endif\n#ifdef USE_COLOR_ALPHA\n\tvColor *= color;\n#elif defined( USE_COLOR )\n\tvColor.rgb *= color;\n#endif\n#ifdef USE_INSTANCING_COLOR\n\tvColor.rgb *= instanceColor.rgb;\n#endif\n#ifdef USE_BATCHING_COLOR\n\tvColor *= getBatchingColor( getIndirectIndex( gl_DrawID ) );\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}\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 * reflectVec );\n\t\t#ifdef ENVMAP_BLENDING_MULTIPLY\n\t\t\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\n\t\t#elif defined( ENVMAP_BLENDING_MIX )\n\t\t\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\n\t\t#elif defined( ENVMAP_BLENDING_ADD )\n\t\t\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\n\t\t#endif\n\t#endif\n#endif",envmap_common_pars_fragment:"#ifdef USE_ENVMAP\n\tuniform float envMapIntensity;\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#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, pow4( 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;\nmaterial.diffuseContribution = diffuseColor.rgb * ( 1.0 - metalnessFactor );\nmaterial.metalness = 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 = min( pow2( ( material.ior - 1.0 ) / ( material.ior + 1.0 ) ) * specularColorFactor, vec3( 1.0 ) ) * specularIntensityFactor;\n\tmaterial.specularColorBlended = mix( material.specularColor, diffuseColor.rgb, metalnessFactor );\n#else\n\tmaterial.specularColor = vec3( 0.04 );\n\tmaterial.specularColorBlended = mix( material.specularColor, 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.0001, 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:"uniform sampler2D dfgLUT;\nstruct PhysicalMaterial {\n\tvec3 diffuseColor;\n\tvec3 diffuseContribution;\n\tvec3 specularColor;\n\tvec3 specularColorBlended;\n\tfloat roughness;\n\tfloat metalness;\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\tvec3 iridescenceFresnelDielectric;\n\t\tvec3 iridescenceFresnelMetallic;\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 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.specularColorBlended;\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 * transpose( 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 rInv = 1.0 / ( roughness + 0.1 );\n\tfloat a = -1.9362 + 1.0678 * roughness + 0.4573 * r2 - 0.8469 * rInv;\n\tfloat b = -0.6014 + 0.5538 * roughness - 0.4670 * r2 - 0.1255 * rInv;\n\tfloat DG = exp( a * dotNV + b );\n\treturn saturate( DG );\n}\nvec3 EnvironmentBRDF( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness ) {\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tvec2 fab = texture2D( dfgLUT, vec2( roughness, dotNV ) ).rg;\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\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tvec2 fab = texture2D( dfgLUT, vec2( roughness, dotNV ) ).rg;\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}\nvec3 BRDF_GGX_Multiscatter( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material ) {\n\tvec3 singleScatter = BRDF_GGX( lightDir, viewDir, normal, material );\n\tfloat dotNL = saturate( dot( normal, lightDir ) );\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tvec2 dfgV = texture2D( dfgLUT, vec2( material.roughness, dotNV ) ).rg;\n\tvec2 dfgL = texture2D( dfgLUT, vec2( material.roughness, dotNL ) ).rg;\n\tvec3 FssEss_V = material.specularColorBlended * dfgV.x + material.specularF90 * dfgV.y;\n\tvec3 FssEss_L = material.specularColorBlended * dfgL.x + material.specularF90 * dfgL.y;\n\tfloat Ess_V = dfgV.x + dfgV.y;\n\tfloat Ess_L = dfgL.x + dfgL.y;\n\tfloat Ems_V = 1.0 - Ess_V;\n\tfloat Ems_L = 1.0 - Ess_L;\n\tvec3 Favg = material.specularColorBlended + ( 1.0 - material.specularColorBlended ) * 0.047619;\n\tvec3 Fms = FssEss_V * FssEss_L * Favg / ( 1.0 - Ems_V * Ems_L * Favg + EPSILON );\n\tfloat compensationFactor = Ems_V * Ems_L;\n\tvec3 multiScatter = Fms * compensationFactor;\n\treturn singleScatter + multiScatter;\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.specularColorBlended * t2.x + ( material.specularF90 - material.specularColorBlended ) * t2.y );\n\t\treflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\n\t\treflectedLight.directDiffuse += lightColor * material.diffuseContribution * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords );\n\t\t#ifdef USE_CLEARCOAT\n\t\t\tvec3 Ncc = geometryClearcoatNormal;\n\t\t\tvec2 uvClearcoat = LTC_Uv( Ncc, viewDir, material.clearcoatRoughness );\n\t\t\tvec4 t1Clearcoat = texture2D( ltc_1, uvClearcoat );\n\t\t\tvec4 t2Clearcoat = texture2D( ltc_2, uvClearcoat );\n\t\t\tmat3 mInvClearcoat = mat3(\n\t\t\t\tvec3( t1Clearcoat.x, 0, t1Clearcoat.y ),\n\t\t\t\tvec3( 0, 1, 0 ),\n\t\t\t\tvec3( t1Clearcoat.z, 0, t1Clearcoat.w )\n\t\t\t);\n\t\t\tvec3 fresnelClearcoat = material.clearcoatF0 * t2Clearcoat.x + ( material.clearcoatF90 - material.clearcoatF0 ) * t2Clearcoat.y;\n\t\t\tclearcoatSpecularDirect += lightColor * fresnelClearcoat * LTC_Evaluate( Ncc, viewDir, position, mInvClearcoat, rectCoords );\n\t\t#endif\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 \n \t\tsheenSpecularDirect += irradiance * BRDF_Sheen( directLight.direction, geometryViewDir, geometryNormal, material.sheenColor, material.sheenRoughness );\n \n \t\tfloat sheenAlbedoV = IBLSheenBRDF( geometryNormal, geometryViewDir, material.sheenRoughness );\n \t\tfloat sheenAlbedoL = IBLSheenBRDF( geometryNormal, directLight.direction, material.sheenRoughness );\n \n \t\tfloat sheenEnergyComp = 1.0 - max3( material.sheenColor ) * max( sheenAlbedoV, sheenAlbedoL );\n \n \t\tirradiance *= sheenEnergyComp;\n \n \t#endif\n\treflectedLight.directSpecular += irradiance * BRDF_GGX_Multiscatter( directLight.direction, geometryViewDir, geometryNormal, material );\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseContribution );\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\tvec3 diffuse = irradiance * BRDF_Lambert( material.diffuseContribution );\n\t#ifdef USE_SHEEN\n\t\tfloat sheenAlbedo = IBLSheenBRDF( geometryNormal, geometryViewDir, material.sheenRoughness );\n\t\tfloat sheenEnergyComp = 1.0 - max3( material.sheenColor ) * sheenAlbedo;\n\t\tdiffuse *= sheenEnergyComp;\n\t#endif\n\treflectedLight.indirectDiffuse += diffuse;\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 ) * RECIPROCAL_PI;\n \t#endif\n\tvec3 singleScatteringDielectric = vec3( 0.0 );\n\tvec3 multiScatteringDielectric = vec3( 0.0 );\n\tvec3 singleScatteringMetallic = vec3( 0.0 );\n\tvec3 multiScatteringMetallic = vec3( 0.0 );\n\t#ifdef USE_IRIDESCENCE\n\t\tcomputeMultiscatteringIridescence( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.iridescence, material.iridescenceFresnelDielectric, material.roughness, singleScatteringDielectric, multiScatteringDielectric );\n\t\tcomputeMultiscatteringIridescence( geometryNormal, geometryViewDir, material.diffuseColor, material.specularF90, material.iridescence, material.iridescenceFresnelMetallic, material.roughness, singleScatteringMetallic, multiScatteringMetallic );\n\t#else\n\t\tcomputeMultiscattering( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.roughness, singleScatteringDielectric, multiScatteringDielectric );\n\t\tcomputeMultiscattering( geometryNormal, geometryViewDir, material.diffuseColor, material.specularF90, material.roughness, singleScatteringMetallic, multiScatteringMetallic );\n\t#endif\n\tvec3 singleScattering = mix( singleScatteringDielectric, singleScatteringMetallic, material.metalness );\n\tvec3 multiScattering = mix( multiScatteringDielectric, multiScatteringMetallic, material.metalness );\n\tvec3 totalScatteringDielectric = singleScatteringDielectric + multiScatteringDielectric;\n\tvec3 diffuse = material.diffuseContribution * ( 1.0 - totalScatteringDielectric );\n\tvec3 cosineWeightedIrradiance = irradiance * RECIPROCAL_PI;\n\tvec3 indirectSpecular = radiance * singleScattering;\n\tindirectSpecular += multiScattering * cosineWeightedIrradiance;\n\tvec3 indirectDiffuse = diffuse * cosineWeightedIrradiance;\n\t#ifdef USE_SHEEN\n\t\tfloat sheenAlbedo = IBLSheenBRDF( geometryNormal, geometryViewDir, material.sheenRoughness );\n\t\tfloat sheenEnergyComp = 1.0 - max3( material.sheenColor ) * sheenAlbedo;\n\t\tindirectSpecular *= sheenEnergyComp;\n\t\tindirectDiffuse *= sheenEnergyComp;\n\t#endif\n\treflectedLight.indirectSpecular += indirectSpecular;\n\treflectedLight.indirectDiffuse += indirectDiffuse;\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.iridescenceFresnelDielectric = evalIridescence( 1.0, material.iridescenceIOR, dotNVi, material.iridescenceThickness, material.specularColor );\n\t\tmaterial.iridescenceFresnelMetallic = evalIridescence( 1.0, material.iridescenceIOR, dotNVi, material.iridescenceThickness, material.diffuseColor );\n\t\tmaterial.iridescenceFresnel = mix( material.iridescenceFresnelDielectric, material.iridescenceFresnelMetallic, material.metalness );\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 ) && ( defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_BASIC ) )\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( ENVMAP_TYPE_CUBE_UV )\n\t\t#if defined( STANDARD ) || defined( LAMBERT ) || defined( PHONG )\n\t\t\tiblIrradiance += getIBLIrradiance( geometryNormal );\n\t\t#endif\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\t#if defined( LAMBERT ) || defined( PHONG )\n\t\tirradiance += iblIrradiance;\n\t#endif\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_LOGARITHMIC_DEPTH_BUFFER )\n\tgl_FragDepth = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5;\n#endif",logdepthbuf_pars_fragment:"#if defined( USE_LOGARITHMIC_DEPTH_BUFFER )\n\tuniform float logDepthBufFC;\n\tvarying float vFragDepth;\n\tvarying float vIsPerspective;\n#endif",logdepthbuf_pars_vertex:"#ifdef USE_LOGARITHMIC_DEPTH_BUFFER\n\tvarying float vFragDepth;\n\tvarying float vIsPerspective;\n#endif",logdepthbuf_vertex:"#ifdef USE_LOGARITHMIC_DEPTH_BUFFER\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\t#if defined( USE_PACKED_NORMALMAP )\n\t\tmapN = vec3( mapN.xy, sqrt( saturate( 1.0 - dot( mapN.xy, mapN.xy ) ) ) );\n\t#endif\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\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\n\t\treturn depth * ( far - near ) - far;\n\t#else\n\t\treturn depth * ( near - far ) - near;\n\t#endif\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\t\n\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\treturn ( near * far ) / ( ( near - far ) * depth - near );\n\t#else\n\t\treturn ( near * far ) / ( ( far - near ) * depth - far );\n\t#endif\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\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tuniform sampler2DShadow directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\n\t\t#else\n\t\t\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\n\t\t#endif\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\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tuniform sampler2DShadow spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\t#else\n\t\t\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\t#endif\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\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tuniform samplerCubeShadow pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];\n\t\t#elif defined( SHADOWMAP_TYPE_BASIC )\n\t\t\tuniform samplerCube pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];\n\t\t#endif\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\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\tfloat interleavedGradientNoise( vec2 position ) {\n\t\t\treturn fract( 52.9829189 * fract( dot( position, vec2( 0.06711056, 0.00583715 ) ) ) );\n\t\t}\n\t\tvec2 vogelDiskSample( int sampleIndex, int samplesCount, float phi ) {\n\t\t\tconst float goldenAngle = 2.399963229728653;\n\t\t\tfloat r = sqrt( ( float( sampleIndex ) + 0.5 ) / float( samplesCount ) );\n\t\t\tfloat theta = float( sampleIndex ) * goldenAngle + phi;\n\t\t\treturn vec2( cos( theta ), sin( theta ) ) * r;\n\t\t}\n\t#endif\n\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\tfloat getShadow( sampler2DShadow shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\t\tfloat shadow = 1.0;\n\t\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\t\tshadowCoord.z += shadowBias;\n\t\t\tbool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0;\n\t\t\tbool frustumTest = inFrustum && shadowCoord.z <= 1.0;\n\t\t\tif ( frustumTest ) {\n\t\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\t\tfloat radius = shadowRadius * texelSize.x;\n\t\t\t\tfloat phi = interleavedGradientNoise( gl_FragCoord.xy ) * PI2;\n\t\t\t\tshadow = (\n\t\t\t\t\ttexture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 0, 5, phi ) * radius, shadowCoord.z ) ) +\n\t\t\t\t\ttexture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 1, 5, phi ) * radius, shadowCoord.z ) ) +\n\t\t\t\t\ttexture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 2, 5, phi ) * radius, shadowCoord.z ) ) +\n\t\t\t\t\ttexture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 3, 5, phi ) * radius, shadowCoord.z ) ) +\n\t\t\t\t\ttexture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 4, 5, phi ) * radius, shadowCoord.z ) )\n\t\t\t\t) * 0.2;\n\t\t\t}\n\t\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t\t}\n\t#elif defined( SHADOWMAP_TYPE_VSM )\n\t\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\t\tfloat shadow = 1.0;\n\t\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\t\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\t\t\tshadowCoord.z -= shadowBias;\n\t\t\t#else\n\t\t\t\tshadowCoord.z += shadowBias;\n\t\t\t#endif\n\t\t\tbool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0;\n\t\t\tbool frustumTest = inFrustum && shadowCoord.z <= 1.0;\n\t\t\tif ( frustumTest ) {\n\t\t\t\tvec2 distribution = texture2D( shadowMap, shadowCoord.xy ).rg;\n\t\t\t\tfloat mean = distribution.x;\n\t\t\t\tfloat variance = distribution.y * distribution.y;\n\t\t\t\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\t\t\t\tfloat hard_shadow = step( mean, shadowCoord.z );\n\t\t\t\t#else\n\t\t\t\t\tfloat hard_shadow = step( shadowCoord.z, mean );\n\t\t\t\t#endif\n\t\t\t\t\n\t\t\t\tif ( hard_shadow == 1.0 ) {\n\t\t\t\t\tshadow = 1.0;\n\t\t\t\t} else {\n\t\t\t\t\tvariance = max( variance, 0.0000001 );\n\t\t\t\t\tfloat d = shadowCoord.z - mean;\n\t\t\t\t\tfloat p_max = variance / ( variance + d * d );\n\t\t\t\t\tp_max = clamp( ( p_max - 0.3 ) / 0.65, 0.0, 1.0 );\n\t\t\t\t\tshadow = max( hard_shadow, p_max );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t\t}\n\t#else\n\t\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\t\tfloat shadow = 1.0;\n\t\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\t\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\t\t\tshadowCoord.z -= shadowBias;\n\t\t\t#else\n\t\t\t\tshadowCoord.z += shadowBias;\n\t\t\t#endif\n\t\t\tbool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0;\n\t\t\tbool frustumTest = inFrustum && shadowCoord.z <= 1.0;\n\t\t\tif ( frustumTest ) {\n\t\t\t\tfloat depth = texture2D( shadowMap, shadowCoord.xy ).r;\n\t\t\t\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\t\t\t\tshadow = step( depth, shadowCoord.z );\n\t\t\t\t#else\n\t\t\t\t\tshadow = step( shadowCoord.z, depth );\n\t\t\t\t#endif\n\t\t\t}\n\t\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t\t}\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t#if defined( SHADOWMAP_TYPE_PCF )\n\tfloat getPointShadow( samplerCubeShadow 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\tvec3 bd3D = normalize( lightToPosition );\n\t\tvec3 absVec = abs( lightToPosition );\n\t\tfloat viewSpaceZ = max( max( absVec.x, absVec.y ), absVec.z );\n\t\tif ( viewSpaceZ - shadowCameraFar <= 0.0 && viewSpaceZ - shadowCameraNear >= 0.0 ) {\n\t\t\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\t\t\tfloat dp = ( shadowCameraNear * ( shadowCameraFar - viewSpaceZ ) ) / ( viewSpaceZ * ( shadowCameraFar - shadowCameraNear ) );\n\t\t\t\tdp -= shadowBias;\n\t\t\t#else\n\t\t\t\tfloat dp = ( shadowCameraFar * ( viewSpaceZ - shadowCameraNear ) ) / ( viewSpaceZ * ( shadowCameraFar - shadowCameraNear ) );\n\t\t\t\tdp += shadowBias;\n\t\t\t#endif\n\t\t\tfloat texelSize = shadowRadius / shadowMapSize.x;\n\t\t\tvec3 absDir = abs( bd3D );\n\t\t\tvec3 tangent = absDir.x > absDir.z ? vec3( 0.0, 1.0, 0.0 ) : vec3( 1.0, 0.0, 0.0 );\n\t\t\ttangent = normalize( cross( bd3D, tangent ) );\n\t\t\tvec3 bitangent = cross( bd3D, tangent );\n\t\t\tfloat phi = interleavedGradientNoise( gl_FragCoord.xy ) * PI2;\n\t\t\tvec2 sample0 = vogelDiskSample( 0, 5, phi );\n\t\t\tvec2 sample1 = vogelDiskSample( 1, 5, phi );\n\t\t\tvec2 sample2 = vogelDiskSample( 2, 5, phi );\n\t\t\tvec2 sample3 = vogelDiskSample( 3, 5, phi );\n\t\t\tvec2 sample4 = vogelDiskSample( 4, 5, phi );\n\t\t\tshadow = (\n\t\t\t\ttexture( shadowMap, vec4( bd3D + ( tangent * sample0.x + bitangent * sample0.y ) * texelSize, dp ) ) +\n\t\t\t\ttexture( shadowMap, vec4( bd3D + ( tangent * sample1.x + bitangent * sample1.y ) * texelSize, dp ) ) +\n\t\t\t\ttexture( shadowMap, vec4( bd3D + ( tangent * sample2.x + bitangent * sample2.y ) * texelSize, dp ) ) +\n\t\t\t\ttexture( shadowMap, vec4( bd3D + ( tangent * sample3.x + bitangent * sample3.y ) * texelSize, dp ) ) +\n\t\t\t\ttexture( shadowMap, vec4( bd3D + ( tangent * sample4.x + bitangent * sample4.y ) * texelSize, dp ) )\n\t\t\t) * 0.2;\n\t\t}\n\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t}\n\t#elif defined( SHADOWMAP_TYPE_BASIC )\n\tfloat getPointShadow( samplerCube 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\tvec3 absVec = abs( lightToPosition );\n\t\tfloat viewSpaceZ = max( max( absVec.x, absVec.y ), absVec.z );\n\t\tif ( viewSpaceZ - shadowCameraFar <= 0.0 && viewSpaceZ - shadowCameraNear >= 0.0 ) {\n\t\t\tfloat dp = ( shadowCameraFar * ( viewSpaceZ - shadowCameraNear ) ) / ( viewSpaceZ * ( shadowCameraFar - shadowCameraNear ) );\n\t\t\tdp += shadowBias;\n\t\t\tvec3 bd3D = normalize( lightToPosition );\n\t\t\tfloat depth = textureCube( shadowMap, bd3D ).r;\n\t\t\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\t\t\tdepth = 1.0 - depth;\n\t\t\t#endif\n\t\t\tshadow = step( dp, depth );\n\t\t}\n\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t}\n\t#endif\n\t#endif\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 && ( defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_BASIC ) )\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.diffuseContribution, material.specularColorBlended, 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 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 * vWorldDirection );\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_REVERSED_DEPTH_BUFFER\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}",distance_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}",distance_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 \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 = vec4( dist, 0.0, 0.0, 1.0 );\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 \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 \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( normalize( normal ) * 0.5 + 0.5, 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 \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 \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 \n\t\toutgoingLight = outgoingLight + sheenSpecularDirect + sheenSpecularIndirect;\n \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 \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 \nvoid main() {\n\t#include \n\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\n\t#include \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}"},Gn={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},reflectivity:{value:1},ior:{value:1.5},refractionRatio:{value:.98},dfgLUT:{value:null}},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:{}}},directionalShadowMatrix:{value:[]},spotLights:{value:[],properties:{color:{},position:{},direction:{},distance:{},coneCos:{},penumbraCos:{},decay:{}}},spotLightShadows:{value:[],properties:{shadowIntensity:1,shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{}}},spotLightMap:{value:[]},spotLightMatrix:{value:[]},pointLights:{value:[],properties:{color:{},position:{},decay:{},distance:{}}},pointLightShadows:{value:[],properties:{shadowIntensity:1,shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{},shadowCameraNear:{},shadowCameraFar:{}}},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}}},Hn={basic:{uniforms:i([Gn.common,Gn.specularmap,Gn.envmap,Gn.aomap,Gn.lightmap,Gn.fog]),vertexShader:Bn.meshbasic_vert,fragmentShader:Bn.meshbasic_frag},lambert:{uniforms:i([Gn.common,Gn.specularmap,Gn.envmap,Gn.aomap,Gn.lightmap,Gn.emissivemap,Gn.bumpmap,Gn.normalmap,Gn.displacementmap,Gn.fog,Gn.lights,{emissive:{value:new n(0)},envMapIntensity:{value:1}}]),vertexShader:Bn.meshlambert_vert,fragmentShader:Bn.meshlambert_frag},phong:{uniforms:i([Gn.common,Gn.specularmap,Gn.envmap,Gn.aomap,Gn.lightmap,Gn.emissivemap,Gn.bumpmap,Gn.normalmap,Gn.displacementmap,Gn.fog,Gn.lights,{emissive:{value:new n(0)},specular:{value:new n(1118481)},shininess:{value:30},envMapIntensity:{value:1}}]),vertexShader:Bn.meshphong_vert,fragmentShader:Bn.meshphong_frag},standard:{uniforms:i([Gn.common,Gn.envmap,Gn.aomap,Gn.lightmap,Gn.emissivemap,Gn.bumpmap,Gn.normalmap,Gn.displacementmap,Gn.roughnessmap,Gn.metalnessmap,Gn.fog,Gn.lights,{emissive:{value:new n(0)},roughness:{value:1},metalness:{value:0},envMapIntensity:{value:1}}]),vertexShader:Bn.meshphysical_vert,fragmentShader:Bn.meshphysical_frag},toon:{uniforms:i([Gn.common,Gn.aomap,Gn.lightmap,Gn.emissivemap,Gn.bumpmap,Gn.normalmap,Gn.displacementmap,Gn.gradientmap,Gn.fog,Gn.lights,{emissive:{value:new n(0)}}]),vertexShader:Bn.meshtoon_vert,fragmentShader:Bn.meshtoon_frag},matcap:{uniforms:i([Gn.common,Gn.bumpmap,Gn.normalmap,Gn.displacementmap,Gn.fog,{matcap:{value:null}}]),vertexShader:Bn.meshmatcap_vert,fragmentShader:Bn.meshmatcap_frag},points:{uniforms:i([Gn.points,Gn.fog]),vertexShader:Bn.points_vert,fragmentShader:Bn.points_frag},dashed:{uniforms:i([Gn.common,Gn.fog,{scale:{value:1},dashSize:{value:1},totalSize:{value:2}}]),vertexShader:Bn.linedashed_vert,fragmentShader:Bn.linedashed_frag},depth:{uniforms:i([Gn.common,Gn.displacementmap]),vertexShader:Bn.depth_vert,fragmentShader:Bn.depth_frag},normal:{uniforms:i([Gn.common,Gn.bumpmap,Gn.normalmap,Gn.displacementmap,{opacity:{value:1}}]),vertexShader:Bn.meshnormal_vert,fragmentShader:Bn.meshnormal_frag},sprite:{uniforms:i([Gn.sprite,Gn.fog]),vertexShader:Bn.sprite_vert,fragmentShader:Bn.sprite_frag},background:{uniforms:{uvTransform:{value:new e},t2D:{value:null},backgroundIntensity:{value:1}},vertexShader:Bn.background_vert,fragmentShader:Bn.background_frag},backgroundCube:{uniforms:{envMap:{value:null},backgroundBlurriness:{value:0},backgroundIntensity:{value:1},backgroundRotation:{value:new e}},vertexShader:Bn.backgroundCube_vert,fragmentShader:Bn.backgroundCube_frag},cube:{uniforms:{tCube:{value:null},tFlip:{value:-1},opacity:{value:1}},vertexShader:Bn.cube_vert,fragmentShader:Bn.cube_frag},equirect:{uniforms:{tEquirect:{value:null}},vertexShader:Bn.equirect_vert,fragmentShader:Bn.equirect_frag},distance:{uniforms:i([Gn.common,Gn.displacementmap,{referencePosition:{value:new r},nearDistance:{value:1},farDistance:{value:1e3}}]),vertexShader:Bn.distance_vert,fragmentShader:Bn.distance_frag},shadow:{uniforms:i([Gn.lights,Gn.fog,{color:{value:new n(0)},opacity:{value:1}}]),vertexShader:Bn.shadow_vert,fragmentShader:Bn.shadow_frag}};Hn.physical={uniforms:i([Hn.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:Bn.meshphysical_vert,fragmentShader:Bn.meshphysical_frag};const Vn={r:0,b:0,g:0},Wn=new u,kn=new e;function zn(e,t,i,r,u,g){const v=new n(0);let E,S,M=!0===u?0:1,T=null,x=0,A=null;function R(e){let n=!0===e.isScene?e.background:null;if(n&&n.isTexture){const i=e.backgroundBlurriness>0;n=t.get(n,i)}return n}function b(t,n){t.getRGB(Vn,_(e)),i.buffers.color.setClear(Vn.r,Vn.g,Vn.b,n,g)}return{getClearColor:function(){return v},setClearColor:function(e,t=1){v.set(e),M=t,b(v,M)},getClearAlpha:function(){return M},setClearAlpha:function(e){M=e,b(v,M)},render:function(t){let n=!1;const r=R(t);null===r?b(v,M):r&&r.isColor&&(b(r,1),n=!0);const a=e.xr.getEnvironmentBlendMode();"additive"===a?i.buffers.color.setClear(0,0,0,1,g):"alpha-blend"===a&&i.buffers.color.setClear(0,0,0,0,g),(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 i=R(n);i&&(i.isCubeTexture||i.mapping===a)?(void 0===S&&(S=new o(new s(1,1,1),new l({name:"BackgroundCubeMaterial",uniforms:d(Hn.backgroundCube.uniforms),vertexShader:Hn.backgroundCube.vertexShader,fragmentShader:Hn.backgroundCube.fragmentShader,side:c,depthTest:!1,depthWrite:!1,fog:!1,allowOverride:!1})),S.geometry.deleteAttribute("normal"),S.geometry.deleteAttribute("uv"),S.onBeforeRender=function(e,t,n){this.matrixWorld.copyPosition(n.matrixWorld)},Object.defineProperty(S.material,"envMap",{get:function(){return this.uniforms.envMap.value}}),r.update(S)),S.material.uniforms.envMap.value=i,S.material.uniforms.backgroundBlurriness.value=n.backgroundBlurriness,S.material.uniforms.backgroundIntensity.value=n.backgroundIntensity,S.material.uniforms.backgroundRotation.value.setFromMatrix4(Wn.makeRotationFromEuler(n.backgroundRotation)).transpose(),i.isCubeTexture&&!1===i.isRenderTargetTexture&&S.material.uniforms.backgroundRotation.value.premultiply(kn),S.material.toneMapped=f.getTransfer(i.colorSpace)!==p,T===i&&x===i.version&&A===e.toneMapping||(S.material.needsUpdate=!0,T=i,x=i.version,A=e.toneMapping),S.layers.enableAll(),t.unshift(S,S.geometry,S.material,0,0,null)):i&&i.isTexture&&(void 0===E&&(E=new o(new m(2,2),new l({name:"BackgroundMaterial",uniforms:d(Hn.background.uniforms),vertexShader:Hn.background.vertexShader,fragmentShader:Hn.background.fragmentShader,side:h,depthTest:!1,depthWrite:!1,fog:!1,allowOverride:!1})),E.geometry.deleteAttribute("normal"),Object.defineProperty(E.material,"map",{get:function(){return this.uniforms.t2D.value}}),r.update(E)),E.material.uniforms.t2D.value=i,E.material.uniforms.backgroundIntensity.value=n.backgroundIntensity,E.material.toneMapped=f.getTransfer(i.colorSpace)!==p,!0===i.matrixAutoUpdate&&i.updateMatrix(),E.material.uniforms.uvTransform.value.copy(i.matrix),T===i&&x===i.version&&A===e.toneMapping||(E.material.needsUpdate=!0,T=i,x=i.version,A=e.toneMapping),E.layers.enableAll(),t.unshift(E,E.geometry,E.material,0,0,null))},dispose:function(){void 0!==S&&(S.geometry.dispose(),S.material.dispose(),S=void 0),void 0!==E&&(E.geometry.dispose(),E.material.dispose(),E=void 0)}}}function Xn(e,t){const n=e.getParameter(e.MAX_VERTEX_ATTRIBS),i={},r=c(null);let a=r,o=!1;function s(t){return e.bindVertexArray(t)}function l(t){return e.deleteVertexArray(t)}function c(e){const t=[],i=[],r=[];for(let e=0;e=0){const n=r[t];let i=o[t];if(void 0===i&&("instanceMatrix"===t&&e.instanceMatrix&&(i=e.instanceMatrix),"instanceColor"===t&&e.instanceColor&&(i=e.instanceColor)),void 0===n)return!0;if(n.attribute!==i)return!0;if(i&&n.data!==i.data)return!0;s++}}return a.attributesNum!==s||a.index!==i}(n,h,l,_),v&&function(e,t,n,i){const r={},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 i={};i.attribute=n,n&&n.data&&(i.data=n.data),r[t]=i,s++}}a.attributes=r,a.attributesNum=s,a.index=i}(n,h,l,_),null!==_&&t.update(_,e.ELEMENT_ARRAY_BUFFER),(v||o)&&(o=!1,function(n,i,r,a){d();const o=a.attributes,s=r.getAttributes(),l=i.defaultAttributeValues;for(const i in s){const r=s[i];if(r.location>=0){let s=o[i];if(void 0===s&&("instanceMatrix"===i&&n.instanceMatrix&&(s=n.instanceMatrix),"instanceColor"===i&&n.instanceColor&&(s=n.instanceColor)),void 0!==s){const i=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===g;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&&(v("WebGLRenderer:",o,"not supported, using",s,"instead."),o=s);return{isWebGL2:!0,getMaxAnisotropy:function(){if(void 0!==r)return r;if(!0===t.has("EXT_texture_filter_anisotropic")){const n=t.get("EXT_texture_filter_anisotropic");r=e.getParameter(n.MAX_TEXTURE_MAX_ANISOTROPY_EXT)}else r=0;return r},getMaxPrecision:a,textureFormatReadable:function(t){return t===T||i.convert(t)===e.getParameter(e.IMPLEMENTATION_COLOR_READ_FORMAT)},textureTypeReadable:function(n){const r=n===E&&(t.has("EXT_color_buffer_half_float")||t.has("EXT_color_buffer_float"));return!(n!==S&&i.convert(n)!==e.getParameter(e.IMPLEMENTATION_COLOR_READ_TYPE)&&n!==M&&!r)},precision:o,logarithmicDepthBuffer:!0===n.logarithmicDepthBuffer,reversedDepthBuffer:!0===n.reversedDepthBuffer&&t.has("EXT_clip_control"),maxTextures:e.getParameter(e.MAX_TEXTURE_IMAGE_UNITS),maxVertexTextures:e.getParameter(e.MAX_VERTEX_TEXTURE_IMAGE_UNITS),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),maxSamples:e.getParameter(e.MAX_SAMPLES),samples:e.getParameter(e.SAMPLES)}}function qn(t){const n=this;let i=null,r=0,a=!1,o=!1;const s=new x,l=new e,c={value:null,needsUpdate:!1};function d(e,t,i,r){const a=null!==e?e.length:0;let o=null;if(0!==a){if(o=c.value,!0!==r||null===o){const n=i+4*a,r=t.matrixWorldInverse;l.getNormalMatrix(r),(null===o||o.length0);n.numPlanes=r,n.numIntersection=0}();else{const e=o?0:r,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]=i[e];m.clippingState=n,this.numIntersection=f?this.numPlanes:0,this.numPlanes+=e}}}kn.set(-1,0,0,0,1,0,0,0,1);const jn=[.125,.215,.35,.446,.526,.582],Zn=20,$n=new C,Qn=new n;let Jn=null,ei=0,ti=0,ni=!1;const ii=new r;class ri{constructor(e){this._renderer=e,this._pingPongRenderTarget=null,this._lodMax=0,this._cubeSize=0,this._sizeLods=[],this._sigmas=[],this._lodMeshes=[],this._backgroundBox=null,this._cubemapMaterial=null,this._equirectMaterial=null,this._blurMaterial=null,this._ggxMaterial=null}fromScene(e,t=0,n=.1,i=100,r={}){const{size:a=256,position:o=ii}=r;Jn=this._renderer.getRenderTarget(),ei=this._renderer.getActiveCubeFace(),ti=this._renderer.getActiveMipmapLevel(),ni=this._renderer.xr.enabled,this._renderer.xr.enabled=!1,this._setSize(a);const s=this._allocateTargets();return s.depthBuffer=!0,this._sceneToCubeUV(e,n,i,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=li(),this._compileMaterial(this._cubemapMaterial))}compileEquirectangularShader(){null===this._equirectMaterial&&(this._equirectMaterial=si(),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())}_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._ggxMaterial&&this._ggxMaterial.dispose(),null!==this._pingPongRenderTarget&&this._pingPongRenderTarget.dispose();for(let e=0;ee-4?l=jn[s-e+4-1]:0===s&&(l=0),n.push(l);const c=1/(a-2),d=-c,u=1+c,f=[d,d,u,d,u,u,d,d,u,u,d,u],p=6,m=6,h=3,_=2,g=1,v=new Float32Array(h*m*p),E=new Float32Array(_*m*p),S=new Float32Array(g*m*p);for(let e=0;e2?0:-1,i=[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];v.set(i,h*m*e),E.set(f,_*m*e);const r=[e,e,e,e,e,e];S.set(r,g*m*e)}const M=new b;M.setAttribute("position",new N(v,h)),M.setAttribute("uv",new N(E,_)),M.setAttribute("faceIndex",new N(S,g)),i.push(new o(M,null)),r>4&&r--}return{lodMeshes:i,sizeLods:t,sigmas:n}}(i)),this._blurMaterial=function(e,t,n){const i=new Float32Array(Zn),a=new r(0,1,0),o=new l({name:"SphericalGaussianBlur",defines:{n:Zn,CUBEUV_TEXEL_WIDTH:1/t,CUBEUV_TEXEL_HEIGHT:1/n,CUBEUV_MAX_MIP:`${e}.0`},uniforms:{envMap:{value:null},samples:{value:1},weights:{value:i},latitudinal:{value:!1},dTheta:{value:0},mipInt:{value:0},poleAxis:{value:a}},vertexShader:ci(),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:w,depthTest:!1,depthWrite:!1});return o}(i,e,t),this._ggxMaterial=function(e,t,n){const i=new l({name:"PMREMGGXConvolution",defines:{GGX_SAMPLES:256,CUBEUV_TEXEL_WIDTH:1/t,CUBEUV_TEXEL_HEIGHT:1/n,CUBEUV_MAX_MIP:`${e}.0`},uniforms:{envMap:{value:null},roughness:{value:0},mipInt:{value:0}},vertexShader:ci(),fragmentShader:'\n\n\t\t\tprecision highp float;\n\t\t\tprecision highp int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\t\t\tuniform float roughness;\n\t\t\tuniform float mipInt;\n\n\t\t\t#define ENVMAP_TYPE_CUBE_UV\n\t\t\t#include \n\n\t\t\t#define PI 3.14159265359\n\n\t\t\t// Van der Corput radical inverse\n\t\t\tfloat radicalInverse_VdC(uint bits) {\n\t\t\t\tbits = (bits << 16u) | (bits >> 16u);\n\t\t\t\tbits = ((bits & 0x55555555u) << 1u) | ((bits & 0xAAAAAAAAu) >> 1u);\n\t\t\t\tbits = ((bits & 0x33333333u) << 2u) | ((bits & 0xCCCCCCCCu) >> 2u);\n\t\t\t\tbits = ((bits & 0x0F0F0F0Fu) << 4u) | ((bits & 0xF0F0F0F0u) >> 4u);\n\t\t\t\tbits = ((bits & 0x00FF00FFu) << 8u) | ((bits & 0xFF00FF00u) >> 8u);\n\t\t\t\treturn float(bits) * 2.3283064365386963e-10; // / 0x100000000\n\t\t\t}\n\n\t\t\t// Hammersley sequence\n\t\t\tvec2 hammersley(uint i, uint N) {\n\t\t\t\treturn vec2(float(i) / float(N), radicalInverse_VdC(i));\n\t\t\t}\n\n\t\t\t// GGX VNDF importance sampling (Eric Heitz 2018)\n\t\t\t// "Sampling the GGX Distribution of Visible Normals"\n\t\t\t// https://jcgt.org/published/0007/04/01/\n\t\t\tvec3 importanceSampleGGX_VNDF(vec2 Xi, vec3 V, float roughness) {\n\t\t\t\tfloat alpha = roughness * roughness;\n\n\t\t\t\t// Section 4.1: Orthonormal basis\n\t\t\t\tvec3 T1 = vec3(1.0, 0.0, 0.0);\n\t\t\t\tvec3 T2 = cross(V, T1);\n\n\t\t\t\t// Section 4.2: Parameterization of projected area\n\t\t\t\tfloat r = sqrt(Xi.x);\n\t\t\t\tfloat phi = 2.0 * PI * Xi.y;\n\t\t\t\tfloat t1 = r * cos(phi);\n\t\t\t\tfloat t2 = r * sin(phi);\n\t\t\t\tfloat s = 0.5 * (1.0 + V.z);\n\t\t\t\tt2 = (1.0 - s) * sqrt(1.0 - t1 * t1) + s * t2;\n\n\t\t\t\t// Section 4.3: Reprojection onto hemisphere\n\t\t\t\tvec3 Nh = t1 * T1 + t2 * T2 + sqrt(max(0.0, 1.0 - t1 * t1 - t2 * t2)) * V;\n\n\t\t\t\t// Section 3.4: Transform back to ellipsoid configuration\n\t\t\t\treturn normalize(vec3(alpha * Nh.x, alpha * Nh.y, max(0.0, Nh.z)));\n\t\t\t}\n\n\t\t\tvoid main() {\n\t\t\t\tvec3 N = normalize(vOutputDirection);\n\t\t\t\tvec3 V = N; // Assume view direction equals normal for pre-filtering\n\n\t\t\t\tvec3 prefilteredColor = vec3(0.0);\n\t\t\t\tfloat totalWeight = 0.0;\n\n\t\t\t\t// For very low roughness, just sample the environment directly\n\t\t\t\tif (roughness < 0.001) {\n\t\t\t\t\tgl_FragColor = vec4(bilinearCubeUV(envMap, N, mipInt), 1.0);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Tangent space basis for VNDF sampling\n\t\t\t\tvec3 up = abs(N.z) < 0.999 ? vec3(0.0, 0.0, 1.0) : vec3(1.0, 0.0, 0.0);\n\t\t\t\tvec3 tangent = normalize(cross(up, N));\n\t\t\t\tvec3 bitangent = cross(N, tangent);\n\n\t\t\t\tfor(uint i = 0u; i < uint(GGX_SAMPLES); i++) {\n\t\t\t\t\tvec2 Xi = hammersley(i, uint(GGX_SAMPLES));\n\n\t\t\t\t\t// For PMREM, V = N, so in tangent space V is always (0, 0, 1)\n\t\t\t\t\tvec3 H_tangent = importanceSampleGGX_VNDF(Xi, vec3(0.0, 0.0, 1.0), roughness);\n\n\t\t\t\t\t// Transform H back to world space\n\t\t\t\t\tvec3 H = normalize(tangent * H_tangent.x + bitangent * H_tangent.y + N * H_tangent.z);\n\t\t\t\t\tvec3 L = normalize(2.0 * dot(V, H) * H - V);\n\n\t\t\t\t\tfloat NdotL = max(dot(N, L), 0.0);\n\n\t\t\t\t\tif(NdotL > 0.0) {\n\t\t\t\t\t\t// Sample environment at fixed mip level\n\t\t\t\t\t\t// VNDF importance sampling handles the distribution filtering\n\t\t\t\t\t\tvec3 sampleColor = bilinearCubeUV(envMap, L, mipInt);\n\n\t\t\t\t\t\t// Weight by NdotL for the split-sum approximation\n\t\t\t\t\t\t// VNDF PDF naturally accounts for the visible microfacet distribution\n\t\t\t\t\t\tprefilteredColor += sampleColor * NdotL;\n\t\t\t\t\t\ttotalWeight += NdotL;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (totalWeight > 0.0) {\n\t\t\t\t\tprefilteredColor = prefilteredColor / totalWeight;\n\t\t\t\t}\n\n\t\t\t\tgl_FragColor = vec4(prefilteredColor, 1.0);\n\t\t\t}\n\t\t',blending:w,depthTest:!1,depthWrite:!1});return i}(i,e,t)}return i}_compileMaterial(e){const t=new o(new b,e);this._renderer.compile(t,$n)}_sceneToCubeUV(e,t,n,i,r){const a=new P(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(Qn),u.toneMapping=L,u.autoClear=!1;u.state.buffers.depth.getReversed()&&(u.setRenderTarget(i),u.clearDepth(),u.setRenderTarget(null)),null===this._backgroundBox&&(this._backgroundBox=new o(new s,new U({name:"PMREM.Background",side:c,depthWrite:!1,depthTest:!1})));const m=this._backgroundBox,h=m.material;let _=!1;const g=e.background;g?g.isColor&&(h.color.copy(g),e.background=null,_=!0):(h.color.copy(Qn),_=!0);for(let t=0;t<6;t++){const n=t%3;0===n?(a.up.set(0,l[t],0),a.position.set(r.x,r.y,r.z),a.lookAt(r.x+d[t],r.y,r.z)):1===n?(a.up.set(0,0,l[t]),a.position.set(r.x,r.y,r.z),a.lookAt(r.x,r.y+d[t],r.z)):(a.up.set(0,l[t],0),a.position.set(r.x,r.y,r.z),a.lookAt(r.x,r.y,r.z+d[t]));const o=this._cubeSize;oi(i,n*o,t>2?o:0,o,o),u.setRenderTarget(i),_&&u.render(m,a),u.render(e,a)}u.toneMapping=p,u.autoClear=f,e.background=g}_textureToCubeUV(e,t){const n=this._renderer,i=e.mapping===A||e.mapping===R;i?(null===this._cubemapMaterial&&(this._cubemapMaterial=li()),this._cubemapMaterial.uniforms.flipEnvMap.value=!1===e.isRenderTargetTexture?-1:1):null===this._equirectMaterial&&(this._equirectMaterial=si());const r=i?this._cubemapMaterial:this._equirectMaterial,a=this._lodMeshes[0];a.material=r;r.uniforms.envMap.value=e;const o=this._cubeSize;oi(t,0,0,3*o,2*o),n.setRenderTarget(t),n.render(a,$n)}_applyPMREM(e){const t=this._renderer,n=t.autoClear;t.autoClear=!1;const i=this._lodMeshes.length;for(let t=1;tu-4?n-u+4:0),m=4*(this._cubeSize-f);s.envMap.value=e.texture,s.roughness.value=d,s.mipInt.value=u-t,oi(r,p,m,3*f,2*f),i.setRenderTarget(r),i.render(o,$n),s.envMap.value=r.texture,s.roughness.value=0,s.mipInt.value=u-n,oi(e,p,m,3*f,2*f),i.setRenderTarget(e),i.render(o,$n)}_blur(e,t,n,i,r){const a=this._pingPongRenderTarget;this._halfBlur(e,a,t,n,i,"latitudinal",r),this._halfBlur(a,e,n,n,i,"longitudinal",r)}_halfBlur(e,t,n,i,r,a,o){const s=this._renderer,l=this._blurMaterial;"latitudinal"!==a&&"longitudinal"!==a&&D("blur direction must be either latitudinal or longitudinal!");const c=this._lodMeshes[i];c.material=l;const d=l.uniforms,u=this._sizeLods[n]-1,f=isFinite(r)?Math.PI/(2*u):2*Math.PI/39,p=r/f,m=isFinite(r)?1+Math.floor(3*p):Zn;m>Zn&&v(`sigmaRadians, ${r}, is too large and will clip, as it requested ${m} samples when the maximum is set to 20`);const h=[];let _=0;for(let e=0;eg-4?i-g+4:0),4*(this._cubeSize-E),3*E,2*E),s.setRenderTarget(t),s.render(c,$n)}}function ai(e,t,n){const i=new I(e,t,n);return i.texture.mapping=a,i.texture.name="PMREM.cubeUv",i.scissorTest=!0,i}function oi(e,t,n,i,r){e.viewport.set(t,n,i,r),e.scissor.set(t,n,i,r)}function si(){return new l({name:"EquirectangularToCubeUV",uniforms:{envMap:{value:null}},vertexShader:ci(),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:w,depthTest:!1,depthWrite:!1})}function li(){return new l({name:"CubemapToCubeUV",uniforms:{envMap:{value:null},flipEnvMap:{value:-1}},vertexShader:ci(),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:w,depthTest:!1,depthWrite:!1})}function ci(){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"}class di extends I{constructor(e=1,t={}){super(e,e,t),this.isWebGLCubeRenderTarget=!0;const n={width:e,height:e,depth:1},i=[n,n,n,n,n,n];this.texture=new O(i),this._setTextureOptions(t),this.texture.isRenderTargetTexture=!0}fromEquirectangularTexture(e,t){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 n={uniforms:{tEquirect:{value:null}},vertexShader:"\n\n\t\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t\tvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\n\t\t\t\t\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n\n\t\t\t\t}\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvWorldDirection = transformDirection( position, modelMatrix );\n\n\t\t\t\t\t#include \n\t\t\t\t\t#include \n\n\t\t\t\t}\n\t\t\t",fragmentShader:"\n\n\t\t\t\tuniform sampler2D tEquirect;\n\n\t\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t\t#include \n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvec3 direction = normalize( vWorldDirection );\n\n\t\t\t\t\tvec2 sampleUV = equirectUv( direction );\n\n\t\t\t\t\tgl_FragColor = texture2D( tEquirect, sampleUV );\n\n\t\t\t\t}\n\t\t\t"},i=new s(5,5,5),r=new l({name:"CubemapFromEquirect",uniforms:d(n.uniforms),vertexShader:n.vertexShader,fragmentShader:n.fragmentShader,side:c,blending:w});r.uniforms.tEquirect.value=t;const a=new o(i,r),u=t.minFilter;t.minFilter===B&&(t.minFilter=F);return new G(1,10,this).update(e,a),t.minFilter=u,a.geometry.dispose(),a.material.dispose(),this}clear(e,t=!0,n=!0,i=!0){const r=e.getRenderTarget();for(let r=0;r<6;r++)e.setRenderTarget(this,r),e.clear(t,n,i);e.setRenderTarget(r)}}function ui(e){let t=new WeakMap,n=new WeakMap,i=null;function r(e,t){return t===H?e.mapping=A:t===V&&(e.mapping=R),e}function a(e){const n=e.target;n.removeEventListener("dispose",a);const i=t.get(n);void 0!==i&&(t.delete(n),i.dispose())}function o(e){const t=e.target;t.removeEventListener("dispose",o);const i=n.get(t);void 0!==i&&(n.delete(t),i.dispose())}return{get:function(s,l=!1){return null==s?null:l?function(t){if(t&&t.isTexture){const r=t.mapping,a=r===H||r===V,s=r===A||r===R;if(a||s){let r=n.get(t);const l=void 0!==r?r.texture.pmremVersion:0;if(t.isRenderTargetTexture&&t.pmremVersion!==l)return null===i&&(i=new ri(e)),r=a?i.fromEquirectangular(t,r):i.fromCubemap(t,r),r.texture.pmremVersion=t.pmremVersion,n.set(t,r),r.texture;if(void 0!==r)return r.texture;{const l=t.image;return a&&l&&l.height>0||s&&l&&function(e){let t=0;const n=6;for(let i=0;i0){const o=new di(i.height);return o.fromEquirectangularTexture(e,n),t.set(n,o),n.addEventListener("dispose",a),r(o.texture,n.mapping)}return null}}}return n}(s)},dispose:function(){t=new WeakMap,n=new WeakMap,null!==i&&(i.dispose(),i=null)}}}function fi(e){const t={};function n(n){if(void 0!==t[n])return t[n];const i=e.getExtension(n);return t[n]=i,i}return{has:function(e){return null!==n(e)},init:function(){n("EXT_color_buffer_float"),n("WEBGL_clip_cull_distance"),n("OES_texture_float_linear"),n("EXT_color_buffer_half_float"),n("WEBGL_multisampled_render_to_texture"),n("WEBGL_render_shared_exponent")},get:function(e){const t=n(e);return null===t&&W("WebGLRenderer: "+e+" extension not supported."),t}}}function pi(e,t,n,i){const r={},a=new WeakMap;function o(e){const s=e.target;null!==s.index&&t.remove(s.index);for(const e in s.attributes)t.remove(s.attributes[e]);s.removeEventListener("dispose",o),delete r[s.id];const l=a.get(s);l&&(t.remove(l),a.delete(s)),i.releaseStatesOfGeometry(s),!0===s.isInstancedBufferGeometry&&delete s._maxInstanceCount,n.memory.geometries--}function s(e){const n=[],i=e.index,r=e.attributes.position;let o=0;if(void 0===r)return;if(null!==i){const e=i.array;o=i.version;for(let t=0,i=e.length;t=65535?k:z)(n,1);s.version=o;const l=a.get(e);l&&t.remove(l),a.set(e,s)}return{get:function(e,t){return!0===r[t.id]||(t.addEventListener("dispose",o),r[t.id]=!0,n.memory.geometries++),t},update:function(n){const i=n.attributes;for(const n in i)t.update(i[n],e.ARRAY_BUFFER)},getWireframeAttribute:function(e){const t=a.get(e);if(t){const n=e.index;null!==n&&t.versionn.maxTextureSize&&(T=Math.ceil(S/n.maxTextureSize),S=n.maxTextureSize);const x=new Float32Array(S*T*4*u),A=new Y(x,S,T,u);A.type=M,A.needsUpdate=!0;const R=4*E;for(let C=0;C\n\t\t\t#include \n\n\t\t\tvoid main() {\n\t\t\t\tgl_FragColor = texture2D( tDiffuse, vUv );\n\n\t\t\t\t#ifdef LINEAR_TONE_MAPPING\n\t\t\t\t\tgl_FragColor.rgb = LinearToneMapping( gl_FragColor.rgb );\n\t\t\t\t#elif defined( REINHARD_TONE_MAPPING )\n\t\t\t\t\tgl_FragColor.rgb = ReinhardToneMapping( gl_FragColor.rgb );\n\t\t\t\t#elif defined( CINEON_TONE_MAPPING )\n\t\t\t\t\tgl_FragColor.rgb = CineonToneMapping( gl_FragColor.rgb );\n\t\t\t\t#elif defined( ACES_FILMIC_TONE_MAPPING )\n\t\t\t\t\tgl_FragColor.rgb = ACESFilmicToneMapping( gl_FragColor.rgb );\n\t\t\t\t#elif defined( AGX_TONE_MAPPING )\n\t\t\t\t\tgl_FragColor.rgb = AgXToneMapping( gl_FragColor.rgb );\n\t\t\t\t#elif defined( NEUTRAL_TONE_MAPPING )\n\t\t\t\t\tgl_FragColor.rgb = NeutralToneMapping( gl_FragColor.rgb );\n\t\t\t\t#elif defined( CUSTOM_TONE_MAPPING )\n\t\t\t\t\tgl_FragColor.rgb = CustomToneMapping( gl_FragColor.rgb );\n\t\t\t\t#endif\n\n\t\t\t\t#ifdef SRGB_TRANSFER\n\t\t\t\t\tgl_FragColor = sRGBTransferOETF( gl_FragColor );\n\t\t\t\t#endif\n\t\t\t}",depthTest:!1,depthWrite:!1}),d=new o(l,c),u=new C(-1,1,1,-1,0,1);let m,h=null,_=null,g=!1,v=null,S=[],M=!1;this.setSize=function(e,t){a.setSize(e,t),s.setSize(e,t);for(let n=0;n0&&!0===S[0].isRenderPass;const t=a.width,n=a.height;for(let e=0;e0)return e;const r=t*n;let a=Ri[r];if(void 0===a&&(a=new Float32Array(r),Ri[r]=a),0!==t){i.toArray(a,0);for(let i=1,r=0;i!==t;++i)r+=n,e[i].toArray(a,r)}return a}function Di(e,t){if(e.length!==t.length)return!1;for(let n=0,i=e.length;n0&&(this.seq=i.concat(r))}setValue(e,t,n,i){const r=this.map[t];void 0!==r&&r.setValue(e,n,i)}setOptional(e,t,n){const i=t[n];void 0!==i&&this.setValue(e,n,i)}static upload(e,t,n,i){for(let r=0,a=t.length;r!==a;++r){const a=t[r],o=n[a.id];!1!==o.needsUpdate&&a.setValue(e,o.value,i)}}static seqWithValue(e,t){const n=[];for(let i=0,r=e.length;i!==r;++i){const r=e[i];r.id in t&&n.push(r)}return n}}function Rr(e,t,n){const i=e.createShader(t);return e.shaderSource(i,n),e.compileShader(i),i}let br=0;const Cr=new e;function Pr(e,t,n){const i=e.getShaderParameter(t,e.COMPILE_STATUS),r=(e.getShaderInfoLog(t)||"").trim();if(i&&""===r)return"";const a=/ERROR: 0:(\d+)/.exec(r);if(a){const i=parseInt(a[1]);return n.toUpperCase()+"\n\n"+r+"\n\n"+function(e,t){const n=e.split("\n"),i=[],r=Math.max(t-6,0),a=Math.min(t+6,n.length);for(let e=r;e":" "} ${r}: ${n[e]}`)}return i.join("\n")}(e.getShaderSource(t),i)}return r}function Lr(e,t){const n=function(e){f._getMatrix(Cr,f.workingColorSpace,e);const t=`mat3( ${Cr.elements.map(e=>e.toFixed(4))} )`;switch(f.getTransfer(e)){case pe:return[t,"LinearTransferOETF"];case p:return[t,"sRGBTransferOETF"];default:return v("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")}const Ur={[te]:"Linear",[ee]:"Reinhard",[J]:"Cineon",[Q]:"ACESFilmic",[$]:"AgX",[Z]:"Neutral",[j]:"Custom"};function Dr(e,t){const n=Ur[t];return void 0===n?(v("WebGLProgram: Unsupported toneMapping:",t),"vec3 "+e+"( vec3 color ) { return LinearToneMapping( color ); }"):"vec3 "+e+"( vec3 color ) { return "+n+"ToneMapping( color ); }"}const wr=new r;function Ir(){f.getLuminanceCoefficients(wr);return["float luminance( const in vec3 rgb ) {",`\tconst vec3 weights = vec3( ${wr.x.toFixed(4)}, ${wr.y.toFixed(4)}, ${wr.z.toFixed(4)} );`,"\treturn dot( weights, rgb );","}"].join("\n")}function Nr(e){return""!==e}function yr(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 Fr(e,t){return e.replace(/NUM_CLIPPING_PLANES/g,t.numClippingPlanes).replace(/UNION_CLIPPING_PLANES/g,t.numClippingPlanes-t.numClipIntersection)}const Or=/^[ \t]*#include +<([\w\d./]+)>/gm;function Br(e){return e.replace(Or,Hr)}const Gr=new Map;function Hr(e,t){let n=Bn[t];if(void 0===n){const e=Gr.get(t);if(void 0===e)throw new Error("Can not resolve #include <"+t+">");n=Bn[e],v('WebGLRenderer: Shader chunk "%s" has been deprecated. Use "%s" instead.',t,e)}return Br(n)}const Vr=/#pragma unroll_loop_start\s+for\s*\(\s*int\s+i\s*=\s*(\d+)\s*;\s*i\s*<\s*(\d+)\s*;\s*i\s*\+\+\s*\)\s*{([\s\S]+?)}\s+#pragma unroll_loop_end/g;function Wr(e){return e.replace(Vr,kr)}function kr(e,t,n,i){let r="";for(let e=parseInt(t);e0&&(_+="\n"),g=["#define SHADER_TYPE "+n.shaderType,"#define SHADER_NAME "+n.shaderName,m].filter(Nr).join("\n"),g.length>0&&(g+="\n")):(_=[zr(n),"#define SHADER_TYPE "+n.shaderType,"#define SHADER_NAME "+n.shaderName,m,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 "+d:"",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 "+l:"",n.sizeAttenuation?"#define USE_SIZEATTENUATION":"",n.numLightProbes>0?"#define USE_LIGHT_PROBES":"",n.logarithmicDepthBuffer?"#define USE_LOGARITHMIC_DEPTH_BUFFER":"",n.reversedDepthBuffer?"#define USE_REVERSED_DEPTH_BUFFER":"","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(Nr).join("\n"),g=[zr(n),"#define SHADER_TYPE "+n.shaderType,"#define SHADER_NAME "+n.shaderName,m,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 "+c:"",n.envMap?"#define "+d:"",n.envMap?"#define "+u:"",f?"#define CUBEUV_TEXEL_WIDTH "+f.texelWidth:"",f?"#define CUBEUV_TEXEL_HEIGHT "+f.texelHeight:"",f?"#define CUBEUV_MAX_MIP "+f.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.packedNormalMap?"#define USE_PACKED_NORMALMAP":"",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?"#define USE_COLOR":"",n.vertexAlphas||n.batchingColor?"#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 "+l:"",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_LOGARITHMIC_DEPTH_BUFFER":"",n.reversedDepthBuffer?"#define USE_REVERSED_DEPTH_BUFFER":"","uniform mat4 viewMatrix;","uniform vec3 cameraPosition;","uniform bool isOrthographic;",n.toneMapping!==L?"#define TONE_MAPPING":"",n.toneMapping!==L?Bn.tonemapping_pars_fragment:"",n.toneMapping!==L?Dr("toneMapping",n.toneMapping):"",n.dithering?"#define DITHERING":"",n.opaque?"#define OPAQUE":"",Bn.colorspace_pars_fragment,Lr("linearToOutputTexel",n.outputColorSpace),Ir(),n.useDepthPacking?"#define DEPTH_PACKING "+n.depthPacking:"","\n"].filter(Nr).join("\n")),o=Br(o),o=yr(o,n),o=Fr(o,n),s=Br(s),s=yr(s,n),s=Fr(s,n),o=Wr(o),s=Wr(s),!0!==n.isRawShaderMaterial&&(E="#version 300 es\n",_=[p,"#define attribute in","#define varying out","#define texture2D texture"].join("\n")+"\n"+_,g=["#define varying in",n.glslVersion===se?"":"layout(location = 0) out highp vec4 pc_fragColor;",n.glslVersion===se?"":"#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"+g);const S=E+_+o,M=E+g+s,T=Rr(r,r.VERTEX_SHADER,S),x=Rr(r,r.FRAGMENT_SHADER,M);function A(t){if(e.debug.checkShaderErrors){const n=r.getProgramInfoLog(h)||"",i=r.getShaderInfoLog(T)||"",a=r.getShaderInfoLog(x)||"",o=n.trim(),s=i.trim(),l=a.trim();let c=!0,d=!0;if(!1===r.getProgramParameter(h,r.LINK_STATUS))if(c=!1,"function"==typeof e.debug.onShaderError)e.debug.onShaderError(r,h,T,x);else{const e=Pr(r,T,"vertex"),n=Pr(r,x,"fragment");D("THREE.WebGLProgram: Shader Error "+r.getError()+" - VALIDATE_STATUS "+r.getProgramParameter(h,r.VALIDATE_STATUS)+"\n\nMaterial Name: "+t.name+"\nMaterial Type: "+t.type+"\n\nProgram Info Log: "+o+"\n"+e+"\n"+n)}else""!==o?v("WebGLProgram: Program Info Log:",o):""!==s&&""!==l||(d=!1);d&&(t.diagnostics={runnable:c,programLog:o,vertexShader:{log:s,prefix:_},fragmentShader:{log:l,prefix:g}})}r.deleteShader(T),r.deleteShader(x),R=new Ar(r,h),b=function(e,t){const n={},i=e.getProgramParameter(t,e.ACTIVE_ATTRIBUTES);for(let r=0;r0,Q=r.clearcoat>0,J=r.dispersion>0,ee=r.iridescence>0,te=r.sheen>0,ne=r.transmission>0,ie=$&&!!r.anisotropyMap,re=Q&&!!r.clearcoatMap,ae=Q&&!!r.clearcoatNormalMap,oe=Q&&!!r.clearcoatRoughnessMap,se=ee&&!!r.iridescenceMap,le=ee&&!!r.iridescenceThicknessMap,ce=te&&!!r.sheenColorMap,de=te&&!!r.sheenRoughnessMap,ue=!!r.specularMap,fe=!!r.specularColorMap,pe=!!r.specularIntensityMap,me=ne&&!!r.transmissionMap,Ee=ne&&!!r.thicknessMap,xe=!!r.gradientMap,Ae=!!r.alphaMap,Re=r.alphaTest>0,be=!!r.alphaHash,Ce=!!r.extensions;let Pe=L;r.toneMapped&&(null!==F&&!0!==F.isXRRenderTarget||(Pe=e.toneMapping));const Le={shaderID:C,shaderType:r.type,shaderName:r.name,vertexShader:D,fragmentShader:w,defines:r.defines,customVertexShaderID:I,customFragmentShaderID:N,isRawShaderMaterial:!0===r.isRawShaderMaterial,glslVersion:r.glslVersion,precision:_,batching:G,batchingColor:G&&null!==S._colorsTexture,instancing:B,instancingColor:B&&null!==S.instanceColor,instancingMorph:B&&null!==S.morphTexture,outputColorSpace:null===F?e.outputColorSpace:!0===F.isXRRenderTarget?F.texture.colorSpace:f.workingColorSpace,alphaToCoverage:!!r.alphaToCoverage,map:H,matcap:V,envMap:W,envMapMode:W&&R.mapping,envMapCubeUVHeight:b,aoMap:k,lightMap:z,bumpMap:X,normalMap:Y,displacementMap:K,emissiveMap:q,normalMapObjectSpace:Y&&r.normalMapType===ve,normalMapTangentSpace:Y&&r.normalMapType===ge,packedNormalMap:Y&&r.normalMapType===ge&&(Ue=r.normalMap.format,Ue===Se||Ue===Me||Ue===Te),metalnessMap:j,roughnessMap:Z,anisotropy:$,anisotropyMap:ie,clearcoat:Q,clearcoatMap:re,clearcoatNormalMap:ae,clearcoatRoughnessMap:oe,dispersion:J,iridescence:ee,iridescenceMap:se,iridescenceThicknessMap:le,sheen:te,sheenColorMap:ce,sheenRoughnessMap:de,specularMap:ue,specularColorMap:fe,specularIntensityMap:pe,transmission:ne,transmissionMap:me,thicknessMap:Ee,gradientMap:xe,opaque:!1===r.transparent&&r.blending===_e&&!1===r.alphaToCoverage,alphaMap:Ae,alphaTest:Re,alphaHash:be,combine:r.combine,mapUv:H&&E(r.map.channel),aoMapUv:k&&E(r.aoMap.channel),lightMapUv:z&&E(r.lightMap.channel),bumpMapUv:X&&E(r.bumpMap.channel),normalMapUv:Y&&E(r.normalMap.channel),displacementMapUv:K&&E(r.displacementMap.channel),emissiveMapUv:q&&E(r.emissiveMap.channel),metalnessMapUv:j&&E(r.metalnessMap.channel),roughnessMapUv:Z&&E(r.roughnessMap.channel),anisotropyMapUv:ie&&E(r.anisotropyMap.channel),clearcoatMapUv:re&&E(r.clearcoatMap.channel),clearcoatNormalMapUv:ae&&E(r.clearcoatNormalMap.channel),clearcoatRoughnessMapUv:oe&&E(r.clearcoatRoughnessMap.channel),iridescenceMapUv:se&&E(r.iridescenceMap.channel),iridescenceThicknessMapUv:le&&E(r.iridescenceThicknessMap.channel),sheenColorMapUv:ce&&E(r.sheenColorMap.channel),sheenRoughnessMapUv:de&&E(r.sheenRoughnessMap.channel),specularMapUv:ue&&E(r.specularMap.channel),specularColorMapUv:fe&&E(r.specularColorMap.channel),specularIntensityMapUv:pe&&E(r.specularIntensityMap.channel),transmissionMapUv:me&&E(r.transmissionMap.channel),thicknessMapUv:Ee&&E(r.thicknessMap.channel),alphaMapUv:Ae&&E(r.alphaMap.channel),vertexTangents:!!T.attributes.tangent&&(Y||$),vertexColors:r.vertexColors,vertexAlphas:!0===r.vertexColors&&!!T.attributes.color&&4===T.attributes.color.itemSize,pointsUvs:!0===S.isPoints&&!!T.attributes.uv&&(H||Ae),fog:!!M,useFog:!0===r.fog,fogExp2:!!M&&M.isFogExp2,flatShading:!1===r.wireframe&&(!0===r.flatShading||void 0===T.attributes.normal&&!1===Y&&(r.isMeshLambertMaterial||r.isMeshPhongMaterial||r.isMeshStandardMaterial||r.isMeshPhysicalMaterial)),sizeAttenuation:!0===r.sizeAttenuation,logarithmicDepthBuffer:h,reversedDepthBuffer:O,skinning:!0===S.isSkinnedMesh,morphTargets:void 0!==T.morphAttributes.position,morphNormals:void 0!==T.morphAttributes.normal,morphColors:void 0!==T.morphAttributes.color,morphTargetsCount:U,morphTextureStride:y,numDirLights:s.directional.length,numPointLights:s.point.length,numSpotLights:s.spot.length,numSpotLightMaps:s.spotLightMap.length,numRectAreaLights:s.rectArea.length,numHemiLights:s.hemi.length,numDirLightShadows:s.directionalShadowMap.length,numPointLightShadows:s.pointShadowMap.length,numSpotLightShadows:s.spotShadowMap.length,numSpotLightShadowsWithMaps:s.numSpotLightShadowsWithMaps,numLightProbes:s.numLightProbes,numClippingPlanes:o.numPlanes,numClipIntersection:o.numIntersection,dithering:r.dithering,shadowMapEnabled:e.shadowMap.enabled&&u.length>0,shadowMapType:e.shadowMap.type,toneMapping:Pe,decodeVideoTexture:H&&!0===r.map.isVideoTexture&&f.getTransfer(r.map.colorSpace)===p,decodeVideoTextureEmissive:q&&!0===r.emissiveMap.isVideoTexture&&f.getTransfer(r.emissiveMap.colorSpace)===p,premultipliedAlpha:r.premultipliedAlpha,doubleSided:r.side===he,flipSided:r.side===c,useDepthPacking:r.depthPacking>=0,depthPacking:r.depthPacking||0,index0AttributeName:r.index0AttributeName,extensionClipCullDistance:Ce&&!0===r.extensions.clipCullDistance&&n.has("WEBGL_clip_cull_distance"),extensionMultiDraw:(Ce&&!0===r.extensions.multiDraw||G)&&n.has("WEBGL_multi_draw"),rendererExtensionParallelShaderCompile:n.has("KHR_parallel_shader_compile"),customProgramCacheKey:r.customProgramCacheKey()};var Ue;return Le.vertexUv1s=d.has(1),Le.vertexUv2s=d.has(2),Le.vertexUv3s=d.has(3),d.clear(),Le},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){s.disableAll(),t.instancing&&s.enable(0);t.instancingColor&&s.enable(1);t.instancingMorph&&s.enable(2);t.matcap&&s.enable(3);t.envMap&&s.enable(4);t.normalMapObjectSpace&&s.enable(5);t.normalMapTangentSpace&&s.enable(6);t.clearcoat&&s.enable(7);t.iridescence&&s.enable(8);t.alphaTest&&s.enable(9);t.vertexColors&&s.enable(10);t.vertexAlphas&&s.enable(11);t.vertexUv1s&&s.enable(12);t.vertexUv2s&&s.enable(13);t.vertexUv3s&&s.enable(14);t.vertexTangents&&s.enable(15);t.anisotropy&&s.enable(16);t.alphaHash&&s.enable(17);t.batching&&s.enable(18);t.dispersion&&s.enable(19);t.batchingColor&&s.enable(20);t.gradientMap&&s.enable(21);t.packedNormalMap&&s.enable(22);e.push(s.mask),s.disableAll(),t.fog&&s.enable(0);t.useFog&&s.enable(1);t.flatShading&&s.enable(2);t.logarithmicDepthBuffer&&s.enable(3);t.reversedDepthBuffer&&s.enable(4);t.skinning&&s.enable(5);t.morphTargets&&s.enable(6);t.morphNormals&&s.enable(7);t.morphColors&&s.enable(8);t.premultipliedAlpha&&s.enable(9);t.shadowMapEnabled&&s.enable(10);t.doubleSided&&s.enable(11);t.flipSided&&s.enable(12);t.useDepthPacking&&s.enable(13);t.dithering&&s.enable(14);t.transmission&&s.enable(15);t.sheen&&s.enable(16);t.opaque&&s.enable(17);t.pointsUvs&&s.enable(18);t.decodeVideoTexture&&s.enable(19);t.decodeVideoTextureEmissive&&s.enable(20);t.alphaToCoverage&&s.enable(21);e.push(s.mask)}(n,t),n.push(e.outputColorSpace)),n.push(t.customProgramCacheKey),n.join()},getUniforms:function(e){const t=g[e.type];let n;if(t){const e=Hn[t];n=me.clone(e.uniforms)}else n=e.uniforms;return n},acquireProgram:function(t,n){let i=m.get(n);return void 0!==i?++i.usedTimes:(i=new jr(e,n,t,r),u.push(i),m.set(n,i)),i},releaseProgram:function(e){if(0===--e.usedTimes){const t=u.indexOf(e);u[t]=u[u.length-1],u.pop(),m.delete(e.cacheKey),e.destroy()}},releaseShaderCache:function(e){l.remove(e)},programs:u,dispose:function(){l.dispose()}}}function ea(){let e=new WeakMap;return{has:function(t){return e.has(t)},get:function(t){let n=e.get(t);return void 0===n&&(n={},e.set(t,n)),n},remove:function(t){e.delete(t)},update:function(t,n,i){e.get(t)[n]=i},dispose:function(){e=new WeakMap}}}function ta(e,t){return e.groupOrder!==t.groupOrder?e.groupOrder-t.groupOrder:e.renderOrder!==t.renderOrder?e.renderOrder-t.renderOrder:e.material.id!==t.material.id?e.material.id-t.material.id:e.materialVariant!==t.materialVariant?e.materialVariant-t.materialVariant:e.z!==t.z?e.z-t.z:e.id-t.id}function na(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 ia(){const e=[];let t=0;const n=[],i=[],r=[];function a(e){let t=0;return e.isInstancedMesh&&(t+=2),e.isSkinnedMesh&&(t+=1),t}function o(n,i,r,o,s,l){let c=e[t];return void 0===c?(c={id:n.id,object:n,geometry:i,material:r,materialVariant:a(n),groupOrder:o,renderOrder:n.renderOrder,z:s,group:l},e[t]=c):(c.id=n.id,c.object=n,c.geometry=i,c.material=r,c.materialVariant=a(n),c.groupOrder=o,c.renderOrder=n.renderOrder,c.z=s,c.group=l),t++,c}return{opaque:n,transmissive:i,transparent:r,init:function(){t=0,n.length=0,i.length=0,r.length=0},push:function(e,t,a,s,l,c){const d=o(e,t,a,s,l,c);a.transmission>0?i.push(d):!0===a.transparent?r.push(d):n.push(d)},unshift:function(e,t,a,s,l,c){const d=o(e,t,a,s,l,c);a.transmission>0?i.unshift(d):!0===a.transparent?r.unshift(d):n.unshift(d)},finish:function(){for(let n=t,i=e.length;n1&&n.sort(e||ta),i.length>1&&i.sort(t||na),r.length>1&&r.sort(t||na)}}}function ra(){let e=new WeakMap;return{get:function(t,n){const i=e.get(t);let r;return void 0===i?(r=new ia,e.set(t,[r])):n>=i.length?(r=new ia,i.push(r)):r=i[n],r},dispose:function(){e=new WeakMap}}}function aa(){const e={};return{get:function(t){if(void 0!==e[t.id])return e[t.id];let i;switch(t.type){case"DirectionalLight":i={direction:new r,color:new n};break;case"SpotLight":i={position:new r,direction:new r,color:new n,distance:0,coneCos:0,penumbraCos:0,decay:0};break;case"PointLight":i={position:new r,color:new n,distance:0,decay:0};break;case"HemisphereLight":i={direction:new r,skyColor:new n,groundColor:new n};break;case"RectAreaLight":i={color:new n,position:new r,halfWidth:new r,halfHeight:new r}}return e[t.id]=i,i}}}let oa=0;function sa(e,t){return(t.castShadow?2:0)-(e.castShadow?2:0)+(t.map?1:0)-(e.map?1:0)}function la(e){const n=new aa,i=function(){const e={};return{get:function(n){if(void 0!==e[n.id])return e[n.id];let i;switch(n.type){case"DirectionalLight":case"SpotLight":i={shadowIntensity:1,shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new t};break;case"PointLight":i={shadowIntensity:1,shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new t,shadowCameraNear:1,shadowCameraFar:1e3}}return e[n.id]=i,i}}}(),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 r);const o=new r,s=new u,l=new u;return{setup:function(t){let r=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(sa);for(let e=0,E=t.length;e0&&(!0===e.has("OES_texture_float_linear")?(a.rectAreaLTC1=Gn.LTC_FLOAT_1,a.rectAreaLTC2=Gn.LTC_FLOAT_2):(a.rectAreaLTC1=Gn.LTC_HALF_1,a.rectAreaLTC2=Gn.LTC_HALF_2)),a.ambient[0]=r,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=oa++)},setupView:function(e,t){let n=0,i=0,r=0,c=0,d=0;const u=t.matrixWorldInverse;for(let t=0,f=e.length;t=r.length?(a=new ca(e),r.push(a)):a=r[i],a},dispose:function(){t=new WeakMap}}}const ua=[new r(1,0,0),new r(-1,0,0),new r(0,1,0),new r(0,-1,0),new r(0,0,1),new r(0,0,-1)],fa=[new r(0,-1,0),new r(0,-1,0),new r(0,0,1),new r(0,0,-1),new r(0,-1,0),new r(0,-1,0)],pa=new u,ma=new r,ha=new r;function _a(e,n,i){let r=new xe;const a=new t,s=new t,d=new X,u=new Ae,f=new Re,p={},m=i.maxTextureSize,_={[h]:c,[c]:h,[he]:he},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;\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 = texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( uvOffset, 0.0 ) * radius ) / resolution ).rg;\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 = texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( 0.0, uvOffset ) * radius ) / resolution ).r;\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( max( 0.0, squared_mean - mean * mean ) );\n\tgl_FragColor = vec4( mean, std_dev, 0.0, 1.0 );\n}"}),S=g.clone();S.defines.HORIZONTAL_PASS=1;const T=new b;T.setAttribute("position",new N(new Float32Array([-1,-1,.5,3,-1,.5,-1,3,.5]),3));const x=new o(T,g),A=this;this.enabled=!1,this.autoUpdate=!0,this.needsUpdate=!1,this.type=ce;let R=this.type;function C(t,i){const r=n.update(x);g.defines.VSM_SAMPLES!==t.blurSamples&&(g.defines.VSM_SAMPLES=t.blurSamples,S.defines.VSM_SAMPLES=t.blurSamples,g.needsUpdate=!0,S.needsUpdate=!0),null===t.mapPass&&(t.mapPass=new I(a.x,a.y,{format:Se,type:E})),g.uniforms.shadow_pass.value=t.map.depthTexture,g.uniforms.resolution.value=t.mapSize,g.uniforms.radius.value=t.radius,e.setRenderTarget(t.mapPass),e.clear(),e.renderBufferDirect(i,null,r,g,x,null),S.uniforms.shadow_pass.value=t.mapPass.texture,S.uniforms.resolution.value=t.mapSize,S.uniforms.radius.value=t.radius,e.setRenderTarget(t.map),e.clear(),e.renderBufferDirect(i,null,r,S,x,null)}function P(t,n,i,r){let a=null;const o=!0===i.isPointLight?t.customDistanceMaterial:t.customDepthMaterial;if(void 0!==o)a=o;else if(a=!0===i.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 i=p[e];void 0===i&&(i={},p[e]=i);let r=i[t];void 0===r&&(r=a.clone(),i[t]=r,n.addEventListener("dispose",U)),a=r}if(a.visible=n.visible,a.wireframe=n.wireframe,a.side=r===le?null!==n.shadowSide?n.shadowSide:n.side:null!==n.shadowSide?n.shadowSide:_[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===i.isPointLight&&!0===a.isMeshDistanceMaterial){e.properties.get(a).light=i}return a}function L(t,i,a,o,s){if(!1===t.visible)return;if(t.layers.test(i.layers)&&(t.isMesh||t.isLine||t.isPoints)&&(t.castShadow||t.receiveShadow&&s===le)&&(!t.frustumCulled||r.intersectsObject(t))){t.modelViewMatrix.multiplyMatrices(a.matrixWorldInverse,t.matrixWorld);const r=n.update(t),l=t.material;if(Array.isArray(l)){const n=r.groups;for(let c=0,d=n.length;ce.needsUpdate=!0):e.material.needsUpdate=!0)});for(let o=0,l=t.length;om||a.y>m)&&(a.x>m&&(s.x=Math.floor(m/p.x),a.x=s.x*p.x,c.mapSize.x=s.x),a.y>m&&(s.y=Math.floor(m/p.y),a.y=s.y*p.y,c.mapSize.y=s.y));const h=e.state.buffers.depth.getReversed();if(c.camera._reversedDepth=h,null===c.map||!0===f){if(null!==c.map&&(null!==c.map.depthTexture&&(c.map.depthTexture.dispose(),c.map.depthTexture=null),c.map.dispose()),this.type===le){if(l.isPointLight){v("WebGLShadowMap: VSM shadow maps are not supported for PointLights. Use PCF or BasicShadowMap instead.");continue}c.map=new I(a.x,a.y,{format:Se,type:E,minFilter:F,magFilter:F,generateMipmaps:!1}),c.map.texture.name=l.name+".shadowMap",c.map.depthTexture=new ae(a.x,a.y,M),c.map.depthTexture.name=l.name+".shadowMapDepth",c.map.depthTexture.format=Ce,c.map.depthTexture.compareFunction=null,c.map.depthTexture.minFilter=Pe,c.map.depthTexture.magFilter=Pe}else l.isPointLight?(c.map=new di(a.x),c.map.depthTexture=new Le(a.x,Ue)):(c.map=new I(a.x,a.y),c.map.depthTexture=new ae(a.x,a.y,Ue)),c.map.depthTexture.name=l.name+".shadowMap",c.map.depthTexture.format=Ce,this.type===ce?(c.map.depthTexture.compareFunction=h?ie:re,c.map.depthTexture.minFilter=F,c.map.depthTexture.magFilter=F):(c.map.depthTexture.compareFunction=null,c.map.depthTexture.minFilter=Pe,c.map.depthTexture.magFilter=Pe);c.camera.updateProjectionMatrix()}const _=c.map.isWebGLCubeRenderTarget?6:1;for(let t=0;t<_;t++){if(c.map.isWebGLCubeRenderTarget)e.setRenderTarget(c.map,t),e.clear();else{0===t&&(e.setRenderTarget(c.map),e.clear());const n=c.getViewport(t);d.set(s.x*n.x,s.y*n.y,s.x*n.z,s.y*n.w),u.viewport(d)}if(l.isPointLight){const e=c.camera,n=c.matrix,i=l.distance||e.far;i!==e.far&&(e.far=i,e.updateProjectionMatrix()),ma.setFromMatrixPosition(l.matrixWorld),e.position.copy(ma),ha.copy(e.position),ha.add(ua[t]),e.up.copy(fa[t]),e.lookAt(ha),e.updateMatrixWorld(),n.makeTranslation(-ma.x,-ma.y,-ma.z),pa.multiplyMatrices(e.projectionMatrix,e.matrixWorldInverse),c._frustum.setFromProjectionMatrix(pa,e.coordinateSystem,e.reversedDepth)}else c.updateMatrices(l);r=c.getFrustum(),L(n,i,c.camera,l,this.type)}!0!==c.isPointLightShadow&&this.type===le&&C(c,i),c.needsUpdate=!1}R=this.type,A.needsUpdate=!1,e.setRenderTarget(o,l,c)}}function ga(e,t){const i=new function(){let t=!1;const n=new X;let i=null;const r=new X(0,0,0,0);return{setMask:function(n){i===n||t||(e.colorMask(n,n,n,n),i=n)},setLocked:function(e){t=e},setClear:function(t,i,a,o,s){!0===s&&(t*=o,i*=o,a*=o),n.set(t,i,a,o),!1===r.equals(n)&&(e.clearColor(t,i,a,o),r.copy(n))},reset:function(){t=!1,i=null,r.set(-1,0,0,0)}}},r=new function(){let n=!1,i=!1,r=null,a=null,o=null;return{setReversed:function(e){if(i!==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),i=e;const r=o;o=null,this.setClear(r)}},getReversed:function(){return i},setTest:function(t){t?z(e.DEPTH_TEST):Y(e.DEPTH_TEST)},setMask:function(t){r===t||n||(e.depthMask(t),r=t)},setFunc:function(t){if(i&&(t=dt[t]),a!==t){switch(t){case nt:e.depthFunc(e.NEVER);break;case tt:e.depthFunc(e.ALWAYS);break;case et:e.depthFunc(e.LESS);break;case De:e.depthFunc(e.LEQUAL);break;case Je:e.depthFunc(e.EQUAL);break;case Qe:e.depthFunc(e.GEQUAL);break;case $e:e.depthFunc(e.GREATER);break;case Ze:e.depthFunc(e.NOTEQUAL);break;default:e.depthFunc(e.LEQUAL)}a=t}},setLocked:function(e){n=e},setClear:function(t){o!==t&&(o=t,i&&(t=1-t),e.clearDepth(t))},reset:function(){n=!1,r=null,a=null,o=null,i=!1}}},a=new function(){let t=!1,n=null,i=null,r=null,a=null,o=null,s=null,l=null,c=null;return{setTest:function(n){t||(n?z(e.STENCIL_TEST):Y(e.STENCIL_TEST))},setMask:function(i){n===i||t||(e.stencilMask(i),n=i)},setFunc:function(t,n,o){i===t&&r===n&&a===o||(e.stencilFunc(t,n,o),i=t,r=n,a=o)},setOp:function(t,n,i){o===t&&s===n&&l===i||(e.stencilOp(t,n,i),o=t,s=n,l=i)},setLocked:function(e){t=e},setClear:function(t){c!==t&&(e.clearStencil(t),c=t)},reset:function(){t=!1,n=null,i=null,r=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,M=null,T=new n(0,0,0),x=0,A=!1,R=null,b=null,C=null,P=null,L=null;const U=e.getParameter(e.MAX_COMBINED_TEXTURE_IMAGE_UNITS);let I=!1,N=0;const y=e.getParameter(e.VERSION);-1!==y.indexOf("WebGL")?(N=parseFloat(/^WebGL (\d)/.exec(y)[1]),I=N>=1):-1!==y.indexOf("OpenGL ES")&&(N=parseFloat(/^OpenGL ES (\d)/.exec(y)[1]),I=N>=2);let F=null,O={};const B=e.getParameter(e.SCISSOR_BOX),G=e.getParameter(e.VIEWPORT),H=(new X).fromArray(B),V=(new X).fromArray(G);function W(t,n,i,r){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||r.height>n)&&(i=n/Math.max(r.width,r.height)),i<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(i*r.width),a=Math.floor(i*r.height);void 0===m&&(m=g(n,a));const o=t?g(n,a):m;o.width=n,o.height=a;return o.getContext("2d").drawImage(e,0,0,n,a),v("WebGLRenderer: Texture has been resized from ("+r.width+"x"+r.height+") to ("+n+"x"+a+")."),o}return"data"in e&&v("WebGLRenderer: Image in DataTexture is too big ("+r.width+"x"+r.height+")."),e}return e}function x(e){return e.generateMipmaps}function A(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 b(t,i,r,a,o=!1){if(null!==t){if(void 0!==e[t])return e[t];v("WebGLRenderer: Attempt to use non-existing WebGL internal format '"+t+"'")}let s=i;if(i===e.RED&&(r===e.FLOAT&&(s=e.R32F),r===e.HALF_FLOAT&&(s=e.R16F),r===e.UNSIGNED_BYTE&&(s=e.R8)),i===e.RED_INTEGER&&(r===e.UNSIGNED_BYTE&&(s=e.R8UI),r===e.UNSIGNED_SHORT&&(s=e.R16UI),r===e.UNSIGNED_INT&&(s=e.R32UI),r===e.BYTE&&(s=e.R8I),r===e.SHORT&&(s=e.R16I),r===e.INT&&(s=e.R32I)),i===e.RG&&(r===e.FLOAT&&(s=e.RG32F),r===e.HALF_FLOAT&&(s=e.RG16F),r===e.UNSIGNED_BYTE&&(s=e.RG8)),i===e.RG_INTEGER&&(r===e.UNSIGNED_BYTE&&(s=e.RG8UI),r===e.UNSIGNED_SHORT&&(s=e.RG16UI),r===e.UNSIGNED_INT&&(s=e.RG32UI),r===e.BYTE&&(s=e.RG8I),r===e.SHORT&&(s=e.RG16I),r===e.INT&&(s=e.RG32I)),i===e.RGB_INTEGER&&(r===e.UNSIGNED_BYTE&&(s=e.RGB8UI),r===e.UNSIGNED_SHORT&&(s=e.RGB16UI),r===e.UNSIGNED_INT&&(s=e.RGB32UI),r===e.BYTE&&(s=e.RGB8I),r===e.SHORT&&(s=e.RGB16I),r===e.INT&&(s=e.RGB32I)),i===e.RGBA_INTEGER&&(r===e.UNSIGNED_BYTE&&(s=e.RGBA8UI),r===e.UNSIGNED_SHORT&&(s=e.RGBA16UI),r===e.UNSIGNED_INT&&(s=e.RGBA32UI),r===e.BYTE&&(s=e.RGBA8I),r===e.SHORT&&(s=e.RGBA16I),r===e.INT&&(s=e.RGBA32I)),i===e.RGB&&(r===e.UNSIGNED_INT_5_9_9_9_REV&&(s=e.RGB9_E5),r===e.UNSIGNED_INT_10F_11F_11F_REV&&(s=e.R11F_G11F_B10F)),i===e.RGBA){const t=o?pe:f.getTransfer(a);r===e.FLOAT&&(s=e.RGBA32F),r===e.HALF_FLOAT&&(s=e.RGBA16F),r===e.UNSIGNED_BYTE&&(s=t===p?e.SRGB8_ALPHA8:e.RGBA8),r===e.UNSIGNED_SHORT_4_4_4_4&&(s=e.RGBA4),r===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 C(t,n){let i;return t?null===n||n===Ue||n===Pt?i=e.DEPTH24_STENCIL8:n===M?i=e.DEPTH32F_STENCIL8:n===Lt&&(i=e.DEPTH24_STENCIL8,v("DepthTexture: 16 bit depth attachment is not supported with stencil. Using 24-bit attachment.")):null===n||n===Ue||n===Pt?i=e.DEPTH_COMPONENT24:n===M?i=e.DEPTH_COMPONENT32F:n===Lt&&(i=e.DEPTH_COMPONENT16),i}function P(e,t){return!0===x(e)||e.isFramebufferTexture&&e.minFilter!==Pe&&e.minFilter!==F?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=r.get(e);if(void 0===t.__webglInit)return;const n=e.source,i=h.get(n);if(i){const r=i[t.__cacheKey];r.usedTimes--,0===r.usedTimes&&w(e),0===Object.keys(i).length&&h.delete(n)}r.remove(e)}(t),t.isVideoTexture&&u.delete(t)}function U(t){const n=t.target;n.removeEventListener("dispose",U),function(t){const n=r.get(t);t.depthTexture&&(t.depthTexture.dispose(),r.remove(t.depthTexture));if(t.isWebGLCubeRenderTarget)for(let t=0;t<6;t++){if(Array.isArray(n.__webglFramebuffer[t]))for(let i=0;i0&&a.__version!==t.version){const e=t.image;if(null===e)v("WebGLRenderer: Texture marked for update but no image data found.");else{if(!1!==e.complete)return void z(a,t,n);v("WebGLRenderer: Texture marked for update but image is incomplete")}}else t.isExternalTexture&&(a.__webglTexture=t.sourceTexture?t.sourceTexture:null);i.bindTexture(e.TEXTURE_2D,a.__webglTexture,e.TEXTURE0+n)}const O={[ht]:e.REPEAT,[mt]:e.CLAMP_TO_EDGE,[pt]:e.MIRRORED_REPEAT},G={[Pe]:e.NEAREST,[vt]:e.NEAREST_MIPMAP_NEAREST,[gt]:e.NEAREST_MIPMAP_LINEAR,[F]:e.LINEAR,[_t]:e.LINEAR_MIPMAP_NEAREST,[B]:e.LINEAR_MIPMAP_LINEAR},H={[At]:e.NEVER,[xt]:e.ALWAYS,[Tt]:e.LESS,[re]:e.LEQUAL,[Mt]:e.EQUAL,[ie]:e.GEQUAL,[St]:e.GREATER,[Et]:e.NOTEQUAL};function V(t,i){if(i.type!==M||!1!==n.has("OES_texture_float_linear")||i.magFilter!==F&&i.magFilter!==_t&&i.magFilter!==gt&&i.magFilter!==B&&i.minFilter!==F&&i.minFilter!==_t&&i.minFilter!==gt&&i.minFilter!==B||v("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,O[i.wrapS]),e.texParameteri(t,e.TEXTURE_WRAP_T,O[i.wrapT]),t!==e.TEXTURE_3D&&t!==e.TEXTURE_2D_ARRAY||e.texParameteri(t,e.TEXTURE_WRAP_R,O[i.wrapR]),e.texParameteri(t,e.TEXTURE_MAG_FILTER,G[i.magFilter]),e.texParameteri(t,e.TEXTURE_MIN_FILTER,G[i.minFilter]),i.compareFunction&&(e.texParameteri(t,e.TEXTURE_COMPARE_MODE,e.COMPARE_REF_TO_TEXTURE),e.texParameteri(t,e.TEXTURE_COMPARE_FUNC,H[i.compareFunction])),!0===n.has("EXT_texture_filter_anisotropic")){if(i.magFilter===Pe)return;if(i.minFilter!==gt&&i.minFilter!==B)return;if(i.type===M&&!1===n.has("OES_texture_float_linear"))return;if(i.anisotropy>1||r.get(i).__currentAnisotropy){const o=n.get("EXT_texture_filter_anisotropic");e.texParameterf(t,o.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(i.anisotropy,a.getMaxAnisotropy())),r.get(i).__currentAnisotropy=i.anisotropy}}}function W(t,n){let i=!1;void 0===t.__webglInit&&(t.__webglInit=!0,n.addEventListener("dispose",L));const r=n.source;let a=h.get(r);void 0===a&&(a={},h.set(r,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++,i=!0),a[o].usedTimes++;const r=a[t.__cacheKey];void 0!==r&&(a[t.__cacheKey].usedTimes--,0===r.usedTimes&&w(n)),t.__cacheKey=o,t.__webglTexture=a[o].texture}return i}function k(e,t,n){return Math.floor(Math.floor(e/n)/t)}function z(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=W(t,n),d=n.source;i.bindTexture(l,t.__webglTexture,e.TEXTURE0+s);const u=r.get(d);if(d.version!==u.__version||!0===c){i.activeTexture(e.TEXTURE0+s);if(!1===("undefined"!=typeof ImageBitmap&&n.image instanceof ImageBitmap)){const t=f.getPrimaries(f.workingColorSpace),i=n.colorSpace===Rt?null:f.getPrimaries(n.colorSpace),r=n.colorSpace===Rt||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_COLORSPACE_CONVERSION_WEBGL,r)}e.pixelStorei(e.UNPACK_ALIGNMENT,n.unpackAlignment);let t=E(n.image,!1,a.maxTextureSize);t=J(n,t);const r=o.convert(n.format,n.colorSpace),p=o.convert(n.type);let m,h=b(n.internalFormat,r,p,n.colorSpace,n.isVideoTexture);V(l,n);const _=n.mipmaps,g=!0!==n.isVideoTexture,S=void 0===u.__version||!0===c,M=d.dataReady,R=P(n,t);if(n.isDepthTexture)h=C(n.format===bt,n.type),S&&(g?i.texStorage2D(e.TEXTURE_2D,1,h,t.width,t.height):i.texImage2D(e.TEXTURE_2D,0,h,t.width,t.height,0,r,p,null));else if(n.isDataTexture)if(_.length>0){g&&S&&i.texStorage2D(e.TEXTURE_2D,R,h,_[0].width,_[0].height);for(let t=0,n=_.length;te.start-t.start);let s=0;for(let e=1;e0){const t=Ct(m.width,m.height,n.format,n.type);for(const o of n.layerUpdates){const n=m.data.subarray(o*t/m.data.BYTES_PER_ELEMENT,(o+1)*t/m.data.BYTES_PER_ELEMENT);i.compressedTexSubImage3D(e.TEXTURE_2D_ARRAY,a,0,0,o,m.width,m.height,1,r,n)}n.clearLayerUpdates()}else i.compressedTexSubImage3D(e.TEXTURE_2D_ARRAY,a,0,0,0,m.width,m.height,t.depth,r,m.data)}else i.compressedTexImage3D(e.TEXTURE_2D_ARRAY,a,h,m.width,m.height,t.depth,0,m.data,0,0);else v("WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()");else g?M&&i.texSubImage3D(e.TEXTURE_2D_ARRAY,a,0,0,0,m.width,m.height,t.depth,r,p,m.data):i.texImage3D(e.TEXTURE_2D_ARRAY,a,h,m.width,m.height,t.depth,0,r,p,m.data)}else{g&&S&&i.texStorage2D(e.TEXTURE_2D,R,h,_[0].width,_[0].height);for(let t=0,a=_.length;t0){const a=Ct(t.width,t.height,n.format,n.type);for(const o of n.layerUpdates){const n=t.data.subarray(o*a/t.data.BYTES_PER_ELEMENT,(o+1)*a/t.data.BYTES_PER_ELEMENT);i.texSubImage3D(e.TEXTURE_2D_ARRAY,0,0,0,o,t.width,t.height,1,r,p,n)}n.clearLayerUpdates()}else i.texSubImage3D(e.TEXTURE_2D_ARRAY,0,0,0,0,t.width,t.height,t.depth,r,p,t.data)}else i.texImage3D(e.TEXTURE_2D_ARRAY,0,h,t.width,t.height,t.depth,0,r,p,t.data);else if(n.isData3DTexture)g?(S&&i.texStorage3D(e.TEXTURE_3D,R,h,t.width,t.height,t.depth),M&&i.texSubImage3D(e.TEXTURE_3D,0,0,0,0,t.width,t.height,t.depth,r,p,t.data)):i.texImage3D(e.TEXTURE_3D,0,h,t.width,t.height,t.depth,0,r,p,t.data);else if(n.isFramebufferTexture){if(S)if(g)i.texStorage2D(e.TEXTURE_2D,R,h,t.width,t.height);else{let n=t.width,a=t.height;for(let t=0;t>=1,a>>=1}}else if(_.length>0){if(g&&S){const t=ee(_[0]);i.texStorage2D(e.TEXTURE_2D,R,h,t.width,t.height)}for(let t=0,n=_.length;t>d),r=Math.max(1,n.height>>d);c===e.TEXTURE_3D||c===e.TEXTURE_2D_ARRAY?i.texImage3D(c,d,p,t,r,n.depth,0,u,f,null):i.texImage2D(c,d,p,t,r,0,u,f,null)}i.bindFramebuffer(e.FRAMEBUFFER,t),Q(n)?l.framebufferTexture2DMultisampleEXT(e.FRAMEBUFFER,s,c,h.__webglTexture,0,$(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),i.bindFramebuffer(e.FRAMEBUFFER,null)}function Y(t,n,i){if(e.bindRenderbuffer(e.RENDERBUFFER,t),n.depthBuffer){const r=n.depthTexture,a=r&&r.isDepthTexture?r.type:null,o=C(n.stencilBuffer,a),s=n.stencilBuffer?e.DEPTH_STENCIL_ATTACHMENT:e.DEPTH_ATTACHMENT;Q(n)?l.renderbufferStorageMultisampleEXT(e.RENDERBUFFER,$(n),o,n.width,n.height):i?e.renderbufferStorageMultisample(e.RENDERBUFFER,$(n),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 r=0;r{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)for(let e=0;e<6;e++)K(n.__webglFramebuffer[e],t,e);else{const e=t.texture.mipmaps;e&&e.length>0?K(n.__webglFramebuffer[0],t,0):K(n.__webglFramebuffer,t,0)}else if(a){n.__webglDepthbuffer=[];for(let r=0;r<6;r++)if(i.bindFramebuffer(e.FRAMEBUFFER,n.__webglFramebuffer[r]),void 0===n.__webglDepthbuffer[r])n.__webglDepthbuffer[r]=e.createRenderbuffer(),Y(n.__webglDepthbuffer[r],t,!1);else{const i=t.stencilBuffer?e.DEPTH_STENCIL_ATTACHMENT:e.DEPTH_ATTACHMENT,a=n.__webglDepthbuffer[r];e.bindRenderbuffer(e.RENDERBUFFER,a),e.framebufferRenderbuffer(e.FRAMEBUFFER,i,e.RENDERBUFFER,a)}}else{const r=t.texture.mipmaps;if(r&&r.length>0?i.bindFramebuffer(e.FRAMEBUFFER,n.__webglFramebuffer[0]):i.bindFramebuffer(e.FRAMEBUFFER,n.__webglFramebuffer),void 0===n.__webglDepthbuffer)n.__webglDepthbuffer=e.createRenderbuffer(),Y(n.__webglDepthbuffer,t,!1);else{const i=t.stencilBuffer?e.DEPTH_STENCIL_ATTACHMENT:e.DEPTH_ATTACHMENT,r=n.__webglDepthbuffer;e.bindRenderbuffer(e.RENDERBUFFER,r),e.framebufferRenderbuffer(e.FRAMEBUFFER,i,e.RENDERBUFFER,r)}}i.bindFramebuffer(e.FRAMEBUFFER,null)}const j=[],Z=[];function $(e){return Math.min(a.maxSamples,e.samples)}function Q(e){const t=r.get(e);return e.samples>0&&!0===n.has("WEBGL_multisampled_render_to_texture")&&!1!==t.__useRenderToTexture}function J(e,t){const n=e.colorSpace,i=e.format,r=e.type;return!0===e.isCompressedTexture||!0===e.isVideoTexture||n!==y&&n!==Rt&&(f.getTransfer(n)===p?i===T&&r===S||v("WebGLTextures: sRGB encoded textures have to use RGBAFormat and UnsignedByteType."):D("WebGLTextures: Unsupported texture color space:",n)),t}function ee(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=I;return e>=a.maxTextures&&v("WebGLTextures: Trying to use "+e+" texture units while this GPU supports only "+a.maxTextures),I+=1,e},this.resetTextureUnits=function(){I=0},this.setTexture2D=N,this.setTexture2DArray=function(t,n){const a=r.get(t);!1===t.isRenderTargetTexture&&t.version>0&&a.__version!==t.version?z(a,t,n):(t.isExternalTexture&&(a.__webglTexture=t.sourceTexture?t.sourceTexture:null),i.bindTexture(e.TEXTURE_2D_ARRAY,a.__webglTexture,e.TEXTURE0+n))},this.setTexture3D=function(t,n){const a=r.get(t);!1===t.isRenderTargetTexture&&t.version>0&&a.__version!==t.version?z(a,t,n):i.bindTexture(e.TEXTURE_3D,a.__webglTexture,e.TEXTURE0+n)},this.setTextureCube=function(t,n){const s=r.get(t);!0!==t.isCubeDepthTexture&&t.version>0&&s.__version!==t.version?function(t,n,s){if(6!==n.image.length)return;const l=W(t,n),c=n.source;i.bindTexture(e.TEXTURE_CUBE_MAP,t.__webglTexture,e.TEXTURE0+s);const d=r.get(c);if(c.version!==d.__version||!0===l){i.activeTexture(e.TEXTURE0+s);const t=f.getPrimaries(f.workingColorSpace),r=n.colorSpace===Rt?null:f.getPrimaries(n.colorSpace),u=n.colorSpace===Rt||t===r?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 p=n.isCompressedTexture||n.image[0].isCompressedTexture,m=n.image[0]&&n.image[0].isDataTexture,h=[];for(let e=0;e<6;e++)h[e]=p||m?m?n.image[e].image:n.image[e]:E(n.image[e],!0,a.maxCubemapSize),h[e]=J(n,h[e]);const _=h[0],g=o.convert(n.format,n.colorSpace),S=o.convert(n.type),M=b(n.internalFormat,g,S,n.colorSpace),R=!0!==n.isVideoTexture,C=void 0===d.__version||!0===l,L=c.dataReady;let U,D=P(n,_);if(V(e.TEXTURE_CUBE_MAP,n),p){R&&C&&i.texStorage2D(e.TEXTURE_CUBE_MAP,D,M,_.width,_.height);for(let t=0;t<6;t++){U=h[t].mipmaps;for(let r=0;r0&&D++;const t=ee(h[0]);i.texStorage2D(e.TEXTURE_CUBE_MAP,D,M,t.width,t.height)}for(let t=0;t<6;t++)if(m){R?L&&i.texSubImage2D(e.TEXTURE_CUBE_MAP_POSITIVE_X+t,0,0,0,h[t].width,h[t].height,g,S,h[t].data):i.texImage2D(e.TEXTURE_CUBE_MAP_POSITIVE_X+t,0,M,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 i=0;i0){a.__webglFramebuffer=[];for(let t=0;t0&&!1===Q(t)){a.__webglMultisampledFramebuffer=e.createFramebuffer(),a.__webglColorRenderbuffer=[],i.bindFramebuffer(e.FRAMEBUFFER,a.__webglMultisampledFramebuffer);for(let n=0;n0)for(let r=0;r0)for(let i=0;i0)if(!1===Q(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=r.get(t),u=n.length>1;if(u)for(let t=0;t0?i.bindFramebuffer(e.DRAW_FRAMEBUFFER,d.__webglFramebuffer[0]):i.bindFramebuffer(e.DRAW_FRAMEBUFFER,d.__webglFramebuffer);for(let i=0;i= 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 m(20,20),n)}return this.mesh}reset(){this.texture=null,this.mesh=null}getDepthTexture(){return this.texture}}class Ma extends Rn{constructor(e,n){super();const i=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 _="undefined"!=typeof XRWebGLBinding,g=new Sa,E={},M=n.getContextAttributes();let x=null,A=null;const R=[],b=[],C=new t;let L=null;const U=new P;U.viewport=new X;const D=new P;D.viewport=new X;const w=[U,D],N=new bn;let y=null,F=null;function O(e){const t=b.indexOf(e.inputSource);if(-1===t)return;const n=R[t];void 0!==n&&(n.update(e.inputSource,e.frame,d||s),n.dispatchEvent({type:e.type,data:e.inputSource}))}function B(){a.removeEventListener("select",O),a.removeEventListener("selectstart",O),a.removeEventListener("selectend",O),a.removeEventListener("squeeze",O),a.removeEventListener("squeezestart",O),a.removeEventListener("squeezeend",O),a.removeEventListener("end",B),a.removeEventListener("inputsourceschange",G);for(let e=0;e=0&&(b[i]=null,R[i].disconnect(n))}for(let t=0;t=b.length){b.push(n),i=e;break}if(null===b[e]){b[e]=n,i=e;break}}if(-1===i)break}const r=R[i];r&&r.connect(n)}}this.cameraAutoUpdate=!0,this.enabled=!1,this.isPresenting=!1,this.getController=function(e){let t=R[e];return void 0===t&&(t=new Cn,R[e]=t),t.getTargetRaySpace()},this.getControllerGrip=function(e){let t=R[e];return void 0===t&&(t=new Cn,R[e]=t),t.getGripSpace()},this.getHand=function(e){let t=R[e];return void 0===t&&(t=new Cn,R[e]=t),t.getHandSpace()},this.setFramebufferScaleFactor=function(e){o=e,!0===i.isPresenting&&v("WebXRManager: Cannot change framebuffer scale while presenting.")},this.setReferenceSpaceType=function(e){l=e,!0===i.isPresenting&&v("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 null===f&&_&&(f=new XRWebGLBinding(a,n)),f},this.getFrame=function(){return h},this.getSession=function(){return a},this.setSession=async function(t){if(a=t,null!==a){x=e.getRenderTarget(),a.addEventListener("select",O),a.addEventListener("selectstart",O),a.addEventListener("selectend",O),a.addEventListener("squeeze",O),a.addEventListener("squeezestart",O),a.addEventListener("squeezeend",O),a.addEventListener("end",B),a.addEventListener("inputsourceschange",G),!0!==M.xrCompatible&&await n.makeXRCompatible(),L=e.getPixelRatio(),e.getSize(C);if(_&&"createProjectionLayer"in XRWebGLBinding.prototype){let t=null,i=null,r=null;M.depth&&(r=M.stencil?n.DEPTH24_STENCIL8:n.DEPTH_COMPONENT24,t=M.stencil?bt:Ce,i=M.stencil?Pt:Ue);const s={colorFormat:n.RGBA8,depthFormat:r,scaleFactor:o};f=this.getBinding(),p=f.createProjectionLayer(s),a.updateRenderState({layers:[p]}),e.setPixelRatio(1),e.setSize(p.textureWidth,p.textureHeight,!1),A=new I(p.textureWidth,p.textureHeight,{format:T,type:S,depthTexture:new ae(p.textureWidth,p.textureHeight,i,void 0,void 0,void 0,void 0,void 0,void 0,t),stencilBuffer:M.stencil,colorSpace:e.outputColorSpace,samples:M.antialias?4:0,resolveDepthBuffer:!1===p.ignoreDepthValues,resolveStencilBuffer:!1===p.ignoreDepthValues})}else{const t={antialias:M.antialias,alpha:!0,depth:M.depth,stencil:M.stencil,framebufferScaleFactor:o};m=new XRWebGLLayer(a,n,t),a.updateRenderState({baseLayer:m}),e.setPixelRatio(1),e.setSize(m.framebufferWidth,m.framebufferHeight,!1),A=new I(m.framebufferWidth,m.framebufferHeight,{format:T,type:S,colorSpace:e.outputColorSpace,stencilBuffer:M.stencil,resolveDepthBuffer:!1===m.ignoreDepthValues,resolveStencilBuffer:!1===m.ignoreDepthValues})}A.isXRRenderTarget=!0,this.setFoveation(c),d=null,s=await a.requestReferenceSpace(l),z.setContext(a),z.start(),i.isPresenting=!0,i.dispatchEvent({type:"sessionstart"})}},this.getEnvironmentBlendMode=function(){if(null!==a)return a.environmentBlendMode},this.getDepthTexture=function(){return g.getDepthTexture()};const H=new r,V=new r;function W(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!==g.texture&&(g.depthNear>0&&(t=g.depthNear),g.depthFar>0&&(n=g.depthFar)),N.near=D.near=U.near=t,N.far=D.far=U.far=n,y===N.near&&F===N.far||(a.updateRenderState({depthNear:N.near,depthFar:N.far}),y=N.near,F=N.far),N.layers.mask=6|e.layers.mask,U.layers.mask=-5&N.layers.mask,D.layers.mask=-3&N.layers.mask;const i=e.parent,r=N.cameras;W(N,i);for(let e=0;e0&&(e.alphaTest.value=i.alphaTest);const r=t.get(i),a=r.envMap,o=r.envMapRotation;a&&(e.envMap.value=a,e.envMapRotation.value.setFromMatrix4(Ta.makeRotationFromEuler(o)).transpose(),a.isCubeTexture&&!1===a.isRenderTargetTexture&&e.envMapRotation.value.premultiply(xa),e.reflectivity.value=i.reflectivity,e.ior.value=i.ior,e.refractionRatio.value=i.refractionRatio),i.lightMap&&(e.lightMap.value=i.lightMap,e.lightMapIntensity.value=i.lightMapIntensity,n(i.lightMap,e.lightMapTransform)),i.aoMap&&(e.aoMap.value=i.aoMap,e.aoMapIntensity.value=i.aoMapIntensity,n(i.aoMap,e.aoMapTransform))}return{refreshFogUniforms:function(t,n){n.color.getRGB(t.fogColor.value,_(e)),n.isFog?(t.fogNear.value=n.near,t.fogFar.value=n.far):n.isFogExp2&&(t.fogDensity.value=n.density)},refreshMaterialUniforms:function(e,r,a,o,s){r.isMeshBasicMaterial?i(e,r):r.isMeshLambertMaterial?(i(e,r),r.envMap&&(e.envMapIntensity.value=r.envMapIntensity)):r.isMeshToonMaterial?(i(e,r),function(e,t){t.gradientMap&&(e.gradientMap.value=t.gradientMap)}(e,r)):r.isMeshPhongMaterial?(i(e,r),function(e,t){e.specular.value.copy(t.specular),e.shininess.value=Math.max(t.shininess,1e-4)}(e,r),r.envMap&&(e.envMapIntensity.value=r.envMapIntensity)):r.isMeshStandardMaterial?(i(e,r),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,r),r.isMeshPhysicalMaterial&&function(e,t,i){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=i.texture,e.transmissionSamplerSize.value.set(i.width,i.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,r,s)):r.isMeshMatcapMaterial?(i(e,r),function(e,t){t.matcap&&(e.matcap.value=t.matcap)}(e,r)):r.isMeshDepthMaterial?i(e,r):r.isMeshDistanceMaterial?(i(e,r),function(e,n){const i=t.get(n).light;e.referencePosition.value.setFromMatrixPosition(i.matrixWorld),e.nearDistance.value=i.shadow.camera.near,e.farDistance.value=i.shadow.camera.far}(e,r)):r.isMeshNormalMaterial?i(e,r):r.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,r),r.isLineDashedMaterial&&function(e,t){e.dashSize.value=t.dashSize,e.totalSize.value=t.dashSize+t.gapSize,e.scale.value=t.scale}(e,r)):r.isPointsMaterial?function(e,t,i,r){e.diffuse.value.copy(t.color),e.opacity.value=t.opacity,e.size.value=t.size*i,e.scale.value=.5*r,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,r,a,o):r.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,r):r.isShadowMaterial?(e.color.value.copy(r.color),e.opacity.value=r.opacity):r.isShaderMaterial&&(r.uniformsNeedUpdate=!1)}}}function Ra(e,t,n,i){let r={},a={},o=[];const s=e.getParameter(e.MAX_UNIFORM_BUFFER_BINDINGS);function l(e,t,n,i){const r=e.value,a=t+"_"+n;if(void 0===i[a])return i[a]="number"==typeof r||"boolean"==typeof r?r:r.clone(),!0;{const e=i[a];if("number"==typeof r||"boolean"==typeof r){if(e!==r)return i[a]=r,!0}else if(!1===e.equals(r))return e.copy(r),!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?v("WebGLRenderer: Texture samplers can not be part of an uniforms group."):v("WebGLRenderer: Unsupported uniform value type.",e),t}function d(t){const n=t.target;n.removeEventListener("dispose",d);const i=o.indexOf(n.__bindingPointIndex);o.splice(i,1),e.deleteBuffer(r[n.id]),delete r[n.id],delete a[n.id]}return{bind:function(e,t){const n=t.program;i.uniformBlockBinding(e,n)},update:function(n,u){let f=r[n.id];void 0===f&&(!function(e){const t=e.uniforms;let n=0;const i=16;for(let e=0,r=t.length;e0&&(n+=i-r);e.__size=n,e.__cache={}}(n),f=function(t){const n=function(){for(let e=0;e0),p=!!n.morphAttributes.position,m=!!n.morphAttributes.normal,h=!!n.morphAttributes.color;let _=L;i.toneMapped&&(null!==k&&!0!==k.isXRRenderTarget||(_=O.toneMapping));const g=n.morphAttributes.position||n.morphAttributes.normal||n.morphAttributes.color,v=void 0!==g?g.length:0,S=Me.get(i),M=U.state.lights;if(!0===se&&(!0===le||e!==Y)){const t=e===Y&&i.id===z;Ie.setState(i,e,t)}let T=!1;i.version===S.__version?S.needsLights&&S.lightsStateVersion!==M.state.version||S.outputColorSpace!==s||r.isBatchedMesh&&!1===S.batching?T=!0:r.isBatchedMesh||!0!==S.batching?r.isBatchedMesh&&!0===S.batchingColor&&null===r.colorTexture||r.isBatchedMesh&&!1===S.batchingColor&&null!==r.colorTexture||r.isInstancedMesh&&!1===S.instancing?T=!0:r.isInstancedMesh||!0!==S.instancing?r.isSkinnedMesh&&!1===S.skinning?T=!0:r.isSkinnedMesh||!0!==S.skinning?r.isInstancedMesh&&!0===S.instancingColor&&null===r.instanceColor||r.isInstancedMesh&&!1===S.instancingColor&&null!==r.instanceColor||r.isInstancedMesh&&!0===S.instancingMorph&&null===r.morphTexture||r.isInstancedMesh&&!1===S.instancingMorph&&null!==r.morphTexture||S.envMap!==c||!0===i.fog&&S.fog!==a?T=!0:void 0===S.numClippingPlanes||S.numClippingPlanes===Ie.numPlanes&&S.numIntersection===Ie.numIntersection?(S.vertexAlphas!==d||S.vertexTangents!==u||S.morphTargets!==p||S.morphNormals!==m||S.morphColors!==h||S.toneMapping!==_||S.morphTargetsCount!==v)&&(T=!0):T=!0:T=!0:T=!0:T=!0:(T=!0,S.__version=i.version);let x=S.currentProgram;!0===T&&(x=ot(i,t,r));let A=!1,R=!1,b=!1;const C=x.getUniforms(),P=S.uniforms;ve.useProgram(x.program)&&(A=!0,R=!0,b=!0);i.id!==z&&(z=i.id,R=!0);if(A||Y!==e){ve.buffers.depth.getReversed()&&!0!==e.reversedDepth&&(e._reversedDepth=!0,e.updateProjectionMatrix()),C.setValue(We,"projectionMatrix",e.projectionMatrix),C.setValue(We,"viewMatrix",e.matrixWorldInverse);const t=C.map.cameraPosition;void 0!==t&&t.setValue(We,de.setFromMatrixPosition(e.matrixWorld)),ge.logarithmicDepthBuffer&&C.setValue(We,"logDepthBufFC",2/(Math.log(e.far+1)/Math.LN2)),(i.isMeshPhongMaterial||i.isMeshToonMaterial||i.isMeshLambertMaterial||i.isMeshBasicMaterial||i.isMeshStandardMaterial||i.isShaderMaterial)&&C.setValue(We,"isOrthographic",!0===e.isOrthographicCamera),Y!==e&&(Y=e,R=!0,b=!0)}S.needsLights&&(M.state.directionalShadowMap.length>0&&C.setValue(We,"directionalShadowMap",M.state.directionalShadowMap,Te),M.state.spotShadowMap.length>0&&C.setValue(We,"spotShadowMap",M.state.spotShadowMap,Te),M.state.pointShadowMap.length>0&&C.setValue(We,"pointShadowMap",M.state.pointShadowMap,Te));if(r.isSkinnedMesh){C.setOptional(We,r,"bindMatrix"),C.setOptional(We,r,"bindMatrixInverse");const e=r.skeleton;e&&(null===e.boneTexture&&e.computeBoneTexture(),C.setValue(We,"boneTexture",e.boneTexture,Te))}r.isBatchedMesh&&(C.setOptional(We,r,"batchingTexture"),C.setValue(We,"batchingTexture",r._matricesTexture,Te),C.setOptional(We,r,"batchingIdTexture"),C.setValue(We,"batchingIdTexture",r._indirectTexture,Te),C.setOptional(We,r,"batchingColorTexture"),null!==r._colorsTexture&&C.setValue(We,"batchingColorTexture",r._colorsTexture,Te));const D=n.morphAttributes;void 0===D.position&&void 0===D.normal&&void 0===D.color||Fe.update(r,n,x);(R||S.receiveShadow!==r.receiveShadow)&&(S.receiveShadow=r.receiveShadow,C.setValue(We,"receiveShadow",r.receiveShadow));(i.isMeshStandardMaterial||i.isMeshLambertMaterial||i.isMeshPhongMaterial)&&null===i.envMap&&null!==t.environment&&(P.envMapIntensity.value=t.environmentIntensity);void 0!==P.dfgLUT&&(P.dfgLUT.value=(null===Ca&&(Ca=new Ln(ba,16,16,Se,E),Ca.name="DFG_LUT",Ca.minFilter=F,Ca.magFilter=F,Ca.wrapS=mt,Ca.wrapT=mt,Ca.generateMipmaps=!1,Ca.needsUpdate=!0),Ca));R&&(C.setValue(We,"toneMappingExposure",O.toneMappingExposure),S.needsLights&&(I=b,(w=P).ambientLightColor.needsUpdate=I,w.lightProbe.needsUpdate=I,w.directionalLights.needsUpdate=I,w.directionalLightShadows.needsUpdate=I,w.pointLights.needsUpdate=I,w.pointLightShadows.needsUpdate=I,w.spotLights.needsUpdate=I,w.spotLightShadows.needsUpdate=I,w.rectAreaLights.needsUpdate=I,w.hemisphereLights.needsUpdate=I),a&&!0===i.fog&&Le.refreshFogUniforms(P,a),Le.refreshMaterialUniforms(P,i,ee,J,U.state.transmissionRenderTarget[e.id]),Ar.upload(We,st(S),P,Te));var w,I;i.isShaderMaterial&&!0===i.uniformsNeedUpdate&&(Ar.upload(We,st(S),P,Te),i.uniformsNeedUpdate=!1);i.isSpriteMaterial&&C.setValue(We,"center",r.center);if(C.setValue(We,"modelViewMatrix",r.modelViewMatrix),C.setValue(We,"normalMatrix",r.normalMatrix),C.setValue(We,"modelMatrix",r.matrixWorld),i.isShaderMaterial||i.isRawShaderMaterial){const e=i.uniformsGroups;for(let t=0,n=e.length;t{function n(){i.forEach(function(e){Me.get(e).currentProgram.isReady()&&i.delete(e)}),0!==i.size?setTimeout(n,10):t(e)}null!==_e.get("KHR_parallel_shader_compile")?n():setTimeout(n,10)})};let $e=null;function Qe(){et.stop()}function Je(){et.start()}const et=new Fn;function tt(e,t,n,i){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)U.pushLight(e),e.castShadow&&U.pushShadow(e);else if(e.isSprite){if(!e.frustumCulled||oe.intersectsSprite(e)){i&&ue.setFromMatrixPosition(e.matrixWorld).applyMatrix4(ce);const t=Ce.update(e),r=e.material;r.visible&&P.push(e,t,r,n,ue.z,null)}}else if((e.isMesh||e.isLine||e.isPoints)&&(!e.frustumCulled||oe.intersectsObject(e))){const t=Ce.update(e),r=e.material;if(i&&(void 0!==e.boundingSphere?(null===e.boundingSphere&&e.computeBoundingSphere(),ue.copy(e.boundingSphere.center)):(null===t.boundingSphere&&t.computeBoundingSphere(),ue.copy(t.boundingSphere.center)),ue.applyMatrix4(e.matrixWorld).applyMatrix4(ce)),Array.isArray(r)){const i=t.groups;for(let a=0,o=i.length;a0&&rt(r,t,n),a.length>0&&rt(a,t,n),o.length>0&&rt(o,t,n),ve.buffers.depth.setTest(!0),ve.buffers.depth.setMask(!0),ve.buffers.color.setMask(!0),ve.setPolygonOffset(!1)}function it(e,t,n,i){if(null!==(!0===n.isScene?n.overrideMaterial:null))return;if(void 0===U.state.transmissionRenderTarget[i.id]){const e=_e.has("EXT_color_buffer_half_float")||_e.has("EXT_color_buffer_float");U.state.transmissionRenderTarget[i.id]=new I(1,1,{generateMipmaps:!0,type:e?E:S,minFilter:B,samples:Math.max(4,ge.samples),stencilBuffer:o,resolveDepthBuffer:!1,resolveStencilBuffer:!1,colorSpace:f.workingColorSpace})}const r=U.state.transmissionRenderTarget[i.id],a=i.viewport||K;r.setSize(a.z*O.transmissionResolutionScale,a.w*O.transmissionResolutionScale);const s=O.getRenderTarget(),l=O.getActiveCubeFace(),d=O.getActiveMipmapLevel();O.setRenderTarget(r),O.getClearColor(Z),$=O.getClearAlpha(),$<1&&O.setClearColor(16777215,.5),O.clear(),pe&&ye.render(n);const u=O.toneMapping;O.toneMapping=L;const p=i.viewport;if(void 0!==i.viewport&&(i.viewport=void 0),U.setupLightsView(i),!0===se&&Ie.setGlobalState(O.clippingPlanes,i),rt(e,n,i),Te.updateMultisampleRenderTarget(r),Te.updateRenderTargetMipmap(r),!1===_e.has("WEBGL_multisampled_render_to_texture")){let e=!1;for(let r=0,a=t.length;r0)for(let t=0,a=r.length;t0&&it(n,i,e,t),pe&&ye.render(e),nt(P,e,t)}null!==k&&0===V&&(Te.updateMultisampleRenderTarget(k),Te.updateRenderTargetMipmap(k)),i&&y.end(O),!0===e.isScene&&e.onAfterRender(O,e,t),He.resetDefaultState(),z=-1,Y=null,N.pop(),N.length>0?(U=N[N.length-1],!0===se&&Ie.setGlobalState(O.clippingPlanes,U.state.camera)):U=null,w.pop(),P=w.length>0?w[w.length-1]:null},this.getActiveCubeFace=function(){return H},this.getActiveMipmapLevel=function(){return V},this.getRenderTarget=function(){return k},this.setRenderTargetTextures=function(e,t,n){const i=Me.get(e);i.__autoAllocateDepthBuffer=!1===e.resolveDepthBuffer,!1===i.__autoAllocateDepthBuffer&&(i.__useRenderToTexture=!1),Me.get(e.texture).__webglTexture=t,Me.get(e.depthTexture).__webglTexture=i.__autoAllocateDepthBuffer?void 0:n,i.__hasExternalTextures=!0},this.setRenderTargetFramebuffer=function(e,t){const n=Me.get(e);n.__webglFramebuffer=t,n.__useDefaultFramebuffer=void 0===t};const ct=We.createFramebuffer();this.setRenderTarget=function(e,t=0,n=0){k=e,H=t,V=n;let i=null,r=!1,a=!1;if(e){const o=Me.get(e);if(void 0!==o.__useDefaultFramebuffer)return ve.bindFramebuffer(We.FRAMEBUFFER,o.__webglFramebuffer),K.copy(e.viewport),q.copy(e.scissor),j=e.scissorTest,ve.viewport(K),ve.scissor(q),ve.setScissorTest(j),void(z=-1);if(void 0===o.__webglFramebuffer)Te.setupRenderTarget(e);else if(o.__hasExternalTextures)Te.rebindTextures(e,Me.get(e.texture).__webglTexture,Me.get(e.depthTexture).__webglTexture);else if(e.depthBuffer){const t=e.depthTexture;if(o.__boundDepthTexture!==t){if(null!==t&&Me.has(t)&&(e.width!==t.image.width||e.height!==t.image.height))throw new Error("WebGLRenderTarget: Attached DepthTexture is initialized to the incorrect size.");Te.setupDepthRenderbuffer(e)}}const s=e.texture;(s.isData3DTexture||s.isDataArrayTexture||s.isCompressedArrayTexture)&&(a=!0);const l=Me.get(e).__webglFramebuffer;e.isWebGLCubeRenderTarget?(i=Array.isArray(l[t])?l[t][n]:l[t],r=!0):i=e.samples>0&&!1===Te.useMultisampledRTT(e)?Me.get(e).__webglMultisampledFramebuffer:Array.isArray(l)?l[n]:l,K.copy(e.viewport),q.copy(e.scissor),j=e.scissorTest}else K.copy(ie).multiplyScalar(ee).floor(),q.copy(re).multiplyScalar(ee).floor(),j=ae;0!==n&&(i=ct);if(ve.bindFramebuffer(We.FRAMEBUFFER,i)&&ve.drawBuffers(e,i),ve.viewport(K),ve.scissor(q),ve.setScissorTest(j),r){const i=Me.get(e.texture);We.framebufferTexture2D(We.FRAMEBUFFER,We.COLOR_ATTACHMENT0,We.TEXTURE_CUBE_MAP_POSITIVE_X+t,i.__webglTexture,n)}else if(a){const i=t;for(let t=0;t1&&We.readBuffer(We.COLOR_ATTACHMENT0+s),!ge.textureFormatReadable(l))return void D("WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.");if(!ge.textureTypeReadable(c))return void D("WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.");t>=0&&t<=e.width-i&&n>=0&&n<=e.height-r&&We.readPixels(t,n,i,r,Ge.convert(l),Ge.convert(c),a)}finally{const e=null!==k?Me.get(k).__webglFramebuffer:null;ve.bindFramebuffer(We.FRAMEBUFFER,e)}}},this.readRenderTargetPixelsAsync=async function(e,t,n,i,r,a,o,s=0){if(!e||!e.isWebGLRenderTarget)throw new Error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.");let l=Me.get(e).__webglFramebuffer;if(e.isWebGLCubeRenderTarget&&void 0!==o&&(l=l[o]),l){if(t>=0&&t<=e.width-i&&n>=0&&n<=e.height-r){ve.bindFramebuffer(We.FRAMEBUFFER,l);const o=e.textures[s],c=o.format,d=o.type;if(e.textures.length>1&&We.readBuffer(We.COLOR_ATTACHMENT0+s),!ge.textureFormatReadable(c))throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: renderTarget is not in RGBA or implementation defined format.");if(!ge.textureTypeReadable(d))throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: renderTarget is not in UnsignedByteType or implementation defined type.");const u=We.createBuffer();We.bindBuffer(We.PIXEL_PACK_BUFFER,u),We.bufferData(We.PIXEL_PACK_BUFFER,a.byteLength,We.STREAM_READ),We.readPixels(t,n,i,r,Ge.convert(c),Ge.convert(d),0);const f=null!==k?Me.get(k).__webglFramebuffer:null;ve.bindFramebuffer(We.FRAMEBUFFER,f);const p=We.fenceSync(We.SYNC_GPU_COMMANDS_COMPLETE,0);return We.flush(),await yn(We,p,4),We.bindBuffer(We.PIXEL_PACK_BUFFER,u),We.getBufferSubData(We.PIXEL_PACK_BUFFER,0,a),We.deleteBuffer(u),We.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 i=Math.pow(2,-n),r=Math.floor(e.image.width*i),a=Math.floor(e.image.height*i),o=null!==t?t.x:0,s=null!==t?t.y:0;Te.setTexture2D(e,0),We.copyTexSubImage2D(We.TEXTURE_2D,n,0,0,o,s,r,a),ve.unbindTexture()};const dt=We.createFramebuffer(),ut=We.createFramebuffer();this.copyTextureToTexture=function(e,t,n=null,i=null,r=0,a=0){let o,s,l,c,d,u,f,p,m;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,-r);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!==i?(f=i.x,p=i.y,m=i.z):(f=0,p=0,m=0);const _=Ge.convert(t.format),g=Ge.convert(t.type);let v;t.isData3DTexture?(Te.setTexture3D(t,0),v=We.TEXTURE_3D):t.isDataArrayTexture||t.isCompressedArrayTexture?(Te.setTexture2DArray(t,0),v=We.TEXTURE_2D_ARRAY):(Te.setTexture2D(t,0),v=We.TEXTURE_2D),We.pixelStorei(We.UNPACK_FLIP_Y_WEBGL,t.flipY),We.pixelStorei(We.UNPACK_PREMULTIPLY_ALPHA_WEBGL,t.premultiplyAlpha),We.pixelStorei(We.UNPACK_ALIGNMENT,t.unpackAlignment);const E=We.getParameter(We.UNPACK_ROW_LENGTH),S=We.getParameter(We.UNPACK_IMAGE_HEIGHT),M=We.getParameter(We.UNPACK_SKIP_PIXELS),T=We.getParameter(We.UNPACK_SKIP_ROWS),x=We.getParameter(We.UNPACK_SKIP_IMAGES);We.pixelStorei(We.UNPACK_ROW_LENGTH,h.width),We.pixelStorei(We.UNPACK_IMAGE_HEIGHT,h.height),We.pixelStorei(We.UNPACK_SKIP_PIXELS,c),We.pixelStorei(We.UNPACK_SKIP_ROWS,d),We.pixelStorei(We.UNPACK_SKIP_IMAGES,u);const A=e.isDataArrayTexture||e.isData3DTexture,R=t.isDataArrayTexture||t.isData3DTexture;if(e.isDepthTexture){const n=Me.get(e),i=Me.get(t),h=Me.get(n.__renderTarget),_=Me.get(i.__renderTarget);ve.bindFramebuffer(We.READ_FRAMEBUFFER,h.__webglFramebuffer),ve.bindFramebuffer(We.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 ) || defined( USE_COLOR_ALPHA )\n\tdiffuseColor *= vColor;\n#endif",color_pars_fragment:"#if defined( USE_COLOR ) || defined( USE_COLOR_ALPHA )\n\tvarying vec4 vColor;\n#endif",color_pars_vertex:"#if defined( USE_COLOR ) || defined( USE_COLOR_ALPHA ) || defined( USE_INSTANCING_COLOR ) || defined( USE_BATCHING_COLOR )\n\tvarying vec4 vColor;\n#endif",color_vertex:"#if defined( USE_COLOR ) || defined( USE_COLOR_ALPHA ) || defined( USE_INSTANCING_COLOR ) || defined( USE_BATCHING_COLOR )\n\tvColor = vec4( 1.0 );\n#endif\n#ifdef USE_COLOR_ALPHA\n\tvColor *= color;\n#elif defined( USE_COLOR )\n\tvColor.rgb *= color;\n#endif\n#ifdef USE_INSTANCING_COLOR\n\tvColor.rgb *= instanceColor.rgb;\n#endif\n#ifdef USE_BATCHING_COLOR\n\tvColor *= getBatchingColor( getIndirectIndex( gl_DrawID ) );\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}\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 * reflectVec );\n\t\t#ifdef ENVMAP_BLENDING_MULTIPLY\n\t\t\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\n\t\t#elif defined( ENVMAP_BLENDING_MIX )\n\t\t\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\n\t\t#elif defined( ENVMAP_BLENDING_ADD )\n\t\t\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\n\t\t#endif\n\t#endif\n#endif",envmap_common_pars_fragment:"#ifdef USE_ENVMAP\n\tuniform float envMapIntensity;\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#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, pow4( 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;\nmaterial.diffuseContribution = diffuseColor.rgb * ( 1.0 - metalnessFactor );\nmaterial.metalness = 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 = min( pow2( ( material.ior - 1.0 ) / ( material.ior + 1.0 ) ) * specularColorFactor, vec3( 1.0 ) ) * specularIntensityFactor;\n\tmaterial.specularColorBlended = mix( material.specularColor, diffuseColor.rgb, metalnessFactor );\n#else\n\tmaterial.specularColor = vec3( 0.04 );\n\tmaterial.specularColorBlended = mix( material.specularColor, 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.0001, 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:"uniform sampler2D dfgLUT;\nstruct PhysicalMaterial {\n\tvec3 diffuseColor;\n\tvec3 diffuseContribution;\n\tvec3 specularColor;\n\tvec3 specularColorBlended;\n\tfloat roughness;\n\tfloat metalness;\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\tvec3 iridescenceFresnelDielectric;\n\t\tvec3 iridescenceFresnelMetallic;\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 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.specularColorBlended;\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 * transpose( 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 rInv = 1.0 / ( roughness + 0.1 );\n\tfloat a = -1.9362 + 1.0678 * roughness + 0.4573 * r2 - 0.8469 * rInv;\n\tfloat b = -0.6014 + 0.5538 * roughness - 0.4670 * r2 - 0.1255 * rInv;\n\tfloat DG = exp( a * dotNV + b );\n\treturn saturate( DG );\n}\nvec3 EnvironmentBRDF( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness ) {\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tvec2 fab = texture2D( dfgLUT, vec2( roughness, dotNV ) ).rg;\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\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tvec2 fab = texture2D( dfgLUT, vec2( roughness, dotNV ) ).rg;\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}\nvec3 BRDF_GGX_Multiscatter( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material ) {\n\tvec3 singleScatter = BRDF_GGX( lightDir, viewDir, normal, material );\n\tfloat dotNL = saturate( dot( normal, lightDir ) );\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tvec2 dfgV = texture2D( dfgLUT, vec2( material.roughness, dotNV ) ).rg;\n\tvec2 dfgL = texture2D( dfgLUT, vec2( material.roughness, dotNL ) ).rg;\n\tvec3 FssEss_V = material.specularColorBlended * dfgV.x + material.specularF90 * dfgV.y;\n\tvec3 FssEss_L = material.specularColorBlended * dfgL.x + material.specularF90 * dfgL.y;\n\tfloat Ess_V = dfgV.x + dfgV.y;\n\tfloat Ess_L = dfgL.x + dfgL.y;\n\tfloat Ems_V = 1.0 - Ess_V;\n\tfloat Ems_L = 1.0 - Ess_L;\n\tvec3 Favg = material.specularColorBlended + ( 1.0 - material.specularColorBlended ) * 0.047619;\n\tvec3 Fms = FssEss_V * FssEss_L * Favg / ( 1.0 - Ems_V * Ems_L * Favg + EPSILON );\n\tfloat compensationFactor = Ems_V * Ems_L;\n\tvec3 multiScatter = Fms * compensationFactor;\n\treturn singleScatter + multiScatter;\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.specularColorBlended * t2.x + ( material.specularF90 - material.specularColorBlended ) * t2.y );\n\t\treflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\n\t\treflectedLight.directDiffuse += lightColor * material.diffuseContribution * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords );\n\t\t#ifdef USE_CLEARCOAT\n\t\t\tvec3 Ncc = geometryClearcoatNormal;\n\t\t\tvec2 uvClearcoat = LTC_Uv( Ncc, viewDir, material.clearcoatRoughness );\n\t\t\tvec4 t1Clearcoat = texture2D( ltc_1, uvClearcoat );\n\t\t\tvec4 t2Clearcoat = texture2D( ltc_2, uvClearcoat );\n\t\t\tmat3 mInvClearcoat = mat3(\n\t\t\t\tvec3( t1Clearcoat.x, 0, t1Clearcoat.y ),\n\t\t\t\tvec3( 0, 1, 0 ),\n\t\t\t\tvec3( t1Clearcoat.z, 0, t1Clearcoat.w )\n\t\t\t);\n\t\t\tvec3 fresnelClearcoat = material.clearcoatF0 * t2Clearcoat.x + ( material.clearcoatF90 - material.clearcoatF0 ) * t2Clearcoat.y;\n\t\t\tclearcoatSpecularDirect += lightColor * fresnelClearcoat * LTC_Evaluate( Ncc, viewDir, position, mInvClearcoat, rectCoords );\n\t\t#endif\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 \n \t\tsheenSpecularDirect += irradiance * BRDF_Sheen( directLight.direction, geometryViewDir, geometryNormal, material.sheenColor, material.sheenRoughness );\n \n \t\tfloat sheenAlbedoV = IBLSheenBRDF( geometryNormal, geometryViewDir, material.sheenRoughness );\n \t\tfloat sheenAlbedoL = IBLSheenBRDF( geometryNormal, directLight.direction, material.sheenRoughness );\n \n \t\tfloat sheenEnergyComp = 1.0 - max3( material.sheenColor ) * max( sheenAlbedoV, sheenAlbedoL );\n \n \t\tirradiance *= sheenEnergyComp;\n \n \t#endif\n\treflectedLight.directSpecular += irradiance * BRDF_GGX_Multiscatter( directLight.direction, geometryViewDir, geometryNormal, material );\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseContribution );\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\tvec3 diffuse = irradiance * BRDF_Lambert( material.diffuseContribution );\n\t#ifdef USE_SHEEN\n\t\tfloat sheenAlbedo = IBLSheenBRDF( geometryNormal, geometryViewDir, material.sheenRoughness );\n\t\tfloat sheenEnergyComp = 1.0 - max3( material.sheenColor ) * sheenAlbedo;\n\t\tdiffuse *= sheenEnergyComp;\n\t#endif\n\treflectedLight.indirectDiffuse += diffuse;\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 ) * RECIPROCAL_PI;\n \t#endif\n\tvec3 singleScatteringDielectric = vec3( 0.0 );\n\tvec3 multiScatteringDielectric = vec3( 0.0 );\n\tvec3 singleScatteringMetallic = vec3( 0.0 );\n\tvec3 multiScatteringMetallic = vec3( 0.0 );\n\t#ifdef USE_IRIDESCENCE\n\t\tcomputeMultiscatteringIridescence( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.iridescence, material.iridescenceFresnelDielectric, material.roughness, singleScatteringDielectric, multiScatteringDielectric );\n\t\tcomputeMultiscatteringIridescence( geometryNormal, geometryViewDir, material.diffuseColor, material.specularF90, material.iridescence, material.iridescenceFresnelMetallic, material.roughness, singleScatteringMetallic, multiScatteringMetallic );\n\t#else\n\t\tcomputeMultiscattering( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.roughness, singleScatteringDielectric, multiScatteringDielectric );\n\t\tcomputeMultiscattering( geometryNormal, geometryViewDir, material.diffuseColor, material.specularF90, material.roughness, singleScatteringMetallic, multiScatteringMetallic );\n\t#endif\n\tvec3 singleScattering = mix( singleScatteringDielectric, singleScatteringMetallic, material.metalness );\n\tvec3 multiScattering = mix( multiScatteringDielectric, multiScatteringMetallic, material.metalness );\n\tvec3 totalScatteringDielectric = singleScatteringDielectric + multiScatteringDielectric;\n\tvec3 diffuse = material.diffuseContribution * ( 1.0 - totalScatteringDielectric );\n\tvec3 cosineWeightedIrradiance = irradiance * RECIPROCAL_PI;\n\tvec3 indirectSpecular = radiance * singleScattering;\n\tindirectSpecular += multiScattering * cosineWeightedIrradiance;\n\tvec3 indirectDiffuse = diffuse * cosineWeightedIrradiance;\n\t#ifdef USE_SHEEN\n\t\tfloat sheenAlbedo = IBLSheenBRDF( geometryNormal, geometryViewDir, material.sheenRoughness );\n\t\tfloat sheenEnergyComp = 1.0 - max3( material.sheenColor ) * sheenAlbedo;\n\t\tindirectSpecular *= sheenEnergyComp;\n\t\tindirectDiffuse *= sheenEnergyComp;\n\t#endif\n\treflectedLight.indirectSpecular += indirectSpecular;\n\treflectedLight.indirectDiffuse += indirectDiffuse;\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.iridescenceFresnelDielectric = evalIridescence( 1.0, material.iridescenceIOR, dotNVi, material.iridescenceThickness, material.specularColor );\n\t\tmaterial.iridescenceFresnelMetallic = evalIridescence( 1.0, material.iridescenceIOR, dotNVi, material.iridescenceThickness, material.diffuseColor );\n\t\tmaterial.iridescenceFresnel = mix( material.iridescenceFresnelDielectric, material.iridescenceFresnelMetallic, material.metalness );\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 ) && ( defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_BASIC ) )\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( ENVMAP_TYPE_CUBE_UV )\n\t\t#if defined( STANDARD ) || defined( LAMBERT ) || defined( PHONG )\n\t\t\tiblIrradiance += getIBLIrradiance( geometryNormal );\n\t\t#endif\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\t#if defined( LAMBERT ) || defined( PHONG )\n\t\tirradiance += iblIrradiance;\n\t#endif\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_LOGARITHMIC_DEPTH_BUFFER )\n\tgl_FragDepth = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5;\n#endif",logdepthbuf_pars_fragment:"#if defined( USE_LOGARITHMIC_DEPTH_BUFFER )\n\tuniform float logDepthBufFC;\n\tvarying float vFragDepth;\n\tvarying float vIsPerspective;\n#endif",logdepthbuf_pars_vertex:"#ifdef USE_LOGARITHMIC_DEPTH_BUFFER\n\tvarying float vFragDepth;\n\tvarying float vIsPerspective;\n#endif",logdepthbuf_vertex:"#ifdef USE_LOGARITHMIC_DEPTH_BUFFER\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\t#if defined( USE_PACKED_NORMALMAP )\n\t\tmapN = vec3( mapN.xy, sqrt( saturate( 1.0 - dot( mapN.xy, mapN.xy ) ) ) );\n\t#endif\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\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\n\t\treturn depth * ( far - near ) - far;\n\t#else\n\t\treturn depth * ( near - far ) - near;\n\t#endif\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\t\n\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\treturn ( near * far ) / ( ( near - far ) * depth - near );\n\t#else\n\t\treturn ( near * far ) / ( ( far - near ) * depth - far );\n\t#endif\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\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tuniform sampler2DShadow directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\n\t\t#else\n\t\t\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\n\t\t#endif\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\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tuniform sampler2DShadow spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\t#else\n\t\t\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\t#endif\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\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tuniform samplerCubeShadow pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];\n\t\t#elif defined( SHADOWMAP_TYPE_BASIC )\n\t\t\tuniform samplerCube pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];\n\t\t#endif\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\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\tfloat interleavedGradientNoise( vec2 position ) {\n\t\t\treturn fract( 52.9829189 * fract( dot( position, vec2( 0.06711056, 0.00583715 ) ) ) );\n\t\t}\n\t\tvec2 vogelDiskSample( int sampleIndex, int samplesCount, float phi ) {\n\t\t\tconst float goldenAngle = 2.399963229728653;\n\t\t\tfloat r = sqrt( ( float( sampleIndex ) + 0.5 ) / float( samplesCount ) );\n\t\t\tfloat theta = float( sampleIndex ) * goldenAngle + phi;\n\t\t\treturn vec2( cos( theta ), sin( theta ) ) * r;\n\t\t}\n\t#endif\n\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\tfloat getShadow( sampler2DShadow shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\t\tfloat shadow = 1.0;\n\t\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\t\tshadowCoord.z += shadowBias;\n\t\t\tbool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0;\n\t\t\tbool frustumTest = inFrustum && shadowCoord.z <= 1.0;\n\t\t\tif ( frustumTest ) {\n\t\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\t\tfloat radius = shadowRadius * texelSize.x;\n\t\t\t\tfloat phi = interleavedGradientNoise( gl_FragCoord.xy ) * PI2;\n\t\t\t\tshadow = (\n\t\t\t\t\ttexture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 0, 5, phi ) * radius, shadowCoord.z ) ) +\n\t\t\t\t\ttexture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 1, 5, phi ) * radius, shadowCoord.z ) ) +\n\t\t\t\t\ttexture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 2, 5, phi ) * radius, shadowCoord.z ) ) +\n\t\t\t\t\ttexture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 3, 5, phi ) * radius, shadowCoord.z ) ) +\n\t\t\t\t\ttexture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 4, 5, phi ) * radius, shadowCoord.z ) )\n\t\t\t\t) * 0.2;\n\t\t\t}\n\t\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t\t}\n\t#elif defined( SHADOWMAP_TYPE_VSM )\n\t\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\t\tfloat shadow = 1.0;\n\t\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\t\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\t\t\tshadowCoord.z -= shadowBias;\n\t\t\t#else\n\t\t\t\tshadowCoord.z += shadowBias;\n\t\t\t#endif\n\t\t\tbool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0;\n\t\t\tbool frustumTest = inFrustum && shadowCoord.z <= 1.0;\n\t\t\tif ( frustumTest ) {\n\t\t\t\tvec2 distribution = texture2D( shadowMap, shadowCoord.xy ).rg;\n\t\t\t\tfloat mean = distribution.x;\n\t\t\t\tfloat variance = distribution.y * distribution.y;\n\t\t\t\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\t\t\t\tfloat hard_shadow = step( mean, shadowCoord.z );\n\t\t\t\t#else\n\t\t\t\t\tfloat hard_shadow = step( shadowCoord.z, mean );\n\t\t\t\t#endif\n\t\t\t\t\n\t\t\t\tif ( hard_shadow == 1.0 ) {\n\t\t\t\t\tshadow = 1.0;\n\t\t\t\t} else {\n\t\t\t\t\tvariance = max( variance, 0.0000001 );\n\t\t\t\t\tfloat d = shadowCoord.z - mean;\n\t\t\t\t\tfloat p_max = variance / ( variance + d * d );\n\t\t\t\t\tp_max = clamp( ( p_max - 0.3 ) / 0.65, 0.0, 1.0 );\n\t\t\t\t\tshadow = max( hard_shadow, p_max );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t\t}\n\t#else\n\t\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\t\tfloat shadow = 1.0;\n\t\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\t\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\t\t\tshadowCoord.z -= shadowBias;\n\t\t\t#else\n\t\t\t\tshadowCoord.z += shadowBias;\n\t\t\t#endif\n\t\t\tbool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0;\n\t\t\tbool frustumTest = inFrustum && shadowCoord.z <= 1.0;\n\t\t\tif ( frustumTest ) {\n\t\t\t\tfloat depth = texture2D( shadowMap, shadowCoord.xy ).r;\n\t\t\t\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\t\t\t\tshadow = step( depth, shadowCoord.z );\n\t\t\t\t#else\n\t\t\t\t\tshadow = step( shadowCoord.z, depth );\n\t\t\t\t#endif\n\t\t\t}\n\t\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t\t}\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t#if defined( SHADOWMAP_TYPE_PCF )\n\tfloat getPointShadow( samplerCubeShadow 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\tvec3 bd3D = normalize( lightToPosition );\n\t\tvec3 absVec = abs( lightToPosition );\n\t\tfloat viewSpaceZ = max( max( absVec.x, absVec.y ), absVec.z );\n\t\tif ( viewSpaceZ - shadowCameraFar <= 0.0 && viewSpaceZ - shadowCameraNear >= 0.0 ) {\n\t\t\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\t\t\tfloat dp = ( shadowCameraNear * ( shadowCameraFar - viewSpaceZ ) ) / ( viewSpaceZ * ( shadowCameraFar - shadowCameraNear ) );\n\t\t\t\tdp -= shadowBias;\n\t\t\t#else\n\t\t\t\tfloat dp = ( shadowCameraFar * ( viewSpaceZ - shadowCameraNear ) ) / ( viewSpaceZ * ( shadowCameraFar - shadowCameraNear ) );\n\t\t\t\tdp += shadowBias;\n\t\t\t#endif\n\t\t\tfloat texelSize = shadowRadius / shadowMapSize.x;\n\t\t\tvec3 absDir = abs( bd3D );\n\t\t\tvec3 tangent = absDir.x > absDir.z ? vec3( 0.0, 1.0, 0.0 ) : vec3( 1.0, 0.0, 0.0 );\n\t\t\ttangent = normalize( cross( bd3D, tangent ) );\n\t\t\tvec3 bitangent = cross( bd3D, tangent );\n\t\t\tfloat phi = interleavedGradientNoise( gl_FragCoord.xy ) * PI2;\n\t\t\tvec2 sample0 = vogelDiskSample( 0, 5, phi );\n\t\t\tvec2 sample1 = vogelDiskSample( 1, 5, phi );\n\t\t\tvec2 sample2 = vogelDiskSample( 2, 5, phi );\n\t\t\tvec2 sample3 = vogelDiskSample( 3, 5, phi );\n\t\t\tvec2 sample4 = vogelDiskSample( 4, 5, phi );\n\t\t\tshadow = (\n\t\t\t\ttexture( shadowMap, vec4( bd3D + ( tangent * sample0.x + bitangent * sample0.y ) * texelSize, dp ) ) +\n\t\t\t\ttexture( shadowMap, vec4( bd3D + ( tangent * sample1.x + bitangent * sample1.y ) * texelSize, dp ) ) +\n\t\t\t\ttexture( shadowMap, vec4( bd3D + ( tangent * sample2.x + bitangent * sample2.y ) * texelSize, dp ) ) +\n\t\t\t\ttexture( shadowMap, vec4( bd3D + ( tangent * sample3.x + bitangent * sample3.y ) * texelSize, dp ) ) +\n\t\t\t\ttexture( shadowMap, vec4( bd3D + ( tangent * sample4.x + bitangent * sample4.y ) * texelSize, dp ) )\n\t\t\t) * 0.2;\n\t\t}\n\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t}\n\t#elif defined( SHADOWMAP_TYPE_BASIC )\n\tfloat getPointShadow( samplerCube 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\tvec3 absVec = abs( lightToPosition );\n\t\tfloat viewSpaceZ = max( max( absVec.x, absVec.y ), absVec.z );\n\t\tif ( viewSpaceZ - shadowCameraFar <= 0.0 && viewSpaceZ - shadowCameraNear >= 0.0 ) {\n\t\t\tfloat dp = ( shadowCameraFar * ( viewSpaceZ - shadowCameraNear ) ) / ( viewSpaceZ * ( shadowCameraFar - shadowCameraNear ) );\n\t\t\tdp += shadowBias;\n\t\t\tvec3 bd3D = normalize( lightToPosition );\n\t\t\tfloat depth = textureCube( shadowMap, bd3D ).r;\n\t\t\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\t\t\tdepth = 1.0 - depth;\n\t\t\t#endif\n\t\t\tshadow = step( dp, depth );\n\t\t}\n\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t}\n\t#endif\n\t#endif\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 && ( defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_BASIC ) )\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.diffuseContribution, material.specularColorBlended, 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 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 * vWorldDirection );\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_REVERSED_DEPTH_BUFFER\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}",distance_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}",distance_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 \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 = vec4( dist, 0.0, 0.0, 1.0 );\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 \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 \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( normalize( normal ) * 0.5 + 0.5, 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 \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 \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 \n\t\toutgoingLight = outgoingLight + sheenSpecularDirect + sheenSpecularIndirect;\n \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 \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 \nvoid main() {\n\t#include \n\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\n\t#include \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}"},Gn={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},reflectivity:{value:1},ior:{value:1.5},refractionRatio:{value:.98},dfgLUT:{value:null}},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:{}}},directionalShadowMatrix:{value:[]},spotLights:{value:[],properties:{color:{},position:{},direction:{},distance:{},coneCos:{},penumbraCos:{},decay:{}}},spotLightShadows:{value:[],properties:{shadowIntensity:1,shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{}}},spotLightMap:{value:[]},spotLightMatrix:{value:[]},pointLights:{value:[],properties:{color:{},position:{},decay:{},distance:{}}},pointLightShadows:{value:[],properties:{shadowIntensity:1,shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{},shadowCameraNear:{},shadowCameraFar:{}}},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}}},Hn={basic:{uniforms:i([Gn.common,Gn.specularmap,Gn.envmap,Gn.aomap,Gn.lightmap,Gn.fog]),vertexShader:Bn.meshbasic_vert,fragmentShader:Bn.meshbasic_frag},lambert:{uniforms:i([Gn.common,Gn.specularmap,Gn.envmap,Gn.aomap,Gn.lightmap,Gn.emissivemap,Gn.bumpmap,Gn.normalmap,Gn.displacementmap,Gn.fog,Gn.lights,{emissive:{value:new n(0)},envMapIntensity:{value:1}}]),vertexShader:Bn.meshlambert_vert,fragmentShader:Bn.meshlambert_frag},phong:{uniforms:i([Gn.common,Gn.specularmap,Gn.envmap,Gn.aomap,Gn.lightmap,Gn.emissivemap,Gn.bumpmap,Gn.normalmap,Gn.displacementmap,Gn.fog,Gn.lights,{emissive:{value:new n(0)},specular:{value:new n(1118481)},shininess:{value:30},envMapIntensity:{value:1}}]),vertexShader:Bn.meshphong_vert,fragmentShader:Bn.meshphong_frag},standard:{uniforms:i([Gn.common,Gn.envmap,Gn.aomap,Gn.lightmap,Gn.emissivemap,Gn.bumpmap,Gn.normalmap,Gn.displacementmap,Gn.roughnessmap,Gn.metalnessmap,Gn.fog,Gn.lights,{emissive:{value:new n(0)},roughness:{value:1},metalness:{value:0},envMapIntensity:{value:1}}]),vertexShader:Bn.meshphysical_vert,fragmentShader:Bn.meshphysical_frag},toon:{uniforms:i([Gn.common,Gn.aomap,Gn.lightmap,Gn.emissivemap,Gn.bumpmap,Gn.normalmap,Gn.displacementmap,Gn.gradientmap,Gn.fog,Gn.lights,{emissive:{value:new n(0)}}]),vertexShader:Bn.meshtoon_vert,fragmentShader:Bn.meshtoon_frag},matcap:{uniforms:i([Gn.common,Gn.bumpmap,Gn.normalmap,Gn.displacementmap,Gn.fog,{matcap:{value:null}}]),vertexShader:Bn.meshmatcap_vert,fragmentShader:Bn.meshmatcap_frag},points:{uniforms:i([Gn.points,Gn.fog]),vertexShader:Bn.points_vert,fragmentShader:Bn.points_frag},dashed:{uniforms:i([Gn.common,Gn.fog,{scale:{value:1},dashSize:{value:1},totalSize:{value:2}}]),vertexShader:Bn.linedashed_vert,fragmentShader:Bn.linedashed_frag},depth:{uniforms:i([Gn.common,Gn.displacementmap]),vertexShader:Bn.depth_vert,fragmentShader:Bn.depth_frag},normal:{uniforms:i([Gn.common,Gn.bumpmap,Gn.normalmap,Gn.displacementmap,{opacity:{value:1}}]),vertexShader:Bn.meshnormal_vert,fragmentShader:Bn.meshnormal_frag},sprite:{uniforms:i([Gn.sprite,Gn.fog]),vertexShader:Bn.sprite_vert,fragmentShader:Bn.sprite_frag},background:{uniforms:{uvTransform:{value:new e},t2D:{value:null},backgroundIntensity:{value:1}},vertexShader:Bn.background_vert,fragmentShader:Bn.background_frag},backgroundCube:{uniforms:{envMap:{value:null},backgroundBlurriness:{value:0},backgroundIntensity:{value:1},backgroundRotation:{value:new e}},vertexShader:Bn.backgroundCube_vert,fragmentShader:Bn.backgroundCube_frag},cube:{uniforms:{tCube:{value:null},tFlip:{value:-1},opacity:{value:1}},vertexShader:Bn.cube_vert,fragmentShader:Bn.cube_frag},equirect:{uniforms:{tEquirect:{value:null}},vertexShader:Bn.equirect_vert,fragmentShader:Bn.equirect_frag},distance:{uniforms:i([Gn.common,Gn.displacementmap,{referencePosition:{value:new r},nearDistance:{value:1},farDistance:{value:1e3}}]),vertexShader:Bn.distance_vert,fragmentShader:Bn.distance_frag},shadow:{uniforms:i([Gn.lights,Gn.fog,{color:{value:new n(0)},opacity:{value:1}}]),vertexShader:Bn.shadow_vert,fragmentShader:Bn.shadow_frag}};Hn.physical={uniforms:i([Hn.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:Bn.meshphysical_vert,fragmentShader:Bn.meshphysical_frag};const Vn={r:0,b:0,g:0},Wn=new u,kn=new e;function zn(e,t,i,r,u,g){const v=new n(0);let E,S,M=!0===u?0:1,T=null,x=0,A=null;function R(e){let n=!0===e.isScene?e.background:null;if(n&&n.isTexture){const i=e.backgroundBlurriness>0;n=t.get(n,i)}return n}function b(t,n){t.getRGB(Vn,_(e)),i.buffers.color.setClear(Vn.r,Vn.g,Vn.b,n,g)}return{getClearColor:function(){return v},setClearColor:function(e,t=1){v.set(e),M=t,b(v,M)},getClearAlpha:function(){return M},setClearAlpha:function(e){M=e,b(v,M)},render:function(t){let n=!1;const r=R(t);null===r?b(v,M):r&&r.isColor&&(b(r,1),n=!0);const a=e.xr.getEnvironmentBlendMode();"additive"===a?i.buffers.color.setClear(0,0,0,1,g):"alpha-blend"===a&&i.buffers.color.setClear(0,0,0,0,g),(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 i=R(n);i&&(i.isCubeTexture||i.mapping===a)?(void 0===S&&(S=new o(new s(1,1,1),new l({name:"BackgroundCubeMaterial",uniforms:d(Hn.backgroundCube.uniforms),vertexShader:Hn.backgroundCube.vertexShader,fragmentShader:Hn.backgroundCube.fragmentShader,side:c,depthTest:!1,depthWrite:!1,fog:!1,allowOverride:!1})),S.geometry.deleteAttribute("normal"),S.geometry.deleteAttribute("uv"),S.onBeforeRender=function(e,t,n){this.matrixWorld.copyPosition(n.matrixWorld)},Object.defineProperty(S.material,"envMap",{get:function(){return this.uniforms.envMap.value}}),r.update(S)),S.material.uniforms.envMap.value=i,S.material.uniforms.backgroundBlurriness.value=n.backgroundBlurriness,S.material.uniforms.backgroundIntensity.value=n.backgroundIntensity,S.material.uniforms.backgroundRotation.value.setFromMatrix4(Wn.makeRotationFromEuler(n.backgroundRotation)).transpose(),i.isCubeTexture&&!1===i.isRenderTargetTexture&&S.material.uniforms.backgroundRotation.value.premultiply(kn),S.material.toneMapped=f.getTransfer(i.colorSpace)!==p,T===i&&x===i.version&&A===e.toneMapping||(S.material.needsUpdate=!0,T=i,x=i.version,A=e.toneMapping),S.layers.enableAll(),t.unshift(S,S.geometry,S.material,0,0,null)):i&&i.isTexture&&(void 0===E&&(E=new o(new m(2,2),new l({name:"BackgroundMaterial",uniforms:d(Hn.background.uniforms),vertexShader:Hn.background.vertexShader,fragmentShader:Hn.background.fragmentShader,side:h,depthTest:!1,depthWrite:!1,fog:!1,allowOverride:!1})),E.geometry.deleteAttribute("normal"),Object.defineProperty(E.material,"map",{get:function(){return this.uniforms.t2D.value}}),r.update(E)),E.material.uniforms.t2D.value=i,E.material.uniforms.backgroundIntensity.value=n.backgroundIntensity,E.material.toneMapped=f.getTransfer(i.colorSpace)!==p,!0===i.matrixAutoUpdate&&i.updateMatrix(),E.material.uniforms.uvTransform.value.copy(i.matrix),T===i&&x===i.version&&A===e.toneMapping||(E.material.needsUpdate=!0,T=i,x=i.version,A=e.toneMapping),E.layers.enableAll(),t.unshift(E,E.geometry,E.material,0,0,null))},dispose:function(){void 0!==S&&(S.geometry.dispose(),S.material.dispose(),S=void 0),void 0!==E&&(E.geometry.dispose(),E.material.dispose(),E=void 0)}}}function Xn(e,t){const n=e.getParameter(e.MAX_VERTEX_ATTRIBS),i={},r=c(null);let a=r,o=!1;function s(t){return e.bindVertexArray(t)}function l(t){return e.deleteVertexArray(t)}function c(e){const t=[],i=[],r=[];for(let e=0;e=0){const n=r[t];let i=o[t];if(void 0===i&&("instanceMatrix"===t&&e.instanceMatrix&&(i=e.instanceMatrix),"instanceColor"===t&&e.instanceColor&&(i=e.instanceColor)),void 0===n)return!0;if(n.attribute!==i)return!0;if(i&&n.data!==i.data)return!0;s++}}return a.attributesNum!==s||a.index!==i}(n,h,l,_),v&&function(e,t,n,i){const r={},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 i={};i.attribute=n,n&&n.data&&(i.data=n.data),r[t]=i,s++}}a.attributes=r,a.attributesNum=s,a.index=i}(n,h,l,_),null!==_&&t.update(_,e.ELEMENT_ARRAY_BUFFER),(v||o)&&(o=!1,function(n,i,r,a){d();const o=a.attributes,s=r.getAttributes(),l=i.defaultAttributeValues;for(const i in s){const r=s[i];if(r.location>=0){let s=o[i];if(void 0===s&&("instanceMatrix"===i&&n.instanceMatrix&&(s=n.instanceMatrix),"instanceColor"===i&&n.instanceColor&&(s=n.instanceColor)),void 0!==s){const i=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===g;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&&(v("WebGLRenderer:",o,"not supported, using",s,"instead."),o=s);return{isWebGL2:!0,getMaxAnisotropy:function(){if(void 0!==r)return r;if(!0===t.has("EXT_texture_filter_anisotropic")){const n=t.get("EXT_texture_filter_anisotropic");r=e.getParameter(n.MAX_TEXTURE_MAX_ANISOTROPY_EXT)}else r=0;return r},getMaxPrecision:a,textureFormatReadable:function(t){return t===T||i.convert(t)===e.getParameter(e.IMPLEMENTATION_COLOR_READ_FORMAT)},textureTypeReadable:function(n){const r=n===E&&(t.has("EXT_color_buffer_half_float")||t.has("EXT_color_buffer_float"));return!(n!==S&&i.convert(n)!==e.getParameter(e.IMPLEMENTATION_COLOR_READ_TYPE)&&n!==M&&!r)},precision:o,logarithmicDepthBuffer:!0===n.logarithmicDepthBuffer,reversedDepthBuffer:!0===n.reversedDepthBuffer&&t.has("EXT_clip_control"),maxTextures:e.getParameter(e.MAX_TEXTURE_IMAGE_UNITS),maxVertexTextures:e.getParameter(e.MAX_VERTEX_TEXTURE_IMAGE_UNITS),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),maxSamples:e.getParameter(e.MAX_SAMPLES),samples:e.getParameter(e.SAMPLES)}}function qn(t){const n=this;let i=null,r=0,a=!1,o=!1;const s=new x,l=new e,c={value:null,needsUpdate:!1};function d(e,t,i,r){const a=null!==e?e.length:0;let o=null;if(0!==a){if(o=c.value,!0!==r||null===o){const n=i+4*a,r=t.matrixWorldInverse;l.getNormalMatrix(r),(null===o||o.length0);n.numPlanes=r,n.numIntersection=0}();else{const e=o?0:r,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]=i[e];m.clippingState=n,this.numIntersection=f?this.numPlanes:0,this.numPlanes+=e}}}kn.set(-1,0,0,0,1,0,0,0,1);const jn=[.125,.215,.35,.446,.526,.582],Zn=20,$n=new C,Qn=new n;let Jn=null,ei=0,ti=0,ni=!1;const ii=new r;class ri{constructor(e){this._renderer=e,this._pingPongRenderTarget=null,this._lodMax=0,this._cubeSize=0,this._sizeLods=[],this._sigmas=[],this._lodMeshes=[],this._backgroundBox=null,this._cubemapMaterial=null,this._equirectMaterial=null,this._blurMaterial=null,this._ggxMaterial=null}fromScene(e,t=0,n=.1,i=100,r={}){const{size:a=256,position:o=ii}=r;Jn=this._renderer.getRenderTarget(),ei=this._renderer.getActiveCubeFace(),ti=this._renderer.getActiveMipmapLevel(),ni=this._renderer.xr.enabled,this._renderer.xr.enabled=!1,this._setSize(a);const s=this._allocateTargets();return s.depthBuffer=!0,this._sceneToCubeUV(e,n,i,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=li(),this._compileMaterial(this._cubemapMaterial))}compileEquirectangularShader(){null===this._equirectMaterial&&(this._equirectMaterial=si(),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())}_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._ggxMaterial&&this._ggxMaterial.dispose(),null!==this._pingPongRenderTarget&&this._pingPongRenderTarget.dispose();for(let e=0;ee-4?l=jn[s-e+4-1]:0===s&&(l=0),n.push(l);const c=1/(a-2),d=-c,u=1+c,f=[d,d,u,d,u,u,d,d,u,u,d,u],p=6,m=6,h=3,_=2,g=1,v=new Float32Array(h*m*p),E=new Float32Array(_*m*p),S=new Float32Array(g*m*p);for(let e=0;e2?0:-1,i=[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];v.set(i,h*m*e),E.set(f,_*m*e);const r=[e,e,e,e,e,e];S.set(r,g*m*e)}const M=new b;M.setAttribute("position",new N(v,h)),M.setAttribute("uv",new N(E,_)),M.setAttribute("faceIndex",new N(S,g)),i.push(new o(M,null)),r>4&&r--}return{lodMeshes:i,sizeLods:t,sigmas:n}}(i)),this._blurMaterial=function(e,t,n){const i=new Float32Array(Zn),a=new r(0,1,0),o=new l({name:"SphericalGaussianBlur",defines:{n:Zn,CUBEUV_TEXEL_WIDTH:1/t,CUBEUV_TEXEL_HEIGHT:1/n,CUBEUV_MAX_MIP:`${e}.0`},uniforms:{envMap:{value:null},samples:{value:1},weights:{value:i},latitudinal:{value:!1},dTheta:{value:0},mipInt:{value:0},poleAxis:{value:a}},vertexShader:ci(),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:w,depthTest:!1,depthWrite:!1});return o}(i,e,t),this._ggxMaterial=function(e,t,n){const i=new l({name:"PMREMGGXConvolution",defines:{GGX_SAMPLES:256,CUBEUV_TEXEL_WIDTH:1/t,CUBEUV_TEXEL_HEIGHT:1/n,CUBEUV_MAX_MIP:`${e}.0`},uniforms:{envMap:{value:null},roughness:{value:0},mipInt:{value:0}},vertexShader:ci(),fragmentShader:'\n\n\t\t\tprecision highp float;\n\t\t\tprecision highp int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\t\t\tuniform float roughness;\n\t\t\tuniform float mipInt;\n\n\t\t\t#define ENVMAP_TYPE_CUBE_UV\n\t\t\t#include \n\n\t\t\t#define PI 3.14159265359\n\n\t\t\t// Van der Corput radical inverse\n\t\t\tfloat radicalInverse_VdC(uint bits) {\n\t\t\t\tbits = (bits << 16u) | (bits >> 16u);\n\t\t\t\tbits = ((bits & 0x55555555u) << 1u) | ((bits & 0xAAAAAAAAu) >> 1u);\n\t\t\t\tbits = ((bits & 0x33333333u) << 2u) | ((bits & 0xCCCCCCCCu) >> 2u);\n\t\t\t\tbits = ((bits & 0x0F0F0F0Fu) << 4u) | ((bits & 0xF0F0F0F0u) >> 4u);\n\t\t\t\tbits = ((bits & 0x00FF00FFu) << 8u) | ((bits & 0xFF00FF00u) >> 8u);\n\t\t\t\treturn float(bits) * 2.3283064365386963e-10; // / 0x100000000\n\t\t\t}\n\n\t\t\t// Hammersley sequence\n\t\t\tvec2 hammersley(uint i, uint N) {\n\t\t\t\treturn vec2(float(i) / float(N), radicalInverse_VdC(i));\n\t\t\t}\n\n\t\t\t// GGX VNDF importance sampling (Eric Heitz 2018)\n\t\t\t// "Sampling the GGX Distribution of Visible Normals"\n\t\t\t// https://jcgt.org/published/0007/04/01/\n\t\t\tvec3 importanceSampleGGX_VNDF(vec2 Xi, vec3 V, float roughness) {\n\t\t\t\tfloat alpha = roughness * roughness;\n\n\t\t\t\t// Section 4.1: Orthonormal basis\n\t\t\t\tvec3 T1 = vec3(1.0, 0.0, 0.0);\n\t\t\t\tvec3 T2 = cross(V, T1);\n\n\t\t\t\t// Section 4.2: Parameterization of projected area\n\t\t\t\tfloat r = sqrt(Xi.x);\n\t\t\t\tfloat phi = 2.0 * PI * Xi.y;\n\t\t\t\tfloat t1 = r * cos(phi);\n\t\t\t\tfloat t2 = r * sin(phi);\n\t\t\t\tfloat s = 0.5 * (1.0 + V.z);\n\t\t\t\tt2 = (1.0 - s) * sqrt(1.0 - t1 * t1) + s * t2;\n\n\t\t\t\t// Section 4.3: Reprojection onto hemisphere\n\t\t\t\tvec3 Nh = t1 * T1 + t2 * T2 + sqrt(max(0.0, 1.0 - t1 * t1 - t2 * t2)) * V;\n\n\t\t\t\t// Section 3.4: Transform back to ellipsoid configuration\n\t\t\t\treturn normalize(vec3(alpha * Nh.x, alpha * Nh.y, max(0.0, Nh.z)));\n\t\t\t}\n\n\t\t\tvoid main() {\n\t\t\t\tvec3 N = normalize(vOutputDirection);\n\t\t\t\tvec3 V = N; // Assume view direction equals normal for pre-filtering\n\n\t\t\t\tvec3 prefilteredColor = vec3(0.0);\n\t\t\t\tfloat totalWeight = 0.0;\n\n\t\t\t\t// For very low roughness, just sample the environment directly\n\t\t\t\tif (roughness < 0.001) {\n\t\t\t\t\tgl_FragColor = vec4(bilinearCubeUV(envMap, N, mipInt), 1.0);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Tangent space basis for VNDF sampling\n\t\t\t\tvec3 up = abs(N.z) < 0.999 ? vec3(0.0, 0.0, 1.0) : vec3(1.0, 0.0, 0.0);\n\t\t\t\tvec3 tangent = normalize(cross(up, N));\n\t\t\t\tvec3 bitangent = cross(N, tangent);\n\n\t\t\t\tfor(uint i = 0u; i < uint(GGX_SAMPLES); i++) {\n\t\t\t\t\tvec2 Xi = hammersley(i, uint(GGX_SAMPLES));\n\n\t\t\t\t\t// For PMREM, V = N, so in tangent space V is always (0, 0, 1)\n\t\t\t\t\tvec3 H_tangent = importanceSampleGGX_VNDF(Xi, vec3(0.0, 0.0, 1.0), roughness);\n\n\t\t\t\t\t// Transform H back to world space\n\t\t\t\t\tvec3 H = normalize(tangent * H_tangent.x + bitangent * H_tangent.y + N * H_tangent.z);\n\t\t\t\t\tvec3 L = normalize(2.0 * dot(V, H) * H - V);\n\n\t\t\t\t\tfloat NdotL = max(dot(N, L), 0.0);\n\n\t\t\t\t\tif(NdotL > 0.0) {\n\t\t\t\t\t\t// Sample environment at fixed mip level\n\t\t\t\t\t\t// VNDF importance sampling handles the distribution filtering\n\t\t\t\t\t\tvec3 sampleColor = bilinearCubeUV(envMap, L, mipInt);\n\n\t\t\t\t\t\t// Weight by NdotL for the split-sum approximation\n\t\t\t\t\t\t// VNDF PDF naturally accounts for the visible microfacet distribution\n\t\t\t\t\t\tprefilteredColor += sampleColor * NdotL;\n\t\t\t\t\t\ttotalWeight += NdotL;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (totalWeight > 0.0) {\n\t\t\t\t\tprefilteredColor = prefilteredColor / totalWeight;\n\t\t\t\t}\n\n\t\t\t\tgl_FragColor = vec4(prefilteredColor, 1.0);\n\t\t\t}\n\t\t',blending:w,depthTest:!1,depthWrite:!1});return i}(i,e,t)}return i}_compileMaterial(e){const t=new o(new b,e);this._renderer.compile(t,$n)}_sceneToCubeUV(e,t,n,i,r){const a=new P(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(Qn),u.toneMapping=L,u.autoClear=!1;u.state.buffers.depth.getReversed()&&(u.setRenderTarget(i),u.clearDepth(),u.setRenderTarget(null)),null===this._backgroundBox&&(this._backgroundBox=new o(new s,new U({name:"PMREM.Background",side:c,depthWrite:!1,depthTest:!1})));const m=this._backgroundBox,h=m.material;let _=!1;const g=e.background;g?g.isColor&&(h.color.copy(g),e.background=null,_=!0):(h.color.copy(Qn),_=!0);for(let t=0;t<6;t++){const n=t%3;0===n?(a.up.set(0,l[t],0),a.position.set(r.x,r.y,r.z),a.lookAt(r.x+d[t],r.y,r.z)):1===n?(a.up.set(0,0,l[t]),a.position.set(r.x,r.y,r.z),a.lookAt(r.x,r.y+d[t],r.z)):(a.up.set(0,l[t],0),a.position.set(r.x,r.y,r.z),a.lookAt(r.x,r.y,r.z+d[t]));const o=this._cubeSize;oi(i,n*o,t>2?o:0,o,o),u.setRenderTarget(i),_&&u.render(m,a),u.render(e,a)}u.toneMapping=p,u.autoClear=f,e.background=g}_textureToCubeUV(e,t){const n=this._renderer,i=e.mapping===A||e.mapping===R;i?(null===this._cubemapMaterial&&(this._cubemapMaterial=li()),this._cubemapMaterial.uniforms.flipEnvMap.value=!1===e.isRenderTargetTexture?-1:1):null===this._equirectMaterial&&(this._equirectMaterial=si());const r=i?this._cubemapMaterial:this._equirectMaterial,a=this._lodMeshes[0];a.material=r;r.uniforms.envMap.value=e;const o=this._cubeSize;oi(t,0,0,3*o,2*o),n.setRenderTarget(t),n.render(a,$n)}_applyPMREM(e){const t=this._renderer,n=t.autoClear;t.autoClear=!1;const i=this._lodMeshes.length;for(let t=1;tu-4?n-u+4:0),m=4*(this._cubeSize-f);s.envMap.value=e.texture,s.roughness.value=d,s.mipInt.value=u-t,oi(r,p,m,3*f,2*f),i.setRenderTarget(r),i.render(o,$n),s.envMap.value=r.texture,s.roughness.value=0,s.mipInt.value=u-n,oi(e,p,m,3*f,2*f),i.setRenderTarget(e),i.render(o,$n)}_blur(e,t,n,i,r){const a=this._pingPongRenderTarget;this._halfBlur(e,a,t,n,i,"latitudinal",r),this._halfBlur(a,e,n,n,i,"longitudinal",r)}_halfBlur(e,t,n,i,r,a,o){const s=this._renderer,l=this._blurMaterial;"latitudinal"!==a&&"longitudinal"!==a&&D("blur direction must be either latitudinal or longitudinal!");const c=this._lodMeshes[i];c.material=l;const d=l.uniforms,u=this._sizeLods[n]-1,f=isFinite(r)?Math.PI/(2*u):2*Math.PI/39,p=r/f,m=isFinite(r)?1+Math.floor(3*p):Zn;m>Zn&&v(`sigmaRadians, ${r}, is too large and will clip, as it requested ${m} samples when the maximum is set to 20`);const h=[];let _=0;for(let e=0;eg-4?i-g+4:0),4*(this._cubeSize-E),3*E,2*E),s.setRenderTarget(t),s.render(c,$n)}}function ai(e,t,n){const i=new I(e,t,n);return i.texture.mapping=a,i.texture.name="PMREM.cubeUv",i.scissorTest=!0,i}function oi(e,t,n,i,r){e.viewport.set(t,n,i,r),e.scissor.set(t,n,i,r)}function si(){return new l({name:"EquirectangularToCubeUV",uniforms:{envMap:{value:null}},vertexShader:ci(),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:w,depthTest:!1,depthWrite:!1})}function li(){return new l({name:"CubemapToCubeUV",uniforms:{envMap:{value:null},flipEnvMap:{value:-1}},vertexShader:ci(),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:w,depthTest:!1,depthWrite:!1})}function ci(){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"}class di extends I{constructor(e=1,t={}){super(e,e,t),this.isWebGLCubeRenderTarget=!0;const n={width:e,height:e,depth:1},i=[n,n,n,n,n,n];this.texture=new O(i),this._setTextureOptions(t),this.texture.isRenderTargetTexture=!0}fromEquirectangularTexture(e,t){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 n={uniforms:{tEquirect:{value:null}},vertexShader:"\n\n\t\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t\tvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\n\t\t\t\t\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n\n\t\t\t\t}\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvWorldDirection = transformDirection( position, modelMatrix );\n\n\t\t\t\t\t#include \n\t\t\t\t\t#include \n\n\t\t\t\t}\n\t\t\t",fragmentShader:"\n\n\t\t\t\tuniform sampler2D tEquirect;\n\n\t\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t\t#include \n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvec3 direction = normalize( vWorldDirection );\n\n\t\t\t\t\tvec2 sampleUV = equirectUv( direction );\n\n\t\t\t\t\tgl_FragColor = texture2D( tEquirect, sampleUV );\n\n\t\t\t\t}\n\t\t\t"},i=new s(5,5,5),r=new l({name:"CubemapFromEquirect",uniforms:d(n.uniforms),vertexShader:n.vertexShader,fragmentShader:n.fragmentShader,side:c,blending:w});r.uniforms.tEquirect.value=t;const a=new o(i,r),u=t.minFilter;t.minFilter===B&&(t.minFilter=F);return new G(1,10,this).update(e,a),t.minFilter=u,a.geometry.dispose(),a.material.dispose(),this}clear(e,t=!0,n=!0,i=!0){const r=e.getRenderTarget();for(let r=0;r<6;r++)e.setRenderTarget(this,r),e.clear(t,n,i);e.setRenderTarget(r)}}function ui(e){let t=new WeakMap,n=new WeakMap,i=null;function r(e,t){return t===H?e.mapping=A:t===V&&(e.mapping=R),e}function a(e){const n=e.target;n.removeEventListener("dispose",a);const i=t.get(n);void 0!==i&&(t.delete(n),i.dispose())}function o(e){const t=e.target;t.removeEventListener("dispose",o);const i=n.get(t);void 0!==i&&(n.delete(t),i.dispose())}return{get:function(s,l=!1){return null==s?null:l?function(t){if(t&&t.isTexture){const r=t.mapping,a=r===H||r===V,s=r===A||r===R;if(a||s){let r=n.get(t);const l=void 0!==r?r.texture.pmremVersion:0;if(t.isRenderTargetTexture&&t.pmremVersion!==l)return null===i&&(i=new ri(e)),r=a?i.fromEquirectangular(t,r):i.fromCubemap(t,r),r.texture.pmremVersion=t.pmremVersion,n.set(t,r),r.texture;if(void 0!==r)return r.texture;{const l=t.image;return a&&l&&l.height>0||s&&l&&function(e){let t=0;const n=6;for(let i=0;i0){const o=new di(i.height);return o.fromEquirectangularTexture(e,n),t.set(n,o),n.addEventListener("dispose",a),r(o.texture,n.mapping)}return null}}}return n}(s)},dispose:function(){t=new WeakMap,n=new WeakMap,null!==i&&(i.dispose(),i=null)}}}function fi(e){const t={};function n(n){if(void 0!==t[n])return t[n];const i=e.getExtension(n);return t[n]=i,i}return{has:function(e){return null!==n(e)},init:function(){n("EXT_color_buffer_float"),n("WEBGL_clip_cull_distance"),n("OES_texture_float_linear"),n("EXT_color_buffer_half_float"),n("WEBGL_multisampled_render_to_texture"),n("WEBGL_render_shared_exponent")},get:function(e){const t=n(e);return null===t&&W("WebGLRenderer: "+e+" extension not supported."),t}}}function pi(e,t,n,i){const r={},a=new WeakMap;function o(e){const s=e.target;null!==s.index&&t.remove(s.index);for(const e in s.attributes)t.remove(s.attributes[e]);s.removeEventListener("dispose",o),delete r[s.id];const l=a.get(s);l&&(t.remove(l),a.delete(s)),i.releaseStatesOfGeometry(s),!0===s.isInstancedBufferGeometry&&delete s._maxInstanceCount,n.memory.geometries--}function s(e){const n=[],i=e.index,r=e.attributes.position;let o=0;if(void 0===r)return;if(null!==i){const e=i.array;o=i.version;for(let t=0,i=e.length;t=65535?k:z)(n,1);s.version=o;const l=a.get(e);l&&t.remove(l),a.set(e,s)}return{get:function(e,t){return!0===r[t.id]||(t.addEventListener("dispose",o),r[t.id]=!0,n.memory.geometries++),t},update:function(n){const i=n.attributes;for(const n in i)t.update(i[n],e.ARRAY_BUFFER)},getWireframeAttribute:function(e){const t=a.get(e);if(t){const n=e.index;null!==n&&t.versionn.maxTextureSize&&(T=Math.ceil(S/n.maxTextureSize),S=n.maxTextureSize);const x=new Float32Array(S*T*4*u),A=new X(x,S,T,u);A.type=M,A.needsUpdate=!0;const R=4*E;for(let C=0;C\n\t\t\t#include \n\n\t\t\tvoid main() {\n\t\t\t\tgl_FragColor = texture2D( tDiffuse, vUv );\n\n\t\t\t\t#ifdef LINEAR_TONE_MAPPING\n\t\t\t\t\tgl_FragColor.rgb = LinearToneMapping( gl_FragColor.rgb );\n\t\t\t\t#elif defined( REINHARD_TONE_MAPPING )\n\t\t\t\t\tgl_FragColor.rgb = ReinhardToneMapping( gl_FragColor.rgb );\n\t\t\t\t#elif defined( CINEON_TONE_MAPPING )\n\t\t\t\t\tgl_FragColor.rgb = CineonToneMapping( gl_FragColor.rgb );\n\t\t\t\t#elif defined( ACES_FILMIC_TONE_MAPPING )\n\t\t\t\t\tgl_FragColor.rgb = ACESFilmicToneMapping( gl_FragColor.rgb );\n\t\t\t\t#elif defined( AGX_TONE_MAPPING )\n\t\t\t\t\tgl_FragColor.rgb = AgXToneMapping( gl_FragColor.rgb );\n\t\t\t\t#elif defined( NEUTRAL_TONE_MAPPING )\n\t\t\t\t\tgl_FragColor.rgb = NeutralToneMapping( gl_FragColor.rgb );\n\t\t\t\t#elif defined( CUSTOM_TONE_MAPPING )\n\t\t\t\t\tgl_FragColor.rgb = CustomToneMapping( gl_FragColor.rgb );\n\t\t\t\t#endif\n\n\t\t\t\t#ifdef SRGB_TRANSFER\n\t\t\t\t\tgl_FragColor = sRGBTransferOETF( gl_FragColor );\n\t\t\t\t#endif\n\t\t\t}",depthTest:!1,depthWrite:!1}),d=new o(l,c),u=new C(-1,1,1,-1,0,1);let m,h=null,_=null,g=!1,v=null,S=[],M=!1;this.setSize=function(e,t){a.setSize(e,t),s.setSize(e,t);for(let n=0;n0&&!0===S[0].isRenderPass;const t=a.width,n=a.height;for(let e=0;e0)return e;const r=t*n;let a=Ri[r];if(void 0===a&&(a=new Float32Array(r),Ri[r]=a),0!==t){i.toArray(a,0);for(let i=1,r=0;i!==t;++i)r+=n,e[i].toArray(a,r)}return a}function Di(e,t){if(e.length!==t.length)return!1;for(let n=0,i=e.length;n0&&(this.seq=i.concat(r))}setValue(e,t,n,i){const r=this.map[t];void 0!==r&&r.setValue(e,n,i)}setOptional(e,t,n){const i=t[n];void 0!==i&&this.setValue(e,n,i)}static upload(e,t,n,i){for(let r=0,a=t.length;r!==a;++r){const a=t[r],o=n[a.id];!1!==o.needsUpdate&&a.setValue(e,o.value,i)}}static seqWithValue(e,t){const n=[];for(let i=0,r=e.length;i!==r;++i){const r=e[i];r.id in t&&n.push(r)}return n}}function Rr(e,t,n){const i=e.createShader(t);return e.shaderSource(i,n),e.compileShader(i),i}let br=0;const Cr=new e;function Pr(e,t,n){const i=e.getShaderParameter(t,e.COMPILE_STATUS),r=(e.getShaderInfoLog(t)||"").trim();if(i&&""===r)return"";const a=/ERROR: 0:(\d+)/.exec(r);if(a){const i=parseInt(a[1]);return n.toUpperCase()+"\n\n"+r+"\n\n"+function(e,t){const n=e.split("\n"),i=[],r=Math.max(t-6,0),a=Math.min(t+6,n.length);for(let e=r;e":" "} ${r}: ${n[e]}`)}return i.join("\n")}(e.getShaderSource(t),i)}return r}function Lr(e,t){const n=function(e){f._getMatrix(Cr,f.workingColorSpace,e);const t=`mat3( ${Cr.elements.map(e=>e.toFixed(4))} )`;switch(f.getTransfer(e)){case pe:return[t,"LinearTransferOETF"];case p:return[t,"sRGBTransferOETF"];default:return v("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")}const Ur={[te]:"Linear",[ee]:"Reinhard",[J]:"Cineon",[Q]:"ACESFilmic",[$]:"AgX",[Z]:"Neutral",[j]:"Custom"};function Dr(e,t){const n=Ur[t];return void 0===n?(v("WebGLProgram: Unsupported toneMapping:",t),"vec3 "+e+"( vec3 color ) { return LinearToneMapping( color ); }"):"vec3 "+e+"( vec3 color ) { return "+n+"ToneMapping( color ); }"}const wr=new r;function Ir(){f.getLuminanceCoefficients(wr);return["float luminance( const in vec3 rgb ) {",`\tconst vec3 weights = vec3( ${wr.x.toFixed(4)}, ${wr.y.toFixed(4)}, ${wr.z.toFixed(4)} );`,"\treturn dot( weights, rgb );","}"].join("\n")}function Nr(e){return""!==e}function yr(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 Fr(e,t){return e.replace(/NUM_CLIPPING_PLANES/g,t.numClippingPlanes).replace(/UNION_CLIPPING_PLANES/g,t.numClippingPlanes-t.numClipIntersection)}const Or=/^[ \t]*#include +<([\w\d./]+)>/gm;function Br(e){return e.replace(Or,Hr)}const Gr=new Map;function Hr(e,t){let n=Bn[t];if(void 0===n){const e=Gr.get(t);if(void 0===e)throw new Error("Can not resolve #include <"+t+">");n=Bn[e],v('WebGLRenderer: Shader chunk "%s" has been deprecated. Use "%s" instead.',t,e)}return Br(n)}const Vr=/#pragma unroll_loop_start\s+for\s*\(\s*int\s+i\s*=\s*(\d+)\s*;\s*i\s*<\s*(\d+)\s*;\s*i\s*\+\+\s*\)\s*{([\s\S]+?)}\s+#pragma unroll_loop_end/g;function Wr(e){return e.replace(Vr,kr)}function kr(e,t,n,i){let r="";for(let e=parseInt(t);e0&&(_+="\n"),g=["#define SHADER_TYPE "+n.shaderType,"#define SHADER_NAME "+n.shaderName,m].filter(Nr).join("\n"),g.length>0&&(g+="\n")):(_=[zr(n),"#define SHADER_TYPE "+n.shaderType,"#define SHADER_NAME "+n.shaderName,m,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 "+d:"",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 "+l:"",n.sizeAttenuation?"#define USE_SIZEATTENUATION":"",n.numLightProbes>0?"#define USE_LIGHT_PROBES":"",n.logarithmicDepthBuffer?"#define USE_LOGARITHMIC_DEPTH_BUFFER":"",n.reversedDepthBuffer?"#define USE_REVERSED_DEPTH_BUFFER":"","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(Nr).join("\n"),g=[zr(n),"#define SHADER_TYPE "+n.shaderType,"#define SHADER_NAME "+n.shaderName,m,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 "+c:"",n.envMap?"#define "+d:"",n.envMap?"#define "+u:"",f?"#define CUBEUV_TEXEL_WIDTH "+f.texelWidth:"",f?"#define CUBEUV_TEXEL_HEIGHT "+f.texelHeight:"",f?"#define CUBEUV_MAX_MIP "+f.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.packedNormalMap?"#define USE_PACKED_NORMALMAP":"",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?"#define USE_COLOR":"",n.vertexAlphas||n.batchingColor?"#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 "+l:"",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_LOGARITHMIC_DEPTH_BUFFER":"",n.reversedDepthBuffer?"#define USE_REVERSED_DEPTH_BUFFER":"","uniform mat4 viewMatrix;","uniform vec3 cameraPosition;","uniform bool isOrthographic;",n.toneMapping!==L?"#define TONE_MAPPING":"",n.toneMapping!==L?Bn.tonemapping_pars_fragment:"",n.toneMapping!==L?Dr("toneMapping",n.toneMapping):"",n.dithering?"#define DITHERING":"",n.opaque?"#define OPAQUE":"",Bn.colorspace_pars_fragment,Lr("linearToOutputTexel",n.outputColorSpace),Ir(),n.useDepthPacking?"#define DEPTH_PACKING "+n.depthPacking:"","\n"].filter(Nr).join("\n")),o=Br(o),o=yr(o,n),o=Fr(o,n),s=Br(s),s=yr(s,n),s=Fr(s,n),o=Wr(o),s=Wr(s),!0!==n.isRawShaderMaterial&&(E="#version 300 es\n",_=[p,"#define attribute in","#define varying out","#define texture2D texture"].join("\n")+"\n"+_,g=["#define varying in",n.glslVersion===se?"":"layout(location = 0) out highp vec4 pc_fragColor;",n.glslVersion===se?"":"#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"+g);const S=E+_+o,M=E+g+s,T=Rr(r,r.VERTEX_SHADER,S),x=Rr(r,r.FRAGMENT_SHADER,M);function A(t){if(e.debug.checkShaderErrors){const n=r.getProgramInfoLog(h)||"",i=r.getShaderInfoLog(T)||"",a=r.getShaderInfoLog(x)||"",o=n.trim(),s=i.trim(),l=a.trim();let c=!0,d=!0;if(!1===r.getProgramParameter(h,r.LINK_STATUS))if(c=!1,"function"==typeof e.debug.onShaderError)e.debug.onShaderError(r,h,T,x);else{const e=Pr(r,T,"vertex"),n=Pr(r,x,"fragment");D("THREE.WebGLProgram: Shader Error "+r.getError()+" - VALIDATE_STATUS "+r.getProgramParameter(h,r.VALIDATE_STATUS)+"\n\nMaterial Name: "+t.name+"\nMaterial Type: "+t.type+"\n\nProgram Info Log: "+o+"\n"+e+"\n"+n)}else""!==o?v("WebGLProgram: Program Info Log:",o):""!==s&&""!==l||(d=!1);d&&(t.diagnostics={runnable:c,programLog:o,vertexShader:{log:s,prefix:_},fragmentShader:{log:l,prefix:g}})}r.deleteShader(T),r.deleteShader(x),R=new Ar(r,h),b=function(e,t){const n={},i=e.getProgramParameter(t,e.ACTIVE_ATTRIBUTES);for(let r=0;r0,Q=r.clearcoat>0,J=r.dispersion>0,ee=r.iridescence>0,te=r.sheen>0,ne=r.transmission>0,ie=$&&!!r.anisotropyMap,re=Q&&!!r.clearcoatMap,ae=Q&&!!r.clearcoatNormalMap,oe=Q&&!!r.clearcoatRoughnessMap,se=ee&&!!r.iridescenceMap,le=ee&&!!r.iridescenceThicknessMap,ce=te&&!!r.sheenColorMap,de=te&&!!r.sheenRoughnessMap,ue=!!r.specularMap,fe=!!r.specularColorMap,pe=!!r.specularIntensityMap,me=ne&&!!r.transmissionMap,Ee=ne&&!!r.thicknessMap,xe=!!r.gradientMap,Ae=!!r.alphaMap,Re=r.alphaTest>0,be=!!r.alphaHash,Ce=!!r.extensions;let Pe=L;r.toneMapped&&(null!==F&&!0!==F.isXRRenderTarget||(Pe=e.toneMapping));const Le={shaderID:C,shaderType:r.type,shaderName:r.name,vertexShader:D,fragmentShader:w,defines:r.defines,customVertexShaderID:I,customFragmentShaderID:N,isRawShaderMaterial:!0===r.isRawShaderMaterial,glslVersion:r.glslVersion,precision:_,batching:G,batchingColor:G&&null!==S._colorsTexture,instancing:B,instancingColor:B&&null!==S.instanceColor,instancingMorph:B&&null!==S.morphTexture,outputColorSpace:null===F?e.outputColorSpace:!0===F.isXRRenderTarget?F.texture.colorSpace:f.workingColorSpace,alphaToCoverage:!!r.alphaToCoverage,map:H,matcap:V,envMap:W,envMapMode:W&&R.mapping,envMapCubeUVHeight:b,aoMap:k,lightMap:z,bumpMap:X,normalMap:Y,displacementMap:K,emissiveMap:q,normalMapObjectSpace:Y&&r.normalMapType===ve,normalMapTangentSpace:Y&&r.normalMapType===ge,packedNormalMap:Y&&r.normalMapType===ge&&(Ue=r.normalMap.format,Ue===Se||Ue===Me||Ue===Te),metalnessMap:j,roughnessMap:Z,anisotropy:$,anisotropyMap:ie,clearcoat:Q,clearcoatMap:re,clearcoatNormalMap:ae,clearcoatRoughnessMap:oe,dispersion:J,iridescence:ee,iridescenceMap:se,iridescenceThicknessMap:le,sheen:te,sheenColorMap:ce,sheenRoughnessMap:de,specularMap:ue,specularColorMap:fe,specularIntensityMap:pe,transmission:ne,transmissionMap:me,thicknessMap:Ee,gradientMap:xe,opaque:!1===r.transparent&&r.blending===_e&&!1===r.alphaToCoverage,alphaMap:Ae,alphaTest:Re,alphaHash:be,combine:r.combine,mapUv:H&&E(r.map.channel),aoMapUv:k&&E(r.aoMap.channel),lightMapUv:z&&E(r.lightMap.channel),bumpMapUv:X&&E(r.bumpMap.channel),normalMapUv:Y&&E(r.normalMap.channel),displacementMapUv:K&&E(r.displacementMap.channel),emissiveMapUv:q&&E(r.emissiveMap.channel),metalnessMapUv:j&&E(r.metalnessMap.channel),roughnessMapUv:Z&&E(r.roughnessMap.channel),anisotropyMapUv:ie&&E(r.anisotropyMap.channel),clearcoatMapUv:re&&E(r.clearcoatMap.channel),clearcoatNormalMapUv:ae&&E(r.clearcoatNormalMap.channel),clearcoatRoughnessMapUv:oe&&E(r.clearcoatRoughnessMap.channel),iridescenceMapUv:se&&E(r.iridescenceMap.channel),iridescenceThicknessMapUv:le&&E(r.iridescenceThicknessMap.channel),sheenColorMapUv:ce&&E(r.sheenColorMap.channel),sheenRoughnessMapUv:de&&E(r.sheenRoughnessMap.channel),specularMapUv:ue&&E(r.specularMap.channel),specularColorMapUv:fe&&E(r.specularColorMap.channel),specularIntensityMapUv:pe&&E(r.specularIntensityMap.channel),transmissionMapUv:me&&E(r.transmissionMap.channel),thicknessMapUv:Ee&&E(r.thicknessMap.channel),alphaMapUv:Ae&&E(r.alphaMap.channel),vertexTangents:!!T.attributes.tangent&&(Y||$),vertexColors:r.vertexColors,vertexAlphas:!0===r.vertexColors&&!!T.attributes.color&&4===T.attributes.color.itemSize,pointsUvs:!0===S.isPoints&&!!T.attributes.uv&&(H||Ae),fog:!!M,useFog:!0===r.fog,fogExp2:!!M&&M.isFogExp2,flatShading:!1===r.wireframe&&(!0===r.flatShading||void 0===T.attributes.normal&&!1===Y&&(r.isMeshLambertMaterial||r.isMeshPhongMaterial||r.isMeshStandardMaterial||r.isMeshPhysicalMaterial)),sizeAttenuation:!0===r.sizeAttenuation,logarithmicDepthBuffer:h,reversedDepthBuffer:O,skinning:!0===S.isSkinnedMesh,morphTargets:void 0!==T.morphAttributes.position,morphNormals:void 0!==T.morphAttributes.normal,morphColors:void 0!==T.morphAttributes.color,morphTargetsCount:U,morphTextureStride:y,numDirLights:s.directional.length,numPointLights:s.point.length,numSpotLights:s.spot.length,numSpotLightMaps:s.spotLightMap.length,numRectAreaLights:s.rectArea.length,numHemiLights:s.hemi.length,numDirLightShadows:s.directionalShadowMap.length,numPointLightShadows:s.pointShadowMap.length,numSpotLightShadows:s.spotShadowMap.length,numSpotLightShadowsWithMaps:s.numSpotLightShadowsWithMaps,numLightProbes:s.numLightProbes,numClippingPlanes:o.numPlanes,numClipIntersection:o.numIntersection,dithering:r.dithering,shadowMapEnabled:e.shadowMap.enabled&&u.length>0,shadowMapType:e.shadowMap.type,toneMapping:Pe,decodeVideoTexture:H&&!0===r.map.isVideoTexture&&f.getTransfer(r.map.colorSpace)===p,decodeVideoTextureEmissive:q&&!0===r.emissiveMap.isVideoTexture&&f.getTransfer(r.emissiveMap.colorSpace)===p,premultipliedAlpha:r.premultipliedAlpha,doubleSided:r.side===he,flipSided:r.side===c,useDepthPacking:r.depthPacking>=0,depthPacking:r.depthPacking||0,index0AttributeName:r.index0AttributeName,extensionClipCullDistance:Ce&&!0===r.extensions.clipCullDistance&&n.has("WEBGL_clip_cull_distance"),extensionMultiDraw:(Ce&&!0===r.extensions.multiDraw||G)&&n.has("WEBGL_multi_draw"),rendererExtensionParallelShaderCompile:n.has("KHR_parallel_shader_compile"),customProgramCacheKey:r.customProgramCacheKey()};var Ue;return Le.vertexUv1s=d.has(1),Le.vertexUv2s=d.has(2),Le.vertexUv3s=d.has(3),d.clear(),Le},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){s.disableAll(),t.instancing&&s.enable(0);t.instancingColor&&s.enable(1);t.instancingMorph&&s.enable(2);t.matcap&&s.enable(3);t.envMap&&s.enable(4);t.normalMapObjectSpace&&s.enable(5);t.normalMapTangentSpace&&s.enable(6);t.clearcoat&&s.enable(7);t.iridescence&&s.enable(8);t.alphaTest&&s.enable(9);t.vertexColors&&s.enable(10);t.vertexAlphas&&s.enable(11);t.vertexUv1s&&s.enable(12);t.vertexUv2s&&s.enable(13);t.vertexUv3s&&s.enable(14);t.vertexTangents&&s.enable(15);t.anisotropy&&s.enable(16);t.alphaHash&&s.enable(17);t.batching&&s.enable(18);t.dispersion&&s.enable(19);t.batchingColor&&s.enable(20);t.gradientMap&&s.enable(21);t.packedNormalMap&&s.enable(22);e.push(s.mask),s.disableAll(),t.fog&&s.enable(0);t.useFog&&s.enable(1);t.flatShading&&s.enable(2);t.logarithmicDepthBuffer&&s.enable(3);t.reversedDepthBuffer&&s.enable(4);t.skinning&&s.enable(5);t.morphTargets&&s.enable(6);t.morphNormals&&s.enable(7);t.morphColors&&s.enable(8);t.premultipliedAlpha&&s.enable(9);t.shadowMapEnabled&&s.enable(10);t.doubleSided&&s.enable(11);t.flipSided&&s.enable(12);t.useDepthPacking&&s.enable(13);t.dithering&&s.enable(14);t.transmission&&s.enable(15);t.sheen&&s.enable(16);t.opaque&&s.enable(17);t.pointsUvs&&s.enable(18);t.decodeVideoTexture&&s.enable(19);t.decodeVideoTextureEmissive&&s.enable(20);t.alphaToCoverage&&s.enable(21);e.push(s.mask)}(n,t),n.push(e.outputColorSpace)),n.push(t.customProgramCacheKey),n.join()},getUniforms:function(e){const t=g[e.type];let n;if(t){const e=Hn[t];n=me.clone(e.uniforms)}else n=e.uniforms;return n},acquireProgram:function(t,n){let i=m.get(n);return void 0!==i?++i.usedTimes:(i=new jr(e,n,t,r),u.push(i),m.set(n,i)),i},releaseProgram:function(e){if(0===--e.usedTimes){const t=u.indexOf(e);u[t]=u[u.length-1],u.pop(),m.delete(e.cacheKey),e.destroy()}},releaseShaderCache:function(e){l.remove(e)},programs:u,dispose:function(){l.dispose()}}}function ea(){let e=new WeakMap;return{has:function(t){return e.has(t)},get:function(t){let n=e.get(t);return void 0===n&&(n={},e.set(t,n)),n},remove:function(t){e.delete(t)},update:function(t,n,i){e.get(t)[n]=i},dispose:function(){e=new WeakMap}}}function ta(e,t){return e.groupOrder!==t.groupOrder?e.groupOrder-t.groupOrder:e.renderOrder!==t.renderOrder?e.renderOrder-t.renderOrder:e.material.id!==t.material.id?e.material.id-t.material.id:e.materialVariant!==t.materialVariant?e.materialVariant-t.materialVariant:e.z!==t.z?e.z-t.z:e.id-t.id}function na(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 ia(){const e=[];let t=0;const n=[],i=[],r=[];function a(e){let t=0;return e.isInstancedMesh&&(t+=2),e.isSkinnedMesh&&(t+=1),t}function o(n,i,r,o,s,l){let c=e[t];return void 0===c?(c={id:n.id,object:n,geometry:i,material:r,materialVariant:a(n),groupOrder:o,renderOrder:n.renderOrder,z:s,group:l},e[t]=c):(c.id=n.id,c.object=n,c.geometry=i,c.material=r,c.materialVariant=a(n),c.groupOrder=o,c.renderOrder=n.renderOrder,c.z=s,c.group=l),t++,c}return{opaque:n,transmissive:i,transparent:r,init:function(){t=0,n.length=0,i.length=0,r.length=0},push:function(e,t,a,s,l,c){const d=o(e,t,a,s,l,c);a.transmission>0?i.push(d):!0===a.transparent?r.push(d):n.push(d)},unshift:function(e,t,a,s,l,c){const d=o(e,t,a,s,l,c);a.transmission>0?i.unshift(d):!0===a.transparent?r.unshift(d):n.unshift(d)},finish:function(){for(let n=t,i=e.length;n1&&n.sort(e||ta),i.length>1&&i.sort(t||na),r.length>1&&r.sort(t||na)}}}function ra(){let e=new WeakMap;return{get:function(t,n){const i=e.get(t);let r;return void 0===i?(r=new ia,e.set(t,[r])):n>=i.length?(r=new ia,i.push(r)):r=i[n],r},dispose:function(){e=new WeakMap}}}function aa(){const e={};return{get:function(t){if(void 0!==e[t.id])return e[t.id];let i;switch(t.type){case"DirectionalLight":i={direction:new r,color:new n};break;case"SpotLight":i={position:new r,direction:new r,color:new n,distance:0,coneCos:0,penumbraCos:0,decay:0};break;case"PointLight":i={position:new r,color:new n,distance:0,decay:0};break;case"HemisphereLight":i={direction:new r,skyColor:new n,groundColor:new n};break;case"RectAreaLight":i={color:new n,position:new r,halfWidth:new r,halfHeight:new r}}return e[t.id]=i,i}}}let oa=0;function sa(e,t){return(t.castShadow?2:0)-(e.castShadow?2:0)+(t.map?1:0)-(e.map?1:0)}function la(e){const n=new aa,i=function(){const e={};return{get:function(n){if(void 0!==e[n.id])return e[n.id];let i;switch(n.type){case"DirectionalLight":case"SpotLight":i={shadowIntensity:1,shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new t};break;case"PointLight":i={shadowIntensity:1,shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new t,shadowCameraNear:1,shadowCameraFar:1e3}}return e[n.id]=i,i}}}(),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 r);const o=new r,s=new u,l=new u;return{setup:function(t){let r=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(sa);for(let e=0,E=t.length;e0&&(!0===e.has("OES_texture_float_linear")?(a.rectAreaLTC1=Gn.LTC_FLOAT_1,a.rectAreaLTC2=Gn.LTC_FLOAT_2):(a.rectAreaLTC1=Gn.LTC_HALF_1,a.rectAreaLTC2=Gn.LTC_HALF_2)),a.ambient[0]=r,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=oa++)},setupView:function(e,t){let n=0,i=0,r=0,c=0,d=0;const u=t.matrixWorldInverse;for(let t=0,f=e.length;t=r.length?(a=new ca(e),r.push(a)):a=r[i],a},dispose:function(){t=new WeakMap}}}const ua=[new r(1,0,0),new r(-1,0,0),new r(0,1,0),new r(0,-1,0),new r(0,0,1),new r(0,0,-1)],fa=[new r(0,-1,0),new r(0,-1,0),new r(0,0,1),new r(0,0,-1),new r(0,-1,0),new r(0,-1,0)],pa=new u,ma=new r,ha=new r;function _a(e,n,i){let r=new Ue;const a=new t,s=new t,d=new Y,u=new xe,f=new Ae,p={},m=i.maxTextureSize,_={[h]:c,[c]:h,[he]:he},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;\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 = texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( uvOffset, 0.0 ) * radius ) / resolution ).rg;\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 = texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( 0.0, uvOffset ) * radius ) / resolution ).r;\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( max( 0.0, squared_mean - mean * mean ) );\n\tgl_FragColor = vec4( mean, std_dev, 0.0, 1.0 );\n}"}),S=g.clone();S.defines.HORIZONTAL_PASS=1;const T=new b;T.setAttribute("position",new N(new Float32Array([-1,-1,.5,3,-1,.5,-1,3,.5]),3));const x=new o(T,g),A=this;this.enabled=!1,this.autoUpdate=!0,this.needsUpdate=!1,this.type=ce;let R=this.type;function C(t,i){const r=n.update(x);g.defines.VSM_SAMPLES!==t.blurSamples&&(g.defines.VSM_SAMPLES=t.blurSamples,S.defines.VSM_SAMPLES=t.blurSamples,g.needsUpdate=!0,S.needsUpdate=!0),null===t.mapPass&&(t.mapPass=new I(a.x,a.y,{format:Se,type:E})),g.uniforms.shadow_pass.value=t.map.depthTexture,g.uniforms.resolution.value=t.mapSize,g.uniforms.radius.value=t.radius,e.setRenderTarget(t.mapPass),e.clear(),e.renderBufferDirect(i,null,r,g,x,null),S.uniforms.shadow_pass.value=t.mapPass.texture,S.uniforms.resolution.value=t.mapSize,S.uniforms.radius.value=t.radius,e.setRenderTarget(t.map),e.clear(),e.renderBufferDirect(i,null,r,S,x,null)}function P(t,n,i,r){let a=null;const o=!0===i.isPointLight?t.customDistanceMaterial:t.customDepthMaterial;if(void 0!==o)a=o;else if(a=!0===i.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 i=p[e];void 0===i&&(i={},p[e]=i);let r=i[t];void 0===r&&(r=a.clone(),i[t]=r,n.addEventListener("dispose",U)),a=r}if(a.visible=n.visible,a.wireframe=n.wireframe,a.side=r===le?null!==n.shadowSide?n.shadowSide:n.side:null!==n.shadowSide?n.shadowSide:_[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===i.isPointLight&&!0===a.isMeshDistanceMaterial){e.properties.get(a).light=i}return a}function L(t,i,a,o,s){if(!1===t.visible)return;if(t.layers.test(i.layers)&&(t.isMesh||t.isLine||t.isPoints)&&(t.castShadow||t.receiveShadow&&s===le)&&(!t.frustumCulled||r.intersectsObject(t))){t.modelViewMatrix.multiplyMatrices(a.matrixWorldInverse,t.matrixWorld);const r=n.update(t),l=t.material;if(Array.isArray(l)){const n=r.groups;for(let c=0,d=n.length;ce.needsUpdate=!0):e.material.needsUpdate=!0)});for(let o=0,l=t.length;om||a.y>m)&&(a.x>m&&(s.x=Math.floor(m/p.x),a.x=s.x*p.x,c.mapSize.x=s.x),a.y>m&&(s.y=Math.floor(m/p.y),a.y=s.y*p.y,c.mapSize.y=s.y));const h=e.state.buffers.depth.getReversed();if(c.camera._reversedDepth=h,null===c.map||!0===f){if(null!==c.map&&(null!==c.map.depthTexture&&(c.map.depthTexture.dispose(),c.map.depthTexture=null),c.map.dispose()),this.type===le){if(l.isPointLight){v("WebGLShadowMap: VSM shadow maps are not supported for PointLights. Use PCF or BasicShadowMap instead.");continue}c.map=new I(a.x,a.y,{format:Se,type:E,minFilter:F,magFilter:F,generateMipmaps:!1}),c.map.texture.name=l.name+".shadowMap",c.map.depthTexture=new ae(a.x,a.y,M),c.map.depthTexture.name=l.name+".shadowMapDepth",c.map.depthTexture.format=be,c.map.depthTexture.compareFunction=null,c.map.depthTexture.minFilter=Ce,c.map.depthTexture.magFilter=Ce}else l.isPointLight?(c.map=new di(a.x),c.map.depthTexture=new Pe(a.x,Le)):(c.map=new I(a.x,a.y),c.map.depthTexture=new ae(a.x,a.y,Le)),c.map.depthTexture.name=l.name+".shadowMap",c.map.depthTexture.format=be,this.type===ce?(c.map.depthTexture.compareFunction=h?ie:re,c.map.depthTexture.minFilter=F,c.map.depthTexture.magFilter=F):(c.map.depthTexture.compareFunction=null,c.map.depthTexture.minFilter=Ce,c.map.depthTexture.magFilter=Ce);c.camera.updateProjectionMatrix()}const _=c.map.isWebGLCubeRenderTarget?6:1;for(let t=0;t<_;t++){if(c.map.isWebGLCubeRenderTarget)e.setRenderTarget(c.map,t),e.clear();else{0===t&&(e.setRenderTarget(c.map),e.clear());const n=c.getViewport(t);d.set(s.x*n.x,s.y*n.y,s.x*n.z,s.y*n.w),u.viewport(d)}if(l.isPointLight){const e=c.camera,n=c.matrix,i=l.distance||e.far;i!==e.far&&(e.far=i,e.updateProjectionMatrix()),ma.setFromMatrixPosition(l.matrixWorld),e.position.copy(ma),ha.copy(e.position),ha.add(ua[t]),e.up.copy(fa[t]),e.lookAt(ha),e.updateMatrixWorld(),n.makeTranslation(-ma.x,-ma.y,-ma.z),pa.multiplyMatrices(e.projectionMatrix,e.matrixWorldInverse),c._frustum.setFromProjectionMatrix(pa,e.coordinateSystem,e.reversedDepth)}else c.updateMatrices(l);r=c.getFrustum(),L(n,i,c.camera,l,this.type)}!0!==c.isPointLightShadow&&this.type===le&&C(c,i),c.needsUpdate=!1}R=this.type,A.needsUpdate=!1,e.setRenderTarget(o,l,c)}}function ga(e,t){const i=new function(){let t=!1;const n=new Y;let i=null;const r=new Y(0,0,0,0);return{setMask:function(n){i===n||t||(e.colorMask(n,n,n,n),i=n)},setLocked:function(e){t=e},setClear:function(t,i,a,o,s){!0===s&&(t*=o,i*=o,a*=o),n.set(t,i,a,o),!1===r.equals(n)&&(e.clearColor(t,i,a,o),r.copy(n))},reset:function(){t=!1,i=null,r.set(-1,0,0,0)}}},r=new function(){let n=!1,i=!1,r=null,a=null,o=null;return{setReversed:function(e){if(i!==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),i=e;const r=o;o=null,this.setClear(r)}},getReversed:function(){return i},setTest:function(t){t?z(e.DEPTH_TEST):X(e.DEPTH_TEST)},setMask:function(t){r===t||n||(e.depthMask(t),r=t)},setFunc:function(t){if(i&&(t=dt[t]),a!==t){switch(t){case nt:e.depthFunc(e.NEVER);break;case tt:e.depthFunc(e.ALWAYS);break;case et:e.depthFunc(e.LESS);break;case De:e.depthFunc(e.LEQUAL);break;case Je:e.depthFunc(e.EQUAL);break;case Qe:e.depthFunc(e.GEQUAL);break;case $e:e.depthFunc(e.GREATER);break;case Ze:e.depthFunc(e.NOTEQUAL);break;default:e.depthFunc(e.LEQUAL)}a=t}},setLocked:function(e){n=e},setClear:function(t){o!==t&&(o=t,i&&(t=1-t),e.clearDepth(t))},reset:function(){n=!1,r=null,a=null,o=null,i=!1}}},a=new function(){let t=!1,n=null,i=null,r=null,a=null,o=null,s=null,l=null,c=null;return{setTest:function(n){t||(n?z(e.STENCIL_TEST):X(e.STENCIL_TEST))},setMask:function(i){n===i||t||(e.stencilMask(i),n=i)},setFunc:function(t,n,o){i===t&&r===n&&a===o||(e.stencilFunc(t,n,o),i=t,r=n,a=o)},setOp:function(t,n,i){o===t&&s===n&&l===i||(e.stencilOp(t,n,i),o=t,s=n,l=i)},setLocked:function(e){t=e},setClear:function(t){c!==t&&(e.clearStencil(t),c=t)},reset:function(){t=!1,n=null,i=null,r=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,M=null,T=new n(0,0,0),x=0,A=!1,R=null,b=null,C=null,P=null,L=null;const U=e.getParameter(e.MAX_COMBINED_TEXTURE_IMAGE_UNITS);let I=!1,N=0;const y=e.getParameter(e.VERSION);-1!==y.indexOf("WebGL")?(N=parseFloat(/^WebGL (\d)/.exec(y)[1]),I=N>=1):-1!==y.indexOf("OpenGL ES")&&(N=parseFloat(/^OpenGL ES (\d)/.exec(y)[1]),I=N>=2);let F=null,O={};const B=e.getParameter(e.SCISSOR_BOX),G=e.getParameter(e.VIEWPORT),H=(new Y).fromArray(B),V=(new Y).fromArray(G);function W(t,n,i,r){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||r.height>n)&&(i=n/Math.max(r.width,r.height)),i<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(i*r.width),a=Math.floor(i*r.height);void 0===m&&(m=g(n,a));const o=t?g(n,a):m;o.width=n,o.height=a;return o.getContext("2d").drawImage(e,0,0,n,a),v("WebGLRenderer: Texture has been resized from ("+r.width+"x"+r.height+") to ("+n+"x"+a+")."),o}return"data"in e&&v("WebGLRenderer: Image in DataTexture is too big ("+r.width+"x"+r.height+")."),e}return e}function x(e){return e.generateMipmaps}function A(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 b(t,i,r,a,o=!1){if(null!==t){if(void 0!==e[t])return e[t];v("WebGLRenderer: Attempt to use non-existing WebGL internal format '"+t+"'")}let s=i;if(i===e.RED&&(r===e.FLOAT&&(s=e.R32F),r===e.HALF_FLOAT&&(s=e.R16F),r===e.UNSIGNED_BYTE&&(s=e.R8)),i===e.RED_INTEGER&&(r===e.UNSIGNED_BYTE&&(s=e.R8UI),r===e.UNSIGNED_SHORT&&(s=e.R16UI),r===e.UNSIGNED_INT&&(s=e.R32UI),r===e.BYTE&&(s=e.R8I),r===e.SHORT&&(s=e.R16I),r===e.INT&&(s=e.R32I)),i===e.RG&&(r===e.FLOAT&&(s=e.RG32F),r===e.HALF_FLOAT&&(s=e.RG16F),r===e.UNSIGNED_BYTE&&(s=e.RG8)),i===e.RG_INTEGER&&(r===e.UNSIGNED_BYTE&&(s=e.RG8UI),r===e.UNSIGNED_SHORT&&(s=e.RG16UI),r===e.UNSIGNED_INT&&(s=e.RG32UI),r===e.BYTE&&(s=e.RG8I),r===e.SHORT&&(s=e.RG16I),r===e.INT&&(s=e.RG32I)),i===e.RGB_INTEGER&&(r===e.UNSIGNED_BYTE&&(s=e.RGB8UI),r===e.UNSIGNED_SHORT&&(s=e.RGB16UI),r===e.UNSIGNED_INT&&(s=e.RGB32UI),r===e.BYTE&&(s=e.RGB8I),r===e.SHORT&&(s=e.RGB16I),r===e.INT&&(s=e.RGB32I)),i===e.RGBA_INTEGER&&(r===e.UNSIGNED_BYTE&&(s=e.RGBA8UI),r===e.UNSIGNED_SHORT&&(s=e.RGBA16UI),r===e.UNSIGNED_INT&&(s=e.RGBA32UI),r===e.BYTE&&(s=e.RGBA8I),r===e.SHORT&&(s=e.RGBA16I),r===e.INT&&(s=e.RGBA32I)),i===e.RGB&&(r===e.UNSIGNED_INT_5_9_9_9_REV&&(s=e.RGB9_E5),r===e.UNSIGNED_INT_10F_11F_11F_REV&&(s=e.R11F_G11F_B10F)),i===e.RGBA){const t=o?pe:f.getTransfer(a);r===e.FLOAT&&(s=e.RGBA32F),r===e.HALF_FLOAT&&(s=e.RGBA16F),r===e.UNSIGNED_BYTE&&(s=t===p?e.SRGB8_ALPHA8:e.RGBA8),r===e.UNSIGNED_SHORT_4_4_4_4&&(s=e.RGBA4),r===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 C(t,n){let i;return t?null===n||n===Le||n===Pt?i=e.DEPTH24_STENCIL8:n===M?i=e.DEPTH32F_STENCIL8:n===Lt&&(i=e.DEPTH24_STENCIL8,v("DepthTexture: 16 bit depth attachment is not supported with stencil. Using 24-bit attachment.")):null===n||n===Le||n===Pt?i=e.DEPTH_COMPONENT24:n===M?i=e.DEPTH_COMPONENT32F:n===Lt&&(i=e.DEPTH_COMPONENT16),i}function P(e,t){return!0===x(e)||e.isFramebufferTexture&&e.minFilter!==Ce&&e.minFilter!==F?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=r.get(e);if(void 0===t.__webglInit)return;const n=e.source,i=h.get(n);if(i){const r=i[t.__cacheKey];r.usedTimes--,0===r.usedTimes&&w(e),0===Object.keys(i).length&&h.delete(n)}r.remove(e)}(t),t.isVideoTexture&&u.delete(t)}function U(t){const n=t.target;n.removeEventListener("dispose",U),function(t){const n=r.get(t);t.depthTexture&&(t.depthTexture.dispose(),r.remove(t.depthTexture));if(t.isWebGLCubeRenderTarget)for(let t=0;t<6;t++){if(Array.isArray(n.__webglFramebuffer[t]))for(let i=0;i0&&a.__version!==t.version){const e=t.image;if(null===e)v("WebGLRenderer: Texture marked for update but no image data found.");else{if(!1!==e.complete)return void z(a,t,n);v("WebGLRenderer: Texture marked for update but image is incomplete")}}else t.isExternalTexture&&(a.__webglTexture=t.sourceTexture?t.sourceTexture:null);i.bindTexture(e.TEXTURE_2D,a.__webglTexture,e.TEXTURE0+n)}const O={[ht]:e.REPEAT,[mt]:e.CLAMP_TO_EDGE,[pt]:e.MIRRORED_REPEAT},G={[Ce]:e.NEAREST,[vt]:e.NEAREST_MIPMAP_NEAREST,[gt]:e.NEAREST_MIPMAP_LINEAR,[F]:e.LINEAR,[_t]:e.LINEAR_MIPMAP_NEAREST,[B]:e.LINEAR_MIPMAP_LINEAR},H={[At]:e.NEVER,[xt]:e.ALWAYS,[Tt]:e.LESS,[re]:e.LEQUAL,[Mt]:e.EQUAL,[ie]:e.GEQUAL,[St]:e.GREATER,[Et]:e.NOTEQUAL};function V(t,i){if(i.type!==M||!1!==n.has("OES_texture_float_linear")||i.magFilter!==F&&i.magFilter!==_t&&i.magFilter!==gt&&i.magFilter!==B&&i.minFilter!==F&&i.minFilter!==_t&&i.minFilter!==gt&&i.minFilter!==B||v("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,O[i.wrapS]),e.texParameteri(t,e.TEXTURE_WRAP_T,O[i.wrapT]),t!==e.TEXTURE_3D&&t!==e.TEXTURE_2D_ARRAY||e.texParameteri(t,e.TEXTURE_WRAP_R,O[i.wrapR]),e.texParameteri(t,e.TEXTURE_MAG_FILTER,G[i.magFilter]),e.texParameteri(t,e.TEXTURE_MIN_FILTER,G[i.minFilter]),i.compareFunction&&(e.texParameteri(t,e.TEXTURE_COMPARE_MODE,e.COMPARE_REF_TO_TEXTURE),e.texParameteri(t,e.TEXTURE_COMPARE_FUNC,H[i.compareFunction])),!0===n.has("EXT_texture_filter_anisotropic")){if(i.magFilter===Ce)return;if(i.minFilter!==gt&&i.minFilter!==B)return;if(i.type===M&&!1===n.has("OES_texture_float_linear"))return;if(i.anisotropy>1||r.get(i).__currentAnisotropy){const o=n.get("EXT_texture_filter_anisotropic");e.texParameterf(t,o.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(i.anisotropy,a.getMaxAnisotropy())),r.get(i).__currentAnisotropy=i.anisotropy}}}function W(t,n){let i=!1;void 0===t.__webglInit&&(t.__webglInit=!0,n.addEventListener("dispose",L));const r=n.source;let a=h.get(r);void 0===a&&(a={},h.set(r,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++,i=!0),a[o].usedTimes++;const r=a[t.__cacheKey];void 0!==r&&(a[t.__cacheKey].usedTimes--,0===r.usedTimes&&w(n)),t.__cacheKey=o,t.__webglTexture=a[o].texture}return i}function k(e,t,n){return Math.floor(Math.floor(e/n)/t)}function z(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=W(t,n),d=n.source;i.bindTexture(l,t.__webglTexture,e.TEXTURE0+s);const u=r.get(d);if(d.version!==u.__version||!0===c){i.activeTexture(e.TEXTURE0+s);if(!1===("undefined"!=typeof ImageBitmap&&n.image instanceof ImageBitmap)){const t=f.getPrimaries(f.workingColorSpace),i=n.colorSpace===Rt?null:f.getPrimaries(n.colorSpace),r=n.colorSpace===Rt||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_COLORSPACE_CONVERSION_WEBGL,r)}e.pixelStorei(e.UNPACK_ALIGNMENT,n.unpackAlignment);let t=E(n.image,!1,a.maxTextureSize);t=J(n,t);const r=o.convert(n.format,n.colorSpace),p=o.convert(n.type);let m,h=b(n.internalFormat,r,p,n.colorSpace,n.isVideoTexture);V(l,n);const _=n.mipmaps,g=!0!==n.isVideoTexture,S=void 0===u.__version||!0===c,M=d.dataReady,R=P(n,t);if(n.isDepthTexture)h=C(n.format===bt,n.type),S&&(g?i.texStorage2D(e.TEXTURE_2D,1,h,t.width,t.height):i.texImage2D(e.TEXTURE_2D,0,h,t.width,t.height,0,r,p,null));else if(n.isDataTexture)if(_.length>0){g&&S&&i.texStorage2D(e.TEXTURE_2D,R,h,_[0].width,_[0].height);for(let t=0,n=_.length;te.start-t.start);let s=0;for(let e=1;e0){const t=Ct(m.width,m.height,n.format,n.type);for(const o of n.layerUpdates){const n=m.data.subarray(o*t/m.data.BYTES_PER_ELEMENT,(o+1)*t/m.data.BYTES_PER_ELEMENT);i.compressedTexSubImage3D(e.TEXTURE_2D_ARRAY,a,0,0,o,m.width,m.height,1,r,n)}n.clearLayerUpdates()}else i.compressedTexSubImage3D(e.TEXTURE_2D_ARRAY,a,0,0,0,m.width,m.height,t.depth,r,m.data)}else i.compressedTexImage3D(e.TEXTURE_2D_ARRAY,a,h,m.width,m.height,t.depth,0,m.data,0,0);else v("WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()");else g?M&&i.texSubImage3D(e.TEXTURE_2D_ARRAY,a,0,0,0,m.width,m.height,t.depth,r,p,m.data):i.texImage3D(e.TEXTURE_2D_ARRAY,a,h,m.width,m.height,t.depth,0,r,p,m.data)}else{g&&S&&i.texStorage2D(e.TEXTURE_2D,R,h,_[0].width,_[0].height);for(let t=0,a=_.length;t0){const a=Ct(t.width,t.height,n.format,n.type);for(const o of n.layerUpdates){const n=t.data.subarray(o*a/t.data.BYTES_PER_ELEMENT,(o+1)*a/t.data.BYTES_PER_ELEMENT);i.texSubImage3D(e.TEXTURE_2D_ARRAY,0,0,0,o,t.width,t.height,1,r,p,n)}n.clearLayerUpdates()}else i.texSubImage3D(e.TEXTURE_2D_ARRAY,0,0,0,0,t.width,t.height,t.depth,r,p,t.data)}else i.texImage3D(e.TEXTURE_2D_ARRAY,0,h,t.width,t.height,t.depth,0,r,p,t.data);else if(n.isData3DTexture)g?(S&&i.texStorage3D(e.TEXTURE_3D,R,h,t.width,t.height,t.depth),M&&i.texSubImage3D(e.TEXTURE_3D,0,0,0,0,t.width,t.height,t.depth,r,p,t.data)):i.texImage3D(e.TEXTURE_3D,0,h,t.width,t.height,t.depth,0,r,p,t.data);else if(n.isFramebufferTexture){if(S)if(g)i.texStorage2D(e.TEXTURE_2D,R,h,t.width,t.height);else{let n=t.width,a=t.height;for(let t=0;t>=1,a>>=1}}else if(_.length>0){if(g&&S){const t=ee(_[0]);i.texStorage2D(e.TEXTURE_2D,R,h,t.width,t.height)}for(let t=0,n=_.length;t>d),r=Math.max(1,n.height>>d);c===e.TEXTURE_3D||c===e.TEXTURE_2D_ARRAY?i.texImage3D(c,d,p,t,r,n.depth,0,u,f,null):i.texImage2D(c,d,p,t,r,0,u,f,null)}i.bindFramebuffer(e.FRAMEBUFFER,t),Q(n)?l.framebufferTexture2DMultisampleEXT(e.FRAMEBUFFER,s,c,h.__webglTexture,0,$(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),i.bindFramebuffer(e.FRAMEBUFFER,null)}function Y(t,n,i){if(e.bindRenderbuffer(e.RENDERBUFFER,t),n.depthBuffer){const r=n.depthTexture,a=r&&r.isDepthTexture?r.type:null,o=C(n.stencilBuffer,a),s=n.stencilBuffer?e.DEPTH_STENCIL_ATTACHMENT:e.DEPTH_ATTACHMENT;Q(n)?l.renderbufferStorageMultisampleEXT(e.RENDERBUFFER,$(n),o,n.width,n.height):i?e.renderbufferStorageMultisample(e.RENDERBUFFER,$(n),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 r=0;r{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)for(let e=0;e<6;e++)K(n.__webglFramebuffer[e],t,e);else{const e=t.texture.mipmaps;e&&e.length>0?K(n.__webglFramebuffer[0],t,0):K(n.__webglFramebuffer,t,0)}else if(a){n.__webglDepthbuffer=[];for(let r=0;r<6;r++)if(i.bindFramebuffer(e.FRAMEBUFFER,n.__webglFramebuffer[r]),void 0===n.__webglDepthbuffer[r])n.__webglDepthbuffer[r]=e.createRenderbuffer(),Y(n.__webglDepthbuffer[r],t,!1);else{const i=t.stencilBuffer?e.DEPTH_STENCIL_ATTACHMENT:e.DEPTH_ATTACHMENT,a=n.__webglDepthbuffer[r];e.bindRenderbuffer(e.RENDERBUFFER,a),e.framebufferRenderbuffer(e.FRAMEBUFFER,i,e.RENDERBUFFER,a)}}else{const r=t.texture.mipmaps;if(r&&r.length>0?i.bindFramebuffer(e.FRAMEBUFFER,n.__webglFramebuffer[0]):i.bindFramebuffer(e.FRAMEBUFFER,n.__webglFramebuffer),void 0===n.__webglDepthbuffer)n.__webglDepthbuffer=e.createRenderbuffer(),Y(n.__webglDepthbuffer,t,!1);else{const i=t.stencilBuffer?e.DEPTH_STENCIL_ATTACHMENT:e.DEPTH_ATTACHMENT,r=n.__webglDepthbuffer;e.bindRenderbuffer(e.RENDERBUFFER,r),e.framebufferRenderbuffer(e.FRAMEBUFFER,i,e.RENDERBUFFER,r)}}i.bindFramebuffer(e.FRAMEBUFFER,null)}const j=[],Z=[];function $(e){return Math.min(a.maxSamples,e.samples)}function Q(e){const t=r.get(e);return e.samples>0&&!0===n.has("WEBGL_multisampled_render_to_texture")&&!1!==t.__useRenderToTexture}function J(e,t){const n=e.colorSpace,i=e.format,r=e.type;return!0===e.isCompressedTexture||!0===e.isVideoTexture||n!==y&&n!==Rt&&(f.getTransfer(n)===p?i===T&&r===S||v("WebGLTextures: sRGB encoded textures have to use RGBAFormat and UnsignedByteType."):D("WebGLTextures: Unsupported texture color space:",n)),t}function ee(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=I;return e>=a.maxTextures&&v("WebGLTextures: Trying to use "+e+" texture units while this GPU supports only "+a.maxTextures),I+=1,e},this.resetTextureUnits=function(){I=0},this.setTexture2D=N,this.setTexture2DArray=function(t,n){const a=r.get(t);!1===t.isRenderTargetTexture&&t.version>0&&a.__version!==t.version?z(a,t,n):(t.isExternalTexture&&(a.__webglTexture=t.sourceTexture?t.sourceTexture:null),i.bindTexture(e.TEXTURE_2D_ARRAY,a.__webglTexture,e.TEXTURE0+n))},this.setTexture3D=function(t,n){const a=r.get(t);!1===t.isRenderTargetTexture&&t.version>0&&a.__version!==t.version?z(a,t,n):i.bindTexture(e.TEXTURE_3D,a.__webglTexture,e.TEXTURE0+n)},this.setTextureCube=function(t,n){const s=r.get(t);!0!==t.isCubeDepthTexture&&t.version>0&&s.__version!==t.version?function(t,n,s){if(6!==n.image.length)return;const l=W(t,n),c=n.source;i.bindTexture(e.TEXTURE_CUBE_MAP,t.__webglTexture,e.TEXTURE0+s);const d=r.get(c);if(c.version!==d.__version||!0===l){i.activeTexture(e.TEXTURE0+s);const t=f.getPrimaries(f.workingColorSpace),r=n.colorSpace===Rt?null:f.getPrimaries(n.colorSpace),u=n.colorSpace===Rt||t===r?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 p=n.isCompressedTexture||n.image[0].isCompressedTexture,m=n.image[0]&&n.image[0].isDataTexture,h=[];for(let e=0;e<6;e++)h[e]=p||m?m?n.image[e].image:n.image[e]:E(n.image[e],!0,a.maxCubemapSize),h[e]=J(n,h[e]);const _=h[0],g=o.convert(n.format,n.colorSpace),S=o.convert(n.type),M=b(n.internalFormat,g,S,n.colorSpace),R=!0!==n.isVideoTexture,C=void 0===d.__version||!0===l,L=c.dataReady;let U,D=P(n,_);if(V(e.TEXTURE_CUBE_MAP,n),p){R&&C&&i.texStorage2D(e.TEXTURE_CUBE_MAP,D,M,_.width,_.height);for(let t=0;t<6;t++){U=h[t].mipmaps;for(let r=0;r0&&D++;const t=ee(h[0]);i.texStorage2D(e.TEXTURE_CUBE_MAP,D,M,t.width,t.height)}for(let t=0;t<6;t++)if(m){R?L&&i.texSubImage2D(e.TEXTURE_CUBE_MAP_POSITIVE_X+t,0,0,0,h[t].width,h[t].height,g,S,h[t].data):i.texImage2D(e.TEXTURE_CUBE_MAP_POSITIVE_X+t,0,M,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 i=0;i0){a.__webglFramebuffer=[];for(let t=0;t0&&!1===Q(t)){a.__webglMultisampledFramebuffer=e.createFramebuffer(),a.__webglColorRenderbuffer=[],i.bindFramebuffer(e.FRAMEBUFFER,a.__webglMultisampledFramebuffer);for(let n=0;n0)for(let r=0;r0)for(let i=0;i0)if(!1===Q(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=r.get(t),u=n.length>1;if(u)for(let t=0;t0?i.bindFramebuffer(e.DRAW_FRAMEBUFFER,d.__webglFramebuffer[0]):i.bindFramebuffer(e.DRAW_FRAMEBUFFER,d.__webglFramebuffer);for(let i=0;i= 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 m(20,20),n)}return this.mesh}reset(){this.texture=null,this.mesh=null}getDepthTexture(){return this.texture}}class Ma extends Rn{constructor(e,n){super();const i=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 _="undefined"!=typeof XRWebGLBinding,g=new Sa,E={},M=n.getContextAttributes();let x=null,A=null;const R=[],b=[],C=new t;let L=null;const U=new P;U.viewport=new Y;const D=new P;D.viewport=new Y;const w=[U,D],N=new bn;let y=null,F=null;function O(e){const t=b.indexOf(e.inputSource);if(-1===t)return;const n=R[t];void 0!==n&&(n.update(e.inputSource,e.frame,d||s),n.dispatchEvent({type:e.type,data:e.inputSource}))}function B(){a.removeEventListener("select",O),a.removeEventListener("selectstart",O),a.removeEventListener("selectend",O),a.removeEventListener("squeeze",O),a.removeEventListener("squeezestart",O),a.removeEventListener("squeezeend",O),a.removeEventListener("end",B),a.removeEventListener("inputsourceschange",G);for(let e=0;e=0&&(b[i]=null,R[i].disconnect(n))}for(let t=0;t=b.length){b.push(n),i=e;break}if(null===b[e]){b[e]=n,i=e;break}}if(-1===i)break}const r=R[i];r&&r.connect(n)}}this.cameraAutoUpdate=!0,this.enabled=!1,this.isPresenting=!1,this.getController=function(e){let t=R[e];return void 0===t&&(t=new Cn,R[e]=t),t.getTargetRaySpace()},this.getControllerGrip=function(e){let t=R[e];return void 0===t&&(t=new Cn,R[e]=t),t.getGripSpace()},this.getHand=function(e){let t=R[e];return void 0===t&&(t=new Cn,R[e]=t),t.getHandSpace()},this.setFramebufferScaleFactor=function(e){o=e,!0===i.isPresenting&&v("WebXRManager: Cannot change framebuffer scale while presenting.")},this.setReferenceSpaceType=function(e){l=e,!0===i.isPresenting&&v("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 null===f&&_&&(f=new XRWebGLBinding(a,n)),f},this.getFrame=function(){return h},this.getSession=function(){return a},this.setSession=async function(t){if(a=t,null!==a){x=e.getRenderTarget(),a.addEventListener("select",O),a.addEventListener("selectstart",O),a.addEventListener("selectend",O),a.addEventListener("squeeze",O),a.addEventListener("squeezestart",O),a.addEventListener("squeezeend",O),a.addEventListener("end",B),a.addEventListener("inputsourceschange",G),!0!==M.xrCompatible&&await n.makeXRCompatible(),L=e.getPixelRatio(),e.getSize(C);if(_&&"createProjectionLayer"in XRWebGLBinding.prototype){let t=null,i=null,r=null;M.depth&&(r=M.stencil?n.DEPTH24_STENCIL8:n.DEPTH_COMPONENT24,t=M.stencil?bt:be,i=M.stencil?Pt:Le);const s={colorFormat:n.RGBA8,depthFormat:r,scaleFactor:o};f=this.getBinding(),p=f.createProjectionLayer(s),a.updateRenderState({layers:[p]}),e.setPixelRatio(1),e.setSize(p.textureWidth,p.textureHeight,!1),A=new I(p.textureWidth,p.textureHeight,{format:T,type:S,depthTexture:new ae(p.textureWidth,p.textureHeight,i,void 0,void 0,void 0,void 0,void 0,void 0,t),stencilBuffer:M.stencil,colorSpace:e.outputColorSpace,samples:M.antialias?4:0,resolveDepthBuffer:!1===p.ignoreDepthValues,resolveStencilBuffer:!1===p.ignoreDepthValues})}else{const t={antialias:M.antialias,alpha:!0,depth:M.depth,stencil:M.stencil,framebufferScaleFactor:o};m=new XRWebGLLayer(a,n,t),a.updateRenderState({baseLayer:m}),e.setPixelRatio(1),e.setSize(m.framebufferWidth,m.framebufferHeight,!1),A=new I(m.framebufferWidth,m.framebufferHeight,{format:T,type:S,colorSpace:e.outputColorSpace,stencilBuffer:M.stencil,resolveDepthBuffer:!1===m.ignoreDepthValues,resolveStencilBuffer:!1===m.ignoreDepthValues})}A.isXRRenderTarget=!0,this.setFoveation(c),d=null,s=await a.requestReferenceSpace(l),z.setContext(a),z.start(),i.isPresenting=!0,i.dispatchEvent({type:"sessionstart"})}},this.getEnvironmentBlendMode=function(){if(null!==a)return a.environmentBlendMode},this.getDepthTexture=function(){return g.getDepthTexture()};const H=new r,V=new r;function W(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!==g.texture&&(g.depthNear>0&&(t=g.depthNear),g.depthFar>0&&(n=g.depthFar)),N.near=D.near=U.near=t,N.far=D.far=U.far=n,y===N.near&&F===N.far||(a.updateRenderState({depthNear:N.near,depthFar:N.far}),y=N.near,F=N.far),N.layers.mask=6|e.layers.mask,U.layers.mask=-5&N.layers.mask,D.layers.mask=-3&N.layers.mask;const i=e.parent,r=N.cameras;W(N,i);for(let e=0;e0&&(e.alphaTest.value=i.alphaTest);const r=t.get(i),a=r.envMap,o=r.envMapRotation;a&&(e.envMap.value=a,e.envMapRotation.value.setFromMatrix4(Ta.makeRotationFromEuler(o)).transpose(),a.isCubeTexture&&!1===a.isRenderTargetTexture&&e.envMapRotation.value.premultiply(xa),e.reflectivity.value=i.reflectivity,e.ior.value=i.ior,e.refractionRatio.value=i.refractionRatio),i.lightMap&&(e.lightMap.value=i.lightMap,e.lightMapIntensity.value=i.lightMapIntensity,n(i.lightMap,e.lightMapTransform)),i.aoMap&&(e.aoMap.value=i.aoMap,e.aoMapIntensity.value=i.aoMapIntensity,n(i.aoMap,e.aoMapTransform))}return{refreshFogUniforms:function(t,n){n.color.getRGB(t.fogColor.value,_(e)),n.isFog?(t.fogNear.value=n.near,t.fogFar.value=n.far):n.isFogExp2&&(t.fogDensity.value=n.density)},refreshMaterialUniforms:function(e,r,a,o,s){r.isNodeMaterial?r.uniformsNeedUpdate=!1:r.isMeshBasicMaterial?i(e,r):r.isMeshLambertMaterial?(i(e,r),r.envMap&&(e.envMapIntensity.value=r.envMapIntensity)):r.isMeshToonMaterial?(i(e,r),function(e,t){t.gradientMap&&(e.gradientMap.value=t.gradientMap)}(e,r)):r.isMeshPhongMaterial?(i(e,r),function(e,t){e.specular.value.copy(t.specular),e.shininess.value=Math.max(t.shininess,1e-4)}(e,r),r.envMap&&(e.envMapIntensity.value=r.envMapIntensity)):r.isMeshStandardMaterial?(i(e,r),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,r),r.isMeshPhysicalMaterial&&function(e,t,i){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=i.texture,e.transmissionSamplerSize.value.set(i.width,i.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,r,s)):r.isMeshMatcapMaterial?(i(e,r),function(e,t){t.matcap&&(e.matcap.value=t.matcap)}(e,r)):r.isMeshDepthMaterial?i(e,r):r.isMeshDistanceMaterial?(i(e,r),function(e,n){const i=t.get(n).light;e.referencePosition.value.setFromMatrixPosition(i.matrixWorld),e.nearDistance.value=i.shadow.camera.near,e.farDistance.value=i.shadow.camera.far}(e,r)):r.isMeshNormalMaterial?i(e,r):r.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,r),r.isLineDashedMaterial&&function(e,t){e.dashSize.value=t.dashSize,e.totalSize.value=t.dashSize+t.gapSize,e.scale.value=t.scale}(e,r)):r.isPointsMaterial?function(e,t,i,r){e.diffuse.value.copy(t.color),e.opacity.value=t.opacity,e.size.value=t.size*i,e.scale.value=.5*r,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,r,a,o):r.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,r):r.isShadowMaterial?(e.color.value.copy(r.color),e.opacity.value=r.opacity):r.isShaderMaterial&&(r.uniformsNeedUpdate=!1)}}}function Ra(e,t,n,i){let r={},a={},o=[];const s=e.getParameter(e.MAX_UNIFORM_BUFFER_BINDINGS);function l(e,t,n,i){const r=e.value,a=t+"_"+n;if(void 0===i[a])return"number"==typeof r||"boolean"==typeof r?i[a]=r:ArrayBuffer.isView(r)?i[a]=r.slice():i[a]=r.clone(),!0;{const e=i[a];if("number"==typeof r||"boolean"==typeof r){if(e!==r)return i[a]=r,!0}else{if(ArrayBuffer.isView(r))return!0;if(!1===e.equals(r))return e.copy(r),!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?v("WebGLRenderer: Texture samplers can not be part of an uniforms group."):ArrayBuffer.isView(e)?(t.boundary=16,t.storage=e.byteLength):v("WebGLRenderer: Unsupported uniform value type.",e),t}function d(t){const n=t.target;n.removeEventListener("dispose",d);const i=o.indexOf(n.__bindingPointIndex);o.splice(i,1),e.deleteBuffer(r[n.id]),delete r[n.id],delete a[n.id]}return{bind:function(e,t){const n=t.program;i.uniformBlockBinding(e,n)},update:function(n,u){let f=r[n.id];void 0===f&&(!function(e){const t=e.uniforms;let n=0;const i=16;for(let e=0,r=t.length;e0&&(n+=i-r);e.__size=n,e.__cache={}}(n),f=function(t){const n=function(){for(let e=0;e0),p=!!n.morphAttributes.position,m=!!n.morphAttributes.normal,h=!!n.morphAttributes.color;let _=L;i.toneMapped&&(null!==z&&!0!==z.isXRRenderTarget||(_=O.toneMapping));const g=n.morphAttributes.position||n.morphAttributes.normal||n.morphAttributes.color,v=void 0!==g?g.length:0,S=Te.get(i),M=U.state.lights;if(!0===le&&(!0===ce||e!==K)){const t=e===K&&i.id===X;Ne.setState(i,e,t)}let T=!1;i.version===S.__version?S.needsLights&&S.lightsStateVersion!==M.state.version||S.outputColorSpace!==s||r.isBatchedMesh&&!1===S.batching?T=!0:r.isBatchedMesh||!0!==S.batching?r.isBatchedMesh&&!0===S.batchingColor&&null===r.colorTexture||r.isBatchedMesh&&!1===S.batchingColor&&null!==r.colorTexture||r.isInstancedMesh&&!1===S.instancing?T=!0:r.isInstancedMesh||!0!==S.instancing?r.isSkinnedMesh&&!1===S.skinning?T=!0:r.isSkinnedMesh||!0!==S.skinning?r.isInstancedMesh&&!0===S.instancingColor&&null===r.instanceColor||r.isInstancedMesh&&!1===S.instancingColor&&null!==r.instanceColor||r.isInstancedMesh&&!0===S.instancingMorph&&null===r.morphTexture||r.isInstancedMesh&&!1===S.instancingMorph&&null!==r.morphTexture||S.envMap!==c||!0===i.fog&&S.fog!==a?T=!0:void 0===S.numClippingPlanes||S.numClippingPlanes===Ne.numPlanes&&S.numIntersection===Ne.numIntersection?(S.vertexAlphas!==d||S.vertexTangents!==u||S.morphTargets!==p||S.morphNormals!==m||S.morphColors!==h||S.toneMapping!==_||S.morphTargetsCount!==v)&&(T=!0):T=!0:T=!0:T=!0:T=!0:(T=!0,S.__version=i.version);let x=S.currentProgram;!0===T&&(x=st(i,t,r),H&&i.isNodeMaterial&&H.onUpdateProgram(i,x,S));let A=!1,R=!1,b=!1;const C=x.getUniforms(),P=S.uniforms;Ee.useProgram(x.program)&&(A=!0,R=!0,b=!0);i.id!==X&&(X=i.id,R=!0);if(A||K!==e){Ee.buffers.depth.getReversed()&&!0!==e.reversedDepth&&(e._reversedDepth=!0,e.updateProjectionMatrix()),C.setValue(ke,"projectionMatrix",e.projectionMatrix),C.setValue(ke,"viewMatrix",e.matrixWorldInverse);const t=C.map.cameraPosition;void 0!==t&&t.setValue(ke,ue.setFromMatrixPosition(e.matrixWorld)),ve.logarithmicDepthBuffer&&C.setValue(ke,"logDepthBufFC",2/(Math.log(e.far+1)/Math.LN2)),(i.isMeshPhongMaterial||i.isMeshToonMaterial||i.isMeshLambertMaterial||i.isMeshBasicMaterial||i.isMeshStandardMaterial||i.isShaderMaterial)&&C.setValue(ke,"isOrthographic",!0===e.isOrthographicCamera),K!==e&&(K=e,R=!0,b=!0)}S.needsLights&&(M.state.directionalShadowMap.length>0&&C.setValue(ke,"directionalShadowMap",M.state.directionalShadowMap,xe),M.state.spotShadowMap.length>0&&C.setValue(ke,"spotShadowMap",M.state.spotShadowMap,xe),M.state.pointShadowMap.length>0&&C.setValue(ke,"pointShadowMap",M.state.pointShadowMap,xe));if(r.isSkinnedMesh){C.setOptional(ke,r,"bindMatrix"),C.setOptional(ke,r,"bindMatrixInverse");const e=r.skeleton;e&&(null===e.boneTexture&&e.computeBoneTexture(),C.setValue(ke,"boneTexture",e.boneTexture,xe))}r.isBatchedMesh&&(C.setOptional(ke,r,"batchingTexture"),C.setValue(ke,"batchingTexture",r._matricesTexture,xe),C.setOptional(ke,r,"batchingIdTexture"),C.setValue(ke,"batchingIdTexture",r._indirectTexture,xe),C.setOptional(ke,r,"batchingColorTexture"),null!==r._colorsTexture&&C.setValue(ke,"batchingColorTexture",r._colorsTexture,xe));const D=n.morphAttributes;void 0===D.position&&void 0===D.normal&&void 0===D.color||Oe.update(r,n,x);(R||S.receiveShadow!==r.receiveShadow)&&(S.receiveShadow=r.receiveShadow,C.setValue(ke,"receiveShadow",r.receiveShadow));(i.isMeshStandardMaterial||i.isMeshLambertMaterial||i.isMeshPhongMaterial)&&null===i.envMap&&null!==t.environment&&(P.envMapIntensity.value=t.environmentIntensity);void 0!==P.dfgLUT&&(P.dfgLUT.value=(null===Ca&&(Ca=new Ln(ba,16,16,Se,E),Ca.name="DFG_LUT",Ca.minFilter=F,Ca.magFilter=F,Ca.wrapS=mt,Ca.wrapT=mt,Ca.generateMipmaps=!1,Ca.needsUpdate=!0),Ca));R&&(C.setValue(ke,"toneMappingExposure",O.toneMappingExposure),S.needsLights&&(I=b,(w=P).ambientLightColor.needsUpdate=I,w.lightProbe.needsUpdate=I,w.directionalLights.needsUpdate=I,w.directionalLightShadows.needsUpdate=I,w.pointLights.needsUpdate=I,w.pointLightShadows.needsUpdate=I,w.spotLights.needsUpdate=I,w.spotLightShadows.needsUpdate=I,w.rectAreaLights.needsUpdate=I,w.hemisphereLights.needsUpdate=I),a&&!0===i.fog&&De.refreshFogUniforms(P,a),De.refreshMaterialUniforms(P,i,te,ee,U.state.transmissionRenderTarget[e.id]),Ar.upload(ke,lt(S),P,xe));var w,I;i.isShaderMaterial&&!0===i.uniformsNeedUpdate&&(Ar.upload(ke,lt(S),P,xe),i.uniformsNeedUpdate=!1);i.isSpriteMaterial&&C.setValue(ke,"center",r.center);if(C.setValue(ke,"modelViewMatrix",r.modelViewMatrix),C.setValue(ke,"normalMatrix",r.normalMatrix),C.setValue(ke,"modelMatrix",r.matrixWorld),void 0!==i.uniformsGroups){const e=i.uniformsGroups;for(let t=0,n=e.length;t{function n(){i.forEach(function(e){Te.get(e).currentProgram.isReady()&&i.delete(e)}),0!==i.size?setTimeout(n,10):t(e)}null!==ge.get("KHR_parallel_shader_compile")?n():setTimeout(n,10)})};let Qe=null;function Je(){tt.stop()}function et(){tt.start()}const tt=new Fn;function nt(e,t,n,i){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)U.pushLight(e),e.castShadow&&U.pushShadow(e);else if(e.isSprite){if(!e.frustumCulled||se.intersectsSprite(e)){i&&fe.setFromMatrixPosition(e.matrixWorld).applyMatrix4(de);const t=Ce.update(e),r=e.material;r.visible&&P.push(e,t,r,n,fe.z,null)}}else if((e.isMesh||e.isLine||e.isPoints)&&(!e.frustumCulled||se.intersectsObject(e))){const t=Ce.update(e),r=e.material;if(i&&(void 0!==e.boundingSphere?(null===e.boundingSphere&&e.computeBoundingSphere(),fe.copy(e.boundingSphere.center)):(null===t.boundingSphere&&t.computeBoundingSphere(),fe.copy(t.boundingSphere.center)),fe.applyMatrix4(e.matrixWorld).applyMatrix4(de)),Array.isArray(r)){const i=t.groups;for(let a=0,o=i.length;a0&&at(r,t,n),a.length>0&&at(a,t,n),o.length>0&&at(o,t,n),Ee.buffers.depth.setTest(!0),Ee.buffers.depth.setMask(!0),Ee.buffers.color.setMask(!0),Ee.setPolygonOffset(!1)}function rt(e,t,n,i){if(null!==(!0===n.isScene?n.overrideMaterial:null))return;if(void 0===U.state.transmissionRenderTarget[i.id]){const e=ge.has("EXT_color_buffer_half_float")||ge.has("EXT_color_buffer_float");U.state.transmissionRenderTarget[i.id]=new I(1,1,{generateMipmaps:!0,type:e?E:S,minFilter:B,samples:Math.max(4,ve.samples),stencilBuffer:o,resolveDepthBuffer:!1,resolveStencilBuffer:!1,colorSpace:f.workingColorSpace})}const r=U.state.transmissionRenderTarget[i.id],a=i.viewport||q;r.setSize(a.z*O.transmissionResolutionScale,a.w*O.transmissionResolutionScale);const s=O.getRenderTarget(),l=O.getActiveCubeFace(),d=O.getActiveMipmapLevel();O.setRenderTarget(r),O.getClearColor($),Q=O.getClearAlpha(),Q<1&&O.setClearColor(16777215,.5),O.clear(),me&&Fe.render(n);const u=O.toneMapping;O.toneMapping=L;const p=i.viewport;if(void 0!==i.viewport&&(i.viewport=void 0),U.setupLightsView(i),!0===le&&Ne.setGlobalState(O.clippingPlanes,i),at(e,n,i),xe.updateMultisampleRenderTarget(r),xe.updateRenderTargetMipmap(r),!1===ge.has("WEBGL_multisampled_render_to_texture")){let e=!1;for(let r=0,a=t.length;r0)for(let t=0,a=r.length;t0&&rt(n,i,e,t),me&&Fe.render(e),it(P,e,t)}null!==z&&0===k&&(xe.updateMultisampleRenderTarget(z),xe.updateRenderTargetMipmap(z)),i&&y.end(O),!0===e.isScene&&e.onAfterRender(O,e,t),Ve.resetDefaultState(),X=-1,K=null,N.pop(),N.length>0?(U=N[N.length-1],!0===le&&Ne.setGlobalState(O.clippingPlanes,U.state.camera)):U=null,w.pop(),P=w.length>0?w[w.length-1]:null,null!==H&&H.renderEnd()},this.getActiveCubeFace=function(){return V},this.getActiveMipmapLevel=function(){return k},this.getRenderTarget=function(){return z},this.setRenderTargetTextures=function(e,t,n){const i=Te.get(e);i.__autoAllocateDepthBuffer=!1===e.resolveDepthBuffer,!1===i.__autoAllocateDepthBuffer&&(i.__useRenderToTexture=!1),Te.get(e.texture).__webglTexture=t,Te.get(e.depthTexture).__webglTexture=i.__autoAllocateDepthBuffer?void 0:n,i.__hasExternalTextures=!0},this.setRenderTargetFramebuffer=function(e,t){const n=Te.get(e);n.__webglFramebuffer=t,n.__useDefaultFramebuffer=void 0===t};const dt=ke.createFramebuffer();this.setRenderTarget=function(e,t=0,n=0){z=e,V=t,k=n;let i=null,r=!1,a=!1;if(e){const o=Te.get(e);if(void 0!==o.__useDefaultFramebuffer)return Ee.bindFramebuffer(ke.FRAMEBUFFER,o.__webglFramebuffer),q.copy(e.viewport),j.copy(e.scissor),Z=e.scissorTest,Ee.viewport(q),Ee.scissor(j),Ee.setScissorTest(Z),void(X=-1);if(void 0===o.__webglFramebuffer)xe.setupRenderTarget(e);else if(o.__hasExternalTextures)xe.rebindTextures(e,Te.get(e.texture).__webglTexture,Te.get(e.depthTexture).__webglTexture);else if(e.depthBuffer){const t=e.depthTexture;if(o.__boundDepthTexture!==t){if(null!==t&&Te.has(t)&&(e.width!==t.image.width||e.height!==t.image.height))throw new Error("WebGLRenderTarget: Attached DepthTexture is initialized to the incorrect size.");xe.setupDepthRenderbuffer(e)}}const s=e.texture;(s.isData3DTexture||s.isDataArrayTexture||s.isCompressedArrayTexture)&&(a=!0);const l=Te.get(e).__webglFramebuffer;e.isWebGLCubeRenderTarget?(i=Array.isArray(l[t])?l[t][n]:l[t],r=!0):i=e.samples>0&&!1===xe.useMultisampledRTT(e)?Te.get(e).__webglMultisampledFramebuffer:Array.isArray(l)?l[n]:l,q.copy(e.viewport),j.copy(e.scissor),Z=e.scissorTest}else q.copy(re).multiplyScalar(te).floor(),j.copy(ae).multiplyScalar(te).floor(),Z=oe;0!==n&&(i=dt);if(Ee.bindFramebuffer(ke.FRAMEBUFFER,i)&&Ee.drawBuffers(e,i),Ee.viewport(q),Ee.scissor(j),Ee.setScissorTest(Z),r){const i=Te.get(e.texture);ke.framebufferTexture2D(ke.FRAMEBUFFER,ke.COLOR_ATTACHMENT0,ke.TEXTURE_CUBE_MAP_POSITIVE_X+t,i.__webglTexture,n)}else if(a){const i=t;for(let t=0;t1&&ke.readBuffer(ke.COLOR_ATTACHMENT0+s),!ve.textureFormatReadable(l))return void D("WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.");if(!ve.textureTypeReadable(c))return void D("WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.");t>=0&&t<=e.width-i&&n>=0&&n<=e.height-r&&ke.readPixels(t,n,i,r,He.convert(l),He.convert(c),a)}finally{const e=null!==z?Te.get(z).__webglFramebuffer:null;Ee.bindFramebuffer(ke.FRAMEBUFFER,e)}}},this.readRenderTargetPixelsAsync=async function(e,t,n,i,r,a,o,s=0){if(!e||!e.isWebGLRenderTarget)throw new Error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.");let l=Te.get(e).__webglFramebuffer;if(e.isWebGLCubeRenderTarget&&void 0!==o&&(l=l[o]),l){if(t>=0&&t<=e.width-i&&n>=0&&n<=e.height-r){Ee.bindFramebuffer(ke.FRAMEBUFFER,l);const o=e.textures[s],c=o.format,d=o.type;if(e.textures.length>1&&ke.readBuffer(ke.COLOR_ATTACHMENT0+s),!ve.textureFormatReadable(c))throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: renderTarget is not in RGBA or implementation defined format.");if(!ve.textureTypeReadable(d))throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: renderTarget is not in UnsignedByteType or implementation defined type.");const u=ke.createBuffer();ke.bindBuffer(ke.PIXEL_PACK_BUFFER,u),ke.bufferData(ke.PIXEL_PACK_BUFFER,a.byteLength,ke.STREAM_READ),ke.readPixels(t,n,i,r,He.convert(c),He.convert(d),0);const f=null!==z?Te.get(z).__webglFramebuffer:null;Ee.bindFramebuffer(ke.FRAMEBUFFER,f);const p=ke.fenceSync(ke.SYNC_GPU_COMMANDS_COMPLETE,0);return ke.flush(),await yn(ke,p,4),ke.bindBuffer(ke.PIXEL_PACK_BUFFER,u),ke.getBufferSubData(ke.PIXEL_PACK_BUFFER,0,a),ke.deleteBuffer(u),ke.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 i=Math.pow(2,-n),r=Math.floor(e.image.width*i),a=Math.floor(e.image.height*i),o=null!==t?t.x:0,s=null!==t?t.y:0;xe.setTexture2D(e,0),ke.copyTexSubImage2D(ke.TEXTURE_2D,n,0,0,o,s,r,a),Ee.unbindTexture()};const ut=ke.createFramebuffer(),ft=ke.createFramebuffer();this.copyTextureToTexture=function(e,t,n=null,i=null,r=0,a=0){let o,s,l,c,d,u,f,p,m;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,-r);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!==i?(f=i.x,p=i.y,m=i.z):(f=0,p=0,m=0);const _=He.convert(t.format),g=He.convert(t.type);let v;t.isData3DTexture?(xe.setTexture3D(t,0),v=ke.TEXTURE_3D):t.isDataArrayTexture||t.isCompressedArrayTexture?(xe.setTexture2DArray(t,0),v=ke.TEXTURE_2D_ARRAY):(xe.setTexture2D(t,0),v=ke.TEXTURE_2D),Ee.activeTexture(ke.TEXTURE0),ke.pixelStorei(ke.UNPACK_FLIP_Y_WEBGL,t.flipY),ke.pixelStorei(ke.UNPACK_PREMULTIPLY_ALPHA_WEBGL,t.premultiplyAlpha),ke.pixelStorei(ke.UNPACK_ALIGNMENT,t.unpackAlignment);const E=ke.getParameter(ke.UNPACK_ROW_LENGTH),S=ke.getParameter(ke.UNPACK_IMAGE_HEIGHT),M=ke.getParameter(ke.UNPACK_SKIP_PIXELS),T=ke.getParameter(ke.UNPACK_SKIP_ROWS),x=ke.getParameter(ke.UNPACK_SKIP_IMAGES);ke.pixelStorei(ke.UNPACK_ROW_LENGTH,h.width),ke.pixelStorei(ke.UNPACK_IMAGE_HEIGHT,h.height),ke.pixelStorei(ke.UNPACK_SKIP_PIXELS,c),ke.pixelStorei(ke.UNPACK_SKIP_ROWS,d),ke.pixelStorei(ke.UNPACK_SKIP_IMAGES,u);const A=e.isDataArrayTexture||e.isData3DTexture,R=t.isDataArrayTexture||t.isData3DTexture;if(e.isDepthTexture){const n=Te.get(e),i=Te.get(t),h=Te.get(n.__renderTarget),_=Te.get(i.__renderTarget);Ee.bindFramebuffer(ke.READ_FRAMEBUFFER,h.__webglFramebuffer),Ee.bindFramebuffer(ke.DRAW_FRAMEBUFFER,_.__webglFramebuffer);for(let n=0;n 2 ? size : 0, size, size ); + this._setViewport( cubeUVRenderTarget, col * size, i > 2 ? size : 0, size, size ); renderer.render( scene, cubeCamera ); @@ -26041,9 +26044,7 @@ class PMREMGenerator { mesh.material = material; const size = this._cubeSize; - - _setViewport( cubeUVRenderTarget, 0, 0, 3 * size, 2 * size ); - + this._setViewport( cubeUVRenderTarget, 0, 0, 3 * size, 2 * size ); renderer.setRenderTarget( cubeUVRenderTarget ); renderer.render( mesh, _flatCamera ); @@ -26111,7 +26112,7 @@ class PMREMGenerator { ggxUniforms.roughness.value = adjustedRoughness; ggxUniforms.mipInt.value = _lodMax - lodIn; // Sample from input LOD - _setViewport( pingPongRenderTarget, x, y, 3 * outputSize, 2 * outputSize ); + this._setViewport( pingPongRenderTarget, x, y, 3 * outputSize, 2 * outputSize ); renderer.setRenderTarget( pingPongRenderTarget ); renderer.render( ggxMesh, _flatCamera ); @@ -26121,7 +26122,7 @@ class PMREMGenerator { ggxUniforms.roughness.value = 0.0; // Direct copy ggxUniforms.mipInt.value = _lodMax - lodOut; // Read from the level we just wrote - _setViewport( cubeUVRenderTarget, x, y, 3 * outputSize, 2 * outputSize ); + this._setViewport( cubeUVRenderTarget, x, y, 3 * outputSize, 2 * outputSize ); renderer.setRenderTarget( cubeUVRenderTarget ); renderer.render( ggxMesh, _flatCamera ); @@ -26247,12 +26248,29 @@ class PMREMGenerator { const x = 3 * outputSize * ( lodOut > _lodMax - LOD_MIN ? lodOut - _lodMax + LOD_MIN : 0 ); const y = 4 * ( this._cubeSize - outputSize ); - _setViewport( targetOut, x, y, 3 * outputSize, 2 * outputSize ); + this._setViewport( targetOut, x, y, 3 * outputSize, 2 * outputSize ); renderer.setRenderTarget( targetOut ); renderer.render( blurMesh, _flatCamera ); } + _setViewport( target, x, y, width, height ) { + + if ( this._renderer.isWebGLRenderer ) { + + target.viewport.set( x, target.height - height - y, width, height ); + target.scissor.set( x, target.height - height - y, width, height ); + + } else { + + target.viewport.set( x, y, width, height ); + target.scissor.set( x, y, width, height ); + + } + + } + + } function _createPlanes( lodMax ) { @@ -26358,13 +26376,6 @@ function _createRenderTarget( width, height ) { } -function _setViewport( target, x, y, width, height ) { - - target.viewport.set( x, y, width, height ); - target.scissor.set( x, y, width, height ); - -} - function _getMaterial( type ) { const material = new NodeMaterial(); @@ -29011,7 +29022,7 @@ class Animation { */ stop() { - this._context.cancelAnimationFrame( this._requestId ); + if ( this._context !== null ) this._context.cancelAnimationFrame( this._requestId ); this._requestId = null; @@ -38229,19 +38240,14 @@ class StorageTextureNode extends TextureNode { */ generate( builder, output ) { - let snippet; - if ( this.storeNode !== null ) { - snippet = this.generateStore( builder ); - - } else { - - snippet = super.generate( builder, output ); + this.generateStore( builder ); + return ''; } - return snippet; + return super.generate( builder, output ); } @@ -38316,7 +38322,7 @@ class StorageTextureNode extends TextureNode { const storeSnippet = storeNode.build( builder, 'vec4' ); const depthSnippet = depthNode ? depthNode.build( builder, 'int' ) : null; - const snippet = builder.generateTextureStore( builder, textureProperty, uvSnippet, depthSnippet, storeSnippet ); + const snippet = builder.generateTextureStore( this.value, textureProperty, uvSnippet, depthSnippet, storeSnippet ); builder.addLineFlowCode( snippet, this ); @@ -42754,14 +42760,12 @@ class LightsNode extends Node { if ( previousLightNodes !== null ) { - lightNode = getLightNodeById( light.id, previousLightNodes ); // reuse existing light node + lightNode = getLightNodeById( light.id, previousLightNodes ); } if ( lightNode === null ) { - // find the corresponding node type for a given light - const lightNodeClass = nodeLibrary.getLightNodeClass( light.constructor ); if ( lightNodeClass === null ) { @@ -42771,23 +42775,18 @@ class LightsNode extends Node { } - let lightNode = null; + if ( _lightsNodeRef.has( light ) === false ) { - if ( ! _lightsNodeRef.has( light ) ) { - - lightNode = new lightNodeClass( light ); - _lightsNodeRef.set( light, lightNode ); - - } else { - - lightNode = _lightsNodeRef.get( light ); + _lightsNodeRef.set( light, new lightNodeClass( light ) ); } - lightNodes.push( lightNode ); + lightNode = _lightsNodeRef.get( light ); } + lightNodes.push( lightNode ); + } } @@ -42866,8 +42865,6 @@ class LightsNode extends Node { builder.lightsNode = this; - // - let outgoingLightNode = this.outgoingLightNode; const context = builder.context; @@ -42883,16 +42880,10 @@ class LightsNode extends Node { const stack = builder.addStack(); - // - properties.nodes = stack.nodes; - // - lightingModel.start( builder ); - // - const { backdrop, backdropAlpha } = context; const { directDiffuse, directSpecular, indirectDiffuse, indirectSpecular } = context.reflectedLight; @@ -42917,12 +42908,8 @@ class LightsNode extends Node { outgoingLightNode.assign( totalDiffuseNode.add( totalSpecularNode ) ); - // - lightingModel.finish( builder ); - // - outgoingLightNode = outgoingLightNode.bypass( builder.removeStack() ); } else { @@ -42931,8 +42918,6 @@ class LightsNode extends Node { } - // - builder.lightsNode = currentLightsNode; return outgoingLightNode; @@ -47490,6 +47475,7 @@ var TSL = /*#__PURE__*/Object.freeze({ refractView: refractView, reinhardToneMapping: reinhardToneMapping, remap: remap, + remapClamp: remapClamp, renderGroup: renderGroup, renderOutput: renderOutput, rendererReference: rendererReference, @@ -54138,11 +54124,16 @@ class NodeManager extends DataMap { if ( object.isRenderObject ) { const nodeBuilderState = this.get( object ).nodeBuilderState; - nodeBuilderState.usedTimes --; - if ( nodeBuilderState.usedTimes === 0 ) { + if ( nodeBuilderState !== undefined ) { + + nodeBuilderState.usedTimes --; + + if ( nodeBuilderState.usedTimes === 0 ) { - this.nodeBuilderCache.delete( this.getForRenderCacheKey( object ) ); + this.nodeBuilderCache.delete( this.getForRenderCacheKey( object ) ); + + } } @@ -55400,6 +55391,8 @@ class XRRenderTarget extends RenderTarget { const _cameraLPos = /*@__PURE__*/ new Vector3(); const _cameraRPos = /*@__PURE__*/ new Vector3(); +const _contextNodeLib = /*@__PURE__*/ new WeakMap(); + /** * The XR manager is built on top of the WebXR Device API to * manage XR sessions with `WebGPURenderer`. @@ -55561,8 +55554,6 @@ class XRManager extends EventDispatcher { */ this._supportsGlBinding = typeof XRWebGLBinding !== 'undefined'; - this._frameBufferTargets = null; - /** * Helper function to create native WebXR Layer. * @@ -56209,19 +56200,23 @@ class XRManager extends EventDispatcher { const renderer = this._renderer; const wasPresenting = this.isPresenting; - const rendererOutputTarget = renderer.getOutputRenderTarget(); - const rendererFramebufferTarget = renderer._frameBufferTarget; + this.isPresenting = false; const rendererSize = new Vector2(); renderer.getSize( rendererSize ); - const rendererQuad = renderer._quad; + + const currentRenderTarget = renderer.getRenderTarget(); for ( const layer of this._layers ) { layer.renderTarget.isXRRenderTarget = this._session !== null; layer.renderTarget._hasExternalTextures = layer.renderTarget.isXRRenderTarget; + const currentContextNode = renderer.contextNode; + + let contextNode; + if ( layer.renderTarget.isXRRenderTarget && this._sessionUsesLayers ) { layer.xrlayer.transform = new XRRigidTransform( layer.plane.getWorldPosition( translationObject ), layer.plane.getWorldQuaternion( quaternionObject ) ); @@ -56233,42 +56228,46 @@ class XRManager extends EventDispatcher { undefined ); renderer._setXRLayerSize( layer.renderTarget.width, layer.renderTarget.height ); - renderer.setOutputRenderTarget( layer.renderTarget ); - renderer.setRenderTarget( null ); - renderer._frameBufferTarget = null; - this._frameBufferTargets || ( this._frameBufferTargets = new WeakMap() ); - const { frameBufferTarget, quad } = this._frameBufferTargets.get( layer.renderTarget ) || { frameBufferTarget: null, quad: null }; - if ( ! frameBufferTarget ) { + contextNode = _contextNodeLib.get( currentContextNode ); - renderer._quad = new QuadMesh( new NodeMaterial() ); - this._frameBufferTargets.set( layer.renderTarget, { frameBufferTarget: renderer._getFrameBufferTarget(), quad: renderer._quad } ); + if ( contextNode === undefined ) { - } else { + // Apply ToneMapping and OutputColorSpace directly in the material shader - renderer._frameBufferTarget = frameBufferTarget; - renderer._quad = quad; + contextNode = currentContextNode.context( { - } + getOutput: ( outputNode ) => { + + return renderOutput( outputNode, renderer.toneMapping, renderer.outputColorSpace ); + + } + + } ); - layer.rendercall(); + _contextNodeLib.set( currentContextNode, contextNode ); - renderer._frameBufferTarget = null; + } } else { - renderer.setRenderTarget( layer.renderTarget ); - layer.rendercall(); + contextNode = currentContextNode; } + renderer.contextNode = contextNode; + + renderer.setRenderTarget( layer.renderTarget ); + + layer.rendercall(); + + renderer.contextNode = currentContextNode; + } - renderer.setRenderTarget( null ); - renderer.setOutputRenderTarget( rendererOutputTarget ); - renderer._frameBufferTarget = rendererFramebufferTarget; + renderer.setRenderTarget( currentRenderTarget ); renderer._setXRLayerSize( rendererSize.x, rendererSize.y ); - renderer._quad = rendererQuad; + this.isPresenting = wasPresenting; } @@ -58690,9 +58689,10 @@ class Renderer { const { width, height } = this.getDrawingBufferSize( _drawingBufferSize ); const { depth, stencil } = this; - const canvasTarget = this._canvasTarget; + // TODO: Unify CanvasTarget and OutputRenderTarget + const target = this._outputRenderTarget || this._canvasTarget; - let frameBufferTarget = this._frameBufferTargets.get( canvasTarget ); + let frameBufferTarget = this._frameBufferTargets.get( target ); if ( frameBufferTarget === undefined ) { @@ -58712,17 +58712,17 @@ class Renderer { const dispose = () => { - canvasTarget.removeEventListener( 'dispose', dispose ); + target.removeEventListener( 'dispose', dispose ); frameBufferTarget.dispose(); - this._frameBufferTargets.delete( canvasTarget ); + this._frameBufferTargets.delete( target ); }; - canvasTarget.addEventListener( 'dispose', dispose ); + target.addEventListener( 'dispose', dispose ); - this._frameBufferTargets.set( canvasTarget, frameBufferTarget ); + this._frameBufferTargets.set( target, frameBufferTarget ); } @@ -58730,6 +58730,7 @@ class Renderer { frameBufferTarget.depthBuffer = depth; frameBufferTarget.stencilBuffer = stencil; + if ( outputRenderTarget !== null ) { frameBufferTarget.setSize( outputRenderTarget.width, outputRenderTarget.height, outputRenderTarget.depth ); @@ -58740,11 +58741,18 @@ class Renderer { } - frameBufferTarget.viewport.copy( canvasTarget._viewport ); - frameBufferTarget.scissor.copy( canvasTarget._scissor ); - frameBufferTarget.viewport.multiplyScalar( canvasTarget._pixelRatio ); - frameBufferTarget.scissor.multiplyScalar( canvasTarget._pixelRatio ); - frameBufferTarget.scissorTest = canvasTarget._scissorTest; + // RenderTarget || CanvasTarget + + const viewport = this._outputRenderTarget ? this._outputRenderTarget.viewport : target._viewport; + const scissor = this._outputRenderTarget ? this._outputRenderTarget.scissor : target._scissor; + const pixelRatio = this._outputRenderTarget ? 1 : target._pixelRatio; + const scissorTest = this._outputRenderTarget ? this._outputRenderTarget.scissorTest : target._scissorTest; + + frameBufferTarget.viewport.copy( viewport ); + frameBufferTarget.scissor.copy( scissor ); + frameBufferTarget.viewport.multiplyScalar( pixelRatio ); + frameBufferTarget.scissor.multiplyScalar( pixelRatio ); + frameBufferTarget.scissorTest = scissorTest; frameBufferTarget.multiview = outputRenderTarget !== null ? outputRenderTarget.multiview : false; frameBufferTarget.resolveDepthBuffer = outputRenderTarget !== null ? outputRenderTarget.resolveDepthBuffer : true; frameBufferTarget._autoAllocateDepthBuffer = outputRenderTarget !== null ? outputRenderTarget._autoAllocateDepthBuffer : false; @@ -74830,7 +74838,7 @@ class WGSLNodeBuilder extends NodeBuilder { isUnfilterable( texture ) { return this.getComponentTypeFromTexture( texture ) !== 'float' || - ( ! this.isAvailable( 'float32Filterable' ) && texture.isDataTexture === true && texture.type === FloatType ) || + ( ! this.isAvailable( 'float32Filterable' ) && texture.type === FloatType ) || ( this.isSampleCompare( texture ) === false && texture.minFilter === NearestFilter && texture.magFilter === NearestFilter ) || this.renderer.backend.utils.getTextureSampleData( texture ).primarySamples > 1; @@ -77800,7 +77808,7 @@ class WebGPUBindingUtils { } - } else if ( binding.texture.isDataTexture || binding.texture.isDataArrayTexture || binding.texture.isData3DTexture ) { + } else if ( binding.texture.isDataTexture || binding.texture.isDataArrayTexture || binding.texture.isData3DTexture || binding.texture.isStorageTexture ) { const type = binding.texture.type; @@ -82963,6 +82971,43 @@ class NodeObjectLoader extends ObjectLoader { } +/** + * This version of a node library represents a basic version + * just focusing on lights and tone mapping techniques. + * + * @private + * @augments NodeLibrary + */ +class BasicNodeLibrary extends NodeLibrary { + + /** + * Constructs a new basic node library. + */ + constructor() { + + super(); + + this.addLight( PointLightNode, PointLight ); + this.addLight( DirectionalLightNode, DirectionalLight ); + this.addLight( RectAreaLightNode, RectAreaLight ); + this.addLight( SpotLightNode, SpotLight ); + this.addLight( AmbientLightNode, AmbientLight ); + this.addLight( HemisphereLightNode, HemisphereLight ); + this.addLight( LightProbeNode, LightProbe ); + this.addLight( IESSpotLightNode, IESSpotLight ); + this.addLight( ProjectorLightNode, ProjectorLight ); + + this.addToneMapping( linearToneMapping, LinearToneMapping ); + this.addToneMapping( reinhardToneMapping, ReinhardToneMapping ); + this.addToneMapping( cineonToneMapping, CineonToneMapping ); + this.addToneMapping( acesFilmicToneMapping, ACESFilmicToneMapping ); + this.addToneMapping( agxToneMapping, AgXToneMapping ); + this.addToneMapping( neutralToneMapping, NeutralToneMapping ); + + } + +} + /** * In earlier three.js versions, clipping was defined globally * on the renderer or on material level. This special version of @@ -83028,4 +83073,4 @@ class ClippingGroup extends Group { } -export { ACESFilmicToneMapping, AONode, AddEquation, AddOperation, AdditiveBlending, AgXToneMapping, AlphaFormat, AlwaysCompare, AlwaysDepth, AlwaysStencilFunc, AmbientLight, AmbientLightNode, AnalyticLightNode, ArrayCamera, ArrayElementNode, ArrayNode, AssignNode, AtomicFunctionNode, AttributeNode, BackSide, BarrierNode, BasicEnvironmentNode, BasicLightMapNode, BasicShadowMap, BatchNode, BitcastNode, BitcountNode, BlendMode, BoxGeometry, BufferAttribute, BufferAttributeNode, BufferGeometry, BufferNode, BuiltinNode, BumpMapNode, BundleGroup, BypassNode, ByteType, CanvasTarget, CineonToneMapping, ClampToEdgeWrapping, ClippingGroup, ClippingNode, CodeNode, Color, ColorManagement, ColorSpaceNode, Compatibility, ComputeBuiltinNode, ComputeNode, ConditionalNode, ConstNode, ContextNode, ConvertNode, CubeCamera, CubeDepthTexture, CubeMapNode, CubeReflectionMapping, CubeRefractionMapping, CubeRenderTarget, CubeTexture, CubeTextureNode, CubeUVReflectionMapping, CullFaceBack, CullFaceFront, CullFaceNone, CustomBlending, CylinderGeometry, DataArrayTexture, DataTexture, DebugNode, DecrementStencilOp, DecrementWrapStencilOp, DepthFormat, DepthStencilFormat, DepthTexture, DirectionalLight, DirectionalLightNode, DoubleSide, DstAlphaFactor, DstColorFactor, DynamicDrawUsage, EnvironmentNode, EqualCompare, EqualDepth, EqualStencilFunc, EquirectangularReflectionMapping, EquirectangularRefractionMapping, Euler, EventDispatcher, EventNode, ExpressionNode, FileLoader, FlipNode, Float16BufferAttribute, Float32BufferAttribute, FloatType, FramebufferTexture, FrontFacingNode, FrontSide, Frustum, FrustumArray, FunctionCallNode, FunctionNode, FunctionOverloadingNode, GLSLNodeParser, GreaterCompare, GreaterDepth, GreaterEqualCompare, GreaterEqualDepth, GreaterEqualStencilFunc, GreaterStencilFunc, Group, HalfFloatType, HemisphereLight, HemisphereLightNode, IESSpotLight, IESSpotLightNode, IncrementStencilOp, IncrementWrapStencilOp, IndexNode, IndirectStorageBufferAttribute, InputNode, InspectorBase, InspectorNode, InstanceNode, InstancedBufferAttribute, InstancedInterleavedBuffer, InstancedMeshNode, IntType, InterleavedBuffer, InterleavedBufferAttribute, InvertStencilOp, IrradianceNode, IsolateNode, JoinNode, KeepStencilOp, LessCompare, LessDepth, LessEqualCompare, LessEqualDepth, LessEqualStencilFunc, LessStencilFunc, LightProbe, LightProbeNode, Lighting, LightingContextNode, LightingModel, LightingNode, LightsNode, Line2NodeMaterial, LineBasicMaterial, LineBasicNodeMaterial, LineDashedMaterial, LineDashedNodeMaterial, LinearFilter, LinearMipMapLinearFilter, LinearMipmapLinearFilter, LinearMipmapNearestFilter, LinearSRGBColorSpace, LinearToneMapping, LinearTransfer, Loader, LoopNode, MRTNode, Material, MaterialBlending, MaterialLoader, MaterialNode, MaterialReferenceNode, MathNode, MathUtils, Matrix2, Matrix3, Matrix4, MaxEquation, MaxMipLevelNode, MemberNode, Mesh, MeshBasicMaterial, MeshBasicNodeMaterial, MeshLambertMaterial, MeshLambertNodeMaterial, MeshMatcapMaterial, MeshMatcapNodeMaterial, MeshNormalMaterial, MeshNormalNodeMaterial, MeshPhongMaterial, MeshPhongNodeMaterial, MeshPhysicalMaterial, MeshPhysicalNodeMaterial, MeshSSSNodeMaterial, MeshStandardMaterial, MeshStandardNodeMaterial, MeshToonMaterial, MeshToonNodeMaterial, MinEquation, MirroredRepeatWrapping, MixOperation, ModelNode, MorphNode, MultiplyBlending, MultiplyOperation, NearestFilter, NearestMipmapLinearFilter, NearestMipmapNearestFilter, NeutralToneMapping, NeverCompare, NeverDepth, NeverStencilFunc, NoBlending, NoColorSpace, NoNormalPacking, NoToneMapping, Node, NodeAccess, NodeAttribute, NodeBuilder, NodeCache, NodeCode, NodeError, NodeFrame, NodeFunctionInput, NodeLoader, NodeMaterial, NodeMaterialLoader, NodeMaterialObserver, NodeObjectLoader, NodeShaderStage, NodeType, NodeUniform, NodeUpdateType, NodeUtils, NodeVar, NodeVarying, NormalBlending, NormalGAPacking, NormalMapNode, NormalRGPacking, NotEqualCompare, NotEqualDepth, NotEqualStencilFunc, Object3D, Object3DNode, ObjectLoader, ObjectSpaceNormalMap, OneFactor, OneMinusDstAlphaFactor, OneMinusDstColorFactor, OneMinusSrcAlphaFactor, OneMinusSrcColorFactor, OperatorNode, OrthographicCamera, OutputStructNode, PCFShadowMap, PCFSoftShadowMap, PMREMGenerator, PMREMNode, PackFloatNode, ParameterNode, PassNode, PerspectiveCamera, PhongLightingModel, PhysicalLightingModel, Plane, PlaneGeometry, PointLight, PointLightNode, PointShadowNode, PointUVNode, PointsMaterial, PointsNodeMaterial, PostProcessing, ProjectorLight, ProjectorLightNode, PropertyNode, QuadMesh, Quaternion, R11_EAC_Format, RED_GREEN_RGTC2_Format, RED_RGTC1_Format, REVISION, RG11_EAC_Format, RGBAFormat, RGBAIntegerFormat, RGBA_ASTC_10x10_Format, RGBA_ASTC_10x5_Format, RGBA_ASTC_10x6_Format, RGBA_ASTC_10x8_Format, RGBA_ASTC_12x10_Format, RGBA_ASTC_12x12_Format, RGBA_ASTC_4x4_Format, RGBA_ASTC_5x4_Format, RGBA_ASTC_5x5_Format, RGBA_ASTC_6x5_Format, RGBA_ASTC_6x6_Format, RGBA_ASTC_8x5_Format, RGBA_ASTC_8x6_Format, RGBA_ASTC_8x8_Format, RGBA_BPTC_Format, RGBA_ETC2_EAC_Format, RGBA_PVRTC_2BPPV1_Format, RGBA_PVRTC_4BPPV1_Format, RGBA_S3TC_DXT1_Format, RGBA_S3TC_DXT3_Format, RGBA_S3TC_DXT5_Format, RGBFormat, RGBIntegerFormat, RGB_ETC1_Format, RGB_ETC2_Format, RGB_PVRTC_2BPPV1_Format, RGB_PVRTC_4BPPV1_Format, RGB_S3TC_DXT1_Format, RGFormat, RGIntegerFormat, RTTNode, RangeNode, RectAreaLight, RectAreaLightNode, RedFormat, RedIntegerFormat, ReferenceBaseNode, ReferenceNode, ReflectorNode, ReinhardToneMapping, RenderOutputNode, RenderPipeline, RenderTarget, RendererReferenceNode, RendererUtils, RepeatWrapping, ReplaceStencilOp, ReverseSubtractEquation, RotateNode, SIGNED_R11_EAC_Format, SIGNED_RED_GREEN_RGTC2_Format, SIGNED_RED_RGTC1_Format, SIGNED_RG11_EAC_Format, SRGBColorSpace, SRGBTransfer, SampleNode, Scene, ScreenNode, SetNode, ShadowBaseNode, ShadowMaterial, ShadowNode, ShadowNodeMaterial, ShortType, SkinningNode, Sphere, SphereGeometry, SplitNode, SpotLight, SpotLightNode, SpriteMaterial, SpriteNodeMaterial, SrcAlphaFactor, SrcAlphaSaturateFactor, SrcColorFactor, StackNode, StackTrace, StaticDrawUsage, Storage3DTexture, StorageArrayElementNode, StorageArrayTexture, StorageBufferAttribute, StorageBufferNode, StorageInstancedBufferAttribute, StorageTexture, StorageTextureNode, StructNode, StructTypeNode, SubBuildNode, SubgroupFunctionNode, SubtractEquation, SubtractiveBlending, TSL, TangentSpaceNormalMap, TempNode, Texture, Texture3DNode, TextureNode, TextureSizeNode, TimestampQuery, ToneMappingNode, ToonOutlinePassNode, UVMapping, Uint16BufferAttribute, Uint32BufferAttribute, UniformArrayNode, UniformGroupNode, UniformNode, UnpackFloatNode, UnsignedByteType, UnsignedInt101111Type, UnsignedInt248Type, UnsignedInt5999Type, UnsignedIntType, UnsignedShort4444Type, UnsignedShort5551Type, UnsignedShortType, UserDataNode, VSMShadowMap, VarNode, VaryingNode, Vector2, Vector3, Vector4, VelocityNode, VertexColorNode, ViewportDepthNode, ViewportDepthTextureNode, ViewportSharedTextureNode, ViewportTextureNode, VolumeNodeMaterial, WebGLBackend, WebGLCoordinateSystem, WebGPUBackend, WebGPUCoordinateSystem, WebGPURenderer, WebXRController, WorkgroupInfoNode, ZeroFactor, ZeroStencilOp, createCanvasElement, defaultBuildStages, defaultShaderStages, error, log$1 as log, shaderStages, vectorComponents, warn, warnOnce }; +export { ACESFilmicToneMapping, AONode, AddEquation, AddOperation, AdditiveBlending, AgXToneMapping, AlphaFormat, AlwaysCompare, AlwaysDepth, AlwaysStencilFunc, AmbientLight, AmbientLightNode, AnalyticLightNode, ArrayCamera, ArrayElementNode, ArrayNode, AssignNode, AtomicFunctionNode, AttributeNode, BackSide, BarrierNode, BasicEnvironmentNode, BasicLightMapNode, BasicNodeLibrary, BasicShadowMap, BatchNode, BitcastNode, BitcountNode, BlendMode, BoxGeometry, BufferAttribute, BufferAttributeNode, BufferGeometry, BufferNode, BuiltinNode, BumpMapNode, BundleGroup, BypassNode, ByteType, CanvasTarget, CineonToneMapping, ClampToEdgeWrapping, ClippingGroup, ClippingNode, CodeNode, Color, ColorManagement, ColorSpaceNode, Compatibility, ComputeBuiltinNode, ComputeNode, ConditionalNode, ConstNode, ContextNode, ConvertNode, CubeCamera, CubeDepthTexture, CubeMapNode, CubeReflectionMapping, CubeRefractionMapping, CubeRenderTarget, CubeTexture, CubeTextureNode, CubeUVReflectionMapping, CullFaceBack, CullFaceFront, CullFaceNone, CustomBlending, CylinderGeometry, DataArrayTexture, DataTexture, DebugNode, DecrementStencilOp, DecrementWrapStencilOp, DepthFormat, DepthStencilFormat, DepthTexture, DirectionalLight, DirectionalLightNode, DoubleSide, DstAlphaFactor, DstColorFactor, DynamicDrawUsage, EnvironmentNode, EqualCompare, EqualDepth, EqualStencilFunc, EquirectangularReflectionMapping, EquirectangularRefractionMapping, Euler, EventDispatcher, EventNode, ExpressionNode, FileLoader, FlipNode, Float16BufferAttribute, Float32BufferAttribute, FloatType, FramebufferTexture, FrontFacingNode, FrontSide, Frustum, FrustumArray, FunctionCallNode, FunctionNode, FunctionOverloadingNode, GLSLNodeBuilder, GLSLNodeParser, GreaterCompare, GreaterDepth, GreaterEqualCompare, GreaterEqualDepth, GreaterEqualStencilFunc, GreaterStencilFunc, Group, HalfFloatType, HemisphereLight, HemisphereLightNode, IESSpotLight, IESSpotLightNode, IncrementStencilOp, IncrementWrapStencilOp, IndexNode, IndirectStorageBufferAttribute, InputNode, InspectorBase, InspectorNode, InstanceNode, InstancedBufferAttribute, InstancedInterleavedBuffer, InstancedMeshNode, IntType, InterleavedBuffer, InterleavedBufferAttribute, InvertStencilOp, IrradianceNode, IsolateNode, JoinNode, KeepStencilOp, LessCompare, LessDepth, LessEqualCompare, LessEqualDepth, LessEqualStencilFunc, LessStencilFunc, LightProbe, LightProbeNode, Lighting, LightingContextNode, LightingModel, LightingNode, LightsNode, Line2NodeMaterial, LineBasicMaterial, LineBasicNodeMaterial, LineDashedMaterial, LineDashedNodeMaterial, LinearFilter, LinearMipMapLinearFilter, LinearMipmapLinearFilter, LinearMipmapNearestFilter, LinearSRGBColorSpace, LinearToneMapping, LinearTransfer, Loader, LoopNode, MRTNode, Material, MaterialBlending, MaterialLoader, MaterialNode, MaterialReferenceNode, MathNode, MathUtils, Matrix2, Matrix3, Matrix4, MaxEquation, MaxMipLevelNode, MemberNode, Mesh, MeshBasicMaterial, MeshBasicNodeMaterial, MeshLambertMaterial, MeshLambertNodeMaterial, MeshMatcapMaterial, MeshMatcapNodeMaterial, MeshNormalMaterial, MeshNormalNodeMaterial, MeshPhongMaterial, MeshPhongNodeMaterial, MeshPhysicalMaterial, MeshPhysicalNodeMaterial, MeshSSSNodeMaterial, MeshStandardMaterial, MeshStandardNodeMaterial, MeshToonMaterial, MeshToonNodeMaterial, MinEquation, MirroredRepeatWrapping, MixOperation, ModelNode, MorphNode, MultiplyBlending, MultiplyOperation, NearestFilter, NearestMipmapLinearFilter, NearestMipmapNearestFilter, NeutralToneMapping, NeverCompare, NeverDepth, NeverStencilFunc, NoBlending, NoColorSpace, NoNormalPacking, NoToneMapping, Node, NodeAccess, NodeAttribute, NodeBuilder, NodeCache, NodeCode, NodeError, NodeFrame, NodeFunctionInput, NodeLoader, NodeMaterial, NodeMaterialLoader, NodeMaterialObserver, NodeObjectLoader, NodeShaderStage, NodeType, NodeUniform, NodeUpdateType, NodeUtils, NodeVar, NodeVarying, NormalBlending, NormalGAPacking, NormalMapNode, NormalRGPacking, NotEqualCompare, NotEqualDepth, NotEqualStencilFunc, Object3D, Object3DNode, ObjectLoader, ObjectSpaceNormalMap, OneFactor, OneMinusDstAlphaFactor, OneMinusDstColorFactor, OneMinusSrcAlphaFactor, OneMinusSrcColorFactor, OperatorNode, OrthographicCamera, OutputStructNode, PCFShadowMap, PCFSoftShadowMap, PMREMGenerator, PMREMNode, PackFloatNode, ParameterNode, PassNode, PerspectiveCamera, PhongLightingModel, PhysicalLightingModel, Plane, PlaneGeometry, PointLight, PointLightNode, PointShadowNode, PointUVNode, PointsMaterial, PointsNodeMaterial, PostProcessing, ProjectorLight, ProjectorLightNode, PropertyNode, QuadMesh, Quaternion, R11_EAC_Format, RED_GREEN_RGTC2_Format, RED_RGTC1_Format, REVISION, RG11_EAC_Format, RGBAFormat, RGBAIntegerFormat, RGBA_ASTC_10x10_Format, RGBA_ASTC_10x5_Format, RGBA_ASTC_10x6_Format, RGBA_ASTC_10x8_Format, RGBA_ASTC_12x10_Format, RGBA_ASTC_12x12_Format, RGBA_ASTC_4x4_Format, RGBA_ASTC_5x4_Format, RGBA_ASTC_5x5_Format, RGBA_ASTC_6x5_Format, RGBA_ASTC_6x6_Format, RGBA_ASTC_8x5_Format, RGBA_ASTC_8x6_Format, RGBA_ASTC_8x8_Format, RGBA_BPTC_Format, RGBA_ETC2_EAC_Format, RGBA_PVRTC_2BPPV1_Format, RGBA_PVRTC_4BPPV1_Format, RGBA_S3TC_DXT1_Format, RGBA_S3TC_DXT3_Format, RGBA_S3TC_DXT5_Format, RGBFormat, RGBIntegerFormat, RGB_ETC1_Format, RGB_ETC2_Format, RGB_PVRTC_2BPPV1_Format, RGB_PVRTC_4BPPV1_Format, RGB_S3TC_DXT1_Format, RGFormat, RGIntegerFormat, RTTNode, RangeNode, RectAreaLight, RectAreaLightNode, RedFormat, RedIntegerFormat, ReferenceBaseNode, ReferenceNode, ReflectorNode, ReinhardToneMapping, RenderOutputNode, RenderPipeline, RenderTarget, RendererReferenceNode, RendererUtils, RepeatWrapping, ReplaceStencilOp, ReverseSubtractEquation, RotateNode, SIGNED_R11_EAC_Format, SIGNED_RED_GREEN_RGTC2_Format, SIGNED_RED_RGTC1_Format, SIGNED_RG11_EAC_Format, SRGBColorSpace, SRGBTransfer, SampleNode, Scene, ScreenNode, SetNode, ShadowBaseNode, ShadowMaterial, ShadowNode, ShadowNodeMaterial, ShortType, SkinningNode, Sphere, SphereGeometry, SplitNode, SpotLight, SpotLightNode, SpriteMaterial, SpriteNodeMaterial, SrcAlphaFactor, SrcAlphaSaturateFactor, SrcColorFactor, StackNode, StackTrace, StaticDrawUsage, Storage3DTexture, StorageArrayElementNode, StorageArrayTexture, StorageBufferAttribute, StorageBufferNode, StorageInstancedBufferAttribute, StorageTexture, StorageTextureNode, StructNode, StructTypeNode, SubBuildNode, SubgroupFunctionNode, SubtractEquation, SubtractiveBlending, TSL, TangentSpaceNormalMap, TempNode, Texture, Texture3DNode, TextureNode, TextureSizeNode, TimestampQuery, ToneMappingNode, ToonOutlinePassNode, UVMapping, Uint16BufferAttribute, Uint32BufferAttribute, UniformArrayNode, UniformGroupNode, UniformNode, UnpackFloatNode, UnsignedByteType, UnsignedInt101111Type, UnsignedInt248Type, UnsignedInt5999Type, UnsignedIntType, UnsignedShort4444Type, UnsignedShort5551Type, UnsignedShortType, UserDataNode, VSMShadowMap, VarNode, VaryingNode, Vector2, Vector3, Vector4, VelocityNode, VertexColorNode, ViewportDepthNode, ViewportDepthTextureNode, ViewportSharedTextureNode, ViewportTextureNode, VolumeNodeMaterial, WebGLBackend, WebGLCapabilities, WebGLCoordinateSystem, WebGPUBackend, WebGPUCoordinateSystem, WebGPURenderer, WebXRController, WorkgroupInfoNode, ZeroFactor, ZeroStencilOp, createCanvasElement, defaultBuildStages, defaultShaderStages, error, log$1 as log, shaderStages, vectorComponents, warn, warnOnce }; diff --git a/build/three.webgpu.min.js b/build/three.webgpu.min.js index 64004f97f9de88..3c18c38467c21e 100644 --- a/build/three.webgpu.min.js +++ b/build/three.webgpu.min.js @@ -3,4 +3,4 @@ * Copyright 2010-2026 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,error as o,EventDispatcher as u,MathUtils as l,warn as d,WebGLCoordinateSystem as c,WebGPUCoordinateSystem as h,ColorManagement as p,SRGBTransfer as g,NoToneMapping as m,StaticDrawUsage as f,InterleavedBufferAttribute as y,InterleavedBuffer as b,DynamicDrawUsage as x,NoColorSpace as T,log as _,warnOnce as v,Texture as N,UnsignedIntType as S,IntType as R,Compatibility as A,LessCompare as E,LessEqualCompare as w,GreaterCompare as C,GreaterEqualCompare as M,NearestFilter as B,Sphere as F,BackSide as L,DoubleSide as P,Euler as D,CubeTexture as U,CubeReflectionMapping as I,CubeRefractionMapping as O,TangentSpaceNormalMap as V,NoNormalPacking as k,NormalRGPacking as G,NormalGAPacking as z,ObjectSpaceNormalMap as $,RGFormat as W,RED_GREEN_RGTC2_Format as H,RG11_EAC_Format as q,InstancedBufferAttribute as j,InstancedInterleavedBuffer as X,DataArrayTexture as K,FloatType as Q,FramebufferTexture as Y,LinearMipmapLinearFilter as Z,DepthTexture as J,Material as ee,LineBasicMaterial as te,LineDashedMaterial as re,NoBlending as se,MeshNormalMaterial as ie,SRGBColorSpace as ne,RenderTarget as ae,BoxGeometry as oe,Mesh as ue,Scene as le,LinearFilter as de,CubeCamera as ce,EquirectangularReflectionMapping as he,EquirectangularRefractionMapping as pe,AddOperation as ge,MixOperation as me,MultiplyOperation as fe,MeshBasicMaterial as ye,MeshLambertMaterial as be,MeshPhongMaterial as xe,DataTexture as Te,HalfFloatType as _e,ClampToEdgeWrapping as ve,BufferGeometry as Ne,OrthographicCamera as Se,PerspectiveCamera as Re,LinearSRGBColorSpace as Ae,RGBAFormat as Ee,CubeUVReflectionMapping as we,BufferAttribute as Ce,MeshStandardMaterial as Me,MeshPhysicalMaterial as Be,MeshToonMaterial as Fe,MeshMatcapMaterial as Le,SpriteMaterial as Pe,PointsMaterial as De,ShadowMaterial as Ue,Uint32BufferAttribute as Ie,Uint16BufferAttribute as Oe,ByteType as Ve,UnsignedByteType as ke,ShortType as Ge,UnsignedShortType as ze,AlphaFormat as $e,RedFormat as We,RedIntegerFormat as He,DepthFormat as qe,DepthStencilFormat as je,RGBFormat as Xe,UnsignedShort4444Type as Ke,UnsignedShort5551Type as Qe,UnsignedInt248Type as Ye,UnsignedInt5999Type as Ze,UnsignedInt101111Type as Je,NormalBlending as et,SrcAlphaFactor as tt,OneMinusSrcAlphaFactor as rt,AddEquation as st,MaterialBlending as it,Plane as nt,Object3D as at,LinearMipMapLinearFilter as ot,Float32BufferAttribute as ut,UVMapping as lt,PCFShadowMap as dt,PCFSoftShadowMap as ct,VSMShadowMap as ht,BasicShadowMap as pt,CubeDepthTexture as gt,SphereGeometry as mt,LinearMipmapNearestFilter as ft,NearestMipmapLinearFilter as yt,Float16BufferAttribute as bt,yieldToMain as xt,REVISION as Tt,ArrayCamera as _t,PlaneGeometry as vt,FrontSide as Nt,CustomBlending as St,ZeroFactor as Rt,CylinderGeometry as At,Quaternion as Et,WebXRController as wt,RAD2DEG as Ct,FrustumArray as Mt,Frustum as Bt,RGIntegerFormat as Ft,RGBIntegerFormat as Lt,RGBAIntegerFormat as Pt,TimestampQuery as Dt,createCanvasElement as Ut,ReverseSubtractEquation as It,SubtractEquation as Ot,OneMinusDstAlphaFactor as Vt,OneMinusDstColorFactor as kt,OneMinusSrcColorFactor as Gt,DstAlphaFactor as zt,DstColorFactor as $t,SrcAlphaSaturateFactor as Wt,SrcColorFactor as Ht,OneFactor as qt,CullFaceNone as jt,CullFaceBack as Xt,CullFaceFront as Kt,MultiplyBlending as Qt,SubtractiveBlending as Yt,AdditiveBlending as Zt,NotEqualDepth as Jt,GreaterDepth as er,GreaterEqualDepth as tr,EqualDepth as rr,LessEqualDepth as sr,LessDepth as ir,AlwaysDepth as nr,NeverDepth as ar,ReversedDepthFuncs as or,RGB_S3TC_DXT1_Format as ur,RGBA_S3TC_DXT1_Format as lr,RGBA_S3TC_DXT3_Format as dr,RGBA_S3TC_DXT5_Format as cr,RGB_PVRTC_4BPPV1_Format as hr,RGB_PVRTC_2BPPV1_Format as pr,RGBA_PVRTC_4BPPV1_Format as gr,RGBA_PVRTC_2BPPV1_Format as mr,RGB_ETC1_Format as fr,RGB_ETC2_Format as yr,RGBA_ETC2_EAC_Format as br,R11_EAC_Format as xr,SIGNED_R11_EAC_Format as Tr,SIGNED_RG11_EAC_Format as _r,RGBA_ASTC_4x4_Format as vr,RGBA_ASTC_5x4_Format as Nr,RGBA_ASTC_5x5_Format as Sr,RGBA_ASTC_6x5_Format as Rr,RGBA_ASTC_6x6_Format as Ar,RGBA_ASTC_8x5_Format as Er,RGBA_ASTC_8x6_Format as wr,RGBA_ASTC_8x8_Format as Cr,RGBA_ASTC_10x5_Format as Mr,RGBA_ASTC_10x6_Format as Br,RGBA_ASTC_10x8_Format as Fr,RGBA_ASTC_10x10_Format as Lr,RGBA_ASTC_12x10_Format as Pr,RGBA_ASTC_12x12_Format as Dr,RGBA_BPTC_Format as Ur,RED_RGTC1_Format as Ir,SIGNED_RED_RGTC1_Format as Or,SIGNED_RED_GREEN_RGTC2_Format as Vr,MirroredRepeatWrapping as kr,RepeatWrapping as Gr,NearestMipmapNearestFilter as zr,NotEqualCompare as $r,EqualCompare as Wr,AlwaysCompare as Hr,NeverCompare as qr,LinearTransfer as jr,getByteLength as Xr,isTypedArray as Kr,NotEqualStencilFunc as Qr,GreaterStencilFunc as Yr,GreaterEqualStencilFunc as Zr,EqualStencilFunc as Jr,LessEqualStencilFunc as es,LessStencilFunc as ts,AlwaysStencilFunc as rs,NeverStencilFunc as ss,DecrementWrapStencilOp as is,IncrementWrapStencilOp as ns,DecrementStencilOp as as,IncrementStencilOp as os,InvertStencilOp as us,ReplaceStencilOp as ls,ZeroStencilOp as ds,KeepStencilOp as cs,MaxEquation as hs,MinEquation as ps,SpotLight as gs,PointLight as ms,DirectionalLight as fs,RectAreaLight as ys,AmbientLight as bs,HemisphereLight as xs,LightProbe as Ts,LinearToneMapping as _s,ReinhardToneMapping as vs,CineonToneMapping as Ns,ACESFilmicToneMapping as Ss,AgXToneMapping as Rs,NeutralToneMapping as As,Group as Es,Loader as ws,FileLoader as Cs,MaterialLoader as Ms,ObjectLoader as Bs}from"./three.core.min.js";export{AdditiveAnimationBlendMode,AnimationAction,AnimationClip,AnimationLoader,AnimationMixer,AnimationObjectGroup,AnimationUtils,ArcCurve,ArrowHelper,AttachedBindMode,Audio,AudioAnalyser,AudioContext,AudioListener,AudioLoader,AxesHelper,BasicDepthPacking,BatchedMesh,BezierInterpolant,Bone,BooleanKeyframeTrack,Box2,Box3,Box3Helper,BoxHelper,BufferGeometryLoader,Cache,Camera,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,ExternalTexture,ExtrudeGeometry,Fog,FogExp2,GLBufferAttribute,GLSL1,GLSL3,GridHelper,HemisphereLightHelper,IcosahedronGeometry,ImageBitmapLoader,ImageLoader,ImageUtils,InstancedBufferGeometry,InstancedMesh,Int16BufferAttribute,Int32BufferAttribute,Int8BufferAttribute,Interpolant,InterpolateBezier,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,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,TorusGeometry,TorusKnotGeometry,Triangle,TriangleFanDrawMode,TriangleStripDrawMode,TrianglesDrawMode,TubeGeometry,Uint8BufferAttribute,Uint8ClampedBufferAttribute,Uniform,UniformsGroup,VectorKeyframeTrack,VideoFrameTexture,VideoTexture,WebGL3DRenderTarget,WebGLArrayRenderTarget,WebGLRenderTarget,WireframeGeometry,WrapAroundEnding,ZeroCurvatureEnding,ZeroSlopeEnding,getConsoleFunction,setConsoleFunction}from"./three.core.min.js";const Fs=["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"],Ls=new WeakMap;class Ps{constructor(e){this.renderObjects=new WeakMap,this.hasNode=this.containsNode(e),this.hasAnimation=!0===e.object.isSkinnedMesh,this.refreshUniforms=Fs,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),indexId:r.index?r.index.id:null,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]={id:s.id,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!!(e.context.modelViewMatrix||e.context.modelNormalViewMatrix||e.context.getAO||e.context.getShadow)}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;if(o.id!==i.id)return o.id=i.id,!1;let d=0,c=0;for(const e in u)d++;for(const e in l){c++;const t=l[e],r=u[e];if(void 0===r)return delete l[e],!1;if(t.id!==r.id||t.version!==r.version)return t.id=r.id,t.version=r.version,!1}if(c!==d)return n.geometry.attributes=this.getAttributesData(u),!1;const h=i.index,p=o.indexId,g=o.indexVersion,m=h?h.id:null,f=h?h.version:null;if(p!==m||g!==f)return o.indexId=m,o.indexVersion=f,!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{const r=e.match(t);if(!r)return null;const s=r[1]||r[2]||"",i=r[3].split("?")[0],n=parseInt(r[4],10),a=parseInt(r[5],10);return{fn:s,file:i.split("/").pop(),line:n,column:a}}).filter(e=>e&&!Ds.some(t=>t.test(e.file)))}(e||(new Error).stack)}getLocation(){if(0===this.stack.length)return"[Unknown location]";const e=this.stack[0],t=e.fn;return`${t?`"${t}()" at `:""}"${e.file}:${e.line}"`}getError(e){if(0===this.stack.length)return e;return`${e}\n${this.stack.map(e=>{const t=`${e.file}:${e.line}:${e.column}`;return e.fn?` at ${e.fn} (${t})`:` at ${t}`}).join("\n")}`}}function Is(e,t=0){let r=3735928559^t,s=1103547991^t;if(e instanceof Array)for(let t,i=0;i>>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 Os=e=>Is(e),Vs=e=>Is(e),ks=(...e)=>Is(e),Gs=new Map([[1,"float"],[2,"vec2"],[3,"vec3"],[4,"vec4"],[9,"mat3"],[16,"mat4"]]),zs=new WeakMap;function $s(e){return Gs.get(e)}function Ws(e){if(/[iu]?vec\d/.test(e))return e.startsWith("ivec")?Int32Array:e.startsWith("uvec")?Uint32Array:Float32Array;if(/mat\d/.test(e))return Float32Array;if(/float/.test(e))return Float32Array;if(/uint/.test(e))return Uint32Array;if(/int/.test(e))return Int32Array;throw new Error(`THREE.NodeUtils: Unsupported type: ${e}`)}function Hs(e){return/float|int|uint/.test(e)?1:/vec2/.test(e)?2:/vec3/.test(e)?3:/vec4/.test(e)||/mat2/.test(e)?4:/mat3/.test(e)?9:/mat4/.test(e)?16:void o(`TSL: Unsupported type: ${e}`,new Us)}function qs(e){return/float|int|uint/.test(e)?1:/vec2/.test(e)?2:/vec3/.test(e)?3:/vec4/.test(e)||/mat2/.test(e)?4:/mat3/.test(e)?12:/mat4/.test(e)?16:void o(`TSL: Unsupported type: ${e}`,new Us)}function js(e){return/float|int|uint/.test(e)?4:/vec2/.test(e)?8:/vec3/.test(e)||/vec4/.test(e)?16:/mat2/.test(e)?8:/mat3/.test(e)||/mat4/.test(e)?16:void o(`TSL: Unsupported type: ${e}`,new Us)}function Xs(e){if(null==e)return null;const t=typeof e;return!0===e.isNode?"node":"number"===t?"float":"boolean"===t?"bool":"string"===t?"string":"function"===t?"shader":!0===e.isVector2?"vec2":!0===e.isVector3?"vec3":!0===e.isVector4?"vec4":!0===e.isMatrix2?"mat2":!0===e.isMatrix3?"mat3":!0===e.isMatrix4?"mat4":!0===e.isColor?"color":e instanceof ArrayBuffer?"ArrayBuffer":null}function Ks(o,...u){const l=o?o.slice(-4):void 0;return 1===u.length&&("vec2"===l?u=[u[0],u[0]]:"vec3"===l?u=[u[0],u[0],u[0]]:"vec4"===l&&(u=[u[0],u[0],u[0],u[0]])),"color"===o?new e(...u):"vec2"===l?new t(...u):"vec3"===l?new r(...u):"vec4"===l?new s(...u):"mat2"===l?new i(...u):"mat3"===l?new n(...u):"mat4"===l?new a(...u):"bool"===o?u[0]||!1:"float"===o||"int"===o||"uint"===o?u[0]||0:"string"===o?u[0]||"":"ArrayBuffer"===o?Zs(u[0]):null}function Qs(e){let t=zs.get(e);return void 0===t&&(t={},zs.set(e,t)),t}function Ys(e){let t="";const r=new Uint8Array(e);for(let e=0;ee.charCodeAt(0)).buffer}var Js=Object.freeze({__proto__:null,arrayBufferToBase64:Ys,base64ToArrayBuffer:Zs,getAlignmentFromType:js,getDataFromObject:Qs,getLengthFromType:Hs,getMemoryLengthFromType:qs,getTypeFromLength:$s,getTypedArrayFromType:Ws,getValueFromType:Ks,getValueType:Xs,hash:ks,hashArray:Vs,hashString:Os});const ei={VERTEX:"vertex",FRAGMENT:"fragment"},ti={NONE:"none",FRAME:"frame",RENDER:"render",OBJECT:"object"},ri={BOOLEAN:"bool",INTEGER:"int",FLOAT:"float",VECTOR2:"vec2",VECTOR3:"vec3",VECTOR4:"vec4",MATRIX2:"mat2",MATRIX3:"mat3",MATRIX4:"mat4"},si={READ_ONLY:"readOnly",WRITE_ONLY:"writeOnly",READ_WRITE:"readWrite"},ii=["fragment","vertex"],ni=["setup","analyze","generate"],ai=[...ii,"compute"],oi=["x","y","z","w"],ui={analyze:"setup",generate:"analyze"};let li=0;class di extends u{static get type(){return"Node"}constructor(e=null){super(),this.nodeType=e,this.updateType=ti.NONE,this.updateBeforeType=ti.NONE,this.updateAfterType=ti.NONE,this.version=0,this.name="",this.global=!1,this.parents=!1,this.isNode=!0,this._beforeNodes=null,this._cacheKey=null,this._uuid=null,this._cacheKeyVersion=0,this.id=li++,this.stackTrace=null,!0===di.captureStackTrace&&(this.stackTrace=new Us)}set needsUpdate(e){!0===e&&this.version++}get uuid(){return null===this._uuid&&(this._uuid=l.generateUUID()),this._uuid}get type(){return this.constructor.type}onUpdate(e,t){return this.updateType=t,this.update=e.bind(this),this}onFrameUpdate(e){return this.onUpdate(e,ti.FRAME)}onRenderUpdate(e){return this.onUpdate(e,ti.RENDER)}onObjectUpdate(e){return this.onUpdate(e,ti.OBJECT)}onReference(e){return this.updateReference=e.bind(this),this}updateReference(){return this}isGlobal(){return this.global}*getChildren(){for(const{childNode:e}of this._getChildren())yield e}dispose(){this.dispatchEvent({type:"dispose"})}traverse(e){e(this);for(const t of this.getChildren())t.traverse(e)}_getChildren(e=new Set){const t=[];e.add(this);for(const r of Object.getOwnPropertyNames(this)){const s=this[r];if(!0!==r.startsWith("_")&&!e.has(s))if(!0===Array.isArray(s))for(let e=0;e0&&(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}}di.captureStackTrace=!1;class ci extends di{static get type(){return"ArrayElementNode"}constructor(e,t){super(),this.node=e,this.indexNode=t,this.isArrayElementNode=!0}generateNodeType(e){return this.node.getElementType(e)}getMemberType(e,t){return this.node.getMemberType(e,t)}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 hi extends di{static get type(){return"ConvertNode"}constructor(e,t){super(),this.node=e,this.convertTo=t}generateNodeType(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 pi extends di{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 gi extends pi{static get type(){return"JoinNode"}constructor(e=[],t=null){super(t),this.nodes=e}generateNodeType(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 u=0;for(const t of i){if(u>=s){o(`TSL: Length of parameters exceeds maximum length of function '${r}()' type.`,this.stackTrace);break}let i,l=t.getNodeType(e),d=e.getTypeLength(l);u+d>s&&(o(`TSL: Length of '${r}()' data exceeds maximum length of output type.`,this.stackTrace),d=s-u,l=e.getTypeFromLength(d)),u+=d,i=t.build(e,l);if(e.getComponentType(l)!==n){const t=e.getTypeFromLength(d,n);i=e.format(i,l,t)}a.push(i)}const l=`${e.getType(r)}( ${a.join(", ")} )`;return e.format(l,r,t)}}const mi=oi.join("");class fi extends di{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(oi.indexOf(t)+1,e);return e}getComponentType(e){return e.getComponentType(this.node.getNodeType(e))}generateNodeType(e){return e.getTypeFromLength(this.components.length,this.getComponentType(e))}getScope(){return this.node.getScope()}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===mi.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 yi extends pi{static get type(){return"SetNode"}constructor(e,t,r){super(),this.sourceNode=e,this.components=t,this.targetNode=r}generateNodeType(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;e(e=>e.replace(/r|s/g,"x").replace(/g|t/g,"y").replace(/b|p/g,"z").replace(/a|q/g,"w"))(e).split("").sort().join("");di.prototype.assign=function(...e){if(!0!==this.isStackNode)return null!==Ni?Ni.assign(this,...e):o("TSL: No stack defined for assign operation. Make sure the assign is inside a Fn().",new Us),this;{const t=Si.get("assign");return this.addToStack(t(...e))}},di.prototype.toVarIntent=function(){return this},di.prototype.get=function(e){return new vi(this,e)};const Ei={};function wi(e,t,r){Ei[e]=Ei[t]=Ei[r]={get(){this._cache=this._cache||{};let t=this._cache[e];return void 0===t&&(t=new fi(this,e),this._cache[e]=t),t},set(t){this[e].assign(en(t))}};const s=e.toUpperCase(),i=t.toUpperCase(),n=r.toUpperCase();di.prototype["set"+s]=di.prototype["set"+i]=di.prototype["set"+n]=function(t){const r=Ai(e);return new yi(this,r,en(t))},di.prototype["flip"+s]=di.prototype["flip"+i]=di.prototype["flip"+n]=function(){const t=Ai(e);return new bi(this,t)}}const Ci=["x","y","z","w"],Mi=["r","g","b","a"],Bi=["s","t","p","q"];for(let e=0;e<4;e++){let t=Ci[e],r=Mi[e],s=Bi[e];wi(t,r,s);for(let i=0;i<4;i++){t=Ci[e]+Ci[i],r=Mi[e]+Mi[i],s=Bi[e]+Bi[i],wi(t,r,s);for(let n=0;n<4;n++){t=Ci[e]+Ci[i]+Ci[n],r=Mi[e]+Mi[i]+Mi[n],s=Bi[e]+Bi[i]+Bi[n],wi(t,r,s);for(let a=0;a<4;a++)t=Ci[e]+Ci[i]+Ci[n]+Ci[a],r=Mi[e]+Mi[i]+Mi[n]+Mi[a],s=Bi[e]+Bi[i]+Bi[n]+Bi[a],wi(t,r,s)}}}for(let e=0;e<32;e++)Ei[e]={get(){this._cache=this._cache||{};let t=this._cache[e];return void 0===t&&(t=new ci(this,new _i(e,"uint")),this._cache[e]=t),t},set(t){this[e].assign(en(t))}};Object.defineProperties(di.prototype,Ei);const Fi=new WeakMap,Li=function(e,t=null){for(const r in e)e[r]=en(e[r],t);return e},Pi=function(e,t=null){const r=e.length;for(let s=0;su?(o(`TSL: "${r}" parameter length exceeds limit.`,new Us),t.slice(0,u)):t}return null===t?n=(...t)=>i(new e(...sn(d(t)))):null!==r?(r=en(r),n=(...s)=>i(new e(t,...sn(d(s)),r))):n=(...r)=>i(new e(t,...sn(d(r)))),n.setParameterLength=(...e)=>(1===e.length?a=u=e[0]:2===e.length&&([a,u]=e),n),n.setName=e=>(l=e,n),n},Ui=function(e,...t){return new e(...sn(t))};class Ii extends di{constructor(e,t){super(),this.shaderNode=e,this.rawInputs=t,this.isShaderCallNodeInternal=!0}generateNodeType(e){return this.shaderNode.nodeType||this.getOutputNode(e).getNodeType(e)}getElementType(e){return this.getOutputNode(e).getElementType(e)}getMemberType(e,t){return this.getOutputNode(e).getMemberType(e,t)}call(e){const{shaderNode:t,rawInputs:r}=this,s=e.getNodeProperties(t),i=e.getClosestSubBuild(t.subBuilds)||"",n=i||"default";if(s[n])return s[n];const a=e.subBuildFn,o=e.fnCall;e.subBuildFn=i,e.fnCall=this;let u=null;if(t.layout){let s=Fi.get(e.constructor);void 0===s&&(s=new WeakMap,Fi.set(e.constructor,s));let i=s.get(t);void 0===i&&(i=en(e.buildFunctionNode(t)),s.set(t,i)),e.addInclude(i);const n=r?function(e){let t;rn(e);t=e[0]&&(e[0].isNode||Object.getPrototypeOf(e[0])!==Object.prototype)?[...e]:e[0];return t}(r):null;u=en(i.call(n))}else{const s=new Proxy(e,{get:(e,t,r)=>{let s;return s=Symbol.iterator===t?function*(){yield}:Reflect.get(e,t,r),s}}),i=r?function(e){let t=0;return rn(e),new Proxy(e,{get:(r,s,i)=>{let n;if("length"===s)return n=e.length,n;if(Symbol.iterator===s)n=function*(){for(const t of e)yield en(t)};else{if(e.length>0)if(Object.getPrototypeOf(e[0])===Object.prototype){const r=e[0];n=void 0===r[s]?r[t++]:Reflect.get(r,s,i)}else e[0]instanceof di&&(n=void 0===e[s]?e[t++]:Reflect.get(e,s,i));else n=Reflect.get(r,s,i);n=en(n)}return n}})}(r):null,n=Array.isArray(r)?r.length>0:null!==r,a=t.jsFunc,o=n||a.length>1?a(i,s):a(s);u=en(o)}return e.subBuildFn=a,e.fnCall=o,t.once&&(s[n]=u),u}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),o=e.fnCall;if(e.fnCall=this,"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 e.fnCall=o,r}}class Oi extends di{constructor(e,t){super(t),this.jsFunc=e,this.layout=null,this.global=!0,this.once=!1}setLayout(e){return this.layout=e,this}getLayout(){return this.layout}call(e=null){return new Ii(this,e)}setup(){return this.call()}}const Vi=[!1,!0],ki=[0,1,2,3],Gi=[-1,-2],zi=[.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],$i=new Map;for(const e of Vi)$i.set(e,new _i(e));const Wi=new Map;for(const e of ki)Wi.set(e,new _i(e,"uint"));const Hi=new Map([...Wi].map(e=>new _i(e.value,"int")));for(const e of Gi)Hi.set(e,new _i(e,"int"));const qi=new Map([...Hi].map(e=>new _i(e.value)));for(const e of zi)qi.set(e,new _i(e));for(const e of zi)qi.set(-e,new _i(-e));const ji={bool:$i,uint:Wi,ints:Hi,float:qi},Xi=new Map([...$i,...qi]),Ki=(e,t)=>Xi.has(e)?Xi.get(e):!0===e.isNode?e:new _i(e,t),Qi=function(e,t=null){return(...r)=>{for(const t of r)if(void 0===t)return o(`TSL: Invalid parameter for the type "${e}".`,new Us),new _i(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=[Ks(e,...r)]),1===r.length&&null!==t&&t.has(r[0]))return tn(t.get(r[0]));if(1===r.length){const t=Ki(r[0],e);return t.nodeType===e?tn(t):tn(new hi(t,e))}const s=r.map(e=>Ki(e));return tn(new gi(s,e))}};function Yi(e){return e&&e.isNode&&e.traverse(t=>{t.isConstNode&&(e=t.value)}),Boolean(e)}const Zi=e=>null!=e?e.nodeType||e.convertTo||("string"==typeof e?e:null):null;function Ji(e,t){return new Oi(e,t)}const en=(e,t=null)=>function(e,t=null){const r=Xs(e);return"node"===r?e:null===t&&("float"===r||"boolean"===r)||r&&"shader"!==r&&"string"!==r?en(Ki(e,t)):"shader"===r?e.isFn?e:dn(e):e}(e,t),tn=(e,t=null)=>en(e,t).toVarIntent(),rn=(e,t=null)=>new Li(e,t),sn=(e,t=null)=>new Pi(e,t),nn=(e,t=null,r=null,s=null)=>new Di(e,t,r,s),an=(e,...t)=>new Ui(e,...t),on=(e,t=null,r=null,s={})=>new Di(e,t,r,{...s,intent:!0});let un=0;class ln extends di{constructor(e,t=null){super();let r=null;null!==t&&("object"==typeof t?r=t.return:("string"==typeof t?r=t:o("TSL: Invalid layout type.",new Us),t=null)),this.shaderNode=new Ji(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"+un++,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}generateNodeType(e){return this.shaderNode.getNodeType(e)||"float"}call(...e){const t=this.shaderNode.call(e);return"void"===this.shaderNode.nodeType&&t.toStack(),t.toVarIntent()}once(e=null){return this.shaderNode.once=!0,this.shaderNode.subBuilds=e,this}generate(e){const t=this.getNodeType(e);return o('TSL: "Fn()" was declared but not invoked. Try calling it like "Fn()( ...params )".',this.stackTrace),e.generateConst(t)}}function dn(e,t=null){const r=new ln(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 cn=e=>{Ni=e},hn=()=>Ni,pn=(...e)=>Ni.If(...e);function gn(e){return Ni&&Ni.addToStack(e),e}Ri("toStack",gn);const mn=new Qi("color"),fn=new Qi("float",ji.float),yn=new Qi("int",ji.ints),bn=new Qi("uint",ji.uint),xn=new Qi("bool",ji.bool),Tn=new Qi("vec2"),_n=new Qi("ivec2"),vn=new Qi("uvec2"),Nn=new Qi("bvec2"),Sn=new Qi("vec3"),Rn=new Qi("ivec3"),An=new Qi("uvec3"),En=new Qi("bvec3"),wn=new Qi("vec4"),Cn=new Qi("ivec4"),Mn=new Qi("uvec4"),Bn=new Qi("bvec4"),Fn=new Qi("mat2"),Ln=new Qi("mat3"),Pn=new Qi("mat4");Ri("toColor",mn),Ri("toFloat",fn),Ri("toInt",yn),Ri("toUint",bn),Ri("toBool",xn),Ri("toVec2",Tn),Ri("toIVec2",_n),Ri("toUVec2",vn),Ri("toBVec2",Nn),Ri("toVec3",Sn),Ri("toIVec3",Rn),Ri("toUVec3",An),Ri("toBVec3",En),Ri("toVec4",wn),Ri("toIVec4",Cn),Ri("toUVec4",Mn),Ri("toBVec4",Bn),Ri("toMat2",Fn),Ri("toMat3",Ln),Ri("toMat4",Pn);const Dn=nn(ci).setParameterLength(2),Un=(e,t)=>new hi(en(e),t);Ri("element",Dn),Ri("convert",Un);Ri("append",e=>(d("TSL: .append() has been renamed to .toStack().",new Us),gn(e)));class In extends di{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}customCacheKey(){return Os(this.type+":"+(this.name||"")+":"+(this.varying?"1":"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 On=(e,t)=>new In(e,t),Vn=(e,t)=>new In(e,t,!0),kn=an(In,"vec4","DiffuseColor"),Gn=an(In,"vec3","DiffuseContribution"),zn=an(In,"vec3","EmissiveColor"),$n=an(In,"float","Roughness"),Wn=an(In,"float","Metalness"),Hn=an(In,"float","Clearcoat"),qn=an(In,"float","ClearcoatRoughness"),jn=an(In,"vec3","Sheen"),Xn=an(In,"float","SheenRoughness"),Kn=an(In,"float","Iridescence"),Qn=an(In,"float","IridescenceIOR"),Yn=an(In,"float","IridescenceThickness"),Zn=an(In,"float","AlphaT"),Jn=an(In,"float","Anisotropy"),ea=an(In,"vec3","AnisotropyT"),ta=an(In,"vec3","AnisotropyB"),ra=an(In,"color","SpecularColor"),sa=an(In,"color","SpecularColorBlended"),ia=an(In,"float","SpecularF90"),na=an(In,"float","Shininess"),aa=an(In,"vec4","Output"),oa=an(In,"float","dashSize"),ua=an(In,"float","gapSize"),la=an(In,"float","pointWidth"),da=an(In,"float","IOR"),ca=an(In,"float","Transmission"),ha=an(In,"float","Thickness"),pa=an(In,"float","AttenuationDistance"),ga=an(In,"color","AttenuationColor"),ma=an(In,"float","Dispersion");class fa extends di{static get type(){return"UniformGroupNode"}constructor(e,t=!1,r=1,s=null){super("string"),this.name=e,this.shared=t,this.order=r,this.updateType=s,this.isUniformGroup=!0}update(){this.needsUpdate=!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 ya=(e,t=1,r=null)=>new fa(e,!1,t,r),ba=(e,t=0,r=null)=>new fa(e,!0,t,r),xa=ba("frame",0,ti.FRAME),Ta=ba("render",0,ti.RENDER),_a=ya("object",1,ti.OBJECT);class va extends xi{static get type(){return"UniformNode"}constructor(e,t=null){super(e,t),this.isUniformNode=!0,this.name="",this.groupNode=_a}setName(e){return this.name=e,this}label(e){return d('TSL: "label()" has been deprecated. Use "setName()" instead.',new Us),this.setName(e)}setGroup(e){return this.groupNode=e,this}getGroup(){return this.groupNode}getUniformHash(e){return this.getHash(e)}onUpdate(e,t){return e=e.bind(this),super.onUpdate(t=>{const r=e(t,this);void 0!==r&&(this.value=r)},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 Na=(e,t)=>{const r=Zi(t||e);if(r===e&&(e=Ks(r)),e&&!0===e.isNode){let t=e.value;e.traverse(e=>{!0===e.isConstNode&&(t=e.value)}),e=t}return new va(e,r)};class Sa extends pi{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}generateNodeType(e){return null===this.nodeType?this.values[0].getNodeType(e):this.nodeType}getElementType(e){return this.getNodeType(e)}getMemberType(e,t){return null===this.nodeType?this.values[0].getMemberType(e,t):super.getMemberType(e,t)}generate(e){const t=this.getNodeType(e);return e.generateArray(t,this.count,this.values)}}const Ra=(...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 en(t)};Ri("toArray",(e,t)=>Ra(Array(t).fill(e)));class Aa extends pi{static get type(){return"AssignNode"}constructor(e,t){super(),this.targetNode=e,this.sourceNode=t,this.isAssignNode=!0}hasDependencies(){return!1}generateNodeType(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 oi.join("").slice(0,r)!==t.components}return!1}setup(e){const{targetNode:t,sourceNode:r}=this,s=t.getScope();e.getDataFromNode(s).assign=!0;const i=e.getNodeProperties(this);i.sourceNode=r,i.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)o("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?sn(t):rn(t[0]),new wa(en(e),t));Ri("call",Ca);const Ma={"==":"equal","!=":"notEqual","<":"lessThan",">":"greaterThan","<=":"lessThanEqual",">=":"greaterThanEqual","%":"mod"};class Ba extends pi{static get type(){return"OperatorNode"}constructor(e,t,r,...s){if(super(),s.length>0){let i=new Ba(e,t,r);for(let t=0;t>"===r||"<<"===r)return e.getIntegerType(n);if("!"===r||"&&"===r||"||"===r||"^^"===r)return"bool";if("=="===r||"!="===r||"<"===r||">"===r||"<="===r||">="===r){const t=Math.max(e.getTypeLength(n),e.getTypeLength(a));return t>1?`bvec${t}`:"bool"}if(e.isMatrix(n)){if("float"===a)return n;if(e.isVector(a))return e.getVectorFromMatrix(n);if(e.isMatrix(a))return n}else if(e.isMatrix(a)){if("float"===n)return a;if(e.isVector(n))return e.getVectorFromMatrix(a)}return e.getTypeLength(a)>e.getTypeLength(n)?a:n}generate(e,t){const r=this.op,{aNode:s,bNode:i}=this,n=this.getNodeType(e,t);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),l=i?i.build(e,o):null,d=e.getFunctionOperator(r);if("void"!==t){const s=e.renderer.coordinateSystem===c;if("=="===r||"!="===r||"<"===r||">"===r||"<="===r||">="===r)return s&&e.isVector(a)?e.format(`${this.getOperatorMethod(e,t)}( ${u}, ${l} )`,n,t):e.format(`( ${u} ${r} ${l} )`,n,t);if("%"===r)return e.isInteger(o)?e.format(`( ${u} % ${l} )`,n,t):e.format(`${this.getOperatorMethod(e,n)}( ${u}, ${l} )`,n,t);if("!"===r||"~"===r)return e.format(`(${r}${u})`,a,t);if(d)return e.format(`${d}( ${u}, ${l} )`,n,t);if(e.isMatrix(a)&&"float"===o)return e.format(`( ${l} ${r} ${u} )`,n,t);if("float"===a&&e.isMatrix(o))return e.format(`${u} ${r} ${l}`,n,t);{let i=`( ${u} ${r} ${l} )`;return!s&&"bool"===n&&e.isVector(a)&&e.isVector(o)&&(i=`all${i}`),e.format(i,n,t)}}if("void"!==a)return d?e.format(`${d}( ${u}, ${l} )`,n,t):e.isMatrix(a)&&"float"===o?e.format(`${l} ${r} ${u}`,n,t):e.format(`${u} ${r} ${l}`,n,t)}serialize(e){super.serialize(e),e.op=this.op}deserialize(e){super.deserialize(e),this.op=e.op}}const Fa=on(Ba,"+").setParameterLength(2,1/0).setName("add"),La=on(Ba,"-").setParameterLength(2,1/0).setName("sub"),Pa=on(Ba,"*").setParameterLength(2,1/0).setName("mul"),Da=on(Ba,"/").setParameterLength(2,1/0).setName("div"),Ua=on(Ba,"%").setParameterLength(2).setName("mod"),Ia=on(Ba,"==").setParameterLength(2).setName("equal"),Oa=on(Ba,"!=").setParameterLength(2).setName("notEqual"),Va=on(Ba,"<").setParameterLength(2).setName("lessThan"),ka=on(Ba,">").setParameterLength(2).setName("greaterThan"),Ga=on(Ba,"<=").setParameterLength(2).setName("lessThanEqual"),za=on(Ba,">=").setParameterLength(2).setName("greaterThanEqual"),$a=on(Ba,"&&").setParameterLength(2,1/0).setName("and"),Wa=on(Ba,"||").setParameterLength(2,1/0).setName("or"),Ha=on(Ba,"!").setParameterLength(1).setName("not"),qa=on(Ba,"^^").setParameterLength(2).setName("xor"),ja=on(Ba,"&").setParameterLength(2).setName("bitAnd"),Xa=on(Ba,"~").setParameterLength(1).setName("bitNot"),Ka=on(Ba,"|").setParameterLength(2).setName("bitOr"),Qa=on(Ba,"^").setParameterLength(2).setName("bitXor"),Ya=on(Ba,"<<").setParameterLength(2).setName("shiftLeft"),Za=on(Ba,">>").setParameterLength(2).setName("shiftRight"),Ja=dn(([e])=>(e.addAssign(1),e)),eo=dn(([e])=>(e.subAssign(1),e)),to=dn(([e])=>{const t=yn(e).toConst();return e.addAssign(1),t}),ro=dn(([e])=>{const t=yn(e).toConst();return e.subAssign(1),t});Ri("add",Fa),Ri("sub",La),Ri("mul",Pa),Ri("div",Da),Ri("mod",Ua),Ri("equal",Ia),Ri("notEqual",Oa),Ri("lessThan",Va),Ri("greaterThan",ka),Ri("lessThanEqual",Ga),Ri("greaterThanEqual",za),Ri("and",$a),Ri("or",Wa),Ri("not",Ha),Ri("xor",qa),Ri("bitAnd",ja),Ri("bitNot",Xa),Ri("bitOr",Ka),Ri("bitXor",Qa),Ri("shiftLeft",Ya),Ri("shiftRight",Za),Ri("incrementBefore",Ja),Ri("decrementBefore",eo),Ri("increment",to),Ri("decrement",ro);const so=(e,t)=>(d('TSL: "modInt()" is deprecated. Use "mod( int( ... ) )" instead.',new Us),Ua(yn(e),yn(t)));Ri("modInt",so);class io extends pi{static get type(){return"MathNode"}constructor(e,t,r=null,s=null){if(super(),(e===io.MAX||e===io.MIN)&&arguments.length>3){let i=new io(e,t,r);for(let t=2;tn&&i>a?t:n>a?r:a>i?s:t}generateNodeType(e){const t=this.method;return t===io.LENGTH||t===io.DISTANCE||t===io.DOT?"float":t===io.CROSS?"vec3":t===io.ALL||t===io.ANY?"bool":t===io.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===io.ONE_MINUS)i=La(1,t);else if(s===io.RECIPROCAL)i=Da(1,t);else if(s===io.DIFFERENCE)i=Fo(La(t,r));else if(s===io.TRANSFORM_DIRECTION){let s=t,n=r;e.isMatrix(s.getNodeType(e))?n=wn(Sn(n),0):s=wn(Sn(s),0);const a=Pa(s,n).xyz;i=So(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===io.NEGATE)return e.format("( - "+n.build(e,i)+" )",s,t);{const l=[];return r===io.CROSS?l.push(n.build(e,s),a.build(e,s)):u===c&&r===io.STEP?l.push(n.build(e,1===e.getTypeLength(n.getNodeType(e))?"float":i),a.build(e,i)):u!==c||r!==io.MIN&&r!==io.MAX?r===io.REFRACT?l.push(n.build(e,i),a.build(e,i),o.build(e,"float")):r===io.MIX?l.push(n.build(e,i),a.build(e,i),o.build(e,1===e.getTypeLength(o.getNodeType(e))?"float":i)):(u===h&&r===io.ATAN&&null!==a&&(r="atan2"),"fragment"===e.shaderStage||r!==io.DFDX&&r!==io.DFDY||(d(`TSL: '${r}' is not supported in the ${e.shaderStage} stage.`,this.stackTrace),r="/*"+r+"*/"),l.push(n.build(e,i)),null!==a&&l.push(a.build(e,i)),null!==o&&l.push(o.build(e,i))):l.push(n.build(e,i),a.build(e,1===e.getTypeLength(a.getNodeType(e))?"float":i)),e.format(`${e.getMethod(r,s)}( ${l.join(", ")} )`,s,t)}}serialize(e){super.serialize(e),e.method=this.method}deserialize(e){super.deserialize(e),this.method=e.method}}io.ALL="all",io.ANY="any",io.RADIANS="radians",io.DEGREES="degrees",io.EXP="exp",io.EXP2="exp2",io.LOG="log",io.LOG2="log2",io.SQRT="sqrt",io.INVERSE_SQRT="inversesqrt",io.FLOOR="floor",io.CEIL="ceil",io.NORMALIZE="normalize",io.FRACT="fract",io.SIN="sin",io.COS="cos",io.TAN="tan",io.ASIN="asin",io.ACOS="acos",io.ATAN="atan",io.ABS="abs",io.SIGN="sign",io.LENGTH="length",io.NEGATE="negate",io.ONE_MINUS="oneMinus",io.DFDX="dFdx",io.DFDY="dFdy",io.ROUND="round",io.RECIPROCAL="reciprocal",io.TRUNC="trunc",io.FWIDTH="fwidth",io.TRANSPOSE="transpose",io.DETERMINANT="determinant",io.INVERSE="inverse",io.EQUALS="equals",io.MIN="min",io.MAX="max",io.STEP="step",io.REFLECT="reflect",io.DISTANCE="distance",io.DIFFERENCE="difference",io.DOT="dot",io.CROSS="cross",io.POW="pow",io.TRANSFORM_DIRECTION="transformDirection",io.MIX="mix",io.CLAMP="clamp",io.REFRACT="refract",io.SMOOTHSTEP="smoothstep",io.FACEFORWARD="faceforward";const no=fn(1e-6),ao=fn(1e6),oo=fn(Math.PI),uo=fn(2*Math.PI),lo=fn(2*Math.PI),co=fn(.5*Math.PI),ho=on(io,io.ALL).setParameterLength(1),po=on(io,io.ANY).setParameterLength(1),go=on(io,io.RADIANS).setParameterLength(1),mo=on(io,io.DEGREES).setParameterLength(1),fo=on(io,io.EXP).setParameterLength(1),yo=on(io,io.EXP2).setParameterLength(1),bo=on(io,io.LOG).setParameterLength(1),xo=on(io,io.LOG2).setParameterLength(1),To=on(io,io.SQRT).setParameterLength(1),_o=on(io,io.INVERSE_SQRT).setParameterLength(1),vo=on(io,io.FLOOR).setParameterLength(1),No=on(io,io.CEIL).setParameterLength(1),So=on(io,io.NORMALIZE).setParameterLength(1),Ro=on(io,io.FRACT).setParameterLength(1),Ao=on(io,io.SIN).setParameterLength(1),Eo=on(io,io.COS).setParameterLength(1),wo=on(io,io.TAN).setParameterLength(1),Co=on(io,io.ASIN).setParameterLength(1),Mo=on(io,io.ACOS).setParameterLength(1),Bo=on(io,io.ATAN).setParameterLength(1,2),Fo=on(io,io.ABS).setParameterLength(1),Lo=on(io,io.SIGN).setParameterLength(1),Po=on(io,io.LENGTH).setParameterLength(1),Do=on(io,io.NEGATE).setParameterLength(1),Uo=on(io,io.ONE_MINUS).setParameterLength(1),Io=on(io,io.DFDX).setParameterLength(1),Oo=on(io,io.DFDY).setParameterLength(1),Vo=on(io,io.ROUND).setParameterLength(1),ko=on(io,io.RECIPROCAL).setParameterLength(1),Go=on(io,io.TRUNC).setParameterLength(1),zo=on(io,io.FWIDTH).setParameterLength(1),$o=on(io,io.TRANSPOSE).setParameterLength(1),Wo=on(io,io.DETERMINANT).setParameterLength(1),Ho=on(io,io.INVERSE).setParameterLength(1),qo=on(io,io.MIN).setParameterLength(2,1/0),jo=on(io,io.MAX).setParameterLength(2,1/0),Xo=on(io,io.STEP).setParameterLength(2),Ko=on(io,io.REFLECT).setParameterLength(2),Qo=on(io,io.DISTANCE).setParameterLength(2),Yo=on(io,io.DIFFERENCE).setParameterLength(2),Zo=on(io,io.DOT).setParameterLength(2),Jo=on(io,io.CROSS).setParameterLength(2),eu=on(io,io.POW).setParameterLength(2),tu=e=>Pa(e,e),ru=e=>Pa(e,e,e),su=e=>Pa(e,e,e,e),iu=on(io,io.TRANSFORM_DIRECTION).setParameterLength(2),nu=e=>Pa(Lo(e),eu(Fo(e),1/3)),au=e=>Zo(e,e),ou=on(io,io.MIX).setParameterLength(3),uu=(e,t=0,r=1)=>new io(io.CLAMP,en(e),en(t),en(r)),lu=e=>uu(e),du=on(io,io.REFRACT).setParameterLength(3),cu=on(io,io.SMOOTHSTEP).setParameterLength(3),hu=on(io,io.FACEFORWARD).setParameterLength(3),pu=dn(([e])=>{const t=Zo(e.xy,Tn(12.9898,78.233)),r=Ua(t,oo);return Ro(Ao(r).mul(43758.5453))}),gu=(e,t,r)=>ou(t,r,e),mu=(e,t,r)=>cu(t,r,e),fu=(e,t)=>Xo(t,e),yu=hu,bu=_o;Ri("all",ho),Ri("any",po),Ri("radians",go),Ri("degrees",mo),Ri("exp",fo),Ri("exp2",yo),Ri("log",bo),Ri("log2",xo),Ri("sqrt",To),Ri("inverseSqrt",_o),Ri("floor",vo),Ri("ceil",No),Ri("normalize",So),Ri("fract",Ro),Ri("sin",Ao),Ri("cos",Eo),Ri("tan",wo),Ri("asin",Co),Ri("acos",Mo),Ri("atan",Bo),Ri("abs",Fo),Ri("sign",Lo),Ri("length",Po),Ri("lengthSq",au),Ri("negate",Do),Ri("oneMinus",Uo),Ri("dFdx",Io),Ri("dFdy",Oo),Ri("round",Vo),Ri("reciprocal",ko),Ri("trunc",Go),Ri("fwidth",zo),Ri("min",qo),Ri("max",jo),Ri("step",fu),Ri("reflect",Ko),Ri("distance",Qo),Ri("dot",Zo),Ri("cross",Jo),Ri("pow",eu),Ri("pow2",tu),Ri("pow3",ru),Ri("pow4",su),Ri("transformDirection",iu),Ri("mix",gu),Ri("clamp",uu),Ri("refract",du),Ri("smoothstep",mu),Ri("faceForward",hu),Ri("difference",Yo),Ri("saturate",lu),Ri("cbrt",nu),Ri("transpose",$o),Ri("determinant",Wo),Ri("inverse",Ho),Ri("rand",pu);class xu extends di{static get type(){return"ConditionalNode"}constructor(e,t,r=null){super(),this.condNode=e,this.ifNode=t,this.elseNode=r}generateNodeType(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,r=this.ifNode.isolate(),s=this.elseNode?this.elseNode.isolate():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?On(r).build(e):"";s.nodeProperty=l;const c=i.build(e,"bool");if(e.context.uniformFlow&&null!==a){const s=n.build(e,r),i=a.build(e,r),o=e.getTernary(c,s,i);return e.format(o,r,t)}e.addFlowCode(`\n${e.tab}if ( ${c} ) {\n\n`).addFlowTab();let h=n.build(e,r);if(h&&(u?h=l+" = "+h+";":(h="return "+h+";",null===o&&(d("TSL: Return statement used in an inline 'Fn()'. Define a layout struct to allow return values.",this.stackTrace),h="// "+h))),e.removeFlowTab().addFlowCode(e.tab+"\t"+h+"\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&&(d("TSL: Return statement used in an inline 'Fn()'. Define a layout struct to allow return values.",this.stackTrace),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 Tu=nn(xu).setParameterLength(2,3);Ri("select",Tu);class _u extends di{static get type(){return"ContextNode"}constructor(e=null,t={}){super(),this.isContextNode=!0,this.node=e,this.value=t}getScope(){return this.node.getScope()}generateNodeType(e){return this.node.getNodeType(e)}getFlowContextData(){const e=[];return this.traverse(t=>{!0===t.isContextNode&&e.push(t.value)}),Object.assign({},...e)}getMemberType(e,t){return this.node.getMemberType(e,t)}analyze(e){const t=e.addContext(this.value);this.node.build(e),e.setContext(t)}setup(e){const t=e.addContext(this.value);this.node.build(e),e.setContext(t)}generate(e,t){const r=e.addContext(this.value),s=this.node.build(e,t);return e.setContext(r),s}}const vu=(e=null,t={})=>{let r=e;return null!==r&&!0===r.isNode||(t=r||t,r=null),new _u(r,t)},Nu=e=>vu(e,{uniformFlow:!0}),Su=(e,t)=>vu(e,{nodeName:t});function Ru(e,t,r=null){return vu(r,{getShadow:({light:r,shadowColorNode:s})=>t===r?s.mul(e):s})}function Au(e,t=null){return vu(t,{getAO:(t,{material:r})=>!0===r.transparent?t:null!==t?t.mul(e):e})}function Eu(e,t){return d('TSL: "label()" has been deprecated. Use "setName()" instead.'),Su(e,t)}Ri("context",vu),Ri("label",Eu),Ri("uniformFlow",Nu),Ri("setName",Su),Ri("builtinShadowContext",(e,t,r)=>Ru(t,r,e)),Ri("builtinAOContext",(e,t)=>Au(t,e));class wu extends di{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}isIntent(e){return!0!==e.getDataFromNode(this).forceDeclaration&&this.intent}getIntent(){return this.intent}getMemberType(e,t){return this.node.getMemberType(e,t)}getElementType(e){return this.node.getElementType(e)}generateNodeType(e){return this.node.getNodeType(e)}getArrayCount(e){return this.node.getArrayCount(e)}isAssign(e){return e.getDataFromNode(this).assign}build(...e){const t=e[0];if(!1===this._hasStack(t)&&"setup"===t.buildStage&&(t.context.nodeLoop||t.context.nodeBlock)){let e=!1;if(this.node.isShaderCallNodeInternal&&null===this.node.shaderNode.getLayout()&&t.fnCall&&t.fnCall.shaderNode){if(t.getDataFromNode(this.node.shaderNode).hasLoop){t.getDataFromNode(this).forceDeclaration=!0,e=!0}}const r=t.getBaseStack();e?r.addToStackBefore(this):r.addToStack(this)}return this.isIntent(t)&&!0!==this.isAssign(t)?this.node.build(...e):super.build(...e)}generate(e){const{node:t,name:r,readOnly:s}=this,{renderer:i}=e,n=!0===i.backend.isWebGPUBackend;let a=!1,u=!1;s&&(a=e.isDeterministic(t),u=n?s:a);const l=this.getNodeType(e);if("void"==l){!0!==this.isIntent(e)&&o('TSL: ".toVar()" can not be used with void type.',this.stackTrace);return t.build(e)}const d=e.getVectorType(l),c=t.build(e,d),h=e.getVarFromNode(this,r,d,void 0,u),p=e.getPropertyName(h);let g=p;if(u)if(n)g=a?`const ${p}`:`let ${p}`;else{const r=t.getArrayCount(e);g=`const ${e.getVar(h.type,p,r)}`}return e.addLineFlowCode(`${g} = ${c}`,this),p}_hasStack(e){return void 0!==e.getDataFromNode(this).stack}}const Cu=nn(wu),Mu=(e,t=null)=>Cu(e,t).toStack(),Bu=(e,t=null)=>Cu(e,t,!0).toStack(),Fu=e=>Cu(e).setIntent(!0).toStack();Ri("toVar",Mu),Ri("toConst",Bu),Ri("toVarIntent",Fu);class Lu extends di{static get type(){return"SubBuild"}constructor(e,t,r=null){super(r),this.node=e,this.name=t,this.isSubBuildNode=!0}generateNodeType(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 Pu=(e,t,r=null)=>new Lu(en(e),t,r);class Du extends di{static get type(){return"VaryingNode"}constructor(e,t=null){super(),this.node=Pu(e,"VERTEX"),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)}generateNodeType(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=Pu(this.node,"VERTEX")}return r.needsInterpolation||(r.needsInterpolation="fragment"===e.shaderStage),r}setup(e){this.setupVarying(e),e.flowNodeFromShaderStage(ei.VERTEX,this.node)}analyze(e){this.setupVarying(e),e.flowNodeFromShaderStage(ei.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,ei.VERTEX);e.flowNodeFromShaderStage(ei.VERTEX,r.node,i,n),r[t]=n}return e.getPropertyName(s)}}const Uu=nn(Du).setParameterLength(1,2),Iu=e=>Uu(e);Ri("toVarying",Uu),Ri("toVertexStage",Iu);const Ou=dn(([e])=>{const t=e.mul(.9478672986).add(.0521327014).pow(2.4),r=e.mul(.0773993808),s=e.lessThanEqual(.04045);return ou(t,r,s)}).setLayout({name:"sRGBTransferEOTF",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),Vu=dn(([e])=>{const t=e.pow(.41666).mul(1.055).sub(.055),r=e.mul(12.92),s=e.lessThanEqual(.0031308);return ou(t,r,s)}).setLayout({name:"sRGBTransferOETF",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),ku="WorkingColorSpace";class Gu extends pi{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===ku?p.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!==p.enabled&&r!==s&&r&&s?(p.getTransfer(r)===g&&(i=wn(Ou(i.rgb),i.a)),p.getPrimaries(r)!==p.getPrimaries(s)&&(i=wn(Ln(p._getMatrix(new n,r,s)).mul(i.rgb),i.a)),p.getTransfer(s)===g&&(i=wn(Vu(i.rgb),i.a)),i):i}}const zu=(e,t)=>new Gu(en(e),ku,t),$u=(e,t)=>new Gu(en(e),t,ku);Ri("workingToColorSpace",zu),Ri("colorSpaceToWorking",$u);let Wu=class extends ci{static get type(){return"ReferenceElementNode"}constructor(e,t){super(e,t),this.referenceNode=e,this.isReferenceElementNode=!0}generateNodeType(){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 Hu extends di{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=ti.OBJECT}setGroup(e){return this.group=e,this}element(e){return new Wu(this,en(e))}setNodeType(e){const t=Na(null,e);null!==this.group&&t.setGroup(this.group),this.node=t}generateNodeType(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;enew qu(e,t,r);class Xu extends pi{static get type(){return"ToneMappingNode"}constructor(e,t=Qu,r=null){super("vec3"),this._toneMapping=e,this.exposureNode=t,this.colorNode=r}customCacheKey(){return ks(this._toneMapping)}setToneMapping(e){return this._toneMapping=e,this}getToneMapping(){return this._toneMapping}setup(e){const t=this.colorNode||e.context.color,r=this._toneMapping;if(r===m)return t;let s=null;const i=e.renderer.library.getToneMappingFunction(r);return null!==i?s=wn(i(t.rgb,this.exposureNode),t.a):(o("ToneMappingNode: Unsupported Tone Mapping configuration.",r),s=t),s}}const Ku=(e,t,r)=>new Xu(e,en(t),en(r)),Qu=ju("toneMappingExposure","float");Ri("toneMapping",(e,t,r)=>Ku(t,r,e));const Yu=new WeakMap;function Zu(e,t){let r=Yu.get(e);return void 0===r&&(r=new b(e,t),Yu.set(e,r)),r}class Ju extends xi{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=f,this.instanced=!1,this.attribute=null,this.global=!0,e&&!0===e.isBufferAttribute&&e.itemSize<=4&&(this.attribute=e,this.usage=e.usage,this.instanced=e.isInstancedBufferAttribute)}getHash(e){let t;if(0===this.bufferStride&&0===this.bufferOffset){let r=e.globalCache.getData(this.value);void 0===r&&(r={node:this},e.globalCache.setData(this.value,r)),t=r.node.id}else t=this.id;return String(t)}generateNodeType(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=e.getTypeLength(t),s=this.value,i=this.bufferStride||r,n=this.bufferOffset;let a;a=!0===s.isInterleavedBuffer?s:!0===s.isBufferAttribute?Zu(s.array,i):Zu(s,i);const o=new y(a,r,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=Uu(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}}function el(e,t=null,r=0,s=0,i=f,n=!1){return"mat3"===t||null===t&&9===e.itemSize?Ln(new Ju(e,"vec3",9,0).setUsage(i).setInstanced(n),new Ju(e,"vec3",9,3).setUsage(i).setInstanced(n),new Ju(e,"vec3",9,6).setUsage(i).setInstanced(n)):"mat4"===t||null===t&&16===e.itemSize?Pn(new Ju(e,"vec4",16,0).setUsage(i).setInstanced(n),new Ju(e,"vec4",16,4).setUsage(i).setInstanced(n),new Ju(e,"vec4",16,8).setUsage(i).setInstanced(n),new Ju(e,"vec4",16,12).setUsage(i).setInstanced(n)):new Ju(e,t,r,s).setUsage(i)}const tl=(e,t=null,r=0,s=0)=>el(e,t,r,s),rl=(e,t=null,r=0,s=0)=>el(e,t,r,s,f,!0),sl=(e,t=null,r=0,s=0)=>el(e,t,r,s,x,!0);Ri("toAttribute",e=>tl(e.value));class il extends di{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=ti.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 d('TSL: "label()" has been deprecated. Use "setName()" instead.',new Us),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 nl=(e,t=[64])=>{(0===t.length||t.length>3)&&o("TSL: compute() workgroupSize must have 1, 2, or 3 elements",new Us);for(let e=0;enl(e,r).setCount(t);Ri("compute",al),Ri("computeKernel",nl);class ol extends di{static get type(){return"IsolateNode"}constructor(e,t=!0){super(),this.node=e,this.parent=t,this.isIsolateNode=!0}generateNodeType(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}setParent(e){return this.parent=e,this}getParent(){return this.parent}}const ul=e=>new ol(en(e));function ll(e,t=!0){return d('TSL: "cache()" has been deprecated. Use "isolate()" instead.'),ul(e).setParent(t)}Ri("cache",ll),Ri("isolate",ul);class dl extends di{static get type(){return"BypassNode"}constructor(e,t){super(),this.isBypassNode=!0,this.outputNode=e,this.callNode=t}generateNodeType(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 cl=nn(dl).setParameterLength(2);Ri("bypass",cl);const hl=dn(([e,t,r,s=fn(0),i=fn(1),n=xn(!1)])=>{let a=e.sub(t).div(r.sub(t));return Yi(n)&&(a=a.clamp()),a.mul(i.sub(s)).add(s)});Ri("remap",hl),Ri("remapClamp",function(e,t,r,s=fn(0),i=fn(1)){return hl(e,t,r,s,i,!0)});class pl extends di{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 gl=nn(pl).setParameterLength(1,2),ml=e=>(e?Tu(e,gl("discard")):gl("discard")).toStack();Ri("discard",ml);class fl extends pi{static get type(){return"RenderOutputNode"}constructor(e,t,r){super("vec4"),this.colorNode=e,this._toneMapping=t,this.outputColorSpace=r,this.isRenderOutputNode=!0}setToneMapping(e){return this._toneMapping=e,this}getToneMapping(){return this._toneMapping}setup({context:e}){let t=this.colorNode||e.color;const r=(null!==this._toneMapping?this._toneMapping:e.toneMapping)||m,s=(null!==this.outputColorSpace?this.outputColorSpace:e.outputColorSpace)||T;return r!==m&&(t=t.toneMapping(r)),s!==T&&s!==p.workingColorSpace&&(t=t.workingToColorSpace(s)),t}}const yl=(e,t=null,r=null)=>new fl(en(e),t,r);Ri("renderOutput",yl);class bl extends pi{static get type(){return"DebugNode"}constructor(e,t=null){super(),this.node=e,this.callback=t}generateNodeType(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);if(null!==t)t(e,r);else{const t="--- TSL debug - "+e.shaderStage+" shader ---",s="-".repeat(t.length);let i="";i+="// #"+t+"#\n",i+=e.flow.code.replace(/^\t/gm,"")+"\n",i+="/* ... */ "+r+" /* ... */\n",i+="// #"+s+"#\n",_(i)}return r}}const xl=(e,t=null)=>new bl(en(e),t).toStack();Ri("debug",xl);class Tl{constructor(){this._renderer=null,this.currentFrame=null}get nodeFrame(){return this._renderer._nodes.nodeFrame}setRenderer(e){return this._renderer=e,this}getRenderer(){return this._renderer}init(){}begin(){}finish(){}inspect(){}computeAsync(){}beginCompute(){}finishCompute(){}beginRender(){}finishRender(){}copyTextureToTexture(){}copyFramebufferToTexture(){}}class _l extends di{static get type(){return"InspectorNode"}constructor(e,t="",r=null){super(),this.node=e,this.name=t,this.callback=r,this.updateType=ti.FRAME,this.isInspectorNode=!0}getName(){return this.name||this.node.name}update(e){e.renderer.inspector.inspect(this)}generateNodeType(e){return this.node.getNodeType(e)}setup(e){let t=this.node;return!0===e.context.inspector&&null!==this.callback&&(t=this.callback(t)),!0!==e.renderer.backend.isWebGPUBackend&&e.renderer.inspector.constructor!==Tl&&v('TSL: ".toInspector()" is only available with WebGPU.'),t}}function vl(e,t="",r=null){return(e=en(e)).before(new _l(e,t,r))}Ri("toInspector",vl);class Nl extends di{static get type(){return"AttributeNode"}constructor(e,t=null){super(t),this.global=!0,this._attributeName=e}getHash(e){return this.getAttributeName(e)}generateNodeType(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 Uu(this).build(e,r)}return d(`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 Sl=(e,t=null)=>new Nl(e,t),Rl=(e=0)=>Sl("uv"+(e>0?e:""),"vec2");class Al extends di{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=nn(Al).setParameterLength(1,2);class wl extends va{static get type(){return"MaxMipLevelNode"}constructor(e){super(0),this._textureNode=e,this.updateType=ti.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 Cl=nn(wl).setParameterLength(1);class Ml extends Error{constructor(e,t=null){super(e),this.name="NodeError",this.stackTrace=t}}const Bl=new N;class Fl extends va{static get type(){return"TextureNode"}constructor(e=Bl,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.offsetNode=null,this.sampler=!0,this.updateMatrix=!1,this.updateType=ti.NONE,this.referenceNode=null,this._value=e,this._matrixUniform=null,this._flipYUniform=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}generateNodeType(){return!0===this.value.isDepthTexture?"float":this.value.type===S?"uvec4":this.value.type===R?"ivec4":"vec4"}getInputType(){return"texture"}getDefaultUV(){return Rl(this.value.channel)}updateReference(){return this.value}getTransformedUV(e){return null===this._matrixUniform&&(this._matrixUniform=Na(this.value.matrix)),this._matrixUniform.mul(Sn(e,1)).xy}setUpdateMatrix(e){return this.updateMatrix=e,this}setupUV(e,t){return e.isFlipY()&&(null===this._flipYUniform&&(this._flipYUniform=Na(!1)),t=t.toVar(),t=this.sampler?this._flipYUniform.select(t.flipY(),t):this._flipYUniform.select(t.setY(yn(El(this,this.levelNode).y).sub(t.y).sub(1)),t)),t}setup(e){const t=e.getNodeProperties(this);t.referenceNode=this.referenceNode;const r=this.value;if(!r||!0!==r.isTexture)throw new Ml("THREE.TSL: `texture( value )` function expects a valid instance of THREE.Texture().",this.stackTrace);const s=dn(()=>{let t=this.uvNode;return null!==t&&!0!==e.context.forceUVContext||!e.context.getUV||(t=e.context.getUV(this,e)),t||(t=this.getDefaultUV()),!0===this.updateMatrix&&(t=this.getTransformedUV(t)),t=this.setupUV(e,t),this.updateType=null!==this._matrixUniform||null!==this._flipYUniform?ti.OBJECT:ti.NONE,t})();let i=this.levelNode;null===i&&e.context.getTextureLevel&&(i=e.context.getTextureLevel(this));let n=null,a=null;if(null!==this.compareNode)if(e.renderer.hasCompatibility(A.TEXTURE_COMPARE))n=this.compareNode;else{const e=r.compareFunction;null===e||e===E||e===w||e===C||e===M?a=this.compareNode:(n=this.compareNode,v('TSL: Only "LessCompare", "LessEqualCompare", "GreaterCompare" and "GreaterEqualCompare" are supported for depth texture comparison fallback.'))}t.uvNode=s,t.levelNode=i,t.biasNode=this.biasNode,t.compareNode=n,t.compareStepNode=a,t.gradNode=this.gradNode,t.depthNode=this.depthNode,t.offsetNode=this.offsetNode}generateUV(e,t){return t.build(e,!0===this.sampler?"vec2":"ivec2")}generateOffset(e,t){return t.build(e,"ivec2")}generateSnippet(e,t,r,s,i,n,a,o,u){const l=this.value;let d;return d=i?e.generateTextureBias(l,t,r,i,n,u):o?e.generateTextureGrad(l,t,r,o,n,u):a?e.generateTextureCompare(l,t,r,a,n,u):!1===this.sampler?e.generateTextureLoad(l,t,r,s,n,u):s?e.generateTextureLevel(l,t,r,s,n,u):e.generateTexture(l,t,r,n,u),d}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),a=this.getNodeType(e);let o=n.propertyName;if(void 0===o){const{uvNode:t,levelNode:u,biasNode:l,compareNode:d,compareStepNode:c,depthNode:h,gradNode:p,offsetNode:g}=s,m=this.generateUV(e,t),f=u?u.build(e,"float"):null,y=l?l.build(e,"float"):null,b=h?h.build(e,"int"):null,x=d?d.build(e,"float"):null,T=c?c.build(e,"float"):null,_=p?[p[0].build(e,"vec2"),p[1].build(e,"vec2")]:null,v=g?this.generateOffset(e,g):null;let N=b;null===N&&r.isArrayTexture&&!0!==this.isTexture3DNode&&(N="0");const S=e.getVarFromNode(this);o=e.getPropertyName(S);let R=this.generateSnippet(e,i,m,f,y,N,x,_,v);if(null!==T){const t=r.compareFunction;R=t===C||t===M?Xo(gl(R,a),gl(T,"float")).build(e,a):Xo(gl(T,"float"),gl(R,a)).build(e,a)}e.addLineFlowCode(`${o} = ${R}`,this),n.snippet=R,n.propertyName=o}let u=o;return e.needsToWorkingColorSpace(r)&&(u=$u(gl(u,a),r.colorSpace).setup(e).build(e,a)),e.format(u,a,t)}}setSampler(e){return this.sampler=e,this}getSampler(){return this.sampler}sample(e){const t=this.clone();return t.uvNode=en(e),t.referenceNode=this.getBase(),en(t)}load(e){return this.sample(e).setSampler(!1)}blur(e){const t=this.clone();t.biasNode=en(e).mul(Cl(t)),t.referenceNode=this.getBase();const r=t.value;return!1===t.generateMipmaps&&(r&&!1===r.generateMipmaps||r.minFilter===B||r.magFilter===B)&&(d("TSL: texture().blur() requires mipmaps and sampling. Use .generateMipmaps=true and .minFilter/.magFilter=THREE.LinearFilter in the Texture."),t.biasNode=null),en(t)}level(e){const t=this.clone();return t.levelNode=en(e),t.referenceNode=this.getBase(),en(t)}size(e){return El(this,e)}bias(e){const t=this.clone();return t.biasNode=en(e),t.referenceNode=this.getBase(),en(t)}getBase(){return this.referenceNode?this.referenceNode.getBase():this}compare(e){const t=this.clone();return t.compareNode=en(e),t.referenceNode=this.getBase(),en(t)}grad(e,t){const r=this.clone();return r.gradNode=[en(e),en(t)],r.referenceNode=this.getBase(),en(r)}depth(e){const t=this.clone();return t.depthNode=en(e),t.referenceNode=this.getBase(),en(t)}offset(e){const t=this.clone();return t.offsetNode=en(e),t.referenceNode=this.getBase(),en(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();const r=this._flipYUniform;null!==r&&(r.value=e.image instanceof ImageBitmap&&!0===e.flipY||!0===e.isRenderTargetTexture||!0===e.isFramebufferTexture||!0===e.isDepthTexture)}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.offsetNode=this.offsetNode,e}}const Ll=nn(Fl).setParameterLength(1,4).setName("texture"),Pl=(e=Bl,t=null,r=null,s=null)=>{let i;return e&&!0===e.isTextureNode?(i=en(e.clone()),i.referenceNode=e.getBase(),null!==t&&(i.uvNode=en(t)),null!==r&&(i.levelNode=en(r)),null!==s&&(i.biasNode=en(s))):i=Ll(e,t,r,s),i},Dl=(...e)=>Pl(...e).setSampler(!1);class Ul extends va{static get type(){return"BufferNode"}constructor(e,t,r=0){super(e,t),this.isBufferNode=!0,this.bufferType=t,this.bufferCount=r,this.updateRanges=[]}addUpdateRange(e,t){this.updateRanges.push({start:e,count:t})}clearUpdateRanges(){this.updateRanges.length=0}getElementType(e){return this.getNodeType(e)}getInputType(){return"buffer"}}const Il=(e,t,r)=>new Ul(e,t,r);class Ol extends ci{static get type(){return"UniformArrayElementNode"}constructor(e,t){super(e,t),this.isArrayBufferElementNode=!0}generate(e){const t=super.generate(e),r=this.getNodeType(e),s=this.node.getPaddedType();return e.format(t,s,r)}}class Vl extends Ul{static get type(){return"UniformArrayNode"}constructor(e,t=null){super(null),this.array=e,this.elementType=null===t?Xs(e[0]):t,this.paddedType=this.getPaddedType(),this.updateType=ti.RENDER,this.isArrayBufferNode=!0}generateNodeType(){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;rnew Vl(e,t);class Gl extends di{constructor(e){super("float"),this.name=e,this.isBuiltinNode=!0}generate(){return this.name}}const zl=nn(Gl).setParameterLength(1);let $l,Wl;class Hl extends di{static get type(){return"ScreenNode"}constructor(e){super(),this.scope=e,this._output=null,this.isViewportNode=!0}generateNodeType(){return this.scope===Hl.DPR?"float":this.scope===Hl.VIEWPORT?"vec4":"vec2"}getUpdateType(){let e=ti.NONE;return this.scope!==Hl.SIZE&&this.scope!==Hl.VIEWPORT&&this.scope!==Hl.DPR||(e=ti.RENDER),this.updateType=e,e}update({renderer:e}){const t=e.getRenderTarget();this.scope===Hl.VIEWPORT?null!==t?Wl.copy(t.viewport):(e.getViewport(Wl),Wl.multiplyScalar(e.getPixelRatio())):this.scope===Hl.DPR?this._output.value=e.getPixelRatio():null!==t?($l.width=t.width,$l.height=t.height):e.getDrawingBufferSize($l)}setup(){const e=this.scope;let r=null;return r=e===Hl.SIZE?Na($l||($l=new t)):e===Hl.VIEWPORT?Na(Wl||(Wl=new s)):e===Hl.DPR?Na(1):Tn(Kl.div(Xl)),this._output=r,r}generate(e){if(this.scope===Hl.COORDINATE){let t=e.getFragCoord();if(e.isFlipY()){const r=e.getNodeProperties(Xl).outputNode.build(e);t=`${e.getType("vec2")}( ${t}.x, ${r}.y - ${t}.y )`}return t}return super.generate(e)}}Hl.COORDINATE="coordinate",Hl.VIEWPORT="viewport",Hl.SIZE="size",Hl.UV="uv",Hl.DPR="dpr";const ql=an(Hl,Hl.DPR),jl=an(Hl,Hl.UV),Xl=an(Hl,Hl.SIZE),Kl=an(Hl,Hl.COORDINATE),Ql=an(Hl,Hl.VIEWPORT),Yl=Ql.zw,Zl=Kl.sub(Ql.xy),Jl=Zl.div(Yl),ed=dn(()=>(d('TSL: "viewportResolution" is deprecated. Use "screenSize" instead.',new Us),Xl),"vec2").once()();let td=null,rd=null,sd=null,id=null,nd=null,ad=null,od=null,ud=null,ld=null,dd=null,cd=null,hd=null,pd=null,gd=null;const md=Na(0,"uint").setName("u_cameraIndex").setGroup(ba("cameraIndex")).toVarying("v_cameraIndex"),fd=Na("float").setName("cameraNear").setGroup(Ta).onRenderUpdate(({camera:e})=>e.near),yd=Na("float").setName("cameraFar").setGroup(Ta).onRenderUpdate(({camera:e})=>e.far),bd=dn(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.projectionMatrix);null===rd?rd=kl(r).setGroup(Ta).setName("cameraProjectionMatrices"):rd.array=r,t=rd.element(e.isMultiViewCamera?zl("gl_ViewID_OVR"):md).toConst("cameraProjectionMatrix")}else null===td&&(td=Na(e.projectionMatrix).setName("cameraProjectionMatrix").setGroup(Ta).onRenderUpdate(({camera:e})=>e.projectionMatrix)),t=td;return t}).once()(),xd=dn(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.projectionMatrixInverse);null===id?id=kl(r).setGroup(Ta).setName("cameraProjectionMatricesInverse"):id.array=r,t=id.element(e.isMultiViewCamera?zl("gl_ViewID_OVR"):md).toConst("cameraProjectionMatrixInverse")}else null===sd&&(sd=Na(e.projectionMatrixInverse).setName("cameraProjectionMatrixInverse").setGroup(Ta).onRenderUpdate(({camera:e})=>e.projectionMatrixInverse)),t=sd;return t}).once()(),Td=dn(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.matrixWorldInverse);null===ad?ad=kl(r).setGroup(Ta).setName("cameraViewMatrices"):ad.array=r,t=ad.element(e.isMultiViewCamera?zl("gl_ViewID_OVR"):md).toConst("cameraViewMatrix")}else null===nd&&(nd=Na(e.matrixWorldInverse).setName("cameraViewMatrix").setGroup(Ta).onRenderUpdate(({camera:e})=>e.matrixWorldInverse)),t=nd;return t}).once()(),_d=dn(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.matrixWorld);null===ud?ud=kl(r).setGroup(Ta).setName("cameraWorldMatrices"):ud.array=r,t=ud.element(e.isMultiViewCamera?zl("gl_ViewID_OVR"):md).toConst("cameraWorldMatrix")}else null===od&&(od=Na(e.matrixWorld).setName("cameraWorldMatrix").setGroup(Ta).onRenderUpdate(({camera:e})=>e.matrixWorld)),t=od;return t}).once()(),vd=dn(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.normalMatrix);null===dd?dd=kl(r).setGroup(Ta).setName("cameraNormalMatrices"):dd.array=r,t=dd.element(e.isMultiViewCamera?zl("gl_ViewID_OVR"):md).toConst("cameraNormalMatrix")}else null===ld&&(ld=Na(e.normalMatrix).setName("cameraNormalMatrix").setGroup(Ta).onRenderUpdate(({camera:e})=>e.normalMatrix)),t=ld;return t}).once()(),Nd=dn(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const s=[];for(let t=0,i=e.cameras.length;t{const r=e.cameras,s=t.array;for(let e=0,t=r.length;et.value.setFromMatrixPosition(e.matrixWorld))),t=cd;return t}).once()(),Sd=dn(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.viewport);null===gd?gd=kl(r,"vec4").setGroup(Ta).setName("cameraViewports"):gd.array=r,t=gd.element(md).toConst("cameraViewport")}else null===pd&&(pd=wn(0,0,Xl.x,Xl.y).toConst("cameraViewport")),t=pd;return t}).once()(),Rd=new F;class Ad extends di{static get type(){return"Object3DNode"}constructor(e,t=null){super(),this.scope=e,this.object3d=t,this.updateType=ti.OBJECT,this.uniformNode=new va(null)}generateNodeType(){const e=this.scope;return e===Ad.WORLD_MATRIX?"mat4":e===Ad.POSITION||e===Ad.VIEW_POSITION||e===Ad.DIRECTION||e===Ad.SCALE?"vec3":e===Ad.RADIUS?"float":void 0}update(e){const t=this.object3d,s=this.uniformNode,i=this.scope;if(i===Ad.WORLD_MATRIX)s.value=t.matrixWorld;else if(i===Ad.POSITION)s.value=s.value||new r,s.value.setFromMatrixPosition(t.matrixWorld);else if(i===Ad.SCALE)s.value=s.value||new r,s.value.setFromMatrixScale(t.matrixWorld);else if(i===Ad.DIRECTION)s.value=s.value||new r,t.getWorldDirection(s.value);else if(i===Ad.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===Ad.RADIUS){const r=e.object.geometry;null===r.boundingSphere&&r.computeBoundingSphere(),Rd.copy(r.boundingSphere).applyMatrix4(t.matrixWorld),s.value=Rd.radius}}generate(e){const t=this.scope;return t===Ad.WORLD_MATRIX?this.uniformNode.nodeType="mat4":t===Ad.POSITION||t===Ad.VIEW_POSITION||t===Ad.DIRECTION||t===Ad.SCALE?this.uniformNode.nodeType="vec3":t===Ad.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}}Ad.WORLD_MATRIX="worldMatrix",Ad.POSITION="position",Ad.SCALE="scale",Ad.VIEW_POSITION="viewPosition",Ad.DIRECTION="direction",Ad.RADIUS="radius";const Ed=nn(Ad,Ad.DIRECTION).setParameterLength(1),wd=nn(Ad,Ad.WORLD_MATRIX).setParameterLength(1),Cd=nn(Ad,Ad.POSITION).setParameterLength(1),Md=nn(Ad,Ad.SCALE).setParameterLength(1),Bd=nn(Ad,Ad.VIEW_POSITION).setParameterLength(1),Fd=nn(Ad,Ad.RADIUS).setParameterLength(1);class Ld extends Ad{static get type(){return"ModelNode"}constructor(e){super(e)}update(e){this.object3d=e.object,super.update(e)}}const Pd=an(Ld,Ld.DIRECTION),Dd=an(Ld,Ld.WORLD_MATRIX),Ud=an(Ld,Ld.POSITION),Id=an(Ld,Ld.SCALE),Od=an(Ld,Ld.VIEW_POSITION),Vd=an(Ld,Ld.RADIUS),kd=Na(new n).onObjectUpdate(({object:e},t)=>t.value.getNormalMatrix(e.matrixWorld)),Gd=Na(new a).onObjectUpdate(({object:e},t)=>t.value.copy(e.matrixWorld).invert()),zd=dn(e=>e.context.modelViewMatrix||$d).once()().toVar("modelViewMatrix"),$d=Td.mul(Dd),Wd=dn(e=>(e.context.isHighPrecisionModelViewMatrix=!0,Na("mat4").onObjectUpdate(({object:e,camera:t})=>e.modelViewMatrix.multiplyMatrices(t.matrixWorldInverse,e.matrixWorld)))).once()().toVar("highpModelViewMatrix"),Hd=dn(e=>{const t=e.context.isHighPrecisionModelViewMatrix;return Na("mat3").onObjectUpdate(({object:e,camera:r})=>(!0!==t&&e.modelViewMatrix.multiplyMatrices(r.matrixWorldInverse,e.matrixWorld),e.normalMatrix.getNormalMatrix(e.modelViewMatrix)))}).once()().toVar("highpModelNormalViewMatrix"),qd=dn(e=>"fragment"!==e.shaderStage?(v("TSL: `clipSpace` is only available in fragment stage."),wn()):e.context.clipSpace.toVarying("v_clipSpace")).once()(),jd=Sl("position","vec3"),Xd=jd.toVarying("positionLocal"),Kd=jd.toVarying("positionPrevious"),Qd=dn(e=>Dd.mul(Xd).xyz.toVarying(e.getSubBuildProperty("v_positionWorld")),"vec3").once(["POSITION"])(),Yd=dn(()=>Xd.transformDirection(Dd).toVarying("v_positionWorldDirection").normalize().toVar("positionWorldDirection"),"vec3").once(["POSITION"])(),Zd=dn(e=>{if("fragment"===e.shaderStage&&e.material.vertexNode){const e=xd.mul(qd);return e.xyz.div(e.w).toVar("positionView")}return e.context.setupPositionView().toVarying("v_positionView")},"vec3").once(["POSITION","VERTEX"])(),Jd=dn(e=>{let t;return t=e.camera.isOrthographicCamera?Sn(0,0,1):Zd.negate().toVarying("v_positionViewDirection").normalize(),t.toVar("positionViewDirection")},"vec3").once(["POSITION"])();class ec extends di{static get type(){return"FrontFacingNode"}constructor(){super("bool"),this.isFrontFacingNode=!0}generate(e){if("fragment"!==e.shaderStage)return"true";const{material:t}=e;return t.side===L?"false":e.getFrontFacing()}}const tc=an(ec),rc=fn(tc).mul(2).sub(1),sc=dn(([e],{material:t})=>{const r=t.side;return r===L?e=e.mul(-1):r===P&&(e=e.mul(rc)),e}),ic=Sl("normal","vec3"),nc=dn(e=>!1===e.geometry.hasAttribute("normal")?(d('TSL: Vertex attribute "normal" not found on geometry.'),Sn(0,1,0)):ic,"vec3").once()().toVar("normalLocal"),ac=Zd.dFdx().cross(Zd.dFdy()).normalize().toVar("normalFlat"),oc=dn(e=>{let t;return t=e.isFlatShading()?ac:pc(nc).toVarying("v_normalViewGeometry").normalize(),t},"vec3").once()().toVar("normalViewGeometry"),uc=dn(e=>{let t=oc.transformDirection(Td);return!0!==e.isFlatShading()&&(t=t.toVarying("v_normalWorldGeometry")),t.normalize().toVar("normalWorldGeometry")},"vec3").once()(),lc=dn(e=>{let t;return"NORMAL"===e.subBuildFn||"VERTEX"===e.subBuildFn?(t=oc,!0!==e.isFlatShading()&&(t=sc(t))):t=e.context.setupNormal().context({getUV:null,getTextureLevel:null}),t},"vec3").once(["NORMAL","VERTEX"])().toVar("normalView"),dc=lc.transformDirection(Td).toVar("normalWorld"),cc=dn(({subBuildFn:e,context:t})=>{let r;return r="NORMAL"===e||"VERTEX"===e?lc:t.setupClearcoatNormal().context({getUV:null,getTextureLevel:null}),r},"vec3").once(["NORMAL","VERTEX"])().toVar("clearcoatNormalView"),hc=dn(([e,t=Dd])=>{const r=Ln(t),s=e.div(Sn(r[0].dot(r[0]),r[1].dot(r[1]),r[2].dot(r[2])));return r.mul(s).xyz}),pc=dn(([e],t)=>{const r=t.context.modelNormalViewMatrix;if(r)return r.transformDirection(e);const s=kd.mul(e);return Td.transformDirection(s)}),gc=dn(()=>(d('TSL: "transformedNormalView" is deprecated. Use "normalView" instead.'),lc)).once(["NORMAL","VERTEX"])(),mc=dn(()=>(d('TSL: "transformedNormalWorld" is deprecated. Use "normalWorld" instead.'),dc)).once(["NORMAL","VERTEX"])(),fc=dn(()=>(d('TSL: "transformedClearcoatNormalView" is deprecated. Use "clearcoatNormalView" instead.'),cc)).once(["NORMAL","VERTEX"])(),yc=new D,bc=new a,xc=Na(0).onReference(({material:e})=>e).onObjectUpdate(({material:e})=>e.refractionRatio),Tc=Na(1).onReference(({material:e})=>e).onObjectUpdate(function({material:e,scene:t}){return e.envMap?e.envMapIntensity:t.environmentIntensity}),_c=Na(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?(yc.copy(r),bc.makeRotationFromEuler(yc)):bc.identity(),bc}),vc=Jd.negate().reflect(lc),Nc=Jd.negate().refract(lc,xc),Sc=vc.transformDirection(Td).toVar("reflectVector"),Rc=Nc.transformDirection(Td).toVar("reflectVector"),Ac=new U;class Ec extends Fl{static get type(){return"CubeTextureNode"}constructor(e,t=null,r=null,s=null){super(e,t,r,s),this.isCubeTextureNode=!0}getInputType(){return!0===this.value.isDepthTexture?"cubeDepthTexture":"cubeTexture"}getDefaultUV(){const e=this.value;return e.mapping===I?Sc:e.mapping===O?Rc:(o('CubeTextureNode: Mapping "%s" not supported.',e.mapping),Sn(0,0,0))}setUpdateMatrix(){}setupUV(e,t){const r=this.value;return!0===r.isDepthTexture?e.renderer.coordinateSystem===h?Sn(t.x,t.y.negate(),t.z):t:(e.renderer.coordinateSystem!==h&&r.isRenderTargetTexture||(t=Sn(t.x.negate(),t.yz)),_c.mul(t))}generateUV(e,t){return t.build(e,!0===this.sampler?"vec3":"ivec3")}}const wc=nn(Ec).setParameterLength(1,4).setName("cubeTexture"),Cc=(e=Ac,t=null,r=null,s=null)=>{let i;return e&&!0===e.isCubeTextureNode?(i=en(e.clone()),i.referenceNode=e,null!==t&&(i.uvNode=en(t)),null!==r&&(i.levelNode=en(r)),null!==s&&(i.biasNode=en(s))):i=wc(e,t,r,s),i};class Mc extends ci{static get type(){return"ReferenceElementNode"}constructor(e,t){super(e,t),this.referenceNode=e,this.isReferenceElementNode=!0}generateNodeType(){return this.referenceNode.uniformType}generate(e){const t=super.generate(e),r=this.referenceNode.getNodeType(e),s=this.getNodeType(e);return e.format(t,r,s)}}class Bc extends di{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=ti.OBJECT}element(e){return new Mc(this,en(e))}setGroup(e){return this.group=e,this}setName(e){return this.name=e,this}label(e){return d('TSL: "label()" has been deprecated. Use "setName()" instead.'),this.setName(e)}setNodeType(e){let t=null;t=null!==this.count?Il(null,e,this.count):Array.isArray(this.getValueFromReference())?kl(null,e):"texture"===e?Pl(null):"cubeTexture"===e?Cc(null):Na(null,e),null!==this.group&&t.setGroup(this.group),null!==this.name&&t.setName(this.name),this.node=t}generateNodeType(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;enew Bc(e,t,r),Lc=(e,t,r,s)=>new Bc(e,t,s,r);class Pc extends Bc{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 Dc=(e,t,r=null)=>new Pc(e,t,r),Uc=Rl(),Ic=Zd.dFdx(),Oc=Zd.dFdy(),Vc=Uc.dFdx(),kc=Uc.dFdy(),Gc=lc,zc=Oc.cross(Gc),$c=Gc.cross(Ic),Wc=zc.mul(Vc.x).add($c.mul(kc.x)),Hc=zc.mul(Vc.y).add($c.mul(kc.y)),qc=Wc.dot(Wc).max(Hc.dot(Hc)),jc=qc.equal(0).select(0,qc.inverseSqrt()),Xc=Wc.mul(jc).toVar("tangentViewFrame"),Kc=Hc.mul(jc).toVar("bitangentViewFrame"),Qc=Sl("tangent","vec4"),Yc=Qc.xyz.toVar("tangentLocal"),Zc=dn(e=>{let t;return t="VERTEX"===e.subBuildFn||e.geometry.hasAttribute("tangent")?zd.mul(wn(Yc,0)).xyz.toVarying("v_tangentView").normalize():Xc,!0!==e.isFlatShading()&&(t=sc(t)),t},"vec3").once(["NORMAL","VERTEX"])().toVar("tangentView"),Jc=Zc.transformDirection(Td).toVarying("v_tangentWorld").normalize().toVar("tangentWorld"),eh=dn(([e,t],r)=>{let s=e.mul(Qc.w).xyz;return"NORMAL"===r.subBuildFn&&!0!==r.isFlatShading()&&(s=s.toVarying(t)),s}).once(["NORMAL"]),th=eh(ic.cross(Qc),"v_bitangentGeometry").normalize().toVar("bitangentGeometry"),rh=eh(nc.cross(Yc),"v_bitangentLocal").normalize().toVar("bitangentLocal"),sh=dn(e=>{let t;return t="VERTEX"===e.subBuildFn||e.geometry.hasAttribute("tangent")?eh(lc.cross(Zc),"v_bitangentView").normalize():Kc,!0!==e.isFlatShading()&&(t=sc(t)),t},"vec3").once(["NORMAL","VERTEX"])().toVar("bitangentView"),ih=eh(dc.cross(Jc),"v_bitangentWorld").normalize().toVar("bitangentWorld"),nh=Ln(Zc,sh,lc).toVar("TBNViewMatrix"),ah=Jd.mul(nh),oh=dn(()=>{let e=ta.cross(Jd);return e=e.cross(ta).normalize(),e=ou(e,lc,Jn.mul($n.oneMinus()).oneMinus().pow2().pow2()).normalize(),e}).once()(),uh=e=>en(e).mul(.5).add(.5),lh=e=>Sn(e,To(lu(fn(1).sub(Zo(e,e)))));class dh extends pi{static get type(){return"NormalMapNode"}constructor(e,t=null){super("vec3"),this.node=e,this.scaleNode=t,this.normalMapType=V,this.unpackNormalMode=k}setup(e){const{normalMapType:t,scaleNode:r,unpackNormalMode:s}=this;let i=this.node.mul(2).sub(1);if(t===V?s===G?i=lh(i.xy):s===z?i=lh(i.yw):s!==k&&console.error(`THREE.NodeMaterial: Unexpected unpack normal mode: ${s}`):s!==k&&console.error(`THREE.NodeMaterial: Normal map type '${t}' is not compatible with unpack normal mode '${s}'`),null!==r){let t=r;!0===e.isFlatShading()&&(t=sc(t)),i=Sn(i.xy.mul(t),i.z)}let n=null;return t===$?n=pc(i):t===V?n=nh.mul(i).normalize():(o(`NodeMaterial: Unsupported normal map type: ${t}`),n=lc),n}}const ch=nn(dh).setParameterLength(1,2),hh=dn(({textureNode:e,bumpScale:t})=>{const r=t=>e.isolate().context({getUV:e=>t(e.uvNode||Rl()),forceUVContext:!0}),s=fn(r(e=>e));return Tn(fn(r(e=>e.add(e.dFdx()))).sub(s),fn(r(e=>e.add(e.dFdy()))).sub(s)).mul(t)}),ph=dn(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(rc),l=u.sign().mul(s.x.mul(a).add(s.y.mul(o)));return u.abs().mul(r).sub(l).normalize()});class gh extends pi{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=hh({textureNode:this.textureNode,bumpScale:e});return ph({surf_pos:Zd,surf_norm:lc,dHdxy:t})}}const mh=nn(gh).setParameterLength(1,2),fh=new Map;class yh extends di{static get type(){return"MaterialNode"}constructor(e){super(),this.scope=e}getCache(e,t){let r=fh.get(e);return void 0===r&&(r=Dc(e,t),fh.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===yh.COLOR){const e=void 0!==t.color?this.getColor(r):Sn();s=t.map&&!0===t.map.isTexture?e.mul(this.getTexture("map")):e}else if(r===yh.OPACITY){const e=this.getFloat(r);s=t.alphaMap&&!0===t.alphaMap.isTexture?e.mul(this.getTexture("alpha")):e}else if(r===yh.SPECULAR_STRENGTH)s=t.specularMap&&!0===t.specularMap.isTexture?this.getTexture("specular").r:fn(1);else if(r===yh.SPECULAR_INTENSITY){const e=this.getFloat(r);s=t.specularIntensityMap&&!0===t.specularIntensityMap.isTexture?e.mul(this.getTexture(r).a):e}else if(r===yh.SPECULAR_COLOR){const e=this.getColor(r);s=t.specularColorMap&&!0===t.specularColorMap.isTexture?e.mul(this.getTexture(r).rgb):e}else if(r===yh.ROUGHNESS){const e=this.getFloat(r);s=t.roughnessMap&&!0===t.roughnessMap.isTexture?e.mul(this.getTexture(r).g):e}else if(r===yh.METALNESS){const e=this.getFloat(r);s=t.metalnessMap&&!0===t.metalnessMap.isTexture?e.mul(this.getTexture(r).b):e}else if(r===yh.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===yh.NORMAL)t.normalMap?(s=ch(this.getTexture("normal"),this.getCache("normalScale","vec2")),s.normalMapType=t.normalMapType,t.normalMap.format!=W&&t.normalMap.format!=H&&t.normalMap.format!=q||(s.unpackNormalMode=G)):s=t.bumpMap?mh(this.getTexture("bump").r,this.getFloat("bumpScale")):lc;else if(r===yh.CLEARCOAT){const e=this.getFloat(r);s=t.clearcoatMap&&!0===t.clearcoatMap.isTexture?e.mul(this.getTexture(r).r):e}else if(r===yh.CLEARCOAT_ROUGHNESS){const e=this.getFloat(r);s=t.clearcoatRoughnessMap&&!0===t.clearcoatRoughnessMap.isTexture?e.mul(this.getTexture(r).r):e}else if(r===yh.CLEARCOAT_NORMAL)s=t.clearcoatNormalMap?ch(this.getTexture(r),this.getCache(r+"Scale","vec2")):lc;else if(r===yh.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===yh.SHEEN_ROUGHNESS){const e=this.getFloat(r);s=t.sheenRoughnessMap&&!0===t.sheenRoughnessMap.isTexture?e.mul(this.getTexture(r).a):e,s=s.clamp(1e-4,1)}else if(r===yh.ANISOTROPY)if(t.anisotropyMap&&!0===t.anisotropyMap.isTexture){const e=this.getTexture(r);s=Fn(tp.x,tp.y,tp.y.negate(),tp.x).mul(e.rg.mul(2).sub(Tn(1)).normalize().mul(e.b))}else s=tp;else if(r===yh.IRIDESCENCE_THICKNESS){const e=Fc("1","float",t.iridescenceThicknessRange);if(t.iridescenceThicknessMap){const i=Fc("0","float",t.iridescenceThicknessRange);s=e.sub(i).mul(this.getTexture(r).g).add(i)}else s=e}else if(r===yh.TRANSMISSION){const e=this.getFloat(r);s=t.transmissionMap?e.mul(this.getTexture(r).r):e}else if(r===yh.THICKNESS){const e=this.getFloat(r);s=t.thicknessMap?e.mul(this.getTexture(r).g):e}else if(r===yh.IOR)s=this.getFloat(r);else if(r===yh.LIGHT_MAP)s=this.getTexture(r).rgb.mul(this.getFloat("lightMapIntensity"));else if(r===yh.AO)s=this.getTexture(r).r.sub(1).mul(this.getFloat("aoMapIntensity")).add(1);else if(r===yh.LINE_DASH_OFFSET)s=t.dashOffset?this.getFloat(r):fn(0);else{const t=this.getNodeType(e);s=this.getCache(r,t)}return s}}yh.ALPHA_TEST="alphaTest",yh.COLOR="color",yh.OPACITY="opacity",yh.SHININESS="shininess",yh.SPECULAR="specular",yh.SPECULAR_STRENGTH="specularStrength",yh.SPECULAR_INTENSITY="specularIntensity",yh.SPECULAR_COLOR="specularColor",yh.REFLECTIVITY="reflectivity",yh.ROUGHNESS="roughness",yh.METALNESS="metalness",yh.NORMAL="normal",yh.CLEARCOAT="clearcoat",yh.CLEARCOAT_ROUGHNESS="clearcoatRoughness",yh.CLEARCOAT_NORMAL="clearcoatNormal",yh.EMISSIVE="emissive",yh.ROTATION="rotation",yh.SHEEN="sheen",yh.SHEEN_ROUGHNESS="sheenRoughness",yh.ANISOTROPY="anisotropy",yh.IRIDESCENCE="iridescence",yh.IRIDESCENCE_IOR="iridescenceIOR",yh.IRIDESCENCE_THICKNESS="iridescenceThickness",yh.IOR="ior",yh.TRANSMISSION="transmission",yh.THICKNESS="thickness",yh.ATTENUATION_DISTANCE="attenuationDistance",yh.ATTENUATION_COLOR="attenuationColor",yh.LINE_SCALE="scale",yh.LINE_DASH_SIZE="dashSize",yh.LINE_GAP_SIZE="gapSize",yh.LINE_WIDTH="linewidth",yh.LINE_DASH_OFFSET="dashOffset",yh.POINT_SIZE="size",yh.DISPERSION="dispersion",yh.LIGHT_MAP="light",yh.AO="ao";const bh=an(yh,yh.ALPHA_TEST),xh=an(yh,yh.COLOR),Th=an(yh,yh.SHININESS),_h=an(yh,yh.EMISSIVE),vh=an(yh,yh.OPACITY),Nh=an(yh,yh.SPECULAR),Sh=an(yh,yh.SPECULAR_INTENSITY),Rh=an(yh,yh.SPECULAR_COLOR),Ah=an(yh,yh.SPECULAR_STRENGTH),Eh=an(yh,yh.REFLECTIVITY),wh=an(yh,yh.ROUGHNESS),Ch=an(yh,yh.METALNESS),Mh=an(yh,yh.NORMAL),Bh=an(yh,yh.CLEARCOAT),Fh=an(yh,yh.CLEARCOAT_ROUGHNESS),Lh=an(yh,yh.CLEARCOAT_NORMAL),Ph=an(yh,yh.ROTATION),Dh=an(yh,yh.SHEEN),Uh=an(yh,yh.SHEEN_ROUGHNESS),Ih=an(yh,yh.ANISOTROPY),Oh=an(yh,yh.IRIDESCENCE),Vh=an(yh,yh.IRIDESCENCE_IOR),kh=an(yh,yh.IRIDESCENCE_THICKNESS),Gh=an(yh,yh.TRANSMISSION),zh=an(yh,yh.THICKNESS),$h=an(yh,yh.IOR),Wh=an(yh,yh.ATTENUATION_DISTANCE),Hh=an(yh,yh.ATTENUATION_COLOR),qh=an(yh,yh.LINE_SCALE),jh=an(yh,yh.LINE_DASH_SIZE),Xh=an(yh,yh.LINE_GAP_SIZE),Kh=an(yh,yh.LINE_WIDTH),Qh=an(yh,yh.LINE_DASH_OFFSET),Yh=an(yh,yh.POINT_SIZE),Zh=an(yh,yh.DISPERSION),Jh=an(yh,yh.LIGHT_MAP),ep=an(yh,yh.AO),tp=Na(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))}),rp=dn(e=>e.context.setupModelViewProjection(),"vec4").once()().toVarying("v_modelViewProjection");class sp extends ci{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 ip=nn(sp).setParameterLength(2);class np 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=$s(e.itemSize),r=e.count):s=t,super(e,s,r),this.isStorageBufferNode=!0,this.structTypeNode=i,this.access=si.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){let t;if(0===this.bufferCount){let r=e.globalCache.getData(this.value);void 0===r&&(r={node:this},e.globalCache.setData(this.value,r)),t=r.node.id}else t=this.id;return String(t)}getInputType(){return this.value.isIndirectStorageBufferAttribute?"indirectStorageBuffer":"storageBuffer"}element(e){return ip(this,e)}setPBO(e){return this.isPBO=e,this}getPBO(){return this.isPBO}setAccess(e){return this.access=e,this}toReadOnly(){return this.setAccess(si.READ_ONLY)}setAtomic(e){return this.isAtomic=e,this}toAtomic(){return this.setAtomic(!0)}getAttributeData(){return null===this._attribute&&(this._attribute=tl(this.value),this._varying=Uu(this._attribute)),{attribute:this._attribute,varying:this._varying}}generateNodeType(e){if(null!==this.structTypeNode)return this.structTypeNode.getNodeType(e);if(e.isAvailable("storageBuffer")||e.isAvailable("indirectStorageBuffer"))return super.generateNodeType(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 ap=(e,t=null,r=0)=>new np(e,t,r);class op extends di{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===op.VERTEX)s=e.getVertexIndex();else if(r===op.INSTANCE)s=e.getInstanceIndex();else if(r===op.DRAW)s=e.getDrawIndex();else if(r===op.INVOCATION_LOCAL)s=e.getInvocationLocalIndex();else if(r===op.INVOCATION_SUBGROUP)s=e.getInvocationSubgroupIndex();else{if(r!==op.SUBGROUP)throw new Error("THREE.IndexNode: Unknown scope: "+r);s=e.getSubgroupIndex()}if("vertex"===e.shaderStage||"compute"===e.shaderStage)i=s;else{i=Uu(this).build(e,t)}return i}}op.VERTEX="vertex",op.INSTANCE="instance",op.SUBGROUP="subgroup",op.INVOCATION_LOCAL="invocationLocal",op.INVOCATION_SUBGROUP="invocationSubgroup",op.DRAW="draw";const up=an(op,op.VERTEX),lp=an(op,op.INSTANCE),dp=an(op,op.SUBGROUP),cp=an(op,op.INVOCATION_SUBGROUP),hp=an(op,op.INVOCATION_LOCAL),pp=an(op,op.DRAW);class gp extends di{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=ti.FRAME,this.buffer=null,this.bufferColor=null,this.previousInstanceMatrixNode=null}get isStorageMatrix(){const{instanceMatrix:e}=this;return e&&!0===e.isStorageInstancedBufferAttribute}get isStorageColor(){const{instanceColor:e}=this;return e&&!0===e.isStorageInstancedBufferAttribute}setup(e){let{instanceMatrixNode:t,instanceColorNode:r}=this;null===t&&(t=this._createInstanceMatrixNode(!0,e),this.instanceMatrixNode=t);const{instanceColor:s,isStorageColor:i}=this;if(s&&null===r){if(i)r=ap(s,"vec3",Math.max(s.count,1)).element(lp);else{const e=new j(s.array,3),t=s.usage===x?sl:rl;this.bufferColor=e,r=Sn(t(e,"vec3",3,0))}this.instanceColorNode=r}const n=t.mul(Xd).xyz;if(Xd.assign(n),e.needsPreviousData()&&Kd.assign(this.getPreviousInstancedPosition(e)),e.hasGeometryAttribute("normal")){const e=hc(nc,t);nc.assign(e)}null!==this.instanceColorNode&&Vn("vec3","vInstanceColor").assign(this.instanceColorNode)}update(e){null!==this.buffer&&!0!==this.isStorageMatrix&&(this.buffer.clearUpdateRanges(),this.buffer.updateRanges.push(...this.instanceMatrix.updateRanges),this.instanceMatrix.version!==this.buffer.version&&(this.buffer.version=this.instanceMatrix.version)),this.instanceColor&&null!==this.bufferColor&&!0!==this.isStorageColor&&(this.bufferColor.clearUpdateRanges(),this.bufferColor.updateRanges.push(...this.instanceColor.updateRanges),this.instanceColor.version!==this.bufferColor.version&&(this.bufferColor.version=this.instanceColor.version)),null!==this.previousInstanceMatrixNode&&e.object.previousInstanceMatrix.array.set(this.instanceMatrix.array)}getPreviousInstancedPosition(e){const t=e.object;return null===this.previousInstanceMatrixNode&&(t.previousInstanceMatrix=this.instanceMatrix.clone(),this.previousInstanceMatrixNode=this._createInstanceMatrixNode(!1,e)),this.previousInstanceMatrixNode.mul(Kd).xyz}_createInstanceMatrixNode(e,t){let r;const{instanceMatrix:s}=this,{count:i}=s;if(this.isStorageMatrix)r=ap(s,"mat4",Math.max(i,1)).element(lp);else{if(16*i*4<=t.getUniformBufferLimit())r=Il(s.array,"mat4",Math.max(i,1)).element(lp);else{const t=new X(s.array,16,1);!0===e&&(this.buffer=t);const i=s.usage===x?sl:rl,n=[i(t,"vec4",16,0),i(t,"vec4",16,4),i(t,"vec4",16,8),i(t,"vec4",16,12)];r=Pn(...n)}}return r}}const mp=nn(gp).setParameterLength(2,3);class fp extends gp{static get type(){return"InstancedMeshNode"}constructor(e){const{count:t,instanceMatrix:r,instanceColor:s}=e;super(t,r,s),this.instancedMesh=e}}const yp=nn(fp).setParameterLength(1);class bp extends di{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=lp:this.batchingIdNode=pp);const t=dn(([e])=>{const t=yn(El(Dl(this.batchMesh._indirectTexture),0).x).toConst(),r=yn(e).mod(t).toConst(),s=yn(e).div(t).toConst();return Dl(this.batchMesh._indirectTexture,_n(r,s)).x}).setLayout({name:"getIndirectIndex",type:"uint",inputs:[{name:"id",type:"int"}]}),r=t(yn(this.batchingIdNode)),s=this.batchMesh._matricesTexture,i=yn(El(Dl(s),0).x).toConst(),n=fn(r).mul(4).toInt().toConst(),a=n.mod(i).toConst(),o=n.div(i).toConst(),u=Pn(Dl(s,_n(a,o)),Dl(s,_n(a.add(1),o)),Dl(s,_n(a.add(2),o)),Dl(s,_n(a.add(3),o))),l=this.batchMesh._colorsTexture;if(null!==l){const e=dn(([e])=>{const t=yn(El(Dl(l),0).x).toConst(),r=e,s=r.mod(t).toConst(),i=r.div(t).toConst();return Dl(l,_n(s,i)).rgb}).setLayout({name:"getBatchingColor",type:"vec3",inputs:[{name:"id",type:"int"}]}),t=e(r);Vn("vec3","vBatchColor").assign(t)}const d=Ln(u);Xd.assign(u.mul(Xd));const c=nc.div(Sn(d[0].dot(d[0]),d[1].dot(d[1]),d[2].dot(d[2]))),h=d.mul(c).xyz;nc.assign(h),e.hasGeometryAttribute("tangent")&&Yc.mulAssign(d)}}const xp=nn(bp).setParameterLength(1),Tp=new WeakMap;class _p extends di{static get type(){return"SkinningNode"}constructor(e){super("void"),this.skinnedMesh=e,this.updateType=ti.OBJECT,this.skinIndexNode=Sl("skinIndex","uvec4"),this.skinWeightNode=Sl("skinWeight","vec4"),this.bindMatrixNode=Fc("bindMatrix","mat4"),this.bindMatrixInverseNode=Fc("bindMatrixInverse","mat4"),this.boneMatricesNode=Lc("skeleton.boneMatrices","mat4",e.skeleton.bones.length),this.positionNode=Xd,this.toPositionNode=Xd,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=Fa(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}getSkinnedNormalAndTangent(e=this.boneMatricesNode,t=nc,r=Yc){const{skinIndexNode:s,skinWeightNode:i,bindMatrixNode:n,bindMatrixInverseNode:a}=this,o=e.element(s.x),u=e.element(s.y),l=e.element(s.z),d=e.element(s.w);let c=Fa(i.x.mul(o),i.y.mul(u),i.z.mul(l),i.w.mul(d));c=a.mul(c).mul(n);return{skinNormal:c.transformDirection(t).xyz,skinTangent:c.transformDirection(r).xyz}}getPreviousSkinnedPosition(e){const t=e.object;return null===this.previousBoneMatricesNode&&(t.skeleton.previousBoneMatrices=new Float32Array(t.skeleton.boneMatrices),this.previousBoneMatricesNode=Lc("skeleton.previousBoneMatrices","mat4",t.skeleton.bones.length)),this.getSkinnedPosition(this.previousBoneMatricesNode,Kd)}setup(e){e.needsPreviousData()&&Kd.assign(this.getPreviousSkinnedPosition(e));const t=this.getSkinnedPosition();if(this.toPositionNode&&this.toPositionNode.assign(t),e.hasGeometryAttribute("normal")){const{skinNormal:t,skinTangent:r}=this.getSkinnedNormalAndTangent();nc.assign(t),e.hasGeometryAttribute("tangent")&&Yc.assign(r)}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;Tp.get(t)!==e.frameId&&(Tp.set(t,e.frameId),null!==this.previousBoneMatricesNode&&(null===t.previousBoneMatrices&&(t.previousBoneMatrices=new Float32Array(t.boneMatrices)),t.previousBoneMatrices.set(t.boneMatrices)),t.update())}}const vp=e=>new _p(e);class Np extends di{static get type(){return"LoopNode"}constructor(e=[]){super("void"),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(l)?">=":"<")),a)n=`while ( ${l} )`;else{const r={start:u,end:l},s=r.start,i=r.end;let a;const g=()=>h.includes("<")?"+=":"-=";if(null!=p)switch(typeof p){case"function":a=e.flowStagesNode(t.updateNode,"void").code.replace(/\t|;/g,"");break;case"number":a=d+" "+g()+" "+e.generateConst(c,p);break;case"string":a=d+" "+p;break;default:p.isNode?a=d+" "+g()+" "+p.build(e):(o("TSL: 'Loop( { update: ... } )' is not a function, string or number.",this.stackTrace),a="break /* invalid update */")}else p="int"===c||"uint"===c?h.includes("<")?"++":"--":g()+" 1.",a=d+" "+p;n=`for ( ${e.getVar(c,d)+" = "+s}; ${d+" "+h+" "+i}; ${a} )`}e.addFlowCode((0===s?"\n":"")+e.tab+n+" {\n\n").addFlowTab()}const i=s.build(e,"void");t.returnsNode.build(e,"void"),e.removeFlowTab().addFlowCode("\n"+e.tab+i);for(let t=0,r=this.params.length-1;tnew Np(sn(e,"int")).toStack(),Rp=()=>gl("break").toStack(),Ap=new WeakMap,Ep=new s,wp=dn(({bufferMap:e,influence:t,stride:r,width:s,depth:i,offset:n})=>{const a=yn(up).mul(r).add(n),o=a.div(s),u=a.sub(o.mul(s));return Dl(e,_n(u,o)).depth(i).xyz.mul(t)});class Cp extends di{static get type(){return"MorphNode"}constructor(e){super("void"),this.mesh=e,this.morphBaseInfluence=Na(1),this.updateType=ti.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=Ap.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 K(m,h,p,a);f.type=Q,f.needsUpdate=!0;const y=4*c;for(let x=0;x{const t=fn(0).toVar();this.mesh.count>1&&null!==this.mesh.morphTexture&&void 0!==this.mesh.morphTexture?t.assign(Dl(this.mesh.morphTexture,_n(yn(e).add(1),yn(lp))).r):t.assign(Fc("morphTargetInfluences","float").element(e).toVar()),pn(t.notEqual(0),()=>{!0===s&&Xd.addAssign(wp({bufferMap:o,influence:t,stride:u,width:d,depth:e,offset:yn(0)})),!0===i&&nc.addAssign(wp({bufferMap:o,influence:t,stride:u,width:d,depth:e,offset:yn(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 Mp=nn(Cp).setParameterLength(1);class Bp extends di{static get type(){return"LightingNode"}constructor(){super("vec3"),this.isLightingNode=!0}}class Fp extends Bp{static get type(){return"AONode"}constructor(e=null){super(),this.aoNode=e}setup(e){e.context.ambientOcclusion.mulAssign(this.aoNode)}}class Lp extends _u{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:Sn().toVar("directDiffuse"),directSpecular:Sn().toVar("directSpecular"),indirectDiffuse:Sn().toVar("indirectDiffuse"),indirectSpecular:Sn().toVar("indirectSpecular")};return{radiance:Sn().toVar("radiance"),irradiance:Sn().toVar("irradiance"),iblIrradiance:Sn().toVar("iblIrradiance"),ambientOcclusion:fn(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 Pp=nn(Lp);class Dp extends Bp{static get type(){return"IrradianceNode"}constructor(e){super(),this.node=e}setup(e){e.context.irradiance.addAssign(this.node)}}const Up=new t;class Ip extends Fl{static get type(){return"ViewportTextureNode"}constructor(e=jl,t=null,r=null){let s=null;null===r?(s=new Y,s.minFilter=Z,r=s):s=r,super(r,e,t),this.generateMipmaps=!1,this.defaultFramebuffer=s,this.isOutputTextureNode=!0,this.updateBeforeType=ti.RENDER,this._cacheTextures=new WeakMap}getTextureForReference(e=null){let t,r;if(this.referenceNode?(t=this.referenceNode.defaultFramebuffer,r=this.referenceNode._cacheTextures):(t=this.defaultFramebuffer,r=this._cacheTextures),null===e)return t;if(!1===r.has(e)){const s=t.clone();r.set(e,s)}return r.get(e)}updateReference(e){const t=e.renderer,r=t.getRenderTarget(),s=t.getCanvasTarget(),i=r||s;return this.value=this.getTextureForReference(i),this.value}updateBefore(e){const t=e.renderer,r=t.getRenderTarget(),s=t.getCanvasTarget(),i=r||s;null===i?t.getDrawingBufferSize(Up):i.getDrawingBufferSize?i.getDrawingBufferSize(Up):Up.set(i.width,i.height);const n=this.getTextureForReference(i);n.image.width===Up.width&&n.image.height===Up.height||(n.image.width=Up.width,n.image.height=Up.height,n.needsUpdate=!0);const a=n.generateMipmaps;n.generateMipmaps=this.generateMipmaps,t.copyFramebufferToTexture(n),n.generateMipmaps=a}clone(){const e=new this.constructor(this.uvNode,this.levelNode,this.value);return e.generateMipmaps=this.generateMipmaps,e}}const Op=nn(Ip).setParameterLength(0,3),Vp=nn(Ip,null,null,{generateMipmaps:!0}).setParameterLength(0,3),kp=Vp(),Gp=(e=jl,t=null)=>kp.sample(e,t);let zp=null;class $p extends Ip{static get type(){return"ViewportDepthTextureNode"}constructor(e=jl,t=null,r=null){null===r&&(null===zp&&(zp=new J),r=zp),super(e,t,r)}}const Wp=nn($p).setParameterLength(0,3);class Hp extends di{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===Hp.DEPTH_BASE?e.getFragDepth():super.generate(e)}setup({camera:e}){const{scope:t}=this,r=this.valueNode;let s=null;if(t===Hp.DEPTH_BASE)null!==r&&(s=Zp().assign(r));else if(t===Hp.DEPTH)s=e.isPerspectiveCamera?Xp(Zd.z,fd,yd):qp(Zd.z,fd,yd);else if(t===Hp.LINEAR_DEPTH)if(null!==r)if(e.isPerspectiveCamera){const e=Qp(r,fd,yd);s=qp(e,fd,yd)}else s=r;else s=qp(Zd.z,fd,yd);return s}}Hp.DEPTH_BASE="depthBase",Hp.DEPTH="depth",Hp.LINEAR_DEPTH="linearDepth";const qp=(e,t,r)=>e.add(t).div(t.sub(r)),jp=dn(([e,t,r],s)=>!0===s.renderer.reversedDepthBuffer?r.sub(t).mul(e).sub(r):t.sub(r).mul(e).sub(t)),Xp=(e,t,r)=>t.add(e).mul(r).div(r.sub(t).mul(e)),Kp=(e,t,r)=>t.mul(e.add(r)).div(e.mul(t.sub(r))),Qp=dn(([e,t,r],s)=>!0===s.renderer.reversedDepthBuffer?t.mul(r).div(t.sub(r).mul(e).sub(t)):t.mul(r).div(r.sub(t).mul(e).sub(r))),Yp=(e,t,r)=>{t=t.max(1e-6).toVar();const s=xo(e.negate().div(t)),i=xo(r.div(t));return s.div(i)},Zp=nn(Hp,Hp.DEPTH_BASE),Jp=an(Hp,Hp.DEPTH),eg=nn(Hp,Hp.LINEAR_DEPTH).setParameterLength(0,1),tg=eg(Wp());Jp.assign=e=>Zp(e);class rg extends di{static get type(){return"ClippingNode"}constructor(e=rg.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===rg.ALPHA_TO_COVERAGE?this.setupAlphaToCoverage(r,s):this.scope===rg.HARDWARE?this.setupHardwareClipping(s,e):this.setupDefault(r,s)}setupAlphaToCoverage(e,t){return dn(()=>{const r=fn().toVar("distanceToPlane"),s=fn().toVar("distanceToGradient"),i=fn(1).toVar("clipOpacity"),n=t.length;if(!1===this.hardwareClipping&&n>0){const e=kl(t).setGroup(Ta);Sp(n,({i:t})=>{const n=e.element(t);r.assign(Zd.dot(n.xyz).negate().add(n.w)),s.assign(r.fwidth().div(2)),i.mulAssign(cu(s.negate(),s,r))})}const a=e.length;if(a>0){const t=kl(e).setGroup(Ta),n=fn(1).toVar("intersectionClipOpacity");Sp(a,({i:e})=>{const i=t.element(e);r.assign(Zd.dot(i.xyz).negate().add(i.w)),s.assign(r.fwidth().div(2)),n.mulAssign(cu(s.negate(),s,r).oneMinus())}),i.mulAssign(n.oneMinus())}kn.a.mulAssign(i),kn.a.equal(0).discard()})()}setupDefault(e,t){return dn(()=>{const r=t.length;if(!1===this.hardwareClipping&&r>0){const e=kl(t).setGroup(Ta);Sp(r,({i:t})=>{const r=e.element(t);Zd.dot(r.xyz).greaterThan(r.w).discard()})}const s=e.length;if(s>0){const t=kl(e).setGroup(Ta),r=xn(!0).toVar("clipped");Sp(s,({i:e})=>{const s=t.element(e);r.assign(Zd.dot(s.xyz).greaterThan(s.w).and(r))}),r.discard()}})()}setupHardwareClipping(e,t){const r=e.length;return t.enableHardwareClipping(r),dn(()=>{const s=kl(e).setGroup(Ta),i=zl(t.getClipDistance());Sp(r,({i:e})=>{const t=s.element(e),r=Zd.dot(t.xyz).sub(t.w).negate();i.element(e).assign(r)})})()}}rg.ALPHA_TO_COVERAGE="alphaToCoverage",rg.DEFAULT="default",rg.HARDWARE="hardware";const sg=dn(([e])=>Ro(Pa(1e4,Ao(Pa(17,e.x).add(Pa(.1,e.y)))).mul(Fa(.1,Fo(Ao(Pa(13,e.y).add(e.x))))))),ig=dn(([e])=>sg(Tn(sg(e.xy),e.z))),ng=dn(([e])=>{const t=jo(Po(Io(e.xyz)),Po(Oo(e.xyz))),r=fn(1).div(fn(.05).mul(t)).toVar("pixScale"),s=Tn(yo(vo(xo(r))),yo(No(xo(r)))),i=Tn(ig(vo(s.x.mul(e.xyz))),ig(vo(s.y.mul(e.xyz)))),n=Ro(xo(r)),a=Fa(Pa(n.oneMinus(),i.x),Pa(n,i.y)),o=qo(n,n.oneMinus()),u=Sn(a.mul(a).div(Pa(2,o).mul(La(1,o))),a.sub(Pa(.5,o)).div(La(1,o)),La(1,La(1,a).mul(La(1,a)).div(Pa(2,o).mul(La(1,o))))),l=a.lessThan(o.oneMinus()).select(a.lessThan(o).select(u.x,u.y),u.z);return uu(l,1e-6,1)}).setLayout({name:"getAlphaHashThreshold",type:"float",inputs:[{name:"position",type:"vec3"}]});class ag extends Nl{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 og=(e=0)=>new ag(e),ug=dn(([e,t])=>qo(1,e.oneMinus().div(t)).oneMinus()).setLayout({name:"blendBurn",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),lg=dn(([e,t])=>qo(e.div(t.oneMinus()),1)).setLayout({name:"blendDodge",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),dg=dn(([e,t])=>e.oneMinus().mul(t.oneMinus()).oneMinus()).setLayout({name:"blendScreen",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),cg=dn(([e,t])=>ou(e.mul(2).mul(t),e.oneMinus().mul(2).mul(t.oneMinus()).oneMinus(),Xo(.5,e))).setLayout({name:"blendOverlay",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),hg=dn(([e,t])=>{const r=t.a.add(e.a.mul(t.a.oneMinus()));return wn(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"}]}),pg=dn(([e])=>wn(e.rgb.mul(e.a),e.a),{color:"vec4",return:"vec4"}),gg=dn(([e])=>(pn(e.a.equal(0),()=>wn(0)),wn(e.rgb.div(e.a),e.a)),{color:"vec4",return:"vec4"});class mg extends ee{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.maskShadowNode=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,this.contextNode=null}_getNodeChildren(){const e=[];for(const t of Object.getOwnPropertyNames(this)){if(!0===t.startsWith("_"))continue;const r=this[t];r&&!0===r.isNode&&e.push({property:t,childNode:r})}return e}customProgramCacheKey(){const e=[];for(const{property:t,childNode:r}of this._getNodeChildren())e.push(Os(t.slice(0,-4)),r.getCacheKey());return this.type+Vs(e)}build(e){this.setup(e)}setupObserver(e){return new Ps(e)}setup(e){e.context.setupNormal=()=>Pu(this.setupNormal(e),"NORMAL","vec3"),e.context.setupPositionView=()=>this.setupPositionView(e),e.context.setupModelViewProjection=()=>this.setupModelViewProjection(e);const t=e.renderer,r=t.getRenderTarget();!0===t.contextNode.isContextNode?e.context={...e.context,...t.contextNode.getFlowContextData()}:o('NodeMaterial: "renderer.contextNode" must be an instance of `context()`.'),null!==this.contextNode&&(!0===this.contextNode.isContextNode?e.context={...e.context,...this.contextNode.getFlowContextData()}:o('NodeMaterial: "material.contextNode" must be an instance of `context()`.')),e.addStack();const s=this.setupVertex(e),i=Pu(this.vertexNode||s,"VERTEX");let n;e.context.clipSpace=i,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.addToStack(a);const i=wn(s,kn.a).max(0);n=this.setupOutput(e,i),aa.assign(n);const o=null!==this.outputNode;if(o&&(n=this.outputNode),e.context.getOutput&&(n=e.context.getOutput(n,e)),null!==r){const e=t.getMRT(),r=this.mrtNode;null!==e?(o&&aa.assign(n),n=e,null!==r&&(n=e.merge(r))):null!==r&&(n=r)}}else{let t=this.fragmentNode;!0!==t.isOutputStructNode&&(t=wn(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.currentSamples;this.alphaToCoverage&&t>1?s=new rg(rg.ALPHA_TO_COVERAGE):e.stack.addToStack(new rg)}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.addToStack(new rg(rg.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?Yp(Zd.z,fd,yd):qp(Zd.z,fd,yd))}null!==s&&Jp.assign(s).toStack()}setupPositionView(){return zd.mul(Xd).xyz}setupModelViewProjection(){return bd.mul(Zd)}setupVertex(e){return e.addStack(),this.setupPosition(e),e.context.position=e.removeStack(),rp}setupPosition(e){const{object:t,geometry:r}=e;if((r.morphAttributes.position||r.morphAttributes.normal||r.morphAttributes.color)&&Mp(t).toStack(),!0===t.isSkinnedMesh&&vp(t).toStack(),this.displacementMap){const e=Dc("displacementMap","texture"),t=Dc("displacementScale","float"),r=Dc("displacementBias","float");Xd.addAssign(nc.normalize().mul(e.x.mul(t).add(r)))}return t.isBatchedMesh&&xp(t).toStack(),t.isInstancedMesh&&t.instanceMatrix&&!0===t.instanceMatrix.isInstancedBufferAttribute&&yp(t).toStack(),null!==this.positionNode&&Xd.assign(Pu(this.positionNode,"POSITION","vec3")),Xd}setupDiffuseColor(e){const{object:t,geometry:r}=e;null!==this.maskNode&&xn(this.maskNode).not().discard();let s=this.colorNode?wn(this.colorNode):xh;if(!0===this.vertexColors&&r.hasAttribute("color")&&(s=s.mul(og())),t.instanceColor){s=Vn("vec3","vInstanceColor").mul(s)}if(t.isBatchedMesh&&t._colorsTexture){s=Vn("vec3","vBatchColor").mul(s)}kn.assign(s);const i=this.opacityNode?fn(this.opacityNode):vh;kn.a.assign(kn.a.mul(i));let n=null;(null!==this.alphaTestNode||this.alphaTest>0)&&(n=null!==this.alphaTestNode?fn(this.alphaTestNode):bh,!0===this.alphaToCoverage?(kn.a=cu(n,n.add(zo(kn.a)),kn.a),kn.a.lessThanEqual(0).discard()):kn.a.lessThanEqual(n).discard()),!0===this.alphaHash&&kn.a.lessThan(ng(Xd)).discard(),e.isOpaque()&&kn.a.assign(1)}setupVariants(){}setupOutgoingLight(){return!0===this.lights?Sn(0):kn.rgb}setupNormal(){return this.normalNode?Sn(this.normalNode):Mh}setupEnvironment(){let e=null;return this.envNode?e=this.envNode:this.envMap&&(e=this.envMap.isCubeTexture?Dc("envMap","cubeTexture"):Dc("envMap","texture")),e}setupLightMap(e){let t=null;return e.material.lightMap&&(t=new Dp(Jh)),t}setupLights(e){const t=[],r=this.setupEnvironment(e);r&&r.isLightingNode&&t.push(r);const s=this.setupLightMap(e);s&&s.isLightingNode&&t.push(s);let i=this.aoNode;null===i&&e.material.aoMap&&(i=ep),e.context.getAO&&(i=e.context.getAO(i,e)),i&&t.push(new Fp(i));let n=this.lightsNode||e.lightsNode;return t.length>0&&(n=e.renderer.lighting.createNode([...n.getLights(),...t])),n}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=Pp(n,t,r,s)}else null!==r&&(a=Sn(null!==s?ou(a,r,s):r));return(i&&!0===i.isNode||t.emissive&&!0===t.emissive.isColor)&&(zn.assign(Sn(i||_h)),a=a.add(zn)),a}setupFog(e,t){const r=e.fogNode;return r&&(aa.assign(t),t=wn(r.toVar())),t}setupPremultipliedAlpha(e,t){return pg(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=ee.prototype.toJSON.call(this,e);r.inputNodes={};for(const{property:t,childNode:s}of this._getNodeChildren())r.inputNodes[t]=s.toJSON(e).uuid;function s(e){const t=[];for(const r in e){const s=e[r];delete s.metadata,t.push(s)}return t}if(t){const t=s(e.textures),i=s(e.images),n=s(e.nodes);t.length>0&&(r.textures=t),i.length>0&&(r.images=i),n.length>0&&(r.nodes=n)}return r}copy(e){return this.lightsNode=e.lightsNode,this.envNode=e.envNode,this.aoNode=e.aoNode,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.maskShadowNode=e.maskShadowNode,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,this.contextNode=e.contextNode,super.copy(e)}}const fg=new te;class yg extends mg{static get type(){return"LineBasicNodeMaterial"}constructor(e){super(),this.isLineBasicNodeMaterial=!0,this.setDefaultValues(fg),this.setValues(e)}}const bg=new re;class xg extends mg{static get type(){return"LineDashedNodeMaterial"}constructor(e){super(),this.isLineDashedNodeMaterial=!0,this.setDefaultValues(bg),this.dashOffset=0,this.offsetNode=null,this.dashScaleNode=null,this.dashSizeNode=null,this.gapSizeNode=null,this.setValues(e)}setupVariants(){const e=this.offsetNode?fn(this.offsetNode):Qh,t=this.dashScaleNode?fn(this.dashScaleNode):qh,r=this.dashSizeNode?fn(this.dashSizeNode):jh,s=this.gapSizeNode?fn(this.gapSizeNode):Xh;oa.assign(r),ua.assign(s);const i=Uu(Sl("lineDistance").mul(t));(e?i.add(e):i).mod(oa.add(ua)).greaterThan(oa).discard()}}const Tg=new re;class _g extends mg{static get type(){return"Line2NodeMaterial"}constructor(e={}){super(),this.isLine2NodeMaterial=!0,this.setDefaultValues(Tg),this.vertexColors=e.vertexColors,this.dashOffset=0,this.lineColorNode=null,this.offsetNode=null,this.dashScaleNode=null,this.dashSizeNode=null,this.gapSizeNode=null,this.blending=se,this._useDash=e.dashed,this._useAlphaToCoverage=!0,this._useWorldUnits=!1,this.setValues(e)}setup(e){const{renderer:t}=e,r=this._useAlphaToCoverage,s=this.vertexColors,i=this._useDash,n=this._useWorldUnits,a=dn(({start:e,end:t})=>{const r=bd.element(2).element(2),s=bd.element(3).element(2).mul(-.5).div(r).sub(e.z).div(t.z.sub(e.z));return wn(ou(e.xyz,t.xyz,s),t.w)}).setLayout({name:"trimSegment",type:"vec4",inputs:[{name:"start",type:"vec4"},{name:"end",type:"vec4"}]});this.vertexNode=dn(()=>{const e=Sl("instanceStart"),t=Sl("instanceEnd"),r=wn(zd.mul(wn(e,1))).toVar("start"),s=wn(zd.mul(wn(t,1))).toVar("end");if(i){const e=this.dashScaleNode?fn(this.dashScaleNode):qh,t=this.offsetNode?fn(this.offsetNode):Qh,r=Sl("instanceDistanceStart"),s=Sl("instanceDistanceEnd");let i=jd.y.lessThan(.5).select(e.mul(r),e.mul(s));i=i.add(t),Vn("float","lineDistance").assign(i)}n&&(Vn("vec3","worldStart").assign(r.xyz),Vn("vec3","worldEnd").assign(s.xyz));const o=Ql.z.div(Ql.w),u=bd.element(2).element(3).equal(-1);pn(u,()=>{pn(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=bd.mul(r),d=bd.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=wn().toVar();if(n){const e=s.xyz.sub(r.xyz).normalize(),t=ou(r.xyz,s.xyz,.5).normalize(),n=e.cross(t).normalize(),a=e.cross(n),o=Vn("vec4","worldPos");o.assign(jd.y.lessThan(.5).select(r,s));const u=Kh.mul(.5);o.addAssign(wn(jd.x.lessThan(0).select(n.mul(u),n.mul(u).negate()),0)),i||(o.addAssign(wn(jd.y.lessThan(.5).select(e.mul(u).negate(),e.mul(u)),0)),o.addAssign(wn(a.mul(u),0)),pn(jd.y.greaterThan(1).or(jd.y.lessThan(0)),()=>{o.subAssign(wn(a.mul(2).mul(u),0))})),g.assign(bd.mul(o));const l=Sn().toVar();l.assign(jd.y.lessThan(.5).select(c,h)),g.z.assign(l.z.mul(g.w))}else{const e=Tn(p.y,p.x.negate()).toVar("offset");p.x.assign(p.x.div(o)),e.x.assign(e.x.div(o)),e.assign(jd.x.lessThan(0).select(e.negate(),e)),pn(jd.y.lessThan(0),()=>{e.assign(e.sub(p))}).ElseIf(jd.y.greaterThan(1),()=>{e.assign(e.add(p))}),e.assign(e.mul(Kh)),e.assign(e.div(Ql.w.div(ql))),g.assign(jd.y.lessThan(.5).select(l,d)),e.assign(e.mul(g.w)),g.assign(g.add(wn(e,0,0)))}return g})();const o=dn(({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 Tn(h,p)});if(this.colorNode=dn(()=>{const e=Rl();if(i){const t=this.dashSizeNode?fn(this.dashSizeNode):jh,r=this.gapSizeNode?fn(this.gapSizeNode):Xh;oa.assign(t),ua.assign(r);const s=Vn("float","lineDistance");e.y.lessThan(-1).or(e.y.greaterThan(1)).discard(),s.mod(oa.add(ua)).greaterThan(oa).discard()}const a=fn(1).toVar("alpha");if(n){const e=Vn("vec3","worldStart"),s=Vn("vec3","worldEnd"),n=Vn("vec4","worldPos").xyz.normalize().mul(1e5),u=s.sub(e),l=o({p1:e,p2:s,p3:Sn(0,0,0),p4:n}),d=e.add(u.mul(l.x)),c=n.mul(l.y),h=d.sub(c).length().div(Kh);if(!i)if(r&&t.currentSamples>0){const e=h.fwidth();a.assign(cu(e.negate().add(.5),e.add(.5),h).oneMinus())}else h.greaterThan(.5).discard()}else if(r&&t.currentSamples>0){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=fn(s.fwidth()).toVar("dlen");pn(e.y.abs().greaterThan(1),()=>{a.assign(cu(i.oneMinus(),i.add(1),s).oneMinus())})}else pn(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=Sl("instanceColorStart"),t=Sl("instanceColorEnd");u=jd.y.lessThan(.5).select(e,t).mul(xh)}else u=xh;return wn(u,a)})(),this.transparent){const e=this.opacityNode?fn(this.opacityNode):vh;this.outputNode=wn(this.colorNode.rgb.mul(e).add(Gp().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 vg=new ie;class Ng extends mg{static get type(){return"MeshNormalNodeMaterial"}constructor(e){super(),this.isMeshNormalNodeMaterial=!0,this.setDefaultValues(vg),this.setValues(e)}setupDiffuseColor(){const e=this.opacityNode?fn(this.opacityNode):vh;kn.assign($u(wn(uh(lc),e),ne))}}const Sg=dn(([e=Yd])=>{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 Tn(t,r)});class Rg extends ae{constructor(e=1,t={}){super(e,e,t),this.isCubeRenderTarget=!0;const r={width:e,height:e,depth:1},s=[r,r,r,r,r,r];this.texture=new U(s),this._setTextureOptions(t),this.texture.isRenderTargetTexture=!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 oe(5,5,5),n=Sg(Yd),a=new mg;a.colorNode=Pl(t,n,0),a.side=L,a.blending=se;const o=new ue(i,a),u=new le;u.add(o),t.minFilter===Z&&(t.minFilter=de);const l=new ce(1,10,this),d=e.getMRT();return e.setMRT(null),l.update(e,u),e.setMRT(d),t.minFilter=r,t.generateMipmaps=s,o.geometry.dispose(),o.material.dispose(),this}clear(e,t=!0,r=!0,s=!0){const i=e.getRenderTarget();for(let i=0;i<6;i++)e.setRenderTarget(this,i),e.clear(t,r,s);e.setRenderTarget(i)}}const Ag=new WeakMap;class Eg extends pi{static get type(){return"CubeMapNode"}constructor(e){super("vec3"),this.envNode=e,this._cubeTexture=null,this._cubeTextureNode=Cc(null);const t=new U;t.isRenderTargetTexture=!0,this._defaultTexture=t,this.updateBeforeType=ti.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===he||r===pe){if(Ag.has(e)){const t=Ag.get(e);Cg(t,e.mapping),this._cubeTexture=t}else{const r=e.image;if(function(e){return null!=e&&e.height>0}(r)){const s=new Rg(r.height);s.fromEquirectangularTexture(t,e),Cg(s.texture,e.mapping),this._cubeTexture=s.texture,Ag.set(e,s.texture),e.addEventListener("dispose",wg)}else this._cubeTexture=this._defaultTexture}this._cubeTextureNode.value=this._cubeTexture}else this._cubeTextureNode=this.envNode}}}setup(e){return this.updateBefore(e),this._cubeTextureNode}}function wg(e){const t=e.target;t.removeEventListener("dispose",wg);const r=Ag.get(t);void 0!==r&&(Ag.delete(t),r.dispose())}function Cg(e,t){t===he?e.mapping=I:t===pe&&(e.mapping=O)}const Mg=nn(Eg).setParameterLength(1);class Bg extends Bp{static get type(){return"BasicEnvironmentNode"}constructor(e=null){super(),this.envNode=e}setup(e){e.context.environment=Mg(this.envNode)}}class Fg extends Bp{static get type(){return"BasicLightMapNode"}constructor(e=null){super(),this.lightMapNode=e}setup(e){const t=fn(1/Math.PI);e.context.irradianceLightMap=this.lightMapNode.mul(t)}}class Lg{start(e){e.lightsNode.setupLights(e,e.lightsNode.getLightNodes(e)),this.indirect(e)}finish(){}direct(){}directRectArea(){}indirect(){}ambientOcclusion(){}}class Pg extends Lg{constructor(){super()}indirect({context:e}){const t=e.ambientOcclusion,r=e.reflectedLight,s=e.irradianceLightMap;r.indirectDiffuse.assign(wn(0)),s?r.indirectDiffuse.addAssign(s):r.indirectDiffuse.addAssign(wn(1,1,1,0)),r.indirectDiffuse.mulAssign(t),r.indirectDiffuse.mulAssign(kn.rgb)}finish(e){const{material:t,context:r}=e,s=r.outgoingLight,i=e.context.environment;if(i)switch(t.combine){case fe:s.rgb.assign(ou(s.rgb,s.rgb.mul(i.rgb),Ah.mul(Eh)));break;case me:s.rgb.assign(ou(s.rgb,i.rgb,Ah.mul(Eh)));break;case ge:s.rgb.addAssign(i.rgb.mul(Ah.mul(Eh)));break;default:d("BasicLightingModel: Unsupported .combine value:",t.combine)}}}const Dg=new ye;class Ug extends mg{static get type(){return"MeshBasicNodeMaterial"}constructor(e){super(),this.isMeshBasicNodeMaterial=!0,this.lights=!0,this.setDefaultValues(Dg),this.setValues(e)}setupNormal(){return sc(oc)}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new Bg(t):null}setupLightMap(e){let t=null;return e.material.lightMap&&(t=new Fg(Jh)),t}setupOutgoingLight(){return kn.rgb}setupLightingModel(){return new Pg}}const Ig=dn(({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))}),Og=dn(e=>e.diffuseColor.mul(1/Math.PI)),Vg=dn(({dotNH:e})=>na.mul(fn(.5)).add(1).mul(fn(1/Math.PI)).mul(e.pow(na))),kg=dn(({lightDirection:e})=>{const t=e.add(Jd).normalize(),r=lc.dot(t).clamp(),s=Jd.dot(t).clamp(),i=Ig({f0:ra,f90:1,dotVH:s}),n=fn(.25),a=Vg({dotNH:r});return i.mul(n).mul(a)});class Gg extends Pg{constructor(e=!0){super(),this.specular=e}direct({lightDirection:e,lightColor:t,reflectedLight:r}){const s=lc.dot(e).clamp().mul(t);r.directDiffuse.addAssign(s.mul(Og({diffuseColor:kn.rgb}))),!0===this.specular&&r.directSpecular.addAssign(s.mul(kg({lightDirection:e})).mul(Ah))}indirect(e){const{ambientOcclusion:t,irradiance:r,reflectedLight:s}=e.context;s.indirectDiffuse.addAssign(r.mul(Og({diffuseColor:kn}))),s.indirectDiffuse.mulAssign(t)}}const zg=new be;class $g extends mg{static get type(){return"MeshLambertNodeMaterial"}constructor(e){super(),this.isMeshLambertNodeMaterial=!0,this.lights=!0,this.setDefaultValues(zg),this.setValues(e)}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new Bg(t):null}setupLightingModel(){return new Gg(!1)}}const Wg=new xe;class Hg extends mg{static get type(){return"MeshPhongNodeMaterial"}constructor(e){super(),this.isMeshPhongNodeMaterial=!0,this.lights=!0,this.shininessNode=null,this.specularNode=null,this.setDefaultValues(Wg),this.setValues(e)}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new Bg(t):null}setupLightingModel(){return new Gg}setupVariants(){const e=(this.shininessNode?fn(this.shininessNode):Th).max(1e-4);na.assign(e);const t=this.specularNode||Nh;ra.assign(t)}copy(e){return this.shininessNode=e.shininessNode,this.specularNode=e.specularNode,super.copy(e)}}const qg=dn(e=>{if(!1===e.geometry.hasAttribute("normal"))return fn(0);const t=oc.dFdx().abs().max(oc.dFdy().abs());return t.x.max(t.y).max(t.z)}),jg=dn(e=>{const{roughness:t}=e,r=qg();let s=t.max(.0525);return s=s.add(r),s=s.min(1),s}),Xg=dn(({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 Da(.5,i.add(n).max(no))}).setLayout({name:"V_GGX_SmithCorrelated",type:"float",inputs:[{name:"alpha",type:"float"},{name:"dotNL",type:"float"},{name:"dotNV",type:"float"}]}),Kg=dn(({alphaT:e,alphaB:t,dotTV:r,dotBV:s,dotTL:i,dotBL:n,dotNV:a,dotNL:o})=>{const u=o.mul(Sn(e.mul(r),t.mul(s),a).length()),l=a.mul(Sn(e.mul(i),t.mul(n),o).length());return Da(.5,u.add(l))}).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"}]}),Qg=dn(({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"}]}),Yg=fn(1/Math.PI),Zg=dn(({alphaT:e,alphaB:t,dotNH:r,dotTH:s,dotBH:i})=>{const n=e.mul(t),a=Sn(t.mul(s),e.mul(i),n.mul(r)),o=a.dot(a),u=n.div(o);return Yg.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"}]}),Jg=dn(({lightDirection:e,f0:t,f90:r,roughness:s,f:i,normalView:n=lc,USE_IRIDESCENCE:a,USE_ANISOTROPY:o})=>{const u=s.pow2(),l=e.add(Jd).normalize(),d=n.dot(e).clamp(),c=n.dot(Jd).clamp(),h=n.dot(l).clamp(),p=Jd.dot(l).clamp();let g,m,f=Ig({f0:t,f90:r,dotVH:p});if(Yi(a)&&(f=Kn.mix(f,i)),Yi(o)){const t=ea.dot(e),r=ea.dot(Jd),s=ea.dot(l),i=ta.dot(e),n=ta.dot(Jd),a=ta.dot(l);g=Kg({alphaT:Zn,alphaB:u,dotTV:r,dotBV:n,dotTL:t,dotBL:i,dotNV:c,dotNL:d}),m=Zg({alphaT:Zn,alphaB:u,dotNH:h,dotTH:s,dotBH:a})}else g=Xg({alpha:u,dotNL:d,dotNV:c}),m=Qg({alpha:u,dotNH:h});return f.mul(g).mul(m)}),em=new Uint16Array([12469,15057,12620,14925,13266,14620,13807,14376,14323,13990,14545,13625,14713,13328,14840,12882,14931,12528,14996,12233,15039,11829,15066,11525,15080,11295,15085,10976,15082,10705,15073,10495,13880,14564,13898,14542,13977,14430,14158,14124,14393,13732,14556,13410,14702,12996,14814,12596,14891,12291,14937,11834,14957,11489,14958,11194,14943,10803,14921,10506,14893,10278,14858,9960,14484,14039,14487,14025,14499,13941,14524,13740,14574,13468,14654,13106,14743,12678,14818,12344,14867,11893,14889,11509,14893,11180,14881,10751,14852,10428,14812,10128,14765,9754,14712,9466,14764,13480,14764,13475,14766,13440,14766,13347,14769,13070,14786,12713,14816,12387,14844,11957,14860,11549,14868,11215,14855,10751,14825,10403,14782,10044,14729,9651,14666,9352,14599,9029,14967,12835,14966,12831,14963,12804,14954,12723,14936,12564,14917,12347,14900,11958,14886,11569,14878,11247,14859,10765,14828,10401,14784,10011,14727,9600,14660,9289,14586,8893,14508,8533,15111,12234,15110,12234,15104,12216,15092,12156,15067,12010,15028,11776,14981,11500,14942,11205,14902,10752,14861,10393,14812,9991,14752,9570,14682,9252,14603,8808,14519,8445,14431,8145,15209,11449,15208,11451,15202,11451,15190,11438,15163,11384,15117,11274,15055,10979,14994,10648,14932,10343,14871,9936,14803,9532,14729,9218,14645,8742,14556,8381,14461,8020,14365,7603,15273,10603,15272,10607,15267,10619,15256,10631,15231,10614,15182,10535,15118,10389,15042,10167,14963,9787,14883,9447,14800,9115,14710,8665,14615,8318,14514,7911,14411,7507,14279,7198,15314,9675,15313,9683,15309,9712,15298,9759,15277,9797,15229,9773,15166,9668,15084,9487,14995,9274,14898,8910,14800,8539,14697,8234,14590,7790,14479,7409,14367,7067,14178,6621,15337,8619,15337,8631,15333,8677,15325,8769,15305,8871,15264,8940,15202,8909,15119,8775,15022,8565,14916,8328,14804,8009,14688,7614,14569,7287,14448,6888,14321,6483,14088,6171,15350,7402,15350,7419,15347,7480,15340,7613,15322,7804,15287,7973,15229,8057,15148,8012,15046,7846,14933,7611,14810,7357,14682,7069,14552,6656,14421,6316,14251,5948,14007,5528,15356,5942,15356,5977,15353,6119,15348,6294,15332,6551,15302,6824,15249,7044,15171,7122,15070,7050,14949,6861,14818,6611,14679,6349,14538,6067,14398,5651,14189,5311,13935,4958,15359,4123,15359,4153,15356,4296,15353,4646,15338,5160,15311,5508,15263,5829,15188,6042,15088,6094,14966,6001,14826,5796,14678,5543,14527,5287,14377,4985,14133,4586,13869,4257,15360,1563,15360,1642,15358,2076,15354,2636,15341,3350,15317,4019,15273,4429,15203,4732,15105,4911,14981,4932,14836,4818,14679,4621,14517,4386,14359,4156,14083,3795,13808,3437,15360,122,15360,137,15358,285,15355,636,15344,1274,15322,2177,15281,2765,15215,3223,15120,3451,14995,3569,14846,3567,14681,3466,14511,3305,14344,3121,14037,2800,13753,2467,15360,0,15360,1,15359,21,15355,89,15346,253,15325,479,15287,796,15225,1148,15133,1492,15008,1749,14856,1882,14685,1886,14506,1783,14324,1608,13996,1398,13702,1183]);let tm=null;const rm=dn(({roughness:e,dotNV:t})=>{null===tm&&(tm=new Te(em,16,16,W,_e),tm.name="DFG_LUT",tm.minFilter=de,tm.magFilter=de,tm.wrapS=ve,tm.wrapT=ve,tm.generateMipmaps=!1,tm.needsUpdate=!0);const r=Tn(e,t);return Pl(tm,r).rg}),sm=dn(({lightDirection:e,f0:t,f90:r,roughness:s,f:i,USE_IRIDESCENCE:n,USE_ANISOTROPY:a})=>{const o=Jg({lightDirection:e,f0:t,f90:r,roughness:s,f:i,USE_IRIDESCENCE:n,USE_ANISOTROPY:a}),u=lc.dot(e).clamp(),l=lc.dot(Jd).clamp(),d=rm({roughness:s,dotNV:l}),c=rm({roughness:s,dotNV:u}),h=t.mul(d.x).add(r.mul(d.y)),p=t.mul(c.x).add(r.mul(c.y)),g=d.x.add(d.y),m=c.x.add(c.y),f=fn(1).sub(g),y=fn(1).sub(m),b=t.add(t.oneMinus().mul(.047619)),x=h.mul(p).mul(b).div(fn(1).sub(f.mul(y).mul(b).mul(b)).add(no)),T=f.mul(y),_=x.mul(T);return o.add(_)}),im=dn(e=>{const{dotNV:t,specularColor:r,specularF90:s,roughness:i}=e,n=rm({dotNV:t,roughness:i});return r.mul(n.x).add(s.mul(n.y))}),nm=dn(({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(Sn(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"}]}),am=dn(({roughness:e,dotNH:t})=>{const r=e.pow2(),s=fn(1).div(r),i=t.pow2().oneMinus().max(.0078125);return fn(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"}]}),om=dn(({dotNV:e,dotNL:t})=>fn(1).div(fn(4).mul(t.add(e).sub(t.mul(e))))).setLayout({name:"V_Neubelt",type:"float",inputs:[{name:"dotNV",type:"float"},{name:"dotNL",type:"float"}]}),um=dn(({lightDirection:e})=>{const t=e.add(Jd).normalize(),r=lc.dot(e).clamp(),s=lc.dot(Jd).clamp(),i=lc.dot(t).clamp(),n=am({roughness:Xn,dotNH:i}),a=om({dotNV:s,dotNL:r});return jn.mul(n).mul(a)}),lm=dn(({N:e,V:t,roughness:r})=>{const s=e.dot(t).saturate(),i=Tn(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"}]}),dm=dn(({f:e})=>{const t=e.length();return jo(t.mul(t).add(e.z).div(t.add(1)),0)}).setLayout({name:"LTC_ClippedSphereFormFactor",type:"float",inputs:[{name:"f",type:"vec3"}]}),cm=dn(({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,jo(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"}]}),hm=dn(({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=Sn().toVar();return pn(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(Ln(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=Sn(0).toVar();f.addAssign(cm({v1:h,v2:p})),f.addAssign(cm({v1:p,v2:g})),f.addAssign(cm({v1:g,v2:m})),f.addAssign(cm({v1:m,v2:h})),c.assign(Sn(dm({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"}]}),pm=dn(({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=Sn().toVar();return pn(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=Sn(0).toVar();d.addAssign(cm({v1:n,v2:a})),d.addAssign(cm({v1:a,v2:o})),d.addAssign(cm({v1:o,v2:l})),d.addAssign(cm({v1:l,v2:n})),u.assign(Sn(dm({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"}]}),gm=1/6,mm=e=>Pa(gm,Pa(e,Pa(e,e.negate().add(3)).sub(3)).add(1)),fm=e=>Pa(gm,Pa(e,Pa(e,Pa(3,e).sub(6))).add(4)),ym=e=>Pa(gm,Pa(e,Pa(e,Pa(-3,e).add(3)).add(3)).add(1)),bm=e=>Pa(gm,eu(e,3)),xm=e=>mm(e).add(fm(e)),Tm=e=>ym(e).add(bm(e)),_m=e=>Fa(-1,fm(e).div(mm(e).add(fm(e)))),vm=e=>Fa(1,bm(e).div(ym(e).add(bm(e)))),Nm=(e,t,r)=>{const s=e.uvNode,i=Pa(s,t.zw).add(.5),n=vo(i),a=Ro(i),o=xm(a.x),u=Tm(a.x),l=_m(a.x),d=vm(a.x),c=_m(a.y),h=vm(a.y),p=Tn(n.x.add(l),n.y.add(c)).sub(.5).mul(t.xy),g=Tn(n.x.add(d),n.y.add(c)).sub(.5).mul(t.xy),m=Tn(n.x.add(l),n.y.add(h)).sub(.5).mul(t.xy),f=Tn(n.x.add(d),n.y.add(h)).sub(.5).mul(t.xy),y=xm(a.y).mul(Fa(o.mul(e.sample(p).level(r)),u.mul(e.sample(g).level(r)))),b=Tm(a.y).mul(Fa(o.mul(e.sample(m).level(r)),u.mul(e.sample(f).level(r))));return y.add(b)},Sm=dn(([e,t])=>{const r=Tn(e.size(yn(t))),s=Tn(e.size(yn(t.add(1)))),i=Da(1,r),n=Da(1,s),a=Nm(e,wn(i,r),vo(t)),o=Nm(e,wn(n,s),No(t));return Ro(t).mix(a,o)}),Rm=dn(([e,t])=>{const r=t.mul(Cl(e));return Sm(e,r)}),Am=dn(([e,t,r,s,i])=>{const n=Sn(du(t.negate(),So(e),Da(1,s))),a=Sn(Po(i[0].xyz),Po(i[1].xyz),Po(i[2].xyz));return So(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"}]}),Em=dn(([e,t])=>e.mul(uu(t.mul(2).sub(2),0,1))).setLayout({name:"applyIorToRoughness",type:"float",inputs:[{name:"roughness",type:"float"},{name:"ior",type:"float"}]}),wm=Vp(),Cm=Gp(),Mm=dn(([e,t,r],{material:s})=>{const i=(s.side===L?wm:Cm).sample(e),n=xo(Xl.x).mul(Em(t,r));return Sm(i,n)}),Bm=dn(([e,t,r])=>(pn(r.notEqual(0),()=>{const s=bo(t).negate().div(r);return fo(s.negate().mul(e))}),Sn(1))).setLayout({name:"volumeAttenuation",type:"vec3",inputs:[{name:"transmissionDistance",type:"float"},{name:"attenuationColor",type:"vec3"},{name:"attenuationDistance",type:"float"}]}),Fm=dn(([e,t,r,s,i,n,a,o,u,l,d,c,h,p,g])=>{let m,f;if(g){m=wn().toVar(),f=Sn().toVar();const i=d.sub(1).mul(g.mul(.025)),n=Sn(d.sub(i),d,d.add(i));Sp({start:0,end:3},({i:i})=>{const d=n.element(i),g=Am(e,t,c,d,o),y=a.add(g),b=l.mul(u.mul(wn(y,1))),x=Tn(b.xy.div(b.w)).toVar();x.addAssign(1),x.divAssign(2),x.assign(Tn(x.x,x.y.oneMinus()));const T=Mm(x,r,d);m.element(i).assign(T.element(i)),m.a.addAssign(T.a),f.element(i).assign(s.element(i).mul(Bm(Po(g),h,p).element(i)))}),m.a.divAssign(3)}else{const i=Am(e,t,c,d,o),n=a.add(i),g=l.mul(u.mul(wn(n,1))),y=Tn(g.xy.div(g.w)).toVar();y.addAssign(1),y.divAssign(2),y.assign(Tn(y.x,y.y.oneMinus())),m=Mm(y,r,d),f=s.mul(Bm(Po(i),h,p))}const y=f.rgb.mul(m.rgb),b=e.dot(t).clamp(),x=Sn(im({dotNV:b,specularColor:i,specularF90:n,roughness:r})),T=f.r.add(f.g,f.b).div(3);return wn(x.oneMinus().mul(y),m.a.oneMinus().mul(T).oneMinus())}),Lm=Ln(3.2404542,-.969266,.0556434,-1.5371385,1.8760108,-.2040259,-.4985314,.041556,1.0572252),Pm=(e,t)=>e.sub(t).div(e.add(t)).pow2(),Dm=dn(({outsideIOR:e,eta2:t,cosTheta1:r,thinFilmThickness:s,baseF0:i})=>{const n=ou(e,t,cu(0,.03,s)),a=e.div(n).pow2().mul(r.pow2().oneMinus()).oneMinus();pn(a.lessThan(0),()=>Sn(1));const o=a.sqrt(),u=Pm(n,e),l=Ig({f0:u,f90:1,dotVH:r}),d=l.oneMinus(),c=n.lessThan(e).select(Math.PI,0),h=fn(Math.PI).sub(c),p=(e=>{const t=e.sqrt();return Sn(1).add(t).div(Sn(1).sub(t))})(i.clamp(0,.9999)),g=Pm(p,n.toVec3()),m=Ig({f0:g,f90:1,dotVH:o}),f=Sn(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=Sn(h).add(f),x=l.mul(m).clamp(1e-5,.9999),T=x.sqrt(),_=d.pow2().mul(m).div(Sn(1).sub(x)),v=l.add(_).toVar(),N=_.sub(d).toVar();return Sp({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=Sn(54856e-17,44201e-17,52481e-17),i=Sn(1681e3,1795300,2208400),n=Sn(43278e5,93046e5,66121e5),a=fn(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=Sn(o.x.add(a),o.y,o.z).div(1.0685e-7),Lm.mul(o)})(fn(e).mul(y),fn(e).mul(b)).mul(2);v.addAssign(N.mul(t))}),v.max(Sn(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"}]}),Um=dn(({normal:e,viewDir:t,roughness:r})=>{const s=e.dot(t).saturate(),i=r.mul(r),n=r.add(.1).reciprocal(),a=fn(-1.9362).add(r.mul(1.0678)).add(i.mul(.4573)).sub(n.mul(.8469)),o=fn(-.6014).add(r.mul(.5538)).sub(i.mul(.467)).sub(n.mul(.1255));return a.mul(s).add(o).exp().saturate()}),Im=Sn(.04),Om=fn(1);class Vm extends Lg{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,this.iridescenceF0Dielectric=null,this.iridescenceF0Metallic=null}start(e){if(!0===this.clearcoat&&(this.clearcoatRadiance=Sn().toVar("clearcoatRadiance"),this.clearcoatSpecularDirect=Sn().toVar("clearcoatSpecularDirect"),this.clearcoatSpecularIndirect=Sn().toVar("clearcoatSpecularIndirect")),!0===this.sheen&&(this.sheenSpecularDirect=Sn().toVar("sheenSpecularDirect"),this.sheenSpecularIndirect=Sn().toVar("sheenSpecularIndirect")),!0===this.iridescence){const e=lc.dot(Jd).clamp(),t=Dm({outsideIOR:fn(1),eta2:Qn,cosTheta1:e,thinFilmThickness:Yn,baseF0:ra}),r=Dm({outsideIOR:fn(1),eta2:Qn,cosTheta1:e,thinFilmThickness:Yn,baseF0:kn.rgb});this.iridescenceFresnel=ou(t,r,Wn),this.iridescenceF0Dielectric=nm({f:t,f90:1,dotVH:e}),this.iridescenceF0Metallic=nm({f:r,f90:1,dotVH:e}),this.iridescenceF0=ou(this.iridescenceF0Dielectric,this.iridescenceF0Metallic,Wn)}if(!0===this.transmission){const t=Qd,r=Nd.sub(Qd).normalize(),s=dc,i=e.context;i.backdrop=Fm(s,r,$n,Gn,sa,ia,t,Dd,Td,bd,da,ha,ga,pa,this.dispersion?ma:null),i.backdropAlpha=ca,kn.a.mulAssign(ou(1,i.backdrop.a,ca))}super.start(e)}computeMultiscattering(e,t,r,s,i=null){const n=lc.dot(Jd).clamp(),a=rm({roughness:$n,dotNV:n}),o=i?Kn.mix(s,i):s,u=o.mul(a.x).add(r.mul(a.y)),l=a.x.add(a.y).oneMinus(),d=o.add(o.oneMinus().mul(.047619)),c=u.mul(d).div(l.mul(d).oneMinus());e.addAssign(u),t.addAssign(c.mul(l))}direct({lightDirection:e,lightColor:t,reflectedLight:r}){const s=lc.dot(e).clamp().mul(t).toVar();if(!0===this.sheen){this.sheenSpecularDirect.addAssign(s.mul(um({lightDirection:e})));const t=Um({normal:lc,viewDir:Jd,roughness:Xn}),r=Um({normal:lc,viewDir:e,roughness:Xn}),i=jn.r.max(jn.g).max(jn.b).mul(t.max(r)).oneMinus();s.mulAssign(i)}if(!0===this.clearcoat){const r=cc.dot(e).clamp().mul(t);this.clearcoatSpecularDirect.addAssign(r.mul(Jg({lightDirection:e,f0:Im,f90:Om,roughness:qn,normalView:cc})))}r.directDiffuse.addAssign(s.mul(Og({diffuseColor:Gn}))),r.directSpecular.addAssign(s.mul(sm({lightDirection:e,f0:sa,f90:1,roughness:$n,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=lc,h=Jd,p=Zd.toVar(),g=lm({N:c,V:h,roughness:$n}),m=n.sample(g).toVar(),f=a.sample(g).toVar(),y=Ln(Sn(m.x,0,m.y),Sn(0,1,0),Sn(m.z,0,m.w)).toVar(),b=sa.mul(f.x).add(ia.sub(sa).mul(f.y)).toVar();if(i.directSpecular.addAssign(e.mul(b).mul(hm({N:c,V:h,P:p,mInv:y,p0:o,p1:u,p2:l,p3:d}))),i.directDiffuse.addAssign(e.mul(Gn).mul(hm({N:c,V:h,P:p,mInv:Ln(1,0,0,0,1,0,0,0,1),p0:o,p1:u,p2:l,p3:d}))),!0===this.clearcoat){const t=cc,r=lm({N:t,V:h,roughness:qn}),s=n.sample(r),i=a.sample(r),c=Ln(Sn(s.x,0,s.y),Sn(0,1,0),Sn(s.z,0,s.w)),g=Im.mul(i.x).add(Om.sub(Im).mul(i.y));this.clearcoatSpecularDirect.addAssign(e.mul(g).mul(hm({N:t,V:h,P:p,mInv:c,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,s=t.mul(Og({diffuseColor:Gn})).toVar();if(!0===this.sheen){const e=Um({normal:lc,viewDir:Jd,roughness:Xn}),t=jn.r.max(jn.g).max(jn.b).mul(e).oneMinus();s.mulAssign(t)}r.indirectDiffuse.addAssign(s)}indirectSpecular(e){const{radiance:t,iblIrradiance:r,reflectedLight:s}=e.context;if(!0===this.sheen&&this.sheenSpecularIndirect.addAssign(r.mul(jn,Um({normal:lc,viewDir:Jd,roughness:Xn}))),!0===this.clearcoat){const e=cc.dot(Jd).clamp(),t=im({dotNV:e,specularColor:Im,specularF90:Om,roughness:qn});this.clearcoatSpecularIndirect.addAssign(this.clearcoatRadiance.mul(t))}const i=Sn().toVar("singleScatteringDielectric"),n=Sn().toVar("multiScatteringDielectric"),a=Sn().toVar("singleScatteringMetallic"),o=Sn().toVar("multiScatteringMetallic");this.computeMultiscattering(i,n,ia,ra,this.iridescenceF0Dielectric),this.computeMultiscattering(a,o,ia,kn.rgb,this.iridescenceF0Metallic);const u=ou(i,a,Wn),l=ou(n,o,Wn),d=i.add(n),c=Gn.mul(d.oneMinus()),h=r.mul(1/Math.PI),p=t.mul(u).add(l.mul(h)).toVar(),g=c.mul(h).toVar();if(!0===this.sheen){const e=Um({normal:lc,viewDir:Jd,roughness:Xn}),t=jn.r.max(jn.g).max(jn.b).mul(e).oneMinus();p.mulAssign(t),g.mulAssign(t)}s.indirectSpecular.addAssign(p),s.indirectDiffuse.addAssign(g)}ambientOcclusion(e){const{ambientOcclusion:t,reflectedLight:r}=e.context,s=lc.dot(Jd).clamp().add(t),i=$n.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=cc.dot(Jd).clamp(),r=Ig({dotVH:e,f0:Im,f90:Om}),s=t.mul(Hn.mul(r).oneMinus()).add(this.clearcoatSpecularDirect.add(this.clearcoatSpecularIndirect).mul(Hn));t.assign(s)}if(!0===this.sheen){const e=t.add(this.sheenSpecularDirect,this.sheenSpecularIndirect.mul(1/Math.PI));t.assign(e)}}}const km=fn(1),Gm=fn(-2),zm=fn(.8),$m=fn(-1),Wm=fn(.4),Hm=fn(2),qm=fn(.305),jm=fn(3),Xm=fn(.21),Km=fn(4),Qm=fn(4),Ym=fn(16),Zm=dn(([e])=>{const t=Sn(Fo(e)).toVar(),r=fn(-1).toVar();return pn(t.x.greaterThan(t.z),()=>{pn(t.x.greaterThan(t.y),()=>{r.assign(Tu(e.x.greaterThan(0),0,3))}).Else(()=>{r.assign(Tu(e.y.greaterThan(0),1,4))})}).Else(()=>{pn(t.z.greaterThan(t.y),()=>{r.assign(Tu(e.z.greaterThan(0),2,5))}).Else(()=>{r.assign(Tu(e.y.greaterThan(0),1,4))})}),r}).setLayout({name:"getFace",type:"float",inputs:[{name:"direction",type:"vec3"}]}),Jm=dn(([e,t])=>{const r=Tn().toVar();return pn(t.equal(0),()=>{r.assign(Tn(e.z,e.y).div(Fo(e.x)))}).ElseIf(t.equal(1),()=>{r.assign(Tn(e.x.negate(),e.z.negate()).div(Fo(e.y)))}).ElseIf(t.equal(2),()=>{r.assign(Tn(e.x.negate(),e.y).div(Fo(e.z)))}).ElseIf(t.equal(3),()=>{r.assign(Tn(e.z.negate(),e.y).div(Fo(e.x)))}).ElseIf(t.equal(4),()=>{r.assign(Tn(e.x.negate(),e.z).div(Fo(e.y)))}).Else(()=>{r.assign(Tn(e.x,e.y).div(Fo(e.z)))}),Pa(.5,r.add(1))}).setLayout({name:"getUV",type:"vec2",inputs:[{name:"direction",type:"vec3"},{name:"face",type:"float"}]}),ef=dn(([e])=>{const t=fn(0).toVar();return pn(e.greaterThanEqual(zm),()=>{t.assign(km.sub(e).mul($m.sub(Gm)).div(km.sub(zm)).add(Gm))}).ElseIf(e.greaterThanEqual(Wm),()=>{t.assign(zm.sub(e).mul(Hm.sub($m)).div(zm.sub(Wm)).add($m))}).ElseIf(e.greaterThanEqual(qm),()=>{t.assign(Wm.sub(e).mul(jm.sub(Hm)).div(Wm.sub(qm)).add(Hm))}).ElseIf(e.greaterThanEqual(Xm),()=>{t.assign(qm.sub(e).mul(Km.sub(jm)).div(qm.sub(Xm)).add(jm))}).Else(()=>{t.assign(fn(-2).mul(xo(Pa(1.16,e))))}),t}).setLayout({name:"roughnessToMip",type:"float",inputs:[{name:"roughness",type:"float"}]}),tf=dn(([e,t])=>{const r=e.toVar();r.assign(Pa(2,r).sub(1));const s=Sn(r,1).toVar();return pn(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"}]}),rf=dn(([e,t,r,s,i,n])=>{const a=fn(r),o=Sn(t),u=uu(ef(a),Gm,n),l=Ro(u),d=vo(u),c=Sn(sf(e,o,d,s,i,n)).toVar();return pn(l.notEqual(0),()=>{const t=Sn(sf(e,o,d.add(1),s,i,n)).toVar();c.assign(ou(c,t,l))}),c}),sf=dn(([e,t,r,s,i,n])=>{const a=fn(r).toVar(),o=Sn(t),u=fn(Zm(o)).toVar(),l=fn(jo(Qm.sub(a),0)).toVar();a.assign(jo(a,Qm));const d=fn(yo(a)).toVar(),c=Tn(Jm(o,u).mul(d.sub(2)).add(1)).toVar();return pn(u.greaterThan(2),()=>{c.y.addAssign(d),u.subAssign(3)}),c.x.addAssign(u.mul(d)),c.x.addAssign(l.mul(Pa(3,Ym))),c.y.addAssign(Pa(4,yo(n).sub(d))),c.x.mulAssign(s),c.y.mulAssign(i),e.sample(c).grad(Tn(),Tn())}),nf=dn(({envMap:e,mipInt:t,outputDirection:r,theta:s,axis:i,CUBEUV_TEXEL_WIDTH:n,CUBEUV_TEXEL_HEIGHT:a,CUBEUV_MAX_MIP:o})=>{const u=Eo(s),l=r.mul(u).add(i.cross(r).mul(Ao(s))).add(i.mul(i.dot(r).mul(u.oneMinus())));return sf(e,l,t,n,a,o)}),af=dn(({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=Sn(Tu(t,r,Jo(r,s))).toVar();pn(h.equal(Sn(0)),()=>{h.assign(Sn(s.z,0,s.x.negate()))}),h.assign(So(h));const p=Sn().toVar();return p.addAssign(i.element(0).mul(nf({theta:0,axis:h,outputDirection:s,mipInt:o,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c}))),Sp({start:yn(1),end:e},({i:e})=>{pn(e.greaterThanEqual(n),()=>{Rp()});const t=fn(a.mul(fn(e))).toVar();p.addAssign(i.element(e).mul(nf({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(nf({theta:t,axis:h,outputDirection:s,mipInt:o,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c})))}),wn(p,1)}),of=dn(([e])=>{const t=bn(e).toVar();return t.assign(t.shiftLeft(bn(16)).bitOr(t.shiftRight(bn(16)))),t.assign(t.bitAnd(bn(1431655765)).shiftLeft(bn(1)).bitOr(t.bitAnd(bn(2863311530)).shiftRight(bn(1)))),t.assign(t.bitAnd(bn(858993459)).shiftLeft(bn(2)).bitOr(t.bitAnd(bn(3435973836)).shiftRight(bn(2)))),t.assign(t.bitAnd(bn(252645135)).shiftLeft(bn(4)).bitOr(t.bitAnd(bn(4042322160)).shiftRight(bn(4)))),t.assign(t.bitAnd(bn(16711935)).shiftLeft(bn(8)).bitOr(t.bitAnd(bn(4278255360)).shiftRight(bn(8)))),fn(t).mul(2.3283064365386963e-10)}),uf=dn(([e,t])=>Tn(fn(e).div(fn(t)),of(e))),lf=dn(([e,t,r])=>{const s=r.mul(r).toConst(),i=Sn(1,0,0).toConst(),n=Jo(t,i).toConst(),a=To(e.x).toConst(),o=Pa(2,3.14159265359).mul(e.y).toConst(),u=a.mul(Eo(o)).toConst(),l=a.mul(Ao(o)).toVar(),d=Pa(.5,t.z.add(1)).toConst();l.assign(d.oneMinus().mul(To(u.mul(u).oneMinus())).add(d.mul(l)));const c=i.mul(u).add(n.mul(l)).add(t.mul(To(jo(0,u.mul(u).add(l.mul(l)).oneMinus()))));return So(Sn(s.mul(c.x),s.mul(c.y),jo(0,c.z)))}),df=dn(({roughness:e,mipInt:t,envMap:r,N_immutable:s,GGX_SAMPLES:i,CUBEUV_TEXEL_WIDTH:n,CUBEUV_TEXEL_HEIGHT:a,CUBEUV_MAX_MIP:o})=>{const u=Sn(s).toVar(),l=Sn(0).toVar(),d=fn(0).toVar();return pn(e.lessThan(.001),()=>{l.assign(sf(r,u,t,n,a,o))}).Else(()=>{const s=Tu(Fo(u.z).lessThan(.999),Sn(0,0,1),Sn(1,0,0)),c=So(Jo(s,u)).toVar(),h=Jo(u,c).toVar();Sp({start:bn(0),end:i},({i:s})=>{const p=uf(s,i),g=lf(p,Sn(0,0,1),e),m=So(c.mul(g.x).add(h.mul(g.y)).add(u.mul(g.z))),f=So(m.mul(Zo(u,m).mul(2)).sub(u)),y=jo(Zo(u,f),0);pn(y.greaterThan(0),()=>{const e=sf(r,f,t,n,a,o);l.addAssign(e.mul(y)),d.addAssign(y)})}),pn(d.greaterThan(0),()=>{l.assign(l.div(d))})}),wn(l,1)}),cf=[.125,.215,.35,.446,.526,.582],hf=20,pf=new Se(-1,1,1,-1,0,1),gf=new Re(90,1),mf=new e;let ff=null,yf=0,bf=0;const xf=new r,Tf=new WeakMap,_f=[3,1,5,0,4,2],vf=tf(Rl(),Sl("faceIndex")).normalize(),Nf=Sn(vf.x,vf.y,vf.z);class Sf{constructor(e){this._renderer=e,this._pingPongRenderTarget=null,this._lodMax=0,this._cubeSize=0,this._sizeLods=[],this._sigmas=[],this._lodMeshes=[],this._blurMaterial=null,this._ggxMaterial=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=xf,renderTarget:o=null}=i;if(this._setSize(n),!1===this._hasInitialized){d('PMREMGenerator: ".fromScene()" called before the backend is initialized. Try using "await renderer.init()" instead.');const n=o||this._allocateTarget();return i.renderTarget=n,this.fromSceneAsync(e,t,r,s,i),n}ff=this._renderer.getRenderTarget(),yf=this._renderer.getActiveCubeFace(),bf=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 v('PMREMGenerator: ".fromSceneAsync()" is deprecated. Use "await renderer.init()" instead.'),await this._renderer.init(),this.fromScene(e,t,r,s,i)}fromEquirectangular(e,t=null){if(!1===this._hasInitialized){d('PMREMGenerator: .fromEquirectangular() called before the backend is initialized. Try using "await renderer.init()" 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 v('PMREMGenerator: ".fromEquirectangularAsync()" is deprecated. Use "await renderer.init()" instead.'),await this._renderer.init(),this._fromTexture(e,t)}fromCubemap(e,t=null){if(!1===this._hasInitialized){d("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 v('PMREMGenerator: ".fromCubemapAsync()" is deprecated. Use "await renderer.init()" instead.'),await this._renderer.init(),this._fromTexture(e,t)}async compileCubemapShader(){null===this._cubemapMaterial&&(this._cubemapMaterial=wf(),await this._compileMaterial(this._cubemapMaterial))}async compileEquirectangularShader(){null===this._equirectMaterial&&(this._equirectMaterial=Cf(),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===I||e.mapping===O?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._ggxMaterial&&this._ggxMaterial.dispose(),null!==this._pingPongRenderTarget&&this._pingPongRenderTarget.dispose();for(let e=0;ee-4?o=cf[a-e+4-1]:0===a&&(o=0),r.push(o);const u=1/(n-2),l=-u,d=1+u,c=[l,l,d,l,d,d,l,l,d,d,l,d],h=6,p=6,g=3,m=2,f=1,y=new Float32Array(g*p*h),b=new Float32Array(m*p*h),x=new Float32Array(f*p*h);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=_f[e];y.set(s,g*p*i),b.set(c,m*p*i);const n=[i,i,i,i,i,i];x.set(n,f*p*i)}const T=new Ne;T.setAttribute("position",new Ce(y,g)),T.setAttribute("uv",new Ce(b,m)),T.setAttribute("faceIndex",new Ce(x,f)),s.push(new ue(T,null)),i>4&&i--}return{lodMeshes:s,sizeLods:t,sigmas:r}}(t)),this._blurMaterial=function(e,t,s){const i=kl(new Array(hf).fill(0)),n=Na(new r(0,1,0)),a=Na(0),o=fn(hf),u=Na(0),l=Na(1),d=Pl(),c=Na(0),h=fn(1/t),p=fn(1/s),g=fn(e),m={n:o,latitudinal:u,weights:i,poleAxis:n,outputDirection:Nf,dTheta:a,samples:l,envMap:d,mipInt:c,CUBEUV_TEXEL_WIDTH:h,CUBEUV_TEXEL_HEIGHT:p,CUBEUV_MAX_MIP:g},f=Ef("blur");return f.fragmentNode=af({...m,latitudinal:u.equal(1)}),Tf.set(f,m),f}(t,e.width,e.height),this._ggxMaterial=function(e,t,r){const s=Pl(),i=Na(0),n=Na(0),a=fn(1/t),o=fn(1/r),u=fn(e),l={envMap:s,roughness:i,mipInt:n,CUBEUV_TEXEL_WIDTH:a,CUBEUV_TEXEL_HEIGHT:o,CUBEUV_MAX_MIP:u},d=Ef("ggx");return d.fragmentNode=df({...l,N_immutable:Nf,GGX_SAMPLES:bn(512)}),Tf.set(d,l),d}(t,e.width,e.height)}}async _compileMaterial(e){const t=new ue(new Ne,e);await this._renderer.compile(t,pf)}_sceneToCubeUV(e,t,r,s,i){const n=gf;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(mf),u.autoClear=!1,null===this._backgroundBox&&(this._backgroundBox=new ue(new oe,new ye({name:"PMREM.Background",side:L,depthWrite:!1,depthTest:!1})));const d=this._backgroundBox,c=d.material;let h=!1;const p=e.background;p?p.isColor&&(c.color.copy(p),e.background=null,h=!0):(c.color.copy(mf),h=!0),u.setRenderTarget(s),u.clear(),h&&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;Af(s,r*l,t>2?l:0,l,l),u.render(e,n)}u.autoClear=l,e.background=p}_textureToCubeUV(e,t){const r=this._renderer,s=e.mapping===I||e.mapping===O;s?null===this._cubemapMaterial&&(this._cubemapMaterial=wf(e)):null===this._equirectMaterial&&(this._equirectMaterial=Cf(e));const i=s?this._cubemapMaterial:this._equirectMaterial;i.fragmentNode.value=e;const n=this._lodMeshes[0];n.material=i;const a=this._cubeSize;Af(t,0,0,3*a,2*a),r.setRenderTarget(t),r.render(n,pf)}_applyPMREM(e){const t=this._renderer,r=t.autoClear;t.autoClear=!1;const s=this._lodMeshes.length;for(let t=1;tc-4?r-c+4:0),g=4*(this._cubeSize-h);e.texture.frame=(e.texture.frame||0)+1,o.envMap.value=e.texture,o.roughness.value=d,o.mipInt.value=c-t,Af(i,p,g,3*h,2*h),s.setRenderTarget(i),s.render(a,pf),i.texture.frame=(i.texture.frame||0)+1,o.envMap.value=i.texture,o.roughness.value=0,o.mipInt.value=c-r,Af(e,p,g,3*h,2*h),s.setRenderTarget(e),s.render(a,pf)}_blur(e,t,r,s,i){const n=this._pingPongRenderTarget;this._halfBlur(e,n,t,r,s,"latitudinal",i),this._halfBlur(n,e,r,r,s,"longitudinal",i)}_halfBlur(e,t,r,s,i,n,a){const u=this._renderer,l=this._blurMaterial;"latitudinal"!==n&&"longitudinal"!==n&&o("blur direction must be either latitudinal or longitudinal!");const c=this._lodMeshes[s];c.material=l;const h=Tf.get(l),p=this._sizeLods[r]-1,g=isFinite(i)?Math.PI/(2*p):2*Math.PI/39,m=i/g,f=isFinite(i)?1+Math.floor(3*m):hf;f>hf&&d(`sigmaRadians, ${i}, is too large and will clip, as it requested ${f} samples when the maximum is set to 20`);const y=[];let b=0;for(let e=0;ex-4?s-x+4:0),4*(this._cubeSize-T),3*T,2*T),u.setRenderTarget(t),u.render(c,pf)}}function Rf(e,t){const r=new ae(e,t,{magFilter:de,minFilter:de,generateMipmaps:!1,type:_e,format:Ee,colorSpace:Ae});return r.texture.mapping=we,r.texture.name="PMREM.cubeUv",r.texture.isPMREMTexture=!0,r.scissorTest=!0,r}function Af(e,t,r,s,i){e.viewport.set(t,r,s,i),e.scissor.set(t,r,s,i)}function Ef(e){const t=new mg;return t.depthTest=!1,t.depthWrite=!1,t.blending=se,t.name=`PMREM_${e}`,t}function wf(e){const t=Ef("cubemap");return t.fragmentNode=Cc(e,Nf),t}function Cf(e){const t=Ef("equirect");return t.fragmentNode=Pl(e,Sg(Nf),0),t}const Mf=new WeakMap;function Bf(e,t,r){const s=function(e){let t=Mf.get(e);void 0===t&&(t=new WeakMap,Mf.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 Ff extends pi{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 N;s.isRenderTargetTexture=!0,this._texture=Pl(s),this._width=Na(0),this._height=Na(0),this._maxMip=Na(0),this.updateBeforeType=ti.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:Bf(s,e.renderer,this._generator),null!==t&&(this._pmrem=t,this.updateFromTexture(t)))}setup(e){null===this._generator&&(this._generator=new Sf(e.renderer)),this.updateBefore(e);let t=this.uvNode;null===t&&e.context.getUV&&(t=e.context.getUV(this,e)),t=_c.mul(Sn(t.x,t.y.negate(),t.z));let r=this.levelNode;return null===r&&e.context.getTextureLevel&&(r=e.context.getTextureLevel(this)),rf(this._texture,t,r,this._width,this._height,this._maxMip)}dispose(){super.dispose(),null!==this._generator&&this._generator.dispose()}}const Lf=nn(Ff).setParameterLength(1,3),Pf=new WeakMap;class Df extends Bp{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 s=r.isTextureNode?r.value:t[r.property],i=this._getPMREMNodeCache(e.renderer);let n=i.get(s);void 0===n&&(n=Lf(s),i.set(s,n)),r=n}const s=!0===t.useAnisotropy||t.anisotropy>0?oh:lc,i=r.context(Uf($n,s)).mul(Tc),n=r.context(If(dc)).mul(Math.PI).mul(Tc),a=ul(i),o=ul(n);e.context.radiance.addAssign(a),e.context.iblIrradiance.addAssign(o);const u=e.context.lightingModel.clearcoatRadiance;if(u){const e=r.context(Uf(qn,cc)).mul(Tc),t=ul(e);u.addAssign(t)}}_getPMREMNodeCache(e){let t=Pf.get(e);return void 0===t&&(t=new WeakMap,Pf.set(e,t)),t}}const Uf=(e,t)=>{let r=null;return{getUV:()=>(null===r&&(r=Jd.negate().reflect(t),r=su(e).mix(r,t).normalize(),r=r.transformDirection(Td)),r),getTextureLevel:()=>e}},If=e=>({getUV:()=>e,getTextureLevel:()=>fn(1)}),Of=new Me;class Vf extends mg{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(Of),this.setValues(e)}setupEnvironment(e){let t=super.setupEnvironment(e);return null===t&&e.environmentNode&&(t=e.environmentNode),t?new Df(t):null}setupLightingModel(){return new Vm}setupSpecular(){const e=ou(Sn(.04),kn.rgb,Wn);ra.assign(Sn(.04)),sa.assign(e),ia.assign(1)}setupVariants(){const e=this.metalnessNode?fn(this.metalnessNode):Ch;Wn.assign(e);let t=this.roughnessNode?fn(this.roughnessNode):wh;t=jg({roughness:t}),$n.assign(t),this.setupSpecular(),Gn.assign(kn.rgb.mul(e.oneMinus()))}copy(e){return this.emissiveNode=e.emissiveNode,this.metalnessNode=e.metalnessNode,this.roughnessNode=e.roughnessNode,super.copy(e)}}const kf=new Be;class Gf extends Vf{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(kf),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?fn(this.iorNode):$h;da.assign(e),ra.assign(qo(tu(da.sub(1).div(da.add(1))).mul(Rh),Sn(1)).mul(Sh)),sa.assign(ou(ra,kn.rgb,Wn)),ia.assign(ou(Sh,1,Wn))}setupLightingModel(){return new Vm(this.useClearcoat,this.useSheen,this.useIridescence,this.useAnisotropy,this.useTransmission,this.useDispersion)}setupVariants(e){if(super.setupVariants(e),this.useClearcoat){const e=this.clearcoatNode?fn(this.clearcoatNode):Bh,t=this.clearcoatRoughnessNode?fn(this.clearcoatRoughnessNode):Fh;Hn.assign(e),qn.assign(jg({roughness:t}))}if(this.useSheen){const e=this.sheenNode?Sn(this.sheenNode):Dh,t=this.sheenRoughnessNode?fn(this.sheenRoughnessNode):Uh;jn.assign(e),Xn.assign(t)}if(this.useIridescence){const e=this.iridescenceNode?fn(this.iridescenceNode):Oh,t=this.iridescenceIORNode?fn(this.iridescenceIORNode):Vh,r=this.iridescenceThicknessNode?fn(this.iridescenceThicknessNode):kh;Kn.assign(e),Qn.assign(t),Yn.assign(r)}if(this.useAnisotropy){const e=(this.anisotropyNode?Tn(this.anisotropyNode):Ih).toVar();Jn.assign(e.length()),pn(Jn.equal(0),()=>{e.assign(Tn(1,0))}).Else(()=>{e.divAssign(Tn(Jn)),Jn.assign(Jn.saturate())}),Zn.assign(Jn.pow2().mix($n.pow2(),1)),ea.assign(nh[0].mul(e.x).add(nh[1].mul(e.y))),ta.assign(nh[1].mul(e.x).sub(nh[0].mul(e.y)))}if(this.useTransmission){const e=this.transmissionNode?fn(this.transmissionNode):Gh,t=this.thicknessNode?fn(this.thicknessNode):zh,r=this.attenuationDistanceNode?fn(this.attenuationDistanceNode):Wh,s=this.attenuationColorNode?Sn(this.attenuationColorNode):Hh;if(ca.assign(e),ha.assign(t),pa.assign(r),ga.assign(s),this.useDispersion){const e=this.dispersionNode?fn(this.dispersionNode):Zh;ma.assign(e)}}}setupClearcoatNormal(){return this.clearcoatNormalNode?Sn(this.clearcoatNormalNode):Lh}setup(e){e.context.setupClearcoatNormal=()=>Pu(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.iorNode=e.iorNode,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 zf extends Vm{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(lc.mul(a)).normalize(),h=fn(Jd.dot(c.negate()).saturate().pow(l).mul(d)),p=Sn(h.add(o).mul(n));r.directDiffuse.addAssign(p.mul(u.mul(t)))}super.direct({lightDirection:e,lightColor:t,reflectedLight:r},s)}}class $f extends Gf{static get type(){return"MeshSSSNodeMaterial"}constructor(e){super(e),this.thicknessColorNode=null,this.thicknessDistortionNode=fn(.1),this.thicknessAmbientNode=fn(0),this.thicknessAttenuationNode=fn(.1),this.thicknessPowerNode=fn(2),this.thicknessScaleNode=fn(10)}get useSSS(){return null!==this.thicknessColorNode}setupLightingModel(){return new zf(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 Wf=dn(({normal:e,lightDirection:t,builder:r})=>{const s=e.dot(t),i=Tn(s.mul(.5).add(.5),0);if(r.material.gradientMap){const e=Dc("gradientMap","texture").context({getUV:()=>i});return Sn(e.r)}{const e=i.fwidth().mul(.5);return ou(Sn(.7),Sn(1),cu(fn(.7).sub(e.x),fn(.7).add(e.x),i.x))}});class Hf extends Lg{direct({lightDirection:e,lightColor:t,reflectedLight:r},s){const i=Wf({normal:ic,lightDirection:e,builder:s}).mul(t);r.directDiffuse.addAssign(i.mul(Og({diffuseColor:kn.rgb})))}indirect(e){const{ambientOcclusion:t,irradiance:r,reflectedLight:s}=e.context;s.indirectDiffuse.addAssign(r.mul(Og({diffuseColor:kn}))),s.indirectDiffuse.mulAssign(t)}}const qf=new Fe;class jf extends mg{static get type(){return"MeshToonNodeMaterial"}constructor(e){super(),this.isMeshToonNodeMaterial=!0,this.lights=!0,this.setDefaultValues(qf),this.setValues(e)}setupLightingModel(){return new Hf}}const Xf=dn(()=>{const e=Sn(Jd.z,0,Jd.x.negate()).normalize(),t=Jd.cross(e);return Tn(e.dot(lc),t.dot(lc)).mul(.495).add(.5)}).once(["NORMAL","VERTEX"])().toVar("matcapUV"),Kf=new Le;class Qf extends mg{static get type(){return"MeshMatcapNodeMaterial"}constructor(e){super(),this.isMeshMatcapNodeMaterial=!0,this.setDefaultValues(Kf),this.setValues(e)}setupVariants(e){const t=Xf;let r;r=e.material.matcap?Dc("matcap","texture").context({getUV:()=>t}):Sn(ou(.2,.8,t.y)),kn.rgb.mulAssign(r.rgb)}}class Yf extends pi{static get type(){return"RotateNode"}constructor(e,t){super(),this.positionNode=e,this.rotationNode=t}generateNodeType(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 Fn(e,s,s.negate(),e).mul(r)}{const e=t,s=Pn(wn(1,0,0,0),wn(0,Eo(e.x),Ao(e.x).negate(),0),wn(0,Ao(e.x),Eo(e.x),0),wn(0,0,0,1)),i=Pn(wn(Eo(e.y),0,Ao(e.y),0),wn(0,1,0,0),wn(Ao(e.y).negate(),0,Eo(e.y),0),wn(0,0,0,1)),n=Pn(wn(Eo(e.z),Ao(e.z).negate(),0,0),wn(Ao(e.z),Eo(e.z),0,0),wn(0,0,1,0),wn(0,0,0,1));return s.mul(i).mul(n).mul(wn(r,1)).xyz}}}const Zf=nn(Yf).setParameterLength(2),Jf=new Pe;class ey extends mg{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(Jf),this.setValues(e)}setupPositionView(e){const{object:t,camera:r}=e,{positionNode:s,rotationNode:i,scaleNode:n,sizeAttenuation:a}=this,o=zd.mul(Sn(s||0));let u=Tn(Dd[0].xyz.length(),Dd[1].xyz.length());null!==n&&(u=u.mul(Tn(n))),r.isPerspectiveCamera&&!1===a&&(u=u.mul(o.z.negate()));let l=jd.xy;if(t.center&&!0===t.center.isVector2){const e=((e,t,r)=>new Hu(e,t,r))("center","vec2",t);l=l.sub(e.sub(.5))}l=l.mul(u);const d=fn(i||Ph),c=Zf(l,d);return wn(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 ty=new De,ry=new t;class sy extends ey{static get type(){return"PointsNodeMaterial"}constructor(e){super(),this.sizeNode=null,this.isPointsNodeMaterial=!0,this.setDefaultValues(ty),this.setValues(e)}setupPositionView(){const{positionNode:e}=this;return zd.mul(Sn(e||Xd)).xyz}setupVertexSprite(e){const{material:t,camera:r}=e,{rotationNode:s,scaleNode:i,sizeNode:n,sizeAttenuation:a}=this;let o=super.setupVertex(e);if(!0!==t.isNodeMaterial)return o;let u=null!==n?Tn(n):Yh;u=u.mul(ql),r.isPerspectiveCamera&&!0===a&&(u=u.mul(iy.div(Zd.z.negate()))),i&&i.isNode&&(u=u.mul(Tn(i)));let l=jd.xy;if(s&&s.isNode){const e=fn(s);l=Zf(l,e)}return l=l.mul(u),l=l.div(Yl.div(2)),l=l.mul(o.w),o=o.add(wn(l,0,0)),o}setupVertex(e){return e.object.isPoints?super.setupVertex(e):this.setupVertexSprite(e)}get alphaToCoverage(){return this._useAlphaToCoverage}set alphaToCoverage(e){this._useAlphaToCoverage!==e&&(this._useAlphaToCoverage=e,this.needsUpdate=!0)}}const iy=Na(1).onFrameUpdate(function({renderer:e}){const t=e.getSize(ry);this.value=.5*t.y});class ny extends Lg{constructor(){super(),this.shadowNode=fn(1).toVar("shadowMask")}direct({lightNode:e}){null!==e.shadowNode&&this.shadowNode.mulAssign(e.shadowNode)}finish({context:e}){kn.a.mulAssign(this.shadowNode.oneMinus()),e.outgoingLight.rgb.assign(kn.rgb)}}const ay=new Ue;class oy extends mg{static get type(){return"ShadowNodeMaterial"}constructor(e){super(),this.isShadowNodeMaterial=!0,this.lights=!0,this.transparent=!0,this.setDefaultValues(ay),this.setValues(e)}setupLightingModel(){return new ny}}const uy=On("vec3"),ly=On("vec3"),dy=On("vec3");class cy extends Lg{constructor(){super()}start(e){const{material:t}=e,r=On("vec3"),s=On("vec3");pn(Nd.sub(Qd).length().greaterThan(Vd.mul(2)),()=>{r.assign(Nd),s.assign(Qd)}).Else(()=>{r.assign(Qd),s.assign(Nd)});const i=s.sub(r),n=Na("int").onRenderUpdate(({material:e})=>e.steps),a=i.length().div(n).toVar(),o=i.normalize().toVar(),u=fn(0).toVar(),l=Sn(1).toVar();t.offsetNode&&u.addAssign(t.offsetNode.mul(a)),Sp(n,()=>{const s=r.add(o.mul(u)),i=Td.mul(wn(s,1)).xyz;let n;null!==t.depthNode&&(ly.assign(eg(Xp(i.z,fd,yd))),e.context.sceneDepthNode=eg(t.depthNode).toVar()),e.context.positionWorld=s,e.context.shadowPositionWorld=s,e.context.positionView=i,uy.assign(0),t.scatteringNode&&(n=t.scatteringNode({positionRay:s})),super.start(e),n&&uy.mulAssign(n);const d=uy.mul(.01).negate().mul(a).exp();l.mulAssign(d),u.addAssign(a)}),dy.addAssign(l.saturate().oneMinus())}scatteringLight(e,t){const r=t.context.sceneDepthNode;r?pn(r.greaterThanEqual(ly),()=>{uy.addAssign(e)}):uy.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(pm({P:l,p0:n,p1:a,p2:o,p3:u})).pow(1.5);this.scatteringLight(d,i)}finish(e){e.context.outgoingLight.assign(dy)}}class hy extends mg{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=L,this.depthTest=!1,this.depthWrite=!1,this.setValues(e)}setupLightingModel(){return new cy}}class py{constructor(e,t,r){this.renderer=e,this.nodes=t,this.info=r,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,this.renderer._inspector.begin(),null!==this._animationLoop&&this._animationLoop(t,r),this.renderer._inspector.finish()};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 gy{constructor(){this.weakMaps={}}_getWeakMap(e){const t=e.length;let r=this.weakMaps[t];return void 0===r&&(r=new WeakMap,this.weakMaps[t]=r),r}get(e){let t=this._getWeakMap(e);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)}getIndirectOffset(){return this._geometries.getIndirectOffset(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.id),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||Array.isArray(e.morphTargetInfluences))&&(s+=e.uuid+","),s+=this.context.id+",",s+=e.receiveShadow+",",Os(s)}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=ks(e,this.camera.cameras.length)),this.object.receiveShadow&&(e=ks(e,1)),e=ks(e,this.renderer.contextNode.id,this.renderer.contextNode.version),e}getCacheKey(){return this.getMaterialCacheKey()+this.getDynamicCacheKey()}dispose(){this.material.removeEventListener("dispose",this.onMaterialDispose),this.geometry.removeEventListener("dispose",this.onGeometryDispose),this.onDispose()}}const yy=[];class by{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);yy[0]=e,yy[1]=t,yy[2]=n,yy[3]=i;let l=u.get(yy);return void 0===l?(l=this.createRenderObject(this.nodes,this.geometries,this.renderer,e,t,r,s,i,n,a,o),u.set(yy,l)):(l.camera=s,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)),yy[0]=null,yy[1]=null,yy[2]=null,yy[3]=null,l}getChainMap(e="default"){return this.chainMaps[e]||(this.chainMaps[e]=new gy)}dispose(){this.chainMaps={}}createRenderObject(e,t,r,s,i,n,a,o,u,l,d){const c=this.getChainMap(d),h=new fy(e,t,r,s,i,n,a,o,u,l);return h.onDispose=()=>{this.pipelines.delete(h),this.bindings.deleteForRender(h),this.nodes.delete(h),c.delete(h.getChainArray())},h}}class xy{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 Ty=1,_y=2,vy=3,Ny=4,Sy=16;class Ry extends xy{constructor(e,t){super(),this.backend=e,this.info=t}delete(e){const t=super.delete(e);return null!==t&&(this.backend.destroyAttribute(e),this.info.destroyAttribute(e)),t}update(e,t){const r=this.get(e);if(void 0===r.version)t===Ty?(this.backend.createAttribute(e),this.info.createAttribute(e)):t===_y?(this.backend.createIndexAttribute(e),this.info.createIndexAttribute(e)):t===vy?(this.backend.createStorageAttribute(e),this.info.createStorageAttribute(e)):t===Ny&&(this.backend.createIndirectStorageAttribute(e),this.info.createIndirectStorageAttribute(e)),r.version=this._getBufferAttribute(e).version;else{const t=this._getBufferAttribute(e);(r.version=65535?Ie:Oe)(t,1);return i.version=Ay(e),i.__id=Ey(e),i}class Cy extends xy{constructor(e,t){super(),this.attributes=e,this.info=t,this.wireframes=new WeakMap,this.attributeCall=new WeakMap,this._geometryDisposeListeners=new Map}has(e){const t=e.geometry;return super.has(t)&&!0===this.get(t).initialized}updateForRender(e){!1===this.has(e)&&this.initGeometry(e),this.updateAttributes(e)}initGeometry(e){const t=e.geometry;this.get(t).initialized=!0,this.info.memory.geometries++;const r=()=>{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),this._geometryDisposeListeners.delete(t)};t.addEventListener("dispose",r),this._geometryDisposeListeners.set(t,r)}updateAttributes(e){const t=e.getAttributes();for(const e of t)e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute?this.updateAttribute(e,vy):this.updateAttribute(e,Ty);const r=this.getIndex(e);null!==r&&this.updateAttribute(r,_y);const s=e.geometry.indirect;null!==s&&this.updateAttribute(s,Ny)}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}getIndirectOffset(e){return e.geometry.indirectOffset}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=wy(t),e.set(t,r)):r.version===Ay(t)&&r.__id===Ey(t)||(this.attributes.delete(r),r=wy(t),e.set(t,r)),s=r}return s}dispose(){for(const[e,t]of this._geometryDisposeListeners.entries())e.removeEventListener("dispose",t);this._geometryDisposeListeners.clear()}}class My{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,attributes:0,indexAttributes:0,storageAttributes:0,indirectStorageAttributes:0,programs:0,renderTargets:0,total:0,texturesSize:0,attributesSize:0,indexAttributesSize:0,storageAttributesSize:0,indirectStorageAttributesSize:0},this.memoryMap=new Map}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):o("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;for(const e in this.memory)this.memory[e]=0;this.memoryMap.clear()}createTexture(e){const t=this._getTextureMemorySize(e);this.memoryMap.set(e,t),this.memory.textures++,this.memory.total+=t,this.memory.texturesSize+=t}destroyTexture(e){const t=this.memoryMap.get(e)||0;this.memoryMap.delete(e),this.memory.textures--,this.memory.total-=t,this.memory.texturesSize-=t}_createAttribute(e,t){const r=this._getAttributeMemorySize(e);this.memoryMap.set(e,{size:r,type:t}),this.memory[t]++,this.memory.total+=r,this.memory[t+"Size"]+=r}createAttribute(e){this._createAttribute(e,"attributes")}createIndexAttribute(e){this._createAttribute(e,"indexAttributes")}createStorageAttribute(e){this._createAttribute(e,"storageAttributes")}createIndirectStorageAttribute(e){this._createAttribute(e,"indirectStorageAttributes")}destroyAttribute(e){const t=this.memoryMap.get(e);t&&(this.memoryMap.delete(e),this.memory[t.type]--,this.memory.total-=t.size,this.memory[t.type+"Size"]-=t.size)}_getTextureMemorySize(e){if(e.isCompressedTexture)return 1;let t=1;e.type===Ve||e.type===ke?t=1:e.type===Ge||e.type===ze||e.type===_e?t=2:e.type!==R&&e.type!==S&&e.type!==Q||(t=4);let r=4;e.format===$e||e.format===We||e.format===He||e.format===qe||e.format===je?r=1:e.format===Xe&&(r=3);let s=t*r;e.type===Ke||e.type===Qe?s=2:e.type!==Ye&&e.type!==Ze&&e.type!==Je||(s=4);const i=e.width||1,n=e.height||1,a=e.isCubeTexture?6:e.depth||1;let o=i*n*a*s;const u=e.mipmaps;if(u&&u.length>0){let e=0;for(let t=0;t>t))*(r.height||Math.max(1,n>>t))*a*s}}o+=e}else e.generateMipmaps&&(o*=1.333);return Math.round(o)}_getAttributeMemorySize(e){return e.isInterleavedBufferAttribute&&(e=e.data),e.array?e.array.byteLength:e.count&&e.itemSize?e.count*e.itemSize*4:0}}class By{constructor(e){this.cacheKey=e,this.usedTimes=0}}class Fy extends By{constructor(e,t,r){super(e),this.vertexProgram=t,this.fragmentProgram=r}}class Ly extends By{constructor(e,t){super(e),this.computeProgram=t,this.isComputePipeline=!0}}let Py=0;class Dy{constructor(e,t,r,s=null,i=null){this.id=Py++,this.code=e,this.stage=t,this.name=r,this.transforms=s,this.attributes=i,this.usedTimes=0}}class Uy extends xy{constructor(e,t,r){super(),this.backend=e,this.nodes=t,this.info=r,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 Dy(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 Dy(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 Dy(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}isReady(e){const t=this.get(e).pipeline;if(void 0===t)return!1;const r=this.backend.get(t);return void 0!==r.pipeline&&null!==r.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 Ly(r,t),this.caches.set(r,i),this.backend.createComputePipeline(i,s),this.info.memory.programs++),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 Fy(s,t,r),this.caches.set(s,n),e.pipeline=n,this.backend.createRenderPipeline(e,i),this.info.memory.programs++),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),this.info.memory.programs--}_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 Iy extends xy{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))}deleteForCompute(e){const t=this.nodes.getForCompute(e).bindings;for(const e of t)this.backend.deleteBindGroupData(e),this.delete(e)}deleteForRender(e){const t=e.getBindings();for(const e of t)this.backend.deleteBindGroupData(e),this.delete(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.isSampler)this.textures.updateSampler(t.texture);else if(t.isStorageBuffer){const e=t.attribute,r=e.isIndirectStorageBufferAttribute?Ny:vy;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(!1!==this.nodes.updateGroup(t)){if(t.isStorageBuffer){const e=t.attribute,i=e.isIndirectStorageBufferAttribute?Ny:vy,n=r.get(t);this.attributes.update(e,i),n.attribute!==e&&(n.attribute=e,s=!0)}if(t.isUniformBuffer){t.update()&&r.updateBinding(t)}else if(t.isSampledTexture){const o=t.update(),u=t.texture,l=this.textures.get(u);o&&(this.textures.updateTexture(u),t.generation!==l.generation&&(t.generation=l.generation,s=!0),l.bindGroups.add(e));if(void 0!==r.get(u).externalTexture||l.isDefaultTexture?i=!1:(n=10*n+u.id,a+=u.version),!0===u.isStorageTexture&&!0===u.mipmapsAutoUpdate){const e=this.get(u);!0===t.store?e.needsMipmap=!0:this.textures.needsMipmaps(u)&&!0===e.needsMipmap&&(this.backend.generateMipmaps(u),e.needsMipmap=!1)}}else if(t.isSampler){if(t.update()){const e=this.textures.updateSampler(t.texture);t.samplerKey!==e&&(t.samplerKey=e,s=!0)}}t.isBuffer&&t.updateRanges.length>0&&t.clearUpdateRanges()}}!0===s&&this.backend.updateBindings(e,t,i?n:0,a)}}function Oy(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 Vy(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 ky(e){return(e.transmission>0||e.transmissionNode&&e.transmissionNode.isNode)&&e.side===P&&!1===e.forceSinglePass}class Gy{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||r.transmissionNode&&r.transmissionNode.isNode||r.backdropNode&&r.backdropNode.isNode?(ky(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||r.transmissionNode&&r.transmissionNode.isNode||r.backdropNode&&r.backdropNode.isNode?(ky(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||Oy),this.transparentDoublePass.length>1&&this.transparentDoublePass.sort(t||Vy),this.transparent.length>1&&this.transparent.sort(t||Vy)}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 J,l.format=e.stencilBuffer?je:qe,l.type=e.stencilBuffer?Ye:S,l.image.width=o,l.image.height=u,l.image.depth=a.depth,l.renderTarget=e,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{this._destroyRenderTarget(e)},e.addEventListener("dispose",r.onDispose))}updateTexture(e,t={}){const r=this.get(e);if(!0===r.initialized&&r.version===e.version)return;const s=e.isRenderTargetTexture||e.isDepthTexture||e.isFramebufferTexture,i=this.backend;if(s&&!0===r.initialized&&i.destroyTexture(e),e.isFramebufferTexture){const t=this.renderer.getRenderTarget();e.type=t?t.texture.type:ke}const{width:n,height:a,depth:o}=this.getSize(e);if(t.width=n,t.height=a,t.depth=o,t.needsMipmaps=this.needsMipmaps(e),t.levels=t.needsMipmaps?this.getMipLevels(e,n,a):1,e.isCubeTexture&&e.mipmaps.length>0&&t.levels++,s||!0===e.isStorageTexture||!0===e.isExternalTexture)i.createTexture(e,t),r.generation=e.version;else if(e.version>0){const s=e.image;if(void 0===s)d("Renderer: Texture marked for update but image is undefined.");else if(!1===s.complete)d("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);const n=!0===e.isStorageTexture&&!1===e.mipmapsAutoUpdate;t.needsMipmaps&&0===e.mipmaps.length&&!n&&i.generateMipmaps(e),e.onUpdate&&e.onUpdate(e)}}else i.createDefaultTexture(e),r.isDefaultTexture=!0,r.generation=e.version;!0!==r.initialized&&(r.initialized=!0,r.generation=e.version,r.bindGroups=new Set,this.info.createTexture(e),e.isVideoTexture&&!0===p.enabled&&p.getTransfer(e.colorSpace)!==g&&d("WebGPURenderer: Video textures must use a color space with a sRGB transfer function, e.g. SRGBColorSpace."),r.onDispose=()=>{this._destroyTexture(e)},e.addEventListener("dispose",r.onDispose)),r.version=e.version}updateSampler(e){return this.backend.updateSampler(e)}getSize(e,t=Xy){let r=e.images?e.images[0]:e.image;return r?(void 0!==r.image&&(r=r.image),"undefined"!=typeof HTMLVideoElement&&r instanceof HTMLVideoElement?(t.width=r.videoWidth||1,t.height=r.videoHeight||1,t.depth=1):"undefined"!=typeof VideoFrame&&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.mipmaps.length>0?e.mipmaps.length:!0===e.isCompressedTexture?1:Math.floor(Math.log2(Math.max(t,r)))+1,s}needsMipmaps(e){return!0===e.generateMipmaps||e.mipmaps.length>0}_destroyRenderTarget(e){if(!0===this.has(e)){const t=this.get(e),r=t.textures,s=t.depthTexture;e.removeEventListener("dispose",t.onDispose);for(let e=0;e=2)for(let r=0;r{if(this._currentNode=t,!t.isVarNode||!t.isIntent(e)||!0===t.isAssign(e))if("setup"===s)t.build(e);else if("analyze"===s)t.build(e,this);else if("generate"===s){const r=e.getDataFromNode(t,"any").stages,s=r&&r[e.shaderStage];if(t.isVarNode&&s&&1===s.length&&s[0]&&s[0].isStackNode)return;t.build(e,"void")}},n=[...this.nodes];for(const e of n)i(e);this._currentNode=null;const a=this.nodes.filter(e=>-1===n.indexOf(e));for(const e of a)i(e);let o;return o=this.hasOutput(e)?this.outputNode.build(e,...t):super.build(e,...t),cn(r),e.removeActiveStack(this),o}}const Jy=nn(Zy).setParameterLength(0,1);class eb extends di{static get type(){return"StructTypeNode"}constructor(e,t=null){var r;super("struct"),this.membersLayout=(r=e,Object.entries(r).map(([e,t])=>"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=1,r=0;for(const s of this.membersLayout){const i=s.type,n=qs(i),a=js(i)/e;t=Math.max(t,a);const o=r%t%a;0!==o&&(r+=a-o),r+=n}return Math.ceil(r/t)*t}getMemberType(e,t){const r=this.membersLayout.find(e=>e.name===t);return r?r.type:"void"}generateNodeType(e){return e.getStructTypeFromNode(this,this.membersLayout,this.name).name}setup(e){e.getStructTypeFromNode(this,this.membersLayout,this.name),e.addInclude(this)}generate(e){return this.getNodeType(e)}}class tb extends di{static get type(){return"StructNode"}constructor(e,t){super("vec3"),this.structTypeNode=e,this.values=t,this.isStructNode=!0}generateNodeType(e){return this.structTypeNode.getNodeType(e)}getMemberType(e,t){return this.structTypeNode.getMemberType(e,t)}_getChildren(){const e=super._getChildren(),t=e.find(e=>e.childNode===this.structTypeNode);return e.splice(e.indexOf(t),1),e.push(t),e}generate(e){const t=e.getVarFromNode(this),r=t.type,s=e.getPropertyName(t);return e.addLineFlowCode(`${s} = ${e.generateStruct(r,this.structTypeNode.membersLayout,this.values)}`,this),t.name}}class rb extends di{static get type(){return"OutputStructNode"}constructor(...e){super(),this.members=e,this.isOutputStructNode=!0}generateNodeType(){return"OutputType"}generate(e){const t=e.getDataFromNode(this);if(void 0===t.membersLayout){const r=this.members,s=[];for(let t=0;tnew db(e,"uint","float"),pb={};class gb extends io{static get type(){return"BitcountNode"}constructor(e,t){super(e,t),this.isBitcountNode=!0}_resolveElementType(e,t,r){"int"===r?t.assign(cb(e,"uint")):t.assign(e)}_returnDataNode(e){switch(e){case"uint":return bn;case"int":return yn;case"uvec2":return vn;case"uvec3":return An;case"uvec4":return Mn;case"ivec2":return _n;case"ivec3":return Rn;case"ivec4":return Cn}}_createTrailingZerosBaseLayout(e,t){const r=this._returnDataNode(t);return dn(([e])=>{const s=bn(0);this._resolveElementType(e,s,t);const i=fn(s.bitAnd(Do(s))),n=hb(i).shiftRight(23).sub(127);return r(n)}).setLayout({name:e,type:t,inputs:[{name:"value",type:t}]})}_createLeadingZerosBaseLayout(e,t){const r=this._returnDataNode(t);return dn(([e])=>{pn(e.equal(bn(0)),()=>bn(32));const s=bn(0),i=bn(0);return this._resolveElementType(e,s,t),pn(s.shiftRight(16).equal(0),()=>{i.addAssign(16),s.shiftLeftAssign(16)}),pn(s.shiftRight(24).equal(0),()=>{i.addAssign(8),s.shiftLeftAssign(8)}),pn(s.shiftRight(28).equal(0),()=>{i.addAssign(4),s.shiftLeftAssign(4)}),pn(s.shiftRight(30).equal(0),()=>{i.addAssign(2),s.shiftLeftAssign(2)}),pn(s.shiftRight(31).equal(0),()=>{i.addAssign(1)}),r(i)}).setLayout({name:e,type:t,inputs:[{name:"value",type:t}]})}_createOneBitsBaseLayout(e,t){const r=this._returnDataNode(t);return dn(([e])=>{const s=bn(0);this._resolveElementType(e,s,t),s.assign(s.sub(s.shiftRight(bn(1)).bitAnd(bn(1431655765)))),s.assign(s.bitAnd(bn(858993459)).add(s.shiftRight(bn(2)).bitAnd(bn(858993459))));const i=s.add(s.shiftRight(bn(4))).bitAnd(bn(252645135)).mul(bn(16843009)).shiftRight(bn(24));return r(i)}).setLayout({name:e,type:t,inputs:[{name:"value",type:t}]})}_createMainLayout(e,t,r,s){const i=this._returnDataNode(t);return dn(([e])=>{if(1===r)return i(s(e));{const t=i(0),n=["x","y","z","w"];for(let i=0;id(r))()}}gb.COUNT_TRAILING_ZEROS="countTrailingZeros",gb.COUNT_LEADING_ZEROS="countLeadingZeros",gb.COUNT_ONE_BITS="countOneBits";const mb=on(gb,gb.COUNT_TRAILING_ZEROS).setParameterLength(1),fb=on(gb,gb.COUNT_LEADING_ZEROS).setParameterLength(1),yb=on(gb,gb.COUNT_ONE_BITS).setParameterLength(1),bb=dn(([e])=>{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)}),xb=(e,t)=>eu(Pa(4,e.mul(La(1,e))),t);class Tb extends pi{static get type(){return"PackFloatNode"}constructor(e,t){super(),this.vectorNode=t,this.encoding=e,this.isPackFloatNode=!0}generateNodeType(){return"uint"}generate(e){const t=this.vectorNode.getNodeType(e);return`${e.getFloatPackingMethod(this.encoding)}(${this.vectorNode.build(e,t)})`}}const _b=on(Tb,"snorm").setParameterLength(1),vb=on(Tb,"unorm").setParameterLength(1),Nb=on(Tb,"float16").setParameterLength(1);class Sb extends pi{static get type(){return"UnpackFloatNode"}constructor(e,t){super(),this.uintNode=t,this.encoding=e,this.isUnpackFloatNode=!0}generateNodeType(){return"vec2"}generate(e){const t=this.uintNode.getNodeType(e);return`${e.getFloatUnpackingMethod(this.encoding)}(${this.uintNode.build(e,t)})`}}const Rb=on(Sb,"snorm").setParameterLength(1),Ab=on(Sb,"unorm").setParameterLength(1),Eb=on(Sb,"float16").setParameterLength(1),wb=dn(([e])=>e.fract().sub(.5).abs()).setLayout({name:"tri",type:"float",inputs:[{name:"x",type:"float"}]}),Cb=dn(([e])=>Sn(wb(e.z.add(wb(e.y.mul(1)))),wb(e.z.add(wb(e.x.mul(1)))),wb(e.y.add(wb(e.x.mul(1)))))).setLayout({name:"tri3",type:"vec3",inputs:[{name:"p",type:"vec3"}]}),Mb=dn(([e,t,r])=>{const s=Sn(e).toVar(),i=fn(1.4).toVar(),n=fn(0).toVar(),a=Sn(s).toVar();return Sp({start:fn(0),end:fn(3),type:"float",condition:"<="},()=>{const e=Sn(Cb(a.mul(2))).toVar();s.addAssign(e.add(r.mul(fn(.1).mul(t)))),a.mulAssign(1.8),i.mulAssign(1.5),s.mulAssign(1.2);const o=fn(wb(s.z.add(wb(s.x.add(wb(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 Bb extends di{static get type(){return"FunctionOverloadingNode"}constructor(e=[],...t){super(),this.functionNodes=e,this.parametersNodes=t,this._candidateFn=null,this.global=!0}generateNodeType(e){return this.getCandidateFn(e).shaderNode.layout.type}getCandidateFn(e){const t=this.parametersNodes;let r=this._candidateFn;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._candidateFn=r=s}return r}setup(e){return this.getCandidateFn(e)(...this.parametersNodes)}}const Fb=nn(Bb),Lb=e=>(...t)=>Fb(e,...t),Pb=Na(0).setGroup(Ta).onRenderUpdate(e=>e.time),Db=Na(0).setGroup(Ta).onRenderUpdate(e=>e.deltaTime),Ub=Na(0,"uint").setGroup(Ta).onRenderUpdate(e=>e.frameId);const Ib=dn(([e,t,r=Tn(.5)])=>Zf(e.sub(r),t).add(r)),Ob=dn(([e,t,r=Tn(.5)])=>{const s=e.sub(r),i=s.dot(s),n=i.mul(i).mul(t);return e.add(s.mul(n))}),Vb=dn(({position:e=null,horizontal:t=!0,vertical:r=!1})=>{let s;null!==e?(s=Dd.toVar(),s[3][0]=e.x,s[3][1]=e.y,s[3][2]=e.z):s=Dd;const i=Td.mul(s);return Yi(t)&&(i[0][0]=Dd[0].length(),i[0][1]=0,i[0][2]=0),Yi(r)&&(i[1][0]=0,i[1][1]=Dd[1].length(),i[1][2]=0),i[2][0]=0,i[2][1]=0,i[2][2]=1,bd.mul(i).mul(Xd)}),kb=dn(([e=null])=>{const t=eg();return eg(Wp(e)).sub(t).lessThan(0).select(jl,e)}),Gb=dn(([e,t=Rl(),r=fn(0)])=>{const s=e.x,i=e.y,n=r.mod(s.mul(i)).floor(),a=n.mod(s),o=i.sub(n.add(1).div(s).ceil()),u=e.reciprocal(),l=Tn(a,o);return t.add(l).mul(u)}),zb=dn(([e,t=null,r=null,s=fn(1),i=Xd,n=nc])=>{let a=n.abs().normalize();a=a.div(a.dot(Sn(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=Pl(d,o).mul(a.x),g=Pl(c,u).mul(a.y),m=Pl(h,l).mul(a.z);return Fa(p,g,m)}),$b=new nt,Wb=new r,Hb=new r,qb=new r,jb=new a,Xb=new r(0,0,-1),Kb=new s,Qb=new r,Yb=new r,Zb=new s,Jb=new t,ex=new ae,tx=jl.flipX();ex.depthTexture=new J(1,1);let rx=!1;class sx extends Fl{static get type(){return"ReflectorNode"}constructor(e={}){super(e.defaultTexture||ex.texture,tx),this._reflectorBaseNode=e.reflector||new ix(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=new sx({defaultTexture:ex.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.offsetNode=this.offsetNode,e._reflectorBaseNode=this._reflectorBaseNode,e}dispose(){super.dispose(),this._reflectorBaseNode.dispose()}}class ix extends di{static get type(){return"ReflectorBaseNode"}constructor(e,t={}){super();const{target:r=new at,resolutionScale:s=1,generateMipmaps:i=!1,bounces:n=!0,depth:a=!1,samples:o=0}=t;this.textureNode=e,this.target=r,this.resolutionScale=s,void 0!==t.resolution&&(v('ReflectorNode: The "resolution" parameter has been renamed to "resolutionScale".'),this.resolutionScale=t.resolution),this.generateMipmaps=i,this.bounces=n,this.depth=a,this.samples=o,this.updateBeforeType=n?ti.RENDER:ti.FRAME,this.virtualCameras=new WeakMap,this.renderTargets=new Map,this.forceUpdate=!1,this.hasOutput=!1}_updateResolution(e,t){const r=this.resolutionScale;t.getDrawingBufferSize(Jb),e.setSize(Math.round(Jb.width*r),Math.round(Jb.height*r))}setup(e){return this._updateResolution(ex,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 ae(0,0,{type:_e,samples:this.samples}),!0===this.generateMipmaps&&(t.texture.minFilter=ot,t.texture.generateMipmaps=!0),!0===this.depth&&(t.depthTexture=new J),this.renderTargets.set(e,t)),t}updateBefore(e){if(!1===this.bounces&&rx)return!1;rx=!0;const{scene:t,camera:r,renderer:s,material:i}=e,{target:n}=this,a=this.getVirtualCamera(r),o=this.getRenderTarget(a);s.getDrawingBufferSize(Jb),this._updateResolution(o,s),Hb.setFromMatrixPosition(n.matrixWorld),qb.setFromMatrixPosition(r.matrixWorld),jb.extractRotation(n.matrixWorld),Wb.set(0,0,1),Wb.applyMatrix4(jb),Qb.subVectors(Hb,qb);let u=!1;if(!0===Qb.dot(Wb)>0&&!1===this.forceUpdate){if(!1===this.hasOutput)return void(rx=!1);u=!0}Qb.reflect(Wb).negate(),Qb.add(Hb),jb.extractRotation(r.matrixWorld),Xb.set(0,0,-1),Xb.applyMatrix4(jb),Xb.add(qb),Yb.subVectors(Hb,Xb),Yb.reflect(Wb).negate(),Yb.add(Hb),a.coordinateSystem=r.coordinateSystem,a.position.copy(Qb),a.up.set(0,1,0),a.up.applyMatrix4(jb),a.up.reflect(Wb),a.lookAt(Yb),a.near=r.near,a.far=r.far,a.updateMatrixWorld(),a.projectionMatrix.copy(r.projectionMatrix),$b.setFromNormalAndCoplanarPoint(Wb,Hb),$b.applyMatrix4(a.matrixWorldInverse),Kb.set($b.normal.x,$b.normal.y,$b.normal.z,$b.constant);const l=a.projectionMatrix;Zb.x=(Math.sign(Kb.x)+l.elements[8])/l.elements[0],Zb.y=(Math.sign(Kb.y)+l.elements[9])/l.elements[5],Zb.z=-1,Zb.w=(1+l.elements[10])/l.elements[14],Kb.multiplyScalar(1/Kb.dot(Zb));l.elements[2]=Kb.x,l.elements[6]=Kb.y,l.elements[10]=s.coordinateSystem===h?Kb.z-0:Kb.z+1-0,l.elements[14]=Kb.w,this.textureNode.value=o.texture,!0===this.depth&&(this.textureNode.getDepthNode().value=o.depthTexture),i.visible=!1;const d=s.getRenderTarget(),c=s.getMRT(),p=s.autoClear;s.setMRT(null),s.setRenderTarget(o),s.autoClear=!0;const g=t.name;t.name=(t.name||"Scene")+" [ Reflector ]",u?(s.clear(),this.hasOutput=!1):(s.render(t,a),this.hasOutput=!0),t.name=g,s.setMRT(c),s.setRenderTarget(d),s.autoClear=p,i.visible=!0,rx=!1,this.forceUpdate=!1}get resolution(){return v('ReflectorNode: The "resolution" property has been renamed to "resolutionScale".'),this.resolutionScale}set resolution(e){v('ReflectorNode: The "resolution" property has been renamed to "resolutionScale".'),this.resolutionScale=e}}const nx=new Se(-1,1,1,-1,0,1);class ax extends Ne{constructor(e=!1){super();const t=!1===e?[0,-1,0,1,2,1]:[0,2,0,0,2,0];this.setAttribute("position",new ut([-1,3,0,-1,-1,0,3,-1,0],3)),this.setAttribute("uv",new ut(t,2))}}const ox=new ax;class ux extends ue{constructor(e=null){super(ox,e),this.camera=nx,this.isQuadMesh=!0}async renderAsync(e){v('QuadMesh: "renderAsync()" has been deprecated. Use "render()" and "await renderer.init();" when creating the renderer.'),await e.init(),e.render(this,nx)}render(e){e.render(this,nx)}}const lx=new t;class dx extends Fl{static get type(){return"RTTNode"}constructor(e,t=null,r=null,s={type:_e}){const i=new ae(t,r,s);super(i.texture,Rl()),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 ux(new mg),this.updateBeforeType=ti.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(lx),s=Math.floor(r.width*t),i=Math.floor(r.height*t);s===this.renderTarget.width&&i===this.renderTarget.height||(this.renderTarget.setSize(s,i),this.textureNeedsUpdate=!0)}let t="RTT";this.node.name&&(t=this.node.name+" [ "+t+" ]"),this._quadMesh.material.fragmentNode=this._rttNode,this._quadMesh.name=t;const r=e.getRenderTarget();e.setRenderTarget(this.renderTarget),this._quadMesh.render(e),e.setRenderTarget(r)}clone(){const e=new Fl(this.value,this.uvNode,this.levelNode);return e.sampler=this.sampler,e.referenceNode=this,e}}const cx=(e,...t)=>new dx(en(e),...t),hx=dn(([e,t,r],s)=>{let i;s.renderer.coordinateSystem===h?(e=Tn(e.x,e.y.oneMinus()).mul(2).sub(1),i=wn(Sn(e,t),1)):i=wn(Sn(e.x,e.y.oneMinus(),t).mul(2).sub(1),1);const n=wn(r.mul(i));return n.xyz.div(n.w)}),px=dn(([e,t])=>{const r=t.mul(wn(e,1)),s=r.xy.div(r.w).mul(.5).add(.5).toVar();return Tn(s.x,s.y.oneMinus())}),gx=dn(([e,t,r])=>{const s=El(Dl(t)),i=_n(e.mul(s)).toVar(),n=Dl(t,i).toVar(),a=Dl(t,i.sub(_n(2,0))).toVar(),o=Dl(t,i.sub(_n(1,0))).toVar(),u=Dl(t,i.add(_n(1,0))).toVar(),l=Dl(t,i.add(_n(2,0))).toVar(),d=Dl(t,i.add(_n(0,2))).toVar(),c=Dl(t,i.add(_n(0,1))).toVar(),h=Dl(t,i.sub(_n(0,1))).toVar(),p=Dl(t,i.sub(_n(0,2))).toVar(),g=Fo(La(fn(2).mul(o).sub(a),n)).toVar(),m=Fo(La(fn(2).mul(u).sub(l),n)).toVar(),f=Fo(La(fn(2).mul(c).sub(d),n)).toVar(),y=Fo(La(fn(2).mul(h).sub(p),n)).toVar(),b=hx(e,n,r).toVar(),x=g.lessThan(m).select(b.sub(hx(e.sub(Tn(fn(1).div(s.x),0)),o,r)),b.negate().add(hx(e.add(Tn(fn(1).div(s.x),0)),u,r))),T=f.lessThan(y).select(b.sub(hx(e.add(Tn(0,fn(1).div(s.y))),c,r)),b.negate().add(hx(e.sub(Tn(0,fn(1).div(s.y))),h,r)));return So(Jo(x,T))}),mx=dn(([e])=>Ro(fn(52.9829189).mul(Ro(Zo(e,Tn(.06711056,.00583715)))))).setLayout({name:"interleavedGradientNoise",type:"float",inputs:[{name:"position",type:"vec2"}]}),fx=dn(([e,t,r])=>{const s=fn(2.399963229728653),i=To(fn(e).add(.5).div(fn(t))),n=fn(e).mul(s).add(r);return Tn(Eo(n),Ao(n)).mul(i)}).setLayout({name:"vogelDiskSample",type:"vec2",inputs:[{name:"sampleIndex",type:"int"},{name:"samplesCount",type:"int"},{name:"phi",type:"float"}]});class yx extends di{static get type(){return"SampleNode"}constructor(e,t=null){super(),this.callback=e,this.uvNode=t,this.isSampleNode=!0}setup(){return this.sample(Rl())}sample(e){return this.callback(e)}}class bx extends di{static get type(){return"EventNode"}constructor(e,t){super("void"),this.eventType=e,this.callback=t,e===bx.OBJECT?this.updateType=ti.OBJECT:e===bx.MATERIAL?this.updateType=ti.RENDER:e===bx.BEFORE_OBJECT?this.updateBeforeType=ti.OBJECT:e===bx.BEFORE_MATERIAL&&(this.updateBeforeType=ti.RENDER)}update(e){this.callback(e)}updateBefore(e){this.callback(e)}}bx.OBJECT="object",bx.MATERIAL="material",bx.BEFORE_OBJECT="beforeObject",bx.BEFORE_MATERIAL="beforeMaterial";const xx=(e,t)=>new bx(e,t).toStack();class Tx extends j{constructor(e,t,r=Float32Array){super(ArrayBuffer.isView(e)?e:new r(e*t),t),this.isStorageInstancedBufferAttribute=!0}}class _x extends Ce{constructor(e,t,r=Float32Array){super(ArrayBuffer.isView(e)?e:new r(e*t),t),this.isStorageBufferAttribute=!0}}class vx extends di{static get type(){return"PointUVNode"}constructor(){super("vec2"),this.isPointUVNode=!0}generate(){return"vec2( gl_PointCoord.x, 1.0 - gl_PointCoord.y )"}}const Nx=an(vx),Sx=new D,Rx=new a,Ax=Na(0).setGroup(Ta).onRenderUpdate(({scene:e})=>e.backgroundBlurriness),Ex=Na(1).setGroup(Ta).onRenderUpdate(({scene:e})=>e.backgroundIntensity),wx=Na(new a).setGroup(Ta).onRenderUpdate(({scene:e})=>{const t=e.background;return null!==t&&t.isTexture&&t.mapping!==lt?(Sx.copy(e.backgroundRotation),Sx.x*=-1,Sx.y*=-1,Sx.z*=-1,Rx.makeRotationFromEuler(Sx)):Rx.identity(),Rx});class Cx extends Fl{static get type(){return"StorageTextureNode"}constructor(e,t,r=null){super(e,t),this.storeNode=r,this.mipLevel=0,this.isStorageTextureNode=!0,this.access=si.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}setMipLevel(e){return this.mipLevel=e,this}generate(e,t){let r;return r=null!==this.storeNode?this.generateStore(e):super.generate(e,t),r}generateSnippet(e,t,r,s,i,n,a,o,u){const l=this.value;return e.generateStorageTextureLoad(l,t,r,s,n,u)}toReadWrite(){return this.setAccess(si.READ_WRITE)}toReadOnly(){return this.setAccess(si.READ_ONLY)}toWriteOnly(){return this.setAccess(si.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.mipLevel=this.mipLevel,e.access=this.access,e}}const Mx=nn(Cx).setParameterLength(1,3),Bx=dn(({texture:e,uv:t})=>{const r=1e-4,s=Sn().toVar();return pn(t.x.lessThan(r),()=>{s.assign(Sn(1,0,0))}).ElseIf(t.y.lessThan(r),()=>{s.assign(Sn(0,1,0))}).ElseIf(t.z.lessThan(r),()=>{s.assign(Sn(0,0,1))}).ElseIf(t.x.greaterThan(.9999),()=>{s.assign(Sn(-1,0,0))}).ElseIf(t.y.greaterThan(.9999),()=>{s.assign(Sn(0,-1,0))}).ElseIf(t.z.greaterThan(.9999),()=>{s.assign(Sn(0,0,-1))}).Else(()=>{const r=.01,i=e.sample(t.add(Sn(-.01,0,0))).r.sub(e.sample(t.add(Sn(r,0,0))).r),n=e.sample(t.add(Sn(0,-.01,0))).r.sub(e.sample(t.add(Sn(0,r,0))).r),a=e.sample(t.add(Sn(0,0,-.01))).r.sub(e.sample(t.add(Sn(0,0,r))).r);s.assign(Sn(i,n,a))}),s.normalize()});class Fx extends Fl{static get type(){return"Texture3DNode"}constructor(e,t=null,r=null){super(e,t,r),this.isTexture3DNode=!0}getInputType(){return"texture3D"}getDefaultUV(){return Sn(.5,.5,.5)}setUpdateMatrix(){}generateUV(e,t){return t.build(e,!0===this.sampler?"vec3":"ivec3")}generateOffset(e,t){return t.build(e,"ivec3")}normal(e){return Bx({texture:this,uv:e})}}const Lx=nn(Fx).setParameterLength(1,3);class Px extends Bc{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 Dx=new WeakMap;class Ux extends pi{static get type(){return"VelocityNode"}constructor(){super("vec2"),this.projectionMatrix=null,this.updateType=ti.OBJECT,this.updateAfterType=ti.OBJECT,this.previousModelWorldMatrix=Na(new a),this.previousProjectionMatrix=Na(new a).setGroup(Ta),this.previousCameraViewMatrix=Na(new a)}setProjectionMatrix(e){this.projectionMatrix=e}update({frameId:e,camera:t,object:r}){const s=Ox(r);this.previousModelWorldMatrix.value.copy(s);const i=Ix(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}){Ox(e).copy(e.matrixWorld)}setup(){const e=null===this.projectionMatrix?bd:Na(this.projectionMatrix),t=this.previousCameraViewMatrix.mul(this.previousModelWorldMatrix),r=e.mul(zd).mul(Xd),s=this.previousProjectionMatrix.mul(t).mul(Kd),i=r.xy.div(r.w),n=s.xy.div(s.w);return La(i,n)}}function Ix(e){let t=Dx.get(e);return void 0===t&&(t={},Dx.set(e,t)),t}function Ox(e,t=0){const r=Ix(e);let s=r[t];return void 0===s&&(r[t]=s=new a,r[t].copy(e.matrixWorld)),s}const Vx=an(Ux),kx=dn(([e])=>Wx(e.rgb)),Gx=dn(([e,t=fn(1)])=>t.mix(Wx(e.rgb),e.rgb)),zx=dn(([e,t=fn(1)])=>{const r=Fa(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 ou(e.rgb,s,i)}),$x=dn(([e,t=fn(1)])=>{const r=Sn(.57735,.57735,.57735),s=t.cos();return Sn(e.rgb.mul(s).add(r.cross(e.rgb).mul(t.sin()).add(r.mul(Zo(r,e.rgb).mul(s.oneMinus())))))}),Wx=(e,t=Sn(p.getLuminanceCoefficients(new r)))=>Zo(e,t),Hx=dn(([e,t=Sn(1),s=Sn(0),i=Sn(1),n=fn(1),a=Sn(p.getLuminanceCoefficients(new r,Ae))])=>{const o=e.rgb.dot(Sn(a)),u=jo(e.rgb.mul(t).add(s),0).toVar(),l=u.pow(i).toVar();return pn(u.r.greaterThan(0),()=>{u.r.assign(l.r)}),pn(u.g.greaterThan(0),()=>{u.g.assign(l.g)}),pn(u.b.greaterThan(0),()=>{u.b.assign(l.b)}),u.assign(o.add(u.sub(o).mul(n))),wn(u.rgb,e.a)}),qx=dn(([e,t])=>e.mul(t).floor().div(t));let jx=null;class Xx extends Ip{static get type(){return"ViewportSharedTextureNode"}constructor(e=jl,t=null){null===jx&&(jx=new Y),super(e,t,jx)}getTextureForReference(){return jx}updateReference(){return this}}const Kx=nn(Xx).setParameterLength(0,2),Qx=new t;class Yx extends Fl{static get type(){return"PassTextureNode"}constructor(e,t){super(t),this.passNode=e,this.isPassTextureNode=!0,this.setUpdateMatrix(!1)}setup(e){return e.getNodeProperties(this).passNode=this.passNode,super.setup(e)}clone(){return new this.constructor(this.passNode,this.value)}}class Zx extends Yx{static get type(){return"PassMultipleTextureNode"}constructor(e,t,r=!1){super(e,null),this.textureName=t,this.previousTexture=r,this.isPassMultipleTextureNode=!0}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.offsetNode=this.offsetNode,e}}class Jx extends pi{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 J;i.isRenderTargetTexture=!0,i.name="depth";const n=new ae(this._width*this._pixelRatio,this._height*this._pixelRatio,{type:_e,...s});n.texture.name="output",n.depthTexture=i,this.renderTarget=n,this.overrideMaterial=null,this.transparent=!0,this.opaque=!0,this.contextNode=null,this._contextNodeCache=null,this._textures={output:n.texture,depth:i},this._textureNodes={},this._linearDepthNodes={},this._viewZNodes={},this._previousTextures={},this._previousTextureNodes={},this._cameraNear=Na(0),this._cameraFar=Na(0),this._mrt=null,this._layers=null,this._resolutionScale=1,this._viewport=null,this._scissor=null,this.isPassNode=!0,this.updateBeforeType=ti.FRAME,this.global=!0}setResolutionScale(e){return this._resolutionScale=e,this}getResolutionScale(){return this._resolutionScale}setResolution(e){return d("PassNode: .setResolution() is deprecated. Use .setResolutionScale() instead."),this.setResolutionScale(e)}getResolution(){return d("PassNode: .getResolution() is deprecated. Use .getResolutionScale() instead."),this.getResolutionScale()}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=new Zx(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=new Zx(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=Qp(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=qp(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.getOutputBufferType(),this.scope===Jx.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),Qx.set(n.width,n.height)):(s=this.camera,i=t.getPixelRatio(),t.getSize(Qx)),this._pixelRatio=i,this.setSize(Qx.width,Qx.height);const a=t.getRenderTarget(),o=t.getMRT(),u=t.autoClear,l=t.transparent,d=t.opaque,c=s.layers.mask,h=t.contextNode,p=r.overrideMaterial;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);null!==this.overrideMaterial&&(r.overrideMaterial=this.overrideMaterial),t.setRenderTarget(this.renderTarget),t.setMRT(this._mrt),t.autoClear=!0,t.transparent=this.transparent,t.opaque=this.opaque,null!==this.contextNode&&(null!==this._contextNodeCache&&this._contextNodeCache.version===this.version||(this._contextNodeCache={version:this.version,context:vu({...t.contextNode.getFlowContextData(),...this.contextNode.getFlowContextData()})}),t.contextNode=this._contextNodeCache.context);const g=r.name;r.name=this.name?this.name:r.name,t.render(r,s),r.name=g,r.overrideMaterial=p,t.setRenderTarget(a),t.setMRT(o),t.autoClear=u,t.transparent=l,t.opaque=d,t.contextNode=h,s.layers.mask=c}setSize(e,t){this._width=e,this._height=t;const r=Math.floor(this._width*this._pixelRatio*this._resolutionScale),s=Math.floor(this._height*this._pixelRatio*this._resolutionScale);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._resolutionScale).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._resolutionScale).floor())}setPixelRatio(e){this._pixelRatio=e,this.setSize(this._width,this._height)}dispose(){this.renderTarget.dispose()}}Jx.COLOR="color",Jx.DEPTH="depth";class eT extends Jx{static get type(){return"ToonOutlinePassNode"}constructor(e,t,r,s,i){super(Jx.COLOR,e,t),this.colorNode=r,this.thicknessNode=s,this.alphaNode=i,this._materialCache=new WeakMap,this.name="Outline Pass"}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 mg;e.isMeshToonOutlineMaterial=!0,e.name="Toon_Outline",e.side=L;const t=nc.negate(),r=bd.mul(zd),s=fn(1),i=r.mul(wn(Xd,1)),n=r.mul(wn(Xd.add(t),1)),a=So(i.sub(n));return e.vertexNode=i.add(a.mul(this.thicknessNode).mul(i.w).mul(s)),e.colorNode=wn(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 tT=dn(([e,t])=>e.mul(t).clamp()).setLayout({name:"linearToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),rT=dn(([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"}]}),sT=dn(([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"}]}),iT=dn(([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)}),nT=dn(([e,t])=>{const r=Ln(.59719,.35458,.04823,.076,.90834,.01566,.0284,.13383,.83777),s=Ln(1.60475,-.53108,-.07367,-.10208,1.10813,-.00605,-.00327,-.07276,1.07602);return e=e.mul(t).div(.6),e=r.mul(e),e=iT(e),(e=s.mul(e)).clamp()}).setLayout({name:"acesFilmicToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),aT=Ln(Sn(1.6605,-.1246,-.0182),Sn(-.5876,1.1329,-.1006),Sn(-.0728,-.0083,1.1187)),oT=Ln(Sn(.6274,.0691,.0164),Sn(.3293,.9195,.088),Sn(.0433,.0113,.8956)),uT=dn(([e])=>{const t=Sn(e).toVar(),r=Sn(t.mul(t)).toVar(),s=Sn(r.mul(r)).toVar();return fn(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))))}),lT=dn(([e,t])=>{const r=Sn(e).toVar(),s=Ln(Sn(.856627153315983,.137318972929847,.11189821299995),Sn(.0951212405381588,.761241990602591,.0767994186031903),Sn(.0482516061458583,.101439036467562,.811302368396859)),i=Ln(Sn(1.1271005818144368,-.1413297634984383,-.14132976349843826),Sn(-.11060664309660323,1.157823702216272,-.11060664309660294),Sn(-.016493938717834573,-.016493938717834257,1.2519364065950405)),n=fn(-12.47393),a=fn(4.026069);return r.mulAssign(t),r.assign(oT.mul(r)),r.assign(s.mul(r)),r.assign(jo(r,1e-10)),r.assign(xo(r)),r.assign(r.sub(n).div(a.sub(n))),r.assign(uu(r,0,1)),r.assign(uT(r)),r.assign(i.mul(r)),r.assign(eu(jo(Sn(0),r),Sn(2.2))),r.assign(aT.mul(r)),r.assign(uu(r,0,1)),r}).setLayout({name:"agxToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),dT=dn(([e,t])=>{const r=fn(.76),s=fn(.15);e=e.mul(t);const i=qo(e.r,qo(e.g,e.b)),n=Tu(i.lessThan(.08),i.sub(Pa(6.25,i.mul(i))),.04);e.subAssign(n);const a=jo(e.r,jo(e.g,e.b));pn(a.lessThan(r),()=>e);const o=La(1,r),u=La(1,o.mul(o).div(a.add(o.sub(r))));e.mulAssign(u.div(a));const l=La(1,Da(1,s.mul(a.sub(u)).add(1)));return ou(e,Sn(u),l)}).setLayout({name:"neutralToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]});class cT extends di{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 hT=nn(cT).setParameterLength(1,3);class pT extends cT{static get type(){return"FunctionNode"}constructor(e="",t=[],r=""){super(e,t,r)}generateNodeType(e){return this.getNodeFunction(e).type}getMemberType(e,t){const r=this.getNodeType(e);return e.getStructTypeNode(r).getMemberType(e,t)}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 gT=(e,t=[],r="")=>{for(let e=0;es.call(...e);return i.functionNode=s,i};function mT(e){let t;const r=e.context.getViewZ;return void 0!==r&&(t=r(this)),(t||Zd.z).negate()}const fT=dn(([e,t],r)=>{const s=mT(r);return cu(e,t,s)}),yT=dn(([e],t)=>{const r=mT(t);return e.mul(e,r,r).negate().exp().oneMinus()}),bT=dn(([e,t],r)=>{const s=mT(r),i=t.sub(Qd.y).max(0).toConst().mul(s).toConst();return e.mul(e,i,i).negate().exp().oneMinus()}),xT=dn(([e,t])=>wn(t.toFloat().mix(aa.rgb,e.toVec3()),aa.a));let TT=null,_T=null;class vT extends di{static get type(){return"RangeNode"}constructor(e=fn(),t=fn()){super(),this.minNode=e,this.maxNode=t}getVectorLength(e){const t=this.getConstNode(this.minNode),r=this.getConstNode(this.maxNode),s=e.getTypeLength(Xs(t.value)),i=e.getTypeLength(Xs(r.value));return s>i?s:i}generateNodeType(e){return e.object.count>1?e.getTypeFromLength(this.getVectorLength(e)):"float"}getConstNode(e){let t=null;if(e.traverse(e=>{!0===e.isConstNode&&(t=e)}),null===t)throw new Ml('THREE.TSL: No "ConstNode" found in node graph.',this.stackTrace);return t}setup(e){const t=e.object;let r=null;if(t.count>1){const i=this.getConstNode(this.minNode),n=this.getConstNode(this.maxNode),a=i.value,o=n.value,u=e.getTypeLength(Xs(a)),d=e.getTypeLength(Xs(o));TT=TT||new s,_T=_T||new s,TT.setScalar(0),_T.setScalar(0),1===u?TT.setScalar(a):a.isColor?TT.set(a.r,a.g,a.b,1):TT.set(a.x,a.y,a.z||0,a.w||0),1===d?_T.setScalar(o):o.isColor?_T.set(o.r,o.g,o.b,1):_T.set(o.x,o.y,o.z||0,o.w||0);const c=4,h=c*t.count,p=new Float32Array(h);for(let e=0;enew ST(e,t),AT=RT("numWorkgroups","uvec3"),ET=RT("workgroupId","uvec3"),wT=RT("globalId","uvec3"),CT=RT("localId","uvec3"),MT=RT("subgroupSize","uint");class BT extends di{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)}}const FT=nn(BT);class LT extends ci{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 PT extends di{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 d('TSL: "label()" has been deprecated. Use "setName()" instead.',new Us),this.setName(e)}setScope(e){return this.scope=e,this}getElementType(){return this.elementType}getInputType(){return`${this.scope}Array`}element(e){return new LT(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 DT extends di{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)}generateNodeType(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=gl(l,i).toConst()),t.constNode.build(e);e.addLineFlowCode(l,this)}}DT.ATOMIC_LOAD="atomicLoad",DT.ATOMIC_STORE="atomicStore",DT.ATOMIC_ADD="atomicAdd",DT.ATOMIC_SUB="atomicSub",DT.ATOMIC_MAX="atomicMax",DT.ATOMIC_MIN="atomicMin",DT.ATOMIC_AND="atomicAnd",DT.ATOMIC_OR="atomicOr",DT.ATOMIC_XOR="atomicXor";const UT=nn(DT),IT=(e,t,r)=>UT(e,t,r).toStack();class OT extends pi{static get type(){return"SubgroupFunctionNode"}constructor(e,t=null,r=null){super(),this.method=e,this.aNode=t,this.bNode=r}getInputType(e){const t=this.aNode?this.aNode.getNodeType(e):null,r=this.bNode?this.bNode.getNodeType(e):null;return(e.isMatrix(t)?0:e.getTypeLength(t))>(e.isMatrix(r)?0:e.getTypeLength(r))?t:r}generateNodeType(e){const t=this.method;return t===OT.SUBGROUP_ELECT?"bool":t===OT.SUBGROUP_BALLOT?"uvec4":this.getInputType(e)}generate(e,t){const r=this.method,s=this.getNodeType(e),i=this.getInputType(e),n=this.aNode,a=this.bNode,o=[];if(r===OT.SUBGROUP_BROADCAST||r===OT.SUBGROUP_SHUFFLE||r===OT.QUAD_BROADCAST){const t=a.getNodeType(e);o.push(n.build(e,s),a.build(e,"float"===t?"int":s))}else r===OT.SUBGROUP_SHUFFLE_XOR||r===OT.SUBGROUP_SHUFFLE_DOWN||r===OT.SUBGROUP_SHUFFLE_UP?o.push(n.build(e,s),a.build(e,"uint")):(null!==n&&o.push(n.build(e,i)),null!==a&&o.push(a.build(e,i)));const u=0===o.length?"()":`( ${o.join(", ")} )`;return e.format(`${e.getMethod(r,s)}${u}`,s,t)}serialize(e){super.serialize(e),e.method=this.method}deserialize(e){super.deserialize(e),this.method=e.method}}OT.SUBGROUP_ELECT="subgroupElect",OT.SUBGROUP_BALLOT="subgroupBallot",OT.SUBGROUP_ADD="subgroupAdd",OT.SUBGROUP_INCLUSIVE_ADD="subgroupInclusiveAdd",OT.SUBGROUP_EXCLUSIVE_AND="subgroupExclusiveAdd",OT.SUBGROUP_MUL="subgroupMul",OT.SUBGROUP_INCLUSIVE_MUL="subgroupInclusiveMul",OT.SUBGROUP_EXCLUSIVE_MUL="subgroupExclusiveMul",OT.SUBGROUP_AND="subgroupAnd",OT.SUBGROUP_OR="subgroupOr",OT.SUBGROUP_XOR="subgroupXor",OT.SUBGROUP_MIN="subgroupMin",OT.SUBGROUP_MAX="subgroupMax",OT.SUBGROUP_ALL="subgroupAll",OT.SUBGROUP_ANY="subgroupAny",OT.SUBGROUP_BROADCAST_FIRST="subgroupBroadcastFirst",OT.QUAD_SWAP_X="quadSwapX",OT.QUAD_SWAP_Y="quadSwapY",OT.QUAD_SWAP_DIAGONAL="quadSwapDiagonal",OT.SUBGROUP_BROADCAST="subgroupBroadcast",OT.SUBGROUP_SHUFFLE="subgroupShuffle",OT.SUBGROUP_SHUFFLE_XOR="subgroupShuffleXor",OT.SUBGROUP_SHUFFLE_UP="subgroupShuffleUp",OT.SUBGROUP_SHUFFLE_DOWN="subgroupShuffleDown",OT.QUAD_BROADCAST="quadBroadcast";const VT=on(OT,OT.SUBGROUP_ELECT).setParameterLength(0),kT=on(OT,OT.SUBGROUP_BALLOT).setParameterLength(1),GT=on(OT,OT.SUBGROUP_ADD).setParameterLength(1),zT=on(OT,OT.SUBGROUP_INCLUSIVE_ADD).setParameterLength(1),$T=on(OT,OT.SUBGROUP_EXCLUSIVE_AND).setParameterLength(1),WT=on(OT,OT.SUBGROUP_MUL).setParameterLength(1),HT=on(OT,OT.SUBGROUP_INCLUSIVE_MUL).setParameterLength(1),qT=on(OT,OT.SUBGROUP_EXCLUSIVE_MUL).setParameterLength(1),jT=on(OT,OT.SUBGROUP_AND).setParameterLength(1),XT=on(OT,OT.SUBGROUP_OR).setParameterLength(1),KT=on(OT,OT.SUBGROUP_XOR).setParameterLength(1),QT=on(OT,OT.SUBGROUP_MIN).setParameterLength(1),YT=on(OT,OT.SUBGROUP_MAX).setParameterLength(1),ZT=on(OT,OT.SUBGROUP_ALL).setParameterLength(0),JT=on(OT,OT.SUBGROUP_ANY).setParameterLength(0),e_=on(OT,OT.SUBGROUP_BROADCAST_FIRST).setParameterLength(2),t_=on(OT,OT.QUAD_SWAP_X).setParameterLength(1),r_=on(OT,OT.QUAD_SWAP_Y).setParameterLength(1),s_=on(OT,OT.QUAD_SWAP_DIAGONAL).setParameterLength(1),i_=on(OT,OT.SUBGROUP_BROADCAST).setParameterLength(2),n_=on(OT,OT.SUBGROUP_SHUFFLE).setParameterLength(2),a_=on(OT,OT.SUBGROUP_SHUFFLE_XOR).setParameterLength(2),o_=on(OT,OT.SUBGROUP_SHUFFLE_UP).setParameterLength(2),u_=on(OT,OT.SUBGROUP_SHUFFLE_DOWN).setParameterLength(2),l_=on(OT,OT.QUAD_BROADCAST).setParameterLength(1);let d_;function c_(e){d_=d_||new WeakMap;let t=d_.get(e);return void 0===t&&d_.set(e,t={}),t}function h_(e){const t=c_(e);return t.shadowMatrix||(t.shadowMatrix=Na("mat4").setGroup(Ta).onRenderUpdate(t=>(!0===e.castShadow&&!1!==t.renderer.shadowMap.enabled||(e.shadow.camera.coordinateSystem!==t.camera.coordinateSystem&&(e.shadow.camera.coordinateSystem=t.camera.coordinateSystem,e.shadow.camera.updateProjectionMatrix()),e.shadow.updateMatrices(e)),e.shadow.matrix)))}function p_(e,t=Qd){const r=h_(e).mul(t);return r.xyz.div(r.w)}function g_(e){const t=c_(e);return t.position||(t.position=Na(new r).setGroup(Ta).onRenderUpdate((t,r)=>r.value.setFromMatrixPosition(e.matrixWorld)))}function m_(e){const t=c_(e);return t.targetPosition||(t.targetPosition=Na(new r).setGroup(Ta).onRenderUpdate((t,r)=>r.value.setFromMatrixPosition(e.target.matrixWorld)))}function f_(e){const t=c_(e);return t.viewPosition||(t.viewPosition=Na(new r).setGroup(Ta).onRenderUpdate(({camera:t},s)=>{s.value=s.value||new r,s.value.setFromMatrixPosition(e.matrixWorld),s.value.applyMatrix4(t.matrixWorldInverse)}))}const y_=e=>Td.transformDirection(g_(e).sub(m_(e))),b_=(e,t)=>{for(const r of t)if(r.isAnalyticLightNode&&r.light.id===e)return r;return null},x_=new WeakMap,T_=[];class __ extends di{static get type(){return"LightsNode"}constructor(){super("vec3"),this.totalDiffuseNode=On("vec3","totalDiffuse"),this.totalSpecularNode=On("vec3","totalSpecular"),this.outgoingLightNode=On("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(en(e));else{let s=null;if(null!==r&&(s=b_(e.id,r)),null===s){const r=i.getLightNodeClass(e.constructor);if(null===r){d(`LightsNode.setupNodeLights: Light node not found for ${e.constructor.name}`);continue}let s=null;x_.has(e)?s=x_.get(e):(s=new r(e),x_.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=Sn(null!==l?l.mix(g,u):u)),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 v_ extends di{static get type(){return"ShadowBaseNode"}constructor(e){super(),this.light=e,this.updateBeforeType=ti.RENDER,this.isShadowBaseNode=!0}setupShadowPosition({context:e,material:t}){N_.assign(t.receivedShadowPositionNode||e.shadowPositionWorld||Qd)}}const N_=On("vec3","shadowPositionWorld");function S_(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 R_(e,t){return t=S_(e,t),e.setMRT(null),e.setRenderObjectFunction(null),e.setClearColor(0,1),e.autoClear=!0,t}function A_(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 E_(e,t={}){return t.background=e.background,t.backgroundNode=e.backgroundNode,t.overrideMaterial=e.overrideMaterial,t}function w_(e,t){return t=E_(e,t),e.background=null,e.backgroundNode=null,e.overrideMaterial=null,t}function C_(e,t){e.background=t.background,e.backgroundNode=t.backgroundNode,e.overrideMaterial=t.overrideMaterial}function M_(e,t,r){return r=w_(t,r=R_(e,r))}function B_(e,t,r){A_(e,r),C_(t,r)}var F_=Object.freeze({__proto__:null,resetRendererAndSceneState:M_,resetRendererState:R_,resetSceneState:w_,restoreRendererAndSceneState:B_,restoreRendererState:A_,restoreSceneState:C_,saveRendererAndSceneState:function(e,t,r={}){return r=E_(t,r=S_(e,r))},saveRendererState:S_,saveSceneState:E_});const L_=new WeakMap,P_=dn(({depthTexture:e,shadowCoord:t,depthLayer:r})=>{let s=Pl(e,t.xy).setName("t_basic");return e.isArrayTexture&&(s=s.depth(r)),s.compare(t.z)}),D_=dn(({depthTexture:e,shadowCoord:t,shadow:r,depthLayer:s})=>{const i=(t,r)=>{let i=Pl(e,t);return e.isArrayTexture&&(i=i.depth(s)),i.compare(r)},n=Fc("mapSize","vec2",r).setGroup(Ta),a=Fc("radius","float",r).setGroup(Ta),o=Tn(1).div(n),u=a.mul(o.x),l=mx(Kl.xy).mul(6.28318530718);return Fa(i(t.xy.add(fx(0,5,l).mul(u)),t.z),i(t.xy.add(fx(1,5,l).mul(u)),t.z),i(t.xy.add(fx(2,5,l).mul(u)),t.z),i(t.xy.add(fx(3,5,l).mul(u)),t.z),i(t.xy.add(fx(4,5,l).mul(u)),t.z)).mul(.2)}),U_=dn(({depthTexture:e,shadowCoord:t,shadow:r,depthLayer:s})=>{const i=(t,r)=>{let i=Pl(e,t);return e.isArrayTexture&&(i=i.depth(s)),i.compare(r)},n=Fc("mapSize","vec2",r).setGroup(Ta),a=Tn(1).div(n),o=a.x,u=a.y,l=t.xy,d=Ro(l.mul(n).add(.5));return l.subAssign(d.mul(a)),Fa(i(l,t.z),i(l.add(Tn(o,0)),t.z),i(l.add(Tn(0,u)),t.z),i(l.add(a),t.z),ou(i(l.add(Tn(o.negate(),0)),t.z),i(l.add(Tn(o.mul(2),0)),t.z),d.x),ou(i(l.add(Tn(o.negate(),u)),t.z),i(l.add(Tn(o.mul(2),u)),t.z),d.x),ou(i(l.add(Tn(0,u.negate())),t.z),i(l.add(Tn(0,u.mul(2))),t.z),d.y),ou(i(l.add(Tn(o,u.negate())),t.z),i(l.add(Tn(o,u.mul(2))),t.z),d.y),ou(ou(i(l.add(Tn(o.negate(),u.negate())),t.z),i(l.add(Tn(o.mul(2),u.negate())),t.z),d.x),ou(i(l.add(Tn(o.negate(),u.mul(2))),t.z),i(l.add(Tn(o.mul(2),u.mul(2))),t.z),d.x),d.y)).mul(1/9)}),I_=dn(({depthTexture:e,shadowCoord:t,depthLayer:r},s)=>{let i=Pl(e).sample(t.xy);e.isArrayTexture&&(i=i.depth(r)),i=i.rg;const n=i.x,a=jo(1e-7,i.y.mul(i.y)),o=s.renderer.reversedDepthBuffer?Xo(n,t.z):Xo(t.z,n),u=fn(1).toVar();return pn(o.notEqual(1),()=>{const e=t.z.sub(n);let r=a.div(a.add(e.mul(e)));r=uu(La(r,.3).div(.65)),u.assign(jo(o,r))}),u}),O_=e=>{let t=L_.get(e);return void 0===t&&(t=new mg,t.colorNode=wn(0,0,0,1),t.isShadowPassMaterial=!0,t.name="ShadowMaterial",t.blending=se,t.fog=!1,L_.set(e,t)),t},V_=e=>{const t=L_.get(e);void 0!==t&&(t.dispose(),L_.delete(e))},k_=new gy,G_=[],z_=(e,t,r,s)=>{G_[0]=e,G_[1]=t;let i=k_.get(G_);return void 0!==i&&i.shadowType===r&&i.useVelocity===s||(i=(i,n,a,o,u,l,...d)=>{(!0===i.castShadow||i.receiveShadow&&r===ht)&&(s&&(Qs(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,k_.set(G_,i)),G_[0]=null,G_[1]=null,i},$_=dn(({samples:e,radius:t,size:r,shadowPass:s,depthLayer:i})=>{const n=fn(0).toVar("meanVertical"),a=fn(0).toVar("squareMeanVertical"),o=e.lessThanEqual(fn(1)).select(fn(0),fn(2).div(e.sub(1))),u=e.lessThanEqual(fn(1)).select(fn(0),fn(-1));Sp({start:yn(0),end:yn(e),type:"int",condition:"<"},({i:e})=>{const l=u.add(fn(e).mul(o));let d=s.sample(Fa(Kl.xy,Tn(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=To(a.sub(n.mul(n)).max(0));return Tn(n,l)}),W_=dn(({samples:e,radius:t,size:r,shadowPass:s,depthLayer:i})=>{const n=fn(0).toVar("meanHorizontal"),a=fn(0).toVar("squareMeanHorizontal"),o=e.lessThanEqual(fn(1)).select(fn(0),fn(2).div(e.sub(1))),u=e.lessThanEqual(fn(1)).select(fn(0),fn(-1));Sp({start:yn(0),end:yn(e),type:"int",condition:"<"},({i:e})=>{const l=u.add(fn(e).mul(o));let d=s.sample(Fa(Kl.xy,Tn(l,0).mul(t)).div(r));s.value.isArrayTexture&&(d=d.depth(i)),n.addAssign(d.x),a.addAssign(Fa(d.y.mul(d.y),d.x.mul(d.x)))}),n.divAssign(e),a.divAssign(e);const l=To(a.sub(n.mul(n)).max(0));return Tn(n,l)}),H_=[P_,D_,U_,I_];let q_;const j_=new ux;class X_ extends v_{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._currentShadowType=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,fn(1))}setupShadowCoord(e,t){const{shadow:r}=this,{renderer:s}=e,i=r.biasNode||Fc("bias","float",r).setGroup(Ta);let n,a=t;if(r.camera.isOrthographicCamera||!0!==s.logarithmicDepthBuffer)a=a.xyz.div(a.w),n=a.z;else{const e=a.w;a=a.xy.div(e);const t=Fc("near","float",r.camera).setGroup(Ta),s=Fc("far","float",r.camera).setGroup(Ta);n=Yp(e.negate(),t,s)}return a=Sn(a.x,a.y.oneMinus(),s.reversedDepthBuffer?n.sub(i):n.add(i)),a}getShadowFilterFn(e){return H_[e]}setupRenderTarget(e,t){const r=new J(e.mapSize.width,e.mapSize.height);r.name="ShadowDepthTexture",r.compareFunction=t.renderer.reversedDepthBuffer?M:w;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,camera:r}=e,{light:s,shadow:i}=this,{depthTexture:n,shadowMap:a}=this.setupRenderTarget(i,e),o=t.shadowMap.type,u=t.hasCompatibility(A.TEXTURE_COMPARE);if(o!==dt&&o!==ct||!u?(n.minFilter=B,n.magFilter=B):(n.minFilter=de,n.magFilter=de),i.camera.coordinateSystem=r.coordinateSystem,i.camera.updateProjectionMatrix(),o===ht&&!0!==i.isPointLightShadow){n.compareFunction=null,a.depth>1?(a._vsmShadowMapVertical||(a._vsmShadowMapVertical=e.createRenderTarget(i.mapSize.width,i.mapSize.height,{format:W,type:_e,depth:a.depth,depthBuffer:!1}),a._vsmShadowMapVertical.texture.name="VSMVertical"),this.vsmShadowMapVertical=a._vsmShadowMapVertical,a._vsmShadowMapHorizontal||(a._vsmShadowMapHorizontal=e.createRenderTarget(i.mapSize.width,i.mapSize.height,{format:W,type:_e,depth:a.depth,depthBuffer:!1}),a._vsmShadowMapHorizontal.texture.name="VSMHorizontal"),this.vsmShadowMapHorizontal=a._vsmShadowMapHorizontal):(this.vsmShadowMapVertical=e.createRenderTarget(i.mapSize.width,i.mapSize.height,{format:W,type:_e,depthBuffer:!1}),this.vsmShadowMapHorizontal=e.createRenderTarget(i.mapSize.width,i.mapSize.height,{format:W,type:_e,depthBuffer:!1}));let t=Pl(n);n.isArrayTexture&&(t=t.depth(this.depthLayer));let r=Pl(this.vsmShadowMapVertical.texture);n.isArrayTexture&&(r=r.depth(this.depthLayer));const s=Fc("blurSamples","float",i).setGroup(Ta),o=Fc("radius","float",i).setGroup(Ta),u=Fc("mapSize","vec2",i).setGroup(Ta);let l=this.vsmMaterialVertical||(this.vsmMaterialVertical=new mg);l.fragmentNode=$_({samples:s,radius:o,size:u,shadowPass:t,depthLayer:this.depthLayer}).context(e.getSharedContext()),l.name="VSMVertical",l=this.vsmMaterialHorizontal||(this.vsmMaterialHorizontal=new mg),l.fragmentNode=W_({samples:s,radius:o,size:u,shadowPass:r,depthLayer:this.depthLayer}).context(e.getSharedContext()),l.name="VSMHorizontal"}const l=Fc("intensity","float",i).setGroup(Ta),d=Fc("normalBias","float",i).setGroup(Ta),c=h_(s).mul(N_.add(dc.mul(d))),h=this.setupShadowCoord(e,c),p=i.filterNode||this.getShadowFilterFn(t.shadowMap.type)||null;if(null===p)throw new Error("THREE.WebGPURenderer: Shadow map type not supported yet.");const g=o===ht&&!0!==i.isPointLightShadow?this.vsmShadowMapHorizontal.texture:n,m=this.setupShadowFilter(e,{filterFn:p,shadowTexture:a.texture,depthTexture:g,shadowCoord:h,shadow:i,depthLayer:this.depthLayer});let f,y;!0===t.shadowMap.transmitted&&(a.texture.isCubeTexture?f=Cc(a.texture,h.xyz):(f=Pl(a.texture,h),n.isArrayTexture&&(f=f.depth(this.depthLayer)))),y=f?ou(1,m.rgb.mix(f,1),l.mul(f.a)).toVar():ou(1,m,l).toVar(),this.shadowMap=a,this.shadow.map=a;const b=`${this.light.type} Shadow [ ${this.light.name||"ID: "+this.light.id} ]`;return f&&y.toInspector(`${b} / Color`,()=>this.shadowMap.texture.isCubeTexture?Cc(this.shadowMap.texture):Pl(this.shadowMap.texture)),y.toInspector(`${b} / Depth`,()=>this.shadowMap.texture.isCubeTexture?Cc(this.shadowMap.texture).r.oneMinus():Dl(this.shadowMap.depthTexture,Rl().mul(El(Pl(this.shadowMap.depthTexture)))).r.oneMinus())}setup(e){if(!1!==e.renderer.shadowMap.enabled)return dn(()=>{const t=e.renderer.shadowMap.type;this._currentShadowType!==t&&(this._reset(),this._node=null);let r=this._node;return this.setupShadowPosition(e),null===r&&(this._node=r=this.setupShadow(e),this._currentShadowType=t),e.material.receivedShadowNode&&(r=e.material.receivedShadowNode(r)),r})()}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);const a=n.name;n.name=`Shadow Map [ ${s.name||"ID: "+s.id} ]`,i.render(n,t.camera),n.name=a}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");q_=M_(i,n,q_),n.overrideMaterial=O_(r),i.setRenderObjectFunction(z_(i,s,o,h)),i.setClearColor(0,0),i.setRenderTarget(t),this.renderShadow(e),i.setRenderObjectFunction(d),o===ht&&!0!==s.isPointLightShadow&&this.vsmPass(i),s.camera.layers.mask=l,B_(i,n,q_)}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),j_.material=this.vsmMaterialVertical,j_.render(e),e.setRenderTarget(this.vsmShadowMapHorizontal),j_.material=this.vsmMaterialHorizontal,j_.render(e)}dispose(){this._reset(),super.dispose()}_reset(){this._currentShadowType=null,V_(this.light),this.shadowMap&&(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)}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 K_=(e,t)=>new X_(e,t),Q_=new e,Y_=new a,Z_=new r,J_=new r,ev=[new r(1,0,0),new r(-1,0,0),new r(0,-1,0),new r(0,1,0),new r(0,0,1),new r(0,0,-1)],tv=[new r(0,-1,0),new r(0,-1,0),new r(0,0,-1),new r(0,0,1),new r(0,-1,0),new r(0,-1,0)],rv=[new r(1,0,0),new r(-1,0,0),new r(0,1,0),new r(0,-1,0),new r(0,0,1),new r(0,0,-1)],sv=[new r(0,-1,0),new r(0,-1,0),new r(0,0,1),new r(0,0,-1),new r(0,-1,0),new r(0,-1,0)],iv=dn(({depthTexture:e,bd3D:t,dp:r})=>Cc(e,t).compare(r)),nv=dn(({depthTexture:e,bd3D:t,dp:r,shadow:s})=>{const i=Fc("radius","float",s).setGroup(Ta),n=Fc("mapSize","vec2",s).setGroup(Ta),a=i.div(n.x),o=Fo(t),u=So(Jo(t,o.x.greaterThan(o.z).select(Sn(0,1,0),Sn(1,0,0)))),l=Jo(t,u),d=mx(Kl.xy).mul(6.28318530718),c=fx(0,5,d),h=fx(1,5,d),p=fx(2,5,d),g=fx(3,5,d),m=fx(4,5,d);return Cc(e,t.add(u.mul(c.x).add(l.mul(c.y)).mul(a))).compare(r).add(Cc(e,t.add(u.mul(h.x).add(l.mul(h.y)).mul(a))).compare(r)).add(Cc(e,t.add(u.mul(p.x).add(l.mul(p.y)).mul(a))).compare(r)).add(Cc(e,t.add(u.mul(g.x).add(l.mul(g.y)).mul(a))).compare(r)).add(Cc(e,t.add(u.mul(m.x).add(l.mul(m.y)).mul(a))).compare(r)).mul(.2)}),av=dn(({filterFn:e,depthTexture:t,shadowCoord:r,shadow:s},i)=>{const n=r.xyz.toConst(),a=n.abs().toConst(),o=a.x.max(a.y).max(a.z),u=Na("float").setGroup(Ta).onRenderUpdate(()=>s.camera.near),l=Na("float").setGroup(Ta).onRenderUpdate(()=>s.camera.far),d=Fc("bias","float",s).setGroup(Ta),c=fn(1).toVar();return pn(o.sub(l).lessThanEqual(0).and(o.sub(u).greaterThanEqual(0)),()=>{let r;i.renderer.reversedDepthBuffer?(r=Kp(o.negate(),u,l),r.subAssign(d)):(r=Xp(o.negate(),u,l),r.addAssign(d));const a=n.normalize();c.assign(e({depthTexture:t,bd3D:a,dp:r,shadow:s}))}),c});class ov extends X_{static get type(){return"PointShadowNode"}constructor(e,t=null){super(e,t)}getShadowFilterFn(e){return e===pt?iv:nv}setupShadowCoord(e,t){return t}setupShadowFilter(e,{filterFn:t,depthTexture:r,shadowCoord:s,shadow:i}){return av({filterFn:t,depthTexture:r,shadowCoord:s,shadow:i})}setupRenderTarget(e,t){const r=new gt(e.mapSize.width);r.name="PointShadowDepthTexture",r.compareFunction=t.renderer.reversedDepthBuffer?M:w;const s=t.createCubeRenderTarget(e.mapSize.width);return s.texture.name="PointShadowMap",s.depthTexture=r,{shadowMap:s,depthTexture:r}}renderShadow(e){const{shadow:t,shadowMap:r,light:s}=this,{renderer:i,scene:n}=e,a=t.camera,o=t.matrix,u=i.coordinateSystem===h,l=u?ev:rv,d=u?tv:sv;r.setSize(t.mapSize.width,t.mapSize.width);const c=i.autoClear,p=i.getClearColor(Q_),g=i.getClearAlpha();i.autoClear=!1,i.setClearColor(t.clearColor,t.clearAlpha);for(let e=0;e<6;e++){i.setRenderTarget(r,e),i.clear();const u=s.distance||a.far;u!==a.far&&(a.far=u,a.updateProjectionMatrix()),Z_.setFromMatrixPosition(s.matrixWorld),a.position.copy(Z_),J_.copy(a.position),J_.add(l[e]),a.up.copy(d[e]),a.lookAt(J_),a.updateMatrixWorld(),o.makeTranslation(-Z_.x,-Z_.y,-Z_.z),Y_.multiplyMatrices(a.projectionMatrix,a.matrixWorldInverse),t._frustum.setFromProjectionMatrix(Y_,a.coordinateSystem,a.reversedDepth);const c=n.name;n.name=`Point Light Shadow [ ${s.name||"ID: "+s.id} ] - Face ${e+1}`,i.render(n,a),n.name=c}i.autoClear=c,i.setClearColor(p,g)}}const uv=(e,t)=>new ov(e,t);class lv extends Bp{static get type(){return"AnalyticLightNode"}constructor(t=null){super(),this.light=t,this.color=new e,this.colorNode=t&&t.colorNode||Na(this.color).setGroup(Ta),this.baseColorNode=null,this.shadowNode=null,this.shadowColorNode=null,this.isAnalyticLightNode=!0,this.updateType=ti.FRAME,t&&t.shadow&&(this._shadowDisposeListener=()=>{this.disposeShadow()},t.addEventListener("dispose",this._shadowDisposeListener))}dispose(){this._shadowDisposeListener&&this.light.removeEventListener("dispose",this._shadowDisposeListener),super.dispose()}disposeShadow(){null!==this.shadowNode&&(this.shadowNode.dispose(),this.shadowNode=null),this.shadowColorNode=null,null!==this.baseColorNode&&(this.colorNode=this.baseColorNode,this.baseColorNode=null)}getHash(){return this.light.uuid}getLightVector(e){return f_(this.light).sub(e.context.positionView||Zd)}setupDirect(){}setupDirectRectArea(){}setupShadowNode(){return K_(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?en(e):this.setupShadowNode(),this.shadowNode=t,this.shadowColorNode=r=this.colorNode.mul(t),this.baseColorNode=this.colorNode}e.context.getShadow&&(r=e.context.getShadow(this,e)),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 dv=dn(({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)}),cv=({color:e,lightVector:t,cutoffDistance:r,decayExponent:s})=>{const i=t.normalize(),n=t.length(),a=dv({lightDistance:n,cutoffDistance:r,decayExponent:s});return{lightDirection:i,lightColor:e.mul(a)}};class hv extends lv{static get type(){return"PointLightNode"}constructor(e=null){super(e),this.cutoffDistanceNode=Na(0).setGroup(Ta),this.decayExponentNode=Na(2).setGroup(Ta)}update(e){const{light:t}=this;super.update(e),this.cutoffDistanceNode.value=t.distance,this.decayExponentNode.value=t.decay}setupShadowNode(){return uv(this.light)}setupDirect(e){return cv({color:this.colorNode,lightVector:this.getLightVector(e),cutoffDistance:this.cutoffDistanceNode,decayExponent:this.decayExponentNode})}}const pv=dn(([e=Rl()])=>{const t=e.mul(2),r=t.x.floor(),s=t.y.floor();return r.add(s).mod(2).sign()}),gv=dn(([e=Rl()],{renderer:t,material:r})=>{const s=au(e.mul(2).sub(1));let i;if(r.alphaToCoverage&&t.currentSamples>0){const e=fn(s.fwidth()).toVar();i=cu(e.oneMinus(),e.add(1),s).oneMinus()}else i=Tu(s.greaterThan(1),0,1);return i}),mv=dn(([e,t,r])=>{const s=fn(r).toVar(),i=fn(t).toVar(),n=xn(e).toVar();return Tu(n,i,s)}).setLayout({name:"mx_select",type:"float",inputs:[{name:"b",type:"bool"},{name:"t",type:"float"},{name:"f",type:"float"}]}),fv=dn(([e,t])=>{const r=xn(t).toVar(),s=fn(e).toVar();return Tu(r,s.negate(),s)}).setLayout({name:"mx_negate_if",type:"float",inputs:[{name:"val",type:"float"},{name:"b",type:"bool"}]}),yv=dn(([e])=>{const t=fn(e).toVar();return yn(vo(t))}).setLayout({name:"mx_floor",type:"int",inputs:[{name:"x",type:"float"}]}),bv=dn(([e,t])=>{const r=fn(e).toVar();return t.assign(yv(r)),r.sub(fn(t))}),xv=Lb([dn(([e,t,r,s,i,n])=>{const a=fn(n).toVar(),o=fn(i).toVar(),u=fn(s).toVar(),l=fn(r).toVar(),d=fn(t).toVar(),c=fn(e).toVar(),h=fn(La(1,o)).toVar();return La(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"}]}),dn(([e,t,r,s,i,n])=>{const a=fn(n).toVar(),o=fn(i).toVar(),u=Sn(s).toVar(),l=Sn(r).toVar(),d=Sn(t).toVar(),c=Sn(e).toVar(),h=fn(La(1,o)).toVar();return La(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"}]})]),Tv=Lb([dn(([e,t,r,s,i,n,a,o,u,l,d])=>{const c=fn(d).toVar(),h=fn(l).toVar(),p=fn(u).toVar(),g=fn(o).toVar(),m=fn(a).toVar(),f=fn(n).toVar(),y=fn(i).toVar(),b=fn(s).toVar(),x=fn(r).toVar(),T=fn(t).toVar(),_=fn(e).toVar(),v=fn(La(1,p)).toVar(),N=fn(La(1,h)).toVar();return fn(La(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"}]}),dn(([e,t,r,s,i,n,a,o,u,l,d])=>{const c=fn(d).toVar(),h=fn(l).toVar(),p=fn(u).toVar(),g=Sn(o).toVar(),m=Sn(a).toVar(),f=Sn(n).toVar(),y=Sn(i).toVar(),b=Sn(s).toVar(),x=Sn(r).toVar(),T=Sn(t).toVar(),_=Sn(e).toVar(),v=fn(La(1,p)).toVar(),N=fn(La(1,h)).toVar();return fn(La(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"}]})]),_v=dn(([e,t,r])=>{const s=fn(r).toVar(),i=fn(t).toVar(),n=bn(e).toVar(),a=bn(n.bitAnd(bn(7))).toVar(),o=fn(mv(a.lessThan(bn(4)),i,s)).toVar(),u=fn(Pa(2,mv(a.lessThan(bn(4)),s,i))).toVar();return fv(o,xn(a.bitAnd(bn(1)))).add(fv(u,xn(a.bitAnd(bn(2)))))}).setLayout({name:"mx_gradient_float_0",type:"float",inputs:[{name:"hash",type:"uint"},{name:"x",type:"float"},{name:"y",type:"float"}]}),vv=dn(([e,t,r,s])=>{const i=fn(s).toVar(),n=fn(r).toVar(),a=fn(t).toVar(),o=bn(e).toVar(),u=bn(o.bitAnd(bn(15))).toVar(),l=fn(mv(u.lessThan(bn(8)),a,n)).toVar(),d=fn(mv(u.lessThan(bn(4)),n,mv(u.equal(bn(12)).or(u.equal(bn(14))),a,i))).toVar();return fv(l,xn(u.bitAnd(bn(1)))).add(fv(d,xn(u.bitAnd(bn(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"}]}),Nv=Lb([_v,vv]),Sv=dn(([e,t,r])=>{const s=fn(r).toVar(),i=fn(t).toVar(),n=An(e).toVar();return Sn(Nv(n.x,i,s),Nv(n.y,i,s),Nv(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"}]}),Rv=dn(([e,t,r,s])=>{const i=fn(s).toVar(),n=fn(r).toVar(),a=fn(t).toVar(),o=An(e).toVar();return Sn(Nv(o.x,a,n,i),Nv(o.y,a,n,i),Nv(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"}]}),Av=Lb([Sv,Rv]),Ev=dn(([e])=>{const t=fn(e).toVar();return Pa(.6616,t)}).setLayout({name:"mx_gradient_scale2d_0",type:"float",inputs:[{name:"v",type:"float"}]}),wv=dn(([e])=>{const t=fn(e).toVar();return Pa(.982,t)}).setLayout({name:"mx_gradient_scale3d_0",type:"float",inputs:[{name:"v",type:"float"}]}),Cv=Lb([Ev,dn(([e])=>{const t=Sn(e).toVar();return Pa(.6616,t)}).setLayout({name:"mx_gradient_scale2d_1",type:"vec3",inputs:[{name:"v",type:"vec3"}]})]),Mv=Lb([wv,dn(([e])=>{const t=Sn(e).toVar();return Pa(.982,t)}).setLayout({name:"mx_gradient_scale3d_1",type:"vec3",inputs:[{name:"v",type:"vec3"}]})]),Bv=dn(([e,t])=>{const r=yn(t).toVar(),s=bn(e).toVar();return s.shiftLeft(r).bitOr(s.shiftRight(yn(32).sub(r)))}).setLayout({name:"mx_rotl32",type:"uint",inputs:[{name:"x",type:"uint"},{name:"k",type:"int"}]}),Fv=dn(([e,t,r])=>{e.subAssign(r),e.bitXorAssign(Bv(r,yn(4))),r.addAssign(t),t.subAssign(e),t.bitXorAssign(Bv(e,yn(6))),e.addAssign(r),r.subAssign(t),r.bitXorAssign(Bv(t,yn(8))),t.addAssign(e),e.subAssign(r),e.bitXorAssign(Bv(r,yn(16))),r.addAssign(t),t.subAssign(e),t.bitXorAssign(Bv(e,yn(19))),e.addAssign(r),r.subAssign(t),r.bitXorAssign(Bv(t,yn(4))),t.addAssign(e)}),Lv=dn(([e,t,r])=>{const s=bn(r).toVar(),i=bn(t).toVar(),n=bn(e).toVar();return s.bitXorAssign(i),s.subAssign(Bv(i,yn(14))),n.bitXorAssign(s),n.subAssign(Bv(s,yn(11))),i.bitXorAssign(n),i.subAssign(Bv(n,yn(25))),s.bitXorAssign(i),s.subAssign(Bv(i,yn(16))),n.bitXorAssign(s),n.subAssign(Bv(s,yn(4))),i.bitXorAssign(n),i.subAssign(Bv(n,yn(14))),s.bitXorAssign(i),s.subAssign(Bv(i,yn(24))),s}).setLayout({name:"mx_bjfinal",type:"uint",inputs:[{name:"a",type:"uint"},{name:"b",type:"uint"},{name:"c",type:"uint"}]}),Pv=dn(([e])=>{const t=bn(e).toVar();return fn(t).div(fn(bn(yn(4294967295))))}).setLayout({name:"mx_bits_to_01",type:"float",inputs:[{name:"bits",type:"uint"}]}),Dv=dn(([e])=>{const t=fn(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"}]}),Uv=Lb([dn(([e])=>{const t=yn(e).toVar(),r=bn(bn(1)).toVar(),s=bn(bn(yn(3735928559)).add(r.shiftLeft(bn(2))).add(bn(13))).toVar();return Lv(s.add(bn(t)),s,s)}).setLayout({name:"mx_hash_int_0",type:"uint",inputs:[{name:"x",type:"int"}]}),dn(([e,t])=>{const r=yn(t).toVar(),s=yn(e).toVar(),i=bn(bn(2)).toVar(),n=bn().toVar(),a=bn().toVar(),o=bn().toVar();return n.assign(a.assign(o.assign(bn(yn(3735928559)).add(i.shiftLeft(bn(2))).add(bn(13))))),n.addAssign(bn(s)),a.addAssign(bn(r)),Lv(n,a,o)}).setLayout({name:"mx_hash_int_1",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"}]}),dn(([e,t,r])=>{const s=yn(r).toVar(),i=yn(t).toVar(),n=yn(e).toVar(),a=bn(bn(3)).toVar(),o=bn().toVar(),u=bn().toVar(),l=bn().toVar();return o.assign(u.assign(l.assign(bn(yn(3735928559)).add(a.shiftLeft(bn(2))).add(bn(13))))),o.addAssign(bn(n)),u.addAssign(bn(i)),l.addAssign(bn(s)),Lv(o,u,l)}).setLayout({name:"mx_hash_int_2",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"}]}),dn(([e,t,r,s])=>{const i=yn(s).toVar(),n=yn(r).toVar(),a=yn(t).toVar(),o=yn(e).toVar(),u=bn(bn(4)).toVar(),l=bn().toVar(),d=bn().toVar(),c=bn().toVar();return l.assign(d.assign(c.assign(bn(yn(3735928559)).add(u.shiftLeft(bn(2))).add(bn(13))))),l.addAssign(bn(o)),d.addAssign(bn(a)),c.addAssign(bn(n)),Fv(l,d,c),l.addAssign(bn(i)),Lv(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"}]}),dn(([e,t,r,s,i])=>{const n=yn(i).toVar(),a=yn(s).toVar(),o=yn(r).toVar(),u=yn(t).toVar(),l=yn(e).toVar(),d=bn(bn(5)).toVar(),c=bn().toVar(),h=bn().toVar(),p=bn().toVar();return c.assign(h.assign(p.assign(bn(yn(3735928559)).add(d.shiftLeft(bn(2))).add(bn(13))))),c.addAssign(bn(l)),h.addAssign(bn(u)),p.addAssign(bn(o)),Fv(c,h,p),c.addAssign(bn(a)),h.addAssign(bn(n)),Lv(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"}]})]),Iv=Lb([dn(([e,t])=>{const r=yn(t).toVar(),s=yn(e).toVar(),i=bn(Uv(s,r)).toVar(),n=An().toVar();return n.x.assign(i.bitAnd(yn(255))),n.y.assign(i.shiftRight(yn(8)).bitAnd(yn(255))),n.z.assign(i.shiftRight(yn(16)).bitAnd(yn(255))),n}).setLayout({name:"mx_hash_vec3_0",type:"uvec3",inputs:[{name:"x",type:"int"},{name:"y",type:"int"}]}),dn(([e,t,r])=>{const s=yn(r).toVar(),i=yn(t).toVar(),n=yn(e).toVar(),a=bn(Uv(n,i,s)).toVar(),o=An().toVar();return o.x.assign(a.bitAnd(yn(255))),o.y.assign(a.shiftRight(yn(8)).bitAnd(yn(255))),o.z.assign(a.shiftRight(yn(16)).bitAnd(yn(255))),o}).setLayout({name:"mx_hash_vec3_1",type:"uvec3",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"}]})]),Ov=Lb([dn(([e])=>{const t=Tn(e).toVar(),r=yn().toVar(),s=yn().toVar(),i=fn(bv(t.x,r)).toVar(),n=fn(bv(t.y,s)).toVar(),a=fn(Dv(i)).toVar(),o=fn(Dv(n)).toVar(),u=fn(xv(Nv(Uv(r,s),i,n),Nv(Uv(r.add(yn(1)),s),i.sub(1),n),Nv(Uv(r,s.add(yn(1))),i,n.sub(1)),Nv(Uv(r.add(yn(1)),s.add(yn(1))),i.sub(1),n.sub(1)),a,o)).toVar();return Cv(u)}).setLayout({name:"mx_perlin_noise_float_0",type:"float",inputs:[{name:"p",type:"vec2"}]}),dn(([e])=>{const t=Sn(e).toVar(),r=yn().toVar(),s=yn().toVar(),i=yn().toVar(),n=fn(bv(t.x,r)).toVar(),a=fn(bv(t.y,s)).toVar(),o=fn(bv(t.z,i)).toVar(),u=fn(Dv(n)).toVar(),l=fn(Dv(a)).toVar(),d=fn(Dv(o)).toVar(),c=fn(Tv(Nv(Uv(r,s,i),n,a,o),Nv(Uv(r.add(yn(1)),s,i),n.sub(1),a,o),Nv(Uv(r,s.add(yn(1)),i),n,a.sub(1),o),Nv(Uv(r.add(yn(1)),s.add(yn(1)),i),n.sub(1),a.sub(1),o),Nv(Uv(r,s,i.add(yn(1))),n,a,o.sub(1)),Nv(Uv(r.add(yn(1)),s,i.add(yn(1))),n.sub(1),a,o.sub(1)),Nv(Uv(r,s.add(yn(1)),i.add(yn(1))),n,a.sub(1),o.sub(1)),Nv(Uv(r.add(yn(1)),s.add(yn(1)),i.add(yn(1))),n.sub(1),a.sub(1),o.sub(1)),u,l,d)).toVar();return Mv(c)}).setLayout({name:"mx_perlin_noise_float_1",type:"float",inputs:[{name:"p",type:"vec3"}]})]),Vv=Lb([dn(([e])=>{const t=Tn(e).toVar(),r=yn().toVar(),s=yn().toVar(),i=fn(bv(t.x,r)).toVar(),n=fn(bv(t.y,s)).toVar(),a=fn(Dv(i)).toVar(),o=fn(Dv(n)).toVar(),u=Sn(xv(Av(Iv(r,s),i,n),Av(Iv(r.add(yn(1)),s),i.sub(1),n),Av(Iv(r,s.add(yn(1))),i,n.sub(1)),Av(Iv(r.add(yn(1)),s.add(yn(1))),i.sub(1),n.sub(1)),a,o)).toVar();return Cv(u)}).setLayout({name:"mx_perlin_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"vec2"}]}),dn(([e])=>{const t=Sn(e).toVar(),r=yn().toVar(),s=yn().toVar(),i=yn().toVar(),n=fn(bv(t.x,r)).toVar(),a=fn(bv(t.y,s)).toVar(),o=fn(bv(t.z,i)).toVar(),u=fn(Dv(n)).toVar(),l=fn(Dv(a)).toVar(),d=fn(Dv(o)).toVar(),c=Sn(Tv(Av(Iv(r,s,i),n,a,o),Av(Iv(r.add(yn(1)),s,i),n.sub(1),a,o),Av(Iv(r,s.add(yn(1)),i),n,a.sub(1),o),Av(Iv(r.add(yn(1)),s.add(yn(1)),i),n.sub(1),a.sub(1),o),Av(Iv(r,s,i.add(yn(1))),n,a,o.sub(1)),Av(Iv(r.add(yn(1)),s,i.add(yn(1))),n.sub(1),a,o.sub(1)),Av(Iv(r,s.add(yn(1)),i.add(yn(1))),n,a.sub(1),o.sub(1)),Av(Iv(r.add(yn(1)),s.add(yn(1)),i.add(yn(1))),n.sub(1),a.sub(1),o.sub(1)),u,l,d)).toVar();return Mv(c)}).setLayout({name:"mx_perlin_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec3"}]})]),kv=Lb([dn(([e])=>{const t=fn(e).toVar(),r=yn(yv(t)).toVar();return Pv(Uv(r))}).setLayout({name:"mx_cell_noise_float_0",type:"float",inputs:[{name:"p",type:"float"}]}),dn(([e])=>{const t=Tn(e).toVar(),r=yn(yv(t.x)).toVar(),s=yn(yv(t.y)).toVar();return Pv(Uv(r,s))}).setLayout({name:"mx_cell_noise_float_1",type:"float",inputs:[{name:"p",type:"vec2"}]}),dn(([e])=>{const t=Sn(e).toVar(),r=yn(yv(t.x)).toVar(),s=yn(yv(t.y)).toVar(),i=yn(yv(t.z)).toVar();return Pv(Uv(r,s,i))}).setLayout({name:"mx_cell_noise_float_2",type:"float",inputs:[{name:"p",type:"vec3"}]}),dn(([e])=>{const t=wn(e).toVar(),r=yn(yv(t.x)).toVar(),s=yn(yv(t.y)).toVar(),i=yn(yv(t.z)).toVar(),n=yn(yv(t.w)).toVar();return Pv(Uv(r,s,i,n))}).setLayout({name:"mx_cell_noise_float_3",type:"float",inputs:[{name:"p",type:"vec4"}]})]),Gv=Lb([dn(([e])=>{const t=fn(e).toVar(),r=yn(yv(t)).toVar();return Sn(Pv(Uv(r,yn(0))),Pv(Uv(r,yn(1))),Pv(Uv(r,yn(2))))}).setLayout({name:"mx_cell_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"float"}]}),dn(([e])=>{const t=Tn(e).toVar(),r=yn(yv(t.x)).toVar(),s=yn(yv(t.y)).toVar();return Sn(Pv(Uv(r,s,yn(0))),Pv(Uv(r,s,yn(1))),Pv(Uv(r,s,yn(2))))}).setLayout({name:"mx_cell_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec2"}]}),dn(([e])=>{const t=Sn(e).toVar(),r=yn(yv(t.x)).toVar(),s=yn(yv(t.y)).toVar(),i=yn(yv(t.z)).toVar();return Sn(Pv(Uv(r,s,i,yn(0))),Pv(Uv(r,s,i,yn(1))),Pv(Uv(r,s,i,yn(2))))}).setLayout({name:"mx_cell_noise_vec3_2",type:"vec3",inputs:[{name:"p",type:"vec3"}]}),dn(([e])=>{const t=wn(e).toVar(),r=yn(yv(t.x)).toVar(),s=yn(yv(t.y)).toVar(),i=yn(yv(t.z)).toVar(),n=yn(yv(t.w)).toVar();return Sn(Pv(Uv(r,s,i,n,yn(0))),Pv(Uv(r,s,i,n,yn(1))),Pv(Uv(r,s,i,n,yn(2))))}).setLayout({name:"mx_cell_noise_vec3_3",type:"vec3",inputs:[{name:"p",type:"vec4"}]})]),zv=dn(([e,t,r,s])=>{const i=fn(s).toVar(),n=fn(r).toVar(),a=yn(t).toVar(),o=Sn(e).toVar(),u=fn(0).toVar(),l=fn(1).toVar();return Sp(a,()=>{u.addAssign(l.mul(Ov(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"}]}),$v=dn(([e,t,r,s])=>{const i=fn(s).toVar(),n=fn(r).toVar(),a=yn(t).toVar(),o=Sn(e).toVar(),u=Sn(0).toVar(),l=fn(1).toVar();return Sp(a,()=>{u.addAssign(l.mul(Vv(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"}]}),Wv=dn(([e,t,r,s])=>{const i=fn(s).toVar(),n=fn(r).toVar(),a=yn(t).toVar(),o=Sn(e).toVar();return Tn(zv(o,a,n,i),zv(o.add(Sn(yn(19),yn(193),yn(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"}]}),Hv=dn(([e,t,r,s])=>{const i=fn(s).toVar(),n=fn(r).toVar(),a=yn(t).toVar(),o=Sn(e).toVar(),u=Sn($v(o,a,n,i)).toVar(),l=fn(zv(o.add(Sn(yn(19),yn(193),yn(17))),a,n,i)).toVar();return wn(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"}]}),qv=Lb([dn(([e,t,r,s,i,n,a])=>{const o=yn(a).toVar(),u=fn(n).toVar(),l=yn(i).toVar(),d=yn(s).toVar(),c=yn(r).toVar(),h=yn(t).toVar(),p=Tn(e).toVar(),g=Sn(Gv(Tn(h.add(d),c.add(l)))).toVar(),m=Tn(g.x,g.y).toVar();m.subAssign(.5),m.mulAssign(u),m.addAssign(.5);const f=Tn(Tn(fn(h),fn(c)).add(m)).toVar(),y=Tn(f.sub(p)).toVar();return pn(o.equal(yn(2)),()=>Fo(y.x).add(Fo(y.y))),pn(o.equal(yn(3)),()=>jo(Fo(y.x),Fo(y.y))),Zo(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"}]}),dn(([e,t,r,s,i,n,a,o,u])=>{const l=yn(u).toVar(),d=fn(o).toVar(),c=yn(a).toVar(),h=yn(n).toVar(),p=yn(i).toVar(),g=yn(s).toVar(),m=yn(r).toVar(),f=yn(t).toVar(),y=Sn(e).toVar(),b=Sn(Gv(Sn(f.add(p),m.add(h),g.add(c)))).toVar();b.subAssign(.5),b.mulAssign(d),b.addAssign(.5);const x=Sn(Sn(fn(f),fn(m),fn(g)).add(b)).toVar(),T=Sn(x.sub(y)).toVar();return pn(l.equal(yn(2)),()=>Fo(T.x).add(Fo(T.y)).add(Fo(T.z))),pn(l.equal(yn(3)),()=>jo(Fo(T.x),Fo(T.y),Fo(T.z))),Zo(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"}]})]),jv=dn(([e,t,r])=>{const s=yn(r).toVar(),i=fn(t).toVar(),n=Tn(e).toVar(),a=yn().toVar(),o=yn().toVar(),u=Tn(bv(n.x,a),bv(n.y,o)).toVar(),l=fn(1e6).toVar();return Sp({start:-1,end:yn(1),name:"x",condition:"<="},({x:e})=>{Sp({start:-1,end:yn(1),name:"y",condition:"<="},({y:t})=>{const r=fn(qv(u,e,t,a,o,i,s)).toVar();l.assign(qo(l,r))})}),pn(s.equal(yn(0)),()=>{l.assign(To(l))}),l}).setLayout({name:"mx_worley_noise_float_0",type:"float",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),Xv=dn(([e,t,r])=>{const s=yn(r).toVar(),i=fn(t).toVar(),n=Tn(e).toVar(),a=yn().toVar(),o=yn().toVar(),u=Tn(bv(n.x,a),bv(n.y,o)).toVar(),l=Tn(1e6,1e6).toVar();return Sp({start:-1,end:yn(1),name:"x",condition:"<="},({x:e})=>{Sp({start:-1,end:yn(1),name:"y",condition:"<="},({y:t})=>{const r=fn(qv(u,e,t,a,o,i,s)).toVar();pn(r.lessThan(l.x),()=>{l.y.assign(l.x),l.x.assign(r)}).ElseIf(r.lessThan(l.y),()=>{l.y.assign(r)})})}),pn(s.equal(yn(0)),()=>{l.assign(To(l))}),l}).setLayout({name:"mx_worley_noise_vec2_0",type:"vec2",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),Kv=dn(([e,t,r])=>{const s=yn(r).toVar(),i=fn(t).toVar(),n=Tn(e).toVar(),a=yn().toVar(),o=yn().toVar(),u=Tn(bv(n.x,a),bv(n.y,o)).toVar(),l=Sn(1e6,1e6,1e6).toVar();return Sp({start:-1,end:yn(1),name:"x",condition:"<="},({x:e})=>{Sp({start:-1,end:yn(1),name:"y",condition:"<="},({y:t})=>{const r=fn(qv(u,e,t,a,o,i,s)).toVar();pn(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)})})}),pn(s.equal(yn(0)),()=>{l.assign(To(l))}),l}).setLayout({name:"mx_worley_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),Qv=Lb([jv,dn(([e,t,r])=>{const s=yn(r).toVar(),i=fn(t).toVar(),n=Sn(e).toVar(),a=yn().toVar(),o=yn().toVar(),u=yn().toVar(),l=Sn(bv(n.x,a),bv(n.y,o),bv(n.z,u)).toVar(),d=fn(1e6).toVar();return Sp({start:-1,end:yn(1),name:"x",condition:"<="},({x:e})=>{Sp({start:-1,end:yn(1),name:"y",condition:"<="},({y:t})=>{Sp({start:-1,end:yn(1),name:"z",condition:"<="},({z:r})=>{const n=fn(qv(l,e,t,r,a,o,u,i,s)).toVar();d.assign(qo(d,n))})})}),pn(s.equal(yn(0)),()=>{d.assign(To(d))}),d}).setLayout({name:"mx_worley_noise_float_1",type:"float",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),Yv=Lb([Xv,dn(([e,t,r])=>{const s=yn(r).toVar(),i=fn(t).toVar(),n=Sn(e).toVar(),a=yn().toVar(),o=yn().toVar(),u=yn().toVar(),l=Sn(bv(n.x,a),bv(n.y,o),bv(n.z,u)).toVar(),d=Tn(1e6,1e6).toVar();return Sp({start:-1,end:yn(1),name:"x",condition:"<="},({x:e})=>{Sp({start:-1,end:yn(1),name:"y",condition:"<="},({y:t})=>{Sp({start:-1,end:yn(1),name:"z",condition:"<="},({z:r})=>{const n=fn(qv(l,e,t,r,a,o,u,i,s)).toVar();pn(n.lessThan(d.x),()=>{d.y.assign(d.x),d.x.assign(n)}).ElseIf(n.lessThan(d.y),()=>{d.y.assign(n)})})})}),pn(s.equal(yn(0)),()=>{d.assign(To(d))}),d}).setLayout({name:"mx_worley_noise_vec2_1",type:"vec2",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),Zv=Lb([Kv,dn(([e,t,r])=>{const s=yn(r).toVar(),i=fn(t).toVar(),n=Sn(e).toVar(),a=yn().toVar(),o=yn().toVar(),u=yn().toVar(),l=Sn(bv(n.x,a),bv(n.y,o),bv(n.z,u)).toVar(),d=Sn(1e6,1e6,1e6).toVar();return Sp({start:-1,end:yn(1),name:"x",condition:"<="},({x:e})=>{Sp({start:-1,end:yn(1),name:"y",condition:"<="},({y:t})=>{Sp({start:-1,end:yn(1),name:"z",condition:"<="},({z:r})=>{const n=fn(qv(l,e,t,r,a,o,u,i,s)).toVar();pn(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)})})})}),pn(s.equal(yn(0)),()=>{d.assign(To(d))}),d}).setLayout({name:"mx_worley_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),Jv=dn(([e,t,r,s,i,n,a,o,u,l,d])=>{const c=yn(e).toVar(),h=Tn(t).toVar(),p=Tn(r).toVar(),g=Tn(s).toVar(),m=fn(i).toVar(),f=fn(n).toVar(),y=fn(a).toVar(),b=xn(o).toVar(),x=yn(u).toVar(),T=fn(l).toVar(),_=fn(d).toVar(),v=h.mul(p).add(g),N=fn(0).toVar();return pn(c.equal(yn(0)),()=>{N.assign(Vv(v))}),pn(c.equal(yn(1)),()=>{N.assign(Gv(v))}),pn(c.equal(yn(2)),()=>{N.assign(Zv(v,m,yn(0)))}),pn(c.equal(yn(3)),()=>{N.assign($v(Sn(v,0),x,T,_))}),N.assign(N.mul(y.sub(f)).add(f)),pn(b,()=>{N.assign(uu(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"}]}),eN=dn(([e,t,r,s,i,n,a,o,u,l,d])=>{const c=yn(e).toVar(),h=Sn(t).toVar(),p=Sn(r).toVar(),g=Sn(s).toVar(),m=fn(i).toVar(),f=fn(n).toVar(),y=fn(a).toVar(),b=xn(o).toVar(),x=yn(u).toVar(),T=fn(l).toVar(),_=fn(d).toVar(),v=h.mul(p).add(g),N=fn(0).toVar();return pn(c.equal(yn(0)),()=>{N.assign(Vv(v))}),pn(c.equal(yn(1)),()=>{N.assign(Gv(v))}),pn(c.equal(yn(2)),()=>{N.assign(Zv(v,m,yn(0)))}),pn(c.equal(yn(3)),()=>{N.assign($v(v,x,T,_))}),N.assign(N.mul(y.sub(f)).add(f)),pn(b,()=>{N.assign(uu(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"}]}),tN=dn(([e])=>{const t=e.y,r=e.z,s=Sn().toVar();return pn(t.lessThan(1e-4),()=>{s.assign(Sn(r,r,r))}).Else(()=>{let i=e.x;i=i.sub(vo(i)).mul(6).toVar();const n=yn(Go(i)),a=i.sub(fn(n)),o=r.mul(t.oneMinus()),u=r.mul(t.mul(a).oneMinus()),l=r.mul(t.mul(a.oneMinus()).oneMinus());pn(n.equal(yn(0)),()=>{s.assign(Sn(r,l,o))}).ElseIf(n.equal(yn(1)),()=>{s.assign(Sn(u,r,o))}).ElseIf(n.equal(yn(2)),()=>{s.assign(Sn(o,r,l))}).ElseIf(n.equal(yn(3)),()=>{s.assign(Sn(o,u,r))}).ElseIf(n.equal(yn(4)),()=>{s.assign(Sn(l,o,r))}).Else(()=>{s.assign(Sn(r,o,u))})}),s}).setLayout({name:"mx_hsvtorgb",type:"vec3",inputs:[{name:"hsv",type:"vec3"}]}),rN=dn(([e])=>{const t=Sn(e).toVar(),r=fn(t.x).toVar(),s=fn(t.y).toVar(),i=fn(t.z).toVar(),n=fn(qo(r,qo(s,i))).toVar(),a=fn(jo(r,jo(s,i))).toVar(),o=fn(a.sub(n)).toVar(),u=fn().toVar(),l=fn().toVar(),d=fn().toVar();return d.assign(a),pn(a.greaterThan(0),()=>{l.assign(o.div(a))}).Else(()=>{l.assign(0)}),pn(l.lessThanEqual(0),()=>{u.assign(0)}).Else(()=>{pn(r.greaterThanEqual(a),()=>{u.assign(s.sub(i).div(o))}).ElseIf(s.greaterThanEqual(a),()=>{u.assign(Fa(2,i.sub(r).div(o)))}).Else(()=>{u.assign(Fa(4,r.sub(s).div(o)))}),u.mulAssign(1/6),pn(u.lessThan(0),()=>{u.addAssign(1)})}),Sn(u,l,d)}).setLayout({name:"mx_rgbtohsv",type:"vec3",inputs:[{name:"c",type:"vec3"}]}),sN=dn(([e])=>{const t=Sn(e).toVar(),r=En(ka(t,Sn(.04045))).toVar(),s=Sn(t.div(12.92)).toVar(),i=Sn(eu(jo(t.add(Sn(.055)),Sn(0)).div(1.055),Sn(2.4))).toVar();return ou(s,i,r)}).setLayout({name:"mx_srgb_texture_to_lin_rec709",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),iN=(e,t)=>{e=fn(e),t=fn(t);const r=Tn(t.dFdx(),t.dFdy()).length().mul(.7071067811865476);return cu(e.sub(r),e.add(r),t)},nN=(e,t,r,s)=>ou(e,t,r[s].clamp()),aN=(e,t,r,s,i)=>ou(e,t,iN(r,s[i])),oN=dn(([e,t,r])=>{const s=So(e).toVar(),i=La(fn(.5).mul(t.sub(r)),Qd).div(s).toVar(),n=La(fn(-.5).mul(t.sub(r)),Qd).div(s).toVar(),a=Sn().toVar();a.x=s.x.greaterThan(fn(0)).select(i.x,n.x),a.y=s.y.greaterThan(fn(0)).select(i.y,n.y),a.z=s.z.greaterThan(fn(0)).select(i.z,n.z);const o=qo(a.x,a.y,a.z).toVar();return Qd.add(s.mul(o)).toVar().sub(r)}),uN=dn(([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 lN=Object.freeze({__proto__:null,BRDF_GGX:Jg,BRDF_Lambert:Og,BasicPointShadowFilter:iv,BasicShadowFilter:P_,Break:Rp,Const:Bu,Continue:()=>gl("continue").toStack(),DFGLUT:rm,D_GGX:Qg,Discard:ml,EPSILON:no,F_Schlick:Ig,Fn:dn,HALF_PI:co,INFINITY:ao,If:pn,Loop:Sp,NodeAccess:si,NodeShaderStage:ei,NodeType:ri,NodeUpdateType:ti,OnBeforeMaterialUpdate:e=>xx(bx.BEFORE_MATERIAL,e),OnBeforeObjectUpdate:e=>xx(bx.BEFORE_OBJECT,e),OnMaterialUpdate:e=>xx(bx.MATERIAL,e),OnObjectUpdate:e=>xx(bx.OBJECT,e),PCFShadowFilter:D_,PCFSoftShadowFilter:U_,PI:oo,PI2:uo,PointShadowFilter:nv,Return:()=>gl("return").toStack(),Schlick_to_F0:nm,ShaderNode:Ji,Stack:gn,Switch:(...e)=>Ni.Switch(...e),TBNViewMatrix:nh,TWO_PI:lo,VSMShadowFilter:I_,V_GGX_SmithCorrelated:Xg,Var:Mu,VarIntent:Fu,abs:Fo,acesFilmicToneMapping:nT,acos:Mo,add:Fa,addMethodChaining:Ri,addNodeElement:function(e){d("TSL: AddNodeElement has been removed in favor of tree-shaking. Trying add",e)},agxToneMapping:lT,all:ho,alphaT:Zn,and:$a,anisotropy:Jn,anisotropyB:ta,anisotropyT:ea,any:po,append:e=>(d("TSL: append() has been renamed to Stack().",new Us),gn(e)),array:Ra,arrayBuffer:e=>new _i(e,"ArrayBuffer"),asin:Co,assign:Ea,atan:Bo,atomicAdd:(e,t)=>IT(DT.ATOMIC_ADD,e,t),atomicAnd:(e,t)=>IT(DT.ATOMIC_AND,e,t),atomicFunc:IT,atomicLoad:e=>IT(DT.ATOMIC_LOAD,e,null),atomicMax:(e,t)=>IT(DT.ATOMIC_MAX,e,t),atomicMin:(e,t)=>IT(DT.ATOMIC_MIN,e,t),atomicOr:(e,t)=>IT(DT.ATOMIC_OR,e,t),atomicStore:(e,t)=>IT(DT.ATOMIC_STORE,e,t),atomicSub:(e,t)=>IT(DT.ATOMIC_SUB,e,t),atomicXor:(e,t)=>IT(DT.ATOMIC_XOR,e,t),attenuationColor:ga,attenuationDistance:pa,attribute:Sl,attributeArray:(e,t="float")=>{let r,s;!0===t.isStruct?(r=t.layout.getLength(),s=Ws("float")):(r=Hs(t),s=Ws(t));const i=new _x(e,r,s);return ap(i,t,e)},backgroundBlurriness:Ax,backgroundIntensity:Ex,backgroundRotation:wx,batch:xp,bentNormalView:oh,billboarding:Vb,bitAnd:ja,bitNot:Xa,bitOr:Ka,bitXor:Qa,bitangentGeometry:th,bitangentLocal:rh,bitangentView:sh,bitangentWorld:ih,bitcast:cb,blendBurn:ug,blendColor:hg,blendDodge:lg,blendOverlay:cg,blendScreen:dg,blur:af,bool:xn,buffer:Il,bufferAttribute:tl,builtin:zl,builtinAOContext:Au,builtinShadowContext:Ru,bumpMap:mh,bvec2:Nn,bvec3:En,bvec4:Bn,bypass:cl,cache:ll,call:Ca,cameraFar:yd,cameraIndex:md,cameraNear:fd,cameraNormalMatrix:vd,cameraPosition:Nd,cameraProjectionMatrix:bd,cameraProjectionMatrixInverse:xd,cameraViewMatrix:Td,cameraViewport:Sd,cameraWorldMatrix:_d,cbrt:nu,cdl:Hx,ceil:No,checker:pv,cineonToneMapping:sT,clamp:uu,clearcoat:Hn,clearcoatNormalView:cc,clearcoatRoughness:qn,clipSpace:qd,code:hT,color:mn,colorSpaceToWorking:$u,colorToDirection:e=>en(e).mul(2).sub(1),compute:al,computeKernel:nl,computeSkinning:(e,t=null)=>{const r=new _p(e);return r.positionNode=ap(new j(e.geometry.getAttribute("position").array,3),"vec3").setPBO(!0).toReadOnly().element(lp).toVar(),r.skinIndexNode=ap(new j(new Uint32Array(e.geometry.getAttribute("skinIndex").array),4),"uvec4").setPBO(!0).toReadOnly().element(lp).toVar(),r.skinWeightNode=ap(new j(e.geometry.getAttribute("skinWeight").array,4),"vec4").setPBO(!0).toReadOnly().element(lp).toVar(),r.bindMatrixNode=Na(e.bindMatrix,"mat4"),r.bindMatrixInverseNode=Na(e.bindMatrixInverse,"mat4"),r.boneMatricesNode=Il(e.skeleton.boneMatrices,"mat4",e.skeleton.bones.length),r.toPositionNode=t,en(r)},context:vu,convert:Un,convertColorSpace:(e,t,r)=>new Gu(en(e),t,r),convertToTexture:(e,...t)=>e.isSampleNode||e.isTextureNode?e:e.isPassNode?e.getTextureNode():cx(e,...t),cos:Eo,countLeadingZeros:fb,countOneBits:yb,countTrailingZeros:mb,cross:Jo,cubeTexture:Cc,cubeTextureBase:wc,dFdx:Io,dFdy:Oo,dashSize:oa,debug:xl,decrement:ro,decrementBefore:eo,defaultBuildStages:ni,defaultShaderStages:ii,defined:Yi,degrees:mo,deltaTime:Db,densityFogFactor:yT,depth:Jp,depthPass:(e,t,r)=>new Jx(Jx.DEPTH,e,t,r),determinant:Wo,difference:Yo,diffuseColor:kn,diffuseContribution:Gn,directPointLight:cv,directionToColor:uh,directionToFaceDirection:sc,dispersion:ma,disposeShadowMaterial:V_,distance:Qo,div:Da,dot:Zo,drawIndex:pp,dynamicBufferAttribute:(e,t=null,r=0,s=0)=>el(e,t,r,s,x),element:Dn,emissive:zn,equal:Ia,equirectUV:Sg,exp:fo,exp2:yo,exponentialHeightFogFactor:bT,expression:gl,faceDirection:rc,faceForward:hu,faceforward:yu,float:fn,floatBitsToInt:e=>new db(e,"int","float"),floatBitsToUint:hb,floor:vo,fog:xT,fract:Ro,frameGroup:xa,frameId:Ub,frontFacing:tc,fwidth:zo,gain:(e,t)=>e.lessThan(.5)?xb(e.mul(2),t).div(2):La(1,xb(Pa(La(1,e),2),t).div(2)),gapSize:ua,getConstNodeType:Zi,getCurrentStack:hn,getDirection:tf,getDistanceAttenuation:dv,getGeometryRoughness:qg,getNormalFromDepth:gx,getParallaxCorrectNormal:oN,getRoughness:jg,getScreenPosition:px,getShIrradianceAt:uN,getShadowMaterial:O_,getShadowRenderObjectFunction:z_,getTextureIndex:ob,getViewPosition:hx,ggxConvolution:df,globalId:wT,glsl:(e,t)=>hT(e,t,"glsl"),glslFn:(e,t)=>gT(e,t,"glsl"),grayscale:kx,greaterThan:ka,greaterThanEqual:za,hash:bb,highpModelNormalViewMatrix:Hd,highpModelViewMatrix:Wd,hue:$x,increment:to,incrementBefore:Ja,inspector:vl,instance:mp,instanceIndex:lp,instancedArray:(e,t="float")=>{let r,s;!0===t.isStruct?(r=t.layout.getLength(),s=Ws("float")):(r=Hs(t),s=Ws(t));const i=new Tx(e,r,s);return ap(i,t,i.count)},instancedBufferAttribute:rl,instancedDynamicBufferAttribute:sl,instancedMesh:yp,int:yn,intBitsToFloat:e=>new db(e,"float","int"),interleavedGradientNoise:mx,inverse:Ho,inverseSqrt:_o,inversesqrt:bu,invocationLocalIndex:hp,invocationSubgroupIndex:cp,ior:da,iridescence:Kn,iridescenceIOR:Qn,iridescenceThickness:Yn,isolate:ul,ivec2:_n,ivec3:Rn,ivec4:Cn,js:(e,t)=>hT(e,t,"js"),label:Eu,length:Po,lengthSq:au,lessThan:Va,lessThanEqual:Ga,lightPosition:g_,lightProjectionUV:p_,lightShadowMatrix:h_,lightTargetDirection:y_,lightTargetPosition:m_,lightViewPosition:f_,lightingContext:Pp,lights:(e=[])=>(new __).setLights(e),linearDepth:eg,linearToneMapping:tT,localId:CT,log:bo,log2:xo,logarithmicDepthToViewZ:(e,t,r)=>{const s=e.mul(bo(r.div(t)));return fn(Math.E).pow(s).mul(t).negate()},luminance:Wx,mat2:Fn,mat3:Ln,mat4:Pn,matcapUV:Xf,materialAO:ep,materialAlphaTest:bh,materialAnisotropy:Ih,materialAnisotropyVector:tp,materialAttenuationColor:Hh,materialAttenuationDistance:Wh,materialClearcoat:Bh,materialClearcoatNormal:Lh,materialClearcoatRoughness:Fh,materialColor:xh,materialDispersion:Zh,materialEmissive:_h,materialEnvIntensity:Tc,materialEnvRotation:_c,materialIOR:$h,materialIridescence:Oh,materialIridescenceIOR:Vh,materialIridescenceThickness:kh,materialLightMap:Jh,materialLineDashOffset:Qh,materialLineDashSize:jh,materialLineGapSize:Xh,materialLineScale:qh,materialLineWidth:Kh,materialMetalness:Ch,materialNormal:Mh,materialOpacity:vh,materialPointSize:Yh,materialReference:Dc,materialReflectivity:Eh,materialRefractionRatio:xc,materialRotation:Ph,materialRoughness:wh,materialSheen:Dh,materialSheenRoughness:Uh,materialShininess:Th,materialSpecular:Nh,materialSpecularColor:Rh,materialSpecularIntensity:Sh,materialSpecularStrength:Ah,materialThickness:zh,materialTransmission:Gh,max:jo,maxMipLevel:Cl,mediumpModelViewMatrix:$d,metalness:Wn,min:qo,mix:ou,mixElement:gu,mod:Ua,modInt:so,modelDirection:Pd,modelNormalMatrix:kd,modelPosition:Ud,modelRadius:Vd,modelScale:Id,modelViewMatrix:zd,modelViewPosition:Od,modelViewProjection:rp,modelWorldMatrix:Dd,modelWorldMatrixInverse:Gd,morphReference:Mp,mrt:lb,mul:Pa,mx_aastep:iN,mx_add:(e,t=fn(0))=>Fa(e,t),mx_atan2:(e=fn(0),t=fn(1))=>Bo(e,t),mx_cell_noise_float:(e=Rl())=>kv(e.convert("vec2|vec3")),mx_contrast:(e,t=1,r=.5)=>fn(e).sub(r).mul(t).add(r),mx_divide:(e,t=fn(1))=>Da(e,t),mx_fractal_noise_float:(e=Rl(),t=3,r=2,s=.5,i=1)=>zv(e,yn(t),r,s).mul(i),mx_fractal_noise_vec2:(e=Rl(),t=3,r=2,s=.5,i=1)=>Wv(e,yn(t),r,s).mul(i),mx_fractal_noise_vec3:(e=Rl(),t=3,r=2,s=.5,i=1)=>$v(e,yn(t),r,s).mul(i),mx_fractal_noise_vec4:(e=Rl(),t=3,r=2,s=.5,i=1)=>Hv(e,yn(t),r,s).mul(i),mx_frame:()=>Ub,mx_heighttonormal:(e,t)=>(e=Sn(e),t=fn(t),mh(e,t)),mx_hsvtorgb:tN,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=fn(1))=>La(t,e),mx_modulo:(e,t=fn(1))=>Ua(e,t),mx_multiply:(e,t=fn(1))=>Pa(e,t),mx_noise_float:(e=Rl(),t=1,r=0)=>Ov(e.convert("vec2|vec3")).mul(t).add(r),mx_noise_vec3:(e=Rl(),t=1,r=0)=>Vv(e.convert("vec2|vec3")).mul(t).add(r),mx_noise_vec4:(e=Rl(),t=1,r=0)=>{e=e.convert("vec2|vec3");return wn(Vv(e),Ov(e.add(Tn(19,73)))).mul(t).add(r)},mx_place2d:(e,t=Tn(.5,.5),r=Tn(1,1),s=fn(0),i=Tn(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=Tn(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=fn(1))=>eu(e,t),mx_ramp4:(e,t,r,s,i=Rl())=>{const n=i.x.clamp(),a=i.y.clamp(),o=ou(e,t,n),u=ou(r,s,n);return ou(o,u,a)},mx_ramplr:(e,t,r=Rl())=>nN(e,t,r,"x"),mx_ramptb:(e,t,r=Rl())=>nN(e,t,r,"y"),mx_rgbtohsv:rN,mx_rotate2d:(e,t)=>{e=Tn(e);const r=(t=fn(t)).mul(Math.PI/180);return Zf(e,r)},mx_rotate3d:(e,t,r)=>{e=Sn(e),t=fn(t),r=Sn(r);const s=t.mul(Math.PI/180),i=r.normalize(),n=s.cos(),a=s.sin(),o=fn(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=fn(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=Rl())=>aN(e,t,r,s,"x"),mx_splittb:(e,t,r,s=Rl())=>aN(e,t,r,s,"y"),mx_srgb_texture_to_lin_rec709:sN,mx_subtract:(e,t=fn(0))=>La(e,t),mx_timer:()=>Pb,mx_transform_uv:(e=1,t=0,r=Rl())=>r.mul(e).add(t),mx_unifiednoise2d:(e,t=Rl(),r=Tn(1,1),s=Tn(0,0),i=1,n=0,a=1,o=!1,u=1,l=2,d=.5)=>Jv(e,t.convert("vec2|vec3"),r,s,i,n,a,o,u,l,d),mx_unifiednoise3d:(e,t=Rl(),r=Tn(1,1),s=Tn(0,0),i=1,n=0,a=1,o=!1,u=1,l=2,d=.5)=>eN(e,t.convert("vec2|vec3"),r,s,i,n,a,o,u,l,d),mx_worley_noise_float:(e=Rl(),t=1)=>Qv(e.convert("vec2|vec3"),t,yn(1)),mx_worley_noise_vec2:(e=Rl(),t=1)=>Yv(e.convert("vec2|vec3"),t,yn(1)),mx_worley_noise_vec3:(e=Rl(),t=1)=>Zv(e.convert("vec2|vec3"),t,yn(1)),negate:Do,neutralToneMapping:dT,nodeArray:sn,nodeImmutable:an,nodeObject:en,nodeObjectIntent:tn,nodeObjects:rn,nodeProxy:nn,nodeProxyIntent:on,normalFlat:ac,normalGeometry:ic,normalLocal:nc,normalMap:ch,normalView:lc,normalViewGeometry:oc,normalWorld:dc,normalWorldGeometry:uc,normalize:So,not:Ha,notEqual:Oa,numWorkgroups:AT,objectDirection:Ed,objectGroup:_a,objectPosition:Cd,objectRadius:Fd,objectScale:Md,objectViewPosition:Bd,objectWorldMatrix:wd,oneMinus:Uo,or:Wa,orthographicDepthToViewZ:jp,oscSawtooth:(e=Pb)=>e.fract(),oscSine:(e=Pb)=>e.add(.75).mul(2*Math.PI).sin().mul(.5).add(.5),oscSquare:(e=Pb)=>e.fract().round(),oscTriangle:(e=Pb)=>e.add(.5).fract().mul(2).sub(1).abs(),output:aa,outputStruct:sb,overloadingFn:Lb,packHalf2x16:Nb,packSnorm2x16:_b,packUnorm2x16:vb,parabola:xb,parallaxDirection:ah,parallaxUV:(e,t)=>e.sub(ah.mul(t)),parameter:(e,t)=>new Yy(e,t),pass:(e,t,r)=>new Jx(Jx.COLOR,e,t,r),passTexture:(e,t)=>new Yx(e,t),pcurve:(e,t,r)=>eu(Da(eu(e,t),Fa(eu(e,t),eu(La(1,e),r))),1/t),perspectiveDepthToViewZ:Qp,pmremTexture:Lf,pointShadow:uv,pointUV:Nx,pointWidth:la,positionGeometry:jd,positionLocal:Xd,positionPrevious:Kd,positionView:Zd,positionViewDirection:Jd,positionWorld:Qd,positionWorldDirection:Yd,posterize:qx,pow:eu,pow2:tu,pow3:ru,pow4:su,premultiplyAlpha:pg,property:On,quadBroadcast:l_,quadSwapDiagonal:s_,quadSwapX:t_,quadSwapY:r_,radians:go,rand:pu,range:NT,rangeFogFactor:fT,reciprocal:ko,reference:Fc,referenceBuffer:Lc,reflect:Ko,reflectVector:Sc,reflectView:vc,reflector:e=>new sx(e),refract:du,refractVector:Rc,refractView:Nc,reinhardToneMapping:rT,remap:hl,renderGroup:Ta,renderOutput:yl,rendererReference:ju,replaceDefaultUV:function(e,t=null){return vu(t,{getUV:"function"==typeof e?e:()=>e})},rotate:Zf,rotateUV:Ib,roughness:$n,round:Vo,rtt:cx,sRGBTransferEOTF:Ou,sRGBTransferOETF:Vu,sample:(e,t=null)=>new yx(e,en(t)),sampler:e=>(!0===e.isNode?e:Pl(e)).convert("sampler"),samplerComparison:e=>(!0===e.isNode?e:Pl(e)).convert("samplerComparison"),saturate:lu,saturation:Gx,screenCoordinate:Kl,screenDPR:ql,screenSize:Xl,screenUV:jl,select:Tu,setCurrentStack:cn,setName:Su,shaderStages:ai,shadow:K_,shadowPositionWorld:N_,shapeCircle:gv,sharedUniformGroup:ba,sheen:jn,sheenRoughness:Xn,shiftLeft:Ya,shiftRight:Za,shininess:na,sign:Lo,sin:Ao,sinc:(e,t)=>Ao(oo.mul(t.mul(e).sub(1))).div(oo.mul(t.mul(e).sub(1))),skinning:vp,smoothstep:cu,smoothstepElement:mu,specularColor:ra,specularColorBlended:sa,specularF90:ia,spherizeUV:Ob,split:(e,t)=>new fi(en(e),t),spritesheetUV:Gb,sqrt:To,stack:Jy,step:Xo,stepElement:fu,storage:ap,storageBarrier:()=>FT("storage").toStack(),storageTexture:Mx,string:(e="")=>new _i(e,"string"),struct:(e,t=null)=>{const r=new eb(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;eLx(e,t).level(r),texture3DLoad:(...e)=>Lx(...e).setSampler(!1),textureBarrier:()=>FT("texture").toStack(),textureBicubic:Rm,textureBicubicLevel:Sm,textureCubeUV:rf,textureLevel:(e,t,r)=>Pl(e,t).level(r),textureLoad:Dl,textureSize:El,textureStore:(e,t,r)=>{let s;return!0===e.isStorageTextureNode?(s=e.clone(),s.uvNode=t,s.storeNode=r):s=Mx(e,t,r),null!==r&&s.toStack(),s},thickness:ha,time:Pb,toneMapping:Ku,toneMappingExposure:Qu,toonOutlinePass:(t,r,s=new e(0,0,0),i=.003,n=1)=>new eT(t,r,en(s),en(i),en(n)),transformDirection:iu,transformNormal:hc,transformNormalToView:pc,transformedClearcoatNormalView:fc,transformedNormalView:gc,transformedNormalWorld:mc,transmission:ca,transpose:$o,triNoise3D:Mb,triplanarTexture:(...e)=>zb(...e),triplanarTextures:zb,trunc:Go,uint:bn,uintBitsToFloat:e=>new db(e,"float","uint"),uniform:Na,uniformArray:kl,uniformCubeTexture:(e=Ac)=>wc(e),uniformFlow:Nu,uniformGroup:ya,uniformTexture:(e=Bl)=>Pl(e),unpackHalf2x16:Eb,unpackNormal:lh,unpackSnorm2x16:Rb,unpackUnorm2x16:Ab,unpremultiplyAlpha:gg,userData:(e,t,r)=>new Px(e,t,r),uv:Rl,uvec2:vn,uvec3:An,uvec4:Mn,varying:Uu,varyingProperty:Vn,vec2:Tn,vec3:Sn,vec4:wn,vectorComponents:oi,velocity:Vx,vertexColor:og,vertexIndex:up,vertexStage:Iu,vibrance:zx,viewZToLogarithmicDepth:Yp,viewZToOrthographicDepth:qp,viewZToPerspectiveDepth:Xp,viewZToReversedOrthographicDepth:(e,t,r)=>e.add(r).div(r.sub(t)),viewZToReversedPerspectiveDepth:Kp,viewport:Ql,viewportCoordinate:Zl,viewportDepthTexture:Wp,viewportLinearDepth:tg,viewportMipTexture:Vp,viewportOpaqueMipTexture:Gp,viewportResolution:ed,viewportSafeUV:kb,viewportSharedTexture:Kx,viewportSize:Yl,viewportTexture:Op,viewportUV:Jl,vogelDiskSample:fx,wgsl:(e,t)=>hT(e,t,"wgsl"),wgslFn:(e,t)=>gT(e,t,"wgsl"),workgroupArray:(e,t)=>new PT("Workgroup",e,t),workgroupBarrier:()=>FT("workgroup").toStack(),workgroupId:ET,workingToColorSpace:zu,xor:qa});const dN=new Qy;class cN extends xy{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(dN),dN.a=s._clearColor.a;else if(!0===i.isColor)i.getRGB(dN),dN.a=1,n=!0;else if(!0===i.isNode){const u=this.get(e),l=i;dN.copy(s._clearColor);let d=u.backgroundMesh;if(void 0===d){const h=wn(l).mul(Ex).context({getUV:()=>wx.mul(uc),getTextureLevel:()=>Ax}),p=bd.element(3).element(3).equal(1),g=Da(1,bd.element(1).element(1)).mul(3),m=p.select(Xd.mul(g),Xd),f=zd.mul(wn(m,0));let y=bd.mul(wn(f.xyz,1));y=y.setZ(y.w);const b=new mg;function x(){i.removeEventListener("dispose",x),d.material.dispose(),d.geometry.dispose()}b.name="Background.material",b.side=L,b.depthTest=!1,b.depthWrite=!1,b.allowOverride=!1,b.fog=!1,b.lights=!1,b.vertexNode=y,b.colorNode=h,u.backgroundMeshNode=h,u.backgroundMesh=d=new ue(new mt(1,32,32),b),d.frustumCulled=!1,d.name="Background.mesh",i.addEventListener("dispose",x)}const c=l.getCacheKey();u.backgroundCacheKey!==c&&(u.backgroundMeshNode.node=wn(l).mul(Ex),u.backgroundMeshNode.needsUpdate=!0,d.material.needsUpdate=!0,u.backgroundCacheKey=c),t.unshift(d,d.geometry,d.material,0,0,null,null)}else o("Renderer: Unsupported background configuration.",i);const a=s.xr.getEnvironmentBlendMode();if("additive"===a?dN.set(0,0,0,1):"alpha-blend"===a&&dN.set(0,0,0,0),!0===s.autoClear||!0===n){const T=r.clearColorValue;T.r=dN.r,T.g=dN.g,T.b=dN.b,T.a=dN.a,!0!==s.backend.isWebGLBackend&&!0!==s.alpha||(T.r*=T.a,T.g*=T.a,T.b*=T.a),r.depthClearValue=s.getClearDepth(),r.stencilClearValue=s.getClearStencil(),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 hN=0;class pN{constructor(e="",t=[]){this.name=e,this.bindings=t,this.id=hN++}}class gN{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 pN(t.name,[]);e.push(r);for(const e of t.bindings)r.bindings.push(e.clone())}else e.push(t)}return e}}class mN{constructor(e,t,r=null){this.isNodeAttribute=!0,this.name=e,this.type=t,this.node=r}}class fN{constructor(e,t,r){this.isNodeUniform=!0,this.name=e,this.type=t,this.node=r}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 yN{constructor(e,t,r=!1,s=null){this.isNodeVar=!0,this.name=e,this.type=t,this.readOnly=r,this.count=s}}class bN extends yN{constructor(e,t,r=null,s=null){super(e,t),this.needsInterpolation=!1,this.isNodeVarying=!0,this.interpolationType=r,this.interpolationSampling=s}}class xN{constructor(e,t,r=""){this.name=e,this.type=t,this.code=r,Object.defineProperty(this,"isNodeCode",{value:!0})}}let TN=0;class _N{constructor(e=null){this.id=TN++,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 vN{constructor(e,t){this.name=e,this.members=t,this.output=!1}}class NN{constructor(e,t){this.name=e,this.value=t,this.boundary=0,this.itemSize=0,this.offset=0,this.index=-1}setValue(e){this.value=e}getValue(){return this.value}}class SN extends NN{constructor(e,t=0){super(e,t),this.isNumberUniform=!0,this.boundary=4,this.itemSize=1}}class RN extends NN{constructor(e,r=new t){super(e,r),this.isVector2Uniform=!0,this.boundary=8,this.itemSize=2}}class AN extends NN{constructor(e,t=new r){super(e,t),this.isVector3Uniform=!0,this.boundary=16,this.itemSize=3}}class EN extends NN{constructor(e,t=new s){super(e,t),this.isVector4Uniform=!0,this.boundary=16,this.itemSize=4}}class wN extends NN{constructor(t,r=new e){super(t,r),this.isColorUniform=!0,this.boundary=16,this.itemSize=3}}class CN extends NN{constructor(e,t=new i){super(e,t),this.isMatrix2Uniform=!0,this.boundary=8,this.itemSize=4}}class MN extends NN{constructor(e,t=new n){super(e,t),this.isMatrix3Uniform=!0,this.boundary=48,this.itemSize=12}}class BN extends NN{constructor(e,t=new a){super(e,t),this.isMatrix4Uniform=!0,this.boundary=64,this.itemSize=16}}class FN extends SN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class LN extends RN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class PN extends AN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class DN extends EN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class UN extends wN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class IN extends CN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class ON extends MN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class VN extends BN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}let kN=0;const GN=new WeakMap,zN=new WeakMap,$N=new Map([[Int8Array,"int"],[Int16Array,"int"],[Int32Array,"int"],[Uint8Array,"uint"],[Uint16Array,"uint"],[Uint32Array,"uint"],[Float32Array,"float"]]),WN=e=>/e/g.test(e)?String(e).replace(/\+/g,""):(e=Number(e))+(e%1?"":".0");class HN{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.types={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=Jy(),this.stacks=[],this.tab="\t",this.currentFunctionNode=null,this.context={material:this.material},this.cache=new _N,this.globalCache=this.cache,this.flowsData=new WeakMap,this.shaderStage=null,this.buildStage=null,this.subBuildLayers=[],this.activeStacks=[],this.subBuildFn=null,this.fnCall=null,Object.defineProperty(this,"id",{value:kN++})}isFlatShading(){return!0===this.material.flatShading||!1===this.geometry.hasAttribute("normal")}isOpaque(){const e=this.material;return!1===e.transparent&&e.blending===et&&!1===e.alphaToCoverage}createRenderTarget(e,t,r){return new ae(e,t,r)}createCubeRenderTarget(e,t){return new Rg(e,t)}includes(e){return this.nodes.includes(e)}getOutputStructName(){}_getBindGroup(e,t){const r=t[0].groupNode;let s,i=r.shared;if(i)for(let e=1;ee.nodeUniform.node.id-t.nodeUniform.node.id);for(const t of e.uniforms)r+=t.nodeUniform.node.id}else r+=e.nodeUniform.id;const i=this.renderer._currentRenderContext||this.renderer;let n=GN.get(i);void 0===n&&(n=new Map,GN.set(i,n));const a=Os(r);s=n.get(a),void 0===s&&(s=new pN(e,t),n.set(a,s))}else s=new pN(e,t);return s}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 ai)for(const s in r[e]){const i=r[e][s],n=t[s]||(t[s]=[]);for(const e of i)!1===n.includes(e)&&n.push(e)}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")}( ${WN(n.r)}, ${WN(n.g)}, ${WN(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 mN(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===R)return"int";if(t===S)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=$s(e);const s="float"===t?"":t[0];return!0===/mat2/.test(t)&&(r=r.replace("vec","mat")),s+r}getTypeFromArray(e){return $N.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 bt||!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")}setActiveStack(e){this.activeStacks.push(e)}removeActiveStack(e){if(this.activeStacks[this.activeStacks.length-1]!==e)throw new Error("NodeBuilder: Invalid active stack removal.");this.activeStacks.pop()}getActiveStack(){return this.activeStacks[this.activeStacks.length-1]}getBaseStack(){return this.activeStacks[0]}addStack(){this.stack=Jy(this.stack);const e=hn();return this.stacks.push(e),cn(this.stack),this.stack}removeStack(){const e=this.stack;for(const t of e.nodes){this.getDataFromNode(t).stack=e}return this.stack=e.parent,cn(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,"vertex");let s=r.bufferAttribute;if(void 0===s){const i=this.uniforms.index++;s=new mN("nodeAttribute"+i,t,e),this.bufferAttributes.push(s),r.bufferAttribute=s}return s}getStructTypeNode(e,t=this.shaderStage){return this.types[t][e]||null}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 a=this.structs.index++;null===r&&(r="StructType"+a),n=new vN(r,t),this.structs[s].push(n),this.types[s][r]=e,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 fN(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 yN(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 bN(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,d(`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 xN("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 pT,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 Yy(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 _N,this.stack=Jy();for(const r of ni)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(){d("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(){d("Abstract function.")}getVaryings(){d("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(){d("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(){d("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&&(o(`NodeMaterial: Material "${t.type}" is not compatible.`),e=new mg),e.build(this)}else this.addFlow("compute",e);for(const e of ni){this.setBuildStage(e),this.context.position&&this.context.position.isNode&&this.flowNodeFromShaderStage("vertex",this.context.position);for(const t of ai){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}async buildAsync(){const{object:e,material:t,renderer:r}=this;if(null!==t){let e=r.library.fromMaterial(t);null===e&&(o(`NodeMaterial: Material "${t.type}" is not compatible.`),e=new mg),e.build(this)}else this.addFlow("compute",e);for(const e of ni){this.setBuildStage(e),this.context.position&&this.context.position.isNode&&this.flowNodeFromShaderStage("vertex",this.context.position);for(const t of ai){this.setShaderStage(t);const r=this.flowNodes[t];for(const t of r)"generate"===e?this.flowNode(t):t.build(this);await xt()}}return this.setBuildStage(null),this.setShaderStage(null),this.buildCode(),this.buildUpdateNodes(),this}getSharedDataFromNode(e){let t=zN.get(e);return void 0===t&&(t={}),t}getNodeUniform(e,t){const r=this.getSharedDataFromNode(e);let s=r.cache;if(void 0===s){if("float"===t||"int"===t||"uint"===t)s=new FN(e);else if("vec2"===t||"ivec2"===t||"uvec2"===t)s=new LN(e);else if("vec3"===t||"ivec3"===t||"uvec3"===t)s=new PN(e);else if("vec4"===t||"ivec4"===t||"uvec4"===t)s=new DN(e);else if("color"===t)s=new UN(e);else if("mat2"===t)s=new IN(e);else if("mat3"===t)s=new ON(e);else{if("mat4"!==t)throw new Error(`Uniform "${t}" not implemented.`);s=new VN(e)}r.cache=s}return s}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${Tt} - Node System\n`}needsPreviousData(){const e=this.renderer.getMRT();return e&&e.has("velocity")||!0===Qs(this.object).useVelocity}}class qN{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={renderId:0,frameId:0},e.set(t,r)),r}updateBeforeNode(e){const t=e.getUpdateBeforeType(),r=e.updateReference(this);if(t===ti.FRAME){const t=this._getMaps(this.updateBeforeMap,r);if(t.frameId!==this.frameId){const r=t.frameId;t.frameId=this.frameId,!1===e.updateBefore(this)&&(t.frameId=r)}}else if(t===ti.RENDER){const t=this._getMaps(this.updateBeforeMap,r);if(t.renderId!==this.renderId){const r=t.renderId;t.renderId=this.renderId,!1===e.updateBefore(this)&&(t.renderId=r)}}else t===ti.OBJECT&&e.updateBefore(this)}updateAfterNode(e){const t=e.getUpdateAfterType(),r=e.updateReference(this);if(t===ti.FRAME){const t=this._getMaps(this.updateAfterMap,r);t.frameId!==this.frameId&&!1!==e.updateAfter(this)&&(t.frameId=this.frameId)}else if(t===ti.RENDER){const t=this._getMaps(this.updateAfterMap,r);t.renderId!==this.renderId&&!1!==e.updateAfter(this)&&(t.renderId=this.renderId)}else t===ti.OBJECT&&e.updateAfter(this)}updateNode(e){const t=e.getUpdateType(),r=e.updateReference(this);if(t===ti.FRAME){const t=this._getMaps(this.updateMap,r);t.frameId!==this.frameId&&!1!==e.update(this)&&(t.frameId=this.frameId)}else if(t===ti.RENDER){const t=this._getMaps(this.updateMap,r);t.renderId!==this.renderId&&!1!==e.update(this)&&(t.renderId=this.renderId)}else t===ti.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 jN{constructor(e,t,r=null,s="",i=!1){this.type=e,this.name=t,this.count=r,this.qualifier=s,this.isConst=i}}jN.isNodeFunctionInput=!0;class XN extends lv{static get type(){return"AmbientLightNode"}constructor(e=null){super(e)}setup({context:e}){e.irradiance.addAssign(this.colorNode)}}class KN extends lv{static get type(){return"DirectionalLightNode"}constructor(e=null){super(e)}setupDirect(){const e=this.colorNode;return{lightDirection:y_(this.light),lightColor:e}}}class QN extends lv{static get type(){return"HemisphereLightNode"}constructor(t=null){super(t),this.lightPositionNode=g_(t),this.lightDirectionNode=this.lightPositionNode.normalize(),this.groundColorNode=Na(new e).setGroup(Ta)}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=dc.dot(s).mul(.5).add(.5),n=ou(r,t,i);e.context.irradiance.addAssign(n)}}class YN extends lv{static get type(){return"SpotLightNode"}constructor(e=null){super(e),this.coneCosNode=Na(0).setGroup(Ta),this.penumbraCosNode=Na(0).setGroup(Ta),this.cutoffDistanceNode=Na(0).setGroup(Ta),this.decayExponentNode=Na(0).setGroup(Ta),this.colorNode=Na(this.color).setGroup(Ta)}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 cu(r,s,t)}getLightCoord(e){const t=e.getNodeProperties(this);let r=t.projectionUV;return void 0===r&&(r=p_(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(y_(i)),u=this.getSpotAttenuation(e,o),l=n.length(),d=dv({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=Pl(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 ZN extends YN{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=Pl(r,Tn(e,0),0).r}else s=super.getSpotAttenuation(t);return s}}class JN extends lv{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=kl(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=uN(dc,this.lightProbe);e.context.irradiance.addAssign(t)}}const eS=dn(([e,t])=>{const r=e.abs().sub(t);return Po(jo(r,0)).add(qo(jo(r.x,r.y),0))});class tS extends YN{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=fn(0),r=this.penumbraCosNode,s=h_(this.light).mul(e.context.positionWorld||Qd);return pn(s.w.greaterThan(0),()=>{const e=s.xyz.div(s.w),i=eS(e.xy.sub(Tn(.5)),Tn(.5)),n=Da(-1,La(1,Mo(r)).sub(1));t.assign(lu(i.mul(-2).mul(n)))}),t}}const rS=new a,sS=new a;let iS=null;class nS extends lv{static get type(){return"RectAreaLightNode"}constructor(e=null){super(e),this.halfHeight=Na(new r).setGroup(Ta),this.halfWidth=Na(new r).setGroup(Ta),this.updateType=ti.RENDER}update(e){super.update(e);const{light:t}=this,r=e.camera.matrixWorldInverse;sS.identity(),rS.copy(t.matrixWorld),rS.premultiply(r),sS.extractRotation(rS),this.halfWidth.value.set(.5*t.width,0,0),this.halfHeight.value.set(0,.5*t.height,0),this.halfWidth.value.applyMatrix4(sS),this.halfHeight.value.applyMatrix4(sS)}setupDirectRectArea(e){let t,r;e.isAvailable("float32Filterable")?(t=Pl(iS.LTC_FLOAT_1),r=Pl(iS.LTC_FLOAT_2)):(t=Pl(iS.LTC_HALF_1),r=Pl(iS.LTC_HALF_2));const{colorNode:s,light:i}=this;return{lightColor:s,lightPosition:f_(i),halfWidth:this.halfWidth,halfHeight:this.halfHeight,ltc_1:t,ltc_2:r}}static setLTC(e){iS=e}}class aS{parseFunction(){d("Abstract function.")}}class oS{constructor(e,t,r="",s=""){this.type=e,this.inputs=t,this.name=r,this.precision=s}getCode(){d("Abstract function.")}}oS.isNodeFunction=!0;const uS=/^\s*(highp|mediump|lowp)?\s*([a-z_0-9]+)\s*([a-z_0-9]+)?\s*\(([\s\S]*?)\)/i,lS=/[a-z_0-9]+/gi,dS="#pragma main";class cS extends oS{constructor(e){const{type:t,inputs:r,name:s,precision:i,inputsCode:n,blockCode:a,headerCode:o}=(e=>{const t=(e=e.trim()).indexOf(dS),r=-1!==t?e.slice(t+12):e,s=r.match(uS);if(null!==s&&5===s.length){const i=s[4],n=[];let a=null;for(;null!==(a=lS.exec(i));)n.push(a);const o=[];let u=0;for(;u{let r=this._createNodeBuilder(e,e.material);try{t?await r.buildAsync():r.build()}catch(s){r=this._createNodeBuilder(e,new mg),t?await r.buildAsync():r.build(),o("TSL: "+s)}return r})().then(e=>(s=this._createNodeBuilderState(e),i.set(n,s),s.usedTimes++,r.nodeBuilderState=s,s));{let t=this._createNodeBuilder(e,e.material);try{t.build()}catch(r){t=this._createNodeBuilder(e,new mg),t.build();let s=r.stackTrace;!s&&r.stack&&(s=new Us(r.stack)),o("TSL: "+r,s)}s=this._createNodeBuilderState(t),i.set(n,s)}}s.usedTimes++,r.nodeBuilderState=s}return s}getForRenderAsync(e){const t=this.getForRender(e,!0);return t.then?t:Promise.resolve(t)}getForRenderDeferred(e){const t=this.get(e);if(void 0!==t.nodeBuilderState)return t.nodeBuilderState;const r=this.getForRenderCacheKey(e),s=this.nodeBuilderCache.get(r);return void 0!==s?(s.usedTimes++,t.nodeBuilderState=s,s):(!0!==t.pendingBuild&&(t.pendingBuild=!0,this._buildQueue.push(()=>this.getForRenderAsync(e).then(()=>{t.pendingBuild=!1})),this._processBuildQueue()),null)}_processBuildQueue(){if(this._buildInProgress||0===this._buildQueue.length)return;this._buildInProgress=!0;this._buildQueue.shift()().then(()=>{this._buildInProgress=!1,this._processBuildQueue()})}delete(e){if(e.isRenderObject){const t=this.get(e).nodeBuilderState;t.usedTimes--,0===t.usedTimes&&this.nodeBuilderCache.delete(this.getForRenderCacheKey(e))}return super.delete(e)}getForCompute(e){const t=this.get(e);let r=t.nodeBuilderState;if(void 0===r){const s=this.backend.createNodeBuilder(e,this.renderer);s.build(),r=this._createNodeBuilderState(s),t.nodeBuilderState=r}return r}_createNodeBuilderState(e){return new gN(e.vertexShader,e.fragmentShader,e.computeShader,e.getAttributesArray(),e.getBindings(),e.updateNodes,e.updateBeforeNodes,e.updateAfterNodes,e.observer,e.transforms)}getEnvironmentNode(e){this.updateEnvironment(e);let t=null;if(e.environmentNode&&e.environmentNode.isNode)t=e.environmentNode;else{const r=this.get(e);r.environmentNode&&(t=r.environmentNode)}return t}getBackgroundNode(e){this.updateBackground(e);let t=null;if(e.backgroundNode&&e.backgroundNode.isNode)t=e.backgroundNode;else{const r=this.get(e);r.backgroundNode&&(t=r.backgroundNode)}return t}getFogNode(e){return this.updateFog(e),e.fogNode||this.get(e).fogNode||null}getCacheKey(e,t){gS[0]=e,gS[1]=t;const r=this.renderer.info.calls,s=this.callHashCache.get(gS)||{};if(s.callId!==r){const i=this.getEnvironmentNode(e),n=this.getFogNode(e);t&&mS.push(t.getCacheKey(!0)),i&&mS.push(i.getCacheKey()),n&&mS.push(n.getCacheKey()),mS.push(this.renderer.getOutputRenderTarget()&&this.renderer.getOutputRenderTarget().multiview?1:0),mS.push(this.renderer.shadowMap.enabled?1:0),mS.push(this.renderer.shadowMap.type),s.callId=r,s.cacheKey=Vs(mS),this.callHashCache.set(gS,s),mS.length=0}return gS[0]=null,gS[1]=null,s.cacheKey}get isToneMappingState(){return!this.renderer.getRenderTarget()}updateBackground(e){const t=this.get(e),r=e.background;if(r){const s=0===e.backgroundBlurriness&&t.backgroundBlurriness>0||e.backgroundBlurriness>0&&0===t.backgroundBlurriness;if(t.background!==r||s){const i=this.getCacheNode("background",r,()=>{if(!0===r.isCubeTexture||r.mapping===he||r.mapping===pe||r.mapping===we){if(e.backgroundBlurriness>0||r.mapping===we)return Lf(r);{let e;return e=!0===r.isCubeTexture?Cc(r):Pl(r),Mg(e)}}if(!0===r.isTexture)return Pl(r,jl.flipY()).setUpdateMatrix(!0);!0!==r.isColor&&o("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=Fc("color","color",r).setGroup(Ta),t=Fc("density","float",r).setGroup(Ta);return xT(e,yT(t))}if(r.isFog){const e=Fc("color","color",r).setGroup(Ta),t=Fc("near","float",r).setGroup(Ta),s=Fc("far","float",r).setGroup(Ta);return xT(e,fT(t,s))}o("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?Cc(r):!0===r.isTexture?Pl(r):void o("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 pS.get(e)!==this.getOutputCacheKey()}getOutputNode(e){const t=this.renderer,r=this.getOutputCacheKey(),s=e.isArrayTexture?Pl(e,jl).depth(zl("gl_ViewID_OVR")).renderOutput(t.toneMapping,t.currentColorSpace):Pl(e,jl).renderOutput(t.toneMapping,t.currentColorSpace);return pS.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 qN,this.nodeBuilderCache=new Map,this.cacheLib={}}}const yS=new nt;class bS{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 AS(i.framebufferWidth,i.framebufferHeight,{format:Ee,type:ke,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=-5&i.layers.mask,a.layers.mask=-3&i.layers.mask;const o=e.parent,u=i.cameras;MS(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 PS(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 DS(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(this._renderTarget,this._mrt),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(){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 fS(this,r),this._animation=new py(this,this._nodes,this.info),this._attributes=new Ry(r,this.info),this._background=new cN(this,this._nodes),this._geometries=new Cy(this._attributes,this.info),this._textures=new Ky(this,r,this.info),this._pipelines=new Uy(r,this._nodes,this.info),this._bindings=new Iy(r,this._nodes,this._textures,this._attributes,this._pipelines,this.info),this._objects=new by(this,this._nodes,this._geometries,this._pipelines,this._bindings,this.info),this._renderLists=new $y(this.lighting),this._bundles=new _S,this._renderContexts=new jy(this),this._animation.start(),this._initialized=!0,this._inspector.init(),e(this)})),this._initPromise}get domElement(){return this._canvasTarget.domElement}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._handleObjectFunction,u=this._compilationPromises;null===r&&(r=e);const l=!0===e.isScene?e:!0===r.isScene?r:IS,d=this.needsFrameBufferTarget&&null===this._renderTarget?this._getFrameBufferTarget():this._renderTarget||this._outputRenderTarget,c=this._renderContexts.get(d,this._mrt),h=this._activeMipmapLevel,p=[];this._currentRenderContext=c,this._currentRenderObjectFunction=this.renderObject,this._handleObjectFunction=this._createObjectPipeline,this._compilationPromises=p,s.renderId++,s.update(),c.depth=this.depth,c.stencil=this.stencil,c.clippingContext||(c.clippingContext=new bS),c.clippingContext.updateGlobal(l,t),l.onBeforeRender(this,e,t,d);const g=this._renderLists.get(l,t);if(g.begin(),this._projectObject(e,t,0,g,c.clippingContext),r!==e&&r.traverseVisible(function(e){e.isLight&&e.layers.test(t.layers)&&g.pushLight(e)}),g.finish(),null!==d){this._textures.updateRenderTarget(d,h);const e=this._textures.get(d);c.textures=e.textures,c.depthTexture=e.depthTexture}else c.textures=null,c.depthTexture=null;r!==e?this._background.update(r,g,c):this._background.update(l,g,c);const m=g.opaque,f=g.transparent,y=g.transparentDoublePass,b=g.lightsNode;!0===this.opaque&&m.length>0&&this._renderObjects(m,t,l,b),!0===this.transparent&&f.length>0&&this._renderTransparents(f,y,t,l,b),s.renderId=i,this._currentRenderContext=n,this._currentRenderObjectFunction=a,this._handleObjectFunction=o,this._compilationPromises=u;for(const e of p){const t=this._objects.get(e.object,e.material,e.scene,e.camera,e.lightsNode,e.renderContext,e.clippingContext,e.passId);t.drawRange=e.object.geometry.drawRange,t.group=e.group,this._geometries.updateForRender(t),await this._nodes.getForRenderAsync(t),this._nodes.updateBefore(t),this._nodes.updateForRender(t),this._bindings.updateForRender(t);const r=[];this._pipelines.getForRender(t,r),r.length>0&&await Promise.all(r),this._nodes.updateAfter(t),await xt()}}async renderAsync(e,t){v('Renderer: "renderAsync()" has been deprecated. Use "render()" and "await renderer.init();" when creating the renderer.'),await this.init(),this.render(e,t)}async waitForGPU(){o("Renderer: waitForGPU() has been removed. Read https://github.com/mrdoob/three.js/issues/32012 for more information.")}set inspector(e){null!==this._inspector&&this._inspector.setRenderer(null),this._inspector=e,this._inspector.setRenderer(this)}get inspector(){return this._inspector}set highPrecision(e){const t=this.contextNode.value;!0===e?(t.modelViewMatrix=Wd,t.modelNormalViewMatrix=Hd):this.highPrecision&&(delete t.modelViewMatrix,delete t.modelNormalViewMatrix)}get highPrecision(){const e=this.contextNode.value;return e.modelViewMatrix===Wd&&e.modelNormalViewMatrix===Hd}setMRT(e){return this._mrt=e,this}getMRT(){return this._mrt}getOutputBufferType(){return this._outputBufferType}getColorBufferType(){return v('Renderer: ".getColorBufferType()" has been renamed to ".getOutputBufferType()".'),this.getOutputBufferType()}_onDeviceLost(e){let t=`THREE.WebGPURenderer: ${e.api} Device Lost:\n\nMessage: ${e.message}`;e.reason&&(t+=`\nReason: ${e.reason}`),o(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{u.removeEventListener("dispose",e),l.dispose(),this._frameBufferTargets.delete(u)};u.addEventListener("dispose",e),this._frameBufferTargets.set(u,l)}const d=this.getOutputRenderTarget();return l.depthBuffer=a,l.stencilBuffer=o,null!==d?l.setSize(d.width,d.height,d.depth):l.setSize(i,n,1),l.viewport.copy(u._viewport),l.scissor.copy(u._scissor),l.viewport.multiplyScalar(u._pixelRatio),l.scissor.multiplyScalar(u._pixelRatio),l.scissorTest=u._scissorTest,l.multiview=null!==d&&d.multiview,l.resolveDepthBuffer=null===d||d.resolveDepthBuffer,l._autoAllocateDepthBuffer=null!==d&&d._autoAllocateDepthBuffer,l}_renderScene(e,t,r=!0){if(!0===this._isDeviceLost)return;const s=r?this._getFrameBufferTarget():null,i=this._nodes.nodeFrame,n=i.renderId,a=this._currentRenderContext,o=this._currentRenderObjectFunction,u=this._handleObjectFunction;this._callDepth++;const l=!0===e.isScene?e:IS,d=this._renderTarget||this._outputRenderTarget,c=this._activeCubeFace,h=this._activeMipmapLevel;let p;null!==s?(p=s,this.setRenderTarget(p)):p=d;const g=this._renderContexts.get(p,this._mrt,this._callDepth);this._currentRenderContext=g,this._currentRenderObjectFunction=this._renderObjectFunction||this.renderObject,this._handleObjectFunction=this._renderObjectDirect,this.info.calls++,this.info.render.calls++,this.info.render.frameCalls++,i.renderId=this.info.calls,this.backend.updateTimeStampUID(g),this.inspector.beginRender(this.backend.getTimestampUID(g),e,t,p);const m=this.xr;if(!1===m.isPresenting){let e=!1;if(!0===this.reversedDepthBuffer&&!0!==t.reversedDepth){if(t._reversedDepth=!0,t.isArrayCamera)for(const e of t.cameras)e._reversedDepth=!0;e=!0}const r=this.coordinateSystem;if(t.coordinateSystem!==r){if(t.coordinateSystem=r,t.isArrayCamera)for(const e of t.cameras)e.coordinateSystem=r;e=!0}if(!0===e&&(t.updateProjectionMatrix(),t.isArrayCamera))for(const e of t.cameras)e.updateProjectionMatrix()}!0===e.matrixWorldAutoUpdate&&e.updateMatrixWorld(),null===t.parent&&!0===t.matrixWorldAutoUpdate&&t.updateMatrixWorld(),!0===m.enabled&&!0===m.isPresenting&&(!0===m.cameraAutoUpdate&&m.updateCamera(t),t=m.getCamera());const f=this._canvasTarget;let y=f._viewport,b=f._scissor,x=f._pixelRatio;null!==p&&(y=p.viewport,b=p.scissor,x=1),this.getDrawingBufferSize(OS),VS.set(0,0,OS.width,OS.height);const T=void 0===y.minDepth?0:y.minDepth,_=void 0===y.maxDepth?1:y.maxDepth;g.viewportValue.copy(y).multiplyScalar(x).floor(),g.viewportValue.width>>=h,g.viewportValue.height>>=h,g.viewportValue.minDepth=T,g.viewportValue.maxDepth=_,g.viewport=!1===g.viewportValue.equals(VS),g.scissorValue.copy(b).multiplyScalar(x).floor(),g.scissor=f._scissorTest&&!1===g.scissorValue.equals(VS),g.scissorValue.width>>=h,g.scissorValue.height>>=h,g.clippingContext||(g.clippingContext=new bS),g.clippingContext.updateGlobal(l,t),l.onBeforeRender(this,e,t,p);const v=t.isArrayCamera?GS:kS;t.isArrayCamera||(zS.multiplyMatrices(t.projectionMatrix,t.matrixWorldInverse),v.setFromProjectionMatrix(zS,t.coordinateSystem,t.reversedDepth));const N=this._renderLists.get(e,t);if(N.begin(),this._projectObject(e,t,0,N,g.clippingContext),N.finish(),!0===this.sortObjects&&N.sort(this._opaqueSort,this._transparentSort),null!==p){this._textures.updateRenderTarget(p,h);const e=this._textures.get(p);g.textures=e.textures,g.depthTexture=e.depthTexture,g.width=e.width,g.height=e.height,g.renderTarget=p,g.depth=p.depthBuffer,g.stencil=p.stencilBuffer}else g.textures=null,g.depthTexture=null,g.width=OS.width,g.height=OS.height,g.depth=this.depth,g.stencil=this.stencil;g.width>>=h,g.height>>=h,g.activeCubeFace=c,g.activeMipmapLevel=h,g.occlusionQueryCount=N.occlusionQueryCount,g.scissorValue.max($S.set(0,0,0,0)),g.scissorValue.x+g.scissorValue.width>g.width&&(g.scissorValue.width=Math.max(g.width-g.scissorValue.x,0)),g.scissorValue.y+g.scissorValue.height>g.height&&(g.scissorValue.height=Math.max(g.height-g.scissorValue.y,0)),this._background.update(l,N,g),g.camera=t,this.backend.beginRender(g);const{bundles:S,lightsNode:R,transparentDoublePass:A,transparent:E,opaque:w}=N;return S.length>0&&this._renderBundles(S,l,R),!0===this.opaque&&w.length>0&&this._renderObjects(w,t,l,R),!0===this.transparent&&E.length>0&&this._renderTransparents(E,A,t,l,R),this.backend.finishRender(g),i.renderId=n,this._currentRenderContext=a,this._currentRenderObjectFunction=o,this._handleObjectFunction=u,this._callDepth--,null!==s&&(this.setRenderTarget(d,c,h),this._renderOutput(p)),l.onAfterRender(this,e,t,p),this.inspector.finishRender(this.backend.getTimestampUID(g)),g}_setXRLayerSize(e,t){this._canvasTarget._width=e,this._canvasTarget._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.capabilities.getMaxAnisotropy()}getActiveCubeFace(){return this._activeCubeFace}getActiveMipmapLevel(){return this._activeMipmapLevel}async setAnimationLoop(e){!1===this._initialized&&await this.init(),this._animation.setAnimationLoop(e)}getAnimationLoop(){return this._animation.getAnimationLoop()}async getArrayBufferAsync(e){return await this.backend.getArrayBufferAsync(e)}getContext(){return this.backend.getContext()}getPixelRatio(){return this._canvasTarget.getPixelRatio()}getDrawingBufferSize(e){return this._canvasTarget.getDrawingBufferSize(e)}getSize(e){return this._canvasTarget.getSize(e)}setPixelRatio(e=1){this._canvasTarget.setPixelRatio(e)}setDrawingBufferSize(e,t,r){this.xr&&this.xr.isPresenting||this._canvasTarget.setDrawingBufferSize(e,t,r)}setSize(e,t,r=!0){this.xr&&this.xr.isPresenting||this._canvasTarget.setSize(e,t,r)}setOpaqueSort(e){this._opaqueSort=e}setTransparentSort(e){this._transparentSort=e}getScissor(e){return this._canvasTarget.getScissor(e)}setScissor(e,t,r,s){this._canvasTarget.setScissor(e,t,r,s)}getScissorTest(){return this._canvasTarget.getScissorTest()}setScissorTest(e){this._canvasTarget.setScissorTest(e),this.backend.setScissorTest(e)}getViewport(e){return this._canvasTarget.getViewport(e)}setViewport(e,t,r,s,i=0,n=1){this._canvasTarget.setViewport(e,t,r,s,i,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!0===this.reversedDepthBuffer?1-this._clearDepth: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)throw new Error('Renderer: .clear() called before the backend is initialized. Use "await renderer.init();" before before using this method.');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.get(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;const t=this.backend.getClearColor();i.clearColorValue.r=t.r,i.clearColorValue.g=t.g,i.clearColorValue.b=t.b,i.clearColorValue.a=t.a,i.clearDepthValue=this.getClearDepth(),i.clearStencilValue=this.getClearStencil(),i.activeCubeFace=this.getActiveCubeFace(),i.activeMipmapLevel=this.getActiveMipmapLevel()}this.backend.clear(e,t,r,i),null!==s&&null===this._renderTarget&&this._renderOutput(s)}clearColor(){this.clear(!0,!1,!1)}clearDepth(){this.clear(!1,!0,!1)}clearStencil(){this.clear(!1,!1,!0)}async clearAsync(e=!0,t=!0,r=!0){v('Renderer: "clearAsync()" has been deprecated. Use "clear()" and "await renderer.init();" when creating the renderer.'),await this.init(),this.clear(e,t,r)}async clearColorAsync(){v('Renderer: "clearColorAsync()" has been deprecated. Use "clearColor()" and "await renderer.init();" when creating the renderer.'),this.clear(!0,!1,!1)}async clearDepthAsync(){v('Renderer: "clearDepthAsync()" has been deprecated. Use "clearDepth()" and "await renderer.init();" when creating the renderer.'),this.clear(!1,!0,!1)}async clearStencilAsync(){v('Renderer: "clearStencilAsync()" has been deprecated. Use "clearStencil()" and "await renderer.init();" when creating the renderer.'),this.clear(!1,!1,!0)}get needsFrameBufferTarget(){const e=this.currentToneMapping!==m,t=this.currentColorSpace!==p.workingColorSpace;return e||t}get samples(){return this._samples}get currentSamples(){let e=this._samples;return null!==this._renderTarget?e=this._renderTarget.samples:this.needsFrameBufferTarget&&(e=0),e}get currentToneMapping(){return this.isOutputTarget?this.toneMapping:m}get currentColorSpace(){return this.isOutputTarget?this.outputColorSpace:p.workingColorSpace}get isOutputTarget(){return this._renderTarget===this._outputRenderTarget||null===this._renderTarget}dispose(){if(!0===this._initialized){this.info.dispose(),this.backend.dispose(),this._animation.dispose(),this._objects.dispose(),this._geometries.dispose(),this._pipelines.dispose(),this._nodes.dispose(),this._bindings.dispose(),this._renderLists.dispose(),this._renderContexts.dispose(),this._textures.dispose();for(const e of this._frameBufferTargets.keys())e.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}setCanvasTarget(e){this._canvasTarget.removeEventListener("resize",this._onCanvasTargetResize),this._canvasTarget=e,this._canvasTarget.addEventListener("resize",this._onCanvasTargetResize)}getCanvasTarget(){return this._canvasTarget}_resetXRState(){this.backend.setXRTarget(null),this.setOutputRenderTarget(null),this.setRenderTarget(null);for(const e of this._frameBufferTargets.keys())e.dispose()}setRenderObjectFunction(e){this._renderObjectFunction=e}getRenderObjectFunction(){return this._renderObjectFunction}compute(e,t=null){if(!0===this._isDeviceLost)return;if(!1===this._initialized)return d("Renderer: .compute() called before the backend is initialized. Try using .computeAsync() instead."),this.computeAsync(e,t);const r=this._nodes.nodeFrame,s=r.renderId;this.info.calls++,this.info.compute.calls++,this.info.compute.frameCalls++,r.renderId=this.info.calls,this.backend.updateTimeStampUID(e),this.inspector.beginCompute(this.backend.getTimestampUID(e),e);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.deleteForCompute(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,this.inspector.finishCompute(this.backend.getTimestampUID(e))}async computeAsync(e,t=null){!1===this._initialized&&await this.init(),this.compute(e,t)}async hasFeatureAsync(e){return v('Renderer: "hasFeatureAsync()" has been deprecated. Use "hasFeature()" and "await renderer.init();" when creating the renderer.'),await this.init(),this.hasFeature(e)}async resolveTimestampsAsync(e="render"){return!1===this._initialized&&await this.init(),this.backend.resolveTimestampsAsync(e)}hasFeature(e){if(!1===this._initialized)throw new Error('Renderer: .hasFeature() called before the backend is initialized. Use "await renderer.init();" before before using this method.');return this.backend.hasFeature(e)}hasInitialized(){return this._initialized}async initTextureAsync(e){v('Renderer: "initTextureAsync()" has been deprecated. Use "initTexture()" and "await renderer.init();" when creating the renderer.'),await this.init(),this.initTexture(e)}initTexture(e){if(!1===this._initialized)throw new Error('Renderer: .initTexture() called before the backend is initialized. Use "await renderer.init();" before before using this method.');this._textures.updateTexture(e)}initRenderTarget(e){if(!1===this._initialized)throw new Error('Renderer: .initRenderTarget() called before the backend is initialized. Use "await renderer.init();" before before using this method.');this._textures.updateRenderTarget(e);const t=this._textures.get(e),r=this._renderContexts.get(e);r.textures=t.textures,r.depthTexture=t.depthTexture,r.width=t.width,r.height=t.height,r.renderTarget=e,r.depth=e.depthBuffer,r.stencil=e.stencilBuffer,this.backend.initRenderTarget(r)}copyFramebufferToTexture(e,t=null){if(null!==t)if(t.isVector2)t=$S.set(t.x,t.y,e.image.width,e.image.height).floor();else{if(!t.isVector4)return void o("Renderer.copyFramebufferToTexture: Invalid rectangle.");t=$S.copy(t).floor()}else t=$S.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),this._inspector.copyFramebufferToTexture(e)}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),this._inspector.copyTextureToTexture(e,t)}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?GS:kS;if(!e.frustumCulled||n.intersectsSprite(e,t)){!0===this.sortObjects&&$S.setFromMatrixPosition(e.matrixWorld).applyMatrix4(zS);const{geometry:t,material:n}=e;n.visible&&s.push(e,t,n,r,$S.z,null,i)}}else if(e.isLineLoop)o("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?GS:kS;if(!e.frustumCulled||n.intersectsObject(e,t)){const{geometry:t,material:n}=e;if(!0===this.sortObjects&&(null===t.boundingSphere&&t.computeBoundingSphere(),$S.copy(t.boundingSphere.center).applyMatrix4(e.matrixWorld).applyMatrix4(zS)),Array.isArray(n)){const a=t.groups;for(let o=0,u=a.length;o0){for(const{material:e}of t)e.side=L;this._renderObjects(t,r,s,i,"backSide");for(const{material:e}of t)e.side=Nt;this._renderObjects(e,r,s,i);for(const{material:e}of t)e.side=P}else this._renderObjects(e,r,s,i)}_renderObjects(e,t,r,s,i=null){for(let n=0,a=e.length;n(t.not().discard(),e))(u)}}e.depthNode&&e.depthNode.isNode&&(l=e.depthNode),e.castShadowPositionNode&&e.castShadowPositionNode.isNode?o=e.castShadowPositionNode:e.positionNode&&e.positionNode.isNode&&(o=e.positionNode),r={version:t,colorNode:u,depthNode:l,positionNode:o},this._cacheShadowNodes.set(e,r)}return r}renderObject(e,t,r,s,i,n,a,o=null,u=null){let l,d,c,h,p=!1;if(e.onBeforeRender(this,t,r,s,i,n),!0===i.allowOverride&&null!==t.overrideMaterial){const e=t.overrideMaterial;if(p=!0,l=e.isNodeMaterial?e.colorNode:null,d=e.isNodeMaterial?e.depthNode:null,c=e.isNodeMaterial?e.positionNode:null,h=t.overrideMaterial.side,i.positionNode&&i.positionNode.isNode&&(e.positionNode=i.positionNode),e.alphaTest=i.alphaTest,e.alphaMap=i.alphaMap,e.transparent=i.transparent||i.transmission>0||i.transmissionNode&&i.transmissionNode.isNode||i.backdropNode&&i.backdropNode.isNode,e.isShadowPassMaterial){const{colorNode:t,depthNode:r,positionNode:s}=this._getShadowNodes(i);this.shadowMap.type===ht?e.side=null!==i.shadowSide?i.shadowSide:i.side:e.side=null!==i.shadowSide?i.shadowSide:WS[i.side],null!==t&&(e.colorNode=t),null!==r&&(e.depthNode=r),null!==s&&(e.positionNode=s)}i=e}!0===i.transparent&&i.side===P&&!1===i.forceSinglePass?(i.side=L,this._handleObjectFunction(e,i,t,r,a,n,o,"backSide"),i.side=Nt,this._handleObjectFunction(e,i,t,r,a,n,o,u),i.side=P):this._handleObjectFunction(e,i,t,r,a,n,o,u),p&&(t.overrideMaterial.colorNode=l,t.overrideMaterial.depthNode=d,t.overrideMaterial.positionNode=c,t.overrideMaterial.side=h),e.onAfterRender(this,t,r,s,i,n)}hasCompatibility(e){if(!1===this._initialized)throw new Error('Renderer: .hasCompatibility() called before the backend is initialized. Use "await renderer.init();" before using this method.');return this.backend.hasCompatibility(e)}_renderObjectDirect(e,t,r,s,i,n,a,o){const u=this._objects.get(e,t,r,s,i,this._currentRenderContext,a,o);if(u.drawRange=e.geometry.drawRange,u.group=n,null!==this._currentRenderBundle){this.backend.get(this._currentRenderBundle).renderObjects.push(u),u.bundle=this._currentRenderBundle.bundleGroup}const l=this._nodes.needsRefresh(u);l&&(this._nodes.updateBefore(u),this._geometries.updateForRender(u),this._nodes.updateForRender(u),this._bindings.updateForRender(u)),this._pipelines.updateForRender(u),this._pipelines.isReady(u)&&(this.backend.draw(u,this.info),l&&this._nodes.updateAfter(u))}_createObjectPipeline(e,t,r,s,i,n,a,o){if(null!==this._compilationPromises)return void this._compilationPromises.push({object:e,material:t,scene:r,camera:s,lightsNode:i,group:n,clippingContext:a,passId:o,renderContext:this._currentRenderContext});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)}_onCanvasTargetResize(){this._initialized&&this.backend.updateSize()}get compile(){return this.compileAsync}}class qS{constructor(e=""){this.name=e,this.visibility=0}setVisibility(e){this.visibility|=e}getVisibility(){return this.visibility}clone(){return Object.assign(new this.constructor,this)}}class jS extends qS{constructor(e,t=null){super(e),this.isBuffer=!0,this.bytesPerElement=Float32Array.BYTES_PER_ELEMENT,this._buffer=t,this._updateRanges=[]}get updateRanges(){return this._updateRanges}addUpdateRange(e,t){this.updateRanges.push({start:e,count:t})}clearUpdateRanges(){this.updateRanges.length=0}get byteLength(){return(e=this._buffer.byteLength)+(Sy-e%Sy)%Sy;var e}get buffer(){return this._buffer}update(){return!0}}class XS extends jS{constructor(e,t=null){super(e,t),this.isUniformBuffer=!0}}let KS=0;class QS extends XS{constructor(e,t){super("UniformBuffer_"+KS++,e?e.value:null),this.nodeUniform=e,this.groupNode=t,this.isNodeUniformBuffer=!0}set updateRanges(e){this.nodeUniform.updateRanges=e}get updateRanges(){return this.nodeUniform.updateRanges}addUpdateRange(e,t){this.nodeUniform.addUpdateRange(e,t)}clearUpdateRanges(){this.nodeUniform.clearUpdateRanges()}get buffer(){return this.nodeUniform.value}}class YS extends XS{constructor(e){super(e),this.isUniformsGroup=!0,this._values=null,this.uniforms=[],this._updateRangeCache=new Map}addUniformUpdateRange(e){const t=e.index;if(!0!==this._updateRangeCache.has(t)){const r=this.updateRanges,s={start:e.offset,count:e.itemSize};r.push(s),this._updateRangeCache.set(t,s)}}clearUpdateRanges(){this._updateRangeCache.clear(),super.clearUpdateRanges()}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.generation=null,this.version=-1},this.texture=t,this.version=t?t.version:-1,this.generation=null,this.samplerKey="",this.isSampler=!0}set texture(e){this._texture!==e&&(this._texture&&this._texture.removeEventListener("dispose",this._onTextureDispose),this._texture=e,this.generation=null,this.version=-1,this._texture&&this._texture.addEventListener("dispose",this._onTextureDispose))}get texture(){return this._texture}update(){const{texture:e,version:t}=this;return t!==e.version&&(this.version=e.version,!0)}clone(){const e=super.clone();return e._texture=null,e._onTextureDispose=()=>{e.generation=null,e.version=-1},e.texture=this.texture,e}}let tR=0;class rR extends eR{constructor(e,t){super(e,t),this.id=tR++,this.store=!1,this.mipLevel=0,this.isSampledTexture=!0}}class sR extends rR{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 iR extends sR{constructor(e,t,r,s=null){super(e,t,r,s),this.isSampledCubeTexture=!0}}class nR extends sR{constructor(e,t,r,s=null){super(e,t,r,s),this.isSampledTexture3D=!0}}const aR={bitcast_int_uint:new cT("uint tsl_bitcast_int_to_uint ( int x ) { return floatBitsToUint( intBitsToFloat ( x ) ); }"),bitcast_uint_int:new cT("uint tsl_bitcast_uint_to_int ( uint x ) { return floatBitsToInt( uintBitsToFloat ( x ) ); }")},oR={textureDimensions:"textureSize",equals:"equal",bitcast_float_int:"floatBitsToInt",bitcast_int_float:"intBitsToFloat",bitcast_uint_float:"uintBitsToFloat",bitcast_float_uint:"floatBitsToUint",bitcast_uint_int:"tsl_bitcast_uint_to_int",bitcast_int_uint:"tsl_bitcast_int_to_uint",floatpack_snorm_2x16:"packSnorm2x16",floatpack_unorm_2x16:"packUnorm2x16",floatpack_float16_2x16:"packHalf2x16",floatunpack_snorm_2x16:"unpackSnorm2x16",floatunpack_unorm_2x16:"unpackUnorm2x16",floatunpack_float16_2x16:"unpackHalf2x16"},uR={low:"lowp",medium:"mediump",high:"highp"},lR={swizzleAssign:!0,storageBuffer:!1},dR={perspective:"smooth",linear:"noperspective"},cR={centroid:"centroid"},hR="\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 highp sampler2DShadow;\nprecision highp sampler2DArrayShadow;\nprecision highp samplerCubeShadow;\n";class pR extends HN{constructor(e,t){super(e,t,new hS),this.uniformGroups={},this.transforms=[],this.extensions={},this.builtins={vertex:[],fragment:[],compute:[]}}needsToWorkingColorSpace(e){return!0===e.isVideoTexture&&e.colorSpace!==T}_include(e){const t=aR[e];return t.build(this),this.addInclude(t),t}getMethod(e){return void 0!==aR[e]&&this._include(e),oR[e]||e}getBitcastMethod(e,t){return this.getMethod(`bitcast_${t}_${e}`)}getFloatPackingMethod(e){return this.getMethod(`floatpack_${e}_2x16`)}getFloatUnpackingMethod(e){return this.getMethod(`floatunpack_${e}_2x16`)}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?He:We;2===s?n=i?Ft:W:3===s?n=i?Lt:Xe:4===s&&(n=i?Pt:Ee);const a={Float32Array:Q,Uint8Array:ke,Uint16Array:ze,Uint32Array:S,Int8Array:Ve,Int16Array:Ge,Int32Array:R,Uint8ClampedArray:ke},o=Math.pow(2,Math.ceil(Math.log2(Math.sqrt(r/s))));let u=Math.ceil(r/s/o);o*u*s0?i:"";t=`${r.name} {\n\t${s} ${e.name}[${n}];\n};\n`}else{const t=e.groupNode.name;if(void 0===s[t]){const e=this.uniformGroups[t];if(void 0!==e){const r=[];for(const t of e.uniforms){const e=t.getType(),s=this.getVectorType(e),i=t.nodeUniform.node.precision;let n=`${s} ${t.name};`;null!==i&&(n=uR[i]+" "+n),r.push("\t"+n)}s[t]=r}}i=!0}if(!i){const s=e.node.precision;null!==s&&(t=uR[s]+" "+t),t="uniform "+t,r.push(t)}}let i="";for(const e in s){const t=s[e];i+=this._getGLSLUniformStruct(e,t.join("\n"))+"\n"}return i+=r.join("\n"),i}getTypeFromAttribute(e){let t=super.getTypeFromAttribute(e);if(/^[iu]/.test(t)&&e.gpuType!==R){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+=`${dR[s.interpolationType]||s.interpolationType} ${cR[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+=`${dR[e.interpolationType]||e.interpolationType} ${cR[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`}getSubgroupSize(){o("GLSLNodeBuilder: WebGLBackend does not support the subgroupSize node")}getInvocationSubgroupIndex(){o("GLSLNodeBuilder: WebGLBackend does not support the invocationSubgroupIndex node")}getSubgroupIndex(){o("GLSLNodeBuilder: WebGLBackend does not support the subgroupIndex node")}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=lR[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)}lR[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 sR(i.name,i.node,s),u.push(a);else if("cubeTexture"===t||"cubeDepthTexture"===t)a=new iR(i.name,i.node,s),u.push(a);else if("texture3D"===t)a=new nR(i.name,i.node,s),u.push(a);else if("buffer"===t){i.name=`buffer${e.id}`;const t=this.getSharedDataFromNode(e);let r=t.buffer;void 0===r&&(e.name=`NodeBuffer_${e.id}`,r=new QS(e,s),r.name=e.name,t.buffer=r),u.push(r),a=r}else{let e=this.uniformGroups[o];void 0===e?(e=new JS(o,s),this.uniformGroups[o]=e,u.push(e)):-1===u.indexOf(e)&&u.push(e),a=this.getNodeUniform(i,t);const r=a.name;e.uniforms.some(e=>e.name===r)||e.addUniform(a)}n.uniformGPU=a}return i}}let gR=null,mR=null;class fR{constructor(e={}){this.parameters=Object.assign({},e),this.data=new WeakMap,this.renderer=null,this.domElement=null,this.timestampQueryPool={[Dt.RENDER]:null,[Dt.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(){}updateSampler(){}createDefaultTexture(){}createTexture(){}updateTexture(){}generateMipmaps(){}destroyTexture(){}async copyTextureToBuffer(){}copyTextureToTexture(){}copyFramebufferToTexture(){}createAttribute(){}createIndexAttribute(){}createStorageAttribute(){}updateAttribute(){}destroyAttribute(){}getContext(){}updateSize(){}updateViewport(){}updateTimeStampUID(e){const t=this.get(e),r=this.renderer.info.frame;let s;s=!0===e.isComputeNode?"c:"+this.renderer.info.compute.frameCalls:"r:"+this.renderer.info.render.frameCalls,t.timestampUID=s+":"+e.id+":f"+r}getTimestampUID(e){return this.get(e).timestampUID}getTimestampFrames(e){const t=this.timestampQueryPool[e];return t?t.getTimestampFrames():[]}_getQueryPool(e){const t=e.startsWith("c:")?Dt.COMPUTE:Dt.RENDER;return this.timestampQueryPool[t]}getTimestamp(e){return this._getQueryPool(e).getTimestamp(e)}hasTimestamp(e){return this._getQueryPool(e).hasTimestamp(e)}isOccluded(){}async resolveTimestampsAsync(e="render"){if(!this.trackTimestamp)return void v("WebGPURenderer: Timestamp tracking is disabled.");const t=this.timestampQueryPool[e];if(!t)return;const r=await t.resolveQueriesAsync();return this.renderer.info[e].timestamp=r,r}async getArrayBufferAsync(){}async hasFeatureAsync(){}hasFeature(){}getDrawingBufferSize(){return gR=gR||new t,this.renderer.getDrawingBufferSize(gR)}setScissorTest(){}getClearColor(){const e=this.renderer;return mR=mR||new Qy,e.getClearColor(mR),mR.getRGB(mR),mR}getDomElement(){let e=this.domElement;return null===e&&(e=void 0!==this.parameters.canvas?this.parameters.canvas:Ut(),"setAttribute"in e&&e.setAttribute("data-engine",`three.js r${Tt} webgpu`),this.domElement=e),e}hasCompatibility(){return!1}initRenderTarget(){}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)}deleteBindGroupData(){}dispose(){}}let yR,bR,xR=0;class TR{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 _R{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===R,id:xR++};if(e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute){const e=this._createBuffer(s,t,i,n);d=new TR(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;e0?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 SR,RR,AR,ER=!1;class wR{constructor(e){this.backend=e,this.gl=e.gl,this.extensions=e.extensions,this.defaultTextures={},this._srcFramebuffer=null,this._dstFramebuffer=null,!1===ER&&(this._init(),ER=!0)}_init(){const e=this.gl;SR={[Gr]:e.REPEAT,[ve]:e.CLAMP_TO_EDGE,[kr]:e.MIRRORED_REPEAT},RR={[B]:e.NEAREST,[zr]:e.NEAREST_MIPMAP_NEAREST,[yt]:e.NEAREST_MIPMAP_LINEAR,[de]:e.LINEAR,[ft]:e.LINEAR_MIPMAP_NEAREST,[Z]:e.LINEAR_MIPMAP_LINEAR},AR={[qr]:e.NEVER,[Hr]:e.ALWAYS,[E]:e.LESS,[w]:e.LEQUAL,[Wr]:e.EQUAL,[M]:e.GEQUAL,[C]:e.GREATER,[$r]: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];d("WebGLBackend: 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?jr:p.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===g?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),r===n.UNSIGNED_INT_10F_11F_11F_REV&&(o=n.R11F_G11F_B10F)}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?jr:p.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===g?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=p.getPrimaries(p.workingColorSpace),a=t.colorSpace===T?null:p.getPrimaries(t.colorSpace),o=t.colorSpace===T||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,SR[t.wrapS]),r.texParameteri(e,r.TEXTURE_WRAP_T,SR[t.wrapT]),e!==r.TEXTURE_3D&&e!==r.TEXTURE_2D_ARRAY||t.isArrayTexture||r.texParameteri(e,r.TEXTURE_WRAP_R,SR[t.wrapR]),r.texParameteri(e,r.TEXTURE_MAG_FILTER,RR[t.magFilter]);const u=void 0!==t.mipmaps&&t.mipmaps.length>0,l=t.minFilter===de&&u?Z:t.minFilter;if(r.texParameteri(e,r.TEXTURE_MIN_FILTER,RR[l]),t.compareFunction&&(r.texParameteri(e,r.TEXTURE_COMPARE_MODE,r.COMPARE_REF_TO_TEXTURE),r.texParameteri(e,r.TEXTURE_COMPARE_FUNC,AR[t.compareFunction])),!0===s.has("EXT_texture_filter_anisotropic")){if(t.magFilter===B)return;if(t.minFilter!==yt&&t.minFilter!==Z)return;if(t.type===Q&&!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.capabilities.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})}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){const t=Xr(s.width,s.height,e.format,e.type);for(const i of e.layerUpdates){const e=s.data.subarray(i*t/s.data.BYTES_PER_ELEMENT,(i+1)*t/s.data.BYTES_PER_ELEMENT);r.texSubImage3D(r.TEXTURE_2D_ARRAY,0,0,0,i,s.width,s.height,1,o,u,e)}e.clearLayerUpdates()}else r.texSubImage3D(r.TEXTURE_2D_ARRAY,0,0,0,0,s.width,s.height,s.depth,o,u,s.data)}else if(e.isData3DTexture){const e=t.image;r.texSubImage3D(r.TEXTURE_3D,0,0,0,0,e.width,e.height,e.depth,o,u,e.data)}else if(e.isVideoTexture)e.update(),r.texImage2D(a,0,l,o,u,t.image);else{const n=e.mipmaps;if(n.length>0)for(let e=0,t=n.length;e0,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();a.state.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),a.state.bindFramebuffer(o.READ_FRAMEBUFFER,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}dispose(){const{gl:e}=this;null!==this._srcFramebuffer&&e.deleteFramebuffer(this._srcFramebuffer),null!==this._dstFramebuffer&&e.deleteFramebuffer(this._dstFramebuffer)}}function CR(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 MR{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 BR{constructor(e){this.backend=e,this.maxAnisotropy=null,this.maxUniformBlockSize=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}getUniformBufferLimit(){if(null!==this.maxUniformBlockSize)return this.maxUniformBlockSize;const e=this.backend.gl;return this.maxUniformBlockSize=e.getParameter(e.MAX_UNIFORM_BLOCK_SIZE),this.maxUniformBlockSize}}const FR={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",WEBGL_compressed_texture_s3tc:"texture-compression-s3tc",EXT_texture_compression_bptc:"texture-compression-bc",EXT_disjoint_timer_query_webgl2:"timestamp-query",OVR_multiview2:"OVR_multiview2"};class LR{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 v(`WebGLTimestampQueryPool [${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,t),t}beginQuery(e){if(!this.trackTimestamp||this.isDisposed)return;const t=this.queryOffsets.get(e);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){o("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);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){o("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=new Map;for(const[t,r]of this.queryOffsets){if("ended"===this.queryStates.get(r)){const s=this.queries[r];e.set(t,this.resolveQuery(s))}}if(0===e.size)return this.lastValue;const t={},r=[];for(const[s,i]of e){const e=s.match(/^(.*):f(\d+)$/),n=parseInt(e[2]);!1===r.includes(n)&&r.push(n),void 0===t[n]&&(t[n]=0);const a=await i;this.timestamps.set(s,a),t[n]+=a}const s=t[r[r.length-1]];return this.lastValue=s,this.frames=r,this.currentQueryIndex=0,this.queryOffsets.clear(),this.queryStates.clear(),this.activeQuery=null,s}catch(e){return o("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){o("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 UR extends fR{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.currentSamples>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 MR(this),this.capabilities=new BR(this),this.attributeUtils=new _R(this),this.textureUtils=new wR(this),this.bufferRenderer=new LR(this),this.state=new vR(this),this.utils=new NR(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.extensions.get("EXT_clip_control"),this.disjoint=this.extensions.get("EXT_disjoint_timer_query_webgl2"),this.parallel=this.extensions.get("KHR_parallel_shader_compile"),this.drawBuffersIndexedExt=this.extensions.get("OES_draw_buffers_indexed"),t.reversedDepthBuffer&&(this.extensions.has("EXT_clip_control")?e.reversedDepthBuffer=!0:(d("WebGPURenderer: Unable to use reversed depth buffer due to missing EXT_clip_control extension. Fallback to default depth buffer."),e.reversedDepthBuffer=!1)),e.reversedDepthBuffer&&this.state.setReversedDepth(!0)}get coordinateSystem(){return c}async getArrayBufferAsync(e){return await this.attributeUtils.getArrayBufferAsync(e)}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&&d("WebGLBackend: Render-to-texture extension was disabled because an external texture was provided"),e._autoAllocateDepthBuffer=!1}}initTimestampQuery(e,t){if(!this.disjoint||!this.trackTimestamp)return;this.timestampQueryPool[e]||(this.timestampQueryPool[e]=new DR(this.gl,e,2048));const r=this.timestampQueryPool[e];null!==r.allocateQueriesForContext(t)&&r.beginQuery(t)}prepareTimestampBuffer(e,t){if(!this.disjoint||!this.trackTimestamp)return;this.timestampQueryPool[e].endQuery(t)}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)this.updateScissor(e);else{const{width:e,height:r}=this.getDrawingBufferSize();t.scissor(0,0,e,r)}this.initTimestampQuery(Dt.RENDER,this.getTimestampUID(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;e{let a=0;for(let t=0;t1?t.renderInstances(r,s,i):t.render(r,s)}draw(e){const{object:t,pipeline:r,material:s,context:i,hardwareClippingPlanes:n}=e,{programGPU:a}=this.get(r),{gl:o,state:u}=this,l=this.get(i),d=e.getDrawParameters();if(null===d)return;this._bindUniforms(e.getBindings());const c=t.isMesh&&t.matrixWorld.determinant()<0;u.setMaterial(s,c,n),null!==i.mrt&&null!==i.textures&&u.setMRTBlending(i.textures,i.mrt,s),u.useProgram(a);const h=e.getAttributes(),p=this.get(h);let g=p.vaoGPU;if(void 0===g){const e=this._getVaoKey(h);g=this.vaoCache[e],void 0===g&&(g=this._createVao(h),this.vaoCache[e]=g,p.vaoGPU=g)}const m=e.getIndex(),f=null!==m?this.get(m).bufferGPU:null;u.setVertexState(g,f);const y=l.lastOcclusionObject;if(y!==t&&void 0!==y){if(null!==y&&!0===y.occlusionTest&&(o.endQuery(o.ANY_SAMPLES_PASSED),l.occlusionQueryIndex++),!0===t.occlusionTest){const e=o.createQuery();o.beginQuery(o.ANY_SAMPLES_PASSED,e),l.occlusionQueries[l.occlusionQueryIndex]=e,l.occlusionQueryObjects[l.occlusionQueryIndex]=t}l.lastOcclusionObject=t}const b=this.bufferRenderer;t.isPoints?b.mode=o.POINTS:t.isLineSegments?b.mode=o.LINES:t.isLine?b.mode=o.LINE_STRIP:t.isLineLoop?b.mode=o.LINE_LOOP:!0===s.wireframe?(u.setLineWidth(s.wireframeLinewidth*this.renderer.getPixelRatio()),b.mode=o.LINES):b.mode=o.TRIANGLES;const{vertexCount:x,instanceCount:T}=d;let{firstVertex:_}=d;if(b.object=t,null!==m){_*=m.array.BYTES_PER_ELEMENT;const e=this.get(m);b.index=m.count,b.type=e.type}else b.index=0;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");o("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&&d("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,pipeline: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;eFR[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=qy(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,i=this.renderer._activeMipmapLevel;t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_CUBE_MAP_POSITIVE_X+r,e,i)}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&&!1===this._useMultisampledExtension(s)){const n=i.framebuffers[e.getCacheKey()];let a=t.COLOR_BUFFER_BIT;s.resolveDepthBuffer&&(s.depthBuffer&&(a|=t.DEPTH_BUFFER_BIT),s.stencilBuffer&&s.resolveStencilBuffer&&(a|=t.STENCIL_BUFFER_BIT));const o=i.msaaFrameBuffer,u=i.msaaRenderbuffers,l=e.textures,d=l.length>1;if(r.bindFramebuffer(t.READ_FRAMEBUFFER,o),r.bindFramebuffer(t.DRAW_FRAMEBUFFER,n),d)for(let e=0;e0&&!0===this.extensions.has("WEBGL_multisampled_render_to_texture")&&!1!==e._autoAllocateDepthBuffer}dispose(){null!==this.textureUtils&&this.textureUtils.dispose();const e=this.extensions.get("WEBGL_lose_context");e&&e.loseContext(),this.renderer.domElement.removeEventListener("webglcontextlost",this._onContextLost)}}const IR="point-list",OR="line-list",VR="line-strip",kR="triangle-list",GR="undefined"!=typeof self&&self.GPUShaderStage?self.GPUShaderStage:{VERTEX:1,FRAGMENT:2,COMPUTE:4},zR="never",$R="less",WR="equal",HR="less-equal",qR="greater",jR="not-equal",XR="greater-equal",KR="always",QR="store",YR="load",ZR="clear",JR="ccw",eA="cw",tA="none",rA="back",sA="uint16",iA="uint32",nA="r8unorm",aA="r8snorm",oA="r8uint",uA="r8sint",lA="r16uint",dA="r16sint",cA="r16float",hA="rg8unorm",pA="rg8snorm",gA="rg8uint",mA="rg8sint",fA="r32uint",yA="r32sint",bA="r32float",xA="rg16uint",TA="rg16sint",_A="rg16float",vA="rgba8unorm",NA="rgba8unorm-srgb",SA="rgba8snorm",RA="rgba8uint",AA="rgba8sint",EA="bgra8unorm",wA="bgra8unorm-srgb",CA="rgb9e5ufloat",MA="rgb10a2unorm",BA="rg11b10ufloat",FA="rg32uint",LA="rg32sint",PA="rg32float",DA="rgba16uint",UA="rgba16sint",IA="rgba16float",OA="rgba32uint",VA="rgba32sint",kA="rgba32float",GA="depth16unorm",zA="depth24plus",$A="depth24plus-stencil8",WA="depth32float",HA="depth32float-stencil8",qA="bc1-rgba-unorm",jA="bc1-rgba-unorm-srgb",XA="bc2-rgba-unorm",KA="bc2-rgba-unorm-srgb",QA="bc3-rgba-unorm",YA="bc3-rgba-unorm-srgb",ZA="bc4-r-unorm",JA="bc4-r-snorm",eE="bc5-rg-unorm",tE="bc5-rg-snorm",rE="bc6h-rgb-ufloat",sE="bc6h-rgb-float",iE="bc7-rgba-unorm",nE="bc7-rgba-unorm-srgb",aE="etc2-rgb8unorm",oE="etc2-rgb8unorm-srgb",uE="etc2-rgb8a1unorm",lE="etc2-rgb8a1unorm-srgb",dE="etc2-rgba8unorm",cE="etc2-rgba8unorm-srgb",hE="eac-r11unorm",pE="eac-r11snorm",gE="eac-rg11unorm",mE="eac-rg11snorm",fE="astc-4x4-unorm",yE="astc-4x4-unorm-srgb",bE="astc-5x4-unorm",xE="astc-5x4-unorm-srgb",TE="astc-5x5-unorm",_E="astc-5x5-unorm-srgb",vE="astc-6x5-unorm",NE="astc-6x5-unorm-srgb",SE="astc-6x6-unorm",RE="astc-6x6-unorm-srgb",AE="astc-8x5-unorm",EE="astc-8x5-unorm-srgb",wE="astc-8x6-unorm",CE="astc-8x6-unorm-srgb",ME="astc-8x8-unorm",BE="astc-8x8-unorm-srgb",FE="astc-10x5-unorm",LE="astc-10x5-unorm-srgb",PE="astc-10x6-unorm",DE="astc-10x6-unorm-srgb",UE="astc-10x8-unorm",IE="astc-10x8-unorm-srgb",OE="astc-10x10-unorm",VE="astc-10x10-unorm-srgb",kE="astc-12x10-unorm",GE="astc-12x10-unorm-srgb",zE="astc-12x12-unorm",$E="astc-12x12-unorm-srgb",WE="clamp-to-edge",HE="repeat",qE="mirror-repeat",jE="linear",XE="nearest",KE="zero",QE="one",YE="src",ZE="one-minus-src",JE="src-alpha",ew="one-minus-src-alpha",tw="dst",rw="one-minus-dst",sw="dst-alpha",iw="one-minus-dst-alpha",nw="src-alpha-saturated",aw="constant",ow="one-minus-constant",uw="add",lw="subtract",dw="reverse-subtract",cw="min",hw="max",pw=0,gw=15,mw="keep",fw="zero",yw="replace",bw="invert",xw="increment-clamp",Tw="decrement-clamp",_w="increment-wrap",vw="decrement-wrap",Nw="storage",Sw="read-only-storage",Rw="write-only",Aw="read-only",Ew="read-write",ww="non-filtering",Cw="comparison",Mw="float",Bw="unfilterable-float",Fw="depth",Lw="sint",Pw="uint",Dw="2d",Uw="3d",Iw="2d",Ow="2d-array",Vw="cube",kw="3d",Gw="all",zw="vertex",$w="instance",Ww={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"},Hw={"texture-compression-s3tc":"texture-compression-bc","texture-compression-etc1":"texture-compression-etc2"};class qw extends eR{constructor(e,t,r){super(e,t?t.value:null),this.textureNode=t,this.groupNode=r}update(){const{textureNode:e}=this;return this.texture!==e.value?(this.texture=e.value,!0):super.update()}}class jw extends jS{constructor(e,t){super(e,t?t.array:null),this._attribute=t,this.isStorageBuffer=!0}get attribute(){return this._attribute}}let Xw=0;class Kw extends jw{constructor(e,t){super("StorageBuffer_"+Xw++,e?e.value:null),this.nodeUniform=e,this.access=e?e.access:si.READ_WRITE,this.groupNode=t}get attribute(){return this.nodeUniform.value}get buffer(){return this.nodeUniform.value.array}}class Qw extends xy{constructor(e){super(),this.device=e;this.mipmapSampler=e.createSampler({minFilter:jE}),this.flipYSampler=e.createSampler({minFilter:XE}),this.flipUniformBuffer=e.createBuffer({size:4,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST}),e.queue.writeBuffer(this.flipUniformBuffer,0,new Uint32Array([1])),this.noFlipUniformBuffer=e.createBuffer({size:4,usage:GPUBufferUsage.UNIFORM}),this.transferPipelines={},this.mipmapShaderModule=e.createShaderModule({label:"mipmap",code:"\nstruct VarysStruct {\n\t@builtin( position ) Position: vec4f,\n\t@location( 0 ) vTex : vec2f,\n\t@location( 1 ) @interpolate(flat, either) vBaseArrayLayer: u32,\n};\n\n@group( 0 ) @binding ( 2 )\nvar flipY: u32;\n\n@vertex\nfn mainVS(\n\t\t@builtin( vertex_index ) vertexIndex : u32,\n\t\t@builtin( instance_index ) instanceIndex : u32 ) -> VarysStruct {\n\n\tvar Varys : VarysStruct;\n\n\tvar pos = array(\n\t\tvec2f( -1, -1 ),\n\t\tvec2f( -1, 3 ),\n\t\tvec2f( 3, -1 ),\n\t);\n\n\tlet p = pos[ vertexIndex ];\n\tlet mult = select( vec2f( 0.5, -0.5 ), vec2f( 0.5, 0.5 ), flipY != 0 );\n\tVarys.vTex = p * mult + vec2f( 0.5 );\n\tVarys.Position = vec4f( p, 0, 1 );\n\tVarys.vBaseArrayLayer = instanceIndex;\n\n\treturn Varys;\n\n}\n\n@group( 0 ) @binding( 0 )\nvar imgSampler : sampler;\n\n@group( 0 ) @binding( 1 )\nvar img2d : texture_2d;\n\n@fragment\nfn main_2d( Varys: VarysStruct ) -> @location( 0 ) vec4 {\n\n\treturn textureSample( img2d, imgSampler, Varys.vTex );\n\n}\n\n@group( 0 ) @binding( 1 )\nvar img2dArray : texture_2d_array;\n\n@fragment\nfn main_2d_array( Varys: VarysStruct ) -> @location( 0 ) vec4 {\n\n\treturn textureSample( img2dArray, imgSampler, Varys.vTex, Varys.vBaseArrayLayer );\n\n}\n\nconst faceMat = array(\n mat3x3f( 0, 0, -2, 0, -2, 0, 1, 1, 1 ), // pos-x\n mat3x3f( 0, 0, 2, 0, -2, 0, -1, 1, -1 ), // neg-x\n mat3x3f( 2, 0, 0, 0, 0, 2, -1, 1, -1 ), // pos-y\n mat3x3f( 2, 0, 0, 0, 0, -2, -1, -1, 1 ), // neg-y\n mat3x3f( 2, 0, 0, 0, -2, 0, -1, 1, 1 ), // pos-z\n mat3x3f( -2, 0, 0, 0, -2, 0, 1, 1, -1 ), // neg-z\n);\n\n@group( 0 ) @binding( 1 )\nvar imgCube : texture_cube;\n\n@fragment\nfn main_cube( Varys: VarysStruct ) -> @location( 0 ) vec4 {\n\n\treturn textureSample( imgCube, imgSampler, faceMat[ Varys.vBaseArrayLayer ] * vec3f( fract( Varys.vTex ), 1 ) );\n\n}\n"})}getTransferPipeline(e,t){const r=`${e}-${t=t||"2d-array"}`;let s=this.transferPipelines[r];return void 0===s&&(s=this.device.createRenderPipeline({label:`mipmap-${e}-${t}`,vertex:{module:this.mipmapShaderModule},fragment:{module:this.mipmapShaderModule,entryPoint:`main_${t.replace("-","_")}`,targets:[{format:e}]},layout:"auto"}),this.transferPipelines[r]=s),s}flipY(e,t,r=0){const s=t.format,{width:i,height:n}=t.size,a=this.device.createTexture({size:{width:i,height:n},format:s,usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.TEXTURE_BINDING}),o=this.getTransferPipeline(s,e.textureBindingViewDimension),u=this.getTransferPipeline(s,a.textureBindingViewDimension),l=this.device.createCommandEncoder({}),d=(e,t,r,s,i,n)=>{const a=e.getBindGroupLayout(0),o=this.device.createBindGroup({layout:a,entries:[{binding:0,resource:this.flipYSampler},{binding:1,resource:t.createView({dimension:t.textureBindingViewDimension||"2d-array",baseMipLevel:0,mipLevelCount:1})},{binding:2,resource:{buffer:n?this.flipUniformBuffer:this.noFlipUniformBuffer}}]}),u=l.beginRenderPass({colorAttachments:[{view:s.createView({dimension:"2d",baseMipLevel:0,mipLevelCount:1,baseArrayLayer:i,arrayLayerCount:1}),loadOp:ZR,storeOp:QR}]});u.setPipeline(e),u.setBindGroup(0,o),u.draw(3,1,0,r),u.end()};d(o,e,r,a,0,!1),d(u,a,0,e,r,!0),this.device.queue.submit([l.finish()]),a.destroy()}generateMipmaps(e,t=null){const r=this.get(e),s=r.layers||this._mipmapCreateBundles(e),i=t||this.device.createCommandEncoder({label:"mipmapEncoder"});this._mipmapRunBundles(i,s),null===t&&this.device.queue.submit([i.finish()]),r.layers=s}_mipmapCreateBundles(e){const t=e.textureBindingViewDimension||"2d-array",r=this.getTransferPipeline(e.format,t),s=r.getBindGroupLayout(0),i=[];for(let n=1;n0)for(let t=0,n=s.length;t0){for(const s of e.layerUpdates)this._copyBufferToTexture(t.image,r.texture,i,s,e.flipY,s);e.clearLayerUpdates()}else for(let s=0;s0)for(let t=0,n=s.length;t0?e.width:r.size.width,l=a>0?e.height:r.size.height;try{o.queue.copyExternalImageToTexture({source:e,flipY:i},{texture:t,mipLevel:a,origin:{x:0,y:0,z:s},premultipliedAlpha:n},{width:u,height:l,depthOrArrayLayers:1})}catch(e){}}_getPassUtils(){let e=this._passUtils;return null===e&&(this._passUtils=e=new Qw(this.backend.device)),e}_generateMipmaps(e,t=null){this._getPassUtils().generateMipmaps(e,t)}_flipY(e,t,r=0){this._getPassUtils().flipY(e,t,r)}_copyBufferToTexture(e,t,r,s,i,n=0,a=0){const o=this.backend.device,u=e.data,l=this._getBytesPerTexel(r.format),d=e.width*l;o.queue.writeTexture({texture:t,mipLevel:a,origin:{x:0,y:0,z:s}},u,{offset:e.width*e.height*l*n,bytesPerRow:d},{width:e.width,height:e.height,depthOrArrayLayers:1}),!0===i&&this._flipY(t,r,s)}_copyCompressedBufferToTexture(e,t,r){const s=this.backend.device,i=this._getBlockData(r.format),n=r.size.depthOrArrayLayers>1;for(let a=0;a]*\s*([a-z_0-9]+(?:<[\s\S]+?>)?)/i,rC=/([a-z_0-9]+)\s*:\s*([a-z_0-9]+(?:<[\s\S]+?>)?)/gi,sC={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 iC extends oS{constructor(e){const{type:t,inputs:r,name:s,inputsCode:i,blockCode:n,outputType:a}=(e=>{const t=(e=e.trim()).match(tC);if(null!==t&&4===t.length){const r=t[2],s=[];let i=null;for(;null!==(i=rC.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 nC extends aS{parseFunction(e){return new iC(e)}}const aC={[si.READ_ONLY]:"read",[si.WRITE_ONLY]:"write",[si.READ_WRITE]:"read_write"},oC={[Gr]:"repeat",[ve]:"clamp",[kr]:"mirror"},uC={vertex:GR.VERTEX,fragment:GR.FRAGMENT,compute:GR.COMPUTE},lC={instance:!0,swizzleAssign:!1,storageBuffer:!0},dC={"^^":"tsl_xor"},cC={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"},hC={},pC={tsl_xor:new cT("fn tsl_xor( a : bool, b : bool ) -> bool { return ( a || b ) && !( a && b ); }"),mod_float:new cT("fn tsl_mod_float( x : f32, y : f32 ) -> f32 { return x - y * floor( x / y ); }"),mod_vec2:new cT("fn tsl_mod_vec2( x : vec2f, y : vec2f ) -> vec2f { return x - y * floor( x / y ); }"),mod_vec3:new cT("fn tsl_mod_vec3( x : vec3f, y : vec3f ) -> vec3f { return x - y * floor( x / y ); }"),mod_vec4:new cT("fn tsl_mod_vec4( x : vec4f, y : vec4f ) -> vec4f { return x - y * floor( x / y ); }"),equals_bool:new cT("fn tsl_equals_bool( a : bool, b : bool ) -> bool { return a == b; }"),equals_bvec2:new cT("fn tsl_equals_bvec2( a : vec2f, b : vec2f ) -> vec2 { return vec2( a.x == b.x, a.y == b.y ); }"),equals_bvec3:new cT("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 cT("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 cT("fn tsl_repeatWrapping_float( coord: f32 ) -> f32 { return fract( coord ); }"),mirrorWrapping_float:new cT("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 cT("fn tsl_clampWrapping_float( coord: f32 ) -> f32 { return clamp( coord, 0.0, 1.0 ); }"),biquadraticTexture:new cT("\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"),biquadraticTextureArray:new cT("\nfn tsl_biquadraticTexture_array( map : texture_2d_array, coord : vec2f, iRes : vec2u, layer : u32, 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, layer, level );\n\tlet rg2 = textureLoad( map, vec2u( iuv + vec2( 1.5, 0.5 ) ) % iRes, layer, level );\n\tlet rg3 = textureLoad( map, vec2u( iuv + vec2( 0.5, 1.5 ) ) % iRes, layer, level );\n\tlet rg4 = textureLoad( map, vec2u( iuv + vec2( 1.5, 1.5 ) ) % iRes, layer, level );\n\n\treturn mix( mix( rg1, rg2, f.x ), mix( rg3, rg4, f.x ), f.y );\n\n}\n")},gC={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",floatpack_snorm_2x16:"pack2x16snorm",floatpack_unorm_2x16:"pack2x16unorm",floatpack_float16_2x16:"pack2x16float",floatunpack_snorm_2x16:"unpack2x16snorm",floatunpack_unorm_2x16:"unpack2x16unorm",floatunpack_float16_2x16:"unpack2x16float"};let mC="";!0!==("undefined"!=typeof navigator&&/Firefox|Deno/g.test(navigator.userAgent))&&(mC+="diagnostic( off, derivative_uniformity );\n");class fC extends HN{constructor(e,t){super(e,t,new nC),this.uniformGroups={},this.uniformGroupsBindings={},this.builtins={},this.directives={},this.scopedArrays=new Map}_generateTextureSample(e,t,r,s,i,n=this.shaderStage){return"fragment"===n?s?i?`textureSample( ${t}, ${t}_sampler, ${r}, ${s}, ${i} )`:`textureSample( ${t}, ${t}_sampler, ${r}, ${s} )`:i?`textureSample( ${t}, ${t}_sampler, ${r}, ${i} )`:`textureSample( ${t}, ${t}_sampler, ${r} )`:this.generateTextureSampleLevel(e,t,r,"0",s)}generateTextureSampleLevel(e,t,r,s,i,n){return!1===this.isUnfilterable(e)?i?n?`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${i}, ${s}, ${n} )`:`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${i}, ${s} )`:n?`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${s}, ${n} )`:`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${s} )`:this.isFilteredTexture(e)?this.generateFilteredTexture(e,t,r,n,s,i):this.generateTextureLod(e,t,r,i,n,s)}generateWrapFunction(e){const t=`tsl_coord_${oC[e.wrapS]}S_${oC[e.wrapT]}_${e.is3DTexture||e.isData3DTexture?"3d":"2d"}T`;let r=hC[t];if(void 0===r){const s=[],i=e.is3DTexture||e.isData3DTexture?"vec3f":"vec2f";let n=`fn ${t}( coord : ${i} ) -> ${i} {\n\n\treturn ${i}(\n`;const a=(e,t)=>{e===Gr?(s.push(pC.repeatWrapping_float),n+=`\t\ttsl_repeatWrapping_float( coord.${t} )`):e===ve?(s.push(pC.clampWrapping_float),n+=`\t\ttsl_clampWrapping_float( coord.${t} )`):e===kr?(s.push(pC.mirrorWrapping_float),n+=`\t\ttsl_mirrorWrapping_float( coord.${t} )`):(n+=`\t\tcoord.${t}`,d(`WebGPURenderer: Unsupported texture wrap type "${e}" for vertex shader.`))};a(e.wrapS,"x"),n+=",\n",a(e.wrapT,"y"),(e.is3DTexture||e.isData3DTexture)&&(n+=",\n",a(e.wrapR,"z")),n+="\n\t);\n\n}\n",hC[t]=r=new cT(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.is3DTexture||e.isData3DTexture?"vec3":"vec2",n=u||e.isStorageTexture?t:`${t}${r?`, u32( ${r} )`:""}`,i=new wu(new pl(`textureDimensions( ${n} )`,a)),s.dimensionsSnippet[r]=i,(e.isArrayTexture||e.isDataArrayTexture||e.is3DTexture||e.isData3DTexture)&&(s.arrayLayerCount=new wu(new pl(`textureNumLayers(${t})`,"u32"))),e.isTextureCube&&(s.cubeFaceCount=new wu(new pl("6u","u32")))}return i.build(this)}generateFilteredTexture(e,t,r,s,i="0u",n){const a=this.generateWrapFunction(e),o=this.generateTextureDimension(e,t,i);return s&&(r=`${r} + vec2(${s}) / ${o}`),n?(this._include("biquadraticTextureArray"),`tsl_biquadraticTexture_array( ${t}, ${a}( ${r} ), ${o}, u32( ${n} ), u32( ${i} ) )`):(this._include("biquadraticTexture"),`tsl_biquadraticTexture( ${t}, ${a}( ${r} ), ${o}, u32( ${i} ) )`)}generateTextureLod(e,t,r,s,i,n="0u"){if(!0===e.isCubeTexture){i&&(r=`${r} + vec3(${i})`);return`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${e.isDepthTexture?"u32":"f32"}( ${n} ) )`}const a=this.generateWrapFunction(e),o=this.generateTextureDimension(e,t,n),u=e.is3DTexture||e.isData3DTexture?"vec3":"vec2";i&&(r=`${r} + ${u}(${i}) / ${u}( ${o} )`);return r=`${u}( clamp( floor( ${a}( ${r} ) * ${u}( ${o} ) ), ${`${u}( 0 )`}, ${`${u}( ${o} - ${"vec3"===u?"vec3( 1, 1, 1 )":"vec2( 1, 1 )"} )`} ) )`,this.generateTextureLoad(e,t,r,n,s,null)}generateStorageTextureLoad(e,t,r,s,i,n){let a;return n&&(r=`${r} + ${n}`),a=i?`textureLoad( ${t}, ${r}, ${i} )`:`textureLoad( ${t}, ${r} )`,a}generateTextureLoad(e,t,r,s,i,n){let a;return null===s&&(s="0u"),n&&(r=`${r} + ${n}`),i?a=`textureLoad( ${t}, ${r}, ${i}, u32( ${s} ) )`:(a=`textureLoad( ${t}, ${r}, u32( ${s} ) )`,this.renderer.backend.compatibilityMode&&e.isDepthTexture&&(a+=".x")),a}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&&this.renderer.hasCompatibility(A.TEXTURE_COMPARE)}isUnfilterable(e){return"float"!==this.getComponentTypeFromTexture(e)||!this.isAvailable("float32Filterable")&&!0===e.isDataTexture&&e.type===Q||!1===this.isSampleCompare(e)&&e.minFilter===B&&e.magFilter===B||this.renderer.backend.utils.getTextureSampleData(e).primarySamples>1}generateTexture(e,t,r,s,i,n=this.shaderStage){let a=null;return a=this.isUnfilterable(e)?this.generateTextureLod(e,t,r,s,i,"0",n):this._generateTextureSample(e,t,r,s,i,n),a}generateTextureGrad(e,t,r,s,i,n,a=this.shaderStage){if("fragment"===a)return i?n?`textureSampleGrad( ${t}, ${t}_sampler, ${r}, ${i}, ${s[0]}, ${s[1]}, ${n} )`:`textureSampleGrad( ${t}, ${t}_sampler, ${r}, ${i}, ${s[0]}, ${s[1]} )`:n?`textureSampleGrad( ${t}, ${t}_sampler, ${r}, ${s[0]}, ${s[1]}, ${n} )`:`textureSampleGrad( ${t}, ${t}_sampler, ${r}, ${s[0]}, ${s[1]} )`;o(`WebGPURenderer: THREE.TextureNode.gradient() does not support ${a} shader.`)}generateTextureCompare(e,t,r,s,i,n,a=this.shaderStage){if("fragment"===a)return!0===e.isDepthTexture&&!0===e.isArrayTexture?n?`textureSampleCompare( ${t}, ${t}_sampler, ${r}, ${i}, ${s}, ${n} )`:`textureSampleCompare( ${t}, ${t}_sampler, ${r}, ${i}, ${s} )`:n?`textureSampleCompare( ${t}, ${t}_sampler, ${r}, ${s}, ${n} )`:`textureSampleCompare( ${t}, ${t}_sampler, ${r}, ${s} )`;o(`WebGPURenderer: THREE.DepthTexture.compareFunction() does not support ${a} shader.`)}generateTextureLevel(e,t,r,s,i,n){return!1===this.isUnfilterable(e)?i?n?`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${i}, ${s}, ${n} )`:`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${i}, ${s} )`:n?`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${s}, ${n} )`:`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${s} )`:this.isFilteredTexture(e)?this.generateFilteredTexture(e,t,r,n,s,i):this.generateTextureLod(e,t,r,i,n,s)}generateTextureBias(e,t,r,s,i,n,a=this.shaderStage){if("fragment"===a)return i?n?`textureSampleBias( ${t}, ${t}_sampler, ${r}, ${i}, ${s}, ${n} )`:`textureSampleBias( ${t}, ${t}_sampler, ${r}, ${i}, ${s} )`:n?`textureSampleBias( ${t}, ${t}_sampler, ${r}, ${s}, ${n} )`:`textureSampleBias( ${t}, ${t}_sampler, ${r}, ${s} )`;o(`WebGPURenderer: THREE.TextureNode.biasNode does not support ${a} 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||"cubeDepthTexture"===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=dC[e];return void 0!==t?(this._include(t),t):null}getNodeAccess(e,t){return"compute"!==t?!0===e.isAtomic?(d("WebGPURenderer: Atomic operations are only supported in compute shaders."),si.READ_WRITE):si.READ_ONLY:e.access}getStorageAccess(e,t){return aC[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||"cubeDepthTexture"===t||"storageTexture"===t||"texture3D"===t){let s=null;const n=this.getNodeAccess(e,r);"texture"===t||"storageTexture"===t?s=!0===e.value.is3DTexture?new nR(i.name,i.node,o,n):new sR(i.name,i.node,o,n):"cubeTexture"===t||"cubeDepthTexture"===t?s=new iR(i.name,i.node,o,n):"texture3D"===t&&(s=new nR(i.name,i.node,o,n)),s.store=!0===e.isStorageTextureNode,s.mipLevel=s.store?e.mipLevel:0,s.setVisibility(uC[r]);if(!0===e.value.isCubeTexture||!1===this.isUnfilterable(e.value)&&!1===s.store){const e=new qw(`${i.name}_sampler`,i.node,o);e.setVisibility(uC[r]),l.push(e,s),a=[e,s]}else l.push(s),a=[s]}else if("buffer"===t||"storageBuffer"===t||"indirectStorageBuffer"===t){const n=this.getSharedDataFromNode(e);let u=n.buffer;if(void 0===u){u=new("buffer"===t?QS:Kw)(e,o),n.buffer=u}u.setVisibility(u.getVisibility()|uC[r]),l.push(u),a=u,i.name=s||"NodeBuffer_"+i.id}else{let e=this.uniformGroups[u];void 0===e&&(e=new JS(u,o),e.setVisibility(GR.VERTEX|GR.FRAGMENT|GR.COMPUTE),this.uniformGroups[u]=e),-1===l.indexOf(e)&&l.push(e),a=this.getNodeUniform(i,t);const r=a.name;e.uniforms.some(e=>e.name===r)||e.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","builtinClipSpace","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||"cubeDepthTexture"===i.type||"storageTexture"===i.type||"texture3D"===i.type){const t=i.node.value;let s;(!0===t.isCubeTexture||!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&&!0===t.isDepthTexture)s="texture_depth_cube";else if(!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=eC(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=i.groupNode.name;if(void 0===n[e]){const t=this.uniformGroups[e];if(void 0!==t){const r=[];for(const e of t.uniforms){const t=e.getType(),s=this.getType(this.getVectorType(t));r.push(`\t${e.name} : ${s}`)}let s=this.uniformGroupsBindings[e];void 0===s&&(s={index:a.binding++,id:a.group},this.uniformGroupsBindings[e]=s),n[e]={index:s.index,id:s.id,snippets:r}}}}}for(const e in n){const t=n[e];i.push(this._getWGSLStructBinding(e,t.snippets.join(",\n"),"uniform",t.index,t.id))}return[...r,...s,...i].join("\n")}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.builtinClipSpace = ${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}getBitcastMethod(e){return`bitcast<${this.getType(e)}>`}getFloatPackingMethod(e){return this.getMethod(`floatpack_${e}_2x16`)}getFloatUnpackingMethod(e){return this.getMethod(`floatunpack_${e}_2x16`)}getTernary(e,t,r){return`select( ${r}, ${t}, ${e} )`}getType(e){return cC[e]||e}isAvailable(e){let t=lC[e];return void 0===t&&("float32Filterable"===e?t=this.renderer.hasFeature("float32-filterable"):"clipDistance"===e&&(t=this.renderer.hasFeature("clip-distances")),lC[e]=t),t}_getWGSLMethod(e){return void 0!==pC[e]&&this._include(e),gC[e]}_include(e){const t=pC[e];return t.build(this),this.addInclude(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${mC}\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 yC{constructor(e){this.backend=e}getCurrentDepthStencilFormat(e){let t;return e.depth&&(t=null!==e.depthTexture?this.getTextureFormatGPU(e.depthTexture):e.stencil?$A:zA),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.currentSamples}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}getCurrentColorFormats(e){return null!==e.textures?e.textures.map(e=>this.getTextureFormatGPU(e)):[this.getPreferredCanvasFormat()]}getCurrentColorSpace(e){return null!==e.textures?e.textures[0].colorSpace:this.backend.renderer.outputColorSpace}getPrimitiveTopology(e,t){return e.isPoints?IR:e.isLineSegments||e.isMesh&&!0===t.wireframe?OR:e.isLine?VR:e.isMesh?kR:void 0}getSampleCount(e){return e>=4?4:1}getSampleCountRenderContext(e){return null!==e.textures?this.getSampleCount(e.sampleCount):this.getSampleCount(this.backend.renderer.currentSamples)}getPreferredCanvasFormat(){const e=this.backend.parameters.outputType;if(void 0===e)return navigator.gpu.getPreferredCanvasFormat();if(e===ke)return EA;if(e===_e)return IA;throw new Error("Unsupported output buffer type.")}}const bC=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&&bC.set(Float16Array,["float16"]);const xC=new Map([[bt,["float16"]]]),TC=new Map([[Int32Array,"sint32"],[Int16Array,"sint32"],[Uint32Array,"uint32"],[Uint16Array,"uint32"],[Float32Array,"float32"]]);class _C{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;e0&&(void 0===n.groups&&(n.groups=[],n.versions=[]),n.versions[r]===s&&(o=n.groups[r])),void 0===o&&(o=this.createBindGroup(e,a),r>0&&(n.groups[r]=o,n.versions[r]=s)),n.group=o}updateBinding(e){const t=this.backend,r=t.device,s=e.buffer,i=t.get(e).buffer,n=e.updateRanges;if(0===n.length)r.queue.writeBuffer(i,0,s,0);else{const e=Kr(s),t=e?1:s.BYTES_PER_ELEMENT;for(let a=0,o=n.length;a1&&(i+=`-${e.texture.depthOrArrayLayers}`),i+=`-${r}-${s}`,a=e[i],void 0===a){const n=Gw;let o;o=t.isSampledCubeTexture?Vw:t.isSampledTexture3D?kw:t.texture.isArrayTexture||t.texture.isDataArrayTexture||t.texture.isCompressedArrayTexture?Ow:Iw,a=e[i]=e.texture.createView({aspect:n,dimension:o,mipLevelCount:r,baseMipLevel:s})}}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})}_createLayoutEntries(e){const t=[];let r=0;for(const s of e.bindings){const e=this.backend,i={binding:r,visibility:s.visibility};if(s.isUniformBuffer||s.isStorageBuffer){const e={};s.isStorageBuffer&&(s.visibility&GR.COMPUTE&&(s.access===si.READ_WRITE||s.access===si.WRITE_ONLY)?e.type=Nw:e.type=Sw),i.buffer=e}else if(s.isSampledTexture&&s.store){const e={};e.format=this.backend.get(s.texture).texture.format;const t=s.access;e.access=t===si.READ_WRITE?Ew:t===si.WRITE_ONLY?Rw:Aw,s.texture.isArrayTexture?e.viewDimension=Ow:s.texture.is3DTexture&&(e.viewDimension=kw),i.storageTexture=e}else if(s.isSampledTexture){const t={},{primarySamples:r}=e.utils.getTextureSampleData(s.texture);if(r>1&&(t.multisampled=!0,s.texture.isDepthTexture||(t.sampleType=Bw)),s.texture.isDepthTexture)e.compatibilityMode&&null===s.texture.compareFunction?t.sampleType=Bw:t.sampleType=Fw;else if(s.texture.isDataTexture||s.texture.isDataArrayTexture||s.texture.isData3DTexture){const e=s.texture.type;e===R?t.sampleType=Lw:e===S?t.sampleType=Pw:e===Q&&(this.backend.hasFeature("float32-filterable")?t.sampleType=Mw:t.sampleType=Bw)}s.isSampledCubeTexture?t.viewDimension=Vw:s.texture.isArrayTexture||s.texture.isDataArrayTexture||s.texture.isCompressedArrayTexture?t.viewDimension=Ow:s.isSampledTexture3D&&(t.viewDimension=kw),i.texture=t}else if(s.isSampler){const t={};s.texture.isDepthTexture&&(null!==s.texture.compareFunction&&e.hasCompatibility(A.TEXTURE_COMPARE)?t.type=Cw:t.type=ww),i.sampler=t}else o(`WebGPUBindingUtils: Unsupported binding "${s}".`);t.push(i),r++}return t}deleteBindGroupData(e){const{backend:t}=this,r=t.get(e);r.layout&&(r.layout.usedTimes--,0===r.layout.usedTimes&&this._bindGroupLayoutCache.delete(r.layoutKey),r.layout=void 0,r.layoutKey=void 0)}dispose(){this._bindGroupLayoutCache.clear()}}class SC{constructor(e){this.backend=e}getMaxAnisotropy(){return 16}getUniformBufferLimit(){return this.backend.device.limits.maxUniformBufferBindingSize}}class RC{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:u}=n,l=this.backend,d=l.device,c=l.utils,h=l.get(n),p=[];for(const t of e.getBindings()){const e=l.get(t),{layoutGPU:r}=e.layout;p.push(r)}const g=l.attributeUtils.createShaderVertexBuffers(e);let m;s.blending===se||s.blending===et&&!1===s.transparent||(m=this._getBlending(s));let f={};!0===s.stencilWrite&&(f={compare:this._getStencilCompare(s),failOp:this._getStencilOperation(s.stencilFail),depthFailOp:this._getStencilOperation(s.stencilZFail),passOp:this._getStencilOperation(s.stencilZPass)});const y=this._getColorWriteMask(s),b=[];if(null!==e.context.textures){const t=e.context.textures,r=e.context.mrt;for(let e=0;e1},layout:d.createPipelineLayout({bindGroupLayouts:p})},E={},w=e.context.depth,C=e.context.stencil;if(!0!==w&&!0!==C||(!0===w&&(E.format=S,E.depthWriteEnabled=s.depthWrite,E.depthCompare=N),!0===C&&(E.stencilFront=f,E.stencilBack=f,E.stencilReadMask=s.stencilFuncMask,E.stencilWriteMask=s.stencilWriteMask),!0===s.polygonOffset&&(E.depthBias=s.polygonOffsetUnits,E.depthBiasSlopeScale=s.polygonOffsetFactor,E.depthBiasClamp=0),A.depthStencil=E),d.pushErrorScope("validation"),null===t)h.pipeline=d.createRenderPipeline(A),d.popErrorScope().then(e=>{null!==e&&(h.error=!0,o(e.message))});else{const e=new Promise(async e=>{try{h.pipeline=await d.createRenderPipelineAsync(A)}catch(e){}const t=await d.popErrorScope();null!==t&&(h.error=!0,o(t.message)),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.getCurrentColorFormats(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),{layoutGPU:s}=t.layout;a.push(s)}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===St){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:uw},r={srcFactor:i,dstFactor:n,operation:uw}};if(e.premultipliedAlpha)switch(s){case et:i(QE,ew,QE,ew);break;case Zt:i(QE,QE,QE,QE);break;case Yt:i(KE,ZE,KE,QE);break;case Qt:i(tw,ew,KE,QE)}else switch(s){case et:i(JE,ew,QE,ew);break;case Zt:i(JE,QE,QE,QE);break;case Yt:o(`WebGPURenderer: "SubtractiveBlending" requires "${e.isMaterial?"material":"blendMode"}.premultipliedAlpha = true".`);break;case Qt:o(`WebGPURenderer: "MultiplyBlending" requires "${e.isMaterial?"material":"blendMode"}.premultipliedAlpha = true".`)}}if(void 0!==t&&void 0!==r)return{color:t,alpha:r};o("WebGPURenderer: Invalid blending: ",s)}_getBlendFactor(e){let t;switch(e){case Rt:t=KE;break;case qt:t=QE;break;case Ht:t=YE;break;case Gt:t=ZE;break;case tt:t=JE;break;case rt:t=ew;break;case $t:t=tw;break;case kt:t=rw;break;case zt:t=sw;break;case Vt:t=iw;break;case Wt:t=nw;break;case 211:t=aw;break;case 212:t=ow;break;default:o("WebGPURenderer: Blend factor not supported.",e)}return t}_getStencilCompare(e){let t;const r=e.stencilFunc;switch(r){case ss:t=zR;break;case rs:t=KR;break;case ts:t=$R;break;case es:t=HR;break;case Jr:t=WR;break;case Zr:t=XR;break;case Yr:t=qR;break;case Qr:t=jR;break;default:o("WebGPURenderer: Invalid stencil function.",r)}return t}_getStencilOperation(e){let t;switch(e){case cs:t=mw;break;case ds:t=fw;break;case ls:t=yw;break;case us:t=bw;break;case os:t=xw;break;case as:t=Tw;break;case ns:t=_w;break;case is:t=vw;break;default:o("WebGPURenderer: Invalid stencil operation.",t)}return t}_getBlendOperation(e){let t;switch(e){case st:t=uw;break;case Ot:t=lw;break;case It:t=dw;break;case ps:t=cw;break;case hs:t=hw;break;default:o("WebGPUPipelineUtils: Blend equation not supported.",e)}return t}_getPrimitiveState(e,t,r){const s={},i=this.backend.utils;s.topology=i.getPrimitiveTopology(e,r),null!==t.index&&!0===e.isLine&&!0!==e.isLineSegments&&(s.stripIndexFormat=t.index.array instanceof Uint16Array?sA:iA);let n=r.side===L;return e.isMesh&&e.matrixWorld.determinant()<0&&(n=!n),s.frontFace=!0===n?eA:JR,s.cullMode=r.side===P?tA:rA,s}_getColorWriteMask(e){return!0===e.colorWrite?gw:pw}_getDepthCompare(e){let t;if(!1===e.depthTest)t=KR;else{const r=this.backend.parameters.reversedDepthBuffer?or[e.depthFunc]:e.depthFunc;switch(r){case ar:t=zR;break;case nr:t=KR;break;case ir:t=$R;break;case sr:t=HR;break;case rr:t=WR;break;case tr:t=XR;break;case er:t=qR;break;case Jt:t=jR;break;default:o("WebGPUPipelineUtils: Invalid depth function.",r)}}return t}}class AC extends PR{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 v(`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,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)),a={},o=[];for(const[t,r]of e){const e=t.match(/^(.*):f(\d+)$/),s=parseInt(e[2]);!1===o.includes(s)&&o.push(s),void 0===a[s]&&(a[s]=0);const i=n[r],u=n[r+1],l=Number(u-i)/1e6;this.timestamps.set(t,l),a[s]+=l}const u=a[o[o.length-1]];return this.resultBuffer.unmap(),this.lastValue=u,this.frames=o,u}catch(e){return o("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){o("Error waiting for pending resolve:",e)}if(this.resultBuffer&&"mapped"===this.resultBuffer.mapState)try{this.resultBuffer.unmap()}catch(e){o("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 EC extends fR{constructor(e={}){super(e),this.isWebGPUBackend=!0,this.parameters.alpha=void 0===e.alpha||e.alpha,this.parameters.requiredLimits=void 0===e.requiredLimits?{}:e.requiredLimits,this.compatibilityMode=null,this.device=null,this.defaultRenderPassdescriptor=null,this.utils=new yC(this),this.attributeUtils=new _C(this),this.bindingUtils=new NC(this),this.capabilities=new SC(this),this.pipelineUtils=new RC(this),this.textureUtils=new Jw(this),this.occludedResolveCache=new Map;const t="undefined"==typeof navigator||!1===/Android/.test(navigator.userAgent);this._compatibility={[A.TEXTURE_COMPARE]:t}}async init(e){await super.init(e);const t=this.parameters;let r;if(void 0===t.device){const e={powerPreference:t.powerPreference,featureLevel:"compatibility"},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(Ww),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;this.compatibilityMode=!r.features.has("core-features-and-limits"),this.compatibilityMode&&(e._samples=0),r.lost.then(t=>{if("destroyed"===t.reason)return;const r={api:"WebGPU",message:t.message||"Unknown reason",reason:t.reason||null,originalEvent:t};e.onDeviceLost(r)}),this.device=r,this.trackTimestamp=this.trackTimestamp&&this.hasFeature(Ww.TimestampQuery),this.updateSize()}get context(){const e=this.renderer.getCanvasTarget(),t=this.get(e);let r=t.context;if(void 0===r){const s=this.parameters;r=!0===e.isDefaultCanvasTarget&&void 0!==s.context?s.context:e.domElement.getContext("webgpu"),"setAttribute"in e.domElement&&e.domElement.setAttribute("data-engine",`three.js r${Tt} webgpu`);const i=s.alpha?"premultiplied":"opaque",n=s.outputType===_e?"extended":"standard";r.configure({device:this.device,format:this.utils.getPreferredCanvasFormat(),usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.COPY_SRC,alphaMode:i,toneMapping:{mode:n}}),t.context=r}return r}get coordinateSystem(){return h}async getArrayBufferAsync(e){return await this.attributeUtils.getArrayBufferAsync(e)}getContext(){return this.context}_getDefaultRenderPassDescriptor(){const e=this.renderer,t=e.getCanvasTarget(),r=this.get(t),s=e.currentSamples;let i=r.descriptor;if(void 0===i||r.samples!==s){i={colorAttachments:[{view:null}]},!0!==e.depth&&!0!==e.stencil||(i.depthStencilAttachment={view:this.textureUtils.getDepthBuffer(e.depth,e.stencil).createView()});const t=i.colorAttachments[0];s>0?t.view=this.textureUtils.getColorBuffer().createView():t.resolveTarget=void 0,r.descriptor=i,r.samples=s}const n=i.colorAttachments[0];return s>0?n.resolveTarget=this.context.getCurrentTexture().createView():n.view=this.context.getCurrentTexture().createView(),i}_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;void 0!==i&&s.width===r.width&&s.height===r.height&&s.samples===r.samples||(i={},s.descriptors=i);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:YR}),this.initTimestampQuery(Dt.RENDER,this.getTimestampUID(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;eo&&(i[0]=Math.min(a,o),i[1]=Math.ceil(a/o)),n.dispatchSize=i}i=n.dispatchSize}a.dispatchWorkgroups(i[0],i[1]||1,i[2]||1)}finishCompute(e){const t=this.get(e);t.passEncoderGPU.end(),this.device.queue.submit([t.cmdEncoderGPU.finish()])}_draw(e,t,r,s,i,n,a,o,u){const{object:l,material:d,context:c}=e,h=e.getIndex(),p=null!==h;this.pipelineUtils.setPipeline(o,s),u.pipeline=s;const g=u.bindingGroups;for(let e=0,t=i.length;e65535?4:2);for(let a=0;a1?0:a;!0===p?o.drawIndexed(r[a],s,e[a]/n,0,u):o.draw(r[a],s,e[a],u),t.update(l,r[a],s)}}else if(!0===p){const{vertexCount:r,instanceCount:s,firstVertex:i}=a,n=e.getIndirect();if(null!==n){const t=this.get(n).buffer,r=e.getIndirectOffset(),s=Array.isArray(r)?r:[r];for(let e=0;e0){const i=this.get(e.camera),a=e.camera.cameras,c=e.getBindingGroup("cameraIndex");if(void 0===i.indexesGPU||i.indexesGPU.length!==a.length){const e=this.get(c),t=[],r=new Uint32Array([0,0,0,0]);for(let s=0,i=a.length;s(d("WebGPURenderer: WebGPU is not available, running under WebGL2 backend."),new UR(e)));super(new t(e),e),this.library=new MC,this.isWebGPURenderer=!0,"undefined"!=typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe",{detail:this}))}}class FC extends Es{constructor(){super(),this.isBundleGroup=!0,this.type="BundleGroup",this.static=!0,this.version=0}set needsUpdate(e){!0===e&&this.version++}}class LC{constructor(e,t=wn(0,0,1,1)){this.renderer=e,this.outputNode=t,this.outputColorTransform=!0,this.needsUpdate=!0;const r=new mg;r.name="RenderPipeline",this._quadMesh=new ux(r),this._quadMesh.name="Render Pipeline",this._context=null}render(){const e=this.renderer;this._update(),null!==this._context.onBeforeRenderPipeline&&this._context.onBeforeRenderPipeline();const t=e.toneMapping,r=e.outputColorSpace;e.toneMapping=m,e.outputColorSpace=p.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.onAfterRenderPipeline&&this._context.onAfterRenderPipeline()}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={renderPipeline:this,onBeforeRenderPipeline:null,onAfterRenderPipeline:null};let i=this.outputNode;!0===this.outputColorTransform?(i=i.context(s),i=yl(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(){v('RenderPipeline: "renderAsync()" has been deprecated. Use "render()" and "await renderer.init();" when creating the renderer.'),await this.renderer.init(),this.render()}}class PC extends LC{constructor(e,t){v('PostProcessing: "PostProcessing" has been renamed to "RenderPipeline". Please update your code to use "THREE.RenderPipeline" instead.'),super(e,t)}}class DC extends N{constructor(e=1,t=1){super(),this.image={width:e,height:t},this.magFilter=de,this.minFilter=de,this.isStorageTexture=!0,this.mipmapsAutoUpdate=!0}setSize(e,t){this.image.width===e&&this.image.height===t||(this.image.width=e,this.image.height=t,this.dispose())}}class UC extends N{constructor(e=1,t=1,r=1){super(),this.isArrayTexture=!1,this.image={width:e,height:t,depth:r},this.magFilter=de,this.minFilter=de,this.wrapR=ve,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 IC extends N{constructor(e=1,t=1,r=1){super(),this.isArrayTexture=!0,this.image={width:e,height:t,depth:r},this.magFilter=de,this.minFilter=de,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 OC extends _x{constructor(e,t){super(e,t,Uint32Array),this.isIndirectStorageBufferAttribute=!0}}class VC extends ws{constructor(e){super(e),this.textures={},this.nodes={}}load(e,t,r,s){const i=new Cs(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):o(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]?(o("NodeLoader: Node type not found:",e),fn()):new this.nodes[e]}}class kC extends Ms{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 GC extends Bs{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 VC;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 kC;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]={id:s.id,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!!(e.context.modelViewMatrix||e.context.modelNormalViewMatrix||e.context.getAO||e.context.getShadow)}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;if(o.id!==i.id)return o.id=i.id,!1;let d=0,c=0;for(const e in u)d++;for(const e in l){c++;const t=l[e],r=u[e];if(void 0===r)return delete l[e],!1;if(t.id!==r.id||t.version!==r.version)return t.id=r.id,t.version=r.version,!1}if(c!==d)return n.geometry.attributes=this.getAttributesData(u),!1;const h=i.index,p=o.indexId,g=o.indexVersion,m=h?h.id:null,f=h?h.version:null;if(p!==m||g!==f)return o.indexId=m,o.indexVersion=f,!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{const r=e.match(t);if(!r)return null;const s=r[1]||r[2]||"",i=r[3].split("?")[0],n=parseInt(r[4],10),a=parseInt(r[5],10);return{fn:s,file:i.split("/").pop(),line:n,column:a}}).filter(e=>e&&!Ds.some(t=>t.test(e.file)))}(e||(new Error).stack)}getLocation(){if(0===this.stack.length)return"[Unknown location]";const e=this.stack[0],t=e.fn;return`${t?`"${t}()" at `:""}"${e.file}:${e.line}"`}getError(e){if(0===this.stack.length)return e;return`${e}\n${this.stack.map(e=>{const t=`${e.file}:${e.line}:${e.column}`;return e.fn?` at ${e.fn} (${t})`:` at ${t}`}).join("\n")}`}}function Is(e,t=0){let r=3735928559^t,s=1103547991^t;if(e instanceof Array)for(let t,i=0;i>>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 Os=e=>Is(e),Vs=e=>Is(e),ks=(...e)=>Is(e),Gs=new Map([[1,"float"],[2,"vec2"],[3,"vec3"],[4,"vec4"],[9,"mat3"],[16,"mat4"]]),zs=new WeakMap;function $s(e){return Gs.get(e)}function Ws(e){if(/[iu]?vec\d/.test(e))return e.startsWith("ivec")?Int32Array:e.startsWith("uvec")?Uint32Array:Float32Array;if(/mat\d/.test(e))return Float32Array;if(/float/.test(e))return Float32Array;if(/uint/.test(e))return Uint32Array;if(/int/.test(e))return Int32Array;throw new Error(`THREE.NodeUtils: Unsupported type: ${e}`)}function Hs(e){return/float|int|uint/.test(e)?1:/vec2/.test(e)?2:/vec3/.test(e)?3:/vec4/.test(e)||/mat2/.test(e)?4:/mat3/.test(e)?9:/mat4/.test(e)?16:void o(`TSL: Unsupported type: ${e}`,new Us)}function qs(e){return/float|int|uint/.test(e)?1:/vec2/.test(e)?2:/vec3/.test(e)?3:/vec4/.test(e)||/mat2/.test(e)?4:/mat3/.test(e)?12:/mat4/.test(e)?16:void o(`TSL: Unsupported type: ${e}`,new Us)}function js(e){return/float|int|uint/.test(e)?4:/vec2/.test(e)?8:/vec3/.test(e)||/vec4/.test(e)?16:/mat2/.test(e)?8:/mat3/.test(e)||/mat4/.test(e)?16:void o(`TSL: Unsupported type: ${e}`,new Us)}function Xs(e){if(null==e)return null;const t=typeof e;return!0===e.isNode?"node":"number"===t?"float":"boolean"===t?"bool":"string"===t?"string":"function"===t?"shader":!0===e.isVector2?"vec2":!0===e.isVector3?"vec3":!0===e.isVector4?"vec4":!0===e.isMatrix2?"mat2":!0===e.isMatrix3?"mat3":!0===e.isMatrix4?"mat4":!0===e.isColor?"color":e instanceof ArrayBuffer?"ArrayBuffer":null}function Ks(o,...u){const l=o?o.slice(-4):void 0;return 1===u.length&&("vec2"===l?u=[u[0],u[0]]:"vec3"===l?u=[u[0],u[0],u[0]]:"vec4"===l&&(u=[u[0],u[0],u[0],u[0]])),"color"===o?new e(...u):"vec2"===l?new t(...u):"vec3"===l?new r(...u):"vec4"===l?new s(...u):"mat2"===l?new i(...u):"mat3"===l?new n(...u):"mat4"===l?new a(...u):"bool"===o?u[0]||!1:"float"===o||"int"===o||"uint"===o?u[0]||0:"string"===o?u[0]||"":"ArrayBuffer"===o?Zs(u[0]):null}function Qs(e){let t=zs.get(e);return void 0===t&&(t={},zs.set(e,t)),t}function Ys(e){let t="";const r=new Uint8Array(e);for(let e=0;ee.charCodeAt(0)).buffer}var Js=Object.freeze({__proto__:null,arrayBufferToBase64:Ys,base64ToArrayBuffer:Zs,getAlignmentFromType:js,getDataFromObject:Qs,getLengthFromType:Hs,getMemoryLengthFromType:qs,getTypeFromLength:$s,getTypedArrayFromType:Ws,getValueFromType:Ks,getValueType:Xs,hash:ks,hashArray:Vs,hashString:Os});const ei={VERTEX:"vertex",FRAGMENT:"fragment"},ti={NONE:"none",FRAME:"frame",RENDER:"render",OBJECT:"object"},ri={BOOLEAN:"bool",INTEGER:"int",FLOAT:"float",VECTOR2:"vec2",VECTOR3:"vec3",VECTOR4:"vec4",MATRIX2:"mat2",MATRIX3:"mat3",MATRIX4:"mat4"},si={READ_ONLY:"readOnly",WRITE_ONLY:"writeOnly",READ_WRITE:"readWrite"},ii=["fragment","vertex"],ni=["setup","analyze","generate"],ai=[...ii,"compute"],oi=["x","y","z","w"],ui={analyze:"setup",generate:"analyze"};let li=0;class di extends u{static get type(){return"Node"}constructor(e=null){super(),this.nodeType=e,this.updateType=ti.NONE,this.updateBeforeType=ti.NONE,this.updateAfterType=ti.NONE,this.version=0,this.name="",this.global=!1,this.parents=!1,this.isNode=!0,this._beforeNodes=null,this._cacheKey=null,this._uuid=null,this._cacheKeyVersion=0,this.id=li++,this.stackTrace=null,!0===di.captureStackTrace&&(this.stackTrace=new Us)}set needsUpdate(e){!0===e&&this.version++}get uuid(){return null===this._uuid&&(this._uuid=l.generateUUID()),this._uuid}get type(){return this.constructor.type}onUpdate(e,t){return this.updateType=t,this.update=e.bind(this),this}onFrameUpdate(e){return this.onUpdate(e,ti.FRAME)}onRenderUpdate(e){return this.onUpdate(e,ti.RENDER)}onObjectUpdate(e){return this.onUpdate(e,ti.OBJECT)}onReference(e){return this.updateReference=e.bind(this),this}updateReference(){return this}isGlobal(){return this.global}*getChildren(){for(const{childNode:e}of this._getChildren())yield e}dispose(){this.dispatchEvent({type:"dispose"})}traverse(e){e(this);for(const t of this.getChildren())t.traverse(e)}_getChildren(e=new Set){const t=[];e.add(this);for(const r of Object.getOwnPropertyNames(this)){const s=this[r];if(!0!==r.startsWith("_")&&!e.has(s))if(!0===Array.isArray(s))for(let e=0;e0&&(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}}di.captureStackTrace=!1;class ci extends di{static get type(){return"ArrayElementNode"}constructor(e,t){super(),this.node=e,this.indexNode=t,this.isArrayElementNode=!0}generateNodeType(e){return this.node.getElementType(e)}getMemberType(e,t){return this.node.getMemberType(e,t)}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 hi extends di{static get type(){return"ConvertNode"}constructor(e,t){super(),this.node=e,this.convertTo=t}generateNodeType(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 pi extends di{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 gi extends pi{static get type(){return"JoinNode"}constructor(e=[],t=null){super(t),this.nodes=e}generateNodeType(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 u=0;for(const t of i){if(u>=s){o(`TSL: Length of parameters exceeds maximum length of function '${r}()' type.`,this.stackTrace);break}let i,l=t.getNodeType(e),d=e.getTypeLength(l);u+d>s&&(o(`TSL: Length of '${r}()' data exceeds maximum length of output type.`,this.stackTrace),d=s-u,l=e.getTypeFromLength(d)),u+=d,i=t.build(e,l);if(e.getComponentType(l)!==n){const t=e.getTypeFromLength(d,n);i=e.format(i,l,t)}a.push(i)}const l=`${e.getType(r)}( ${a.join(", ")} )`;return e.format(l,r,t)}}const mi=oi.join("");class fi extends di{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(oi.indexOf(t)+1,e);return e}getComponentType(e){return e.getComponentType(this.node.getNodeType(e))}generateNodeType(e){return e.getTypeFromLength(this.components.length,this.getComponentType(e))}getScope(){return this.node.getScope()}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===mi.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 yi extends pi{static get type(){return"SetNode"}constructor(e,t,r){super(),this.sourceNode=e,this.components=t,this.targetNode=r}generateNodeType(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;e(e=>e.replace(/r|s/g,"x").replace(/g|t/g,"y").replace(/b|p/g,"z").replace(/a|q/g,"w"))(e).split("").sort().join("");di.prototype.assign=function(...e){if(!0!==this.isStackNode)return null!==Ni?Ni.assign(this,...e):o("TSL: No stack defined for assign operation. Make sure the assign is inside a Fn().",new Us),this;{const t=Si.get("assign");return this.addToStack(t(...e))}},di.prototype.toVarIntent=function(){return this},di.prototype.get=function(e){return new vi(this,e)};const Ei={};function wi(e,t,r){Ei[e]=Ei[t]=Ei[r]={get(){this._cache=this._cache||{};let t=this._cache[e];return void 0===t&&(t=new fi(this,e),this._cache[e]=t),t},set(t){this[e].assign(en(t))}};const s=e.toUpperCase(),i=t.toUpperCase(),n=r.toUpperCase();di.prototype["set"+s]=di.prototype["set"+i]=di.prototype["set"+n]=function(t){const r=Ai(e);return new yi(this,r,en(t))},di.prototype["flip"+s]=di.prototype["flip"+i]=di.prototype["flip"+n]=function(){const t=Ai(e);return new bi(this,t)}}const Ci=["x","y","z","w"],Mi=["r","g","b","a"],Bi=["s","t","p","q"];for(let e=0;e<4;e++){let t=Ci[e],r=Mi[e],s=Bi[e];wi(t,r,s);for(let i=0;i<4;i++){t=Ci[e]+Ci[i],r=Mi[e]+Mi[i],s=Bi[e]+Bi[i],wi(t,r,s);for(let n=0;n<4;n++){t=Ci[e]+Ci[i]+Ci[n],r=Mi[e]+Mi[i]+Mi[n],s=Bi[e]+Bi[i]+Bi[n],wi(t,r,s);for(let a=0;a<4;a++)t=Ci[e]+Ci[i]+Ci[n]+Ci[a],r=Mi[e]+Mi[i]+Mi[n]+Mi[a],s=Bi[e]+Bi[i]+Bi[n]+Bi[a],wi(t,r,s)}}}for(let e=0;e<32;e++)Ei[e]={get(){this._cache=this._cache||{};let t=this._cache[e];return void 0===t&&(t=new ci(this,new _i(e,"uint")),this._cache[e]=t),t},set(t){this[e].assign(en(t))}};Object.defineProperties(di.prototype,Ei);const Fi=new WeakMap,Li=function(e,t=null){for(const r in e)e[r]=en(e[r],t);return e},Pi=function(e,t=null){const r=e.length;for(let s=0;su?(o(`TSL: "${r}" parameter length exceeds limit.`,new Us),t.slice(0,u)):t}return null===t?n=(...t)=>i(new e(...sn(d(t)))):null!==r?(r=en(r),n=(...s)=>i(new e(t,...sn(d(s)),r))):n=(...r)=>i(new e(t,...sn(d(r)))),n.setParameterLength=(...e)=>(1===e.length?a=u=e[0]:2===e.length&&([a,u]=e),n),n.setName=e=>(l=e,n),n},Ui=function(e,...t){return new e(...sn(t))};class Ii extends di{constructor(e,t){super(),this.shaderNode=e,this.rawInputs=t,this.isShaderCallNodeInternal=!0}generateNodeType(e){return this.shaderNode.nodeType||this.getOutputNode(e).getNodeType(e)}getElementType(e){return this.getOutputNode(e).getElementType(e)}getMemberType(e,t){return this.getOutputNode(e).getMemberType(e,t)}call(e){const{shaderNode:t,rawInputs:r}=this,s=e.getNodeProperties(t),i=e.getClosestSubBuild(t.subBuilds)||"",n=i||"default";if(s[n])return s[n];const a=e.subBuildFn,o=e.fnCall;e.subBuildFn=i,e.fnCall=this;let u=null;if(t.layout){let s=Fi.get(e.constructor);void 0===s&&(s=new WeakMap,Fi.set(e.constructor,s));let i=s.get(t);void 0===i&&(i=en(e.buildFunctionNode(t)),s.set(t,i)),e.addInclude(i);const n=r?function(e){let t;rn(e);t=e[0]&&(e[0].isNode||Object.getPrototypeOf(e[0])!==Object.prototype)?[...e]:e[0];return t}(r):null;u=en(i.call(n))}else{const s=new Proxy(e,{get:(e,t,r)=>{let s;return s=Symbol.iterator===t?function*(){yield}:Reflect.get(e,t,r),s}}),i=r?function(e){let t=0;return rn(e),new Proxy(e,{get:(r,s,i)=>{let n;if("length"===s)return n=e.length,n;if(Symbol.iterator===s)n=function*(){for(const t of e)yield en(t)};else{if(e.length>0)if(Object.getPrototypeOf(e[0])===Object.prototype){const r=e[0];n=void 0===r[s]?r[t++]:Reflect.get(r,s,i)}else e[0]instanceof di&&(n=void 0===e[s]?e[t++]:Reflect.get(e,s,i));else n=Reflect.get(r,s,i);n=en(n)}return n}})}(r):null,n=Array.isArray(r)?r.length>0:null!==r,a=t.jsFunc,o=n||a.length>1?a(i,s):a(s);u=en(o)}return e.subBuildFn=a,e.fnCall=o,t.once&&(s[n]=u),u}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),o=e.fnCall;if(e.fnCall=this,"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 e.fnCall=o,r}}class Oi extends di{constructor(e,t){super(t),this.jsFunc=e,this.layout=null,this.global=!0,this.once=!1}setLayout(e){return this.layout=e,this}getLayout(){return this.layout}call(e=null){return new Ii(this,e)}setup(){return this.call()}}const Vi=[!1,!0],ki=[0,1,2,3],Gi=[-1,-2],zi=[.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],$i=new Map;for(const e of Vi)$i.set(e,new _i(e));const Wi=new Map;for(const e of ki)Wi.set(e,new _i(e,"uint"));const Hi=new Map([...Wi].map(e=>new _i(e.value,"int")));for(const e of Gi)Hi.set(e,new _i(e,"int"));const qi=new Map([...Hi].map(e=>new _i(e.value)));for(const e of zi)qi.set(e,new _i(e));for(const e of zi)qi.set(-e,new _i(-e));const ji={bool:$i,uint:Wi,ints:Hi,float:qi},Xi=new Map([...$i,...qi]),Ki=(e,t)=>Xi.has(e)?Xi.get(e):!0===e.isNode?e:new _i(e,t),Qi=function(e,t=null){return(...r)=>{for(const t of r)if(void 0===t)return o(`TSL: Invalid parameter for the type "${e}".`,new Us),new _i(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=[Ks(e,...r)]),1===r.length&&null!==t&&t.has(r[0]))return tn(t.get(r[0]));if(1===r.length){const t=Ki(r[0],e);return t.nodeType===e?tn(t):tn(new hi(t,e))}const s=r.map(e=>Ki(e));return tn(new gi(s,e))}};function Yi(e){return e&&e.isNode&&e.traverse(t=>{t.isConstNode&&(e=t.value)}),Boolean(e)}const Zi=e=>null!=e?e.nodeType||e.convertTo||("string"==typeof e?e:null):null;function Ji(e,t){return new Oi(e,t)}const en=(e,t=null)=>function(e,t=null){const r=Xs(e);return"node"===r?e:null===t&&("float"===r||"boolean"===r)||r&&"shader"!==r&&"string"!==r?en(Ki(e,t)):"shader"===r?e.isFn?e:dn(e):e}(e,t),tn=(e,t=null)=>en(e,t).toVarIntent(),rn=(e,t=null)=>new Li(e,t),sn=(e,t=null)=>new Pi(e,t),nn=(e,t=null,r=null,s=null)=>new Di(e,t,r,s),an=(e,...t)=>new Ui(e,...t),on=(e,t=null,r=null,s={})=>new Di(e,t,r,{...s,intent:!0});let un=0;class ln extends di{constructor(e,t=null){super();let r=null;null!==t&&("object"==typeof t?r=t.return:("string"==typeof t?r=t:o("TSL: Invalid layout type.",new Us),t=null)),this.shaderNode=new Ji(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"+un++,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}generateNodeType(e){return this.shaderNode.getNodeType(e)||"float"}call(...e){const t=this.shaderNode.call(e);return"void"===this.shaderNode.nodeType&&t.toStack(),t.toVarIntent()}once(e=null){return this.shaderNode.once=!0,this.shaderNode.subBuilds=e,this}generate(e){const t=this.getNodeType(e);return o('TSL: "Fn()" was declared but not invoked. Try calling it like "Fn()( ...params )".',this.stackTrace),e.generateConst(t)}}function dn(e,t=null){const r=new ln(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 cn=e=>{Ni=e},hn=()=>Ni,pn=(...e)=>Ni.If(...e);function gn(e){return Ni&&Ni.addToStack(e),e}Ri("toStack",gn);const mn=new Qi("color"),fn=new Qi("float",ji.float),yn=new Qi("int",ji.ints),bn=new Qi("uint",ji.uint),xn=new Qi("bool",ji.bool),Tn=new Qi("vec2"),_n=new Qi("ivec2"),vn=new Qi("uvec2"),Nn=new Qi("bvec2"),Sn=new Qi("vec3"),Rn=new Qi("ivec3"),An=new Qi("uvec3"),En=new Qi("bvec3"),wn=new Qi("vec4"),Cn=new Qi("ivec4"),Mn=new Qi("uvec4"),Bn=new Qi("bvec4"),Fn=new Qi("mat2"),Ln=new Qi("mat3"),Pn=new Qi("mat4");Ri("toColor",mn),Ri("toFloat",fn),Ri("toInt",yn),Ri("toUint",bn),Ri("toBool",xn),Ri("toVec2",Tn),Ri("toIVec2",_n),Ri("toUVec2",vn),Ri("toBVec2",Nn),Ri("toVec3",Sn),Ri("toIVec3",Rn),Ri("toUVec3",An),Ri("toBVec3",En),Ri("toVec4",wn),Ri("toIVec4",Cn),Ri("toUVec4",Mn),Ri("toBVec4",Bn),Ri("toMat2",Fn),Ri("toMat3",Ln),Ri("toMat4",Pn);const Dn=nn(ci).setParameterLength(2),Un=(e,t)=>new hi(en(e),t);Ri("element",Dn),Ri("convert",Un);Ri("append",e=>(d("TSL: .append() has been renamed to .toStack().",new Us),gn(e)));class In extends di{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}customCacheKey(){return Os(this.type+":"+(this.name||"")+":"+(this.varying?"1":"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 On=(e,t)=>new In(e,t),Vn=(e,t)=>new In(e,t,!0),kn=an(In,"vec4","DiffuseColor"),Gn=an(In,"vec3","DiffuseContribution"),zn=an(In,"vec3","EmissiveColor"),$n=an(In,"float","Roughness"),Wn=an(In,"float","Metalness"),Hn=an(In,"float","Clearcoat"),qn=an(In,"float","ClearcoatRoughness"),jn=an(In,"vec3","Sheen"),Xn=an(In,"float","SheenRoughness"),Kn=an(In,"float","Iridescence"),Qn=an(In,"float","IridescenceIOR"),Yn=an(In,"float","IridescenceThickness"),Zn=an(In,"float","AlphaT"),Jn=an(In,"float","Anisotropy"),ea=an(In,"vec3","AnisotropyT"),ta=an(In,"vec3","AnisotropyB"),ra=an(In,"color","SpecularColor"),sa=an(In,"color","SpecularColorBlended"),ia=an(In,"float","SpecularF90"),na=an(In,"float","Shininess"),aa=an(In,"vec4","Output"),oa=an(In,"float","dashSize"),ua=an(In,"float","gapSize"),la=an(In,"float","pointWidth"),da=an(In,"float","IOR"),ca=an(In,"float","Transmission"),ha=an(In,"float","Thickness"),pa=an(In,"float","AttenuationDistance"),ga=an(In,"color","AttenuationColor"),ma=an(In,"float","Dispersion");class fa extends di{static get type(){return"UniformGroupNode"}constructor(e,t=!1,r=1,s=null){super("string"),this.name=e,this.shared=t,this.order=r,this.updateType=s,this.isUniformGroup=!0}update(){this.needsUpdate=!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 ya=(e,t=1,r=null)=>new fa(e,!1,t,r),ba=(e,t=0,r=null)=>new fa(e,!0,t,r),xa=ba("frame",0,ti.FRAME),Ta=ba("render",0,ti.RENDER),_a=ya("object",1,ti.OBJECT);class va extends xi{static get type(){return"UniformNode"}constructor(e,t=null){super(e,t),this.isUniformNode=!0,this.name="",this.groupNode=_a}setName(e){return this.name=e,this}label(e){return d('TSL: "label()" has been deprecated. Use "setName()" instead.',new Us),this.setName(e)}setGroup(e){return this.groupNode=e,this}getGroup(){return this.groupNode}getUniformHash(e){return this.getHash(e)}onUpdate(e,t){return e=e.bind(this),super.onUpdate(t=>{const r=e(t,this);void 0!==r&&(this.value=r)},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 Na=(e,t)=>{const r=Zi(t||e);if(r===e&&(e=Ks(r)),e&&!0===e.isNode){let t=e.value;e.traverse(e=>{!0===e.isConstNode&&(t=e.value)}),e=t}return new va(e,r)};class Sa extends pi{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}generateNodeType(e){return null===this.nodeType?this.values[0].getNodeType(e):this.nodeType}getElementType(e){return this.getNodeType(e)}getMemberType(e,t){return null===this.nodeType?this.values[0].getMemberType(e,t):super.getMemberType(e,t)}generate(e){const t=this.getNodeType(e);return e.generateArray(t,this.count,this.values)}}const Ra=(...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 en(t)};Ri("toArray",(e,t)=>Ra(Array(t).fill(e)));class Aa extends pi{static get type(){return"AssignNode"}constructor(e,t){super(),this.targetNode=e,this.sourceNode=t,this.isAssignNode=!0}hasDependencies(){return!1}generateNodeType(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 oi.join("").slice(0,r)!==t.components}return!1}setup(e){const{targetNode:t,sourceNode:r}=this,s=t.getScope();e.getDataFromNode(s).assign=!0;const i=e.getNodeProperties(this);i.sourceNode=r,i.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)o("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?sn(t):rn(t[0]),new wa(en(e),t));Ri("call",Ca);const Ma={"==":"equal","!=":"notEqual","<":"lessThan",">":"greaterThan","<=":"lessThanEqual",">=":"greaterThanEqual","%":"mod"};class Ba extends pi{static get type(){return"OperatorNode"}constructor(e,t,r,...s){if(super(),s.length>0){let i=new Ba(e,t,r);for(let t=0;t>"===r||"<<"===r)return e.getIntegerType(n);if("!"===r||"&&"===r||"||"===r||"^^"===r)return"bool";if("=="===r||"!="===r||"<"===r||">"===r||"<="===r||">="===r){const t=Math.max(e.getTypeLength(n),e.getTypeLength(a));return t>1?`bvec${t}`:"bool"}if(e.isMatrix(n)){if("float"===a)return n;if(e.isVector(a))return e.getVectorFromMatrix(n);if(e.isMatrix(a))return n}else if(e.isMatrix(a)){if("float"===n)return a;if(e.isVector(n))return e.getVectorFromMatrix(a)}return e.getTypeLength(a)>e.getTypeLength(n)?a:n}generate(e,t){const r=this.op,{aNode:s,bNode:i}=this,n=this.getNodeType(e,t);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),l=i?i.build(e,o):null,d=e.getFunctionOperator(r);if("void"!==t){const s=e.renderer.coordinateSystem===c;if("=="===r||"!="===r||"<"===r||">"===r||"<="===r||">="===r)return s&&e.isVector(a)?e.format(`${this.getOperatorMethod(e,t)}( ${u}, ${l} )`,n,t):e.format(`( ${u} ${r} ${l} )`,n,t);if("%"===r)return e.isInteger(o)?e.format(`( ${u} % ${l} )`,n,t):e.format(`${this.getOperatorMethod(e,n)}( ${u}, ${l} )`,n,t);if("!"===r||"~"===r)return e.format(`(${r}${u})`,a,t);if(d)return e.format(`${d}( ${u}, ${l} )`,n,t);if(e.isMatrix(a)&&"float"===o)return e.format(`( ${l} ${r} ${u} )`,n,t);if("float"===a&&e.isMatrix(o))return e.format(`${u} ${r} ${l}`,n,t);{let i=`( ${u} ${r} ${l} )`;return!s&&"bool"===n&&e.isVector(a)&&e.isVector(o)&&(i=`all${i}`),e.format(i,n,t)}}if("void"!==a)return d?e.format(`${d}( ${u}, ${l} )`,n,t):e.isMatrix(a)&&"float"===o?e.format(`${l} ${r} ${u}`,n,t):e.format(`${u} ${r} ${l}`,n,t)}serialize(e){super.serialize(e),e.op=this.op}deserialize(e){super.deserialize(e),this.op=e.op}}const Fa=on(Ba,"+").setParameterLength(2,1/0).setName("add"),La=on(Ba,"-").setParameterLength(2,1/0).setName("sub"),Pa=on(Ba,"*").setParameterLength(2,1/0).setName("mul"),Da=on(Ba,"/").setParameterLength(2,1/0).setName("div"),Ua=on(Ba,"%").setParameterLength(2).setName("mod"),Ia=on(Ba,"==").setParameterLength(2).setName("equal"),Oa=on(Ba,"!=").setParameterLength(2).setName("notEqual"),Va=on(Ba,"<").setParameterLength(2).setName("lessThan"),ka=on(Ba,">").setParameterLength(2).setName("greaterThan"),Ga=on(Ba,"<=").setParameterLength(2).setName("lessThanEqual"),za=on(Ba,">=").setParameterLength(2).setName("greaterThanEqual"),$a=on(Ba,"&&").setParameterLength(2,1/0).setName("and"),Wa=on(Ba,"||").setParameterLength(2,1/0).setName("or"),Ha=on(Ba,"!").setParameterLength(1).setName("not"),qa=on(Ba,"^^").setParameterLength(2).setName("xor"),ja=on(Ba,"&").setParameterLength(2).setName("bitAnd"),Xa=on(Ba,"~").setParameterLength(1).setName("bitNot"),Ka=on(Ba,"|").setParameterLength(2).setName("bitOr"),Qa=on(Ba,"^").setParameterLength(2).setName("bitXor"),Ya=on(Ba,"<<").setParameterLength(2).setName("shiftLeft"),Za=on(Ba,">>").setParameterLength(2).setName("shiftRight"),Ja=dn(([e])=>(e.addAssign(1),e)),eo=dn(([e])=>(e.subAssign(1),e)),to=dn(([e])=>{const t=yn(e).toConst();return e.addAssign(1),t}),ro=dn(([e])=>{const t=yn(e).toConst();return e.subAssign(1),t});Ri("add",Fa),Ri("sub",La),Ri("mul",Pa),Ri("div",Da),Ri("mod",Ua),Ri("equal",Ia),Ri("notEqual",Oa),Ri("lessThan",Va),Ri("greaterThan",ka),Ri("lessThanEqual",Ga),Ri("greaterThanEqual",za),Ri("and",$a),Ri("or",Wa),Ri("not",Ha),Ri("xor",qa),Ri("bitAnd",ja),Ri("bitNot",Xa),Ri("bitOr",Ka),Ri("bitXor",Qa),Ri("shiftLeft",Ya),Ri("shiftRight",Za),Ri("incrementBefore",Ja),Ri("decrementBefore",eo),Ri("increment",to),Ri("decrement",ro);const so=(e,t)=>(d('TSL: "modInt()" is deprecated. Use "mod( int( ... ) )" instead.',new Us),Ua(yn(e),yn(t)));Ri("modInt",so);class io extends pi{static get type(){return"MathNode"}constructor(e,t,r=null,s=null){if(super(),(e===io.MAX||e===io.MIN)&&arguments.length>3){let i=new io(e,t,r);for(let t=2;tn&&i>a?t:n>a?r:a>i?s:t}generateNodeType(e){const t=this.method;return t===io.LENGTH||t===io.DISTANCE||t===io.DOT?"float":t===io.CROSS?"vec3":t===io.ALL||t===io.ANY?"bool":t===io.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===io.ONE_MINUS)i=La(1,t);else if(s===io.RECIPROCAL)i=Da(1,t);else if(s===io.DIFFERENCE)i=Fo(La(t,r));else if(s===io.TRANSFORM_DIRECTION){let s=t,n=r;e.isMatrix(s.getNodeType(e))?n=wn(Sn(n),0):s=wn(Sn(s),0);const a=Pa(s,n).xyz;i=So(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===io.NEGATE)return e.format("( - "+n.build(e,i)+" )",s,t);{const l=[];return r===io.CROSS?l.push(n.build(e,s),a.build(e,s)):u===c&&r===io.STEP?l.push(n.build(e,1===e.getTypeLength(n.getNodeType(e))?"float":i),a.build(e,i)):u!==c||r!==io.MIN&&r!==io.MAX?r===io.REFRACT?l.push(n.build(e,i),a.build(e,i),o.build(e,"float")):r===io.MIX?l.push(n.build(e,i),a.build(e,i),o.build(e,1===e.getTypeLength(o.getNodeType(e))?"float":i)):(u===h&&r===io.ATAN&&null!==a&&(r="atan2"),"fragment"===e.shaderStage||r!==io.DFDX&&r!==io.DFDY||(d(`TSL: '${r}' is not supported in the ${e.shaderStage} stage.`,this.stackTrace),r="/*"+r+"*/"),l.push(n.build(e,i)),null!==a&&l.push(a.build(e,i)),null!==o&&l.push(o.build(e,i))):l.push(n.build(e,i),a.build(e,1===e.getTypeLength(a.getNodeType(e))?"float":i)),e.format(`${e.getMethod(r,s)}( ${l.join(", ")} )`,s,t)}}serialize(e){super.serialize(e),e.method=this.method}deserialize(e){super.deserialize(e),this.method=e.method}}io.ALL="all",io.ANY="any",io.RADIANS="radians",io.DEGREES="degrees",io.EXP="exp",io.EXP2="exp2",io.LOG="log",io.LOG2="log2",io.SQRT="sqrt",io.INVERSE_SQRT="inversesqrt",io.FLOOR="floor",io.CEIL="ceil",io.NORMALIZE="normalize",io.FRACT="fract",io.SIN="sin",io.COS="cos",io.TAN="tan",io.ASIN="asin",io.ACOS="acos",io.ATAN="atan",io.ABS="abs",io.SIGN="sign",io.LENGTH="length",io.NEGATE="negate",io.ONE_MINUS="oneMinus",io.DFDX="dFdx",io.DFDY="dFdy",io.ROUND="round",io.RECIPROCAL="reciprocal",io.TRUNC="trunc",io.FWIDTH="fwidth",io.TRANSPOSE="transpose",io.DETERMINANT="determinant",io.INVERSE="inverse",io.EQUALS="equals",io.MIN="min",io.MAX="max",io.STEP="step",io.REFLECT="reflect",io.DISTANCE="distance",io.DIFFERENCE="difference",io.DOT="dot",io.CROSS="cross",io.POW="pow",io.TRANSFORM_DIRECTION="transformDirection",io.MIX="mix",io.CLAMP="clamp",io.REFRACT="refract",io.SMOOTHSTEP="smoothstep",io.FACEFORWARD="faceforward";const no=fn(1e-6),ao=fn(1e6),oo=fn(Math.PI),uo=fn(2*Math.PI),lo=fn(2*Math.PI),co=fn(.5*Math.PI),ho=on(io,io.ALL).setParameterLength(1),po=on(io,io.ANY).setParameterLength(1),go=on(io,io.RADIANS).setParameterLength(1),mo=on(io,io.DEGREES).setParameterLength(1),fo=on(io,io.EXP).setParameterLength(1),yo=on(io,io.EXP2).setParameterLength(1),bo=on(io,io.LOG).setParameterLength(1),xo=on(io,io.LOG2).setParameterLength(1),To=on(io,io.SQRT).setParameterLength(1),_o=on(io,io.INVERSE_SQRT).setParameterLength(1),vo=on(io,io.FLOOR).setParameterLength(1),No=on(io,io.CEIL).setParameterLength(1),So=on(io,io.NORMALIZE).setParameterLength(1),Ro=on(io,io.FRACT).setParameterLength(1),Ao=on(io,io.SIN).setParameterLength(1),Eo=on(io,io.COS).setParameterLength(1),wo=on(io,io.TAN).setParameterLength(1),Co=on(io,io.ASIN).setParameterLength(1),Mo=on(io,io.ACOS).setParameterLength(1),Bo=on(io,io.ATAN).setParameterLength(1,2),Fo=on(io,io.ABS).setParameterLength(1),Lo=on(io,io.SIGN).setParameterLength(1),Po=on(io,io.LENGTH).setParameterLength(1),Do=on(io,io.NEGATE).setParameterLength(1),Uo=on(io,io.ONE_MINUS).setParameterLength(1),Io=on(io,io.DFDX).setParameterLength(1),Oo=on(io,io.DFDY).setParameterLength(1),Vo=on(io,io.ROUND).setParameterLength(1),ko=on(io,io.RECIPROCAL).setParameterLength(1),Go=on(io,io.TRUNC).setParameterLength(1),zo=on(io,io.FWIDTH).setParameterLength(1),$o=on(io,io.TRANSPOSE).setParameterLength(1),Wo=on(io,io.DETERMINANT).setParameterLength(1),Ho=on(io,io.INVERSE).setParameterLength(1),qo=on(io,io.MIN).setParameterLength(2,1/0),jo=on(io,io.MAX).setParameterLength(2,1/0),Xo=on(io,io.STEP).setParameterLength(2),Ko=on(io,io.REFLECT).setParameterLength(2),Qo=on(io,io.DISTANCE).setParameterLength(2),Yo=on(io,io.DIFFERENCE).setParameterLength(2),Zo=on(io,io.DOT).setParameterLength(2),Jo=on(io,io.CROSS).setParameterLength(2),eu=on(io,io.POW).setParameterLength(2),tu=e=>Pa(e,e),ru=e=>Pa(e,e,e),su=e=>Pa(e,e,e,e),iu=on(io,io.TRANSFORM_DIRECTION).setParameterLength(2),nu=e=>Pa(Lo(e),eu(Fo(e),1/3)),au=e=>Zo(e,e),ou=on(io,io.MIX).setParameterLength(3),uu=(e,t=0,r=1)=>new io(io.CLAMP,en(e),en(t),en(r)),lu=e=>uu(e),du=on(io,io.REFRACT).setParameterLength(3),cu=on(io,io.SMOOTHSTEP).setParameterLength(3),hu=on(io,io.FACEFORWARD).setParameterLength(3),pu=dn(([e])=>{const t=Zo(e.xy,Tn(12.9898,78.233)),r=Ua(t,oo);return Ro(Ao(r).mul(43758.5453))}),gu=(e,t,r)=>ou(t,r,e),mu=(e,t,r)=>cu(t,r,e),fu=(e,t)=>Xo(t,e),yu=hu,bu=_o;Ri("all",ho),Ri("any",po),Ri("radians",go),Ri("degrees",mo),Ri("exp",fo),Ri("exp2",yo),Ri("log",bo),Ri("log2",xo),Ri("sqrt",To),Ri("inverseSqrt",_o),Ri("floor",vo),Ri("ceil",No),Ri("normalize",So),Ri("fract",Ro),Ri("sin",Ao),Ri("cos",Eo),Ri("tan",wo),Ri("asin",Co),Ri("acos",Mo),Ri("atan",Bo),Ri("abs",Fo),Ri("sign",Lo),Ri("length",Po),Ri("lengthSq",au),Ri("negate",Do),Ri("oneMinus",Uo),Ri("dFdx",Io),Ri("dFdy",Oo),Ri("round",Vo),Ri("reciprocal",ko),Ri("trunc",Go),Ri("fwidth",zo),Ri("min",qo),Ri("max",jo),Ri("step",fu),Ri("reflect",Ko),Ri("distance",Qo),Ri("dot",Zo),Ri("cross",Jo),Ri("pow",eu),Ri("pow2",tu),Ri("pow3",ru),Ri("pow4",su),Ri("transformDirection",iu),Ri("mix",gu),Ri("clamp",uu),Ri("refract",du),Ri("smoothstep",mu),Ri("faceForward",hu),Ri("difference",Yo),Ri("saturate",lu),Ri("cbrt",nu),Ri("transpose",$o),Ri("determinant",Wo),Ri("inverse",Ho),Ri("rand",pu);class xu extends di{static get type(){return"ConditionalNode"}constructor(e,t,r=null){super(),this.condNode=e,this.ifNode=t,this.elseNode=r}generateNodeType(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,r=this.ifNode.isolate(),s=this.elseNode?this.elseNode.isolate():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?On(r).build(e):"";s.nodeProperty=l;const c=i.build(e,"bool");if(e.context.uniformFlow&&null!==a){const s=n.build(e,r),i=a.build(e,r),o=e.getTernary(c,s,i);return e.format(o,r,t)}e.addFlowCode(`\n${e.tab}if ( ${c} ) {\n\n`).addFlowTab();let h=n.build(e,r);if(h&&(u?h=l+" = "+h+";":(h="return "+h+";",null===o&&(d("TSL: Return statement used in an inline 'Fn()'. Define a layout struct to allow return values.",this.stackTrace),h="// "+h))),e.removeFlowTab().addFlowCode(e.tab+"\t"+h+"\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&&(d("TSL: Return statement used in an inline 'Fn()'. Define a layout struct to allow return values.",this.stackTrace),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 Tu=nn(xu).setParameterLength(2,3);Ri("select",Tu);class _u extends di{static get type(){return"ContextNode"}constructor(e=null,t={}){super(),this.isContextNode=!0,this.node=e,this.value=t}getScope(){return this.node.getScope()}generateNodeType(e){return this.node.getNodeType(e)}getFlowContextData(){const e=[];return this.traverse(t=>{!0===t.isContextNode&&e.push(t.value)}),Object.assign({},...e)}getMemberType(e,t){return this.node.getMemberType(e,t)}analyze(e){const t=e.addContext(this.value);this.node.build(e),e.setContext(t)}setup(e){const t=e.addContext(this.value);this.node.build(e),e.setContext(t)}generate(e,t){const r=e.addContext(this.value),s=this.node.build(e,t);return e.setContext(r),s}}const vu=(e=null,t={})=>{let r=e;return null!==r&&!0===r.isNode||(t=r||t,r=null),new _u(r,t)},Nu=e=>vu(e,{uniformFlow:!0}),Su=(e,t)=>vu(e,{nodeName:t});function Ru(e,t,r=null){return vu(r,{getShadow:({light:r,shadowColorNode:s})=>t===r?s.mul(e):s})}function Au(e,t=null){return vu(t,{getAO:(t,{material:r})=>!0===r.transparent?t:null!==t?t.mul(e):e})}function Eu(e,t){return d('TSL: "label()" has been deprecated. Use "setName()" instead.'),Su(e,t)}Ri("context",vu),Ri("label",Eu),Ri("uniformFlow",Nu),Ri("setName",Su),Ri("builtinShadowContext",(e,t,r)=>Ru(t,r,e)),Ri("builtinAOContext",(e,t)=>Au(t,e));class wu extends di{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}isIntent(e){return!0!==e.getDataFromNode(this).forceDeclaration&&this.intent}getIntent(){return this.intent}getMemberType(e,t){return this.node.getMemberType(e,t)}getElementType(e){return this.node.getElementType(e)}generateNodeType(e){return this.node.getNodeType(e)}getArrayCount(e){return this.node.getArrayCount(e)}isAssign(e){return e.getDataFromNode(this).assign}build(...e){const t=e[0];if(!1===this._hasStack(t)&&"setup"===t.buildStage&&(t.context.nodeLoop||t.context.nodeBlock)){let e=!1;if(this.node.isShaderCallNodeInternal&&null===this.node.shaderNode.getLayout()&&t.fnCall&&t.fnCall.shaderNode){if(t.getDataFromNode(this.node.shaderNode).hasLoop){t.getDataFromNode(this).forceDeclaration=!0,e=!0}}const r=t.getBaseStack();e?r.addToStackBefore(this):r.addToStack(this)}return this.isIntent(t)&&!0!==this.isAssign(t)?this.node.build(...e):super.build(...e)}generate(e){const{node:t,name:r,readOnly:s}=this,{renderer:i}=e,n=!0===i.backend.isWebGPUBackend;let a=!1,u=!1;s&&(a=e.isDeterministic(t),u=n?s:a);const l=this.getNodeType(e);if("void"==l){!0!==this.isIntent(e)&&o('TSL: ".toVar()" can not be used with void type.',this.stackTrace);return t.build(e)}const d=e.getVectorType(l),c=t.build(e,d),h=e.getVarFromNode(this,r,d,void 0,u),p=e.getPropertyName(h);let g=p;if(u)if(n)g=a?`const ${p}`:`let ${p}`;else{const r=t.getArrayCount(e);g=`const ${e.getVar(h.type,p,r)}`}return e.addLineFlowCode(`${g} = ${c}`,this),p}_hasStack(e){return void 0!==e.getDataFromNode(this).stack}}const Cu=nn(wu),Mu=(e,t=null)=>Cu(e,t).toStack(),Bu=(e,t=null)=>Cu(e,t,!0).toStack(),Fu=e=>Cu(e).setIntent(!0).toStack();Ri("toVar",Mu),Ri("toConst",Bu),Ri("toVarIntent",Fu);class Lu extends di{static get type(){return"SubBuild"}constructor(e,t,r=null){super(r),this.node=e,this.name=t,this.isSubBuildNode=!0}generateNodeType(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 Pu=(e,t,r=null)=>new Lu(en(e),t,r);class Du extends di{static get type(){return"VaryingNode"}constructor(e,t=null){super(),this.node=Pu(e,"VERTEX"),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)}generateNodeType(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=Pu(this.node,"VERTEX")}return r.needsInterpolation||(r.needsInterpolation="fragment"===e.shaderStage),r}setup(e){this.setupVarying(e),e.flowNodeFromShaderStage(ei.VERTEX,this.node)}analyze(e){this.setupVarying(e),e.flowNodeFromShaderStage(ei.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,ei.VERTEX);e.flowNodeFromShaderStage(ei.VERTEX,r.node,i,n),r[t]=n}return e.getPropertyName(s)}}const Uu=nn(Du).setParameterLength(1,2),Iu=e=>Uu(e);Ri("toVarying",Uu),Ri("toVertexStage",Iu);const Ou=dn(([e])=>{const t=e.mul(.9478672986).add(.0521327014).pow(2.4),r=e.mul(.0773993808),s=e.lessThanEqual(.04045);return ou(t,r,s)}).setLayout({name:"sRGBTransferEOTF",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),Vu=dn(([e])=>{const t=e.pow(.41666).mul(1.055).sub(.055),r=e.mul(12.92),s=e.lessThanEqual(.0031308);return ou(t,r,s)}).setLayout({name:"sRGBTransferOETF",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),ku="WorkingColorSpace";class Gu extends pi{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===ku?p.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!==p.enabled&&r!==s&&r&&s?(p.getTransfer(r)===g&&(i=wn(Ou(i.rgb),i.a)),p.getPrimaries(r)!==p.getPrimaries(s)&&(i=wn(Ln(p._getMatrix(new n,r,s)).mul(i.rgb),i.a)),p.getTransfer(s)===g&&(i=wn(Vu(i.rgb),i.a)),i):i}}const zu=(e,t)=>new Gu(en(e),ku,t),$u=(e,t)=>new Gu(en(e),t,ku);Ri("workingToColorSpace",zu),Ri("colorSpaceToWorking",$u);let Wu=class extends ci{static get type(){return"ReferenceElementNode"}constructor(e,t){super(e,t),this.referenceNode=e,this.isReferenceElementNode=!0}generateNodeType(){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 Hu extends di{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=ti.OBJECT}setGroup(e){return this.group=e,this}element(e){return new Wu(this,en(e))}setNodeType(e){const t=Na(null,e);null!==this.group&&t.setGroup(this.group),this.node=t}generateNodeType(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;enew qu(e,t,r);class Xu extends pi{static get type(){return"ToneMappingNode"}constructor(e,t=Qu,r=null){super("vec3"),this._toneMapping=e,this.exposureNode=t,this.colorNode=r}customCacheKey(){return ks(this._toneMapping)}setToneMapping(e){return this._toneMapping=e,this}getToneMapping(){return this._toneMapping}setup(e){const t=this.colorNode||e.context.color,r=this._toneMapping;if(r===m)return t;let s=null;const i=e.renderer.library.getToneMappingFunction(r);return null!==i?s=wn(i(t.rgb,this.exposureNode),t.a):(o("ToneMappingNode: Unsupported Tone Mapping configuration.",r),s=t),s}}const Ku=(e,t,r)=>new Xu(e,en(t),en(r)),Qu=ju("toneMappingExposure","float");Ri("toneMapping",(e,t,r)=>Ku(t,r,e));const Yu=new WeakMap;function Zu(e,t){let r=Yu.get(e);return void 0===r&&(r=new b(e,t),Yu.set(e,r)),r}class Ju extends xi{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=f,this.instanced=!1,this.attribute=null,this.global=!0,e&&!0===e.isBufferAttribute&&e.itemSize<=4&&(this.attribute=e,this.usage=e.usage,this.instanced=e.isInstancedBufferAttribute)}getHash(e){let t;if(0===this.bufferStride&&0===this.bufferOffset){let r=e.globalCache.getData(this.value);void 0===r&&(r={node:this},e.globalCache.setData(this.value,r)),t=r.node.id}else t=this.id;return String(t)}generateNodeType(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=e.getTypeLength(t),s=this.value,i=this.bufferStride||r,n=this.bufferOffset;let a;a=!0===s.isInterleavedBuffer?s:!0===s.isBufferAttribute?Zu(s.array,i):Zu(s,i);const o=new y(a,r,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=Uu(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}}function el(e,t=null,r=0,s=0,i=f,n=!1){return"mat3"===t||null===t&&9===e.itemSize?Ln(new Ju(e,"vec3",9,0).setUsage(i).setInstanced(n),new Ju(e,"vec3",9,3).setUsage(i).setInstanced(n),new Ju(e,"vec3",9,6).setUsage(i).setInstanced(n)):"mat4"===t||null===t&&16===e.itemSize?Pn(new Ju(e,"vec4",16,0).setUsage(i).setInstanced(n),new Ju(e,"vec4",16,4).setUsage(i).setInstanced(n),new Ju(e,"vec4",16,8).setUsage(i).setInstanced(n),new Ju(e,"vec4",16,12).setUsage(i).setInstanced(n)):new Ju(e,t,r,s).setUsage(i)}const tl=(e,t=null,r=0,s=0)=>el(e,t,r,s),rl=(e,t=null,r=0,s=0)=>el(e,t,r,s,f,!0),sl=(e,t=null,r=0,s=0)=>el(e,t,r,s,x,!0);Ri("toAttribute",e=>tl(e.value));class il extends di{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=ti.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 d('TSL: "label()" has been deprecated. Use "setName()" instead.',new Us),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 nl=(e,t=[64])=>{(0===t.length||t.length>3)&&o("TSL: compute() workgroupSize must have 1, 2, or 3 elements",new Us);for(let e=0;enl(e,r).setCount(t);Ri("compute",al),Ri("computeKernel",nl);class ol extends di{static get type(){return"IsolateNode"}constructor(e,t=!0){super(),this.node=e,this.parent=t,this.isIsolateNode=!0}generateNodeType(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}setParent(e){return this.parent=e,this}getParent(){return this.parent}}const ul=e=>new ol(en(e));function ll(e,t=!0){return d('TSL: "cache()" has been deprecated. Use "isolate()" instead.'),ul(e).setParent(t)}Ri("cache",ll),Ri("isolate",ul);class dl extends di{static get type(){return"BypassNode"}constructor(e,t){super(),this.isBypassNode=!0,this.outputNode=e,this.callNode=t}generateNodeType(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 cl=nn(dl).setParameterLength(2);Ri("bypass",cl);const hl=dn(([e,t,r,s=fn(0),i=fn(1),n=xn(!1)])=>{let a=e.sub(t).div(r.sub(t));return Yi(n)&&(a=a.clamp()),a.mul(i.sub(s)).add(s)});function pl(e,t,r,s=fn(0),i=fn(1)){return hl(e,t,r,s,i,!0)}Ri("remap",hl),Ri("remapClamp",pl);class gl extends di{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 ml=nn(gl).setParameterLength(1,2),fl=e=>(e?Tu(e,ml("discard")):ml("discard")).toStack();Ri("discard",fl);class yl extends pi{static get type(){return"RenderOutputNode"}constructor(e,t,r){super("vec4"),this.colorNode=e,this._toneMapping=t,this.outputColorSpace=r,this.isRenderOutputNode=!0}setToneMapping(e){return this._toneMapping=e,this}getToneMapping(){return this._toneMapping}setup({context:e}){let t=this.colorNode||e.color;const r=(null!==this._toneMapping?this._toneMapping:e.toneMapping)||m,s=(null!==this.outputColorSpace?this.outputColorSpace:e.outputColorSpace)||T;return r!==m&&(t=t.toneMapping(r)),s!==T&&s!==p.workingColorSpace&&(t=t.workingToColorSpace(s)),t}}const bl=(e,t=null,r=null)=>new yl(en(e),t,r);Ri("renderOutput",bl);class xl extends pi{static get type(){return"DebugNode"}constructor(e,t=null){super(),this.node=e,this.callback=t}generateNodeType(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);if(null!==t)t(e,r);else{const t="--- TSL debug - "+e.shaderStage+" shader ---",s="-".repeat(t.length);let i="";i+="// #"+t+"#\n",i+=e.flow.code.replace(/^\t/gm,"")+"\n",i+="/* ... */ "+r+" /* ... */\n",i+="// #"+s+"#\n",_(i)}return r}}const Tl=(e,t=null)=>new xl(en(e),t).toStack();Ri("debug",Tl);class _l extends u{constructor(){super(),this._renderer=null,this.currentFrame=null}get nodeFrame(){return this._renderer._nodes.nodeFrame}setRenderer(e){return this._renderer=e,this}getRenderer(){return this._renderer}init(){}begin(){}finish(){}inspect(){}computeAsync(){}beginCompute(){}finishCompute(){}beginRender(){}finishRender(){}copyTextureToTexture(){}copyFramebufferToTexture(){}}class vl extends di{static get type(){return"InspectorNode"}constructor(e,t="",r=null){super(),this.node=e,this.name=t,this.callback=r,this.updateType=ti.FRAME,this.isInspectorNode=!0}getName(){return this.name||this.node.name}update(e){e.renderer.inspector.inspect(this)}generateNodeType(e){return this.node.getNodeType(e)}setup(e){let t=this.node;return!0===e.context.inspector&&null!==this.callback&&(t=this.callback(t)),!0!==e.renderer.backend.isWebGPUBackend&&e.renderer.inspector.constructor!==_l&&v('TSL: ".toInspector()" is only available with WebGPU.'),t}}function Nl(e,t="",r=null){return(e=en(e)).before(new vl(e,t,r))}Ri("toInspector",Nl);class Sl extends di{static get type(){return"AttributeNode"}constructor(e,t=null){super(t),this.global=!0,this._attributeName=e}getHash(e){return this.getAttributeName(e)}generateNodeType(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 Uu(this).build(e,r)}return d(`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 Rl=(e,t=null)=>new Sl(e,t),Al=(e=0)=>Rl("uv"+(e>0?e:""),"vec2");class El extends di{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 wl=nn(El).setParameterLength(1,2);class Cl extends va{static get type(){return"MaxMipLevelNode"}constructor(e){super(0),this._textureNode=e,this.updateType=ti.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 Ml=nn(Cl).setParameterLength(1);class Bl extends Error{constructor(e,t=null){super(e),this.name="NodeError",this.stackTrace=t}}const Fl=new N;class Ll extends va{static get type(){return"TextureNode"}constructor(e=Fl,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.offsetNode=null,this.sampler=!0,this.updateMatrix=!1,this.updateType=ti.NONE,this.referenceNode=null,this._value=e,this._matrixUniform=null,this._flipYUniform=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}generateNodeType(){return!0===this.value.isDepthTexture?"float":this.value.type===S?"uvec4":this.value.type===R?"ivec4":"vec4"}getInputType(){return"texture"}getDefaultUV(){return Al(this.value.channel)}updateReference(){return this.value}getTransformedUV(e){return null===this._matrixUniform&&(this._matrixUniform=Na(this.value.matrix)),this._matrixUniform.mul(Sn(e,1)).xy}setUpdateMatrix(e){return this.updateMatrix=e,this}setupUV(e,t){return e.isFlipY()&&(null===this._flipYUniform&&(this._flipYUniform=Na(!1)),t=t.toVar(),t=this.sampler?this._flipYUniform.select(t.flipY(),t):this._flipYUniform.select(t.setY(yn(wl(this,this.levelNode).y).sub(t.y).sub(1)),t)),t}setup(e){const t=e.getNodeProperties(this);t.referenceNode=this.referenceNode;const r=this.value;if(!r||!0!==r.isTexture)throw new Bl("THREE.TSL: `texture( value )` function expects a valid instance of THREE.Texture().",this.stackTrace);const s=dn(()=>{let t=this.uvNode;return null!==t&&!0!==e.context.forceUVContext||!e.context.getUV||(t=e.context.getUV(this,e)),t||(t=this.getDefaultUV()),!0===this.updateMatrix&&(t=this.getTransformedUV(t)),t=this.setupUV(e,t),this.updateType=null!==this._matrixUniform||null!==this._flipYUniform?ti.OBJECT:ti.NONE,t})();let i=this.levelNode;null===i&&e.context.getTextureLevel&&(i=e.context.getTextureLevel(this));let n=null,a=null;if(null!==this.compareNode)if(e.renderer.hasCompatibility(A.TEXTURE_COMPARE))n=this.compareNode;else{const e=r.compareFunction;null===e||e===E||e===w||e===C||e===M?a=this.compareNode:(n=this.compareNode,v('TSL: Only "LessCompare", "LessEqualCompare", "GreaterCompare" and "GreaterEqualCompare" are supported for depth texture comparison fallback.'))}t.uvNode=s,t.levelNode=i,t.biasNode=this.biasNode,t.compareNode=n,t.compareStepNode=a,t.gradNode=this.gradNode,t.depthNode=this.depthNode,t.offsetNode=this.offsetNode}generateUV(e,t){return t.build(e,!0===this.sampler?"vec2":"ivec2")}generateOffset(e,t){return t.build(e,"ivec2")}generateSnippet(e,t,r,s,i,n,a,o,u){const l=this.value;let d;return d=i?e.generateTextureBias(l,t,r,i,n,u):o?e.generateTextureGrad(l,t,r,o,n,u):a?e.generateTextureCompare(l,t,r,a,n,u):!1===this.sampler?e.generateTextureLoad(l,t,r,s,n,u):s?e.generateTextureLevel(l,t,r,s,n,u):e.generateTexture(l,t,r,n,u),d}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),a=this.getNodeType(e);let o=n.propertyName;if(void 0===o){const{uvNode:t,levelNode:u,biasNode:l,compareNode:d,compareStepNode:c,depthNode:h,gradNode:p,offsetNode:g}=s,m=this.generateUV(e,t),f=u?u.build(e,"float"):null,y=l?l.build(e,"float"):null,b=h?h.build(e,"int"):null,x=d?d.build(e,"float"):null,T=c?c.build(e,"float"):null,_=p?[p[0].build(e,"vec2"),p[1].build(e,"vec2")]:null,v=g?this.generateOffset(e,g):null;let N=b;null===N&&r.isArrayTexture&&!0!==this.isTexture3DNode&&(N="0");const S=e.getVarFromNode(this);o=e.getPropertyName(S);let R=this.generateSnippet(e,i,m,f,y,N,x,_,v);if(null!==T){const t=r.compareFunction;R=t===C||t===M?Xo(ml(R,a),ml(T,"float")).build(e,a):Xo(ml(T,"float"),ml(R,a)).build(e,a)}e.addLineFlowCode(`${o} = ${R}`,this),n.snippet=R,n.propertyName=o}let u=o;return e.needsToWorkingColorSpace(r)&&(u=$u(ml(u,a),r.colorSpace).setup(e).build(e,a)),e.format(u,a,t)}}setSampler(e){return this.sampler=e,this}getSampler(){return this.sampler}sample(e){const t=this.clone();return t.uvNode=en(e),t.referenceNode=this.getBase(),en(t)}load(e){return this.sample(e).setSampler(!1)}blur(e){const t=this.clone();t.biasNode=en(e).mul(Ml(t)),t.referenceNode=this.getBase();const r=t.value;return!1===t.generateMipmaps&&(r&&!1===r.generateMipmaps||r.minFilter===B||r.magFilter===B)&&(d("TSL: texture().blur() requires mipmaps and sampling. Use .generateMipmaps=true and .minFilter/.magFilter=THREE.LinearFilter in the Texture."),t.biasNode=null),en(t)}level(e){const t=this.clone();return t.levelNode=en(e),t.referenceNode=this.getBase(),en(t)}size(e){return wl(this,e)}bias(e){const t=this.clone();return t.biasNode=en(e),t.referenceNode=this.getBase(),en(t)}getBase(){return this.referenceNode?this.referenceNode.getBase():this}compare(e){const t=this.clone();return t.compareNode=en(e),t.referenceNode=this.getBase(),en(t)}grad(e,t){const r=this.clone();return r.gradNode=[en(e),en(t)],r.referenceNode=this.getBase(),en(r)}depth(e){const t=this.clone();return t.depthNode=en(e),t.referenceNode=this.getBase(),en(t)}offset(e){const t=this.clone();return t.offsetNode=en(e),t.referenceNode=this.getBase(),en(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();const r=this._flipYUniform;null!==r&&(r.value=e.image instanceof ImageBitmap&&!0===e.flipY||!0===e.isRenderTargetTexture||!0===e.isFramebufferTexture||!0===e.isDepthTexture)}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.offsetNode=this.offsetNode,e}}const Pl=nn(Ll).setParameterLength(1,4).setName("texture"),Dl=(e=Fl,t=null,r=null,s=null)=>{let i;return e&&!0===e.isTextureNode?(i=en(e.clone()),i.referenceNode=e.getBase(),null!==t&&(i.uvNode=en(t)),null!==r&&(i.levelNode=en(r)),null!==s&&(i.biasNode=en(s))):i=Pl(e,t,r,s),i},Ul=(...e)=>Dl(...e).setSampler(!1);class Il extends va{static get type(){return"BufferNode"}constructor(e,t,r=0){super(e,t),this.isBufferNode=!0,this.bufferType=t,this.bufferCount=r,this.updateRanges=[]}addUpdateRange(e,t){this.updateRanges.push({start:e,count:t})}clearUpdateRanges(){this.updateRanges.length=0}getElementType(e){return this.getNodeType(e)}getInputType(){return"buffer"}}const Ol=(e,t,r)=>new Il(e,t,r);class Vl extends ci{static get type(){return"UniformArrayElementNode"}constructor(e,t){super(e,t),this.isArrayBufferElementNode=!0}generate(e){const t=super.generate(e),r=this.getNodeType(e),s=this.node.getPaddedType();return e.format(t,s,r)}}class kl extends Il{static get type(){return"UniformArrayNode"}constructor(e,t=null){super(null),this.array=e,this.elementType=null===t?Xs(e[0]):t,this.paddedType=this.getPaddedType(),this.updateType=ti.RENDER,this.isArrayBufferNode=!0}generateNodeType(){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;rnew kl(e,t);class zl extends di{constructor(e){super("float"),this.name=e,this.isBuiltinNode=!0}generate(){return this.name}}const $l=nn(zl).setParameterLength(1);let Wl,Hl;class ql extends di{static get type(){return"ScreenNode"}constructor(e){super(),this.scope=e,this._output=null,this.isViewportNode=!0}generateNodeType(){return this.scope===ql.DPR?"float":this.scope===ql.VIEWPORT?"vec4":"vec2"}getUpdateType(){let e=ti.NONE;return this.scope!==ql.SIZE&&this.scope!==ql.VIEWPORT&&this.scope!==ql.DPR||(e=ti.RENDER),this.updateType=e,e}update({renderer:e}){const t=e.getRenderTarget();this.scope===ql.VIEWPORT?null!==t?Hl.copy(t.viewport):(e.getViewport(Hl),Hl.multiplyScalar(e.getPixelRatio())):this.scope===ql.DPR?this._output.value=e.getPixelRatio():null!==t?(Wl.width=t.width,Wl.height=t.height):e.getDrawingBufferSize(Wl)}setup(){const e=this.scope;let r=null;return r=e===ql.SIZE?Na(Wl||(Wl=new t)):e===ql.VIEWPORT?Na(Hl||(Hl=new s)):e===ql.DPR?Na(1):Tn(Ql.div(Kl)),this._output=r,r}generate(e){if(this.scope===ql.COORDINATE){let t=e.getFragCoord();if(e.isFlipY()){const r=e.getNodeProperties(Kl).outputNode.build(e);t=`${e.getType("vec2")}( ${t}.x, ${r}.y - ${t}.y )`}return t}return super.generate(e)}}ql.COORDINATE="coordinate",ql.VIEWPORT="viewport",ql.SIZE="size",ql.UV="uv",ql.DPR="dpr";const jl=an(ql,ql.DPR),Xl=an(ql,ql.UV),Kl=an(ql,ql.SIZE),Ql=an(ql,ql.COORDINATE),Yl=an(ql,ql.VIEWPORT),Zl=Yl.zw,Jl=Ql.sub(Yl.xy),ed=Jl.div(Zl),td=dn(()=>(d('TSL: "viewportResolution" is deprecated. Use "screenSize" instead.',new Us),Kl),"vec2").once()();let rd=null,sd=null,id=null,nd=null,ad=null,od=null,ud=null,ld=null,dd=null,cd=null,hd=null,pd=null,gd=null,md=null;const fd=Na(0,"uint").setName("u_cameraIndex").setGroup(ba("cameraIndex")).toVarying("v_cameraIndex"),yd=Na("float").setName("cameraNear").setGroup(Ta).onRenderUpdate(({camera:e})=>e.near),bd=Na("float").setName("cameraFar").setGroup(Ta).onRenderUpdate(({camera:e})=>e.far),xd=dn(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.projectionMatrix);null===sd?sd=Gl(r).setGroup(Ta).setName("cameraProjectionMatrices"):sd.array=r,t=sd.element(e.isMultiViewCamera?$l("gl_ViewID_OVR"):fd).toConst("cameraProjectionMatrix")}else null===rd&&(rd=Na(e.projectionMatrix).setName("cameraProjectionMatrix").setGroup(Ta).onRenderUpdate(({camera:e})=>e.projectionMatrix)),t=rd;return t}).once()(),Td=dn(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.projectionMatrixInverse);null===nd?nd=Gl(r).setGroup(Ta).setName("cameraProjectionMatricesInverse"):nd.array=r,t=nd.element(e.isMultiViewCamera?$l("gl_ViewID_OVR"):fd).toConst("cameraProjectionMatrixInverse")}else null===id&&(id=Na(e.projectionMatrixInverse).setName("cameraProjectionMatrixInverse").setGroup(Ta).onRenderUpdate(({camera:e})=>e.projectionMatrixInverse)),t=id;return t}).once()(),_d=dn(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.matrixWorldInverse);null===od?od=Gl(r).setGroup(Ta).setName("cameraViewMatrices"):od.array=r,t=od.element(e.isMultiViewCamera?$l("gl_ViewID_OVR"):fd).toConst("cameraViewMatrix")}else null===ad&&(ad=Na(e.matrixWorldInverse).setName("cameraViewMatrix").setGroup(Ta).onRenderUpdate(({camera:e})=>e.matrixWorldInverse)),t=ad;return t}).once()(),vd=dn(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.matrixWorld);null===ld?ld=Gl(r).setGroup(Ta).setName("cameraWorldMatrices"):ld.array=r,t=ld.element(e.isMultiViewCamera?$l("gl_ViewID_OVR"):fd).toConst("cameraWorldMatrix")}else null===ud&&(ud=Na(e.matrixWorld).setName("cameraWorldMatrix").setGroup(Ta).onRenderUpdate(({camera:e})=>e.matrixWorld)),t=ud;return t}).once()(),Nd=dn(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.normalMatrix);null===cd?cd=Gl(r).setGroup(Ta).setName("cameraNormalMatrices"):cd.array=r,t=cd.element(e.isMultiViewCamera?$l("gl_ViewID_OVR"):fd).toConst("cameraNormalMatrix")}else null===dd&&(dd=Na(e.normalMatrix).setName("cameraNormalMatrix").setGroup(Ta).onRenderUpdate(({camera:e})=>e.normalMatrix)),t=dd;return t}).once()(),Sd=dn(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const s=[];for(let t=0,i=e.cameras.length;t{const r=e.cameras,s=t.array;for(let e=0,t=r.length;et.value.setFromMatrixPosition(e.matrixWorld))),t=hd;return t}).once()(),Rd=dn(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.viewport);null===md?md=Gl(r,"vec4").setGroup(Ta).setName("cameraViewports"):md.array=r,t=md.element(fd).toConst("cameraViewport")}else null===gd&&(gd=wn(0,0,Kl.x,Kl.y).toConst("cameraViewport")),t=gd;return t}).once()(),Ad=new F;class Ed extends di{static get type(){return"Object3DNode"}constructor(e,t=null){super(),this.scope=e,this.object3d=t,this.updateType=ti.OBJECT,this.uniformNode=new va(null)}generateNodeType(){const e=this.scope;return e===Ed.WORLD_MATRIX?"mat4":e===Ed.POSITION||e===Ed.VIEW_POSITION||e===Ed.DIRECTION||e===Ed.SCALE?"vec3":e===Ed.RADIUS?"float":void 0}update(e){const t=this.object3d,s=this.uniformNode,i=this.scope;if(i===Ed.WORLD_MATRIX)s.value=t.matrixWorld;else if(i===Ed.POSITION)s.value=s.value||new r,s.value.setFromMatrixPosition(t.matrixWorld);else if(i===Ed.SCALE)s.value=s.value||new r,s.value.setFromMatrixScale(t.matrixWorld);else if(i===Ed.DIRECTION)s.value=s.value||new r,t.getWorldDirection(s.value);else if(i===Ed.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===Ed.RADIUS){const r=e.object.geometry;null===r.boundingSphere&&r.computeBoundingSphere(),Ad.copy(r.boundingSphere).applyMatrix4(t.matrixWorld),s.value=Ad.radius}}generate(e){const t=this.scope;return t===Ed.WORLD_MATRIX?this.uniformNode.nodeType="mat4":t===Ed.POSITION||t===Ed.VIEW_POSITION||t===Ed.DIRECTION||t===Ed.SCALE?this.uniformNode.nodeType="vec3":t===Ed.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}}Ed.WORLD_MATRIX="worldMatrix",Ed.POSITION="position",Ed.SCALE="scale",Ed.VIEW_POSITION="viewPosition",Ed.DIRECTION="direction",Ed.RADIUS="radius";const wd=nn(Ed,Ed.DIRECTION).setParameterLength(1),Cd=nn(Ed,Ed.WORLD_MATRIX).setParameterLength(1),Md=nn(Ed,Ed.POSITION).setParameterLength(1),Bd=nn(Ed,Ed.SCALE).setParameterLength(1),Fd=nn(Ed,Ed.VIEW_POSITION).setParameterLength(1),Ld=nn(Ed,Ed.RADIUS).setParameterLength(1);class Pd extends Ed{static get type(){return"ModelNode"}constructor(e){super(e)}update(e){this.object3d=e.object,super.update(e)}}const Dd=an(Pd,Pd.DIRECTION),Ud=an(Pd,Pd.WORLD_MATRIX),Id=an(Pd,Pd.POSITION),Od=an(Pd,Pd.SCALE),Vd=an(Pd,Pd.VIEW_POSITION),kd=an(Pd,Pd.RADIUS),Gd=Na(new n).onObjectUpdate(({object:e},t)=>t.value.getNormalMatrix(e.matrixWorld)),zd=Na(new a).onObjectUpdate(({object:e},t)=>t.value.copy(e.matrixWorld).invert()),$d=dn(e=>e.context.modelViewMatrix||Wd).once()().toVar("modelViewMatrix"),Wd=_d.mul(Ud),Hd=dn(e=>(e.context.isHighPrecisionModelViewMatrix=!0,Na("mat4").onObjectUpdate(({object:e,camera:t})=>e.modelViewMatrix.multiplyMatrices(t.matrixWorldInverse,e.matrixWorld)))).once()().toVar("highpModelViewMatrix"),qd=dn(e=>{const t=e.context.isHighPrecisionModelViewMatrix;return Na("mat3").onObjectUpdate(({object:e,camera:r})=>(!0!==t&&e.modelViewMatrix.multiplyMatrices(r.matrixWorldInverse,e.matrixWorld),e.normalMatrix.getNormalMatrix(e.modelViewMatrix)))}).once()().toVar("highpModelNormalViewMatrix"),jd=dn(e=>"fragment"!==e.shaderStage?(v("TSL: `clipSpace` is only available in fragment stage."),wn()):e.context.clipSpace.toVarying("v_clipSpace")).once()(),Xd=Rl("position","vec3"),Kd=Xd.toVarying("positionLocal"),Qd=Xd.toVarying("positionPrevious"),Yd=dn(e=>Ud.mul(Kd).xyz.toVarying(e.getSubBuildProperty("v_positionWorld")),"vec3").once(["POSITION"])(),Zd=dn(()=>Kd.transformDirection(Ud).toVarying("v_positionWorldDirection").normalize().toVar("positionWorldDirection"),"vec3").once(["POSITION"])(),Jd=dn(e=>{if("fragment"===e.shaderStage&&e.material.vertexNode){const e=Td.mul(jd);return e.xyz.div(e.w).toVar("positionView")}return e.context.setupPositionView().toVarying("v_positionView")},"vec3").once(["POSITION","VERTEX"])(),ec=dn(e=>{let t;return t=e.camera.isOrthographicCamera?Sn(0,0,1):Jd.negate().toVarying("v_positionViewDirection").normalize(),t.toVar("positionViewDirection")},"vec3").once(["POSITION"])();class tc extends di{static get type(){return"FrontFacingNode"}constructor(){super("bool"),this.isFrontFacingNode=!0}generate(e){if("fragment"!==e.shaderStage)return"true";const{material:t}=e;return t.side===L?"false":e.getFrontFacing()}}const rc=an(tc),sc=fn(rc).mul(2).sub(1),ic=dn(([e],{material:t})=>{const r=t.side;return r===L?e=e.mul(-1):r===P&&(e=e.mul(sc)),e}),nc=Rl("normal","vec3"),ac=dn(e=>!1===e.geometry.hasAttribute("normal")?(d('TSL: Vertex attribute "normal" not found on geometry.'),Sn(0,1,0)):nc,"vec3").once()().toVar("normalLocal"),oc=Jd.dFdx().cross(Jd.dFdy()).normalize().toVar("normalFlat"),uc=dn(e=>{let t;return t=e.isFlatShading()?oc:gc(ac).toVarying("v_normalViewGeometry").normalize(),t},"vec3").once()().toVar("normalViewGeometry"),lc=dn(e=>{let t=uc.transformDirection(_d);return!0!==e.isFlatShading()&&(t=t.toVarying("v_normalWorldGeometry")),t.normalize().toVar("normalWorldGeometry")},"vec3").once()(),dc=dn(e=>{let t;return"NORMAL"===e.subBuildFn||"VERTEX"===e.subBuildFn?(t=uc,!0!==e.isFlatShading()&&(t=ic(t))):t=e.context.setupNormal().context({getUV:null,getTextureLevel:null}),t},"vec3").once(["NORMAL","VERTEX"])().toVar("normalView"),cc=dc.transformDirection(_d).toVar("normalWorld"),hc=dn(({subBuildFn:e,context:t})=>{let r;return r="NORMAL"===e||"VERTEX"===e?dc:t.setupClearcoatNormal().context({getUV:null,getTextureLevel:null}),r},"vec3").once(["NORMAL","VERTEX"])().toVar("clearcoatNormalView"),pc=dn(([e,t=Ud])=>{const r=Ln(t),s=e.div(Sn(r[0].dot(r[0]),r[1].dot(r[1]),r[2].dot(r[2])));return r.mul(s).xyz}),gc=dn(([e],t)=>{const r=t.context.modelNormalViewMatrix;if(r)return r.transformDirection(e);const s=Gd.mul(e);return _d.transformDirection(s)}),mc=dn(()=>(d('TSL: "transformedNormalView" is deprecated. Use "normalView" instead.'),dc)).once(["NORMAL","VERTEX"])(),fc=dn(()=>(d('TSL: "transformedNormalWorld" is deprecated. Use "normalWorld" instead.'),cc)).once(["NORMAL","VERTEX"])(),yc=dn(()=>(d('TSL: "transformedClearcoatNormalView" is deprecated. Use "clearcoatNormalView" instead.'),hc)).once(["NORMAL","VERTEX"])(),bc=new D,xc=new a,Tc=Na(0).onReference(({material:e})=>e).onObjectUpdate(({material:e})=>e.refractionRatio),_c=Na(1).onReference(({material:e})=>e).onObjectUpdate(function({material:e,scene:t}){return e.envMap?e.envMapIntensity:t.environmentIntensity}),vc=Na(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?(bc.copy(r),xc.makeRotationFromEuler(bc)):xc.identity(),xc}),Nc=ec.negate().reflect(dc),Sc=ec.negate().refract(dc,Tc),Rc=Nc.transformDirection(_d).toVar("reflectVector"),Ac=Sc.transformDirection(_d).toVar("reflectVector"),Ec=new U;class wc extends Ll{static get type(){return"CubeTextureNode"}constructor(e,t=null,r=null,s=null){super(e,t,r,s),this.isCubeTextureNode=!0}getInputType(){return!0===this.value.isDepthTexture?"cubeDepthTexture":"cubeTexture"}getDefaultUV(){const e=this.value;return e.mapping===I?Rc:e.mapping===O?Ac:(o('CubeTextureNode: Mapping "%s" not supported.',e.mapping),Sn(0,0,0))}setUpdateMatrix(){}setupUV(e,t){const r=this.value;return!0===r.isDepthTexture?e.renderer.coordinateSystem===h?Sn(t.x,t.y.negate(),t.z):t:(e.renderer.coordinateSystem!==h&&r.isRenderTargetTexture||(t=Sn(t.x.negate(),t.yz)),vc.mul(t))}generateUV(e,t){return t.build(e,!0===this.sampler?"vec3":"ivec3")}}const Cc=nn(wc).setParameterLength(1,4).setName("cubeTexture"),Mc=(e=Ec,t=null,r=null,s=null)=>{let i;return e&&!0===e.isCubeTextureNode?(i=en(e.clone()),i.referenceNode=e,null!==t&&(i.uvNode=en(t)),null!==r&&(i.levelNode=en(r)),null!==s&&(i.biasNode=en(s))):i=Cc(e,t,r,s),i};class Bc extends ci{static get type(){return"ReferenceElementNode"}constructor(e,t){super(e,t),this.referenceNode=e,this.isReferenceElementNode=!0}generateNodeType(){return this.referenceNode.uniformType}generate(e){const t=super.generate(e),r=this.referenceNode.getNodeType(e),s=this.getNodeType(e);return e.format(t,r,s)}}class Fc extends di{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=ti.OBJECT}element(e){return new Bc(this,en(e))}setGroup(e){return this.group=e,this}setName(e){return this.name=e,this}label(e){return d('TSL: "label()" has been deprecated. Use "setName()" instead.'),this.setName(e)}setNodeType(e){let t=null;t=null!==this.count?Ol(null,e,this.count):Array.isArray(this.getValueFromReference())?Gl(null,e):"texture"===e?Dl(null):"cubeTexture"===e?Mc(null):Na(null,e),null!==this.group&&t.setGroup(this.group),null!==this.name&&t.setName(this.name),this.node=t}generateNodeType(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;enew Fc(e,t,r),Pc=(e,t,r,s)=>new Fc(e,t,s,r);class Dc extends Fc{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 Uc=(e,t,r=null)=>new Dc(e,t,r),Ic=Al(),Oc=Jd.dFdx(),Vc=Jd.dFdy(),kc=Ic.dFdx(),Gc=Ic.dFdy(),zc=dc,$c=Vc.cross(zc),Wc=zc.cross(Oc),Hc=$c.mul(kc.x).add(Wc.mul(Gc.x)),qc=$c.mul(kc.y).add(Wc.mul(Gc.y)),jc=Hc.dot(Hc).max(qc.dot(qc)),Xc=jc.equal(0).select(0,jc.inverseSqrt()),Kc=Hc.mul(Xc).toVar("tangentViewFrame"),Qc=qc.mul(Xc).toVar("bitangentViewFrame"),Yc=Rl("tangent","vec4"),Zc=Yc.xyz.toVar("tangentLocal"),Jc=dn(e=>{let t;return t="VERTEX"===e.subBuildFn||e.geometry.hasAttribute("tangent")?$d.mul(wn(Zc,0)).xyz.toVarying("v_tangentView").normalize():Kc,!0!==e.isFlatShading()&&(t=ic(t)),t},"vec3").once(["NORMAL","VERTEX"])().toVar("tangentView"),eh=Jc.transformDirection(_d).toVarying("v_tangentWorld").normalize().toVar("tangentWorld"),th=dn(([e,t],r)=>{let s=e.mul(Yc.w).xyz;return"NORMAL"===r.subBuildFn&&!0!==r.isFlatShading()&&(s=s.toVarying(t)),s}).once(["NORMAL"]),rh=th(nc.cross(Yc),"v_bitangentGeometry").normalize().toVar("bitangentGeometry"),sh=th(ac.cross(Zc),"v_bitangentLocal").normalize().toVar("bitangentLocal"),ih=dn(e=>{let t;return t="VERTEX"===e.subBuildFn||e.geometry.hasAttribute("tangent")?th(dc.cross(Jc),"v_bitangentView").normalize():Qc,!0!==e.isFlatShading()&&(t=ic(t)),t},"vec3").once(["NORMAL","VERTEX"])().toVar("bitangentView"),nh=th(cc.cross(eh),"v_bitangentWorld").normalize().toVar("bitangentWorld"),ah=Ln(Jc,ih,dc).toVar("TBNViewMatrix"),oh=ec.mul(ah),uh=dn(()=>{let e=ta.cross(ec);return e=e.cross(ta).normalize(),e=ou(e,dc,Jn.mul($n.oneMinus()).oneMinus().pow2().pow2()).normalize(),e}).once()(),lh=e=>en(e).mul(.5).add(.5),dh=e=>Sn(e,To(lu(fn(1).sub(Zo(e,e)))));class ch extends pi{static get type(){return"NormalMapNode"}constructor(e,t=null){super("vec3"),this.node=e,this.scaleNode=t,this.normalMapType=V,this.unpackNormalMode=k}setup(e){const{normalMapType:t,scaleNode:r,unpackNormalMode:s}=this;let i=this.node.mul(2).sub(1);if(t===V?s===G?i=dh(i.xy):s===z?i=dh(i.yw):s!==k&&console.error(`THREE.NodeMaterial: Unexpected unpack normal mode: ${s}`):s!==k&&console.error(`THREE.NodeMaterial: Normal map type '${t}' is not compatible with unpack normal mode '${s}'`),null!==r){let t=r;!0===e.isFlatShading()&&(t=ic(t)),i=Sn(i.xy.mul(t),i.z)}let n=null;return t===$?n=gc(i):t===V?n=ah.mul(i).normalize():(o(`NodeMaterial: Unsupported normal map type: ${t}`),n=dc),n}}const hh=nn(ch).setParameterLength(1,2),ph=dn(({textureNode:e,bumpScale:t})=>{const r=t=>e.isolate().context({getUV:e=>t(e.uvNode||Al()),forceUVContext:!0}),s=fn(r(e=>e));return Tn(fn(r(e=>e.add(e.dFdx()))).sub(s),fn(r(e=>e.add(e.dFdy()))).sub(s)).mul(t)}),gh=dn(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(sc),l=u.sign().mul(s.x.mul(a).add(s.y.mul(o)));return u.abs().mul(r).sub(l).normalize()});class mh extends pi{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=ph({textureNode:this.textureNode,bumpScale:e});return gh({surf_pos:Jd,surf_norm:dc,dHdxy:t})}}const fh=nn(mh).setParameterLength(1,2),yh=new Map;class bh extends di{static get type(){return"MaterialNode"}constructor(e){super(),this.scope=e}getCache(e,t){let r=yh.get(e);return void 0===r&&(r=Uc(e,t),yh.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===bh.COLOR){const e=void 0!==t.color?this.getColor(r):Sn();s=t.map&&!0===t.map.isTexture?e.mul(this.getTexture("map")):e}else if(r===bh.OPACITY){const e=this.getFloat(r);s=t.alphaMap&&!0===t.alphaMap.isTexture?e.mul(this.getTexture("alpha")):e}else if(r===bh.SPECULAR_STRENGTH)s=t.specularMap&&!0===t.specularMap.isTexture?this.getTexture("specular").r:fn(1);else if(r===bh.SPECULAR_INTENSITY){const e=this.getFloat(r);s=t.specularIntensityMap&&!0===t.specularIntensityMap.isTexture?e.mul(this.getTexture(r).a):e}else if(r===bh.SPECULAR_COLOR){const e=this.getColor(r);s=t.specularColorMap&&!0===t.specularColorMap.isTexture?e.mul(this.getTexture(r).rgb):e}else if(r===bh.ROUGHNESS){const e=this.getFloat(r);s=t.roughnessMap&&!0===t.roughnessMap.isTexture?e.mul(this.getTexture(r).g):e}else if(r===bh.METALNESS){const e=this.getFloat(r);s=t.metalnessMap&&!0===t.metalnessMap.isTexture?e.mul(this.getTexture(r).b):e}else if(r===bh.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===bh.NORMAL)t.normalMap?(s=hh(this.getTexture("normal"),this.getCache("normalScale","vec2")),s.normalMapType=t.normalMapType,t.normalMap.format!=W&&t.normalMap.format!=H&&t.normalMap.format!=q||(s.unpackNormalMode=G)):s=t.bumpMap?fh(this.getTexture("bump").r,this.getFloat("bumpScale")):dc;else if(r===bh.CLEARCOAT){const e=this.getFloat(r);s=t.clearcoatMap&&!0===t.clearcoatMap.isTexture?e.mul(this.getTexture(r).r):e}else if(r===bh.CLEARCOAT_ROUGHNESS){const e=this.getFloat(r);s=t.clearcoatRoughnessMap&&!0===t.clearcoatRoughnessMap.isTexture?e.mul(this.getTexture(r).r):e}else if(r===bh.CLEARCOAT_NORMAL)s=t.clearcoatNormalMap?hh(this.getTexture(r),this.getCache(r+"Scale","vec2")):dc;else if(r===bh.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===bh.SHEEN_ROUGHNESS){const e=this.getFloat(r);s=t.sheenRoughnessMap&&!0===t.sheenRoughnessMap.isTexture?e.mul(this.getTexture(r).a):e,s=s.clamp(1e-4,1)}else if(r===bh.ANISOTROPY)if(t.anisotropyMap&&!0===t.anisotropyMap.isTexture){const e=this.getTexture(r);s=Fn(rp.x,rp.y,rp.y.negate(),rp.x).mul(e.rg.mul(2).sub(Tn(1)).normalize().mul(e.b))}else s=rp;else if(r===bh.IRIDESCENCE_THICKNESS){const e=Lc("1","float",t.iridescenceThicknessRange);if(t.iridescenceThicknessMap){const i=Lc("0","float",t.iridescenceThicknessRange);s=e.sub(i).mul(this.getTexture(r).g).add(i)}else s=e}else if(r===bh.TRANSMISSION){const e=this.getFloat(r);s=t.transmissionMap?e.mul(this.getTexture(r).r):e}else if(r===bh.THICKNESS){const e=this.getFloat(r);s=t.thicknessMap?e.mul(this.getTexture(r).g):e}else if(r===bh.IOR)s=this.getFloat(r);else if(r===bh.LIGHT_MAP)s=this.getTexture(r).rgb.mul(this.getFloat("lightMapIntensity"));else if(r===bh.AO)s=this.getTexture(r).r.sub(1).mul(this.getFloat("aoMapIntensity")).add(1);else if(r===bh.LINE_DASH_OFFSET)s=t.dashOffset?this.getFloat(r):fn(0);else{const t=this.getNodeType(e);s=this.getCache(r,t)}return s}}bh.ALPHA_TEST="alphaTest",bh.COLOR="color",bh.OPACITY="opacity",bh.SHININESS="shininess",bh.SPECULAR="specular",bh.SPECULAR_STRENGTH="specularStrength",bh.SPECULAR_INTENSITY="specularIntensity",bh.SPECULAR_COLOR="specularColor",bh.REFLECTIVITY="reflectivity",bh.ROUGHNESS="roughness",bh.METALNESS="metalness",bh.NORMAL="normal",bh.CLEARCOAT="clearcoat",bh.CLEARCOAT_ROUGHNESS="clearcoatRoughness",bh.CLEARCOAT_NORMAL="clearcoatNormal",bh.EMISSIVE="emissive",bh.ROTATION="rotation",bh.SHEEN="sheen",bh.SHEEN_ROUGHNESS="sheenRoughness",bh.ANISOTROPY="anisotropy",bh.IRIDESCENCE="iridescence",bh.IRIDESCENCE_IOR="iridescenceIOR",bh.IRIDESCENCE_THICKNESS="iridescenceThickness",bh.IOR="ior",bh.TRANSMISSION="transmission",bh.THICKNESS="thickness",bh.ATTENUATION_DISTANCE="attenuationDistance",bh.ATTENUATION_COLOR="attenuationColor",bh.LINE_SCALE="scale",bh.LINE_DASH_SIZE="dashSize",bh.LINE_GAP_SIZE="gapSize",bh.LINE_WIDTH="linewidth",bh.LINE_DASH_OFFSET="dashOffset",bh.POINT_SIZE="size",bh.DISPERSION="dispersion",bh.LIGHT_MAP="light",bh.AO="ao";const xh=an(bh,bh.ALPHA_TEST),Th=an(bh,bh.COLOR),_h=an(bh,bh.SHININESS),vh=an(bh,bh.EMISSIVE),Nh=an(bh,bh.OPACITY),Sh=an(bh,bh.SPECULAR),Rh=an(bh,bh.SPECULAR_INTENSITY),Ah=an(bh,bh.SPECULAR_COLOR),Eh=an(bh,bh.SPECULAR_STRENGTH),wh=an(bh,bh.REFLECTIVITY),Ch=an(bh,bh.ROUGHNESS),Mh=an(bh,bh.METALNESS),Bh=an(bh,bh.NORMAL),Fh=an(bh,bh.CLEARCOAT),Lh=an(bh,bh.CLEARCOAT_ROUGHNESS),Ph=an(bh,bh.CLEARCOAT_NORMAL),Dh=an(bh,bh.ROTATION),Uh=an(bh,bh.SHEEN),Ih=an(bh,bh.SHEEN_ROUGHNESS),Oh=an(bh,bh.ANISOTROPY),Vh=an(bh,bh.IRIDESCENCE),kh=an(bh,bh.IRIDESCENCE_IOR),Gh=an(bh,bh.IRIDESCENCE_THICKNESS),zh=an(bh,bh.TRANSMISSION),$h=an(bh,bh.THICKNESS),Wh=an(bh,bh.IOR),Hh=an(bh,bh.ATTENUATION_DISTANCE),qh=an(bh,bh.ATTENUATION_COLOR),jh=an(bh,bh.LINE_SCALE),Xh=an(bh,bh.LINE_DASH_SIZE),Kh=an(bh,bh.LINE_GAP_SIZE),Qh=an(bh,bh.LINE_WIDTH),Yh=an(bh,bh.LINE_DASH_OFFSET),Zh=an(bh,bh.POINT_SIZE),Jh=an(bh,bh.DISPERSION),ep=an(bh,bh.LIGHT_MAP),tp=an(bh,bh.AO),rp=Na(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))}),sp=dn(e=>e.context.setupModelViewProjection(),"vec4").once()().toVarying("v_modelViewProjection");class ip extends ci{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 np=nn(ip).setParameterLength(2);class ap extends Il{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=$s(e.itemSize),r=e.count):s=t,super(e,s,r),this.isStorageBufferNode=!0,this.structTypeNode=i,this.access=si.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){let t;if(0===this.bufferCount){let r=e.globalCache.getData(this.value);void 0===r&&(r={node:this},e.globalCache.setData(this.value,r)),t=r.node.id}else t=this.id;return String(t)}getInputType(){return this.value.isIndirectStorageBufferAttribute?"indirectStorageBuffer":"storageBuffer"}element(e){return np(this,e)}setPBO(e){return this.isPBO=e,this}getPBO(){return this.isPBO}setAccess(e){return this.access=e,this}toReadOnly(){return this.setAccess(si.READ_ONLY)}setAtomic(e){return this.isAtomic=e,this}toAtomic(){return this.setAtomic(!0)}getAttributeData(){return null===this._attribute&&(this._attribute=tl(this.value),this._varying=Uu(this._attribute)),{attribute:this._attribute,varying:this._varying}}generateNodeType(e){if(null!==this.structTypeNode)return this.structTypeNode.getNodeType(e);if(e.isAvailable("storageBuffer")||e.isAvailable("indirectStorageBuffer"))return super.generateNodeType(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 op=(e,t=null,r=0)=>new ap(e,t,r);class up extends di{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===up.VERTEX)s=e.getVertexIndex();else if(r===up.INSTANCE)s=e.getInstanceIndex();else if(r===up.DRAW)s=e.getDrawIndex();else if(r===up.INVOCATION_LOCAL)s=e.getInvocationLocalIndex();else if(r===up.INVOCATION_SUBGROUP)s=e.getInvocationSubgroupIndex();else{if(r!==up.SUBGROUP)throw new Error("THREE.IndexNode: Unknown scope: "+r);s=e.getSubgroupIndex()}if("vertex"===e.shaderStage||"compute"===e.shaderStage)i=s;else{i=Uu(this).build(e,t)}return i}}up.VERTEX="vertex",up.INSTANCE="instance",up.SUBGROUP="subgroup",up.INVOCATION_LOCAL="invocationLocal",up.INVOCATION_SUBGROUP="invocationSubgroup",up.DRAW="draw";const lp=an(up,up.VERTEX),dp=an(up,up.INSTANCE),cp=an(up,up.SUBGROUP),hp=an(up,up.INVOCATION_SUBGROUP),pp=an(up,up.INVOCATION_LOCAL),gp=an(up,up.DRAW);class mp extends di{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=ti.FRAME,this.buffer=null,this.bufferColor=null,this.previousInstanceMatrixNode=null}get isStorageMatrix(){const{instanceMatrix:e}=this;return e&&!0===e.isStorageInstancedBufferAttribute}get isStorageColor(){const{instanceColor:e}=this;return e&&!0===e.isStorageInstancedBufferAttribute}setup(e){let{instanceMatrixNode:t,instanceColorNode:r}=this;null===t&&(t=this._createInstanceMatrixNode(!0,e),this.instanceMatrixNode=t);const{instanceColor:s,isStorageColor:i}=this;if(s&&null===r){if(i)r=op(s,"vec3",Math.max(s.count,1)).element(dp);else{const e=new j(s.array,3),t=s.usage===x?sl:rl;this.bufferColor=e,r=Sn(t(e,"vec3",3,0))}this.instanceColorNode=r}const n=t.mul(Kd).xyz;if(Kd.assign(n),e.needsPreviousData()&&Qd.assign(this.getPreviousInstancedPosition(e)),e.hasGeometryAttribute("normal")){const e=pc(ac,t);ac.assign(e)}null!==this.instanceColorNode&&Vn("vec3","vInstanceColor").assign(this.instanceColorNode)}update(e){null!==this.buffer&&!0!==this.isStorageMatrix&&(this.buffer.clearUpdateRanges(),this.buffer.updateRanges.push(...this.instanceMatrix.updateRanges),this.instanceMatrix.version!==this.buffer.version&&(this.buffer.version=this.instanceMatrix.version)),this.instanceColor&&null!==this.bufferColor&&!0!==this.isStorageColor&&(this.bufferColor.clearUpdateRanges(),this.bufferColor.updateRanges.push(...this.instanceColor.updateRanges),this.instanceColor.version!==this.bufferColor.version&&(this.bufferColor.version=this.instanceColor.version)),null!==this.previousInstanceMatrixNode&&e.object.previousInstanceMatrix.array.set(this.instanceMatrix.array)}getPreviousInstancedPosition(e){const t=e.object;return null===this.previousInstanceMatrixNode&&(t.previousInstanceMatrix=this.instanceMatrix.clone(),this.previousInstanceMatrixNode=this._createInstanceMatrixNode(!1,e)),this.previousInstanceMatrixNode.mul(Qd).xyz}_createInstanceMatrixNode(e,t){let r;const{instanceMatrix:s}=this,{count:i}=s;if(this.isStorageMatrix)r=op(s,"mat4",Math.max(i,1)).element(dp);else{if(16*i*4<=t.getUniformBufferLimit())r=Ol(s.array,"mat4",Math.max(i,1)).element(dp);else{const t=new X(s.array,16,1);!0===e&&(this.buffer=t);const i=s.usage===x?sl:rl,n=[i(t,"vec4",16,0),i(t,"vec4",16,4),i(t,"vec4",16,8),i(t,"vec4",16,12)];r=Pn(...n)}}return r}}const fp=nn(mp).setParameterLength(2,3);class yp extends mp{static get type(){return"InstancedMeshNode"}constructor(e){const{count:t,instanceMatrix:r,instanceColor:s}=e;super(t,r,s),this.instancedMesh=e}}const bp=nn(yp).setParameterLength(1);class xp extends di{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=dp:this.batchingIdNode=gp);const t=dn(([e])=>{const t=yn(wl(Ul(this.batchMesh._indirectTexture),0).x).toConst(),r=yn(e).mod(t).toConst(),s=yn(e).div(t).toConst();return Ul(this.batchMesh._indirectTexture,_n(r,s)).x}).setLayout({name:"getIndirectIndex",type:"uint",inputs:[{name:"id",type:"int"}]}),r=t(yn(this.batchingIdNode)),s=this.batchMesh._matricesTexture,i=yn(wl(Ul(s),0).x).toConst(),n=fn(r).mul(4).toInt().toConst(),a=n.mod(i).toConst(),o=n.div(i).toConst(),u=Pn(Ul(s,_n(a,o)),Ul(s,_n(a.add(1),o)),Ul(s,_n(a.add(2),o)),Ul(s,_n(a.add(3),o))),l=this.batchMesh._colorsTexture;if(null!==l){const e=dn(([e])=>{const t=yn(wl(Ul(l),0).x).toConst(),r=e,s=r.mod(t).toConst(),i=r.div(t).toConst();return Ul(l,_n(s,i)).rgb}).setLayout({name:"getBatchingColor",type:"vec3",inputs:[{name:"id",type:"int"}]}),t=e(r);Vn("vec3","vBatchColor").assign(t)}const d=Ln(u);Kd.assign(u.mul(Kd));const c=ac.div(Sn(d[0].dot(d[0]),d[1].dot(d[1]),d[2].dot(d[2]))),h=d.mul(c).xyz;ac.assign(h),e.hasGeometryAttribute("tangent")&&Zc.mulAssign(d)}}const Tp=nn(xp).setParameterLength(1),_p=new WeakMap;class vp extends di{static get type(){return"SkinningNode"}constructor(e){super("void"),this.skinnedMesh=e,this.updateType=ti.OBJECT,this.skinIndexNode=Rl("skinIndex","uvec4"),this.skinWeightNode=Rl("skinWeight","vec4"),this.bindMatrixNode=Lc("bindMatrix","mat4"),this.bindMatrixInverseNode=Lc("bindMatrixInverse","mat4"),this.boneMatricesNode=Pc("skeleton.boneMatrices","mat4",e.skeleton.bones.length),this.positionNode=Kd,this.toPositionNode=Kd,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=Fa(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}getSkinnedNormalAndTangent(e=this.boneMatricesNode,t=ac,r=Zc){const{skinIndexNode:s,skinWeightNode:i,bindMatrixNode:n,bindMatrixInverseNode:a}=this,o=e.element(s.x),u=e.element(s.y),l=e.element(s.z),d=e.element(s.w);let c=Fa(i.x.mul(o),i.y.mul(u),i.z.mul(l),i.w.mul(d));c=a.mul(c).mul(n);return{skinNormal:c.transformDirection(t).xyz,skinTangent:c.transformDirection(r).xyz}}getPreviousSkinnedPosition(e){const t=e.object;return null===this.previousBoneMatricesNode&&(t.skeleton.previousBoneMatrices=new Float32Array(t.skeleton.boneMatrices),this.previousBoneMatricesNode=Pc("skeleton.previousBoneMatrices","mat4",t.skeleton.bones.length)),this.getSkinnedPosition(this.previousBoneMatricesNode,Qd)}setup(e){e.needsPreviousData()&&Qd.assign(this.getPreviousSkinnedPosition(e));const t=this.getSkinnedPosition();if(this.toPositionNode&&this.toPositionNode.assign(t),e.hasGeometryAttribute("normal")){const{skinNormal:t,skinTangent:r}=this.getSkinnedNormalAndTangent();ac.assign(t),e.hasGeometryAttribute("tangent")&&Zc.assign(r)}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;_p.get(t)!==e.frameId&&(_p.set(t,e.frameId),null!==this.previousBoneMatricesNode&&(null===t.previousBoneMatrices&&(t.previousBoneMatrices=new Float32Array(t.boneMatrices)),t.previousBoneMatrices.set(t.boneMatrices)),t.update())}}const Np=e=>new vp(e);class Sp extends di{static get type(){return"LoopNode"}constructor(e=[]){super("void"),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(l)?">=":"<")),a)n=`while ( ${l} )`;else{const r={start:u,end:l},s=r.start,i=r.end;let a;const g=()=>h.includes("<")?"+=":"-=";if(null!=p)switch(typeof p){case"function":a=e.flowStagesNode(t.updateNode,"void").code.replace(/\t|;/g,"");break;case"number":a=d+" "+g()+" "+e.generateConst(c,p);break;case"string":a=d+" "+p;break;default:p.isNode?a=d+" "+g()+" "+p.build(e):(o("TSL: 'Loop( { update: ... } )' is not a function, string or number.",this.stackTrace),a="break /* invalid update */")}else p="int"===c||"uint"===c?h.includes("<")?"++":"--":g()+" 1.",a=d+" "+p;n=`for ( ${e.getVar(c,d)+" = "+s}; ${d+" "+h+" "+i}; ${a} )`}e.addFlowCode((0===s?"\n":"")+e.tab+n+" {\n\n").addFlowTab()}const i=s.build(e,"void");t.returnsNode.build(e,"void"),e.removeFlowTab().addFlowCode("\n"+e.tab+i);for(let t=0,r=this.params.length-1;tnew Sp(sn(e,"int")).toStack(),Ap=()=>ml("break").toStack(),Ep=new WeakMap,wp=new s,Cp=dn(({bufferMap:e,influence:t,stride:r,width:s,depth:i,offset:n})=>{const a=yn(lp).mul(r).add(n),o=a.div(s),u=a.sub(o.mul(s));return Ul(e,_n(u,o)).depth(i).xyz.mul(t)});class Mp extends di{static get type(){return"MorphNode"}constructor(e){super("void"),this.mesh=e,this.morphBaseInfluence=Na(1),this.updateType=ti.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=Ep.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 K(m,h,p,a);f.type=Q,f.needsUpdate=!0;const y=4*c;for(let x=0;x{const t=fn(0).toVar();this.mesh.count>1&&null!==this.mesh.morphTexture&&void 0!==this.mesh.morphTexture?t.assign(Ul(this.mesh.morphTexture,_n(yn(e).add(1),yn(dp))).r):t.assign(Lc("morphTargetInfluences","float").element(e).toVar()),pn(t.notEqual(0),()=>{!0===s&&Kd.addAssign(Cp({bufferMap:o,influence:t,stride:u,width:d,depth:e,offset:yn(0)})),!0===i&&ac.addAssign(Cp({bufferMap:o,influence:t,stride:u,width:d,depth:e,offset:yn(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 Bp=nn(Mp).setParameterLength(1);class Fp extends di{static get type(){return"LightingNode"}constructor(){super("vec3"),this.isLightingNode=!0}}class Lp extends Fp{static get type(){return"AONode"}constructor(e=null){super(),this.aoNode=e}setup(e){e.context.ambientOcclusion.mulAssign(this.aoNode)}}class Pp extends _u{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:Sn().toVar("directDiffuse"),directSpecular:Sn().toVar("directSpecular"),indirectDiffuse:Sn().toVar("indirectDiffuse"),indirectSpecular:Sn().toVar("indirectSpecular")};return{radiance:Sn().toVar("radiance"),irradiance:Sn().toVar("irradiance"),iblIrradiance:Sn().toVar("iblIrradiance"),ambientOcclusion:fn(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 Dp=nn(Pp);class Up extends Fp{static get type(){return"IrradianceNode"}constructor(e){super(),this.node=e}setup(e){e.context.irradiance.addAssign(this.node)}}const Ip=new t;class Op extends Ll{static get type(){return"ViewportTextureNode"}constructor(e=Xl,t=null,r=null){let s=null;null===r?(s=new Y,s.minFilter=Z,r=s):s=r,super(r,e,t),this.generateMipmaps=!1,this.defaultFramebuffer=s,this.isOutputTextureNode=!0,this.updateBeforeType=ti.RENDER,this._cacheTextures=new WeakMap}getTextureForReference(e=null){let t,r;if(this.referenceNode?(t=this.referenceNode.defaultFramebuffer,r=this.referenceNode._cacheTextures):(t=this.defaultFramebuffer,r=this._cacheTextures),null===e)return t;if(!1===r.has(e)){const s=t.clone();r.set(e,s)}return r.get(e)}updateReference(e){const t=e.renderer,r=t.getRenderTarget(),s=t.getCanvasTarget(),i=r||s;return this.value=this.getTextureForReference(i),this.value}updateBefore(e){const t=e.renderer,r=t.getRenderTarget(),s=t.getCanvasTarget(),i=r||s;null===i?t.getDrawingBufferSize(Ip):i.getDrawingBufferSize?i.getDrawingBufferSize(Ip):Ip.set(i.width,i.height);const n=this.getTextureForReference(i);n.image.width===Ip.width&&n.image.height===Ip.height||(n.image.width=Ip.width,n.image.height=Ip.height,n.needsUpdate=!0);const a=n.generateMipmaps;n.generateMipmaps=this.generateMipmaps,t.copyFramebufferToTexture(n),n.generateMipmaps=a}clone(){const e=new this.constructor(this.uvNode,this.levelNode,this.value);return e.generateMipmaps=this.generateMipmaps,e}}const Vp=nn(Op).setParameterLength(0,3),kp=nn(Op,null,null,{generateMipmaps:!0}).setParameterLength(0,3),Gp=kp(),zp=(e=Xl,t=null)=>Gp.sample(e,t);let $p=null;class Wp extends Op{static get type(){return"ViewportDepthTextureNode"}constructor(e=Xl,t=null,r=null){null===r&&(null===$p&&($p=new J),r=$p),super(e,t,r)}}const Hp=nn(Wp).setParameterLength(0,3);class qp extends di{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===qp.DEPTH_BASE?e.getFragDepth():super.generate(e)}setup({camera:e}){const{scope:t}=this,r=this.valueNode;let s=null;if(t===qp.DEPTH_BASE)null!==r&&(s=Jp().assign(r));else if(t===qp.DEPTH)s=e.isPerspectiveCamera?Kp(Jd.z,yd,bd):jp(Jd.z,yd,bd);else if(t===qp.LINEAR_DEPTH)if(null!==r)if(e.isPerspectiveCamera){const e=Yp(r,yd,bd);s=jp(e,yd,bd)}else s=r;else s=jp(Jd.z,yd,bd);return s}}qp.DEPTH_BASE="depthBase",qp.DEPTH="depth",qp.LINEAR_DEPTH="linearDepth";const jp=(e,t,r)=>e.add(t).div(t.sub(r)),Xp=dn(([e,t,r],s)=>!0===s.renderer.reversedDepthBuffer?r.sub(t).mul(e).sub(r):t.sub(r).mul(e).sub(t)),Kp=(e,t,r)=>t.add(e).mul(r).div(r.sub(t).mul(e)),Qp=(e,t,r)=>t.mul(e.add(r)).div(e.mul(t.sub(r))),Yp=dn(([e,t,r],s)=>!0===s.renderer.reversedDepthBuffer?t.mul(r).div(t.sub(r).mul(e).sub(t)):t.mul(r).div(r.sub(t).mul(e).sub(r))),Zp=(e,t,r)=>{t=t.max(1e-6).toVar();const s=xo(e.negate().div(t)),i=xo(r.div(t));return s.div(i)},Jp=nn(qp,qp.DEPTH_BASE),eg=an(qp,qp.DEPTH),tg=nn(qp,qp.LINEAR_DEPTH).setParameterLength(0,1),rg=tg(Hp());eg.assign=e=>Jp(e);class sg extends di{static get type(){return"ClippingNode"}constructor(e=sg.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===sg.ALPHA_TO_COVERAGE?this.setupAlphaToCoverage(r,s):this.scope===sg.HARDWARE?this.setupHardwareClipping(s,e):this.setupDefault(r,s)}setupAlphaToCoverage(e,t){return dn(()=>{const r=fn().toVar("distanceToPlane"),s=fn().toVar("distanceToGradient"),i=fn(1).toVar("clipOpacity"),n=t.length;if(!1===this.hardwareClipping&&n>0){const e=Gl(t).setGroup(Ta);Rp(n,({i:t})=>{const n=e.element(t);r.assign(Jd.dot(n.xyz).negate().add(n.w)),s.assign(r.fwidth().div(2)),i.mulAssign(cu(s.negate(),s,r))})}const a=e.length;if(a>0){const t=Gl(e).setGroup(Ta),n=fn(1).toVar("intersectionClipOpacity");Rp(a,({i:e})=>{const i=t.element(e);r.assign(Jd.dot(i.xyz).negate().add(i.w)),s.assign(r.fwidth().div(2)),n.mulAssign(cu(s.negate(),s,r).oneMinus())}),i.mulAssign(n.oneMinus())}kn.a.mulAssign(i),kn.a.equal(0).discard()})()}setupDefault(e,t){return dn(()=>{const r=t.length;if(!1===this.hardwareClipping&&r>0){const e=Gl(t).setGroup(Ta);Rp(r,({i:t})=>{const r=e.element(t);Jd.dot(r.xyz).greaterThan(r.w).discard()})}const s=e.length;if(s>0){const t=Gl(e).setGroup(Ta),r=xn(!0).toVar("clipped");Rp(s,({i:e})=>{const s=t.element(e);r.assign(Jd.dot(s.xyz).greaterThan(s.w).and(r))}),r.discard()}})()}setupHardwareClipping(e,t){const r=e.length;return t.enableHardwareClipping(r),dn(()=>{const s=Gl(e).setGroup(Ta),i=$l(t.getClipDistance());Rp(r,({i:e})=>{const t=s.element(e),r=Jd.dot(t.xyz).sub(t.w).negate();i.element(e).assign(r)})})()}}sg.ALPHA_TO_COVERAGE="alphaToCoverage",sg.DEFAULT="default",sg.HARDWARE="hardware";const ig=dn(([e])=>Ro(Pa(1e4,Ao(Pa(17,e.x).add(Pa(.1,e.y)))).mul(Fa(.1,Fo(Ao(Pa(13,e.y).add(e.x))))))),ng=dn(([e])=>ig(Tn(ig(e.xy),e.z))),ag=dn(([e])=>{const t=jo(Po(Io(e.xyz)),Po(Oo(e.xyz))),r=fn(1).div(fn(.05).mul(t)).toVar("pixScale"),s=Tn(yo(vo(xo(r))),yo(No(xo(r)))),i=Tn(ng(vo(s.x.mul(e.xyz))),ng(vo(s.y.mul(e.xyz)))),n=Ro(xo(r)),a=Fa(Pa(n.oneMinus(),i.x),Pa(n,i.y)),o=qo(n,n.oneMinus()),u=Sn(a.mul(a).div(Pa(2,o).mul(La(1,o))),a.sub(Pa(.5,o)).div(La(1,o)),La(1,La(1,a).mul(La(1,a)).div(Pa(2,o).mul(La(1,o))))),l=a.lessThan(o.oneMinus()).select(a.lessThan(o).select(u.x,u.y),u.z);return uu(l,1e-6,1)}).setLayout({name:"getAlphaHashThreshold",type:"float",inputs:[{name:"position",type:"vec3"}]});class og extends Sl{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 ug=(e=0)=>new og(e),lg=dn(([e,t])=>qo(1,e.oneMinus().div(t)).oneMinus()).setLayout({name:"blendBurn",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),dg=dn(([e,t])=>qo(e.div(t.oneMinus()),1)).setLayout({name:"blendDodge",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),cg=dn(([e,t])=>e.oneMinus().mul(t.oneMinus()).oneMinus()).setLayout({name:"blendScreen",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),hg=dn(([e,t])=>ou(e.mul(2).mul(t),e.oneMinus().mul(2).mul(t.oneMinus()).oneMinus(),Xo(.5,e))).setLayout({name:"blendOverlay",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),pg=dn(([e,t])=>{const r=t.a.add(e.a.mul(t.a.oneMinus()));return wn(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"}]}),gg=dn(([e])=>wn(e.rgb.mul(e.a),e.a),{color:"vec4",return:"vec4"}),mg=dn(([e])=>(pn(e.a.equal(0),()=>wn(0)),wn(e.rgb.div(e.a),e.a)),{color:"vec4",return:"vec4"});class fg extends ee{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.maskShadowNode=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,this.contextNode=null}_getNodeChildren(){const e=[];for(const t of Object.getOwnPropertyNames(this)){if(!0===t.startsWith("_"))continue;const r=this[t];r&&!0===r.isNode&&e.push({property:t,childNode:r})}return e}customProgramCacheKey(){const e=[];for(const{property:t,childNode:r}of this._getNodeChildren())e.push(Os(t.slice(0,-4)),r.getCacheKey());return this.type+Vs(e)}build(e){this.setup(e)}setupObserver(e){return new Ps(e)}setup(e){e.context.setupNormal=()=>Pu(this.setupNormal(e),"NORMAL","vec3"),e.context.setupPositionView=()=>this.setupPositionView(e),e.context.setupModelViewProjection=()=>this.setupModelViewProjection(e);const t=e.renderer,r=t.getRenderTarget();!0===t.contextNode.isContextNode?e.context={...e.context,...t.contextNode.getFlowContextData()}:o('NodeMaterial: "renderer.contextNode" must be an instance of `context()`.'),null!==this.contextNode&&(!0===this.contextNode.isContextNode?e.context={...e.context,...this.contextNode.getFlowContextData()}:o('NodeMaterial: "material.contextNode" must be an instance of `context()`.')),e.addStack();const s=this.setupVertex(e),i=Pu(this.vertexNode||s,"VERTEX");let n;e.context.clipSpace=i,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.addToStack(a);const i=wn(s,kn.a).max(0);n=this.setupOutput(e,i),aa.assign(n);const o=null!==this.outputNode;if(o&&(n=this.outputNode),e.context.getOutput&&(n=e.context.getOutput(n,e)),null!==r){const e=t.getMRT(),r=this.mrtNode;null!==e?(o&&aa.assign(n),n=e,null!==r&&(n=e.merge(r))):null!==r&&(n=r)}}else{let t=this.fragmentNode;!0!==t.isOutputStructNode&&(t=wn(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.currentSamples;this.alphaToCoverage&&t>1?s=new sg(sg.ALPHA_TO_COVERAGE):e.stack.addToStack(new sg)}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.addToStack(new sg(sg.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?Zp(Jd.z,yd,bd):jp(Jd.z,yd,bd))}null!==s&&eg.assign(s).toStack()}setupPositionView(){return $d.mul(Kd).xyz}setupModelViewProjection(){return xd.mul(Jd)}setupVertex(e){return e.addStack(),this.setupPosition(e),e.context.position=e.removeStack(),sp}setupPosition(e){const{object:t,geometry:r}=e;if((r.morphAttributes.position||r.morphAttributes.normal||r.morphAttributes.color)&&Bp(t).toStack(),!0===t.isSkinnedMesh&&Np(t).toStack(),this.displacementMap){const e=Uc("displacementMap","texture"),t=Uc("displacementScale","float"),r=Uc("displacementBias","float");Kd.addAssign(ac.normalize().mul(e.x.mul(t).add(r)))}return t.isBatchedMesh&&Tp(t).toStack(),t.isInstancedMesh&&t.instanceMatrix&&!0===t.instanceMatrix.isInstancedBufferAttribute&&bp(t).toStack(),null!==this.positionNode&&Kd.assign(Pu(this.positionNode,"POSITION","vec3")),Kd}setupDiffuseColor(e){const{object:t,geometry:r}=e;null!==this.maskNode&&xn(this.maskNode).not().discard();let s=this.colorNode?wn(this.colorNode):Th;if(!0===this.vertexColors&&r.hasAttribute("color")&&(s=s.mul(ug())),t.instanceColor){s=Vn("vec3","vInstanceColor").mul(s)}if(t.isBatchedMesh&&t._colorsTexture){s=Vn("vec3","vBatchColor").mul(s)}kn.assign(s);const i=this.opacityNode?fn(this.opacityNode):Nh;kn.a.assign(kn.a.mul(i));let n=null;(null!==this.alphaTestNode||this.alphaTest>0)&&(n=null!==this.alphaTestNode?fn(this.alphaTestNode):xh,!0===this.alphaToCoverage?(kn.a=cu(n,n.add(zo(kn.a)),kn.a),kn.a.lessThanEqual(0).discard()):kn.a.lessThanEqual(n).discard()),!0===this.alphaHash&&kn.a.lessThan(ag(Kd)).discard(),e.isOpaque()&&kn.a.assign(1)}setupVariants(){}setupOutgoingLight(){return!0===this.lights?Sn(0):kn.rgb}setupNormal(){return this.normalNode?Sn(this.normalNode):Bh}setupEnvironment(){let e=null;return this.envNode?e=this.envNode:this.envMap&&(e=this.envMap.isCubeTexture?Uc("envMap","cubeTexture"):Uc("envMap","texture")),e}setupLightMap(e){let t=null;return e.material.lightMap&&(t=new Up(ep)),t}setupLights(e){const t=[],r=this.setupEnvironment(e);r&&r.isLightingNode&&t.push(r);const s=this.setupLightMap(e);s&&s.isLightingNode&&t.push(s);let i=this.aoNode;null===i&&e.material.aoMap&&(i=tp),e.context.getAO&&(i=e.context.getAO(i,e)),i&&t.push(new Lp(i));let n=this.lightsNode||e.lightsNode;return t.length>0&&(n=e.renderer.lighting.createNode([...n.getLights(),...t])),n}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=Dp(n,t,r,s)}else null!==r&&(a=Sn(null!==s?ou(a,r,s):r));return(i&&!0===i.isNode||t.emissive&&!0===t.emissive.isColor)&&(zn.assign(Sn(i||vh)),a=a.add(zn)),a}setupFog(e,t){const r=e.fogNode;return r&&(aa.assign(t),t=wn(r.toVar())),t}setupPremultipliedAlpha(e,t){return gg(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=ee.prototype.toJSON.call(this,e);r.inputNodes={};for(const{property:t,childNode:s}of this._getNodeChildren())r.inputNodes[t]=s.toJSON(e).uuid;function s(e){const t=[];for(const r in e){const s=e[r];delete s.metadata,t.push(s)}return t}if(t){const t=s(e.textures),i=s(e.images),n=s(e.nodes);t.length>0&&(r.textures=t),i.length>0&&(r.images=i),n.length>0&&(r.nodes=n)}return r}copy(e){return this.lightsNode=e.lightsNode,this.envNode=e.envNode,this.aoNode=e.aoNode,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.maskShadowNode=e.maskShadowNode,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,this.contextNode=e.contextNode,super.copy(e)}}const yg=new te;class bg extends fg{static get type(){return"LineBasicNodeMaterial"}constructor(e){super(),this.isLineBasicNodeMaterial=!0,this.setDefaultValues(yg),this.setValues(e)}}const xg=new re;class Tg extends fg{static get type(){return"LineDashedNodeMaterial"}constructor(e){super(),this.isLineDashedNodeMaterial=!0,this.setDefaultValues(xg),this.dashOffset=0,this.offsetNode=null,this.dashScaleNode=null,this.dashSizeNode=null,this.gapSizeNode=null,this.setValues(e)}setupVariants(){const e=this.offsetNode?fn(this.offsetNode):Yh,t=this.dashScaleNode?fn(this.dashScaleNode):jh,r=this.dashSizeNode?fn(this.dashSizeNode):Xh,s=this.gapSizeNode?fn(this.gapSizeNode):Kh;oa.assign(r),ua.assign(s);const i=Uu(Rl("lineDistance").mul(t));(e?i.add(e):i).mod(oa.add(ua)).greaterThan(oa).discard()}}const _g=new re;class vg extends fg{static get type(){return"Line2NodeMaterial"}constructor(e={}){super(),this.isLine2NodeMaterial=!0,this.setDefaultValues(_g),this.vertexColors=e.vertexColors,this.dashOffset=0,this.lineColorNode=null,this.offsetNode=null,this.dashScaleNode=null,this.dashSizeNode=null,this.gapSizeNode=null,this.blending=se,this._useDash=e.dashed,this._useAlphaToCoverage=!0,this._useWorldUnits=!1,this.setValues(e)}setup(e){const{renderer:t}=e,r=this._useAlphaToCoverage,s=this.vertexColors,i=this._useDash,n=this._useWorldUnits,a=dn(({start:e,end:t})=>{const r=xd.element(2).element(2),s=xd.element(3).element(2).mul(-.5).div(r).sub(e.z).div(t.z.sub(e.z));return wn(ou(e.xyz,t.xyz,s),t.w)}).setLayout({name:"trimSegment",type:"vec4",inputs:[{name:"start",type:"vec4"},{name:"end",type:"vec4"}]});this.vertexNode=dn(()=>{const e=Rl("instanceStart"),t=Rl("instanceEnd"),r=wn($d.mul(wn(e,1))).toVar("start"),s=wn($d.mul(wn(t,1))).toVar("end");if(i){const e=this.dashScaleNode?fn(this.dashScaleNode):jh,t=this.offsetNode?fn(this.offsetNode):Yh,r=Rl("instanceDistanceStart"),s=Rl("instanceDistanceEnd");let i=Xd.y.lessThan(.5).select(e.mul(r),e.mul(s));i=i.add(t),Vn("float","lineDistance").assign(i)}n&&(Vn("vec3","worldStart").assign(r.xyz),Vn("vec3","worldEnd").assign(s.xyz));const o=Yl.z.div(Yl.w),u=xd.element(2).element(3).equal(-1);pn(u,()=>{pn(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=xd.mul(r),d=xd.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=wn().toVar();if(n){const e=s.xyz.sub(r.xyz).normalize(),t=ou(r.xyz,s.xyz,.5).normalize(),n=e.cross(t).normalize(),a=e.cross(n),o=Vn("vec4","worldPos");o.assign(Xd.y.lessThan(.5).select(r,s));const u=Qh.mul(.5);o.addAssign(wn(Xd.x.lessThan(0).select(n.mul(u),n.mul(u).negate()),0)),i||(o.addAssign(wn(Xd.y.lessThan(.5).select(e.mul(u).negate(),e.mul(u)),0)),o.addAssign(wn(a.mul(u),0)),pn(Xd.y.greaterThan(1).or(Xd.y.lessThan(0)),()=>{o.subAssign(wn(a.mul(2).mul(u),0))})),g.assign(xd.mul(o));const l=Sn().toVar();l.assign(Xd.y.lessThan(.5).select(c,h)),g.z.assign(l.z.mul(g.w))}else{const e=Tn(p.y,p.x.negate()).toVar("offset");p.x.assign(p.x.div(o)),e.x.assign(e.x.div(o)),e.assign(Xd.x.lessThan(0).select(e.negate(),e)),pn(Xd.y.lessThan(0),()=>{e.assign(e.sub(p))}).ElseIf(Xd.y.greaterThan(1),()=>{e.assign(e.add(p))}),e.assign(e.mul(Qh)),e.assign(e.div(Yl.w.div(jl))),g.assign(Xd.y.lessThan(.5).select(l,d)),e.assign(e.mul(g.w)),g.assign(g.add(wn(e,0,0)))}return g})();const o=dn(({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 Tn(h,p)});if(this.colorNode=dn(()=>{const e=Al();if(i){const t=this.dashSizeNode?fn(this.dashSizeNode):Xh,r=this.gapSizeNode?fn(this.gapSizeNode):Kh;oa.assign(t),ua.assign(r);const s=Vn("float","lineDistance");e.y.lessThan(-1).or(e.y.greaterThan(1)).discard(),s.mod(oa.add(ua)).greaterThan(oa).discard()}const a=fn(1).toVar("alpha");if(n){const e=Vn("vec3","worldStart"),s=Vn("vec3","worldEnd"),n=Vn("vec4","worldPos").xyz.normalize().mul(1e5),u=s.sub(e),l=o({p1:e,p2:s,p3:Sn(0,0,0),p4:n}),d=e.add(u.mul(l.x)),c=n.mul(l.y),h=d.sub(c).length().div(Qh);if(!i)if(r&&t.currentSamples>0){const e=h.fwidth();a.assign(cu(e.negate().add(.5),e.add(.5),h).oneMinus())}else h.greaterThan(.5).discard()}else if(r&&t.currentSamples>0){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=fn(s.fwidth()).toVar("dlen");pn(e.y.abs().greaterThan(1),()=>{a.assign(cu(i.oneMinus(),i.add(1),s).oneMinus())})}else pn(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=Rl("instanceColorStart"),t=Rl("instanceColorEnd");u=Xd.y.lessThan(.5).select(e,t).mul(Th)}else u=Th;return wn(u,a)})(),this.transparent){const e=this.opacityNode?fn(this.opacityNode):Nh;this.outputNode=wn(this.colorNode.rgb.mul(e).add(zp().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 Ng=new ie;class Sg extends fg{static get type(){return"MeshNormalNodeMaterial"}constructor(e){super(),this.isMeshNormalNodeMaterial=!0,this.setDefaultValues(Ng),this.setValues(e)}setupDiffuseColor(){const e=this.opacityNode?fn(this.opacityNode):Nh;kn.assign($u(wn(lh(dc),e),ne))}}const Rg=dn(([e=Zd])=>{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 Tn(t,r)});class Ag extends ae{constructor(e=1,t={}){super(e,e,t),this.isCubeRenderTarget=!0;const r={width:e,height:e,depth:1},s=[r,r,r,r,r,r];this.texture=new U(s),this._setTextureOptions(t),this.texture.isRenderTargetTexture=!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 oe(5,5,5),n=Rg(Zd),a=new fg;a.colorNode=Dl(t,n,0),a.side=L,a.blending=se;const o=new ue(i,a),u=new le;u.add(o),t.minFilter===Z&&(t.minFilter=de);const l=new ce(1,10,this),d=e.getMRT();return e.setMRT(null),l.update(e,u),e.setMRT(d),t.minFilter=r,t.generateMipmaps=s,o.geometry.dispose(),o.material.dispose(),this}clear(e,t=!0,r=!0,s=!0){const i=e.getRenderTarget();for(let i=0;i<6;i++)e.setRenderTarget(this,i),e.clear(t,r,s);e.setRenderTarget(i)}}const Eg=new WeakMap;class wg extends pi{static get type(){return"CubeMapNode"}constructor(e){super("vec3"),this.envNode=e,this._cubeTexture=null,this._cubeTextureNode=Mc(null);const t=new U;t.isRenderTargetTexture=!0,this._defaultTexture=t,this.updateBeforeType=ti.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===he||r===pe){if(Eg.has(e)){const t=Eg.get(e);Mg(t,e.mapping),this._cubeTexture=t}else{const r=e.image;if(function(e){return null!=e&&e.height>0}(r)){const s=new Ag(r.height);s.fromEquirectangularTexture(t,e),Mg(s.texture,e.mapping),this._cubeTexture=s.texture,Eg.set(e,s.texture),e.addEventListener("dispose",Cg)}else this._cubeTexture=this._defaultTexture}this._cubeTextureNode.value=this._cubeTexture}else this._cubeTextureNode=this.envNode}}}setup(e){return this.updateBefore(e),this._cubeTextureNode}}function Cg(e){const t=e.target;t.removeEventListener("dispose",Cg);const r=Eg.get(t);void 0!==r&&(Eg.delete(t),r.dispose())}function Mg(e,t){t===he?e.mapping=I:t===pe&&(e.mapping=O)}const Bg=nn(wg).setParameterLength(1);class Fg extends Fp{static get type(){return"BasicEnvironmentNode"}constructor(e=null){super(),this.envNode=e}setup(e){e.context.environment=Bg(this.envNode)}}class Lg extends Fp{static get type(){return"BasicLightMapNode"}constructor(e=null){super(),this.lightMapNode=e}setup(e){const t=fn(1/Math.PI);e.context.irradianceLightMap=this.lightMapNode.mul(t)}}class Pg{start(e){e.lightsNode.setupLights(e,e.lightsNode.getLightNodes(e)),this.indirect(e)}finish(){}direct(){}directRectArea(){}indirect(){}ambientOcclusion(){}}class Dg extends Pg{constructor(){super()}indirect({context:e}){const t=e.ambientOcclusion,r=e.reflectedLight,s=e.irradianceLightMap;r.indirectDiffuse.assign(wn(0)),s?r.indirectDiffuse.addAssign(s):r.indirectDiffuse.addAssign(wn(1,1,1,0)),r.indirectDiffuse.mulAssign(t),r.indirectDiffuse.mulAssign(kn.rgb)}finish(e){const{material:t,context:r}=e,s=r.outgoingLight,i=e.context.environment;if(i)switch(t.combine){case fe:s.rgb.assign(ou(s.rgb,s.rgb.mul(i.rgb),Eh.mul(wh)));break;case me:s.rgb.assign(ou(s.rgb,i.rgb,Eh.mul(wh)));break;case ge:s.rgb.addAssign(i.rgb.mul(Eh.mul(wh)));break;default:d("BasicLightingModel: Unsupported .combine value:",t.combine)}}}const Ug=new ye;class Ig extends fg{static get type(){return"MeshBasicNodeMaterial"}constructor(e){super(),this.isMeshBasicNodeMaterial=!0,this.lights=!0,this.setDefaultValues(Ug),this.setValues(e)}setupNormal(){return ic(uc)}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new Fg(t):null}setupLightMap(e){let t=null;return e.material.lightMap&&(t=new Lg(ep)),t}setupOutgoingLight(){return kn.rgb}setupLightingModel(){return new Dg}}const Og=dn(({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))}),Vg=dn(e=>e.diffuseColor.mul(1/Math.PI)),kg=dn(({dotNH:e})=>na.mul(fn(.5)).add(1).mul(fn(1/Math.PI)).mul(e.pow(na))),Gg=dn(({lightDirection:e})=>{const t=e.add(ec).normalize(),r=dc.dot(t).clamp(),s=ec.dot(t).clamp(),i=Og({f0:ra,f90:1,dotVH:s}),n=fn(.25),a=kg({dotNH:r});return i.mul(n).mul(a)});class zg extends Dg{constructor(e=!0){super(),this.specular=e}direct({lightDirection:e,lightColor:t,reflectedLight:r}){const s=dc.dot(e).clamp().mul(t);r.directDiffuse.addAssign(s.mul(Vg({diffuseColor:kn.rgb}))),!0===this.specular&&r.directSpecular.addAssign(s.mul(Gg({lightDirection:e})).mul(Eh))}indirect(e){const{ambientOcclusion:t,irradiance:r,reflectedLight:s}=e.context;s.indirectDiffuse.addAssign(r.mul(Vg({diffuseColor:kn}))),s.indirectDiffuse.mulAssign(t)}}const $g=new be;class Wg extends fg{static get type(){return"MeshLambertNodeMaterial"}constructor(e){super(),this.isMeshLambertNodeMaterial=!0,this.lights=!0,this.setDefaultValues($g),this.setValues(e)}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new Fg(t):null}setupLightingModel(){return new zg(!1)}}const Hg=new xe;class qg extends fg{static get type(){return"MeshPhongNodeMaterial"}constructor(e){super(),this.isMeshPhongNodeMaterial=!0,this.lights=!0,this.shininessNode=null,this.specularNode=null,this.setDefaultValues(Hg),this.setValues(e)}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new Fg(t):null}setupLightingModel(){return new zg}setupVariants(){const e=(this.shininessNode?fn(this.shininessNode):_h).max(1e-4);na.assign(e);const t=this.specularNode||Sh;ra.assign(t)}copy(e){return this.shininessNode=e.shininessNode,this.specularNode=e.specularNode,super.copy(e)}}const jg=dn(e=>{if(!1===e.geometry.hasAttribute("normal"))return fn(0);const t=uc.dFdx().abs().max(uc.dFdy().abs());return t.x.max(t.y).max(t.z)}),Xg=dn(e=>{const{roughness:t}=e,r=jg();let s=t.max(.0525);return s=s.add(r),s=s.min(1),s}),Kg=dn(({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 Da(.5,i.add(n).max(no))}).setLayout({name:"V_GGX_SmithCorrelated",type:"float",inputs:[{name:"alpha",type:"float"},{name:"dotNL",type:"float"},{name:"dotNV",type:"float"}]}),Qg=dn(({alphaT:e,alphaB:t,dotTV:r,dotBV:s,dotTL:i,dotBL:n,dotNV:a,dotNL:o})=>{const u=o.mul(Sn(e.mul(r),t.mul(s),a).length()),l=a.mul(Sn(e.mul(i),t.mul(n),o).length());return Da(.5,u.add(l))}).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"}]}),Yg=dn(({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"}]}),Zg=fn(1/Math.PI),Jg=dn(({alphaT:e,alphaB:t,dotNH:r,dotTH:s,dotBH:i})=>{const n=e.mul(t),a=Sn(t.mul(s),e.mul(i),n.mul(r)),o=a.dot(a),u=n.div(o);return Zg.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"}]}),em=dn(({lightDirection:e,f0:t,f90:r,roughness:s,f:i,normalView:n=dc,USE_IRIDESCENCE:a,USE_ANISOTROPY:o})=>{const u=s.pow2(),l=e.add(ec).normalize(),d=n.dot(e).clamp(),c=n.dot(ec).clamp(),h=n.dot(l).clamp(),p=ec.dot(l).clamp();let g,m,f=Og({f0:t,f90:r,dotVH:p});if(Yi(a)&&(f=Kn.mix(f,i)),Yi(o)){const t=ea.dot(e),r=ea.dot(ec),s=ea.dot(l),i=ta.dot(e),n=ta.dot(ec),a=ta.dot(l);g=Qg({alphaT:Zn,alphaB:u,dotTV:r,dotBV:n,dotTL:t,dotBL:i,dotNV:c,dotNL:d}),m=Jg({alphaT:Zn,alphaB:u,dotNH:h,dotTH:s,dotBH:a})}else g=Kg({alpha:u,dotNL:d,dotNV:c}),m=Yg({alpha:u,dotNH:h});return f.mul(g).mul(m)}),tm=new Uint16Array([12469,15057,12620,14925,13266,14620,13807,14376,14323,13990,14545,13625,14713,13328,14840,12882,14931,12528,14996,12233,15039,11829,15066,11525,15080,11295,15085,10976,15082,10705,15073,10495,13880,14564,13898,14542,13977,14430,14158,14124,14393,13732,14556,13410,14702,12996,14814,12596,14891,12291,14937,11834,14957,11489,14958,11194,14943,10803,14921,10506,14893,10278,14858,9960,14484,14039,14487,14025,14499,13941,14524,13740,14574,13468,14654,13106,14743,12678,14818,12344,14867,11893,14889,11509,14893,11180,14881,10751,14852,10428,14812,10128,14765,9754,14712,9466,14764,13480,14764,13475,14766,13440,14766,13347,14769,13070,14786,12713,14816,12387,14844,11957,14860,11549,14868,11215,14855,10751,14825,10403,14782,10044,14729,9651,14666,9352,14599,9029,14967,12835,14966,12831,14963,12804,14954,12723,14936,12564,14917,12347,14900,11958,14886,11569,14878,11247,14859,10765,14828,10401,14784,10011,14727,9600,14660,9289,14586,8893,14508,8533,15111,12234,15110,12234,15104,12216,15092,12156,15067,12010,15028,11776,14981,11500,14942,11205,14902,10752,14861,10393,14812,9991,14752,9570,14682,9252,14603,8808,14519,8445,14431,8145,15209,11449,15208,11451,15202,11451,15190,11438,15163,11384,15117,11274,15055,10979,14994,10648,14932,10343,14871,9936,14803,9532,14729,9218,14645,8742,14556,8381,14461,8020,14365,7603,15273,10603,15272,10607,15267,10619,15256,10631,15231,10614,15182,10535,15118,10389,15042,10167,14963,9787,14883,9447,14800,9115,14710,8665,14615,8318,14514,7911,14411,7507,14279,7198,15314,9675,15313,9683,15309,9712,15298,9759,15277,9797,15229,9773,15166,9668,15084,9487,14995,9274,14898,8910,14800,8539,14697,8234,14590,7790,14479,7409,14367,7067,14178,6621,15337,8619,15337,8631,15333,8677,15325,8769,15305,8871,15264,8940,15202,8909,15119,8775,15022,8565,14916,8328,14804,8009,14688,7614,14569,7287,14448,6888,14321,6483,14088,6171,15350,7402,15350,7419,15347,7480,15340,7613,15322,7804,15287,7973,15229,8057,15148,8012,15046,7846,14933,7611,14810,7357,14682,7069,14552,6656,14421,6316,14251,5948,14007,5528,15356,5942,15356,5977,15353,6119,15348,6294,15332,6551,15302,6824,15249,7044,15171,7122,15070,7050,14949,6861,14818,6611,14679,6349,14538,6067,14398,5651,14189,5311,13935,4958,15359,4123,15359,4153,15356,4296,15353,4646,15338,5160,15311,5508,15263,5829,15188,6042,15088,6094,14966,6001,14826,5796,14678,5543,14527,5287,14377,4985,14133,4586,13869,4257,15360,1563,15360,1642,15358,2076,15354,2636,15341,3350,15317,4019,15273,4429,15203,4732,15105,4911,14981,4932,14836,4818,14679,4621,14517,4386,14359,4156,14083,3795,13808,3437,15360,122,15360,137,15358,285,15355,636,15344,1274,15322,2177,15281,2765,15215,3223,15120,3451,14995,3569,14846,3567,14681,3466,14511,3305,14344,3121,14037,2800,13753,2467,15360,0,15360,1,15359,21,15355,89,15346,253,15325,479,15287,796,15225,1148,15133,1492,15008,1749,14856,1882,14685,1886,14506,1783,14324,1608,13996,1398,13702,1183]);let rm=null;const sm=dn(({roughness:e,dotNV:t})=>{null===rm&&(rm=new Te(tm,16,16,W,_e),rm.name="DFG_LUT",rm.minFilter=de,rm.magFilter=de,rm.wrapS=ve,rm.wrapT=ve,rm.generateMipmaps=!1,rm.needsUpdate=!0);const r=Tn(e,t);return Dl(rm,r).rg}),im=dn(({lightDirection:e,f0:t,f90:r,roughness:s,f:i,USE_IRIDESCENCE:n,USE_ANISOTROPY:a})=>{const o=em({lightDirection:e,f0:t,f90:r,roughness:s,f:i,USE_IRIDESCENCE:n,USE_ANISOTROPY:a}),u=dc.dot(e).clamp(),l=dc.dot(ec).clamp(),d=sm({roughness:s,dotNV:l}),c=sm({roughness:s,dotNV:u}),h=t.mul(d.x).add(r.mul(d.y)),p=t.mul(c.x).add(r.mul(c.y)),g=d.x.add(d.y),m=c.x.add(c.y),f=fn(1).sub(g),y=fn(1).sub(m),b=t.add(t.oneMinus().mul(.047619)),x=h.mul(p).mul(b).div(fn(1).sub(f.mul(y).mul(b).mul(b)).add(no)),T=f.mul(y),_=x.mul(T);return o.add(_)}),nm=dn(e=>{const{dotNV:t,specularColor:r,specularF90:s,roughness:i}=e,n=sm({dotNV:t,roughness:i});return r.mul(n.x).add(s.mul(n.y))}),am=dn(({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(Sn(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"}]}),om=dn(({roughness:e,dotNH:t})=>{const r=e.pow2(),s=fn(1).div(r),i=t.pow2().oneMinus().max(.0078125);return fn(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"}]}),um=dn(({dotNV:e,dotNL:t})=>fn(1).div(fn(4).mul(t.add(e).sub(t.mul(e))))).setLayout({name:"V_Neubelt",type:"float",inputs:[{name:"dotNV",type:"float"},{name:"dotNL",type:"float"}]}),lm=dn(({lightDirection:e})=>{const t=e.add(ec).normalize(),r=dc.dot(e).clamp(),s=dc.dot(ec).clamp(),i=dc.dot(t).clamp(),n=om({roughness:Xn,dotNH:i}),a=um({dotNV:s,dotNL:r});return jn.mul(n).mul(a)}),dm=dn(({N:e,V:t,roughness:r})=>{const s=e.dot(t).saturate(),i=Tn(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"}]}),cm=dn(({f:e})=>{const t=e.length();return jo(t.mul(t).add(e.z).div(t.add(1)),0)}).setLayout({name:"LTC_ClippedSphereFormFactor",type:"float",inputs:[{name:"f",type:"vec3"}]}),hm=dn(({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,jo(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"}]}),pm=dn(({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=Sn().toVar();return pn(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(Ln(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=Sn(0).toVar();f.addAssign(hm({v1:h,v2:p})),f.addAssign(hm({v1:p,v2:g})),f.addAssign(hm({v1:g,v2:m})),f.addAssign(hm({v1:m,v2:h})),c.assign(Sn(cm({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"}]}),gm=dn(({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=Sn().toVar();return pn(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=Sn(0).toVar();d.addAssign(hm({v1:n,v2:a})),d.addAssign(hm({v1:a,v2:o})),d.addAssign(hm({v1:o,v2:l})),d.addAssign(hm({v1:l,v2:n})),u.assign(Sn(cm({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"}]}),mm=1/6,fm=e=>Pa(mm,Pa(e,Pa(e,e.negate().add(3)).sub(3)).add(1)),ym=e=>Pa(mm,Pa(e,Pa(e,Pa(3,e).sub(6))).add(4)),bm=e=>Pa(mm,Pa(e,Pa(e,Pa(-3,e).add(3)).add(3)).add(1)),xm=e=>Pa(mm,eu(e,3)),Tm=e=>fm(e).add(ym(e)),_m=e=>bm(e).add(xm(e)),vm=e=>Fa(-1,ym(e).div(fm(e).add(ym(e)))),Nm=e=>Fa(1,xm(e).div(bm(e).add(xm(e)))),Sm=(e,t,r)=>{const s=e.uvNode,i=Pa(s,t.zw).add(.5),n=vo(i),a=Ro(i),o=Tm(a.x),u=_m(a.x),l=vm(a.x),d=Nm(a.x),c=vm(a.y),h=Nm(a.y),p=Tn(n.x.add(l),n.y.add(c)).sub(.5).mul(t.xy),g=Tn(n.x.add(d),n.y.add(c)).sub(.5).mul(t.xy),m=Tn(n.x.add(l),n.y.add(h)).sub(.5).mul(t.xy),f=Tn(n.x.add(d),n.y.add(h)).sub(.5).mul(t.xy),y=Tm(a.y).mul(Fa(o.mul(e.sample(p).level(r)),u.mul(e.sample(g).level(r)))),b=_m(a.y).mul(Fa(o.mul(e.sample(m).level(r)),u.mul(e.sample(f).level(r))));return y.add(b)},Rm=dn(([e,t])=>{const r=Tn(e.size(yn(t))),s=Tn(e.size(yn(t.add(1)))),i=Da(1,r),n=Da(1,s),a=Sm(e,wn(i,r),vo(t)),o=Sm(e,wn(n,s),No(t));return Ro(t).mix(a,o)}),Am=dn(([e,t])=>{const r=t.mul(Ml(e));return Rm(e,r)}),Em=dn(([e,t,r,s,i])=>{const n=Sn(du(t.negate(),So(e),Da(1,s))),a=Sn(Po(i[0].xyz),Po(i[1].xyz),Po(i[2].xyz));return So(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"}]}),wm=dn(([e,t])=>e.mul(uu(t.mul(2).sub(2),0,1))).setLayout({name:"applyIorToRoughness",type:"float",inputs:[{name:"roughness",type:"float"},{name:"ior",type:"float"}]}),Cm=kp(),Mm=zp(),Bm=dn(([e,t,r],{material:s})=>{const i=(s.side===L?Cm:Mm).sample(e),n=xo(Kl.x).mul(wm(t,r));return Rm(i,n)}),Fm=dn(([e,t,r])=>(pn(r.notEqual(0),()=>{const s=bo(t).negate().div(r);return fo(s.negate().mul(e))}),Sn(1))).setLayout({name:"volumeAttenuation",type:"vec3",inputs:[{name:"transmissionDistance",type:"float"},{name:"attenuationColor",type:"vec3"},{name:"attenuationDistance",type:"float"}]}),Lm=dn(([e,t,r,s,i,n,a,o,u,l,d,c,h,p,g])=>{let m,f;if(g){m=wn().toVar(),f=Sn().toVar();const i=d.sub(1).mul(g.mul(.025)),n=Sn(d.sub(i),d,d.add(i));Rp({start:0,end:3},({i:i})=>{const d=n.element(i),g=Em(e,t,c,d,o),y=a.add(g),b=l.mul(u.mul(wn(y,1))),x=Tn(b.xy.div(b.w)).toVar();x.addAssign(1),x.divAssign(2),x.assign(Tn(x.x,x.y.oneMinus()));const T=Bm(x,r,d);m.element(i).assign(T.element(i)),m.a.addAssign(T.a),f.element(i).assign(s.element(i).mul(Fm(Po(g),h,p).element(i)))}),m.a.divAssign(3)}else{const i=Em(e,t,c,d,o),n=a.add(i),g=l.mul(u.mul(wn(n,1))),y=Tn(g.xy.div(g.w)).toVar();y.addAssign(1),y.divAssign(2),y.assign(Tn(y.x,y.y.oneMinus())),m=Bm(y,r,d),f=s.mul(Fm(Po(i),h,p))}const y=f.rgb.mul(m.rgb),b=e.dot(t).clamp(),x=Sn(nm({dotNV:b,specularColor:i,specularF90:n,roughness:r})),T=f.r.add(f.g,f.b).div(3);return wn(x.oneMinus().mul(y),m.a.oneMinus().mul(T).oneMinus())}),Pm=Ln(3.2404542,-.969266,.0556434,-1.5371385,1.8760108,-.2040259,-.4985314,.041556,1.0572252),Dm=(e,t)=>e.sub(t).div(e.add(t)).pow2(),Um=dn(({outsideIOR:e,eta2:t,cosTheta1:r,thinFilmThickness:s,baseF0:i})=>{const n=ou(e,t,cu(0,.03,s)),a=e.div(n).pow2().mul(r.pow2().oneMinus()).oneMinus();pn(a.lessThan(0),()=>Sn(1));const o=a.sqrt(),u=Dm(n,e),l=Og({f0:u,f90:1,dotVH:r}),d=l.oneMinus(),c=n.lessThan(e).select(Math.PI,0),h=fn(Math.PI).sub(c),p=(e=>{const t=e.sqrt();return Sn(1).add(t).div(Sn(1).sub(t))})(i.clamp(0,.9999)),g=Dm(p,n.toVec3()),m=Og({f0:g,f90:1,dotVH:o}),f=Sn(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=Sn(h).add(f),x=l.mul(m).clamp(1e-5,.9999),T=x.sqrt(),_=d.pow2().mul(m).div(Sn(1).sub(x)),v=l.add(_).toVar(),N=_.sub(d).toVar();return Rp({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=Sn(54856e-17,44201e-17,52481e-17),i=Sn(1681e3,1795300,2208400),n=Sn(43278e5,93046e5,66121e5),a=fn(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=Sn(o.x.add(a),o.y,o.z).div(1.0685e-7),Pm.mul(o)})(fn(e).mul(y),fn(e).mul(b)).mul(2);v.addAssign(N.mul(t))}),v.max(Sn(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"}]}),Im=dn(({normal:e,viewDir:t,roughness:r})=>{const s=e.dot(t).saturate(),i=r.mul(r),n=r.add(.1).reciprocal(),a=fn(-1.9362).add(r.mul(1.0678)).add(i.mul(.4573)).sub(n.mul(.8469)),o=fn(-.6014).add(r.mul(.5538)).sub(i.mul(.467)).sub(n.mul(.1255));return a.mul(s).add(o).exp().saturate()}),Om=Sn(.04),Vm=fn(1);class km extends Pg{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,this.iridescenceF0Dielectric=null,this.iridescenceF0Metallic=null}start(e){if(!0===this.clearcoat&&(this.clearcoatRadiance=Sn().toVar("clearcoatRadiance"),this.clearcoatSpecularDirect=Sn().toVar("clearcoatSpecularDirect"),this.clearcoatSpecularIndirect=Sn().toVar("clearcoatSpecularIndirect")),!0===this.sheen&&(this.sheenSpecularDirect=Sn().toVar("sheenSpecularDirect"),this.sheenSpecularIndirect=Sn().toVar("sheenSpecularIndirect")),!0===this.iridescence){const e=dc.dot(ec).clamp(),t=Um({outsideIOR:fn(1),eta2:Qn,cosTheta1:e,thinFilmThickness:Yn,baseF0:ra}),r=Um({outsideIOR:fn(1),eta2:Qn,cosTheta1:e,thinFilmThickness:Yn,baseF0:kn.rgb});this.iridescenceFresnel=ou(t,r,Wn),this.iridescenceF0Dielectric=am({f:t,f90:1,dotVH:e}),this.iridescenceF0Metallic=am({f:r,f90:1,dotVH:e}),this.iridescenceF0=ou(this.iridescenceF0Dielectric,this.iridescenceF0Metallic,Wn)}if(!0===this.transmission){const t=Yd,r=Sd.sub(Yd).normalize(),s=cc,i=e.context;i.backdrop=Lm(s,r,$n,Gn,sa,ia,t,Ud,_d,xd,da,ha,ga,pa,this.dispersion?ma:null),i.backdropAlpha=ca,kn.a.mulAssign(ou(1,i.backdrop.a,ca))}super.start(e)}computeMultiscattering(e,t,r,s,i=null){const n=dc.dot(ec).clamp(),a=sm({roughness:$n,dotNV:n}),o=i?Kn.mix(s,i):s,u=o.mul(a.x).add(r.mul(a.y)),l=a.x.add(a.y).oneMinus(),d=o.add(o.oneMinus().mul(.047619)),c=u.mul(d).div(l.mul(d).oneMinus());e.addAssign(u),t.addAssign(c.mul(l))}direct({lightDirection:e,lightColor:t,reflectedLight:r}){const s=dc.dot(e).clamp().mul(t).toVar();if(!0===this.sheen){this.sheenSpecularDirect.addAssign(s.mul(lm({lightDirection:e})));const t=Im({normal:dc,viewDir:ec,roughness:Xn}),r=Im({normal:dc,viewDir:e,roughness:Xn}),i=jn.r.max(jn.g).max(jn.b).mul(t.max(r)).oneMinus();s.mulAssign(i)}if(!0===this.clearcoat){const r=hc.dot(e).clamp().mul(t);this.clearcoatSpecularDirect.addAssign(r.mul(em({lightDirection:e,f0:Om,f90:Vm,roughness:qn,normalView:hc})))}r.directDiffuse.addAssign(s.mul(Vg({diffuseColor:Gn}))),r.directSpecular.addAssign(s.mul(im({lightDirection:e,f0:sa,f90:1,roughness:$n,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=dc,h=ec,p=Jd.toVar(),g=dm({N:c,V:h,roughness:$n}),m=n.sample(g).toVar(),f=a.sample(g).toVar(),y=Ln(Sn(m.x,0,m.y),Sn(0,1,0),Sn(m.z,0,m.w)).toVar(),b=sa.mul(f.x).add(ia.sub(sa).mul(f.y)).toVar();if(i.directSpecular.addAssign(e.mul(b).mul(pm({N:c,V:h,P:p,mInv:y,p0:o,p1:u,p2:l,p3:d}))),i.directDiffuse.addAssign(e.mul(Gn).mul(pm({N:c,V:h,P:p,mInv:Ln(1,0,0,0,1,0,0,0,1),p0:o,p1:u,p2:l,p3:d}))),!0===this.clearcoat){const t=hc,r=dm({N:t,V:h,roughness:qn}),s=n.sample(r),i=a.sample(r),c=Ln(Sn(s.x,0,s.y),Sn(0,1,0),Sn(s.z,0,s.w)),g=Om.mul(i.x).add(Vm.sub(Om).mul(i.y));this.clearcoatSpecularDirect.addAssign(e.mul(g).mul(pm({N:t,V:h,P:p,mInv:c,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,s=t.mul(Vg({diffuseColor:Gn})).toVar();if(!0===this.sheen){const e=Im({normal:dc,viewDir:ec,roughness:Xn}),t=jn.r.max(jn.g).max(jn.b).mul(e).oneMinus();s.mulAssign(t)}r.indirectDiffuse.addAssign(s)}indirectSpecular(e){const{radiance:t,iblIrradiance:r,reflectedLight:s}=e.context;if(!0===this.sheen&&this.sheenSpecularIndirect.addAssign(r.mul(jn,Im({normal:dc,viewDir:ec,roughness:Xn}))),!0===this.clearcoat){const e=hc.dot(ec).clamp(),t=nm({dotNV:e,specularColor:Om,specularF90:Vm,roughness:qn});this.clearcoatSpecularIndirect.addAssign(this.clearcoatRadiance.mul(t))}const i=Sn().toVar("singleScatteringDielectric"),n=Sn().toVar("multiScatteringDielectric"),a=Sn().toVar("singleScatteringMetallic"),o=Sn().toVar("multiScatteringMetallic");this.computeMultiscattering(i,n,ia,ra,this.iridescenceF0Dielectric),this.computeMultiscattering(a,o,ia,kn.rgb,this.iridescenceF0Metallic);const u=ou(i,a,Wn),l=ou(n,o,Wn),d=i.add(n),c=Gn.mul(d.oneMinus()),h=r.mul(1/Math.PI),p=t.mul(u).add(l.mul(h)).toVar(),g=c.mul(h).toVar();if(!0===this.sheen){const e=Im({normal:dc,viewDir:ec,roughness:Xn}),t=jn.r.max(jn.g).max(jn.b).mul(e).oneMinus();p.mulAssign(t),g.mulAssign(t)}s.indirectSpecular.addAssign(p),s.indirectDiffuse.addAssign(g)}ambientOcclusion(e){const{ambientOcclusion:t,reflectedLight:r}=e.context,s=dc.dot(ec).clamp().add(t),i=$n.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=hc.dot(ec).clamp(),r=Og({dotVH:e,f0:Om,f90:Vm}),s=t.mul(Hn.mul(r).oneMinus()).add(this.clearcoatSpecularDirect.add(this.clearcoatSpecularIndirect).mul(Hn));t.assign(s)}if(!0===this.sheen){const e=t.add(this.sheenSpecularDirect,this.sheenSpecularIndirect.mul(1/Math.PI));t.assign(e)}}}const Gm=fn(1),zm=fn(-2),$m=fn(.8),Wm=fn(-1),Hm=fn(.4),qm=fn(2),jm=fn(.305),Xm=fn(3),Km=fn(.21),Qm=fn(4),Ym=fn(4),Zm=fn(16),Jm=dn(([e])=>{const t=Sn(Fo(e)).toVar(),r=fn(-1).toVar();return pn(t.x.greaterThan(t.z),()=>{pn(t.x.greaterThan(t.y),()=>{r.assign(Tu(e.x.greaterThan(0),0,3))}).Else(()=>{r.assign(Tu(e.y.greaterThan(0),1,4))})}).Else(()=>{pn(t.z.greaterThan(t.y),()=>{r.assign(Tu(e.z.greaterThan(0),2,5))}).Else(()=>{r.assign(Tu(e.y.greaterThan(0),1,4))})}),r}).setLayout({name:"getFace",type:"float",inputs:[{name:"direction",type:"vec3"}]}),ef=dn(([e,t])=>{const r=Tn().toVar();return pn(t.equal(0),()=>{r.assign(Tn(e.z,e.y).div(Fo(e.x)))}).ElseIf(t.equal(1),()=>{r.assign(Tn(e.x.negate(),e.z.negate()).div(Fo(e.y)))}).ElseIf(t.equal(2),()=>{r.assign(Tn(e.x.negate(),e.y).div(Fo(e.z)))}).ElseIf(t.equal(3),()=>{r.assign(Tn(e.z.negate(),e.y).div(Fo(e.x)))}).ElseIf(t.equal(4),()=>{r.assign(Tn(e.x.negate(),e.z).div(Fo(e.y)))}).Else(()=>{r.assign(Tn(e.x,e.y).div(Fo(e.z)))}),Pa(.5,r.add(1))}).setLayout({name:"getUV",type:"vec2",inputs:[{name:"direction",type:"vec3"},{name:"face",type:"float"}]}),tf=dn(([e])=>{const t=fn(0).toVar();return pn(e.greaterThanEqual($m),()=>{t.assign(Gm.sub(e).mul(Wm.sub(zm)).div(Gm.sub($m)).add(zm))}).ElseIf(e.greaterThanEqual(Hm),()=>{t.assign($m.sub(e).mul(qm.sub(Wm)).div($m.sub(Hm)).add(Wm))}).ElseIf(e.greaterThanEqual(jm),()=>{t.assign(Hm.sub(e).mul(Xm.sub(qm)).div(Hm.sub(jm)).add(qm))}).ElseIf(e.greaterThanEqual(Km),()=>{t.assign(jm.sub(e).mul(Qm.sub(Xm)).div(jm.sub(Km)).add(Xm))}).Else(()=>{t.assign(fn(-2).mul(xo(Pa(1.16,e))))}),t}).setLayout({name:"roughnessToMip",type:"float",inputs:[{name:"roughness",type:"float"}]}),rf=dn(([e,t])=>{const r=e.toVar();r.assign(Pa(2,r).sub(1));const s=Sn(r,1).toVar();return pn(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"}]}),sf=dn(([e,t,r,s,i,n])=>{const a=fn(r),o=Sn(t),u=uu(tf(a),zm,n),l=Ro(u),d=vo(u),c=Sn(nf(e,o,d,s,i,n)).toVar();return pn(l.notEqual(0),()=>{const t=Sn(nf(e,o,d.add(1),s,i,n)).toVar();c.assign(ou(c,t,l))}),c}),nf=dn(([e,t,r,s,i,n])=>{const a=fn(r).toVar(),o=Sn(t),u=fn(Jm(o)).toVar(),l=fn(jo(Ym.sub(a),0)).toVar();a.assign(jo(a,Ym));const d=fn(yo(a)).toVar(),c=Tn(ef(o,u).mul(d.sub(2)).add(1)).toVar();return pn(u.greaterThan(2),()=>{c.y.addAssign(d),u.subAssign(3)}),c.x.addAssign(u.mul(d)),c.x.addAssign(l.mul(Pa(3,Zm))),c.y.addAssign(Pa(4,yo(n).sub(d))),c.x.mulAssign(s),c.y.mulAssign(i),e.sample(c).grad(Tn(),Tn())}),af=dn(({envMap:e,mipInt:t,outputDirection:r,theta:s,axis:i,CUBEUV_TEXEL_WIDTH:n,CUBEUV_TEXEL_HEIGHT:a,CUBEUV_MAX_MIP:o})=>{const u=Eo(s),l=r.mul(u).add(i.cross(r).mul(Ao(s))).add(i.mul(i.dot(r).mul(u.oneMinus())));return nf(e,l,t,n,a,o)}),of=dn(({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=Sn(Tu(t,r,Jo(r,s))).toVar();pn(h.equal(Sn(0)),()=>{h.assign(Sn(s.z,0,s.x.negate()))}),h.assign(So(h));const p=Sn().toVar();return p.addAssign(i.element(0).mul(af({theta:0,axis:h,outputDirection:s,mipInt:o,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c}))),Rp({start:yn(1),end:e},({i:e})=>{pn(e.greaterThanEqual(n),()=>{Ap()});const t=fn(a.mul(fn(e))).toVar();p.addAssign(i.element(e).mul(af({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(af({theta:t,axis:h,outputDirection:s,mipInt:o,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c})))}),wn(p,1)}),uf=dn(([e])=>{const t=bn(e).toVar();return t.assign(t.shiftLeft(bn(16)).bitOr(t.shiftRight(bn(16)))),t.assign(t.bitAnd(bn(1431655765)).shiftLeft(bn(1)).bitOr(t.bitAnd(bn(2863311530)).shiftRight(bn(1)))),t.assign(t.bitAnd(bn(858993459)).shiftLeft(bn(2)).bitOr(t.bitAnd(bn(3435973836)).shiftRight(bn(2)))),t.assign(t.bitAnd(bn(252645135)).shiftLeft(bn(4)).bitOr(t.bitAnd(bn(4042322160)).shiftRight(bn(4)))),t.assign(t.bitAnd(bn(16711935)).shiftLeft(bn(8)).bitOr(t.bitAnd(bn(4278255360)).shiftRight(bn(8)))),fn(t).mul(2.3283064365386963e-10)}),lf=dn(([e,t])=>Tn(fn(e).div(fn(t)),uf(e))),df=dn(([e,t,r])=>{const s=r.mul(r).toConst(),i=Sn(1,0,0).toConst(),n=Jo(t,i).toConst(),a=To(e.x).toConst(),o=Pa(2,3.14159265359).mul(e.y).toConst(),u=a.mul(Eo(o)).toConst(),l=a.mul(Ao(o)).toVar(),d=Pa(.5,t.z.add(1)).toConst();l.assign(d.oneMinus().mul(To(u.mul(u).oneMinus())).add(d.mul(l)));const c=i.mul(u).add(n.mul(l)).add(t.mul(To(jo(0,u.mul(u).add(l.mul(l)).oneMinus()))));return So(Sn(s.mul(c.x),s.mul(c.y),jo(0,c.z)))}),cf=dn(({roughness:e,mipInt:t,envMap:r,N_immutable:s,GGX_SAMPLES:i,CUBEUV_TEXEL_WIDTH:n,CUBEUV_TEXEL_HEIGHT:a,CUBEUV_MAX_MIP:o})=>{const u=Sn(s).toVar(),l=Sn(0).toVar(),d=fn(0).toVar();return pn(e.lessThan(.001),()=>{l.assign(nf(r,u,t,n,a,o))}).Else(()=>{const s=Tu(Fo(u.z).lessThan(.999),Sn(0,0,1),Sn(1,0,0)),c=So(Jo(s,u)).toVar(),h=Jo(u,c).toVar();Rp({start:bn(0),end:i},({i:s})=>{const p=lf(s,i),g=df(p,Sn(0,0,1),e),m=So(c.mul(g.x).add(h.mul(g.y)).add(u.mul(g.z))),f=So(m.mul(Zo(u,m).mul(2)).sub(u)),y=jo(Zo(u,f),0);pn(y.greaterThan(0),()=>{const e=nf(r,f,t,n,a,o);l.addAssign(e.mul(y)),d.addAssign(y)})}),pn(d.greaterThan(0),()=>{l.assign(l.div(d))})}),wn(l,1)}),hf=[.125,.215,.35,.446,.526,.582],pf=20,gf=new Se(-1,1,1,-1,0,1),mf=new Re(90,1),ff=new e;let yf=null,bf=0,xf=0;const Tf=new r,_f=new WeakMap,vf=[3,1,5,0,4,2],Nf=rf(Al(),Rl("faceIndex")).normalize(),Sf=Sn(Nf.x,Nf.y,Nf.z);class Rf{constructor(e){this._renderer=e,this._pingPongRenderTarget=null,this._lodMax=0,this._cubeSize=0,this._sizeLods=[],this._sigmas=[],this._lodMeshes=[],this._blurMaterial=null,this._ggxMaterial=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=Tf,renderTarget:o=null}=i;if(this._setSize(n),!1===this._hasInitialized){d('PMREMGenerator: ".fromScene()" called before the backend is initialized. Try using "await renderer.init()" instead.');const n=o||this._allocateTarget();return i.renderTarget=n,this.fromSceneAsync(e,t,r,s,i),n}yf=this._renderer.getRenderTarget(),bf=this._renderer.getActiveCubeFace(),xf=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 v('PMREMGenerator: ".fromSceneAsync()" is deprecated. Use "await renderer.init()" instead.'),await this._renderer.init(),this.fromScene(e,t,r,s,i)}fromEquirectangular(e,t=null){if(!1===this._hasInitialized){d('PMREMGenerator: .fromEquirectangular() called before the backend is initialized. Try using "await renderer.init()" 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 v('PMREMGenerator: ".fromEquirectangularAsync()" is deprecated. Use "await renderer.init()" instead.'),await this._renderer.init(),this._fromTexture(e,t)}fromCubemap(e,t=null){if(!1===this._hasInitialized){d("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 v('PMREMGenerator: ".fromCubemapAsync()" is deprecated. Use "await renderer.init()" instead.'),await this._renderer.init(),this._fromTexture(e,t)}async compileCubemapShader(){null===this._cubemapMaterial&&(this._cubemapMaterial=wf(),await this._compileMaterial(this._cubemapMaterial))}async compileEquirectangularShader(){null===this._equirectMaterial&&(this._equirectMaterial=Cf(),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===I||e.mapping===O?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._ggxMaterial&&this._ggxMaterial.dispose(),null!==this._pingPongRenderTarget&&this._pingPongRenderTarget.dispose();for(let e=0;ee-4?o=hf[a-e+4-1]:0===a&&(o=0),r.push(o);const u=1/(n-2),l=-u,d=1+u,c=[l,l,d,l,d,d,l,l,d,d,l,d],h=6,p=6,g=3,m=2,f=1,y=new Float32Array(g*p*h),b=new Float32Array(m*p*h),x=new Float32Array(f*p*h);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=vf[e];y.set(s,g*p*i),b.set(c,m*p*i);const n=[i,i,i,i,i,i];x.set(n,f*p*i)}const T=new Ne;T.setAttribute("position",new Ce(y,g)),T.setAttribute("uv",new Ce(b,m)),T.setAttribute("faceIndex",new Ce(x,f)),s.push(new ue(T,null)),i>4&&i--}return{lodMeshes:s,sizeLods:t,sigmas:r}}(t)),this._blurMaterial=function(e,t,s){const i=Gl(new Array(pf).fill(0)),n=Na(new r(0,1,0)),a=Na(0),o=fn(pf),u=Na(0),l=Na(1),d=Dl(),c=Na(0),h=fn(1/t),p=fn(1/s),g=fn(e),m={n:o,latitudinal:u,weights:i,poleAxis:n,outputDirection:Sf,dTheta:a,samples:l,envMap:d,mipInt:c,CUBEUV_TEXEL_WIDTH:h,CUBEUV_TEXEL_HEIGHT:p,CUBEUV_MAX_MIP:g},f=Ef("blur");return f.fragmentNode=of({...m,latitudinal:u.equal(1)}),_f.set(f,m),f}(t,e.width,e.height),this._ggxMaterial=function(e,t,r){const s=Dl(),i=Na(0),n=Na(0),a=fn(1/t),o=fn(1/r),u=fn(e),l={envMap:s,roughness:i,mipInt:n,CUBEUV_TEXEL_WIDTH:a,CUBEUV_TEXEL_HEIGHT:o,CUBEUV_MAX_MIP:u},d=Ef("ggx");return d.fragmentNode=cf({...l,N_immutable:Sf,GGX_SAMPLES:bn(512)}),_f.set(d,l),d}(t,e.width,e.height)}}async _compileMaterial(e){const t=new ue(new Ne,e);await this._renderer.compile(t,gf)}_sceneToCubeUV(e,t,r,s,i){const n=mf;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(ff),u.autoClear=!1,null===this._backgroundBox&&(this._backgroundBox=new ue(new oe,new ye({name:"PMREM.Background",side:L,depthWrite:!1,depthTest:!1})));const d=this._backgroundBox,c=d.material;let h=!1;const p=e.background;p?p.isColor&&(c.color.copy(p),e.background=null,h=!0):(c.color.copy(ff),h=!0),u.setRenderTarget(s),u.clear(),h&&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;this._setViewport(s,r*l,t>2?l:0,l,l),u.render(e,n)}u.autoClear=l,e.background=p}_textureToCubeUV(e,t){const r=this._renderer,s=e.mapping===I||e.mapping===O;s?null===this._cubemapMaterial&&(this._cubemapMaterial=wf(e)):null===this._equirectMaterial&&(this._equirectMaterial=Cf(e));const i=s?this._cubemapMaterial:this._equirectMaterial;i.fragmentNode.value=e;const n=this._lodMeshes[0];n.material=i;const a=this._cubeSize;this._setViewport(t,0,0,3*a,2*a),r.setRenderTarget(t),r.render(n,gf)}_applyPMREM(e){const t=this._renderer,r=t.autoClear;t.autoClear=!1;const s=this._lodMeshes.length;for(let t=1;tc-4?r-c+4:0),g=4*(this._cubeSize-h);e.texture.frame=(e.texture.frame||0)+1,o.envMap.value=e.texture,o.roughness.value=d,o.mipInt.value=c-t,this._setViewport(i,p,g,3*h,2*h),s.setRenderTarget(i),s.render(a,gf),i.texture.frame=(i.texture.frame||0)+1,o.envMap.value=i.texture,o.roughness.value=0,o.mipInt.value=c-r,this._setViewport(e,p,g,3*h,2*h),s.setRenderTarget(e),s.render(a,gf)}_blur(e,t,r,s,i){const n=this._pingPongRenderTarget;this._halfBlur(e,n,t,r,s,"latitudinal",i),this._halfBlur(n,e,r,r,s,"longitudinal",i)}_halfBlur(e,t,r,s,i,n,a){const u=this._renderer,l=this._blurMaterial;"latitudinal"!==n&&"longitudinal"!==n&&o("blur direction must be either latitudinal or longitudinal!");const c=this._lodMeshes[s];c.material=l;const h=_f.get(l),p=this._sizeLods[r]-1,g=isFinite(i)?Math.PI/(2*p):2*Math.PI/39,m=i/g,f=isFinite(i)?1+Math.floor(3*m):pf;f>pf&&d(`sigmaRadians, ${i}, is too large and will clip, as it requested ${f} samples when the maximum is set to 20`);const y=[];let b=0;for(let e=0;ex-4?s-x+4:0),v=4*(this._cubeSize-T);this._setViewport(t,_,v,3*T,2*T),u.setRenderTarget(t),u.render(c,gf)}_setViewport(e,t,r,s,i){this._renderer.isWebGLRenderer?(e.viewport.set(t,e.height-i-r,s,i),e.scissor.set(t,e.height-i-r,s,i)):(e.viewport.set(t,r,s,i),e.scissor.set(t,r,s,i))}}function Af(e,t){const r=new ae(e,t,{magFilter:de,minFilter:de,generateMipmaps:!1,type:_e,format:Ee,colorSpace:Ae});return r.texture.mapping=we,r.texture.name="PMREM.cubeUv",r.texture.isPMREMTexture=!0,r.scissorTest=!0,r}function Ef(e){const t=new fg;return t.depthTest=!1,t.depthWrite=!1,t.blending=se,t.name=`PMREM_${e}`,t}function wf(e){const t=Ef("cubemap");return t.fragmentNode=Mc(e,Sf),t}function Cf(e){const t=Ef("equirect");return t.fragmentNode=Dl(e,Rg(Sf),0),t}const Mf=new WeakMap;function Bf(e,t,r){const s=function(e){let t=Mf.get(e);void 0===t&&(t=new WeakMap,Mf.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 Ff extends pi{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 N;s.isRenderTargetTexture=!0,this._texture=Dl(s),this._width=Na(0),this._height=Na(0),this._maxMip=Na(0),this.updateBeforeType=ti.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:Bf(s,e.renderer,this._generator),null!==t&&(this._pmrem=t,this.updateFromTexture(t)))}setup(e){null===this._generator&&(this._generator=new Rf(e.renderer)),this.updateBefore(e);let t=this.uvNode;null===t&&e.context.getUV&&(t=e.context.getUV(this,e)),t=vc.mul(Sn(t.x,t.y.negate(),t.z));let r=this.levelNode;return null===r&&e.context.getTextureLevel&&(r=e.context.getTextureLevel(this)),sf(this._texture,t,r,this._width,this._height,this._maxMip)}dispose(){super.dispose(),null!==this._generator&&this._generator.dispose()}}const Lf=nn(Ff).setParameterLength(1,3),Pf=new WeakMap;class Df extends Fp{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 s=r.isTextureNode?r.value:t[r.property],i=this._getPMREMNodeCache(e.renderer);let n=i.get(s);void 0===n&&(n=Lf(s),i.set(s,n)),r=n}const s=!0===t.useAnisotropy||t.anisotropy>0?uh:dc,i=r.context(Uf($n,s)).mul(_c),n=r.context(If(cc)).mul(Math.PI).mul(_c),a=ul(i),o=ul(n);e.context.radiance.addAssign(a),e.context.iblIrradiance.addAssign(o);const u=e.context.lightingModel.clearcoatRadiance;if(u){const e=r.context(Uf(qn,hc)).mul(_c),t=ul(e);u.addAssign(t)}}_getPMREMNodeCache(e){let t=Pf.get(e);return void 0===t&&(t=new WeakMap,Pf.set(e,t)),t}}const Uf=(e,t)=>{let r=null;return{getUV:()=>(null===r&&(r=ec.negate().reflect(t),r=su(e).mix(r,t).normalize(),r=r.transformDirection(_d)),r),getTextureLevel:()=>e}},If=e=>({getUV:()=>e,getTextureLevel:()=>fn(1)}),Of=new Me;class Vf extends fg{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(Of),this.setValues(e)}setupEnvironment(e){let t=super.setupEnvironment(e);return null===t&&e.environmentNode&&(t=e.environmentNode),t?new Df(t):null}setupLightingModel(){return new km}setupSpecular(){const e=ou(Sn(.04),kn.rgb,Wn);ra.assign(Sn(.04)),sa.assign(e),ia.assign(1)}setupVariants(){const e=this.metalnessNode?fn(this.metalnessNode):Mh;Wn.assign(e);let t=this.roughnessNode?fn(this.roughnessNode):Ch;t=Xg({roughness:t}),$n.assign(t),this.setupSpecular(),Gn.assign(kn.rgb.mul(e.oneMinus()))}copy(e){return this.emissiveNode=e.emissiveNode,this.metalnessNode=e.metalnessNode,this.roughnessNode=e.roughnessNode,super.copy(e)}}const kf=new Be;class Gf extends Vf{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(kf),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?fn(this.iorNode):Wh;da.assign(e),ra.assign(qo(tu(da.sub(1).div(da.add(1))).mul(Ah),Sn(1)).mul(Rh)),sa.assign(ou(ra,kn.rgb,Wn)),ia.assign(ou(Rh,1,Wn))}setupLightingModel(){return new km(this.useClearcoat,this.useSheen,this.useIridescence,this.useAnisotropy,this.useTransmission,this.useDispersion)}setupVariants(e){if(super.setupVariants(e),this.useClearcoat){const e=this.clearcoatNode?fn(this.clearcoatNode):Fh,t=this.clearcoatRoughnessNode?fn(this.clearcoatRoughnessNode):Lh;Hn.assign(e),qn.assign(Xg({roughness:t}))}if(this.useSheen){const e=this.sheenNode?Sn(this.sheenNode):Uh,t=this.sheenRoughnessNode?fn(this.sheenRoughnessNode):Ih;jn.assign(e),Xn.assign(t)}if(this.useIridescence){const e=this.iridescenceNode?fn(this.iridescenceNode):Vh,t=this.iridescenceIORNode?fn(this.iridescenceIORNode):kh,r=this.iridescenceThicknessNode?fn(this.iridescenceThicknessNode):Gh;Kn.assign(e),Qn.assign(t),Yn.assign(r)}if(this.useAnisotropy){const e=(this.anisotropyNode?Tn(this.anisotropyNode):Oh).toVar();Jn.assign(e.length()),pn(Jn.equal(0),()=>{e.assign(Tn(1,0))}).Else(()=>{e.divAssign(Tn(Jn)),Jn.assign(Jn.saturate())}),Zn.assign(Jn.pow2().mix($n.pow2(),1)),ea.assign(ah[0].mul(e.x).add(ah[1].mul(e.y))),ta.assign(ah[1].mul(e.x).sub(ah[0].mul(e.y)))}if(this.useTransmission){const e=this.transmissionNode?fn(this.transmissionNode):zh,t=this.thicknessNode?fn(this.thicknessNode):$h,r=this.attenuationDistanceNode?fn(this.attenuationDistanceNode):Hh,s=this.attenuationColorNode?Sn(this.attenuationColorNode):qh;if(ca.assign(e),ha.assign(t),pa.assign(r),ga.assign(s),this.useDispersion){const e=this.dispersionNode?fn(this.dispersionNode):Jh;ma.assign(e)}}}setupClearcoatNormal(){return this.clearcoatNormalNode?Sn(this.clearcoatNormalNode):Ph}setup(e){e.context.setupClearcoatNormal=()=>Pu(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.iorNode=e.iorNode,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 zf extends km{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(dc.mul(a)).normalize(),h=fn(ec.dot(c.negate()).saturate().pow(l).mul(d)),p=Sn(h.add(o).mul(n));r.directDiffuse.addAssign(p.mul(u.mul(t)))}super.direct({lightDirection:e,lightColor:t,reflectedLight:r},s)}}class $f extends Gf{static get type(){return"MeshSSSNodeMaterial"}constructor(e){super(e),this.thicknessColorNode=null,this.thicknessDistortionNode=fn(.1),this.thicknessAmbientNode=fn(0),this.thicknessAttenuationNode=fn(.1),this.thicknessPowerNode=fn(2),this.thicknessScaleNode=fn(10)}get useSSS(){return null!==this.thicknessColorNode}setupLightingModel(){return new zf(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 Wf=dn(({normal:e,lightDirection:t,builder:r})=>{const s=e.dot(t),i=Tn(s.mul(.5).add(.5),0);if(r.material.gradientMap){const e=Uc("gradientMap","texture").context({getUV:()=>i});return Sn(e.r)}{const e=i.fwidth().mul(.5);return ou(Sn(.7),Sn(1),cu(fn(.7).sub(e.x),fn(.7).add(e.x),i.x))}});class Hf extends Pg{direct({lightDirection:e,lightColor:t,reflectedLight:r},s){const i=Wf({normal:nc,lightDirection:e,builder:s}).mul(t);r.directDiffuse.addAssign(i.mul(Vg({diffuseColor:kn.rgb})))}indirect(e){const{ambientOcclusion:t,irradiance:r,reflectedLight:s}=e.context;s.indirectDiffuse.addAssign(r.mul(Vg({diffuseColor:kn}))),s.indirectDiffuse.mulAssign(t)}}const qf=new Fe;class jf extends fg{static get type(){return"MeshToonNodeMaterial"}constructor(e){super(),this.isMeshToonNodeMaterial=!0,this.lights=!0,this.setDefaultValues(qf),this.setValues(e)}setupLightingModel(){return new Hf}}const Xf=dn(()=>{const e=Sn(ec.z,0,ec.x.negate()).normalize(),t=ec.cross(e);return Tn(e.dot(dc),t.dot(dc)).mul(.495).add(.5)}).once(["NORMAL","VERTEX"])().toVar("matcapUV"),Kf=new Le;class Qf extends fg{static get type(){return"MeshMatcapNodeMaterial"}constructor(e){super(),this.isMeshMatcapNodeMaterial=!0,this.setDefaultValues(Kf),this.setValues(e)}setupVariants(e){const t=Xf;let r;r=e.material.matcap?Uc("matcap","texture").context({getUV:()=>t}):Sn(ou(.2,.8,t.y)),kn.rgb.mulAssign(r.rgb)}}class Yf extends pi{static get type(){return"RotateNode"}constructor(e,t){super(),this.positionNode=e,this.rotationNode=t}generateNodeType(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 Fn(e,s,s.negate(),e).mul(r)}{const e=t,s=Pn(wn(1,0,0,0),wn(0,Eo(e.x),Ao(e.x).negate(),0),wn(0,Ao(e.x),Eo(e.x),0),wn(0,0,0,1)),i=Pn(wn(Eo(e.y),0,Ao(e.y),0),wn(0,1,0,0),wn(Ao(e.y).negate(),0,Eo(e.y),0),wn(0,0,0,1)),n=Pn(wn(Eo(e.z),Ao(e.z).negate(),0,0),wn(Ao(e.z),Eo(e.z),0,0),wn(0,0,1,0),wn(0,0,0,1));return s.mul(i).mul(n).mul(wn(r,1)).xyz}}}const Zf=nn(Yf).setParameterLength(2),Jf=new Pe;class ey extends fg{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(Jf),this.setValues(e)}setupPositionView(e){const{object:t,camera:r}=e,{positionNode:s,rotationNode:i,scaleNode:n,sizeAttenuation:a}=this,o=$d.mul(Sn(s||0));let u=Tn(Ud[0].xyz.length(),Ud[1].xyz.length());null!==n&&(u=u.mul(Tn(n))),r.isPerspectiveCamera&&!1===a&&(u=u.mul(o.z.negate()));let l=Xd.xy;if(t.center&&!0===t.center.isVector2){const e=((e,t,r)=>new Hu(e,t,r))("center","vec2",t);l=l.sub(e.sub(.5))}l=l.mul(u);const d=fn(i||Dh),c=Zf(l,d);return wn(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 ty=new De,ry=new t;class sy extends ey{static get type(){return"PointsNodeMaterial"}constructor(e){super(),this.sizeNode=null,this.isPointsNodeMaterial=!0,this.setDefaultValues(ty),this.setValues(e)}setupPositionView(){const{positionNode:e}=this;return $d.mul(Sn(e||Kd)).xyz}setupVertexSprite(e){const{material:t,camera:r}=e,{rotationNode:s,scaleNode:i,sizeNode:n,sizeAttenuation:a}=this;let o=super.setupVertex(e);if(!0!==t.isNodeMaterial)return o;let u=null!==n?Tn(n):Zh;u=u.mul(jl),r.isPerspectiveCamera&&!0===a&&(u=u.mul(iy.div(Jd.z.negate()))),i&&i.isNode&&(u=u.mul(Tn(i)));let l=Xd.xy;if(s&&s.isNode){const e=fn(s);l=Zf(l,e)}return l=l.mul(u),l=l.div(Zl.div(2)),l=l.mul(o.w),o=o.add(wn(l,0,0)),o}setupVertex(e){return e.object.isPoints?super.setupVertex(e):this.setupVertexSprite(e)}get alphaToCoverage(){return this._useAlphaToCoverage}set alphaToCoverage(e){this._useAlphaToCoverage!==e&&(this._useAlphaToCoverage=e,this.needsUpdate=!0)}}const iy=Na(1).onFrameUpdate(function({renderer:e}){const t=e.getSize(ry);this.value=.5*t.y});class ny extends Pg{constructor(){super(),this.shadowNode=fn(1).toVar("shadowMask")}direct({lightNode:e}){null!==e.shadowNode&&this.shadowNode.mulAssign(e.shadowNode)}finish({context:e}){kn.a.mulAssign(this.shadowNode.oneMinus()),e.outgoingLight.rgb.assign(kn.rgb)}}const ay=new Ue;class oy extends fg{static get type(){return"ShadowNodeMaterial"}constructor(e){super(),this.isShadowNodeMaterial=!0,this.lights=!0,this.transparent=!0,this.setDefaultValues(ay),this.setValues(e)}setupLightingModel(){return new ny}}const uy=On("vec3"),ly=On("vec3"),dy=On("vec3");class cy extends Pg{constructor(){super()}start(e){const{material:t}=e,r=On("vec3"),s=On("vec3");pn(Sd.sub(Yd).length().greaterThan(kd.mul(2)),()=>{r.assign(Sd),s.assign(Yd)}).Else(()=>{r.assign(Yd),s.assign(Sd)});const i=s.sub(r),n=Na("int").onRenderUpdate(({material:e})=>e.steps),a=i.length().div(n).toVar(),o=i.normalize().toVar(),u=fn(0).toVar(),l=Sn(1).toVar();t.offsetNode&&u.addAssign(t.offsetNode.mul(a)),Rp(n,()=>{const s=r.add(o.mul(u)),i=_d.mul(wn(s,1)).xyz;let n;null!==t.depthNode&&(ly.assign(tg(Kp(i.z,yd,bd))),e.context.sceneDepthNode=tg(t.depthNode).toVar()),e.context.positionWorld=s,e.context.shadowPositionWorld=s,e.context.positionView=i,uy.assign(0),t.scatteringNode&&(n=t.scatteringNode({positionRay:s})),super.start(e),n&&uy.mulAssign(n);const d=uy.mul(.01).negate().mul(a).exp();l.mulAssign(d),u.addAssign(a)}),dy.addAssign(l.saturate().oneMinus())}scatteringLight(e,t){const r=t.context.sceneDepthNode;r?pn(r.greaterThanEqual(ly),()=>{uy.addAssign(e)}):uy.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(gm({P:l,p0:n,p1:a,p2:o,p3:u})).pow(1.5);this.scatteringLight(d,i)}finish(e){e.context.outgoingLight.assign(dy)}}class hy extends fg{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=L,this.depthTest=!1,this.depthWrite=!1,this.setValues(e)}setupLightingModel(){return new cy}}class py{constructor(e,t,r){this.renderer=e,this.nodes=t,this.info=r,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,this.renderer._inspector.begin(),null!==this._animationLoop&&this._animationLoop(t,r),this.renderer._inspector.finish()};e()}stop(){null!==this._context&&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 gy{constructor(){this.weakMaps={}}_getWeakMap(e){const t=e.length;let r=this.weakMaps[t];return void 0===r&&(r=new WeakMap,this.weakMaps[t]=r),r}get(e){let t=this._getWeakMap(e);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)}getIndirectOffset(){return this._geometries.getIndirectOffset(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.id),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||Array.isArray(e.morphTargetInfluences))&&(s+=e.uuid+","),s+=this.context.id+",",s+=e.receiveShadow+",",Os(s)}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=ks(e,this.camera.cameras.length)),this.object.receiveShadow&&(e=ks(e,1)),e=ks(e,this.renderer.contextNode.id,this.renderer.contextNode.version),e}getCacheKey(){return this.getMaterialCacheKey()+this.getDynamicCacheKey()}dispose(){this.material.removeEventListener("dispose",this.onMaterialDispose),this.geometry.removeEventListener("dispose",this.onGeometryDispose),this.onDispose()}}const yy=[];class by{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);yy[0]=e,yy[1]=t,yy[2]=n,yy[3]=i;let l=u.get(yy);return void 0===l?(l=this.createRenderObject(this.nodes,this.geometries,this.renderer,e,t,r,s,i,n,a,o),u.set(yy,l)):(l.camera=s,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)),yy[0]=null,yy[1]=null,yy[2]=null,yy[3]=null,l}getChainMap(e="default"){return this.chainMaps[e]||(this.chainMaps[e]=new gy)}dispose(){this.chainMaps={}}createRenderObject(e,t,r,s,i,n,a,o,u,l,d){const c=this.getChainMap(d),h=new fy(e,t,r,s,i,n,a,o,u,l);return h.onDispose=()=>{this.pipelines.delete(h),this.bindings.deleteForRender(h),this.nodes.delete(h),c.delete(h.getChainArray())},h}}class xy{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 Ty=1,_y=2,vy=3,Ny=4,Sy=16;class Ry extends xy{constructor(e,t){super(),this.backend=e,this.info=t}delete(e){const t=super.delete(e);return null!==t&&(this.backend.destroyAttribute(e),this.info.destroyAttribute(e)),t}update(e,t){const r=this.get(e);if(void 0===r.version)t===Ty?(this.backend.createAttribute(e),this.info.createAttribute(e)):t===_y?(this.backend.createIndexAttribute(e),this.info.createIndexAttribute(e)):t===vy?(this.backend.createStorageAttribute(e),this.info.createStorageAttribute(e)):t===Ny&&(this.backend.createIndirectStorageAttribute(e),this.info.createIndirectStorageAttribute(e)),r.version=this._getBufferAttribute(e).version;else{const t=this._getBufferAttribute(e);(r.version=65535?Ie:Oe)(t,1);return i.version=Ay(e),i.__id=Ey(e),i}class Cy extends xy{constructor(e,t){super(),this.attributes=e,this.info=t,this.wireframes=new WeakMap,this.attributeCall=new WeakMap,this._geometryDisposeListeners=new Map}has(e){const t=e.geometry;return super.has(t)&&!0===this.get(t).initialized}updateForRender(e){!1===this.has(e)&&this.initGeometry(e),this.updateAttributes(e)}initGeometry(e){const t=e.geometry;this.get(t).initialized=!0,this.info.memory.geometries++;const r=()=>{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),this._geometryDisposeListeners.delete(t)};t.addEventListener("dispose",r),this._geometryDisposeListeners.set(t,r)}updateAttributes(e){const t=e.getAttributes();for(const e of t)e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute?this.updateAttribute(e,vy):this.updateAttribute(e,Ty);const r=this.getIndex(e);null!==r&&this.updateAttribute(r,_y);const s=e.geometry.indirect;null!==s&&this.updateAttribute(s,Ny)}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}getIndirectOffset(e){return e.geometry.indirectOffset}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=wy(t),e.set(t,r)):r.version===Ay(t)&&r.__id===Ey(t)||(this.attributes.delete(r),r=wy(t),e.set(t,r)),s=r}return s}dispose(){for(const[e,t]of this._geometryDisposeListeners.entries())e.removeEventListener("dispose",t);this._geometryDisposeListeners.clear()}}class My{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,attributes:0,indexAttributes:0,storageAttributes:0,indirectStorageAttributes:0,programs:0,renderTargets:0,total:0,texturesSize:0,attributesSize:0,indexAttributesSize:0,storageAttributesSize:0,indirectStorageAttributesSize:0},this.memoryMap=new Map}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):o("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;for(const e in this.memory)this.memory[e]=0;this.memoryMap.clear()}createTexture(e){const t=this._getTextureMemorySize(e);this.memoryMap.set(e,t),this.memory.textures++,this.memory.total+=t,this.memory.texturesSize+=t}destroyTexture(e){const t=this.memoryMap.get(e)||0;this.memoryMap.delete(e),this.memory.textures--,this.memory.total-=t,this.memory.texturesSize-=t}_createAttribute(e,t){const r=this._getAttributeMemorySize(e);this.memoryMap.set(e,{size:r,type:t}),this.memory[t]++,this.memory.total+=r,this.memory[t+"Size"]+=r}createAttribute(e){this._createAttribute(e,"attributes")}createIndexAttribute(e){this._createAttribute(e,"indexAttributes")}createStorageAttribute(e){this._createAttribute(e,"storageAttributes")}createIndirectStorageAttribute(e){this._createAttribute(e,"indirectStorageAttributes")}destroyAttribute(e){const t=this.memoryMap.get(e);t&&(this.memoryMap.delete(e),this.memory[t.type]--,this.memory.total-=t.size,this.memory[t.type+"Size"]-=t.size)}_getTextureMemorySize(e){if(e.isCompressedTexture)return 1;let t=1;e.type===Ve||e.type===ke?t=1:e.type===Ge||e.type===ze||e.type===_e?t=2:e.type!==R&&e.type!==S&&e.type!==Q||(t=4);let r=4;e.format===$e||e.format===We||e.format===He||e.format===qe||e.format===je?r=1:e.format===Xe&&(r=3);let s=t*r;e.type===Ke||e.type===Qe?s=2:e.type!==Ye&&e.type!==Ze&&e.type!==Je||(s=4);const i=e.width||1,n=e.height||1,a=e.isCubeTexture?6:e.depth||1;let o=i*n*a*s;const u=e.mipmaps;if(u&&u.length>0){let e=0;for(let t=0;t>t))*(r.height||Math.max(1,n>>t))*a*s}}o+=e}else e.generateMipmaps&&(o*=1.333);return Math.round(o)}_getAttributeMemorySize(e){return e.isInterleavedBufferAttribute&&(e=e.data),e.array?e.array.byteLength:e.count&&e.itemSize?e.count*e.itemSize*4:0}}class By{constructor(e){this.cacheKey=e,this.usedTimes=0}}class Fy extends By{constructor(e,t,r){super(e),this.vertexProgram=t,this.fragmentProgram=r}}class Ly extends By{constructor(e,t){super(e),this.computeProgram=t,this.isComputePipeline=!0}}let Py=0;class Dy{constructor(e,t,r,s=null,i=null){this.id=Py++,this.code=e,this.stage=t,this.name=r,this.transforms=s,this.attributes=i,this.usedTimes=0}}class Uy extends xy{constructor(e,t,r){super(),this.backend=e,this.nodes=t,this.info=r,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 Dy(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 Dy(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 Dy(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}isReady(e){const t=this.get(e).pipeline;if(void 0===t)return!1;const r=this.backend.get(t);return void 0!==r.pipeline&&null!==r.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 Ly(r,t),this.caches.set(r,i),this.backend.createComputePipeline(i,s),this.info.memory.programs++),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 Fy(s,t,r),this.caches.set(s,n),e.pipeline=n,this.backend.createRenderPipeline(e,i),this.info.memory.programs++),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),this.info.memory.programs--}_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 Iy extends xy{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))}deleteForCompute(e){const t=this.nodes.getForCompute(e).bindings;for(const e of t)this.backend.deleteBindGroupData(e),this.delete(e)}deleteForRender(e){const t=e.getBindings();for(const e of t)this.backend.deleteBindGroupData(e),this.delete(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.isSampler)this.textures.updateSampler(t.texture);else if(t.isStorageBuffer){const e=t.attribute,r=e.isIndirectStorageBufferAttribute?Ny:vy;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(!1!==this.nodes.updateGroup(t)){if(t.isStorageBuffer){const e=t.attribute,i=e.isIndirectStorageBufferAttribute?Ny:vy,n=r.get(t);this.attributes.update(e,i),n.attribute!==e&&(n.attribute=e,s=!0)}if(t.isUniformBuffer){t.update()&&r.updateBinding(t)}else if(t.isSampledTexture){const o=t.update(),u=t.texture,l=this.textures.get(u);o&&(this.textures.updateTexture(u),t.generation!==l.generation&&(t.generation=l.generation,s=!0),l.bindGroups.add(e));if(void 0!==r.get(u).externalTexture||l.isDefaultTexture?i=!1:(n=10*n+u.id,a+=u.version),!0===u.isStorageTexture&&!0===u.mipmapsAutoUpdate){const e=this.get(u);!0===t.store?e.needsMipmap=!0:this.textures.needsMipmaps(u)&&!0===e.needsMipmap&&(this.backend.generateMipmaps(u),e.needsMipmap=!1)}}else if(t.isSampler){if(t.update()){const e=this.textures.updateSampler(t.texture);t.samplerKey!==e&&(t.samplerKey=e,s=!0)}}t.isBuffer&&t.updateRanges.length>0&&t.clearUpdateRanges()}}!0===s&&this.backend.updateBindings(e,t,i?n:0,a)}}function Oy(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 Vy(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 ky(e){return(e.transmission>0||e.transmissionNode&&e.transmissionNode.isNode)&&e.side===P&&!1===e.forceSinglePass}class Gy{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||r.transmissionNode&&r.transmissionNode.isNode||r.backdropNode&&r.backdropNode.isNode?(ky(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||r.transmissionNode&&r.transmissionNode.isNode||r.backdropNode&&r.backdropNode.isNode?(ky(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||Oy),this.transparentDoublePass.length>1&&this.transparentDoublePass.sort(t||Vy),this.transparent.length>1&&this.transparent.sort(t||Vy)}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 J,l.format=e.stencilBuffer?je:qe,l.type=e.stencilBuffer?Ye:S,l.image.width=o,l.image.height=u,l.image.depth=a.depth,l.renderTarget=e,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{this._destroyRenderTarget(e)},e.addEventListener("dispose",r.onDispose))}updateTexture(e,t={}){const r=this.get(e);if(!0===r.initialized&&r.version===e.version)return;const s=e.isRenderTargetTexture||e.isDepthTexture||e.isFramebufferTexture,i=this.backend;if(s&&!0===r.initialized&&i.destroyTexture(e),e.isFramebufferTexture){const t=this.renderer.getRenderTarget();e.type=t?t.texture.type:ke}const{width:n,height:a,depth:o}=this.getSize(e);if(t.width=n,t.height=a,t.depth=o,t.needsMipmaps=this.needsMipmaps(e),t.levels=t.needsMipmaps?this.getMipLevels(e,n,a):1,e.isCubeTexture&&e.mipmaps.length>0&&t.levels++,s||!0===e.isStorageTexture||!0===e.isExternalTexture)i.createTexture(e,t),r.generation=e.version;else if(e.version>0){const s=e.image;if(void 0===s)d("Renderer: Texture marked for update but image is undefined.");else if(!1===s.complete)d("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);const n=!0===e.isStorageTexture&&!1===e.mipmapsAutoUpdate;t.needsMipmaps&&0===e.mipmaps.length&&!n&&i.generateMipmaps(e),e.onUpdate&&e.onUpdate(e)}}else i.createDefaultTexture(e),r.isDefaultTexture=!0,r.generation=e.version;!0!==r.initialized&&(r.initialized=!0,r.generation=e.version,r.bindGroups=new Set,this.info.createTexture(e),e.isVideoTexture&&!0===p.enabled&&p.getTransfer(e.colorSpace)!==g&&d("WebGPURenderer: Video textures must use a color space with a sRGB transfer function, e.g. SRGBColorSpace."),r.onDispose=()=>{this._destroyTexture(e)},e.addEventListener("dispose",r.onDispose)),r.version=e.version}updateSampler(e){return this.backend.updateSampler(e)}getSize(e,t=Xy){let r=e.images?e.images[0]:e.image;return r?(void 0!==r.image&&(r=r.image),"undefined"!=typeof HTMLVideoElement&&r instanceof HTMLVideoElement?(t.width=r.videoWidth||1,t.height=r.videoHeight||1,t.depth=1):"undefined"!=typeof VideoFrame&&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.mipmaps.length>0?e.mipmaps.length:!0===e.isCompressedTexture?1:Math.floor(Math.log2(Math.max(t,r)))+1,s}needsMipmaps(e){return!0===e.generateMipmaps||e.mipmaps.length>0}_destroyRenderTarget(e){if(!0===this.has(e)){const t=this.get(e),r=t.textures,s=t.depthTexture;e.removeEventListener("dispose",t.onDispose);for(let e=0;e=2)for(let r=0;r{if(this._currentNode=t,!t.isVarNode||!t.isIntent(e)||!0===t.isAssign(e))if("setup"===s)t.build(e);else if("analyze"===s)t.build(e,this);else if("generate"===s){const r=e.getDataFromNode(t,"any").stages,s=r&&r[e.shaderStage];if(t.isVarNode&&s&&1===s.length&&s[0]&&s[0].isStackNode)return;t.build(e,"void")}},n=[...this.nodes];for(const e of n)i(e);this._currentNode=null;const a=this.nodes.filter(e=>-1===n.indexOf(e));for(const e of a)i(e);let o;return o=this.hasOutput(e)?this.outputNode.build(e,...t):super.build(e,...t),cn(r),e.removeActiveStack(this),o}}const Jy=nn(Zy).setParameterLength(0,1);class eb extends di{static get type(){return"StructTypeNode"}constructor(e,t=null){var r;super("struct"),this.membersLayout=(r=e,Object.entries(r).map(([e,t])=>"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=1,r=0;for(const s of this.membersLayout){const i=s.type,n=qs(i),a=js(i)/e;t=Math.max(t,a);const o=r%t%a;0!==o&&(r+=a-o),r+=n}return Math.ceil(r/t)*t}getMemberType(e,t){const r=this.membersLayout.find(e=>e.name===t);return r?r.type:"void"}generateNodeType(e){return e.getStructTypeFromNode(this,this.membersLayout,this.name).name}setup(e){e.getStructTypeFromNode(this,this.membersLayout,this.name),e.addInclude(this)}generate(e){return this.getNodeType(e)}}class tb extends di{static get type(){return"StructNode"}constructor(e,t){super("vec3"),this.structTypeNode=e,this.values=t,this.isStructNode=!0}generateNodeType(e){return this.structTypeNode.getNodeType(e)}getMemberType(e,t){return this.structTypeNode.getMemberType(e,t)}_getChildren(){const e=super._getChildren(),t=e.find(e=>e.childNode===this.structTypeNode);return e.splice(e.indexOf(t),1),e.push(t),e}generate(e){const t=e.getVarFromNode(this),r=t.type,s=e.getPropertyName(t);return e.addLineFlowCode(`${s} = ${e.generateStruct(r,this.structTypeNode.membersLayout,this.values)}`,this),t.name}}class rb extends di{static get type(){return"OutputStructNode"}constructor(...e){super(),this.members=e,this.isOutputStructNode=!0}generateNodeType(){return"OutputType"}generate(e){const t=e.getDataFromNode(this);if(void 0===t.membersLayout){const r=this.members,s=[];for(let t=0;tnew db(e,"uint","float"),pb={};class gb extends io{static get type(){return"BitcountNode"}constructor(e,t){super(e,t),this.isBitcountNode=!0}_resolveElementType(e,t,r){"int"===r?t.assign(cb(e,"uint")):t.assign(e)}_returnDataNode(e){switch(e){case"uint":return bn;case"int":return yn;case"uvec2":return vn;case"uvec3":return An;case"uvec4":return Mn;case"ivec2":return _n;case"ivec3":return Rn;case"ivec4":return Cn}}_createTrailingZerosBaseLayout(e,t){const r=this._returnDataNode(t);return dn(([e])=>{const s=bn(0);this._resolveElementType(e,s,t);const i=fn(s.bitAnd(Do(s))),n=hb(i).shiftRight(23).sub(127);return r(n)}).setLayout({name:e,type:t,inputs:[{name:"value",type:t}]})}_createLeadingZerosBaseLayout(e,t){const r=this._returnDataNode(t);return dn(([e])=>{pn(e.equal(bn(0)),()=>bn(32));const s=bn(0),i=bn(0);return this._resolveElementType(e,s,t),pn(s.shiftRight(16).equal(0),()=>{i.addAssign(16),s.shiftLeftAssign(16)}),pn(s.shiftRight(24).equal(0),()=>{i.addAssign(8),s.shiftLeftAssign(8)}),pn(s.shiftRight(28).equal(0),()=>{i.addAssign(4),s.shiftLeftAssign(4)}),pn(s.shiftRight(30).equal(0),()=>{i.addAssign(2),s.shiftLeftAssign(2)}),pn(s.shiftRight(31).equal(0),()=>{i.addAssign(1)}),r(i)}).setLayout({name:e,type:t,inputs:[{name:"value",type:t}]})}_createOneBitsBaseLayout(e,t){const r=this._returnDataNode(t);return dn(([e])=>{const s=bn(0);this._resolveElementType(e,s,t),s.assign(s.sub(s.shiftRight(bn(1)).bitAnd(bn(1431655765)))),s.assign(s.bitAnd(bn(858993459)).add(s.shiftRight(bn(2)).bitAnd(bn(858993459))));const i=s.add(s.shiftRight(bn(4))).bitAnd(bn(252645135)).mul(bn(16843009)).shiftRight(bn(24));return r(i)}).setLayout({name:e,type:t,inputs:[{name:"value",type:t}]})}_createMainLayout(e,t,r,s){const i=this._returnDataNode(t);return dn(([e])=>{if(1===r)return i(s(e));{const t=i(0),n=["x","y","z","w"];for(let i=0;id(r))()}}gb.COUNT_TRAILING_ZEROS="countTrailingZeros",gb.COUNT_LEADING_ZEROS="countLeadingZeros",gb.COUNT_ONE_BITS="countOneBits";const mb=on(gb,gb.COUNT_TRAILING_ZEROS).setParameterLength(1),fb=on(gb,gb.COUNT_LEADING_ZEROS).setParameterLength(1),yb=on(gb,gb.COUNT_ONE_BITS).setParameterLength(1),bb=dn(([e])=>{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)}),xb=(e,t)=>eu(Pa(4,e.mul(La(1,e))),t);class Tb extends pi{static get type(){return"PackFloatNode"}constructor(e,t){super(),this.vectorNode=t,this.encoding=e,this.isPackFloatNode=!0}generateNodeType(){return"uint"}generate(e){const t=this.vectorNode.getNodeType(e);return`${e.getFloatPackingMethod(this.encoding)}(${this.vectorNode.build(e,t)})`}}const _b=on(Tb,"snorm").setParameterLength(1),vb=on(Tb,"unorm").setParameterLength(1),Nb=on(Tb,"float16").setParameterLength(1);class Sb extends pi{static get type(){return"UnpackFloatNode"}constructor(e,t){super(),this.uintNode=t,this.encoding=e,this.isUnpackFloatNode=!0}generateNodeType(){return"vec2"}generate(e){const t=this.uintNode.getNodeType(e);return`${e.getFloatUnpackingMethod(this.encoding)}(${this.uintNode.build(e,t)})`}}const Rb=on(Sb,"snorm").setParameterLength(1),Ab=on(Sb,"unorm").setParameterLength(1),Eb=on(Sb,"float16").setParameterLength(1),wb=dn(([e])=>e.fract().sub(.5).abs()).setLayout({name:"tri",type:"float",inputs:[{name:"x",type:"float"}]}),Cb=dn(([e])=>Sn(wb(e.z.add(wb(e.y.mul(1)))),wb(e.z.add(wb(e.x.mul(1)))),wb(e.y.add(wb(e.x.mul(1)))))).setLayout({name:"tri3",type:"vec3",inputs:[{name:"p",type:"vec3"}]}),Mb=dn(([e,t,r])=>{const s=Sn(e).toVar(),i=fn(1.4).toVar(),n=fn(0).toVar(),a=Sn(s).toVar();return Rp({start:fn(0),end:fn(3),type:"float",condition:"<="},()=>{const e=Sn(Cb(a.mul(2))).toVar();s.addAssign(e.add(r.mul(fn(.1).mul(t)))),a.mulAssign(1.8),i.mulAssign(1.5),s.mulAssign(1.2);const o=fn(wb(s.z.add(wb(s.x.add(wb(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 Bb extends di{static get type(){return"FunctionOverloadingNode"}constructor(e=[],...t){super(),this.functionNodes=e,this.parametersNodes=t,this._candidateFn=null,this.global=!0}generateNodeType(e){return this.getCandidateFn(e).shaderNode.layout.type}getCandidateFn(e){const t=this.parametersNodes;let r=this._candidateFn;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._candidateFn=r=s}return r}setup(e){return this.getCandidateFn(e)(...this.parametersNodes)}}const Fb=nn(Bb),Lb=e=>(...t)=>Fb(e,...t),Pb=Na(0).setGroup(Ta).onRenderUpdate(e=>e.time),Db=Na(0).setGroup(Ta).onRenderUpdate(e=>e.deltaTime),Ub=Na(0,"uint").setGroup(Ta).onRenderUpdate(e=>e.frameId);const Ib=dn(([e,t,r=Tn(.5)])=>Zf(e.sub(r),t).add(r)),Ob=dn(([e,t,r=Tn(.5)])=>{const s=e.sub(r),i=s.dot(s),n=i.mul(i).mul(t);return e.add(s.mul(n))}),Vb=dn(({position:e=null,horizontal:t=!0,vertical:r=!1})=>{let s;null!==e?(s=Ud.toVar(),s[3][0]=e.x,s[3][1]=e.y,s[3][2]=e.z):s=Ud;const i=_d.mul(s);return Yi(t)&&(i[0][0]=Ud[0].length(),i[0][1]=0,i[0][2]=0),Yi(r)&&(i[1][0]=0,i[1][1]=Ud[1].length(),i[1][2]=0),i[2][0]=0,i[2][1]=0,i[2][2]=1,xd.mul(i).mul(Kd)}),kb=dn(([e=null])=>{const t=tg();return tg(Hp(e)).sub(t).lessThan(0).select(Xl,e)}),Gb=dn(([e,t=Al(),r=fn(0)])=>{const s=e.x,i=e.y,n=r.mod(s.mul(i)).floor(),a=n.mod(s),o=i.sub(n.add(1).div(s).ceil()),u=e.reciprocal(),l=Tn(a,o);return t.add(l).mul(u)}),zb=dn(([e,t=null,r=null,s=fn(1),i=Kd,n=ac])=>{let a=n.abs().normalize();a=a.div(a.dot(Sn(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=Dl(d,o).mul(a.x),g=Dl(c,u).mul(a.y),m=Dl(h,l).mul(a.z);return Fa(p,g,m)}),$b=new ot,Wb=new r,Hb=new r,qb=new r,jb=new a,Xb=new r(0,0,-1),Kb=new s,Qb=new r,Yb=new r,Zb=new s,Jb=new t,ex=new ae,tx=Xl.flipX();ex.depthTexture=new J(1,1);let rx=!1;class sx extends Ll{static get type(){return"ReflectorNode"}constructor(e={}){super(e.defaultTexture||ex.texture,tx),this._reflectorBaseNode=e.reflector||new ix(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=new sx({defaultTexture:ex.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.offsetNode=this.offsetNode,e._reflectorBaseNode=this._reflectorBaseNode,e}dispose(){super.dispose(),this._reflectorBaseNode.dispose()}}class ix extends di{static get type(){return"ReflectorBaseNode"}constructor(e,t={}){super();const{target:r=new nt,resolutionScale:s=1,generateMipmaps:i=!1,bounces:n=!0,depth:a=!1,samples:o=0}=t;this.textureNode=e,this.target=r,this.resolutionScale=s,void 0!==t.resolution&&(v('ReflectorNode: The "resolution" parameter has been renamed to "resolutionScale".'),this.resolutionScale=t.resolution),this.generateMipmaps=i,this.bounces=n,this.depth=a,this.samples=o,this.updateBeforeType=n?ti.RENDER:ti.FRAME,this.virtualCameras=new WeakMap,this.renderTargets=new Map,this.forceUpdate=!1,this.hasOutput=!1}_updateResolution(e,t){const r=this.resolutionScale;t.getDrawingBufferSize(Jb),e.setSize(Math.round(Jb.width*r),Math.round(Jb.height*r))}setup(e){return this._updateResolution(ex,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 ae(0,0,{type:_e,samples:this.samples}),!0===this.generateMipmaps&&(t.texture.minFilter=at,t.texture.generateMipmaps=!0),!0===this.depth&&(t.depthTexture=new J),this.renderTargets.set(e,t)),t}updateBefore(e){if(!1===this.bounces&&rx)return!1;rx=!0;const{scene:t,camera:r,renderer:s,material:i}=e,{target:n}=this,a=this.getVirtualCamera(r),o=this.getRenderTarget(a);s.getDrawingBufferSize(Jb),this._updateResolution(o,s),Hb.setFromMatrixPosition(n.matrixWorld),qb.setFromMatrixPosition(r.matrixWorld),jb.extractRotation(n.matrixWorld),Wb.set(0,0,1),Wb.applyMatrix4(jb),Qb.subVectors(Hb,qb);let u=!1;if(!0===Qb.dot(Wb)>0&&!1===this.forceUpdate){if(!1===this.hasOutput)return void(rx=!1);u=!0}Qb.reflect(Wb).negate(),Qb.add(Hb),jb.extractRotation(r.matrixWorld),Xb.set(0,0,-1),Xb.applyMatrix4(jb),Xb.add(qb),Yb.subVectors(Hb,Xb),Yb.reflect(Wb).negate(),Yb.add(Hb),a.coordinateSystem=r.coordinateSystem,a.position.copy(Qb),a.up.set(0,1,0),a.up.applyMatrix4(jb),a.up.reflect(Wb),a.lookAt(Yb),a.near=r.near,a.far=r.far,a.updateMatrixWorld(),a.projectionMatrix.copy(r.projectionMatrix),$b.setFromNormalAndCoplanarPoint(Wb,Hb),$b.applyMatrix4(a.matrixWorldInverse),Kb.set($b.normal.x,$b.normal.y,$b.normal.z,$b.constant);const l=a.projectionMatrix;Zb.x=(Math.sign(Kb.x)+l.elements[8])/l.elements[0],Zb.y=(Math.sign(Kb.y)+l.elements[9])/l.elements[5],Zb.z=-1,Zb.w=(1+l.elements[10])/l.elements[14],Kb.multiplyScalar(1/Kb.dot(Zb));l.elements[2]=Kb.x,l.elements[6]=Kb.y,l.elements[10]=s.coordinateSystem===h?Kb.z-0:Kb.z+1-0,l.elements[14]=Kb.w,this.textureNode.value=o.texture,!0===this.depth&&(this.textureNode.getDepthNode().value=o.depthTexture),i.visible=!1;const d=s.getRenderTarget(),c=s.getMRT(),p=s.autoClear;s.setMRT(null),s.setRenderTarget(o),s.autoClear=!0;const g=t.name;t.name=(t.name||"Scene")+" [ Reflector ]",u?(s.clear(),this.hasOutput=!1):(s.render(t,a),this.hasOutput=!0),t.name=g,s.setMRT(c),s.setRenderTarget(d),s.autoClear=p,i.visible=!0,rx=!1,this.forceUpdate=!1}get resolution(){return v('ReflectorNode: The "resolution" property has been renamed to "resolutionScale".'),this.resolutionScale}set resolution(e){v('ReflectorNode: The "resolution" property has been renamed to "resolutionScale".'),this.resolutionScale=e}}const nx=new Se(-1,1,1,-1,0,1);class ax extends Ne{constructor(e=!1){super();const t=!1===e?[0,-1,0,1,2,1]:[0,2,0,0,2,0];this.setAttribute("position",new ut([-1,3,0,-1,-1,0,3,-1,0],3)),this.setAttribute("uv",new ut(t,2))}}const ox=new ax;class ux extends ue{constructor(e=null){super(ox,e),this.camera=nx,this.isQuadMesh=!0}async renderAsync(e){v('QuadMesh: "renderAsync()" has been deprecated. Use "render()" and "await renderer.init();" when creating the renderer.'),await e.init(),e.render(this,nx)}render(e){e.render(this,nx)}}const lx=new t;class dx extends Ll{static get type(){return"RTTNode"}constructor(e,t=null,r=null,s={type:_e}){const i=new ae(t,r,s);super(i.texture,Al()),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 ux(new fg),this.updateBeforeType=ti.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(lx),s=Math.floor(r.width*t),i=Math.floor(r.height*t);s===this.renderTarget.width&&i===this.renderTarget.height||(this.renderTarget.setSize(s,i),this.textureNeedsUpdate=!0)}let t="RTT";this.node.name&&(t=this.node.name+" [ "+t+" ]"),this._quadMesh.material.fragmentNode=this._rttNode,this._quadMesh.name=t;const r=e.getRenderTarget();e.setRenderTarget(this.renderTarget),this._quadMesh.render(e),e.setRenderTarget(r)}clone(){const e=new Ll(this.value,this.uvNode,this.levelNode);return e.sampler=this.sampler,e.referenceNode=this,e}}const cx=(e,...t)=>new dx(en(e),...t),hx=dn(([e,t,r],s)=>{let i;s.renderer.coordinateSystem===h?(e=Tn(e.x,e.y.oneMinus()).mul(2).sub(1),i=wn(Sn(e,t),1)):i=wn(Sn(e.x,e.y.oneMinus(),t).mul(2).sub(1),1);const n=wn(r.mul(i));return n.xyz.div(n.w)}),px=dn(([e,t])=>{const r=t.mul(wn(e,1)),s=r.xy.div(r.w).mul(.5).add(.5).toVar();return Tn(s.x,s.y.oneMinus())}),gx=dn(([e,t,r])=>{const s=wl(Ul(t)),i=_n(e.mul(s)).toVar(),n=Ul(t,i).toVar(),a=Ul(t,i.sub(_n(2,0))).toVar(),o=Ul(t,i.sub(_n(1,0))).toVar(),u=Ul(t,i.add(_n(1,0))).toVar(),l=Ul(t,i.add(_n(2,0))).toVar(),d=Ul(t,i.add(_n(0,2))).toVar(),c=Ul(t,i.add(_n(0,1))).toVar(),h=Ul(t,i.sub(_n(0,1))).toVar(),p=Ul(t,i.sub(_n(0,2))).toVar(),g=Fo(La(fn(2).mul(o).sub(a),n)).toVar(),m=Fo(La(fn(2).mul(u).sub(l),n)).toVar(),f=Fo(La(fn(2).mul(c).sub(d),n)).toVar(),y=Fo(La(fn(2).mul(h).sub(p),n)).toVar(),b=hx(e,n,r).toVar(),x=g.lessThan(m).select(b.sub(hx(e.sub(Tn(fn(1).div(s.x),0)),o,r)),b.negate().add(hx(e.add(Tn(fn(1).div(s.x),0)),u,r))),T=f.lessThan(y).select(b.sub(hx(e.add(Tn(0,fn(1).div(s.y))),c,r)),b.negate().add(hx(e.sub(Tn(0,fn(1).div(s.y))),h,r)));return So(Jo(x,T))}),mx=dn(([e])=>Ro(fn(52.9829189).mul(Ro(Zo(e,Tn(.06711056,.00583715)))))).setLayout({name:"interleavedGradientNoise",type:"float",inputs:[{name:"position",type:"vec2"}]}),fx=dn(([e,t,r])=>{const s=fn(2.399963229728653),i=To(fn(e).add(.5).div(fn(t))),n=fn(e).mul(s).add(r);return Tn(Eo(n),Ao(n)).mul(i)}).setLayout({name:"vogelDiskSample",type:"vec2",inputs:[{name:"sampleIndex",type:"int"},{name:"samplesCount",type:"int"},{name:"phi",type:"float"}]});class yx extends di{static get type(){return"SampleNode"}constructor(e,t=null){super(),this.callback=e,this.uvNode=t,this.isSampleNode=!0}setup(){return this.sample(Al())}sample(e){return this.callback(e)}}class bx extends di{static get type(){return"EventNode"}constructor(e,t){super("void"),this.eventType=e,this.callback=t,e===bx.OBJECT?this.updateType=ti.OBJECT:e===bx.MATERIAL?this.updateType=ti.RENDER:e===bx.BEFORE_OBJECT?this.updateBeforeType=ti.OBJECT:e===bx.BEFORE_MATERIAL&&(this.updateBeforeType=ti.RENDER)}update(e){this.callback(e)}updateBefore(e){this.callback(e)}}bx.OBJECT="object",bx.MATERIAL="material",bx.BEFORE_OBJECT="beforeObject",bx.BEFORE_MATERIAL="beforeMaterial";const xx=(e,t)=>new bx(e,t).toStack();class Tx extends j{constructor(e,t,r=Float32Array){super(ArrayBuffer.isView(e)?e:new r(e*t),t),this.isStorageInstancedBufferAttribute=!0}}class _x extends Ce{constructor(e,t,r=Float32Array){super(ArrayBuffer.isView(e)?e:new r(e*t),t),this.isStorageBufferAttribute=!0}}class vx extends di{static get type(){return"PointUVNode"}constructor(){super("vec2"),this.isPointUVNode=!0}generate(){return"vec2( gl_PointCoord.x, 1.0 - gl_PointCoord.y )"}}const Nx=an(vx),Sx=new D,Rx=new a,Ax=Na(0).setGroup(Ta).onRenderUpdate(({scene:e})=>e.backgroundBlurriness),Ex=Na(1).setGroup(Ta).onRenderUpdate(({scene:e})=>e.backgroundIntensity),wx=Na(new a).setGroup(Ta).onRenderUpdate(({scene:e})=>{const t=e.background;return null!==t&&t.isTexture&&t.mapping!==lt?(Sx.copy(e.backgroundRotation),Sx.x*=-1,Sx.y*=-1,Sx.z*=-1,Rx.makeRotationFromEuler(Sx)):Rx.identity(),Rx});class Cx extends Ll{static get type(){return"StorageTextureNode"}constructor(e,t,r=null){super(e,t),this.storeNode=r,this.mipLevel=0,this.isStorageTextureNode=!0,this.access=si.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}setMipLevel(e){return this.mipLevel=e,this}generate(e,t){return null!==this.storeNode?(this.generateStore(e),""):super.generate(e,t)}generateSnippet(e,t,r,s,i,n,a,o,u){const l=this.value;return e.generateStorageTextureLoad(l,t,r,s,n,u)}toReadWrite(){return this.setAccess(si.READ_WRITE)}toReadOnly(){return this.setAccess(si.READ_ONLY)}toWriteOnly(){return this.setAccess(si.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(this.value,n,a,u,o);e.addLineFlowCode(l,this)}clone(){const e=super.clone();return e.storeNode=this.storeNode,e.mipLevel=this.mipLevel,e.access=this.access,e}}const Mx=nn(Cx).setParameterLength(1,3),Bx=dn(({texture:e,uv:t})=>{const r=1e-4,s=Sn().toVar();return pn(t.x.lessThan(r),()=>{s.assign(Sn(1,0,0))}).ElseIf(t.y.lessThan(r),()=>{s.assign(Sn(0,1,0))}).ElseIf(t.z.lessThan(r),()=>{s.assign(Sn(0,0,1))}).ElseIf(t.x.greaterThan(.9999),()=>{s.assign(Sn(-1,0,0))}).ElseIf(t.y.greaterThan(.9999),()=>{s.assign(Sn(0,-1,0))}).ElseIf(t.z.greaterThan(.9999),()=>{s.assign(Sn(0,0,-1))}).Else(()=>{const r=.01,i=e.sample(t.add(Sn(-.01,0,0))).r.sub(e.sample(t.add(Sn(r,0,0))).r),n=e.sample(t.add(Sn(0,-.01,0))).r.sub(e.sample(t.add(Sn(0,r,0))).r),a=e.sample(t.add(Sn(0,0,-.01))).r.sub(e.sample(t.add(Sn(0,0,r))).r);s.assign(Sn(i,n,a))}),s.normalize()});class Fx extends Ll{static get type(){return"Texture3DNode"}constructor(e,t=null,r=null){super(e,t,r),this.isTexture3DNode=!0}getInputType(){return"texture3D"}getDefaultUV(){return Sn(.5,.5,.5)}setUpdateMatrix(){}generateUV(e,t){return t.build(e,!0===this.sampler?"vec3":"ivec3")}generateOffset(e,t){return t.build(e,"ivec3")}normal(e){return Bx({texture:this,uv:e})}}const Lx=nn(Fx).setParameterLength(1,3);class Px extends Fc{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 Dx=new WeakMap;class Ux extends pi{static get type(){return"VelocityNode"}constructor(){super("vec2"),this.projectionMatrix=null,this.updateType=ti.OBJECT,this.updateAfterType=ti.OBJECT,this.previousModelWorldMatrix=Na(new a),this.previousProjectionMatrix=Na(new a).setGroup(Ta),this.previousCameraViewMatrix=Na(new a)}setProjectionMatrix(e){this.projectionMatrix=e}update({frameId:e,camera:t,object:r}){const s=Ox(r);this.previousModelWorldMatrix.value.copy(s);const i=Ix(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}){Ox(e).copy(e.matrixWorld)}setup(){const e=null===this.projectionMatrix?xd:Na(this.projectionMatrix),t=this.previousCameraViewMatrix.mul(this.previousModelWorldMatrix),r=e.mul($d).mul(Kd),s=this.previousProjectionMatrix.mul(t).mul(Qd),i=r.xy.div(r.w),n=s.xy.div(s.w);return La(i,n)}}function Ix(e){let t=Dx.get(e);return void 0===t&&(t={},Dx.set(e,t)),t}function Ox(e,t=0){const r=Ix(e);let s=r[t];return void 0===s&&(r[t]=s=new a,r[t].copy(e.matrixWorld)),s}const Vx=an(Ux),kx=dn(([e])=>Wx(e.rgb)),Gx=dn(([e,t=fn(1)])=>t.mix(Wx(e.rgb),e.rgb)),zx=dn(([e,t=fn(1)])=>{const r=Fa(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 ou(e.rgb,s,i)}),$x=dn(([e,t=fn(1)])=>{const r=Sn(.57735,.57735,.57735),s=t.cos();return Sn(e.rgb.mul(s).add(r.cross(e.rgb).mul(t.sin()).add(r.mul(Zo(r,e.rgb).mul(s.oneMinus())))))}),Wx=(e,t=Sn(p.getLuminanceCoefficients(new r)))=>Zo(e,t),Hx=dn(([e,t=Sn(1),s=Sn(0),i=Sn(1),n=fn(1),a=Sn(p.getLuminanceCoefficients(new r,Ae))])=>{const o=e.rgb.dot(Sn(a)),u=jo(e.rgb.mul(t).add(s),0).toVar(),l=u.pow(i).toVar();return pn(u.r.greaterThan(0),()=>{u.r.assign(l.r)}),pn(u.g.greaterThan(0),()=>{u.g.assign(l.g)}),pn(u.b.greaterThan(0),()=>{u.b.assign(l.b)}),u.assign(o.add(u.sub(o).mul(n))),wn(u.rgb,e.a)}),qx=dn(([e,t])=>e.mul(t).floor().div(t));let jx=null;class Xx extends Op{static get type(){return"ViewportSharedTextureNode"}constructor(e=Xl,t=null){null===jx&&(jx=new Y),super(e,t,jx)}getTextureForReference(){return jx}updateReference(){return this}}const Kx=nn(Xx).setParameterLength(0,2),Qx=new t;class Yx extends Ll{static get type(){return"PassTextureNode"}constructor(e,t){super(t),this.passNode=e,this.isPassTextureNode=!0,this.setUpdateMatrix(!1)}setup(e){return e.getNodeProperties(this).passNode=this.passNode,super.setup(e)}clone(){return new this.constructor(this.passNode,this.value)}}class Zx extends Yx{static get type(){return"PassMultipleTextureNode"}constructor(e,t,r=!1){super(e,null),this.textureName=t,this.previousTexture=r,this.isPassMultipleTextureNode=!0}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.offsetNode=this.offsetNode,e}}class Jx extends pi{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 J;i.isRenderTargetTexture=!0,i.name="depth";const n=new ae(this._width*this._pixelRatio,this._height*this._pixelRatio,{type:_e,...s});n.texture.name="output",n.depthTexture=i,this.renderTarget=n,this.overrideMaterial=null,this.transparent=!0,this.opaque=!0,this.contextNode=null,this._contextNodeCache=null,this._textures={output:n.texture,depth:i},this._textureNodes={},this._linearDepthNodes={},this._viewZNodes={},this._previousTextures={},this._previousTextureNodes={},this._cameraNear=Na(0),this._cameraFar=Na(0),this._mrt=null,this._layers=null,this._resolutionScale=1,this._viewport=null,this._scissor=null,this.isPassNode=!0,this.updateBeforeType=ti.FRAME,this.global=!0}setResolutionScale(e){return this._resolutionScale=e,this}getResolutionScale(){return this._resolutionScale}setResolution(e){return d("PassNode: .setResolution() is deprecated. Use .setResolutionScale() instead."),this.setResolutionScale(e)}getResolution(){return d("PassNode: .getResolution() is deprecated. Use .getResolutionScale() instead."),this.getResolutionScale()}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=new Zx(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=new Zx(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=Yp(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=jp(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.getOutputBufferType(),this.scope===Jx.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),Qx.set(n.width,n.height)):(s=this.camera,i=t.getPixelRatio(),t.getSize(Qx)),this._pixelRatio=i,this.setSize(Qx.width,Qx.height);const a=t.getRenderTarget(),o=t.getMRT(),u=t.autoClear,l=t.transparent,d=t.opaque,c=s.layers.mask,h=t.contextNode,p=r.overrideMaterial;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);null!==this.overrideMaterial&&(r.overrideMaterial=this.overrideMaterial),t.setRenderTarget(this.renderTarget),t.setMRT(this._mrt),t.autoClear=!0,t.transparent=this.transparent,t.opaque=this.opaque,null!==this.contextNode&&(null!==this._contextNodeCache&&this._contextNodeCache.version===this.version||(this._contextNodeCache={version:this.version,context:vu({...t.contextNode.getFlowContextData(),...this.contextNode.getFlowContextData()})}),t.contextNode=this._contextNodeCache.context);const g=r.name;r.name=this.name?this.name:r.name,t.render(r,s),r.name=g,r.overrideMaterial=p,t.setRenderTarget(a),t.setMRT(o),t.autoClear=u,t.transparent=l,t.opaque=d,t.contextNode=h,s.layers.mask=c}setSize(e,t){this._width=e,this._height=t;const r=Math.floor(this._width*this._pixelRatio*this._resolutionScale),s=Math.floor(this._height*this._pixelRatio*this._resolutionScale);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._resolutionScale).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._resolutionScale).floor())}setPixelRatio(e){this._pixelRatio=e,this.setSize(this._width,this._height)}dispose(){this.renderTarget.dispose()}}Jx.COLOR="color",Jx.DEPTH="depth";class eT extends Jx{static get type(){return"ToonOutlinePassNode"}constructor(e,t,r,s,i){super(Jx.COLOR,e,t),this.colorNode=r,this.thicknessNode=s,this.alphaNode=i,this._materialCache=new WeakMap,this.name="Outline Pass"}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 fg;e.isMeshToonOutlineMaterial=!0,e.name="Toon_Outline",e.side=L;const t=ac.negate(),r=xd.mul($d),s=fn(1),i=r.mul(wn(Kd,1)),n=r.mul(wn(Kd.add(t),1)),a=So(i.sub(n));return e.vertexNode=i.add(a.mul(this.thicknessNode).mul(i.w).mul(s)),e.colorNode=wn(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 tT=dn(([e,t])=>e.mul(t).clamp()).setLayout({name:"linearToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),rT=dn(([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"}]}),sT=dn(([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"}]}),iT=dn(([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)}),nT=dn(([e,t])=>{const r=Ln(.59719,.35458,.04823,.076,.90834,.01566,.0284,.13383,.83777),s=Ln(1.60475,-.53108,-.07367,-.10208,1.10813,-.00605,-.00327,-.07276,1.07602);return e=e.mul(t).div(.6),e=r.mul(e),e=iT(e),(e=s.mul(e)).clamp()}).setLayout({name:"acesFilmicToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),aT=Ln(Sn(1.6605,-.1246,-.0182),Sn(-.5876,1.1329,-.1006),Sn(-.0728,-.0083,1.1187)),oT=Ln(Sn(.6274,.0691,.0164),Sn(.3293,.9195,.088),Sn(.0433,.0113,.8956)),uT=dn(([e])=>{const t=Sn(e).toVar(),r=Sn(t.mul(t)).toVar(),s=Sn(r.mul(r)).toVar();return fn(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))))}),lT=dn(([e,t])=>{const r=Sn(e).toVar(),s=Ln(Sn(.856627153315983,.137318972929847,.11189821299995),Sn(.0951212405381588,.761241990602591,.0767994186031903),Sn(.0482516061458583,.101439036467562,.811302368396859)),i=Ln(Sn(1.1271005818144368,-.1413297634984383,-.14132976349843826),Sn(-.11060664309660323,1.157823702216272,-.11060664309660294),Sn(-.016493938717834573,-.016493938717834257,1.2519364065950405)),n=fn(-12.47393),a=fn(4.026069);return r.mulAssign(t),r.assign(oT.mul(r)),r.assign(s.mul(r)),r.assign(jo(r,1e-10)),r.assign(xo(r)),r.assign(r.sub(n).div(a.sub(n))),r.assign(uu(r,0,1)),r.assign(uT(r)),r.assign(i.mul(r)),r.assign(eu(jo(Sn(0),r),Sn(2.2))),r.assign(aT.mul(r)),r.assign(uu(r,0,1)),r}).setLayout({name:"agxToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),dT=dn(([e,t])=>{const r=fn(.76),s=fn(.15);e=e.mul(t);const i=qo(e.r,qo(e.g,e.b)),n=Tu(i.lessThan(.08),i.sub(Pa(6.25,i.mul(i))),.04);e.subAssign(n);const a=jo(e.r,jo(e.g,e.b));pn(a.lessThan(r),()=>e);const o=La(1,r),u=La(1,o.mul(o).div(a.add(o.sub(r))));e.mulAssign(u.div(a));const l=La(1,Da(1,s.mul(a.sub(u)).add(1)));return ou(e,Sn(u),l)}).setLayout({name:"neutralToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]});class cT extends di{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 hT=nn(cT).setParameterLength(1,3);class pT extends cT{static get type(){return"FunctionNode"}constructor(e="",t=[],r=""){super(e,t,r)}generateNodeType(e){return this.getNodeFunction(e).type}getMemberType(e,t){const r=this.getNodeType(e);return e.getStructTypeNode(r).getMemberType(e,t)}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 gT=(e,t=[],r="")=>{for(let e=0;es.call(...e);return i.functionNode=s,i};function mT(e){let t;const r=e.context.getViewZ;return void 0!==r&&(t=r(this)),(t||Jd.z).negate()}const fT=dn(([e,t],r)=>{const s=mT(r);return cu(e,t,s)}),yT=dn(([e],t)=>{const r=mT(t);return e.mul(e,r,r).negate().exp().oneMinus()}),bT=dn(([e,t],r)=>{const s=mT(r),i=t.sub(Yd.y).max(0).toConst().mul(s).toConst();return e.mul(e,i,i).negate().exp().oneMinus()}),xT=dn(([e,t])=>wn(t.toFloat().mix(aa.rgb,e.toVec3()),aa.a));let TT=null,_T=null;class vT extends di{static get type(){return"RangeNode"}constructor(e=fn(),t=fn()){super(),this.minNode=e,this.maxNode=t}getVectorLength(e){const t=this.getConstNode(this.minNode),r=this.getConstNode(this.maxNode),s=e.getTypeLength(Xs(t.value)),i=e.getTypeLength(Xs(r.value));return s>i?s:i}generateNodeType(e){return e.object.count>1?e.getTypeFromLength(this.getVectorLength(e)):"float"}getConstNode(e){let t=null;if(e.traverse(e=>{!0===e.isConstNode&&(t=e)}),null===t)throw new Bl('THREE.TSL: No "ConstNode" found in node graph.',this.stackTrace);return t}setup(e){const t=e.object;let r=null;if(t.count>1){const i=this.getConstNode(this.minNode),n=this.getConstNode(this.maxNode),a=i.value,o=n.value,u=e.getTypeLength(Xs(a)),d=e.getTypeLength(Xs(o));TT=TT||new s,_T=_T||new s,TT.setScalar(0),_T.setScalar(0),1===u?TT.setScalar(a):a.isColor?TT.set(a.r,a.g,a.b,1):TT.set(a.x,a.y,a.z||0,a.w||0),1===d?_T.setScalar(o):o.isColor?_T.set(o.r,o.g,o.b,1):_T.set(o.x,o.y,o.z||0,o.w||0);const c=4,h=c*t.count,p=new Float32Array(h);for(let e=0;enew ST(e,t),AT=RT("numWorkgroups","uvec3"),ET=RT("workgroupId","uvec3"),wT=RT("globalId","uvec3"),CT=RT("localId","uvec3"),MT=RT("subgroupSize","uint");class BT extends di{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)}}const FT=nn(BT);class LT extends ci{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 PT extends di{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 d('TSL: "label()" has been deprecated. Use "setName()" instead.',new Us),this.setName(e)}setScope(e){return this.scope=e,this}getElementType(){return this.elementType}getInputType(){return`${this.scope}Array`}element(e){return new LT(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 DT extends di{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)}generateNodeType(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=ml(l,i).toConst()),t.constNode.build(e);e.addLineFlowCode(l,this)}}DT.ATOMIC_LOAD="atomicLoad",DT.ATOMIC_STORE="atomicStore",DT.ATOMIC_ADD="atomicAdd",DT.ATOMIC_SUB="atomicSub",DT.ATOMIC_MAX="atomicMax",DT.ATOMIC_MIN="atomicMin",DT.ATOMIC_AND="atomicAnd",DT.ATOMIC_OR="atomicOr",DT.ATOMIC_XOR="atomicXor";const UT=nn(DT),IT=(e,t,r)=>UT(e,t,r).toStack();class OT extends pi{static get type(){return"SubgroupFunctionNode"}constructor(e,t=null,r=null){super(),this.method=e,this.aNode=t,this.bNode=r}getInputType(e){const t=this.aNode?this.aNode.getNodeType(e):null,r=this.bNode?this.bNode.getNodeType(e):null;return(e.isMatrix(t)?0:e.getTypeLength(t))>(e.isMatrix(r)?0:e.getTypeLength(r))?t:r}generateNodeType(e){const t=this.method;return t===OT.SUBGROUP_ELECT?"bool":t===OT.SUBGROUP_BALLOT?"uvec4":this.getInputType(e)}generate(e,t){const r=this.method,s=this.getNodeType(e),i=this.getInputType(e),n=this.aNode,a=this.bNode,o=[];if(r===OT.SUBGROUP_BROADCAST||r===OT.SUBGROUP_SHUFFLE||r===OT.QUAD_BROADCAST){const t=a.getNodeType(e);o.push(n.build(e,s),a.build(e,"float"===t?"int":s))}else r===OT.SUBGROUP_SHUFFLE_XOR||r===OT.SUBGROUP_SHUFFLE_DOWN||r===OT.SUBGROUP_SHUFFLE_UP?o.push(n.build(e,s),a.build(e,"uint")):(null!==n&&o.push(n.build(e,i)),null!==a&&o.push(a.build(e,i)));const u=0===o.length?"()":`( ${o.join(", ")} )`;return e.format(`${e.getMethod(r,s)}${u}`,s,t)}serialize(e){super.serialize(e),e.method=this.method}deserialize(e){super.deserialize(e),this.method=e.method}}OT.SUBGROUP_ELECT="subgroupElect",OT.SUBGROUP_BALLOT="subgroupBallot",OT.SUBGROUP_ADD="subgroupAdd",OT.SUBGROUP_INCLUSIVE_ADD="subgroupInclusiveAdd",OT.SUBGROUP_EXCLUSIVE_AND="subgroupExclusiveAdd",OT.SUBGROUP_MUL="subgroupMul",OT.SUBGROUP_INCLUSIVE_MUL="subgroupInclusiveMul",OT.SUBGROUP_EXCLUSIVE_MUL="subgroupExclusiveMul",OT.SUBGROUP_AND="subgroupAnd",OT.SUBGROUP_OR="subgroupOr",OT.SUBGROUP_XOR="subgroupXor",OT.SUBGROUP_MIN="subgroupMin",OT.SUBGROUP_MAX="subgroupMax",OT.SUBGROUP_ALL="subgroupAll",OT.SUBGROUP_ANY="subgroupAny",OT.SUBGROUP_BROADCAST_FIRST="subgroupBroadcastFirst",OT.QUAD_SWAP_X="quadSwapX",OT.QUAD_SWAP_Y="quadSwapY",OT.QUAD_SWAP_DIAGONAL="quadSwapDiagonal",OT.SUBGROUP_BROADCAST="subgroupBroadcast",OT.SUBGROUP_SHUFFLE="subgroupShuffle",OT.SUBGROUP_SHUFFLE_XOR="subgroupShuffleXor",OT.SUBGROUP_SHUFFLE_UP="subgroupShuffleUp",OT.SUBGROUP_SHUFFLE_DOWN="subgroupShuffleDown",OT.QUAD_BROADCAST="quadBroadcast";const VT=on(OT,OT.SUBGROUP_ELECT).setParameterLength(0),kT=on(OT,OT.SUBGROUP_BALLOT).setParameterLength(1),GT=on(OT,OT.SUBGROUP_ADD).setParameterLength(1),zT=on(OT,OT.SUBGROUP_INCLUSIVE_ADD).setParameterLength(1),$T=on(OT,OT.SUBGROUP_EXCLUSIVE_AND).setParameterLength(1),WT=on(OT,OT.SUBGROUP_MUL).setParameterLength(1),HT=on(OT,OT.SUBGROUP_INCLUSIVE_MUL).setParameterLength(1),qT=on(OT,OT.SUBGROUP_EXCLUSIVE_MUL).setParameterLength(1),jT=on(OT,OT.SUBGROUP_AND).setParameterLength(1),XT=on(OT,OT.SUBGROUP_OR).setParameterLength(1),KT=on(OT,OT.SUBGROUP_XOR).setParameterLength(1),QT=on(OT,OT.SUBGROUP_MIN).setParameterLength(1),YT=on(OT,OT.SUBGROUP_MAX).setParameterLength(1),ZT=on(OT,OT.SUBGROUP_ALL).setParameterLength(0),JT=on(OT,OT.SUBGROUP_ANY).setParameterLength(0),e_=on(OT,OT.SUBGROUP_BROADCAST_FIRST).setParameterLength(2),t_=on(OT,OT.QUAD_SWAP_X).setParameterLength(1),r_=on(OT,OT.QUAD_SWAP_Y).setParameterLength(1),s_=on(OT,OT.QUAD_SWAP_DIAGONAL).setParameterLength(1),i_=on(OT,OT.SUBGROUP_BROADCAST).setParameterLength(2),n_=on(OT,OT.SUBGROUP_SHUFFLE).setParameterLength(2),a_=on(OT,OT.SUBGROUP_SHUFFLE_XOR).setParameterLength(2),o_=on(OT,OT.SUBGROUP_SHUFFLE_UP).setParameterLength(2),u_=on(OT,OT.SUBGROUP_SHUFFLE_DOWN).setParameterLength(2),l_=on(OT,OT.QUAD_BROADCAST).setParameterLength(1);let d_;function c_(e){d_=d_||new WeakMap;let t=d_.get(e);return void 0===t&&d_.set(e,t={}),t}function h_(e){const t=c_(e);return t.shadowMatrix||(t.shadowMatrix=Na("mat4").setGroup(Ta).onRenderUpdate(t=>(!0===e.castShadow&&!1!==t.renderer.shadowMap.enabled||(e.shadow.camera.coordinateSystem!==t.camera.coordinateSystem&&(e.shadow.camera.coordinateSystem=t.camera.coordinateSystem,e.shadow.camera.updateProjectionMatrix()),e.shadow.updateMatrices(e)),e.shadow.matrix)))}function p_(e,t=Yd){const r=h_(e).mul(t);return r.xyz.div(r.w)}function g_(e){const t=c_(e);return t.position||(t.position=Na(new r).setGroup(Ta).onRenderUpdate((t,r)=>r.value.setFromMatrixPosition(e.matrixWorld)))}function m_(e){const t=c_(e);return t.targetPosition||(t.targetPosition=Na(new r).setGroup(Ta).onRenderUpdate((t,r)=>r.value.setFromMatrixPosition(e.target.matrixWorld)))}function f_(e){const t=c_(e);return t.viewPosition||(t.viewPosition=Na(new r).setGroup(Ta).onRenderUpdate(({camera:t},s)=>{s.value=s.value||new r,s.value.setFromMatrixPosition(e.matrixWorld),s.value.applyMatrix4(t.matrixWorldInverse)}))}const y_=e=>_d.transformDirection(g_(e).sub(m_(e))),b_=(e,t)=>{for(const r of t)if(r.isAnalyticLightNode&&r.light.id===e)return r;return null},x_=new WeakMap,T_=[];class __ extends di{static get type(){return"LightsNode"}constructor(){super("vec3"),this.totalDiffuseNode=On("vec3","totalDiffuse"),this.totalSpecularNode=On("vec3","totalSpecular"),this.outgoingLightNode=On("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(en(e));else{let s=null;if(null!==r&&(s=b_(e.id,r)),null===s){const t=i.getLightNodeClass(e.constructor);if(null===t){d(`LightsNode.setupNodeLights: Light node not found for ${e.constructor.name}`);continue}!1===x_.has(e)&&x_.set(e,new t(e)),s=x_.get(e)}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=Sn(null!==l?l.mix(g,u):u)),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 v_ extends di{static get type(){return"ShadowBaseNode"}constructor(e){super(),this.light=e,this.updateBeforeType=ti.RENDER,this.isShadowBaseNode=!0}setupShadowPosition({context:e,material:t}){N_.assign(t.receivedShadowPositionNode||e.shadowPositionWorld||Yd)}}const N_=On("vec3","shadowPositionWorld");function S_(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 R_(e,t){return t=S_(e,t),e.setMRT(null),e.setRenderObjectFunction(null),e.setClearColor(0,1),e.autoClear=!0,t}function A_(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 E_(e,t={}){return t.background=e.background,t.backgroundNode=e.backgroundNode,t.overrideMaterial=e.overrideMaterial,t}function w_(e,t){return t=E_(e,t),e.background=null,e.backgroundNode=null,e.overrideMaterial=null,t}function C_(e,t){e.background=t.background,e.backgroundNode=t.backgroundNode,e.overrideMaterial=t.overrideMaterial}function M_(e,t,r){return r=w_(t,r=R_(e,r))}function B_(e,t,r){A_(e,r),C_(t,r)}var F_=Object.freeze({__proto__:null,resetRendererAndSceneState:M_,resetRendererState:R_,resetSceneState:w_,restoreRendererAndSceneState:B_,restoreRendererState:A_,restoreSceneState:C_,saveRendererAndSceneState:function(e,t,r={}){return r=E_(t,r=S_(e,r))},saveRendererState:S_,saveSceneState:E_});const L_=new WeakMap,P_=dn(({depthTexture:e,shadowCoord:t,depthLayer:r})=>{let s=Dl(e,t.xy).setName("t_basic");return e.isArrayTexture&&(s=s.depth(r)),s.compare(t.z)}),D_=dn(({depthTexture:e,shadowCoord:t,shadow:r,depthLayer:s})=>{const i=(t,r)=>{let i=Dl(e,t);return e.isArrayTexture&&(i=i.depth(s)),i.compare(r)},n=Lc("mapSize","vec2",r).setGroup(Ta),a=Lc("radius","float",r).setGroup(Ta),o=Tn(1).div(n),u=a.mul(o.x),l=mx(Ql.xy).mul(6.28318530718);return Fa(i(t.xy.add(fx(0,5,l).mul(u)),t.z),i(t.xy.add(fx(1,5,l).mul(u)),t.z),i(t.xy.add(fx(2,5,l).mul(u)),t.z),i(t.xy.add(fx(3,5,l).mul(u)),t.z),i(t.xy.add(fx(4,5,l).mul(u)),t.z)).mul(.2)}),U_=dn(({depthTexture:e,shadowCoord:t,shadow:r,depthLayer:s})=>{const i=(t,r)=>{let i=Dl(e,t);return e.isArrayTexture&&(i=i.depth(s)),i.compare(r)},n=Lc("mapSize","vec2",r).setGroup(Ta),a=Tn(1).div(n),o=a.x,u=a.y,l=t.xy,d=Ro(l.mul(n).add(.5));return l.subAssign(d.mul(a)),Fa(i(l,t.z),i(l.add(Tn(o,0)),t.z),i(l.add(Tn(0,u)),t.z),i(l.add(a),t.z),ou(i(l.add(Tn(o.negate(),0)),t.z),i(l.add(Tn(o.mul(2),0)),t.z),d.x),ou(i(l.add(Tn(o.negate(),u)),t.z),i(l.add(Tn(o.mul(2),u)),t.z),d.x),ou(i(l.add(Tn(0,u.negate())),t.z),i(l.add(Tn(0,u.mul(2))),t.z),d.y),ou(i(l.add(Tn(o,u.negate())),t.z),i(l.add(Tn(o,u.mul(2))),t.z),d.y),ou(ou(i(l.add(Tn(o.negate(),u.negate())),t.z),i(l.add(Tn(o.mul(2),u.negate())),t.z),d.x),ou(i(l.add(Tn(o.negate(),u.mul(2))),t.z),i(l.add(Tn(o.mul(2),u.mul(2))),t.z),d.x),d.y)).mul(1/9)}),I_=dn(({depthTexture:e,shadowCoord:t,depthLayer:r},s)=>{let i=Dl(e).sample(t.xy);e.isArrayTexture&&(i=i.depth(r)),i=i.rg;const n=i.x,a=jo(1e-7,i.y.mul(i.y)),o=s.renderer.reversedDepthBuffer?Xo(n,t.z):Xo(t.z,n),u=fn(1).toVar();return pn(o.notEqual(1),()=>{const e=t.z.sub(n);let r=a.div(a.add(e.mul(e)));r=uu(La(r,.3).div(.65)),u.assign(jo(o,r))}),u}),O_=e=>{let t=L_.get(e);return void 0===t&&(t=new fg,t.colorNode=wn(0,0,0,1),t.isShadowPassMaterial=!0,t.name="ShadowMaterial",t.blending=se,t.fog=!1,L_.set(e,t)),t},V_=e=>{const t=L_.get(e);void 0!==t&&(t.dispose(),L_.delete(e))},k_=new gy,G_=[],z_=(e,t,r,s)=>{G_[0]=e,G_[1]=t;let i=k_.get(G_);return void 0!==i&&i.shadowType===r&&i.useVelocity===s||(i=(i,n,a,o,u,l,...d)=>{(!0===i.castShadow||i.receiveShadow&&r===ht)&&(s&&(Qs(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,k_.set(G_,i)),G_[0]=null,G_[1]=null,i},$_=dn(({samples:e,radius:t,size:r,shadowPass:s,depthLayer:i})=>{const n=fn(0).toVar("meanVertical"),a=fn(0).toVar("squareMeanVertical"),o=e.lessThanEqual(fn(1)).select(fn(0),fn(2).div(e.sub(1))),u=e.lessThanEqual(fn(1)).select(fn(0),fn(-1));Rp({start:yn(0),end:yn(e),type:"int",condition:"<"},({i:e})=>{const l=u.add(fn(e).mul(o));let d=s.sample(Fa(Ql.xy,Tn(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=To(a.sub(n.mul(n)).max(0));return Tn(n,l)}),W_=dn(({samples:e,radius:t,size:r,shadowPass:s,depthLayer:i})=>{const n=fn(0).toVar("meanHorizontal"),a=fn(0).toVar("squareMeanHorizontal"),o=e.lessThanEqual(fn(1)).select(fn(0),fn(2).div(e.sub(1))),u=e.lessThanEqual(fn(1)).select(fn(0),fn(-1));Rp({start:yn(0),end:yn(e),type:"int",condition:"<"},({i:e})=>{const l=u.add(fn(e).mul(o));let d=s.sample(Fa(Ql.xy,Tn(l,0).mul(t)).div(r));s.value.isArrayTexture&&(d=d.depth(i)),n.addAssign(d.x),a.addAssign(Fa(d.y.mul(d.y),d.x.mul(d.x)))}),n.divAssign(e),a.divAssign(e);const l=To(a.sub(n.mul(n)).max(0));return Tn(n,l)}),H_=[P_,D_,U_,I_];let q_;const j_=new ux;class X_ extends v_{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._currentShadowType=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,fn(1))}setupShadowCoord(e,t){const{shadow:r}=this,{renderer:s}=e,i=r.biasNode||Lc("bias","float",r).setGroup(Ta);let n,a=t;if(r.camera.isOrthographicCamera||!0!==s.logarithmicDepthBuffer)a=a.xyz.div(a.w),n=a.z;else{const e=a.w;a=a.xy.div(e);const t=Lc("near","float",r.camera).setGroup(Ta),s=Lc("far","float",r.camera).setGroup(Ta);n=Zp(e.negate(),t,s)}return a=Sn(a.x,a.y.oneMinus(),s.reversedDepthBuffer?n.sub(i):n.add(i)),a}getShadowFilterFn(e){return H_[e]}setupRenderTarget(e,t){const r=new J(e.mapSize.width,e.mapSize.height);r.name="ShadowDepthTexture",r.compareFunction=t.renderer.reversedDepthBuffer?M:w;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,camera:r}=e,{light:s,shadow:i}=this,{depthTexture:n,shadowMap:a}=this.setupRenderTarget(i,e),o=t.shadowMap.type,u=t.hasCompatibility(A.TEXTURE_COMPARE);if(o!==dt&&o!==ct||!u?(n.minFilter=B,n.magFilter=B):(n.minFilter=de,n.magFilter=de),i.camera.coordinateSystem=r.coordinateSystem,i.camera.updateProjectionMatrix(),o===ht&&!0!==i.isPointLightShadow){n.compareFunction=null,a.depth>1?(a._vsmShadowMapVertical||(a._vsmShadowMapVertical=e.createRenderTarget(i.mapSize.width,i.mapSize.height,{format:W,type:_e,depth:a.depth,depthBuffer:!1}),a._vsmShadowMapVertical.texture.name="VSMVertical"),this.vsmShadowMapVertical=a._vsmShadowMapVertical,a._vsmShadowMapHorizontal||(a._vsmShadowMapHorizontal=e.createRenderTarget(i.mapSize.width,i.mapSize.height,{format:W,type:_e,depth:a.depth,depthBuffer:!1}),a._vsmShadowMapHorizontal.texture.name="VSMHorizontal"),this.vsmShadowMapHorizontal=a._vsmShadowMapHorizontal):(this.vsmShadowMapVertical=e.createRenderTarget(i.mapSize.width,i.mapSize.height,{format:W,type:_e,depthBuffer:!1}),this.vsmShadowMapHorizontal=e.createRenderTarget(i.mapSize.width,i.mapSize.height,{format:W,type:_e,depthBuffer:!1}));let t=Dl(n);n.isArrayTexture&&(t=t.depth(this.depthLayer));let r=Dl(this.vsmShadowMapVertical.texture);n.isArrayTexture&&(r=r.depth(this.depthLayer));const s=Lc("blurSamples","float",i).setGroup(Ta),o=Lc("radius","float",i).setGroup(Ta),u=Lc("mapSize","vec2",i).setGroup(Ta);let l=this.vsmMaterialVertical||(this.vsmMaterialVertical=new fg);l.fragmentNode=$_({samples:s,radius:o,size:u,shadowPass:t,depthLayer:this.depthLayer}).context(e.getSharedContext()),l.name="VSMVertical",l=this.vsmMaterialHorizontal||(this.vsmMaterialHorizontal=new fg),l.fragmentNode=W_({samples:s,radius:o,size:u,shadowPass:r,depthLayer:this.depthLayer}).context(e.getSharedContext()),l.name="VSMHorizontal"}const l=Lc("intensity","float",i).setGroup(Ta),d=Lc("normalBias","float",i).setGroup(Ta),c=h_(s).mul(N_.add(cc.mul(d))),h=this.setupShadowCoord(e,c),p=i.filterNode||this.getShadowFilterFn(t.shadowMap.type)||null;if(null===p)throw new Error("THREE.WebGPURenderer: Shadow map type not supported yet.");const g=o===ht&&!0!==i.isPointLightShadow?this.vsmShadowMapHorizontal.texture:n,m=this.setupShadowFilter(e,{filterFn:p,shadowTexture:a.texture,depthTexture:g,shadowCoord:h,shadow:i,depthLayer:this.depthLayer});let f,y;!0===t.shadowMap.transmitted&&(a.texture.isCubeTexture?f=Mc(a.texture,h.xyz):(f=Dl(a.texture,h),n.isArrayTexture&&(f=f.depth(this.depthLayer)))),y=f?ou(1,m.rgb.mix(f,1),l.mul(f.a)).toVar():ou(1,m,l).toVar(),this.shadowMap=a,this.shadow.map=a;const b=`${this.light.type} Shadow [ ${this.light.name||"ID: "+this.light.id} ]`;return f&&y.toInspector(`${b} / Color`,()=>this.shadowMap.texture.isCubeTexture?Mc(this.shadowMap.texture):Dl(this.shadowMap.texture)),y.toInspector(`${b} / Depth`,()=>this.shadowMap.texture.isCubeTexture?Mc(this.shadowMap.texture).r.oneMinus():Ul(this.shadowMap.depthTexture,Al().mul(wl(Dl(this.shadowMap.depthTexture)))).r.oneMinus())}setup(e){if(!1!==e.renderer.shadowMap.enabled)return dn(()=>{const t=e.renderer.shadowMap.type;this._currentShadowType!==t&&(this._reset(),this._node=null);let r=this._node;return this.setupShadowPosition(e),null===r&&(this._node=r=this.setupShadow(e),this._currentShadowType=t),e.material.receivedShadowNode&&(r=e.material.receivedShadowNode(r)),r})()}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);const a=n.name;n.name=`Shadow Map [ ${s.name||"ID: "+s.id} ]`,i.render(n,t.camera),n.name=a}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");q_=M_(i,n,q_),n.overrideMaterial=O_(r),i.setRenderObjectFunction(z_(i,s,o,h)),i.setClearColor(0,0),i.setRenderTarget(t),this.renderShadow(e),i.setRenderObjectFunction(d),o===ht&&!0!==s.isPointLightShadow&&this.vsmPass(i),s.camera.layers.mask=l,B_(i,n,q_)}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),j_.material=this.vsmMaterialVertical,j_.render(e),e.setRenderTarget(this.vsmShadowMapHorizontal),j_.material=this.vsmMaterialHorizontal,j_.render(e)}dispose(){this._reset(),super.dispose()}_reset(){this._currentShadowType=null,V_(this.light),this.shadowMap&&(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)}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 K_=(e,t)=>new X_(e,t),Q_=new e,Y_=new a,Z_=new r,J_=new r,ev=[new r(1,0,0),new r(-1,0,0),new r(0,-1,0),new r(0,1,0),new r(0,0,1),new r(0,0,-1)],tv=[new r(0,-1,0),new r(0,-1,0),new r(0,0,-1),new r(0,0,1),new r(0,-1,0),new r(0,-1,0)],rv=[new r(1,0,0),new r(-1,0,0),new r(0,1,0),new r(0,-1,0),new r(0,0,1),new r(0,0,-1)],sv=[new r(0,-1,0),new r(0,-1,0),new r(0,0,1),new r(0,0,-1),new r(0,-1,0),new r(0,-1,0)],iv=dn(({depthTexture:e,bd3D:t,dp:r})=>Mc(e,t).compare(r)),nv=dn(({depthTexture:e,bd3D:t,dp:r,shadow:s})=>{const i=Lc("radius","float",s).setGroup(Ta),n=Lc("mapSize","vec2",s).setGroup(Ta),a=i.div(n.x),o=Fo(t),u=So(Jo(t,o.x.greaterThan(o.z).select(Sn(0,1,0),Sn(1,0,0)))),l=Jo(t,u),d=mx(Ql.xy).mul(6.28318530718),c=fx(0,5,d),h=fx(1,5,d),p=fx(2,5,d),g=fx(3,5,d),m=fx(4,5,d);return Mc(e,t.add(u.mul(c.x).add(l.mul(c.y)).mul(a))).compare(r).add(Mc(e,t.add(u.mul(h.x).add(l.mul(h.y)).mul(a))).compare(r)).add(Mc(e,t.add(u.mul(p.x).add(l.mul(p.y)).mul(a))).compare(r)).add(Mc(e,t.add(u.mul(g.x).add(l.mul(g.y)).mul(a))).compare(r)).add(Mc(e,t.add(u.mul(m.x).add(l.mul(m.y)).mul(a))).compare(r)).mul(.2)}),av=dn(({filterFn:e,depthTexture:t,shadowCoord:r,shadow:s},i)=>{const n=r.xyz.toConst(),a=n.abs().toConst(),o=a.x.max(a.y).max(a.z),u=Na("float").setGroup(Ta).onRenderUpdate(()=>s.camera.near),l=Na("float").setGroup(Ta).onRenderUpdate(()=>s.camera.far),d=Lc("bias","float",s).setGroup(Ta),c=fn(1).toVar();return pn(o.sub(l).lessThanEqual(0).and(o.sub(u).greaterThanEqual(0)),()=>{let r;i.renderer.reversedDepthBuffer?(r=Qp(o.negate(),u,l),r.subAssign(d)):(r=Kp(o.negate(),u,l),r.addAssign(d));const a=n.normalize();c.assign(e({depthTexture:t,bd3D:a,dp:r,shadow:s}))}),c});class ov extends X_{static get type(){return"PointShadowNode"}constructor(e,t=null){super(e,t)}getShadowFilterFn(e){return e===pt?iv:nv}setupShadowCoord(e,t){return t}setupShadowFilter(e,{filterFn:t,depthTexture:r,shadowCoord:s,shadow:i}){return av({filterFn:t,depthTexture:r,shadowCoord:s,shadow:i})}setupRenderTarget(e,t){const r=new gt(e.mapSize.width);r.name="PointShadowDepthTexture",r.compareFunction=t.renderer.reversedDepthBuffer?M:w;const s=t.createCubeRenderTarget(e.mapSize.width);return s.texture.name="PointShadowMap",s.depthTexture=r,{shadowMap:s,depthTexture:r}}renderShadow(e){const{shadow:t,shadowMap:r,light:s}=this,{renderer:i,scene:n}=e,a=t.camera,o=t.matrix,u=i.coordinateSystem===h,l=u?ev:rv,d=u?tv:sv;r.setSize(t.mapSize.width,t.mapSize.width);const c=i.autoClear,p=i.getClearColor(Q_),g=i.getClearAlpha();i.autoClear=!1,i.setClearColor(t.clearColor,t.clearAlpha);for(let e=0;e<6;e++){i.setRenderTarget(r,e),i.clear();const u=s.distance||a.far;u!==a.far&&(a.far=u,a.updateProjectionMatrix()),Z_.setFromMatrixPosition(s.matrixWorld),a.position.copy(Z_),J_.copy(a.position),J_.add(l[e]),a.up.copy(d[e]),a.lookAt(J_),a.updateMatrixWorld(),o.makeTranslation(-Z_.x,-Z_.y,-Z_.z),Y_.multiplyMatrices(a.projectionMatrix,a.matrixWorldInverse),t._frustum.setFromProjectionMatrix(Y_,a.coordinateSystem,a.reversedDepth);const c=n.name;n.name=`Point Light Shadow [ ${s.name||"ID: "+s.id} ] - Face ${e+1}`,i.render(n,a),n.name=c}i.autoClear=c,i.setClearColor(p,g)}}const uv=(e,t)=>new ov(e,t);class lv extends Fp{static get type(){return"AnalyticLightNode"}constructor(t=null){super(),this.light=t,this.color=new e,this.colorNode=t&&t.colorNode||Na(this.color).setGroup(Ta),this.baseColorNode=null,this.shadowNode=null,this.shadowColorNode=null,this.isAnalyticLightNode=!0,this.updateType=ti.FRAME,t&&t.shadow&&(this._shadowDisposeListener=()=>{this.disposeShadow()},t.addEventListener("dispose",this._shadowDisposeListener))}dispose(){this._shadowDisposeListener&&this.light.removeEventListener("dispose",this._shadowDisposeListener),super.dispose()}disposeShadow(){null!==this.shadowNode&&(this.shadowNode.dispose(),this.shadowNode=null),this.shadowColorNode=null,null!==this.baseColorNode&&(this.colorNode=this.baseColorNode,this.baseColorNode=null)}getHash(){return this.light.uuid}getLightVector(e){return f_(this.light).sub(e.context.positionView||Jd)}setupDirect(){}setupDirectRectArea(){}setupShadowNode(){return K_(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?en(e):this.setupShadowNode(),this.shadowNode=t,this.shadowColorNode=r=this.colorNode.mul(t),this.baseColorNode=this.colorNode}e.context.getShadow&&(r=e.context.getShadow(this,e)),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 dv=dn(({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)}),cv=({color:e,lightVector:t,cutoffDistance:r,decayExponent:s})=>{const i=t.normalize(),n=t.length(),a=dv({lightDistance:n,cutoffDistance:r,decayExponent:s});return{lightDirection:i,lightColor:e.mul(a)}};class hv extends lv{static get type(){return"PointLightNode"}constructor(e=null){super(e),this.cutoffDistanceNode=Na(0).setGroup(Ta),this.decayExponentNode=Na(2).setGroup(Ta)}update(e){const{light:t}=this;super.update(e),this.cutoffDistanceNode.value=t.distance,this.decayExponentNode.value=t.decay}setupShadowNode(){return uv(this.light)}setupDirect(e){return cv({color:this.colorNode,lightVector:this.getLightVector(e),cutoffDistance:this.cutoffDistanceNode,decayExponent:this.decayExponentNode})}}const pv=dn(([e=Al()])=>{const t=e.mul(2),r=t.x.floor(),s=t.y.floor();return r.add(s).mod(2).sign()}),gv=dn(([e=Al()],{renderer:t,material:r})=>{const s=au(e.mul(2).sub(1));let i;if(r.alphaToCoverage&&t.currentSamples>0){const e=fn(s.fwidth()).toVar();i=cu(e.oneMinus(),e.add(1),s).oneMinus()}else i=Tu(s.greaterThan(1),0,1);return i}),mv=dn(([e,t,r])=>{const s=fn(r).toVar(),i=fn(t).toVar(),n=xn(e).toVar();return Tu(n,i,s)}).setLayout({name:"mx_select",type:"float",inputs:[{name:"b",type:"bool"},{name:"t",type:"float"},{name:"f",type:"float"}]}),fv=dn(([e,t])=>{const r=xn(t).toVar(),s=fn(e).toVar();return Tu(r,s.negate(),s)}).setLayout({name:"mx_negate_if",type:"float",inputs:[{name:"val",type:"float"},{name:"b",type:"bool"}]}),yv=dn(([e])=>{const t=fn(e).toVar();return yn(vo(t))}).setLayout({name:"mx_floor",type:"int",inputs:[{name:"x",type:"float"}]}),bv=dn(([e,t])=>{const r=fn(e).toVar();return t.assign(yv(r)),r.sub(fn(t))}),xv=Lb([dn(([e,t,r,s,i,n])=>{const a=fn(n).toVar(),o=fn(i).toVar(),u=fn(s).toVar(),l=fn(r).toVar(),d=fn(t).toVar(),c=fn(e).toVar(),h=fn(La(1,o)).toVar();return La(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"}]}),dn(([e,t,r,s,i,n])=>{const a=fn(n).toVar(),o=fn(i).toVar(),u=Sn(s).toVar(),l=Sn(r).toVar(),d=Sn(t).toVar(),c=Sn(e).toVar(),h=fn(La(1,o)).toVar();return La(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"}]})]),Tv=Lb([dn(([e,t,r,s,i,n,a,o,u,l,d])=>{const c=fn(d).toVar(),h=fn(l).toVar(),p=fn(u).toVar(),g=fn(o).toVar(),m=fn(a).toVar(),f=fn(n).toVar(),y=fn(i).toVar(),b=fn(s).toVar(),x=fn(r).toVar(),T=fn(t).toVar(),_=fn(e).toVar(),v=fn(La(1,p)).toVar(),N=fn(La(1,h)).toVar();return fn(La(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"}]}),dn(([e,t,r,s,i,n,a,o,u,l,d])=>{const c=fn(d).toVar(),h=fn(l).toVar(),p=fn(u).toVar(),g=Sn(o).toVar(),m=Sn(a).toVar(),f=Sn(n).toVar(),y=Sn(i).toVar(),b=Sn(s).toVar(),x=Sn(r).toVar(),T=Sn(t).toVar(),_=Sn(e).toVar(),v=fn(La(1,p)).toVar(),N=fn(La(1,h)).toVar();return fn(La(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"}]})]),_v=dn(([e,t,r])=>{const s=fn(r).toVar(),i=fn(t).toVar(),n=bn(e).toVar(),a=bn(n.bitAnd(bn(7))).toVar(),o=fn(mv(a.lessThan(bn(4)),i,s)).toVar(),u=fn(Pa(2,mv(a.lessThan(bn(4)),s,i))).toVar();return fv(o,xn(a.bitAnd(bn(1)))).add(fv(u,xn(a.bitAnd(bn(2)))))}).setLayout({name:"mx_gradient_float_0",type:"float",inputs:[{name:"hash",type:"uint"},{name:"x",type:"float"},{name:"y",type:"float"}]}),vv=dn(([e,t,r,s])=>{const i=fn(s).toVar(),n=fn(r).toVar(),a=fn(t).toVar(),o=bn(e).toVar(),u=bn(o.bitAnd(bn(15))).toVar(),l=fn(mv(u.lessThan(bn(8)),a,n)).toVar(),d=fn(mv(u.lessThan(bn(4)),n,mv(u.equal(bn(12)).or(u.equal(bn(14))),a,i))).toVar();return fv(l,xn(u.bitAnd(bn(1)))).add(fv(d,xn(u.bitAnd(bn(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"}]}),Nv=Lb([_v,vv]),Sv=dn(([e,t,r])=>{const s=fn(r).toVar(),i=fn(t).toVar(),n=An(e).toVar();return Sn(Nv(n.x,i,s),Nv(n.y,i,s),Nv(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"}]}),Rv=dn(([e,t,r,s])=>{const i=fn(s).toVar(),n=fn(r).toVar(),a=fn(t).toVar(),o=An(e).toVar();return Sn(Nv(o.x,a,n,i),Nv(o.y,a,n,i),Nv(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"}]}),Av=Lb([Sv,Rv]),Ev=dn(([e])=>{const t=fn(e).toVar();return Pa(.6616,t)}).setLayout({name:"mx_gradient_scale2d_0",type:"float",inputs:[{name:"v",type:"float"}]}),wv=dn(([e])=>{const t=fn(e).toVar();return Pa(.982,t)}).setLayout({name:"mx_gradient_scale3d_0",type:"float",inputs:[{name:"v",type:"float"}]}),Cv=Lb([Ev,dn(([e])=>{const t=Sn(e).toVar();return Pa(.6616,t)}).setLayout({name:"mx_gradient_scale2d_1",type:"vec3",inputs:[{name:"v",type:"vec3"}]})]),Mv=Lb([wv,dn(([e])=>{const t=Sn(e).toVar();return Pa(.982,t)}).setLayout({name:"mx_gradient_scale3d_1",type:"vec3",inputs:[{name:"v",type:"vec3"}]})]),Bv=dn(([e,t])=>{const r=yn(t).toVar(),s=bn(e).toVar();return s.shiftLeft(r).bitOr(s.shiftRight(yn(32).sub(r)))}).setLayout({name:"mx_rotl32",type:"uint",inputs:[{name:"x",type:"uint"},{name:"k",type:"int"}]}),Fv=dn(([e,t,r])=>{e.subAssign(r),e.bitXorAssign(Bv(r,yn(4))),r.addAssign(t),t.subAssign(e),t.bitXorAssign(Bv(e,yn(6))),e.addAssign(r),r.subAssign(t),r.bitXorAssign(Bv(t,yn(8))),t.addAssign(e),e.subAssign(r),e.bitXorAssign(Bv(r,yn(16))),r.addAssign(t),t.subAssign(e),t.bitXorAssign(Bv(e,yn(19))),e.addAssign(r),r.subAssign(t),r.bitXorAssign(Bv(t,yn(4))),t.addAssign(e)}),Lv=dn(([e,t,r])=>{const s=bn(r).toVar(),i=bn(t).toVar(),n=bn(e).toVar();return s.bitXorAssign(i),s.subAssign(Bv(i,yn(14))),n.bitXorAssign(s),n.subAssign(Bv(s,yn(11))),i.bitXorAssign(n),i.subAssign(Bv(n,yn(25))),s.bitXorAssign(i),s.subAssign(Bv(i,yn(16))),n.bitXorAssign(s),n.subAssign(Bv(s,yn(4))),i.bitXorAssign(n),i.subAssign(Bv(n,yn(14))),s.bitXorAssign(i),s.subAssign(Bv(i,yn(24))),s}).setLayout({name:"mx_bjfinal",type:"uint",inputs:[{name:"a",type:"uint"},{name:"b",type:"uint"},{name:"c",type:"uint"}]}),Pv=dn(([e])=>{const t=bn(e).toVar();return fn(t).div(fn(bn(yn(4294967295))))}).setLayout({name:"mx_bits_to_01",type:"float",inputs:[{name:"bits",type:"uint"}]}),Dv=dn(([e])=>{const t=fn(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"}]}),Uv=Lb([dn(([e])=>{const t=yn(e).toVar(),r=bn(bn(1)).toVar(),s=bn(bn(yn(3735928559)).add(r.shiftLeft(bn(2))).add(bn(13))).toVar();return Lv(s.add(bn(t)),s,s)}).setLayout({name:"mx_hash_int_0",type:"uint",inputs:[{name:"x",type:"int"}]}),dn(([e,t])=>{const r=yn(t).toVar(),s=yn(e).toVar(),i=bn(bn(2)).toVar(),n=bn().toVar(),a=bn().toVar(),o=bn().toVar();return n.assign(a.assign(o.assign(bn(yn(3735928559)).add(i.shiftLeft(bn(2))).add(bn(13))))),n.addAssign(bn(s)),a.addAssign(bn(r)),Lv(n,a,o)}).setLayout({name:"mx_hash_int_1",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"}]}),dn(([e,t,r])=>{const s=yn(r).toVar(),i=yn(t).toVar(),n=yn(e).toVar(),a=bn(bn(3)).toVar(),o=bn().toVar(),u=bn().toVar(),l=bn().toVar();return o.assign(u.assign(l.assign(bn(yn(3735928559)).add(a.shiftLeft(bn(2))).add(bn(13))))),o.addAssign(bn(n)),u.addAssign(bn(i)),l.addAssign(bn(s)),Lv(o,u,l)}).setLayout({name:"mx_hash_int_2",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"}]}),dn(([e,t,r,s])=>{const i=yn(s).toVar(),n=yn(r).toVar(),a=yn(t).toVar(),o=yn(e).toVar(),u=bn(bn(4)).toVar(),l=bn().toVar(),d=bn().toVar(),c=bn().toVar();return l.assign(d.assign(c.assign(bn(yn(3735928559)).add(u.shiftLeft(bn(2))).add(bn(13))))),l.addAssign(bn(o)),d.addAssign(bn(a)),c.addAssign(bn(n)),Fv(l,d,c),l.addAssign(bn(i)),Lv(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"}]}),dn(([e,t,r,s,i])=>{const n=yn(i).toVar(),a=yn(s).toVar(),o=yn(r).toVar(),u=yn(t).toVar(),l=yn(e).toVar(),d=bn(bn(5)).toVar(),c=bn().toVar(),h=bn().toVar(),p=bn().toVar();return c.assign(h.assign(p.assign(bn(yn(3735928559)).add(d.shiftLeft(bn(2))).add(bn(13))))),c.addAssign(bn(l)),h.addAssign(bn(u)),p.addAssign(bn(o)),Fv(c,h,p),c.addAssign(bn(a)),h.addAssign(bn(n)),Lv(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"}]})]),Iv=Lb([dn(([e,t])=>{const r=yn(t).toVar(),s=yn(e).toVar(),i=bn(Uv(s,r)).toVar(),n=An().toVar();return n.x.assign(i.bitAnd(yn(255))),n.y.assign(i.shiftRight(yn(8)).bitAnd(yn(255))),n.z.assign(i.shiftRight(yn(16)).bitAnd(yn(255))),n}).setLayout({name:"mx_hash_vec3_0",type:"uvec3",inputs:[{name:"x",type:"int"},{name:"y",type:"int"}]}),dn(([e,t,r])=>{const s=yn(r).toVar(),i=yn(t).toVar(),n=yn(e).toVar(),a=bn(Uv(n,i,s)).toVar(),o=An().toVar();return o.x.assign(a.bitAnd(yn(255))),o.y.assign(a.shiftRight(yn(8)).bitAnd(yn(255))),o.z.assign(a.shiftRight(yn(16)).bitAnd(yn(255))),o}).setLayout({name:"mx_hash_vec3_1",type:"uvec3",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"}]})]),Ov=Lb([dn(([e])=>{const t=Tn(e).toVar(),r=yn().toVar(),s=yn().toVar(),i=fn(bv(t.x,r)).toVar(),n=fn(bv(t.y,s)).toVar(),a=fn(Dv(i)).toVar(),o=fn(Dv(n)).toVar(),u=fn(xv(Nv(Uv(r,s),i,n),Nv(Uv(r.add(yn(1)),s),i.sub(1),n),Nv(Uv(r,s.add(yn(1))),i,n.sub(1)),Nv(Uv(r.add(yn(1)),s.add(yn(1))),i.sub(1),n.sub(1)),a,o)).toVar();return Cv(u)}).setLayout({name:"mx_perlin_noise_float_0",type:"float",inputs:[{name:"p",type:"vec2"}]}),dn(([e])=>{const t=Sn(e).toVar(),r=yn().toVar(),s=yn().toVar(),i=yn().toVar(),n=fn(bv(t.x,r)).toVar(),a=fn(bv(t.y,s)).toVar(),o=fn(bv(t.z,i)).toVar(),u=fn(Dv(n)).toVar(),l=fn(Dv(a)).toVar(),d=fn(Dv(o)).toVar(),c=fn(Tv(Nv(Uv(r,s,i),n,a,o),Nv(Uv(r.add(yn(1)),s,i),n.sub(1),a,o),Nv(Uv(r,s.add(yn(1)),i),n,a.sub(1),o),Nv(Uv(r.add(yn(1)),s.add(yn(1)),i),n.sub(1),a.sub(1),o),Nv(Uv(r,s,i.add(yn(1))),n,a,o.sub(1)),Nv(Uv(r.add(yn(1)),s,i.add(yn(1))),n.sub(1),a,o.sub(1)),Nv(Uv(r,s.add(yn(1)),i.add(yn(1))),n,a.sub(1),o.sub(1)),Nv(Uv(r.add(yn(1)),s.add(yn(1)),i.add(yn(1))),n.sub(1),a.sub(1),o.sub(1)),u,l,d)).toVar();return Mv(c)}).setLayout({name:"mx_perlin_noise_float_1",type:"float",inputs:[{name:"p",type:"vec3"}]})]),Vv=Lb([dn(([e])=>{const t=Tn(e).toVar(),r=yn().toVar(),s=yn().toVar(),i=fn(bv(t.x,r)).toVar(),n=fn(bv(t.y,s)).toVar(),a=fn(Dv(i)).toVar(),o=fn(Dv(n)).toVar(),u=Sn(xv(Av(Iv(r,s),i,n),Av(Iv(r.add(yn(1)),s),i.sub(1),n),Av(Iv(r,s.add(yn(1))),i,n.sub(1)),Av(Iv(r.add(yn(1)),s.add(yn(1))),i.sub(1),n.sub(1)),a,o)).toVar();return Cv(u)}).setLayout({name:"mx_perlin_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"vec2"}]}),dn(([e])=>{const t=Sn(e).toVar(),r=yn().toVar(),s=yn().toVar(),i=yn().toVar(),n=fn(bv(t.x,r)).toVar(),a=fn(bv(t.y,s)).toVar(),o=fn(bv(t.z,i)).toVar(),u=fn(Dv(n)).toVar(),l=fn(Dv(a)).toVar(),d=fn(Dv(o)).toVar(),c=Sn(Tv(Av(Iv(r,s,i),n,a,o),Av(Iv(r.add(yn(1)),s,i),n.sub(1),a,o),Av(Iv(r,s.add(yn(1)),i),n,a.sub(1),o),Av(Iv(r.add(yn(1)),s.add(yn(1)),i),n.sub(1),a.sub(1),o),Av(Iv(r,s,i.add(yn(1))),n,a,o.sub(1)),Av(Iv(r.add(yn(1)),s,i.add(yn(1))),n.sub(1),a,o.sub(1)),Av(Iv(r,s.add(yn(1)),i.add(yn(1))),n,a.sub(1),o.sub(1)),Av(Iv(r.add(yn(1)),s.add(yn(1)),i.add(yn(1))),n.sub(1),a.sub(1),o.sub(1)),u,l,d)).toVar();return Mv(c)}).setLayout({name:"mx_perlin_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec3"}]})]),kv=Lb([dn(([e])=>{const t=fn(e).toVar(),r=yn(yv(t)).toVar();return Pv(Uv(r))}).setLayout({name:"mx_cell_noise_float_0",type:"float",inputs:[{name:"p",type:"float"}]}),dn(([e])=>{const t=Tn(e).toVar(),r=yn(yv(t.x)).toVar(),s=yn(yv(t.y)).toVar();return Pv(Uv(r,s))}).setLayout({name:"mx_cell_noise_float_1",type:"float",inputs:[{name:"p",type:"vec2"}]}),dn(([e])=>{const t=Sn(e).toVar(),r=yn(yv(t.x)).toVar(),s=yn(yv(t.y)).toVar(),i=yn(yv(t.z)).toVar();return Pv(Uv(r,s,i))}).setLayout({name:"mx_cell_noise_float_2",type:"float",inputs:[{name:"p",type:"vec3"}]}),dn(([e])=>{const t=wn(e).toVar(),r=yn(yv(t.x)).toVar(),s=yn(yv(t.y)).toVar(),i=yn(yv(t.z)).toVar(),n=yn(yv(t.w)).toVar();return Pv(Uv(r,s,i,n))}).setLayout({name:"mx_cell_noise_float_3",type:"float",inputs:[{name:"p",type:"vec4"}]})]),Gv=Lb([dn(([e])=>{const t=fn(e).toVar(),r=yn(yv(t)).toVar();return Sn(Pv(Uv(r,yn(0))),Pv(Uv(r,yn(1))),Pv(Uv(r,yn(2))))}).setLayout({name:"mx_cell_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"float"}]}),dn(([e])=>{const t=Tn(e).toVar(),r=yn(yv(t.x)).toVar(),s=yn(yv(t.y)).toVar();return Sn(Pv(Uv(r,s,yn(0))),Pv(Uv(r,s,yn(1))),Pv(Uv(r,s,yn(2))))}).setLayout({name:"mx_cell_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec2"}]}),dn(([e])=>{const t=Sn(e).toVar(),r=yn(yv(t.x)).toVar(),s=yn(yv(t.y)).toVar(),i=yn(yv(t.z)).toVar();return Sn(Pv(Uv(r,s,i,yn(0))),Pv(Uv(r,s,i,yn(1))),Pv(Uv(r,s,i,yn(2))))}).setLayout({name:"mx_cell_noise_vec3_2",type:"vec3",inputs:[{name:"p",type:"vec3"}]}),dn(([e])=>{const t=wn(e).toVar(),r=yn(yv(t.x)).toVar(),s=yn(yv(t.y)).toVar(),i=yn(yv(t.z)).toVar(),n=yn(yv(t.w)).toVar();return Sn(Pv(Uv(r,s,i,n,yn(0))),Pv(Uv(r,s,i,n,yn(1))),Pv(Uv(r,s,i,n,yn(2))))}).setLayout({name:"mx_cell_noise_vec3_3",type:"vec3",inputs:[{name:"p",type:"vec4"}]})]),zv=dn(([e,t,r,s])=>{const i=fn(s).toVar(),n=fn(r).toVar(),a=yn(t).toVar(),o=Sn(e).toVar(),u=fn(0).toVar(),l=fn(1).toVar();return Rp(a,()=>{u.addAssign(l.mul(Ov(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"}]}),$v=dn(([e,t,r,s])=>{const i=fn(s).toVar(),n=fn(r).toVar(),a=yn(t).toVar(),o=Sn(e).toVar(),u=Sn(0).toVar(),l=fn(1).toVar();return Rp(a,()=>{u.addAssign(l.mul(Vv(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"}]}),Wv=dn(([e,t,r,s])=>{const i=fn(s).toVar(),n=fn(r).toVar(),a=yn(t).toVar(),o=Sn(e).toVar();return Tn(zv(o,a,n,i),zv(o.add(Sn(yn(19),yn(193),yn(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"}]}),Hv=dn(([e,t,r,s])=>{const i=fn(s).toVar(),n=fn(r).toVar(),a=yn(t).toVar(),o=Sn(e).toVar(),u=Sn($v(o,a,n,i)).toVar(),l=fn(zv(o.add(Sn(yn(19),yn(193),yn(17))),a,n,i)).toVar();return wn(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"}]}),qv=Lb([dn(([e,t,r,s,i,n,a])=>{const o=yn(a).toVar(),u=fn(n).toVar(),l=yn(i).toVar(),d=yn(s).toVar(),c=yn(r).toVar(),h=yn(t).toVar(),p=Tn(e).toVar(),g=Sn(Gv(Tn(h.add(d),c.add(l)))).toVar(),m=Tn(g.x,g.y).toVar();m.subAssign(.5),m.mulAssign(u),m.addAssign(.5);const f=Tn(Tn(fn(h),fn(c)).add(m)).toVar(),y=Tn(f.sub(p)).toVar();return pn(o.equal(yn(2)),()=>Fo(y.x).add(Fo(y.y))),pn(o.equal(yn(3)),()=>jo(Fo(y.x),Fo(y.y))),Zo(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"}]}),dn(([e,t,r,s,i,n,a,o,u])=>{const l=yn(u).toVar(),d=fn(o).toVar(),c=yn(a).toVar(),h=yn(n).toVar(),p=yn(i).toVar(),g=yn(s).toVar(),m=yn(r).toVar(),f=yn(t).toVar(),y=Sn(e).toVar(),b=Sn(Gv(Sn(f.add(p),m.add(h),g.add(c)))).toVar();b.subAssign(.5),b.mulAssign(d),b.addAssign(.5);const x=Sn(Sn(fn(f),fn(m),fn(g)).add(b)).toVar(),T=Sn(x.sub(y)).toVar();return pn(l.equal(yn(2)),()=>Fo(T.x).add(Fo(T.y)).add(Fo(T.z))),pn(l.equal(yn(3)),()=>jo(Fo(T.x),Fo(T.y),Fo(T.z))),Zo(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"}]})]),jv=dn(([e,t,r])=>{const s=yn(r).toVar(),i=fn(t).toVar(),n=Tn(e).toVar(),a=yn().toVar(),o=yn().toVar(),u=Tn(bv(n.x,a),bv(n.y,o)).toVar(),l=fn(1e6).toVar();return Rp({start:-1,end:yn(1),name:"x",condition:"<="},({x:e})=>{Rp({start:-1,end:yn(1),name:"y",condition:"<="},({y:t})=>{const r=fn(qv(u,e,t,a,o,i,s)).toVar();l.assign(qo(l,r))})}),pn(s.equal(yn(0)),()=>{l.assign(To(l))}),l}).setLayout({name:"mx_worley_noise_float_0",type:"float",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),Xv=dn(([e,t,r])=>{const s=yn(r).toVar(),i=fn(t).toVar(),n=Tn(e).toVar(),a=yn().toVar(),o=yn().toVar(),u=Tn(bv(n.x,a),bv(n.y,o)).toVar(),l=Tn(1e6,1e6).toVar();return Rp({start:-1,end:yn(1),name:"x",condition:"<="},({x:e})=>{Rp({start:-1,end:yn(1),name:"y",condition:"<="},({y:t})=>{const r=fn(qv(u,e,t,a,o,i,s)).toVar();pn(r.lessThan(l.x),()=>{l.y.assign(l.x),l.x.assign(r)}).ElseIf(r.lessThan(l.y),()=>{l.y.assign(r)})})}),pn(s.equal(yn(0)),()=>{l.assign(To(l))}),l}).setLayout({name:"mx_worley_noise_vec2_0",type:"vec2",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),Kv=dn(([e,t,r])=>{const s=yn(r).toVar(),i=fn(t).toVar(),n=Tn(e).toVar(),a=yn().toVar(),o=yn().toVar(),u=Tn(bv(n.x,a),bv(n.y,o)).toVar(),l=Sn(1e6,1e6,1e6).toVar();return Rp({start:-1,end:yn(1),name:"x",condition:"<="},({x:e})=>{Rp({start:-1,end:yn(1),name:"y",condition:"<="},({y:t})=>{const r=fn(qv(u,e,t,a,o,i,s)).toVar();pn(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)})})}),pn(s.equal(yn(0)),()=>{l.assign(To(l))}),l}).setLayout({name:"mx_worley_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),Qv=Lb([jv,dn(([e,t,r])=>{const s=yn(r).toVar(),i=fn(t).toVar(),n=Sn(e).toVar(),a=yn().toVar(),o=yn().toVar(),u=yn().toVar(),l=Sn(bv(n.x,a),bv(n.y,o),bv(n.z,u)).toVar(),d=fn(1e6).toVar();return Rp({start:-1,end:yn(1),name:"x",condition:"<="},({x:e})=>{Rp({start:-1,end:yn(1),name:"y",condition:"<="},({y:t})=>{Rp({start:-1,end:yn(1),name:"z",condition:"<="},({z:r})=>{const n=fn(qv(l,e,t,r,a,o,u,i,s)).toVar();d.assign(qo(d,n))})})}),pn(s.equal(yn(0)),()=>{d.assign(To(d))}),d}).setLayout({name:"mx_worley_noise_float_1",type:"float",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),Yv=Lb([Xv,dn(([e,t,r])=>{const s=yn(r).toVar(),i=fn(t).toVar(),n=Sn(e).toVar(),a=yn().toVar(),o=yn().toVar(),u=yn().toVar(),l=Sn(bv(n.x,a),bv(n.y,o),bv(n.z,u)).toVar(),d=Tn(1e6,1e6).toVar();return Rp({start:-1,end:yn(1),name:"x",condition:"<="},({x:e})=>{Rp({start:-1,end:yn(1),name:"y",condition:"<="},({y:t})=>{Rp({start:-1,end:yn(1),name:"z",condition:"<="},({z:r})=>{const n=fn(qv(l,e,t,r,a,o,u,i,s)).toVar();pn(n.lessThan(d.x),()=>{d.y.assign(d.x),d.x.assign(n)}).ElseIf(n.lessThan(d.y),()=>{d.y.assign(n)})})})}),pn(s.equal(yn(0)),()=>{d.assign(To(d))}),d}).setLayout({name:"mx_worley_noise_vec2_1",type:"vec2",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),Zv=Lb([Kv,dn(([e,t,r])=>{const s=yn(r).toVar(),i=fn(t).toVar(),n=Sn(e).toVar(),a=yn().toVar(),o=yn().toVar(),u=yn().toVar(),l=Sn(bv(n.x,a),bv(n.y,o),bv(n.z,u)).toVar(),d=Sn(1e6,1e6,1e6).toVar();return Rp({start:-1,end:yn(1),name:"x",condition:"<="},({x:e})=>{Rp({start:-1,end:yn(1),name:"y",condition:"<="},({y:t})=>{Rp({start:-1,end:yn(1),name:"z",condition:"<="},({z:r})=>{const n=fn(qv(l,e,t,r,a,o,u,i,s)).toVar();pn(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)})})})}),pn(s.equal(yn(0)),()=>{d.assign(To(d))}),d}).setLayout({name:"mx_worley_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),Jv=dn(([e,t,r,s,i,n,a,o,u,l,d])=>{const c=yn(e).toVar(),h=Tn(t).toVar(),p=Tn(r).toVar(),g=Tn(s).toVar(),m=fn(i).toVar(),f=fn(n).toVar(),y=fn(a).toVar(),b=xn(o).toVar(),x=yn(u).toVar(),T=fn(l).toVar(),_=fn(d).toVar(),v=h.mul(p).add(g),N=fn(0).toVar();return pn(c.equal(yn(0)),()=>{N.assign(Vv(v))}),pn(c.equal(yn(1)),()=>{N.assign(Gv(v))}),pn(c.equal(yn(2)),()=>{N.assign(Zv(v,m,yn(0)))}),pn(c.equal(yn(3)),()=>{N.assign($v(Sn(v,0),x,T,_))}),N.assign(N.mul(y.sub(f)).add(f)),pn(b,()=>{N.assign(uu(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"}]}),eN=dn(([e,t,r,s,i,n,a,o,u,l,d])=>{const c=yn(e).toVar(),h=Sn(t).toVar(),p=Sn(r).toVar(),g=Sn(s).toVar(),m=fn(i).toVar(),f=fn(n).toVar(),y=fn(a).toVar(),b=xn(o).toVar(),x=yn(u).toVar(),T=fn(l).toVar(),_=fn(d).toVar(),v=h.mul(p).add(g),N=fn(0).toVar();return pn(c.equal(yn(0)),()=>{N.assign(Vv(v))}),pn(c.equal(yn(1)),()=>{N.assign(Gv(v))}),pn(c.equal(yn(2)),()=>{N.assign(Zv(v,m,yn(0)))}),pn(c.equal(yn(3)),()=>{N.assign($v(v,x,T,_))}),N.assign(N.mul(y.sub(f)).add(f)),pn(b,()=>{N.assign(uu(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"}]}),tN=dn(([e])=>{const t=e.y,r=e.z,s=Sn().toVar();return pn(t.lessThan(1e-4),()=>{s.assign(Sn(r,r,r))}).Else(()=>{let i=e.x;i=i.sub(vo(i)).mul(6).toVar();const n=yn(Go(i)),a=i.sub(fn(n)),o=r.mul(t.oneMinus()),u=r.mul(t.mul(a).oneMinus()),l=r.mul(t.mul(a.oneMinus()).oneMinus());pn(n.equal(yn(0)),()=>{s.assign(Sn(r,l,o))}).ElseIf(n.equal(yn(1)),()=>{s.assign(Sn(u,r,o))}).ElseIf(n.equal(yn(2)),()=>{s.assign(Sn(o,r,l))}).ElseIf(n.equal(yn(3)),()=>{s.assign(Sn(o,u,r))}).ElseIf(n.equal(yn(4)),()=>{s.assign(Sn(l,o,r))}).Else(()=>{s.assign(Sn(r,o,u))})}),s}).setLayout({name:"mx_hsvtorgb",type:"vec3",inputs:[{name:"hsv",type:"vec3"}]}),rN=dn(([e])=>{const t=Sn(e).toVar(),r=fn(t.x).toVar(),s=fn(t.y).toVar(),i=fn(t.z).toVar(),n=fn(qo(r,qo(s,i))).toVar(),a=fn(jo(r,jo(s,i))).toVar(),o=fn(a.sub(n)).toVar(),u=fn().toVar(),l=fn().toVar(),d=fn().toVar();return d.assign(a),pn(a.greaterThan(0),()=>{l.assign(o.div(a))}).Else(()=>{l.assign(0)}),pn(l.lessThanEqual(0),()=>{u.assign(0)}).Else(()=>{pn(r.greaterThanEqual(a),()=>{u.assign(s.sub(i).div(o))}).ElseIf(s.greaterThanEqual(a),()=>{u.assign(Fa(2,i.sub(r).div(o)))}).Else(()=>{u.assign(Fa(4,r.sub(s).div(o)))}),u.mulAssign(1/6),pn(u.lessThan(0),()=>{u.addAssign(1)})}),Sn(u,l,d)}).setLayout({name:"mx_rgbtohsv",type:"vec3",inputs:[{name:"c",type:"vec3"}]}),sN=dn(([e])=>{const t=Sn(e).toVar(),r=En(ka(t,Sn(.04045))).toVar(),s=Sn(t.div(12.92)).toVar(),i=Sn(eu(jo(t.add(Sn(.055)),Sn(0)).div(1.055),Sn(2.4))).toVar();return ou(s,i,r)}).setLayout({name:"mx_srgb_texture_to_lin_rec709",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),iN=(e,t)=>{e=fn(e),t=fn(t);const r=Tn(t.dFdx(),t.dFdy()).length().mul(.7071067811865476);return cu(e.sub(r),e.add(r),t)},nN=(e,t,r,s)=>ou(e,t,r[s].clamp()),aN=(e,t,r,s,i)=>ou(e,t,iN(r,s[i])),oN=dn(([e,t,r])=>{const s=So(e).toVar(),i=La(fn(.5).mul(t.sub(r)),Yd).div(s).toVar(),n=La(fn(-.5).mul(t.sub(r)),Yd).div(s).toVar(),a=Sn().toVar();a.x=s.x.greaterThan(fn(0)).select(i.x,n.x),a.y=s.y.greaterThan(fn(0)).select(i.y,n.y),a.z=s.z.greaterThan(fn(0)).select(i.z,n.z);const o=qo(a.x,a.y,a.z).toVar();return Yd.add(s.mul(o)).toVar().sub(r)}),uN=dn(([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 lN=Object.freeze({__proto__:null,BRDF_GGX:em,BRDF_Lambert:Vg,BasicPointShadowFilter:iv,BasicShadowFilter:P_,Break:Ap,Const:Bu,Continue:()=>ml("continue").toStack(),DFGLUT:sm,D_GGX:Yg,Discard:fl,EPSILON:no,F_Schlick:Og,Fn:dn,HALF_PI:co,INFINITY:ao,If:pn,Loop:Rp,NodeAccess:si,NodeShaderStage:ei,NodeType:ri,NodeUpdateType:ti,OnBeforeMaterialUpdate:e=>xx(bx.BEFORE_MATERIAL,e),OnBeforeObjectUpdate:e=>xx(bx.BEFORE_OBJECT,e),OnMaterialUpdate:e=>xx(bx.MATERIAL,e),OnObjectUpdate:e=>xx(bx.OBJECT,e),PCFShadowFilter:D_,PCFSoftShadowFilter:U_,PI:oo,PI2:uo,PointShadowFilter:nv,Return:()=>ml("return").toStack(),Schlick_to_F0:am,ShaderNode:Ji,Stack:gn,Switch:(...e)=>Ni.Switch(...e),TBNViewMatrix:ah,TWO_PI:lo,VSMShadowFilter:I_,V_GGX_SmithCorrelated:Kg,Var:Mu,VarIntent:Fu,abs:Fo,acesFilmicToneMapping:nT,acos:Mo,add:Fa,addMethodChaining:Ri,addNodeElement:function(e){d("TSL: AddNodeElement has been removed in favor of tree-shaking. Trying add",e)},agxToneMapping:lT,all:ho,alphaT:Zn,and:$a,anisotropy:Jn,anisotropyB:ta,anisotropyT:ea,any:po,append:e=>(d("TSL: append() has been renamed to Stack().",new Us),gn(e)),array:Ra,arrayBuffer:e=>new _i(e,"ArrayBuffer"),asin:Co,assign:Ea,atan:Bo,atomicAdd:(e,t)=>IT(DT.ATOMIC_ADD,e,t),atomicAnd:(e,t)=>IT(DT.ATOMIC_AND,e,t),atomicFunc:IT,atomicLoad:e=>IT(DT.ATOMIC_LOAD,e,null),atomicMax:(e,t)=>IT(DT.ATOMIC_MAX,e,t),atomicMin:(e,t)=>IT(DT.ATOMIC_MIN,e,t),atomicOr:(e,t)=>IT(DT.ATOMIC_OR,e,t),atomicStore:(e,t)=>IT(DT.ATOMIC_STORE,e,t),atomicSub:(e,t)=>IT(DT.ATOMIC_SUB,e,t),atomicXor:(e,t)=>IT(DT.ATOMIC_XOR,e,t),attenuationColor:ga,attenuationDistance:pa,attribute:Rl,attributeArray:(e,t="float")=>{let r,s;!0===t.isStruct?(r=t.layout.getLength(),s=Ws("float")):(r=Hs(t),s=Ws(t));const i=new _x(e,r,s);return op(i,t,e)},backgroundBlurriness:Ax,backgroundIntensity:Ex,backgroundRotation:wx,batch:Tp,bentNormalView:uh,billboarding:Vb,bitAnd:ja,bitNot:Xa,bitOr:Ka,bitXor:Qa,bitangentGeometry:rh,bitangentLocal:sh,bitangentView:ih,bitangentWorld:nh,bitcast:cb,blendBurn:lg,blendColor:pg,blendDodge:dg,blendOverlay:hg,blendScreen:cg,blur:of,bool:xn,buffer:Ol,bufferAttribute:tl,builtin:$l,builtinAOContext:Au,builtinShadowContext:Ru,bumpMap:fh,bvec2:Nn,bvec3:En,bvec4:Bn,bypass:cl,cache:ll,call:Ca,cameraFar:bd,cameraIndex:fd,cameraNear:yd,cameraNormalMatrix:Nd,cameraPosition:Sd,cameraProjectionMatrix:xd,cameraProjectionMatrixInverse:Td,cameraViewMatrix:_d,cameraViewport:Rd,cameraWorldMatrix:vd,cbrt:nu,cdl:Hx,ceil:No,checker:pv,cineonToneMapping:sT,clamp:uu,clearcoat:Hn,clearcoatNormalView:hc,clearcoatRoughness:qn,clipSpace:jd,code:hT,color:mn,colorSpaceToWorking:$u,colorToDirection:e=>en(e).mul(2).sub(1),compute:al,computeKernel:nl,computeSkinning:(e,t=null)=>{const r=new vp(e);return r.positionNode=op(new j(e.geometry.getAttribute("position").array,3),"vec3").setPBO(!0).toReadOnly().element(dp).toVar(),r.skinIndexNode=op(new j(new Uint32Array(e.geometry.getAttribute("skinIndex").array),4),"uvec4").setPBO(!0).toReadOnly().element(dp).toVar(),r.skinWeightNode=op(new j(e.geometry.getAttribute("skinWeight").array,4),"vec4").setPBO(!0).toReadOnly().element(dp).toVar(),r.bindMatrixNode=Na(e.bindMatrix,"mat4"),r.bindMatrixInverseNode=Na(e.bindMatrixInverse,"mat4"),r.boneMatricesNode=Ol(e.skeleton.boneMatrices,"mat4",e.skeleton.bones.length),r.toPositionNode=t,en(r)},context:vu,convert:Un,convertColorSpace:(e,t,r)=>new Gu(en(e),t,r),convertToTexture:(e,...t)=>e.isSampleNode||e.isTextureNode?e:e.isPassNode?e.getTextureNode():cx(e,...t),cos:Eo,countLeadingZeros:fb,countOneBits:yb,countTrailingZeros:mb,cross:Jo,cubeTexture:Mc,cubeTextureBase:Cc,dFdx:Io,dFdy:Oo,dashSize:oa,debug:Tl,decrement:ro,decrementBefore:eo,defaultBuildStages:ni,defaultShaderStages:ii,defined:Yi,degrees:mo,deltaTime:Db,densityFogFactor:yT,depth:eg,depthPass:(e,t,r)=>new Jx(Jx.DEPTH,e,t,r),determinant:Wo,difference:Yo,diffuseColor:kn,diffuseContribution:Gn,directPointLight:cv,directionToColor:lh,directionToFaceDirection:ic,dispersion:ma,disposeShadowMaterial:V_,distance:Qo,div:Da,dot:Zo,drawIndex:gp,dynamicBufferAttribute:(e,t=null,r=0,s=0)=>el(e,t,r,s,x),element:Dn,emissive:zn,equal:Ia,equirectUV:Rg,exp:fo,exp2:yo,exponentialHeightFogFactor:bT,expression:ml,faceDirection:sc,faceForward:hu,faceforward:yu,float:fn,floatBitsToInt:e=>new db(e,"int","float"),floatBitsToUint:hb,floor:vo,fog:xT,fract:Ro,frameGroup:xa,frameId:Ub,frontFacing:rc,fwidth:zo,gain:(e,t)=>e.lessThan(.5)?xb(e.mul(2),t).div(2):La(1,xb(Pa(La(1,e),2),t).div(2)),gapSize:ua,getConstNodeType:Zi,getCurrentStack:hn,getDirection:rf,getDistanceAttenuation:dv,getGeometryRoughness:jg,getNormalFromDepth:gx,getParallaxCorrectNormal:oN,getRoughness:Xg,getScreenPosition:px,getShIrradianceAt:uN,getShadowMaterial:O_,getShadowRenderObjectFunction:z_,getTextureIndex:ob,getViewPosition:hx,ggxConvolution:cf,globalId:wT,glsl:(e,t)=>hT(e,t,"glsl"),glslFn:(e,t)=>gT(e,t,"glsl"),grayscale:kx,greaterThan:ka,greaterThanEqual:za,hash:bb,highpModelNormalViewMatrix:qd,highpModelViewMatrix:Hd,hue:$x,increment:to,incrementBefore:Ja,inspector:Nl,instance:fp,instanceIndex:dp,instancedArray:(e,t="float")=>{let r,s;!0===t.isStruct?(r=t.layout.getLength(),s=Ws("float")):(r=Hs(t),s=Ws(t));const i=new Tx(e,r,s);return op(i,t,i.count)},instancedBufferAttribute:rl,instancedDynamicBufferAttribute:sl,instancedMesh:bp,int:yn,intBitsToFloat:e=>new db(e,"float","int"),interleavedGradientNoise:mx,inverse:Ho,inverseSqrt:_o,inversesqrt:bu,invocationLocalIndex:pp,invocationSubgroupIndex:hp,ior:da,iridescence:Kn,iridescenceIOR:Qn,iridescenceThickness:Yn,isolate:ul,ivec2:_n,ivec3:Rn,ivec4:Cn,js:(e,t)=>hT(e,t,"js"),label:Eu,length:Po,lengthSq:au,lessThan:Va,lessThanEqual:Ga,lightPosition:g_,lightProjectionUV:p_,lightShadowMatrix:h_,lightTargetDirection:y_,lightTargetPosition:m_,lightViewPosition:f_,lightingContext:Dp,lights:(e=[])=>(new __).setLights(e),linearDepth:tg,linearToneMapping:tT,localId:CT,log:bo,log2:xo,logarithmicDepthToViewZ:(e,t,r)=>{const s=e.mul(bo(r.div(t)));return fn(Math.E).pow(s).mul(t).negate()},luminance:Wx,mat2:Fn,mat3:Ln,mat4:Pn,matcapUV:Xf,materialAO:tp,materialAlphaTest:xh,materialAnisotropy:Oh,materialAnisotropyVector:rp,materialAttenuationColor:qh,materialAttenuationDistance:Hh,materialClearcoat:Fh,materialClearcoatNormal:Ph,materialClearcoatRoughness:Lh,materialColor:Th,materialDispersion:Jh,materialEmissive:vh,materialEnvIntensity:_c,materialEnvRotation:vc,materialIOR:Wh,materialIridescence:Vh,materialIridescenceIOR:kh,materialIridescenceThickness:Gh,materialLightMap:ep,materialLineDashOffset:Yh,materialLineDashSize:Xh,materialLineGapSize:Kh,materialLineScale:jh,materialLineWidth:Qh,materialMetalness:Mh,materialNormal:Bh,materialOpacity:Nh,materialPointSize:Zh,materialReference:Uc,materialReflectivity:wh,materialRefractionRatio:Tc,materialRotation:Dh,materialRoughness:Ch,materialSheen:Uh,materialSheenRoughness:Ih,materialShininess:_h,materialSpecular:Sh,materialSpecularColor:Ah,materialSpecularIntensity:Rh,materialSpecularStrength:Eh,materialThickness:$h,materialTransmission:zh,max:jo,maxMipLevel:Ml,mediumpModelViewMatrix:Wd,metalness:Wn,min:qo,mix:ou,mixElement:gu,mod:Ua,modInt:so,modelDirection:Dd,modelNormalMatrix:Gd,modelPosition:Id,modelRadius:kd,modelScale:Od,modelViewMatrix:$d,modelViewPosition:Vd,modelViewProjection:sp,modelWorldMatrix:Ud,modelWorldMatrixInverse:zd,morphReference:Bp,mrt:lb,mul:Pa,mx_aastep:iN,mx_add:(e,t=fn(0))=>Fa(e,t),mx_atan2:(e=fn(0),t=fn(1))=>Bo(e,t),mx_cell_noise_float:(e=Al())=>kv(e.convert("vec2|vec3")),mx_contrast:(e,t=1,r=.5)=>fn(e).sub(r).mul(t).add(r),mx_divide:(e,t=fn(1))=>Da(e,t),mx_fractal_noise_float:(e=Al(),t=3,r=2,s=.5,i=1)=>zv(e,yn(t),r,s).mul(i),mx_fractal_noise_vec2:(e=Al(),t=3,r=2,s=.5,i=1)=>Wv(e,yn(t),r,s).mul(i),mx_fractal_noise_vec3:(e=Al(),t=3,r=2,s=.5,i=1)=>$v(e,yn(t),r,s).mul(i),mx_fractal_noise_vec4:(e=Al(),t=3,r=2,s=.5,i=1)=>Hv(e,yn(t),r,s).mul(i),mx_frame:()=>Ub,mx_heighttonormal:(e,t)=>(e=Sn(e),t=fn(t),fh(e,t)),mx_hsvtorgb:tN,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=fn(1))=>La(t,e),mx_modulo:(e,t=fn(1))=>Ua(e,t),mx_multiply:(e,t=fn(1))=>Pa(e,t),mx_noise_float:(e=Al(),t=1,r=0)=>Ov(e.convert("vec2|vec3")).mul(t).add(r),mx_noise_vec3:(e=Al(),t=1,r=0)=>Vv(e.convert("vec2|vec3")).mul(t).add(r),mx_noise_vec4:(e=Al(),t=1,r=0)=>{e=e.convert("vec2|vec3");return wn(Vv(e),Ov(e.add(Tn(19,73)))).mul(t).add(r)},mx_place2d:(e,t=Tn(.5,.5),r=Tn(1,1),s=fn(0),i=Tn(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=Tn(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=fn(1))=>eu(e,t),mx_ramp4:(e,t,r,s,i=Al())=>{const n=i.x.clamp(),a=i.y.clamp(),o=ou(e,t,n),u=ou(r,s,n);return ou(o,u,a)},mx_ramplr:(e,t,r=Al())=>nN(e,t,r,"x"),mx_ramptb:(e,t,r=Al())=>nN(e,t,r,"y"),mx_rgbtohsv:rN,mx_rotate2d:(e,t)=>{e=Tn(e);const r=(t=fn(t)).mul(Math.PI/180);return Zf(e,r)},mx_rotate3d:(e,t,r)=>{e=Sn(e),t=fn(t),r=Sn(r);const s=t.mul(Math.PI/180),i=r.normalize(),n=s.cos(),a=s.sin(),o=fn(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=fn(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=Al())=>aN(e,t,r,s,"x"),mx_splittb:(e,t,r,s=Al())=>aN(e,t,r,s,"y"),mx_srgb_texture_to_lin_rec709:sN,mx_subtract:(e,t=fn(0))=>La(e,t),mx_timer:()=>Pb,mx_transform_uv:(e=1,t=0,r=Al())=>r.mul(e).add(t),mx_unifiednoise2d:(e,t=Al(),r=Tn(1,1),s=Tn(0,0),i=1,n=0,a=1,o=!1,u=1,l=2,d=.5)=>Jv(e,t.convert("vec2|vec3"),r,s,i,n,a,o,u,l,d),mx_unifiednoise3d:(e,t=Al(),r=Tn(1,1),s=Tn(0,0),i=1,n=0,a=1,o=!1,u=1,l=2,d=.5)=>eN(e,t.convert("vec2|vec3"),r,s,i,n,a,o,u,l,d),mx_worley_noise_float:(e=Al(),t=1)=>Qv(e.convert("vec2|vec3"),t,yn(1)),mx_worley_noise_vec2:(e=Al(),t=1)=>Yv(e.convert("vec2|vec3"),t,yn(1)),mx_worley_noise_vec3:(e=Al(),t=1)=>Zv(e.convert("vec2|vec3"),t,yn(1)),negate:Do,neutralToneMapping:dT,nodeArray:sn,nodeImmutable:an,nodeObject:en,nodeObjectIntent:tn,nodeObjects:rn,nodeProxy:nn,nodeProxyIntent:on,normalFlat:oc,normalGeometry:nc,normalLocal:ac,normalMap:hh,normalView:dc,normalViewGeometry:uc,normalWorld:cc,normalWorldGeometry:lc,normalize:So,not:Ha,notEqual:Oa,numWorkgroups:AT,objectDirection:wd,objectGroup:_a,objectPosition:Md,objectRadius:Ld,objectScale:Bd,objectViewPosition:Fd,objectWorldMatrix:Cd,oneMinus:Uo,or:Wa,orthographicDepthToViewZ:Xp,oscSawtooth:(e=Pb)=>e.fract(),oscSine:(e=Pb)=>e.add(.75).mul(2*Math.PI).sin().mul(.5).add(.5),oscSquare:(e=Pb)=>e.fract().round(),oscTriangle:(e=Pb)=>e.add(.5).fract().mul(2).sub(1).abs(),output:aa,outputStruct:sb,overloadingFn:Lb,packHalf2x16:Nb,packSnorm2x16:_b,packUnorm2x16:vb,parabola:xb,parallaxDirection:oh,parallaxUV:(e,t)=>e.sub(oh.mul(t)),parameter:(e,t)=>new Yy(e,t),pass:(e,t,r)=>new Jx(Jx.COLOR,e,t,r),passTexture:(e,t)=>new Yx(e,t),pcurve:(e,t,r)=>eu(Da(eu(e,t),Fa(eu(e,t),eu(La(1,e),r))),1/t),perspectiveDepthToViewZ:Yp,pmremTexture:Lf,pointShadow:uv,pointUV:Nx,pointWidth:la,positionGeometry:Xd,positionLocal:Kd,positionPrevious:Qd,positionView:Jd,positionViewDirection:ec,positionWorld:Yd,positionWorldDirection:Zd,posterize:qx,pow:eu,pow2:tu,pow3:ru,pow4:su,premultiplyAlpha:gg,property:On,quadBroadcast:l_,quadSwapDiagonal:s_,quadSwapX:t_,quadSwapY:r_,radians:go,rand:pu,range:NT,rangeFogFactor:fT,reciprocal:ko,reference:Lc,referenceBuffer:Pc,reflect:Ko,reflectVector:Rc,reflectView:Nc,reflector:e=>new sx(e),refract:du,refractVector:Ac,refractView:Sc,reinhardToneMapping:rT,remap:hl,remapClamp:pl,renderGroup:Ta,renderOutput:bl,rendererReference:ju,replaceDefaultUV:function(e,t=null){return vu(t,{getUV:"function"==typeof e?e:()=>e})},rotate:Zf,rotateUV:Ib,roughness:$n,round:Vo,rtt:cx,sRGBTransferEOTF:Ou,sRGBTransferOETF:Vu,sample:(e,t=null)=>new yx(e,en(t)),sampler:e=>(!0===e.isNode?e:Dl(e)).convert("sampler"),samplerComparison:e=>(!0===e.isNode?e:Dl(e)).convert("samplerComparison"),saturate:lu,saturation:Gx,screenCoordinate:Ql,screenDPR:jl,screenSize:Kl,screenUV:Xl,select:Tu,setCurrentStack:cn,setName:Su,shaderStages:ai,shadow:K_,shadowPositionWorld:N_,shapeCircle:gv,sharedUniformGroup:ba,sheen:jn,sheenRoughness:Xn,shiftLeft:Ya,shiftRight:Za,shininess:na,sign:Lo,sin:Ao,sinc:(e,t)=>Ao(oo.mul(t.mul(e).sub(1))).div(oo.mul(t.mul(e).sub(1))),skinning:Np,smoothstep:cu,smoothstepElement:mu,specularColor:ra,specularColorBlended:sa,specularF90:ia,spherizeUV:Ob,split:(e,t)=>new fi(en(e),t),spritesheetUV:Gb,sqrt:To,stack:Jy,step:Xo,stepElement:fu,storage:op,storageBarrier:()=>FT("storage").toStack(),storageTexture:Mx,string:(e="")=>new _i(e,"string"),struct:(e,t=null)=>{const r=new eb(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;eLx(e,t).level(r),texture3DLoad:(...e)=>Lx(...e).setSampler(!1),textureBarrier:()=>FT("texture").toStack(),textureBicubic:Am,textureBicubicLevel:Rm,textureCubeUV:sf,textureLevel:(e,t,r)=>Dl(e,t).level(r),textureLoad:Ul,textureSize:wl,textureStore:(e,t,r)=>{let s;return!0===e.isStorageTextureNode?(s=e.clone(),s.uvNode=t,s.storeNode=r):s=Mx(e,t,r),null!==r&&s.toStack(),s},thickness:ha,time:Pb,toneMapping:Ku,toneMappingExposure:Qu,toonOutlinePass:(t,r,s=new e(0,0,0),i=.003,n=1)=>new eT(t,r,en(s),en(i),en(n)),transformDirection:iu,transformNormal:pc,transformNormalToView:gc,transformedClearcoatNormalView:yc,transformedNormalView:mc,transformedNormalWorld:fc,transmission:ca,transpose:$o,triNoise3D:Mb,triplanarTexture:(...e)=>zb(...e),triplanarTextures:zb,trunc:Go,uint:bn,uintBitsToFloat:e=>new db(e,"float","uint"),uniform:Na,uniformArray:Gl,uniformCubeTexture:(e=Ec)=>Cc(e),uniformFlow:Nu,uniformGroup:ya,uniformTexture:(e=Fl)=>Dl(e),unpackHalf2x16:Eb,unpackNormal:dh,unpackSnorm2x16:Rb,unpackUnorm2x16:Ab,unpremultiplyAlpha:mg,userData:(e,t,r)=>new Px(e,t,r),uv:Al,uvec2:vn,uvec3:An,uvec4:Mn,varying:Uu,varyingProperty:Vn,vec2:Tn,vec3:Sn,vec4:wn,vectorComponents:oi,velocity:Vx,vertexColor:ug,vertexIndex:lp,vertexStage:Iu,vibrance:zx,viewZToLogarithmicDepth:Zp,viewZToOrthographicDepth:jp,viewZToPerspectiveDepth:Kp,viewZToReversedOrthographicDepth:(e,t,r)=>e.add(r).div(r.sub(t)),viewZToReversedPerspectiveDepth:Qp,viewport:Yl,viewportCoordinate:Jl,viewportDepthTexture:Hp,viewportLinearDepth:rg,viewportMipTexture:kp,viewportOpaqueMipTexture:zp,viewportResolution:td,viewportSafeUV:kb,viewportSharedTexture:Kx,viewportSize:Zl,viewportTexture:Vp,viewportUV:ed,vogelDiskSample:fx,wgsl:(e,t)=>hT(e,t,"wgsl"),wgslFn:(e,t)=>gT(e,t,"wgsl"),workgroupArray:(e,t)=>new PT("Workgroup",e,t),workgroupBarrier:()=>FT("workgroup").toStack(),workgroupId:ET,workingToColorSpace:zu,xor:qa});const dN=new Qy;class cN extends xy{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(dN),dN.a=s._clearColor.a;else if(!0===i.isColor)i.getRGB(dN),dN.a=1,n=!0;else if(!0===i.isNode){const u=this.get(e),l=i;dN.copy(s._clearColor);let d=u.backgroundMesh;if(void 0===d){const h=wn(l).mul(Ex).context({getUV:()=>wx.mul(lc),getTextureLevel:()=>Ax}),p=xd.element(3).element(3).equal(1),g=Da(1,xd.element(1).element(1)).mul(3),m=p.select(Kd.mul(g),Kd),f=$d.mul(wn(m,0));let y=xd.mul(wn(f.xyz,1));y=y.setZ(y.w);const b=new fg;function x(){i.removeEventListener("dispose",x),d.material.dispose(),d.geometry.dispose()}b.name="Background.material",b.side=L,b.depthTest=!1,b.depthWrite=!1,b.allowOverride=!1,b.fog=!1,b.lights=!1,b.vertexNode=y,b.colorNode=h,u.backgroundMeshNode=h,u.backgroundMesh=d=new ue(new mt(1,32,32),b),d.frustumCulled=!1,d.name="Background.mesh",i.addEventListener("dispose",x)}const c=l.getCacheKey();u.backgroundCacheKey!==c&&(u.backgroundMeshNode.node=wn(l).mul(Ex),u.backgroundMeshNode.needsUpdate=!0,d.material.needsUpdate=!0,u.backgroundCacheKey=c),t.unshift(d,d.geometry,d.material,0,0,null,null)}else o("Renderer: Unsupported background configuration.",i);const a=s.xr.getEnvironmentBlendMode();if("additive"===a?dN.set(0,0,0,1):"alpha-blend"===a&&dN.set(0,0,0,0),!0===s.autoClear||!0===n){const T=r.clearColorValue;T.r=dN.r,T.g=dN.g,T.b=dN.b,T.a=dN.a,!0!==s.backend.isWebGLBackend&&!0!==s.alpha||(T.r*=T.a,T.g*=T.a,T.b*=T.a),r.depthClearValue=s.getClearDepth(),r.stencilClearValue=s.getClearStencil(),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 hN=0;class pN{constructor(e="",t=[]){this.name=e,this.bindings=t,this.id=hN++}}class gN{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 pN(t.name,[]);e.push(r);for(const e of t.bindings)r.bindings.push(e.clone())}else e.push(t)}return e}}class mN{constructor(e,t,r=null){this.isNodeAttribute=!0,this.name=e,this.type=t,this.node=r}}class fN{constructor(e,t,r){this.isNodeUniform=!0,this.name=e,this.type=t,this.node=r}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 yN{constructor(e,t,r=!1,s=null){this.isNodeVar=!0,this.name=e,this.type=t,this.readOnly=r,this.count=s}}class bN extends yN{constructor(e,t,r=null,s=null){super(e,t),this.needsInterpolation=!1,this.isNodeVarying=!0,this.interpolationType=r,this.interpolationSampling=s}}class xN{constructor(e,t,r=""){this.name=e,this.type=t,this.code=r,Object.defineProperty(this,"isNodeCode",{value:!0})}}let TN=0;class _N{constructor(e=null){this.id=TN++,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 vN{constructor(e,t){this.name=e,this.members=t,this.output=!1}}class NN{constructor(e,t){this.name=e,this.value=t,this.boundary=0,this.itemSize=0,this.offset=0,this.index=-1}setValue(e){this.value=e}getValue(){return this.value}}class SN extends NN{constructor(e,t=0){super(e,t),this.isNumberUniform=!0,this.boundary=4,this.itemSize=1}}class RN extends NN{constructor(e,r=new t){super(e,r),this.isVector2Uniform=!0,this.boundary=8,this.itemSize=2}}class AN extends NN{constructor(e,t=new r){super(e,t),this.isVector3Uniform=!0,this.boundary=16,this.itemSize=3}}class EN extends NN{constructor(e,t=new s){super(e,t),this.isVector4Uniform=!0,this.boundary=16,this.itemSize=4}}class wN extends NN{constructor(t,r=new e){super(t,r),this.isColorUniform=!0,this.boundary=16,this.itemSize=3}}class CN extends NN{constructor(e,t=new i){super(e,t),this.isMatrix2Uniform=!0,this.boundary=8,this.itemSize=4}}class MN extends NN{constructor(e,t=new n){super(e,t),this.isMatrix3Uniform=!0,this.boundary=48,this.itemSize=12}}class BN extends NN{constructor(e,t=new a){super(e,t),this.isMatrix4Uniform=!0,this.boundary=64,this.itemSize=16}}class FN extends SN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class LN extends RN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class PN extends AN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class DN extends EN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class UN extends wN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class IN extends CN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class ON extends MN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class VN extends BN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}let kN=0;const GN=new WeakMap,zN=new WeakMap,$N=new Map([[Int8Array,"int"],[Int16Array,"int"],[Int32Array,"int"],[Uint8Array,"uint"],[Uint16Array,"uint"],[Uint32Array,"uint"],[Float32Array,"float"]]),WN=e=>/e/g.test(e)?String(e).replace(/\+/g,""):(e=Number(e))+(e%1?"":".0");class HN{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.types={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=Jy(),this.stacks=[],this.tab="\t",this.currentFunctionNode=null,this.context={material:this.material},this.cache=new _N,this.globalCache=this.cache,this.flowsData=new WeakMap,this.shaderStage=null,this.buildStage=null,this.subBuildLayers=[],this.activeStacks=[],this.subBuildFn=null,this.fnCall=null,Object.defineProperty(this,"id",{value:kN++})}isFlatShading(){return!0===this.material.flatShading||!1===this.geometry.hasAttribute("normal")}isOpaque(){const e=this.material;return!1===e.transparent&&e.blending===et&&!1===e.alphaToCoverage}createRenderTarget(e,t,r){return new ae(e,t,r)}createCubeRenderTarget(e,t){return new Ag(e,t)}includes(e){return this.nodes.includes(e)}getOutputStructName(){}_getBindGroup(e,t){const r=t[0].groupNode;let s,i=r.shared;if(i)for(let e=1;ee.nodeUniform.node.id-t.nodeUniform.node.id);for(const t of e.uniforms)r+=t.nodeUniform.node.id}else r+=e.nodeUniform.id;const i=this.renderer._currentRenderContext||this.renderer;let n=GN.get(i);void 0===n&&(n=new Map,GN.set(i,n));const a=Os(r);s=n.get(a),void 0===s&&(s=new pN(e,t),n.set(a,s))}else s=new pN(e,t);return s}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 ai)for(const s in r[e]){const i=r[e][s],n=t[s]||(t[s]=[]);for(const e of i)!1===n.includes(e)&&n.push(e)}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")}( ${WN(n.r)}, ${WN(n.g)}, ${WN(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 mN(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===R)return"int";if(t===S)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=$s(e);const s="float"===t?"":t[0];return!0===/mat2/.test(t)&&(r=r.replace("vec","mat")),s+r}getTypeFromArray(e){return $N.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 bt||!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")}setActiveStack(e){this.activeStacks.push(e)}removeActiveStack(e){if(this.activeStacks[this.activeStacks.length-1]!==e)throw new Error("NodeBuilder: Invalid active stack removal.");this.activeStacks.pop()}getActiveStack(){return this.activeStacks[this.activeStacks.length-1]}getBaseStack(){return this.activeStacks[0]}addStack(){this.stack=Jy(this.stack);const e=hn();return this.stacks.push(e),cn(this.stack),this.stack}removeStack(){const e=this.stack;for(const t of e.nodes){this.getDataFromNode(t).stack=e}return this.stack=e.parent,cn(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,"vertex");let s=r.bufferAttribute;if(void 0===s){const i=this.uniforms.index++;s=new mN("nodeAttribute"+i,t,e),this.bufferAttributes.push(s),r.bufferAttribute=s}return s}getStructTypeNode(e,t=this.shaderStage){return this.types[t][e]||null}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 a=this.structs.index++;null===r&&(r="StructType"+a),n=new vN(r,t),this.structs[s].push(n),this.types[s][r]=e,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 fN(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 yN(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 bN(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,d(`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 xN("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 pT,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 Yy(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 _N,this.stack=Jy();for(const r of ni)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(){d("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(){d("Abstract function.")}getVaryings(){d("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(){d("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(){d("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&&(o(`NodeMaterial: Material "${t.type}" is not compatible.`),e=new fg),e.build(this)}else this.addFlow("compute",e);for(const e of ni){this.setBuildStage(e),this.context.position&&this.context.position.isNode&&this.flowNodeFromShaderStage("vertex",this.context.position);for(const t of ai){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}async buildAsync(){const{object:e,material:t,renderer:r}=this;if(null!==t){let e=r.library.fromMaterial(t);null===e&&(o(`NodeMaterial: Material "${t.type}" is not compatible.`),e=new fg),e.build(this)}else this.addFlow("compute",e);for(const e of ni){this.setBuildStage(e),this.context.position&&this.context.position.isNode&&this.flowNodeFromShaderStage("vertex",this.context.position);for(const t of ai){this.setShaderStage(t);const r=this.flowNodes[t];for(const t of r)"generate"===e?this.flowNode(t):t.build(this);await xt()}}return this.setBuildStage(null),this.setShaderStage(null),this.buildCode(),this.buildUpdateNodes(),this}getSharedDataFromNode(e){let t=zN.get(e);return void 0===t&&(t={}),t}getNodeUniform(e,t){const r=this.getSharedDataFromNode(e);let s=r.cache;if(void 0===s){if("float"===t||"int"===t||"uint"===t)s=new FN(e);else if("vec2"===t||"ivec2"===t||"uvec2"===t)s=new LN(e);else if("vec3"===t||"ivec3"===t||"uvec3"===t)s=new PN(e);else if("vec4"===t||"ivec4"===t||"uvec4"===t)s=new DN(e);else if("color"===t)s=new UN(e);else if("mat2"===t)s=new IN(e);else if("mat3"===t)s=new ON(e);else{if("mat4"!==t)throw new Error(`Uniform "${t}" not implemented.`);s=new VN(e)}r.cache=s}return s}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${Tt} - Node System\n`}needsPreviousData(){const e=this.renderer.getMRT();return e&&e.has("velocity")||!0===Qs(this.object).useVelocity}}class qN{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={renderId:0,frameId:0},e.set(t,r)),r}updateBeforeNode(e){const t=e.getUpdateBeforeType(),r=e.updateReference(this);if(t===ti.FRAME){const t=this._getMaps(this.updateBeforeMap,r);if(t.frameId!==this.frameId){const r=t.frameId;t.frameId=this.frameId,!1===e.updateBefore(this)&&(t.frameId=r)}}else if(t===ti.RENDER){const t=this._getMaps(this.updateBeforeMap,r);if(t.renderId!==this.renderId){const r=t.renderId;t.renderId=this.renderId,!1===e.updateBefore(this)&&(t.renderId=r)}}else t===ti.OBJECT&&e.updateBefore(this)}updateAfterNode(e){const t=e.getUpdateAfterType(),r=e.updateReference(this);if(t===ti.FRAME){const t=this._getMaps(this.updateAfterMap,r);t.frameId!==this.frameId&&!1!==e.updateAfter(this)&&(t.frameId=this.frameId)}else if(t===ti.RENDER){const t=this._getMaps(this.updateAfterMap,r);t.renderId!==this.renderId&&!1!==e.updateAfter(this)&&(t.renderId=this.renderId)}else t===ti.OBJECT&&e.updateAfter(this)}updateNode(e){const t=e.getUpdateType(),r=e.updateReference(this);if(t===ti.FRAME){const t=this._getMaps(this.updateMap,r);t.frameId!==this.frameId&&!1!==e.update(this)&&(t.frameId=this.frameId)}else if(t===ti.RENDER){const t=this._getMaps(this.updateMap,r);t.renderId!==this.renderId&&!1!==e.update(this)&&(t.renderId=this.renderId)}else t===ti.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 jN{constructor(e,t,r=null,s="",i=!1){this.type=e,this.name=t,this.count=r,this.qualifier=s,this.isConst=i}}jN.isNodeFunctionInput=!0;class XN extends lv{static get type(){return"AmbientLightNode"}constructor(e=null){super(e)}setup({context:e}){e.irradiance.addAssign(this.colorNode)}}class KN extends lv{static get type(){return"DirectionalLightNode"}constructor(e=null){super(e)}setupDirect(){const e=this.colorNode;return{lightDirection:y_(this.light),lightColor:e}}}class QN extends lv{static get type(){return"HemisphereLightNode"}constructor(t=null){super(t),this.lightPositionNode=g_(t),this.lightDirectionNode=this.lightPositionNode.normalize(),this.groundColorNode=Na(new e).setGroup(Ta)}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=cc.dot(s).mul(.5).add(.5),n=ou(r,t,i);e.context.irradiance.addAssign(n)}}class YN extends lv{static get type(){return"SpotLightNode"}constructor(e=null){super(e),this.coneCosNode=Na(0).setGroup(Ta),this.penumbraCosNode=Na(0).setGroup(Ta),this.cutoffDistanceNode=Na(0).setGroup(Ta),this.decayExponentNode=Na(0).setGroup(Ta),this.colorNode=Na(this.color).setGroup(Ta)}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 cu(r,s,t)}getLightCoord(e){const t=e.getNodeProperties(this);let r=t.projectionUV;return void 0===r&&(r=p_(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(y_(i)),u=this.getSpotAttenuation(e,o),l=n.length(),d=dv({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=Dl(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 ZN extends YN{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=Dl(r,Tn(e,0),0).r}else s=super.getSpotAttenuation(t);return s}}class JN extends lv{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=Gl(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=uN(cc,this.lightProbe);e.context.irradiance.addAssign(t)}}const eS=dn(([e,t])=>{const r=e.abs().sub(t);return Po(jo(r,0)).add(qo(jo(r.x,r.y),0))});class tS extends YN{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=fn(0),r=this.penumbraCosNode,s=h_(this.light).mul(e.context.positionWorld||Yd);return pn(s.w.greaterThan(0),()=>{const e=s.xyz.div(s.w),i=eS(e.xy.sub(Tn(.5)),Tn(.5)),n=Da(-1,La(1,Mo(r)).sub(1));t.assign(lu(i.mul(-2).mul(n)))}),t}}const rS=new a,sS=new a;let iS=null;class nS extends lv{static get type(){return"RectAreaLightNode"}constructor(e=null){super(e),this.halfHeight=Na(new r).setGroup(Ta),this.halfWidth=Na(new r).setGroup(Ta),this.updateType=ti.RENDER}update(e){super.update(e);const{light:t}=this,r=e.camera.matrixWorldInverse;sS.identity(),rS.copy(t.matrixWorld),rS.premultiply(r),sS.extractRotation(rS),this.halfWidth.value.set(.5*t.width,0,0),this.halfHeight.value.set(0,.5*t.height,0),this.halfWidth.value.applyMatrix4(sS),this.halfHeight.value.applyMatrix4(sS)}setupDirectRectArea(e){let t,r;e.isAvailable("float32Filterable")?(t=Dl(iS.LTC_FLOAT_1),r=Dl(iS.LTC_FLOAT_2)):(t=Dl(iS.LTC_HALF_1),r=Dl(iS.LTC_HALF_2));const{colorNode:s,light:i}=this;return{lightColor:s,lightPosition:f_(i),halfWidth:this.halfWidth,halfHeight:this.halfHeight,ltc_1:t,ltc_2:r}}static setLTC(e){iS=e}}class aS{parseFunction(){d("Abstract function.")}}class oS{constructor(e,t,r="",s=""){this.type=e,this.inputs=t,this.name=r,this.precision=s}getCode(){d("Abstract function.")}}oS.isNodeFunction=!0;const uS=/^\s*(highp|mediump|lowp)?\s*([a-z_0-9]+)\s*([a-z_0-9]+)?\s*\(([\s\S]*?)\)/i,lS=/[a-z_0-9]+/gi,dS="#pragma main";class cS extends oS{constructor(e){const{type:t,inputs:r,name:s,precision:i,inputsCode:n,blockCode:a,headerCode:o}=(e=>{const t=(e=e.trim()).indexOf(dS),r=-1!==t?e.slice(t+12):e,s=r.match(uS);if(null!==s&&5===s.length){const i=s[4],n=[];let a=null;for(;null!==(a=lS.exec(i));)n.push(a);const o=[];let u=0;for(;u{let r=this._createNodeBuilder(e,e.material);try{t?await r.buildAsync():r.build()}catch(s){r=this._createNodeBuilder(e,new fg),t?await r.buildAsync():r.build(),o("TSL: "+s)}return r})().then(e=>(s=this._createNodeBuilderState(e),i.set(n,s),s.usedTimes++,r.nodeBuilderState=s,s));{let t=this._createNodeBuilder(e,e.material);try{t.build()}catch(r){t=this._createNodeBuilder(e,new fg),t.build();let s=r.stackTrace;!s&&r.stack&&(s=new Us(r.stack)),o("TSL: "+r,s)}s=this._createNodeBuilderState(t),i.set(n,s)}}s.usedTimes++,r.nodeBuilderState=s}return s}getForRenderAsync(e){const t=this.getForRender(e,!0);return t.then?t:Promise.resolve(t)}getForRenderDeferred(e){const t=this.get(e);if(void 0!==t.nodeBuilderState)return t.nodeBuilderState;const r=this.getForRenderCacheKey(e),s=this.nodeBuilderCache.get(r);return void 0!==s?(s.usedTimes++,t.nodeBuilderState=s,s):(!0!==t.pendingBuild&&(t.pendingBuild=!0,this._buildQueue.push(()=>this.getForRenderAsync(e).then(()=>{t.pendingBuild=!1})),this._processBuildQueue()),null)}_processBuildQueue(){if(this._buildInProgress||0===this._buildQueue.length)return;this._buildInProgress=!0;this._buildQueue.shift()().then(()=>{this._buildInProgress=!1,this._processBuildQueue()})}delete(e){if(e.isRenderObject){const t=this.get(e).nodeBuilderState;void 0!==t&&(t.usedTimes--,0===t.usedTimes&&this.nodeBuilderCache.delete(this.getForRenderCacheKey(e)))}return super.delete(e)}getForCompute(e){const t=this.get(e);let r=t.nodeBuilderState;if(void 0===r){const s=this.backend.createNodeBuilder(e,this.renderer);s.build(),r=this._createNodeBuilderState(s),t.nodeBuilderState=r}return r}_createNodeBuilderState(e){return new gN(e.vertexShader,e.fragmentShader,e.computeShader,e.getAttributesArray(),e.getBindings(),e.updateNodes,e.updateBeforeNodes,e.updateAfterNodes,e.observer,e.transforms)}getEnvironmentNode(e){this.updateEnvironment(e);let t=null;if(e.environmentNode&&e.environmentNode.isNode)t=e.environmentNode;else{const r=this.get(e);r.environmentNode&&(t=r.environmentNode)}return t}getBackgroundNode(e){this.updateBackground(e);let t=null;if(e.backgroundNode&&e.backgroundNode.isNode)t=e.backgroundNode;else{const r=this.get(e);r.backgroundNode&&(t=r.backgroundNode)}return t}getFogNode(e){return this.updateFog(e),e.fogNode||this.get(e).fogNode||null}getCacheKey(e,t){gS[0]=e,gS[1]=t;const r=this.renderer.info.calls,s=this.callHashCache.get(gS)||{};if(s.callId!==r){const i=this.getEnvironmentNode(e),n=this.getFogNode(e);t&&mS.push(t.getCacheKey(!0)),i&&mS.push(i.getCacheKey()),n&&mS.push(n.getCacheKey()),mS.push(this.renderer.getOutputRenderTarget()&&this.renderer.getOutputRenderTarget().multiview?1:0),mS.push(this.renderer.shadowMap.enabled?1:0),mS.push(this.renderer.shadowMap.type),s.callId=r,s.cacheKey=Vs(mS),this.callHashCache.set(gS,s),mS.length=0}return gS[0]=null,gS[1]=null,s.cacheKey}get isToneMappingState(){return!this.renderer.getRenderTarget()}updateBackground(e){const t=this.get(e),r=e.background;if(r){const s=0===e.backgroundBlurriness&&t.backgroundBlurriness>0||e.backgroundBlurriness>0&&0===t.backgroundBlurriness;if(t.background!==r||s){const i=this.getCacheNode("background",r,()=>{if(!0===r.isCubeTexture||r.mapping===he||r.mapping===pe||r.mapping===we){if(e.backgroundBlurriness>0||r.mapping===we)return Lf(r);{let e;return e=!0===r.isCubeTexture?Mc(r):Dl(r),Bg(e)}}if(!0===r.isTexture)return Dl(r,Xl.flipY()).setUpdateMatrix(!0);!0!==r.isColor&&o("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=Lc("color","color",r).setGroup(Ta),t=Lc("density","float",r).setGroup(Ta);return xT(e,yT(t))}if(r.isFog){const e=Lc("color","color",r).setGroup(Ta),t=Lc("near","float",r).setGroup(Ta),s=Lc("far","float",r).setGroup(Ta);return xT(e,fT(t,s))}o("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?Mc(r):!0===r.isTexture?Dl(r):void o("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 pS.get(e)!==this.getOutputCacheKey()}getOutputNode(e){const t=this.renderer,r=this.getOutputCacheKey(),s=e.isArrayTexture?Dl(e,Xl).depth($l("gl_ViewID_OVR")).renderOutput(t.toneMapping,t.currentColorSpace):Dl(e,Xl).renderOutput(t.toneMapping,t.currentColorSpace);return pS.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 qN,this.nodeBuilderCache=new Map,this.cacheLib={}}}const yS=new ot;class bS{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;ibl(e,i.toneMapping,i.outputColorSpace)}),CS.set(r,n))}else n=r;i.contextNode=n,i.setRenderTarget(t.renderTarget),t.rendercall(),i.contextNode=r}i.setRenderTarget(o),i._setXRLayerSize(a.x,a.y),this.isPresenting=n}getSession(){return this._session}async setSession(e){const t=this._renderer,r=t.backend;this._gl=t.getContext();const s=this._gl,i=s.getContextAttributes();if(this._session=e,null!==e){if(!0===r.isWebGPUBackend)throw new Error('THREE.XRManager: XR is currently not supported with a WebGPU backend. Use WebGL by passing "{ forceWebGL: true }" to the constructor of the renderer.');if(e.addEventListener("select",this._onSessionEvent),e.addEventListener("selectstart",this._onSessionEvent),e.addEventListener("selectend",this._onSessionEvent),e.addEventListener("squeeze",this._onSessionEvent),e.addEventListener("squeezestart",this._onSessionEvent),e.addEventListener("squeezeend",this._onSessionEvent),e.addEventListener("end",this._onSessionEnd),e.addEventListener("inputsourceschange",this._onInputSourcesChange),await r.makeXRCompatible(),this._currentPixelRatio=t.getPixelRatio(),t.getSize(this._currentSize),this._currentAnimationContext=t._animation.getContext(),this._currentAnimationLoop=t._animation.getAnimationLoop(),t._animation.stop(),!0===this._supportsLayers){let r=null,n=null,a=null;t.depth&&(a=t.stencil?s.DEPTH24_STENCIL8:s.DEPTH_COMPONENT24,r=t.stencil?je:qe,n=t.stencil?Ye:S);const o={colorFormat:s.RGBA8,depthFormat:a,scaleFactor:this._framebufferScaleFactor,clearOnAccess:!1};this._useMultiviewIfPossible&&t.hasFeature("OVR_multiview2")&&(o.textureType="texture-array",this._useMultiview=!0),this._glBinding=this.getBinding();const u=this._glBinding.createProjectionLayer(o),l=[u];this._glProjLayer=u,t.setPixelRatio(1),t._setXRLayerSize(u.textureWidth,u.textureHeight);const d=this._useMultiview?2:1,c=new J(u.textureWidth,u.textureHeight,n,void 0,void 0,void 0,void 0,void 0,void 0,r,d);if(this._xrRenderTarget=new AS(u.textureWidth,u.textureHeight,{format:Ee,type:ke,colorSpace:t.outputColorSpace,depthTexture:c,stencilBuffer:t.stencil,samples:i.antialias?4:0,resolveDepthBuffer:!1===u.ignoreDepthValues,resolveStencilBuffer:!1===u.ignoreDepthValues,depth:this._useMultiview?2:1,multiview:this._useMultiview}),this._xrRenderTarget._hasExternalTextures=!0,this._xrRenderTarget.depth=this._useMultiview?2:1,this._sessionUsesLayers=e.enabledFeatures.includes("layers"),this._referenceSpace=await e.requestReferenceSpace(this.getReferenceSpaceType()),this._sessionUsesLayers)for(const e of this._layers)e.plane.material=new ye({color:16777215,side:"cylinder"===e.type?L:Nt}),e.plane.material.blending=St,e.plane.material.blendEquation=st,e.plane.material.blendSrc=Rt,e.plane.material.blendDst=Rt,e.xrlayer=this._createXRLayer(e),l.unshift(e.xrlayer);e.updateRenderState({layers:l})}else{const r={antialias:t.currentSamples>0,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 AS(i.framebufferWidth,i.framebufferHeight,{format:Ee,type:ke,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=-5&i.layers.mask,a.layers.mask=-3&i.layers.mask;const o=e.parent,u=i.cameras;BS(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 DS(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 US(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(this._renderTarget,this._mrt),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(){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 fS(this,r),this._animation=new py(this,this._nodes,this.info),this._attributes=new Ry(r,this.info),this._background=new cN(this,this._nodes),this._geometries=new Cy(this._attributes,this.info),this._textures=new Ky(this,r,this.info),this._pipelines=new Uy(r,this._nodes,this.info),this._bindings=new Iy(r,this._nodes,this._textures,this._attributes,this._pipelines,this.info),this._objects=new by(this,this._nodes,this._geometries,this._pipelines,this._bindings,this.info),this._renderLists=new $y(this.lighting),this._bundles=new _S,this._renderContexts=new jy(this),this._animation.start(),this._initialized=!0,this._inspector.init(),e(this)})),this._initPromise}get domElement(){return this._canvasTarget.domElement}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._handleObjectFunction,u=this._compilationPromises;null===r&&(r=e);const l=!0===e.isScene?e:!0===r.isScene?r:OS,d=this.needsFrameBufferTarget&&null===this._renderTarget?this._getFrameBufferTarget():this._renderTarget||this._outputRenderTarget,c=this._renderContexts.get(d,this._mrt),h=this._activeMipmapLevel,p=[];this._currentRenderContext=c,this._currentRenderObjectFunction=this.renderObject,this._handleObjectFunction=this._createObjectPipeline,this._compilationPromises=p,s.renderId++,s.update(),c.depth=this.depth,c.stencil=this.stencil,c.clippingContext||(c.clippingContext=new bS),c.clippingContext.updateGlobal(l,t),l.onBeforeRender(this,e,t,d);const g=this._renderLists.get(l,t);if(g.begin(),this._projectObject(e,t,0,g,c.clippingContext),r!==e&&r.traverseVisible(function(e){e.isLight&&e.layers.test(t.layers)&&g.pushLight(e)}),g.finish(),null!==d){this._textures.updateRenderTarget(d,h);const e=this._textures.get(d);c.textures=e.textures,c.depthTexture=e.depthTexture}else c.textures=null,c.depthTexture=null;r!==e?this._background.update(r,g,c):this._background.update(l,g,c);const m=g.opaque,f=g.transparent,y=g.transparentDoublePass,b=g.lightsNode;!0===this.opaque&&m.length>0&&this._renderObjects(m,t,l,b),!0===this.transparent&&f.length>0&&this._renderTransparents(f,y,t,l,b),s.renderId=i,this._currentRenderContext=n,this._currentRenderObjectFunction=a,this._handleObjectFunction=o,this._compilationPromises=u;for(const e of p){const t=this._objects.get(e.object,e.material,e.scene,e.camera,e.lightsNode,e.renderContext,e.clippingContext,e.passId);t.drawRange=e.object.geometry.drawRange,t.group=e.group,this._geometries.updateForRender(t),await this._nodes.getForRenderAsync(t),this._nodes.updateBefore(t),this._nodes.updateForRender(t),this._bindings.updateForRender(t);const r=[];this._pipelines.getForRender(t,r),r.length>0&&await Promise.all(r),this._nodes.updateAfter(t),await xt()}}async renderAsync(e,t){v('Renderer: "renderAsync()" has been deprecated. Use "render()" and "await renderer.init();" when creating the renderer.'),await this.init(),this.render(e,t)}async waitForGPU(){o("Renderer: waitForGPU() has been removed. Read https://github.com/mrdoob/three.js/issues/32012 for more information.")}set inspector(e){null!==this._inspector&&this._inspector.setRenderer(null),this._inspector=e,this._inspector.setRenderer(this)}get inspector(){return this._inspector}set highPrecision(e){const t=this.contextNode.value;!0===e?(t.modelViewMatrix=Hd,t.modelNormalViewMatrix=qd):this.highPrecision&&(delete t.modelViewMatrix,delete t.modelNormalViewMatrix)}get highPrecision(){const e=this.contextNode.value;return e.modelViewMatrix===Hd&&e.modelNormalViewMatrix===qd}setMRT(e){return this._mrt=e,this}getMRT(){return this._mrt}getOutputBufferType(){return this._outputBufferType}getColorBufferType(){return v('Renderer: ".getColorBufferType()" has been renamed to ".getOutputBufferType()".'),this.getOutputBufferType()}_onDeviceLost(e){let t=`THREE.WebGPURenderer: ${e.api} Device Lost:\n\nMessage: ${e.message}`;e.reason&&(t+=`\nReason: ${e.reason}`),o(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{u.removeEventListener("dispose",e),l.dispose(),this._frameBufferTargets.delete(u)};u.addEventListener("dispose",e),this._frameBufferTargets.set(u,l)}const d=this.getOutputRenderTarget();l.depthBuffer=a,l.stencilBuffer=o,null!==d?l.setSize(d.width,d.height,d.depth):l.setSize(i,n,1);const c=this._outputRenderTarget?this._outputRenderTarget.viewport:u._viewport,h=this._outputRenderTarget?this._outputRenderTarget.scissor:u._scissor,g=this._outputRenderTarget?1:u._pixelRatio,f=this._outputRenderTarget?this._outputRenderTarget.scissorTest:u._scissorTest;return l.viewport.copy(c),l.scissor.copy(h),l.viewport.multiplyScalar(g),l.scissor.multiplyScalar(g),l.scissorTest=f,l.multiview=null!==d&&d.multiview,l.resolveDepthBuffer=null===d||d.resolveDepthBuffer,l._autoAllocateDepthBuffer=null!==d&&d._autoAllocateDepthBuffer,l}_renderScene(e,t,r=!0){if(!0===this._isDeviceLost)return;const s=r?this._getFrameBufferTarget():null,i=this._nodes.nodeFrame,n=i.renderId,a=this._currentRenderContext,o=this._currentRenderObjectFunction,u=this._handleObjectFunction;this._callDepth++;const l=!0===e.isScene?e:OS,d=this._renderTarget||this._outputRenderTarget,c=this._activeCubeFace,h=this._activeMipmapLevel;let p;null!==s?(p=s,this.setRenderTarget(p)):p=d;const g=this._renderContexts.get(p,this._mrt,this._callDepth);this._currentRenderContext=g,this._currentRenderObjectFunction=this._renderObjectFunction||this.renderObject,this._handleObjectFunction=this._renderObjectDirect,this.info.calls++,this.info.render.calls++,this.info.render.frameCalls++,i.renderId=this.info.calls,this.backend.updateTimeStampUID(g),this.inspector.beginRender(this.backend.getTimestampUID(g),e,t,p);const m=this.xr;if(!1===m.isPresenting){let e=!1;if(!0===this.reversedDepthBuffer&&!0!==t.reversedDepth){if(t._reversedDepth=!0,t.isArrayCamera)for(const e of t.cameras)e._reversedDepth=!0;e=!0}const r=this.coordinateSystem;if(t.coordinateSystem!==r){if(t.coordinateSystem=r,t.isArrayCamera)for(const e of t.cameras)e.coordinateSystem=r;e=!0}if(!0===e&&(t.updateProjectionMatrix(),t.isArrayCamera))for(const e of t.cameras)e.updateProjectionMatrix()}!0===e.matrixWorldAutoUpdate&&e.updateMatrixWorld(),null===t.parent&&!0===t.matrixWorldAutoUpdate&&t.updateMatrixWorld(),!0===m.enabled&&!0===m.isPresenting&&(!0===m.cameraAutoUpdate&&m.updateCamera(t),t=m.getCamera());const f=this._canvasTarget;let y=f._viewport,b=f._scissor,x=f._pixelRatio;null!==p&&(y=p.viewport,b=p.scissor,x=1),this.getDrawingBufferSize(VS),kS.set(0,0,VS.width,VS.height);const T=void 0===y.minDepth?0:y.minDepth,_=void 0===y.maxDepth?1:y.maxDepth;g.viewportValue.copy(y).multiplyScalar(x).floor(),g.viewportValue.width>>=h,g.viewportValue.height>>=h,g.viewportValue.minDepth=T,g.viewportValue.maxDepth=_,g.viewport=!1===g.viewportValue.equals(kS),g.scissorValue.copy(b).multiplyScalar(x).floor(),g.scissor=f._scissorTest&&!1===g.scissorValue.equals(kS),g.scissorValue.width>>=h,g.scissorValue.height>>=h,g.clippingContext||(g.clippingContext=new bS),g.clippingContext.updateGlobal(l,t),l.onBeforeRender(this,e,t,p);const v=t.isArrayCamera?zS:GS;t.isArrayCamera||($S.multiplyMatrices(t.projectionMatrix,t.matrixWorldInverse),v.setFromProjectionMatrix($S,t.coordinateSystem,t.reversedDepth));const N=this._renderLists.get(e,t);if(N.begin(),this._projectObject(e,t,0,N,g.clippingContext),N.finish(),!0===this.sortObjects&&N.sort(this._opaqueSort,this._transparentSort),null!==p){this._textures.updateRenderTarget(p,h);const e=this._textures.get(p);g.textures=e.textures,g.depthTexture=e.depthTexture,g.width=e.width,g.height=e.height,g.renderTarget=p,g.depth=p.depthBuffer,g.stencil=p.stencilBuffer}else g.textures=null,g.depthTexture=null,g.width=VS.width,g.height=VS.height,g.depth=this.depth,g.stencil=this.stencil;g.width>>=h,g.height>>=h,g.activeCubeFace=c,g.activeMipmapLevel=h,g.occlusionQueryCount=N.occlusionQueryCount,g.scissorValue.max(WS.set(0,0,0,0)),g.scissorValue.x+g.scissorValue.width>g.width&&(g.scissorValue.width=Math.max(g.width-g.scissorValue.x,0)),g.scissorValue.y+g.scissorValue.height>g.height&&(g.scissorValue.height=Math.max(g.height-g.scissorValue.y,0)),this._background.update(l,N,g),g.camera=t,this.backend.beginRender(g);const{bundles:S,lightsNode:R,transparentDoublePass:A,transparent:E,opaque:w}=N;return S.length>0&&this._renderBundles(S,l,R),!0===this.opaque&&w.length>0&&this._renderObjects(w,t,l,R),!0===this.transparent&&E.length>0&&this._renderTransparents(E,A,t,l,R),this.backend.finishRender(g),i.renderId=n,this._currentRenderContext=a,this._currentRenderObjectFunction=o,this._handleObjectFunction=u,this._callDepth--,null!==s&&(this.setRenderTarget(d,c,h),this._renderOutput(p)),l.onAfterRender(this,e,t,p),this.inspector.finishRender(this.backend.getTimestampUID(g)),g}_setXRLayerSize(e,t){this._canvasTarget._width=e,this._canvasTarget._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.capabilities.getMaxAnisotropy()}getActiveCubeFace(){return this._activeCubeFace}getActiveMipmapLevel(){return this._activeMipmapLevel}async setAnimationLoop(e){!1===this._initialized&&await this.init(),this._animation.setAnimationLoop(e)}getAnimationLoop(){return this._animation.getAnimationLoop()}async getArrayBufferAsync(e){return await this.backend.getArrayBufferAsync(e)}getContext(){return this.backend.getContext()}getPixelRatio(){return this._canvasTarget.getPixelRatio()}getDrawingBufferSize(e){return this._canvasTarget.getDrawingBufferSize(e)}getSize(e){return this._canvasTarget.getSize(e)}setPixelRatio(e=1){this._canvasTarget.setPixelRatio(e)}setDrawingBufferSize(e,t,r){this.xr&&this.xr.isPresenting||this._canvasTarget.setDrawingBufferSize(e,t,r)}setSize(e,t,r=!0){this.xr&&this.xr.isPresenting||this._canvasTarget.setSize(e,t,r)}setOpaqueSort(e){this._opaqueSort=e}setTransparentSort(e){this._transparentSort=e}getScissor(e){return this._canvasTarget.getScissor(e)}setScissor(e,t,r,s){this._canvasTarget.setScissor(e,t,r,s)}getScissorTest(){return this._canvasTarget.getScissorTest()}setScissorTest(e){this._canvasTarget.setScissorTest(e),this.backend.setScissorTest(e)}getViewport(e){return this._canvasTarget.getViewport(e)}setViewport(e,t,r,s,i=0,n=1){this._canvasTarget.setViewport(e,t,r,s,i,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!0===this.reversedDepthBuffer?1-this._clearDepth: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)throw new Error('Renderer: .clear() called before the backend is initialized. Use "await renderer.init();" before before using this method.');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.get(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;const t=this.backend.getClearColor();i.clearColorValue.r=t.r,i.clearColorValue.g=t.g,i.clearColorValue.b=t.b,i.clearColorValue.a=t.a,i.clearDepthValue=this.getClearDepth(),i.clearStencilValue=this.getClearStencil(),i.activeCubeFace=this.getActiveCubeFace(),i.activeMipmapLevel=this.getActiveMipmapLevel()}this.backend.clear(e,t,r,i),null!==s&&null===this._renderTarget&&this._renderOutput(s)}clearColor(){this.clear(!0,!1,!1)}clearDepth(){this.clear(!1,!0,!1)}clearStencil(){this.clear(!1,!1,!0)}async clearAsync(e=!0,t=!0,r=!0){v('Renderer: "clearAsync()" has been deprecated. Use "clear()" and "await renderer.init();" when creating the renderer.'),await this.init(),this.clear(e,t,r)}async clearColorAsync(){v('Renderer: "clearColorAsync()" has been deprecated. Use "clearColor()" and "await renderer.init();" when creating the renderer.'),this.clear(!0,!1,!1)}async clearDepthAsync(){v('Renderer: "clearDepthAsync()" has been deprecated. Use "clearDepth()" and "await renderer.init();" when creating the renderer.'),this.clear(!1,!0,!1)}async clearStencilAsync(){v('Renderer: "clearStencilAsync()" has been deprecated. Use "clearStencil()" and "await renderer.init();" when creating the renderer.'),this.clear(!1,!1,!0)}get needsFrameBufferTarget(){const e=this.currentToneMapping!==m,t=this.currentColorSpace!==p.workingColorSpace;return e||t}get samples(){return this._samples}get currentSamples(){let e=this._samples;return null!==this._renderTarget?e=this._renderTarget.samples:this.needsFrameBufferTarget&&(e=0),e}get currentToneMapping(){return this.isOutputTarget?this.toneMapping:m}get currentColorSpace(){return this.isOutputTarget?this.outputColorSpace:p.workingColorSpace}get isOutputTarget(){return this._renderTarget===this._outputRenderTarget||null===this._renderTarget}dispose(){if(!0===this._initialized){this.info.dispose(),this.backend.dispose(),this._animation.dispose(),this._objects.dispose(),this._geometries.dispose(),this._pipelines.dispose(),this._nodes.dispose(),this._bindings.dispose(),this._renderLists.dispose(),this._renderContexts.dispose(),this._textures.dispose();for(const e of this._frameBufferTargets.keys())e.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}setCanvasTarget(e){this._canvasTarget.removeEventListener("resize",this._onCanvasTargetResize),this._canvasTarget=e,this._canvasTarget.addEventListener("resize",this._onCanvasTargetResize)}getCanvasTarget(){return this._canvasTarget}_resetXRState(){this.backend.setXRTarget(null),this.setOutputRenderTarget(null),this.setRenderTarget(null);for(const e of this._frameBufferTargets.keys())e.dispose()}setRenderObjectFunction(e){this._renderObjectFunction=e}getRenderObjectFunction(){return this._renderObjectFunction}compute(e,t=null){if(!0===this._isDeviceLost)return;if(!1===this._initialized)return d("Renderer: .compute() called before the backend is initialized. Try using .computeAsync() instead."),this.computeAsync(e,t);const r=this._nodes.nodeFrame,s=r.renderId;this.info.calls++,this.info.compute.calls++,this.info.compute.frameCalls++,r.renderId=this.info.calls,this.backend.updateTimeStampUID(e),this.inspector.beginCompute(this.backend.getTimestampUID(e),e);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.deleteForCompute(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,this.inspector.finishCompute(this.backend.getTimestampUID(e))}async computeAsync(e,t=null){!1===this._initialized&&await this.init(),this.compute(e,t)}async hasFeatureAsync(e){return v('Renderer: "hasFeatureAsync()" has been deprecated. Use "hasFeature()" and "await renderer.init();" when creating the renderer.'),await this.init(),this.hasFeature(e)}async resolveTimestampsAsync(e="render"){return!1===this._initialized&&await this.init(),this.backend.resolveTimestampsAsync(e)}hasFeature(e){if(!1===this._initialized)throw new Error('Renderer: .hasFeature() called before the backend is initialized. Use "await renderer.init();" before before using this method.');return this.backend.hasFeature(e)}hasInitialized(){return this._initialized}async initTextureAsync(e){v('Renderer: "initTextureAsync()" has been deprecated. Use "initTexture()" and "await renderer.init();" when creating the renderer.'),await this.init(),this.initTexture(e)}initTexture(e){if(!1===this._initialized)throw new Error('Renderer: .initTexture() called before the backend is initialized. Use "await renderer.init();" before before using this method.');this._textures.updateTexture(e)}initRenderTarget(e){if(!1===this._initialized)throw new Error('Renderer: .initRenderTarget() called before the backend is initialized. Use "await renderer.init();" before before using this method.');this._textures.updateRenderTarget(e);const t=this._textures.get(e),r=this._renderContexts.get(e);r.textures=t.textures,r.depthTexture=t.depthTexture,r.width=t.width,r.height=t.height,r.renderTarget=e,r.depth=e.depthBuffer,r.stencil=e.stencilBuffer,this.backend.initRenderTarget(r)}copyFramebufferToTexture(e,t=null){if(null!==t)if(t.isVector2)t=WS.set(t.x,t.y,e.image.width,e.image.height).floor();else{if(!t.isVector4)return void o("Renderer.copyFramebufferToTexture: Invalid rectangle.");t=WS.copy(t).floor()}else t=WS.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),this._inspector.copyFramebufferToTexture(e)}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),this._inspector.copyTextureToTexture(e,t)}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?zS:GS;if(!e.frustumCulled||n.intersectsSprite(e,t)){!0===this.sortObjects&&WS.setFromMatrixPosition(e.matrixWorld).applyMatrix4($S);const{geometry:t,material:n}=e;n.visible&&s.push(e,t,n,r,WS.z,null,i)}}else if(e.isLineLoop)o("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?zS:GS;if(!e.frustumCulled||n.intersectsObject(e,t)){const{geometry:t,material:n}=e;if(!0===this.sortObjects&&(null===t.boundingSphere&&t.computeBoundingSphere(),WS.copy(t.boundingSphere.center).applyMatrix4(e.matrixWorld).applyMatrix4($S)),Array.isArray(n)){const a=t.groups;for(let o=0,u=a.length;o0){for(const{material:e}of t)e.side=L;this._renderObjects(t,r,s,i,"backSide");for(const{material:e}of t)e.side=Nt;this._renderObjects(e,r,s,i);for(const{material:e}of t)e.side=P}else this._renderObjects(e,r,s,i)}_renderObjects(e,t,r,s,i=null){for(let n=0,a=e.length;n(t.not().discard(),e))(u)}}e.depthNode&&e.depthNode.isNode&&(l=e.depthNode),e.castShadowPositionNode&&e.castShadowPositionNode.isNode?o=e.castShadowPositionNode:e.positionNode&&e.positionNode.isNode&&(o=e.positionNode),r={version:t,colorNode:u,depthNode:l,positionNode:o},this._cacheShadowNodes.set(e,r)}return r}renderObject(e,t,r,s,i,n,a,o=null,u=null){let l,d,c,h,p=!1;if(e.onBeforeRender(this,t,r,s,i,n),!0===i.allowOverride&&null!==t.overrideMaterial){const e=t.overrideMaterial;if(p=!0,l=e.isNodeMaterial?e.colorNode:null,d=e.isNodeMaterial?e.depthNode:null,c=e.isNodeMaterial?e.positionNode:null,h=t.overrideMaterial.side,i.positionNode&&i.positionNode.isNode&&(e.positionNode=i.positionNode),e.alphaTest=i.alphaTest,e.alphaMap=i.alphaMap,e.transparent=i.transparent||i.transmission>0||i.transmissionNode&&i.transmissionNode.isNode||i.backdropNode&&i.backdropNode.isNode,e.isShadowPassMaterial){const{colorNode:t,depthNode:r,positionNode:s}=this._getShadowNodes(i);this.shadowMap.type===ht?e.side=null!==i.shadowSide?i.shadowSide:i.side:e.side=null!==i.shadowSide?i.shadowSide:HS[i.side],null!==t&&(e.colorNode=t),null!==r&&(e.depthNode=r),null!==s&&(e.positionNode=s)}i=e}!0===i.transparent&&i.side===P&&!1===i.forceSinglePass?(i.side=L,this._handleObjectFunction(e,i,t,r,a,n,o,"backSide"),i.side=Nt,this._handleObjectFunction(e,i,t,r,a,n,o,u),i.side=P):this._handleObjectFunction(e,i,t,r,a,n,o,u),p&&(t.overrideMaterial.colorNode=l,t.overrideMaterial.depthNode=d,t.overrideMaterial.positionNode=c,t.overrideMaterial.side=h),e.onAfterRender(this,t,r,s,i,n)}hasCompatibility(e){if(!1===this._initialized)throw new Error('Renderer: .hasCompatibility() called before the backend is initialized. Use "await renderer.init();" before using this method.');return this.backend.hasCompatibility(e)}_renderObjectDirect(e,t,r,s,i,n,a,o){const u=this._objects.get(e,t,r,s,i,this._currentRenderContext,a,o);if(u.drawRange=e.geometry.drawRange,u.group=n,null!==this._currentRenderBundle){this.backend.get(this._currentRenderBundle).renderObjects.push(u),u.bundle=this._currentRenderBundle.bundleGroup}const l=this._nodes.needsRefresh(u);l&&(this._nodes.updateBefore(u),this._geometries.updateForRender(u),this._nodes.updateForRender(u),this._bindings.updateForRender(u)),this._pipelines.updateForRender(u),this._pipelines.isReady(u)&&(this.backend.draw(u,this.info),l&&this._nodes.updateAfter(u))}_createObjectPipeline(e,t,r,s,i,n,a,o){if(null!==this._compilationPromises)return void this._compilationPromises.push({object:e,material:t,scene:r,camera:s,lightsNode:i,group:n,clippingContext:a,passId:o,renderContext:this._currentRenderContext});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)}_onCanvasTargetResize(){this._initialized&&this.backend.updateSize()}get compile(){return this.compileAsync}}class jS{constructor(e=""){this.name=e,this.visibility=0}setVisibility(e){this.visibility|=e}getVisibility(){return this.visibility}clone(){return Object.assign(new this.constructor,this)}}class XS extends jS{constructor(e,t=null){super(e),this.isBuffer=!0,this.bytesPerElement=Float32Array.BYTES_PER_ELEMENT,this._buffer=t,this._updateRanges=[]}get updateRanges(){return this._updateRanges}addUpdateRange(e,t){this.updateRanges.push({start:e,count:t})}clearUpdateRanges(){this.updateRanges.length=0}get byteLength(){return(e=this._buffer.byteLength)+(Sy-e%Sy)%Sy;var e}get buffer(){return this._buffer}update(){return!0}}class KS extends XS{constructor(e,t=null){super(e,t),this.isUniformBuffer=!0}}let QS=0;class YS extends KS{constructor(e,t){super("UniformBuffer_"+QS++,e?e.value:null),this.nodeUniform=e,this.groupNode=t,this.isNodeUniformBuffer=!0}set updateRanges(e){this.nodeUniform.updateRanges=e}get updateRanges(){return this.nodeUniform.updateRanges}addUpdateRange(e,t){this.nodeUniform.addUpdateRange(e,t)}clearUpdateRanges(){this.nodeUniform.clearUpdateRanges()}get buffer(){return this.nodeUniform.value}}class ZS extends KS{constructor(e){super(e),this.isUniformsGroup=!0,this._values=null,this.uniforms=[],this._updateRangeCache=new Map}addUniformUpdateRange(e){const t=e.index;if(!0!==this._updateRangeCache.has(t)){const r=this.updateRanges,s={start:e.offset,count:e.itemSize};r.push(s),this._updateRangeCache.set(t,s)}}clearUpdateRanges(){this._updateRangeCache.clear(),super.clearUpdateRanges()}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.generation=null,this.version=-1},this.texture=t,this.version=t?t.version:-1,this.generation=null,this.samplerKey="",this.isSampler=!0}set texture(e){this._texture!==e&&(this._texture&&this._texture.removeEventListener("dispose",this._onTextureDispose),this._texture=e,this.generation=null,this.version=-1,this._texture&&this._texture.addEventListener("dispose",this._onTextureDispose))}get texture(){return this._texture}update(){const{texture:e,version:t}=this;return t!==e.version&&(this.version=e.version,!0)}clone(){const e=super.clone();return e._texture=null,e._onTextureDispose=()=>{e.generation=null,e.version=-1},e.texture=this.texture,e}}let rR=0;class sR extends tR{constructor(e,t){super(e,t),this.id=rR++,this.store=!1,this.mipLevel=0,this.isSampledTexture=!0}}class iR extends sR{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 nR extends iR{constructor(e,t,r,s=null){super(e,t,r,s),this.isSampledCubeTexture=!0}}class aR extends iR{constructor(e,t,r,s=null){super(e,t,r,s),this.isSampledTexture3D=!0}}const oR={bitcast_int_uint:new cT("uint tsl_bitcast_int_to_uint ( int x ) { return floatBitsToUint( intBitsToFloat ( x ) ); }"),bitcast_uint_int:new cT("uint tsl_bitcast_uint_to_int ( uint x ) { return floatBitsToInt( uintBitsToFloat ( x ) ); }")},uR={textureDimensions:"textureSize",equals:"equal",bitcast_float_int:"floatBitsToInt",bitcast_int_float:"intBitsToFloat",bitcast_uint_float:"uintBitsToFloat",bitcast_float_uint:"floatBitsToUint",bitcast_uint_int:"tsl_bitcast_uint_to_int",bitcast_int_uint:"tsl_bitcast_int_to_uint",floatpack_snorm_2x16:"packSnorm2x16",floatpack_unorm_2x16:"packUnorm2x16",floatpack_float16_2x16:"packHalf2x16",floatunpack_snorm_2x16:"unpackSnorm2x16",floatunpack_unorm_2x16:"unpackUnorm2x16",floatunpack_float16_2x16:"unpackHalf2x16"},lR={low:"lowp",medium:"mediump",high:"highp"},dR={swizzleAssign:!0,storageBuffer:!1},cR={perspective:"smooth",linear:"noperspective"},hR={centroid:"centroid"},pR="\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 highp sampler2DShadow;\nprecision highp sampler2DArrayShadow;\nprecision highp samplerCubeShadow;\n";class gR extends HN{constructor(e,t){super(e,t,new hS),this.uniformGroups={},this.transforms=[],this.extensions={},this.builtins={vertex:[],fragment:[],compute:[]}}needsToWorkingColorSpace(e){return!0===e.isVideoTexture&&e.colorSpace!==T}_include(e){const t=oR[e];return t.build(this),this.addInclude(t),t}getMethod(e){return void 0!==oR[e]&&this._include(e),uR[e]||e}getBitcastMethod(e,t){return this.getMethod(`bitcast_${t}_${e}`)}getFloatPackingMethod(e){return this.getMethod(`floatpack_${e}_2x16`)}getFloatUnpackingMethod(e){return this.getMethod(`floatunpack_${e}_2x16`)}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?He:We;2===s?n=i?Ft:W:3===s?n=i?Lt:Xe:4===s&&(n=i?Pt:Ee);const a={Float32Array:Q,Uint8Array:ke,Uint16Array:ze,Uint32Array:S,Int8Array:Ve,Int16Array:Ge,Int32Array:R,Uint8ClampedArray:ke},o=Math.pow(2,Math.ceil(Math.log2(Math.sqrt(r/s))));let u=Math.ceil(r/s/o);o*u*s0?i:"";t=`${r.name} {\n\t${s} ${e.name}[${n}];\n};\n`}else{const t=e.groupNode.name;if(void 0===s[t]){const e=this.uniformGroups[t];if(void 0!==e){const r=[];for(const t of e.uniforms){const e=t.getType(),s=this.getVectorType(e),i=t.nodeUniform.node.precision;let n=`${s} ${t.name};`;null!==i&&(n=lR[i]+" "+n),r.push("\t"+n)}s[t]=r}}i=!0}if(!i){const s=e.node.precision;null!==s&&(t=lR[s]+" "+t),t="uniform "+t,r.push(t)}}let i="";for(const e in s){const t=s[e];i+=this._getGLSLUniformStruct(e,t.join("\n"))+"\n"}return i+=r.join("\n"),i}getTypeFromAttribute(e){let t=super.getTypeFromAttribute(e);if(/^[iu]/.test(t)&&e.gpuType!==R){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+=`${cR[s.interpolationType]||s.interpolationType} ${hR[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+=`${cR[e.interpolationType]||e.interpolationType} ${hR[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`}getSubgroupSize(){o("GLSLNodeBuilder: WebGLBackend does not support the subgroupSize node")}getInvocationSubgroupIndex(){o("GLSLNodeBuilder: WebGLBackend does not support the invocationSubgroupIndex node")}getSubgroupIndex(){o("GLSLNodeBuilder: WebGLBackend does not support the subgroupIndex node")}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=dR[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)}dR[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 iR(i.name,i.node,s),u.push(a);else if("cubeTexture"===t||"cubeDepthTexture"===t)a=new nR(i.name,i.node,s),u.push(a);else if("texture3D"===t)a=new aR(i.name,i.node,s),u.push(a);else if("buffer"===t){i.name=`buffer${e.id}`;const t=this.getSharedDataFromNode(e);let r=t.buffer;void 0===r&&(e.name=`NodeBuffer_${e.id}`,r=new YS(e,s),r.name=e.name,t.buffer=r),u.push(r),a=r}else{let e=this.uniformGroups[o];void 0===e?(e=new eR(o,s),this.uniformGroups[o]=e,u.push(e)):-1===u.indexOf(e)&&u.push(e),a=this.getNodeUniform(i,t);const r=a.name;e.uniforms.some(e=>e.name===r)||e.addUniform(a)}n.uniformGPU=a}return i}}let mR=null,fR=null;class yR{constructor(e={}){this.parameters=Object.assign({},e),this.data=new WeakMap,this.renderer=null,this.domElement=null,this.timestampQueryPool={[Dt.RENDER]:null,[Dt.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(){}updateSampler(){}createDefaultTexture(){}createTexture(){}updateTexture(){}generateMipmaps(){}destroyTexture(){}async copyTextureToBuffer(){}copyTextureToTexture(){}copyFramebufferToTexture(){}createAttribute(){}createIndexAttribute(){}createStorageAttribute(){}updateAttribute(){}destroyAttribute(){}getContext(){}updateSize(){}updateViewport(){}updateTimeStampUID(e){const t=this.get(e),r=this.renderer.info.frame;let s;s=!0===e.isComputeNode?"c:"+this.renderer.info.compute.frameCalls:"r:"+this.renderer.info.render.frameCalls,t.timestampUID=s+":"+e.id+":f"+r}getTimestampUID(e){return this.get(e).timestampUID}getTimestampFrames(e){const t=this.timestampQueryPool[e];return t?t.getTimestampFrames():[]}_getQueryPool(e){const t=e.startsWith("c:")?Dt.COMPUTE:Dt.RENDER;return this.timestampQueryPool[t]}getTimestamp(e){return this._getQueryPool(e).getTimestamp(e)}hasTimestamp(e){return this._getQueryPool(e).hasTimestamp(e)}isOccluded(){}async resolveTimestampsAsync(e="render"){if(!this.trackTimestamp)return void v("WebGPURenderer: Timestamp tracking is disabled.");const t=this.timestampQueryPool[e];if(!t)return;const r=await t.resolveQueriesAsync();return this.renderer.info[e].timestamp=r,r}async getArrayBufferAsync(){}async hasFeatureAsync(){}hasFeature(){}getDrawingBufferSize(){return mR=mR||new t,this.renderer.getDrawingBufferSize(mR)}setScissorTest(){}getClearColor(){const e=this.renderer;return fR=fR||new Qy,e.getClearColor(fR),fR.getRGB(fR),fR}getDomElement(){let e=this.domElement;return null===e&&(e=void 0!==this.parameters.canvas?this.parameters.canvas:Ut(),"setAttribute"in e&&e.setAttribute("data-engine",`three.js r${Tt} webgpu`),this.domElement=e),e}hasCompatibility(){return!1}initRenderTarget(){}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)}deleteBindGroupData(){}dispose(){}}let bR,xR,TR=0;class _R{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 vR{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===R,id:TR++};if(e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute){const e=this._createBuffer(s,t,i,n);d=new _R(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;e0?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 RR,AR,ER,wR=!1;class CR{constructor(e){this.backend=e,this.gl=e.gl,this.extensions=e.extensions,this.defaultTextures={},this._srcFramebuffer=null,this._dstFramebuffer=null,!1===wR&&(this._init(),wR=!0)}_init(){const e=this.gl;RR={[Gr]:e.REPEAT,[ve]:e.CLAMP_TO_EDGE,[kr]:e.MIRRORED_REPEAT},AR={[B]:e.NEAREST,[zr]:e.NEAREST_MIPMAP_NEAREST,[yt]:e.NEAREST_MIPMAP_LINEAR,[de]:e.LINEAR,[ft]:e.LINEAR_MIPMAP_NEAREST,[Z]:e.LINEAR_MIPMAP_LINEAR},ER={[qr]:e.NEVER,[Hr]:e.ALWAYS,[E]:e.LESS,[w]:e.LEQUAL,[Wr]:e.EQUAL,[M]:e.GEQUAL,[C]:e.GREATER,[$r]: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];d("WebGLBackend: 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?jr:p.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===g?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),r===n.UNSIGNED_INT_10F_11F_11F_REV&&(o=n.R11F_G11F_B10F)}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?jr:p.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===g?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=p.getPrimaries(p.workingColorSpace),a=t.colorSpace===T?null:p.getPrimaries(t.colorSpace),o=t.colorSpace===T||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,RR[t.wrapS]),r.texParameteri(e,r.TEXTURE_WRAP_T,RR[t.wrapT]),e!==r.TEXTURE_3D&&e!==r.TEXTURE_2D_ARRAY||t.isArrayTexture||r.texParameteri(e,r.TEXTURE_WRAP_R,RR[t.wrapR]),r.texParameteri(e,r.TEXTURE_MAG_FILTER,AR[t.magFilter]);const u=void 0!==t.mipmaps&&t.mipmaps.length>0,l=t.minFilter===de&&u?Z:t.minFilter;if(r.texParameteri(e,r.TEXTURE_MIN_FILTER,AR[l]),t.compareFunction&&(r.texParameteri(e,r.TEXTURE_COMPARE_MODE,r.COMPARE_REF_TO_TEXTURE),r.texParameteri(e,r.TEXTURE_COMPARE_FUNC,ER[t.compareFunction])),!0===s.has("EXT_texture_filter_anisotropic")){if(t.magFilter===B)return;if(t.minFilter!==yt&&t.minFilter!==Z)return;if(t.type===Q&&!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.capabilities.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})}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){const t=Xr(s.width,s.height,e.format,e.type);for(const i of e.layerUpdates){const e=s.data.subarray(i*t/s.data.BYTES_PER_ELEMENT,(i+1)*t/s.data.BYTES_PER_ELEMENT);r.texSubImage3D(r.TEXTURE_2D_ARRAY,0,0,0,i,s.width,s.height,1,o,u,e)}e.clearLayerUpdates()}else r.texSubImage3D(r.TEXTURE_2D_ARRAY,0,0,0,0,s.width,s.height,s.depth,o,u,s.data)}else if(e.isData3DTexture){const e=t.image;r.texSubImage3D(r.TEXTURE_3D,0,0,0,0,e.width,e.height,e.depth,o,u,e.data)}else if(e.isVideoTexture)e.update(),r.texImage2D(a,0,l,o,u,t.image);else{const n=e.mipmaps;if(n.length>0)for(let e=0,t=n.length;e0,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();a.state.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),a.state.bindFramebuffer(o.READ_FRAMEBUFFER,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}dispose(){const{gl:e}=this;null!==this._srcFramebuffer&&e.deleteFramebuffer(this._srcFramebuffer),null!==this._dstFramebuffer&&e.deleteFramebuffer(this._dstFramebuffer)}}function MR(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 BR{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 FR{constructor(e){this.backend=e,this.maxAnisotropy=null,this.maxUniformBlockSize=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}getUniformBufferLimit(){if(null!==this.maxUniformBlockSize)return this.maxUniformBlockSize;const e=this.backend.gl;return this.maxUniformBlockSize=e.getParameter(e.MAX_UNIFORM_BLOCK_SIZE),this.maxUniformBlockSize}}const LR={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",WEBGL_compressed_texture_s3tc:"texture-compression-s3tc",EXT_texture_compression_bptc:"texture-compression-bc",EXT_disjoint_timer_query_webgl2:"timestamp-query",OVR_multiview2:"OVR_multiview2"};class PR{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 v(`WebGLTimestampQueryPool [${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,t),t}beginQuery(e){if(!this.trackTimestamp||this.isDisposed)return;const t=this.queryOffsets.get(e);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){o("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);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){o("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=new Map;for(const[t,r]of this.queryOffsets){if("ended"===this.queryStates.get(r)){const s=this.queries[r];e.set(t,this.resolveQuery(s))}}if(0===e.size)return this.lastValue;const t={},r=[];for(const[s,i]of e){const e=s.match(/^(.*):f(\d+)$/),n=parseInt(e[2]);!1===r.includes(n)&&r.push(n),void 0===t[n]&&(t[n]=0);const a=await i;this.timestamps.set(s,a),t[n]+=a}const s=t[r[r.length-1]];return this.lastValue=s,this.frames=r,this.currentQueryIndex=0,this.queryOffsets.clear(),this.queryStates.clear(),this.activeQuery=null,s}catch(e){return o("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){o("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 IR extends yR{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.currentSamples>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 BR(this),this.capabilities=new FR(this),this.attributeUtils=new vR(this),this.textureUtils=new CR(this),this.bufferRenderer=new PR(this),this.state=new NR(this),this.utils=new SR(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.extensions.get("EXT_clip_control"),this.disjoint=this.extensions.get("EXT_disjoint_timer_query_webgl2"),this.parallel=this.extensions.get("KHR_parallel_shader_compile"),this.drawBuffersIndexedExt=this.extensions.get("OES_draw_buffers_indexed"),t.reversedDepthBuffer&&(this.extensions.has("EXT_clip_control")?e.reversedDepthBuffer=!0:(d("WebGPURenderer: Unable to use reversed depth buffer due to missing EXT_clip_control extension. Fallback to default depth buffer."),e.reversedDepthBuffer=!1)),e.reversedDepthBuffer&&this.state.setReversedDepth(!0)}get coordinateSystem(){return c}async getArrayBufferAsync(e){return await this.attributeUtils.getArrayBufferAsync(e)}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&&d("WebGLBackend: Render-to-texture extension was disabled because an external texture was provided"),e._autoAllocateDepthBuffer=!1}}initTimestampQuery(e,t){if(!this.disjoint||!this.trackTimestamp)return;this.timestampQueryPool[e]||(this.timestampQueryPool[e]=new UR(this.gl,e,2048));const r=this.timestampQueryPool[e];null!==r.allocateQueriesForContext(t)&&r.beginQuery(t)}prepareTimestampBuffer(e,t){if(!this.disjoint||!this.trackTimestamp)return;this.timestampQueryPool[e].endQuery(t)}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)this.updateScissor(e);else{const{width:e,height:r}=this.getDrawingBufferSize();t.scissor(0,0,e,r)}this.initTimestampQuery(Dt.RENDER,this.getTimestampUID(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;e{let a=0;for(let t=0;t1?t.renderInstances(r,s,i):t.render(r,s)}draw(e){const{object:t,pipeline:r,material:s,context:i,hardwareClippingPlanes:n}=e,{programGPU:a}=this.get(r),{gl:o,state:u}=this,l=this.get(i),d=e.getDrawParameters();if(null===d)return;this._bindUniforms(e.getBindings());const c=t.isMesh&&t.matrixWorld.determinant()<0;u.setMaterial(s,c,n),null!==i.mrt&&null!==i.textures&&u.setMRTBlending(i.textures,i.mrt,s),u.useProgram(a);const h=e.getAttributes(),p=this.get(h);let g=p.vaoGPU;if(void 0===g){const e=this._getVaoKey(h);g=this.vaoCache[e],void 0===g&&(g=this._createVao(h),this.vaoCache[e]=g,p.vaoGPU=g)}const m=e.getIndex(),f=null!==m?this.get(m).bufferGPU:null;u.setVertexState(g,f);const y=l.lastOcclusionObject;if(y!==t&&void 0!==y){if(null!==y&&!0===y.occlusionTest&&(o.endQuery(o.ANY_SAMPLES_PASSED),l.occlusionQueryIndex++),!0===t.occlusionTest){const e=o.createQuery();o.beginQuery(o.ANY_SAMPLES_PASSED,e),l.occlusionQueries[l.occlusionQueryIndex]=e,l.occlusionQueryObjects[l.occlusionQueryIndex]=t}l.lastOcclusionObject=t}const b=this.bufferRenderer;t.isPoints?b.mode=o.POINTS:t.isLineSegments?b.mode=o.LINES:t.isLine?b.mode=o.LINE_STRIP:t.isLineLoop?b.mode=o.LINE_LOOP:!0===s.wireframe?(u.setLineWidth(s.wireframeLinewidth*this.renderer.getPixelRatio()),b.mode=o.LINES):b.mode=o.TRIANGLES;const{vertexCount:x,instanceCount:T}=d;let{firstVertex:_}=d;if(b.object=t,null!==m){_*=m.array.BYTES_PER_ELEMENT;const e=this.get(m);b.index=m.count,b.type=e.type}else b.index=0;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");o("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&&d("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,pipeline: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;eLR[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=qy(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,i=this.renderer._activeMipmapLevel;t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_CUBE_MAP_POSITIVE_X+r,e,i)}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&&!1===this._useMultisampledExtension(s)){const n=i.framebuffers[e.getCacheKey()];let a=t.COLOR_BUFFER_BIT;s.resolveDepthBuffer&&(s.depthBuffer&&(a|=t.DEPTH_BUFFER_BIT),s.stencilBuffer&&s.resolveStencilBuffer&&(a|=t.STENCIL_BUFFER_BIT));const o=i.msaaFrameBuffer,u=i.msaaRenderbuffers,l=e.textures,d=l.length>1;if(r.bindFramebuffer(t.READ_FRAMEBUFFER,o),r.bindFramebuffer(t.DRAW_FRAMEBUFFER,n),d)for(let e=0;e0&&!0===this.extensions.has("WEBGL_multisampled_render_to_texture")&&!1!==e._autoAllocateDepthBuffer}dispose(){null!==this.textureUtils&&this.textureUtils.dispose();const e=this.extensions.get("WEBGL_lose_context");e&&e.loseContext(),this.renderer.domElement.removeEventListener("webglcontextlost",this._onContextLost)}}const OR="point-list",VR="line-list",kR="line-strip",GR="triangle-list",zR="undefined"!=typeof self&&self.GPUShaderStage?self.GPUShaderStage:{VERTEX:1,FRAGMENT:2,COMPUTE:4},$R="never",WR="less",HR="equal",qR="less-equal",jR="greater",XR="not-equal",KR="greater-equal",QR="always",YR="store",ZR="load",JR="clear",eA="ccw",tA="cw",rA="none",sA="back",iA="uint16",nA="uint32",aA="r8unorm",oA="r8snorm",uA="r8uint",lA="r8sint",dA="r16uint",cA="r16sint",hA="r16float",pA="rg8unorm",gA="rg8snorm",mA="rg8uint",fA="rg8sint",yA="r32uint",bA="r32sint",xA="r32float",TA="rg16uint",_A="rg16sint",vA="rg16float",NA="rgba8unorm",SA="rgba8unorm-srgb",RA="rgba8snorm",AA="rgba8uint",EA="rgba8sint",wA="bgra8unorm",CA="bgra8unorm-srgb",MA="rgb9e5ufloat",BA="rgb10a2unorm",FA="rg11b10ufloat",LA="rg32uint",PA="rg32sint",DA="rg32float",UA="rgba16uint",IA="rgba16sint",OA="rgba16float",VA="rgba32uint",kA="rgba32sint",GA="rgba32float",zA="depth16unorm",$A="depth24plus",WA="depth24plus-stencil8",HA="depth32float",qA="depth32float-stencil8",jA="bc1-rgba-unorm",XA="bc1-rgba-unorm-srgb",KA="bc2-rgba-unorm",QA="bc2-rgba-unorm-srgb",YA="bc3-rgba-unorm",ZA="bc3-rgba-unorm-srgb",JA="bc4-r-unorm",eE="bc4-r-snorm",tE="bc5-rg-unorm",rE="bc5-rg-snorm",sE="bc6h-rgb-ufloat",iE="bc6h-rgb-float",nE="bc7-rgba-unorm",aE="bc7-rgba-unorm-srgb",oE="etc2-rgb8unorm",uE="etc2-rgb8unorm-srgb",lE="etc2-rgb8a1unorm",dE="etc2-rgb8a1unorm-srgb",cE="etc2-rgba8unorm",hE="etc2-rgba8unorm-srgb",pE="eac-r11unorm",gE="eac-r11snorm",mE="eac-rg11unorm",fE="eac-rg11snorm",yE="astc-4x4-unorm",bE="astc-4x4-unorm-srgb",xE="astc-5x4-unorm",TE="astc-5x4-unorm-srgb",_E="astc-5x5-unorm",vE="astc-5x5-unorm-srgb",NE="astc-6x5-unorm",SE="astc-6x5-unorm-srgb",RE="astc-6x6-unorm",AE="astc-6x6-unorm-srgb",EE="astc-8x5-unorm",wE="astc-8x5-unorm-srgb",CE="astc-8x6-unorm",ME="astc-8x6-unorm-srgb",BE="astc-8x8-unorm",FE="astc-8x8-unorm-srgb",LE="astc-10x5-unorm",PE="astc-10x5-unorm-srgb",DE="astc-10x6-unorm",UE="astc-10x6-unorm-srgb",IE="astc-10x8-unorm",OE="astc-10x8-unorm-srgb",VE="astc-10x10-unorm",kE="astc-10x10-unorm-srgb",GE="astc-12x10-unorm",zE="astc-12x10-unorm-srgb",$E="astc-12x12-unorm",WE="astc-12x12-unorm-srgb",HE="clamp-to-edge",qE="repeat",jE="mirror-repeat",XE="linear",KE="nearest",QE="zero",YE="one",ZE="src",JE="one-minus-src",ew="src-alpha",tw="one-minus-src-alpha",rw="dst",sw="one-minus-dst",iw="dst-alpha",nw="one-minus-dst-alpha",aw="src-alpha-saturated",ow="constant",uw="one-minus-constant",lw="add",dw="subtract",cw="reverse-subtract",hw="min",pw="max",gw=0,mw=15,fw="keep",yw="zero",bw="replace",xw="invert",Tw="increment-clamp",_w="decrement-clamp",vw="increment-wrap",Nw="decrement-wrap",Sw="storage",Rw="read-only-storage",Aw="write-only",Ew="read-only",ww="read-write",Cw="non-filtering",Mw="comparison",Bw="float",Fw="unfilterable-float",Lw="depth",Pw="sint",Dw="uint",Uw="2d",Iw="3d",Ow="2d",Vw="2d-array",kw="cube",Gw="3d",zw="all",$w="vertex",Ww="instance",Hw={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"},qw={"texture-compression-s3tc":"texture-compression-bc","texture-compression-etc1":"texture-compression-etc2"};class jw extends tR{constructor(e,t,r){super(e,t?t.value:null),this.textureNode=t,this.groupNode=r}update(){const{textureNode:e}=this;return this.texture!==e.value?(this.texture=e.value,!0):super.update()}}class Xw extends XS{constructor(e,t){super(e,t?t.array:null),this._attribute=t,this.isStorageBuffer=!0}get attribute(){return this._attribute}}let Kw=0;class Qw extends Xw{constructor(e,t){super("StorageBuffer_"+Kw++,e?e.value:null),this.nodeUniform=e,this.access=e?e.access:si.READ_WRITE,this.groupNode=t}get attribute(){return this.nodeUniform.value}get buffer(){return this.nodeUniform.value.array}}class Yw extends xy{constructor(e){super(),this.device=e;this.mipmapSampler=e.createSampler({minFilter:XE}),this.flipYSampler=e.createSampler({minFilter:KE}),this.flipUniformBuffer=e.createBuffer({size:4,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST}),e.queue.writeBuffer(this.flipUniformBuffer,0,new Uint32Array([1])),this.noFlipUniformBuffer=e.createBuffer({size:4,usage:GPUBufferUsage.UNIFORM}),this.transferPipelines={},this.mipmapShaderModule=e.createShaderModule({label:"mipmap",code:"\nstruct VarysStruct {\n\t@builtin( position ) Position: vec4f,\n\t@location( 0 ) vTex : vec2f,\n\t@location( 1 ) @interpolate(flat, either) vBaseArrayLayer: u32,\n};\n\n@group( 0 ) @binding ( 2 )\nvar flipY: u32;\n\n@vertex\nfn mainVS(\n\t\t@builtin( vertex_index ) vertexIndex : u32,\n\t\t@builtin( instance_index ) instanceIndex : u32 ) -> VarysStruct {\n\n\tvar Varys : VarysStruct;\n\n\tvar pos = array(\n\t\tvec2f( -1, -1 ),\n\t\tvec2f( -1, 3 ),\n\t\tvec2f( 3, -1 ),\n\t);\n\n\tlet p = pos[ vertexIndex ];\n\tlet mult = select( vec2f( 0.5, -0.5 ), vec2f( 0.5, 0.5 ), flipY != 0 );\n\tVarys.vTex = p * mult + vec2f( 0.5 );\n\tVarys.Position = vec4f( p, 0, 1 );\n\tVarys.vBaseArrayLayer = instanceIndex;\n\n\treturn Varys;\n\n}\n\n@group( 0 ) @binding( 0 )\nvar imgSampler : sampler;\n\n@group( 0 ) @binding( 1 )\nvar img2d : texture_2d;\n\n@fragment\nfn main_2d( Varys: VarysStruct ) -> @location( 0 ) vec4 {\n\n\treturn textureSample( img2d, imgSampler, Varys.vTex );\n\n}\n\n@group( 0 ) @binding( 1 )\nvar img2dArray : texture_2d_array;\n\n@fragment\nfn main_2d_array( Varys: VarysStruct ) -> @location( 0 ) vec4 {\n\n\treturn textureSample( img2dArray, imgSampler, Varys.vTex, Varys.vBaseArrayLayer );\n\n}\n\nconst faceMat = array(\n mat3x3f( 0, 0, -2, 0, -2, 0, 1, 1, 1 ), // pos-x\n mat3x3f( 0, 0, 2, 0, -2, 0, -1, 1, -1 ), // neg-x\n mat3x3f( 2, 0, 0, 0, 0, 2, -1, 1, -1 ), // pos-y\n mat3x3f( 2, 0, 0, 0, 0, -2, -1, -1, 1 ), // neg-y\n mat3x3f( 2, 0, 0, 0, -2, 0, -1, 1, 1 ), // pos-z\n mat3x3f( -2, 0, 0, 0, -2, 0, 1, 1, -1 ), // neg-z\n);\n\n@group( 0 ) @binding( 1 )\nvar imgCube : texture_cube;\n\n@fragment\nfn main_cube( Varys: VarysStruct ) -> @location( 0 ) vec4 {\n\n\treturn textureSample( imgCube, imgSampler, faceMat[ Varys.vBaseArrayLayer ] * vec3f( fract( Varys.vTex ), 1 ) );\n\n}\n"})}getTransferPipeline(e,t){const r=`${e}-${t=t||"2d-array"}`;let s=this.transferPipelines[r];return void 0===s&&(s=this.device.createRenderPipeline({label:`mipmap-${e}-${t}`,vertex:{module:this.mipmapShaderModule},fragment:{module:this.mipmapShaderModule,entryPoint:`main_${t.replace("-","_")}`,targets:[{format:e}]},layout:"auto"}),this.transferPipelines[r]=s),s}flipY(e,t,r=0){const s=t.format,{width:i,height:n}=t.size,a=this.device.createTexture({size:{width:i,height:n},format:s,usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.TEXTURE_BINDING}),o=this.getTransferPipeline(s,e.textureBindingViewDimension),u=this.getTransferPipeline(s,a.textureBindingViewDimension),l=this.device.createCommandEncoder({}),d=(e,t,r,s,i,n)=>{const a=e.getBindGroupLayout(0),o=this.device.createBindGroup({layout:a,entries:[{binding:0,resource:this.flipYSampler},{binding:1,resource:t.createView({dimension:t.textureBindingViewDimension||"2d-array",baseMipLevel:0,mipLevelCount:1})},{binding:2,resource:{buffer:n?this.flipUniformBuffer:this.noFlipUniformBuffer}}]}),u=l.beginRenderPass({colorAttachments:[{view:s.createView({dimension:"2d",baseMipLevel:0,mipLevelCount:1,baseArrayLayer:i,arrayLayerCount:1}),loadOp:JR,storeOp:YR}]});u.setPipeline(e),u.setBindGroup(0,o),u.draw(3,1,0,r),u.end()};d(o,e,r,a,0,!1),d(u,a,0,e,r,!0),this.device.queue.submit([l.finish()]),a.destroy()}generateMipmaps(e,t=null){const r=this.get(e),s=r.layers||this._mipmapCreateBundles(e),i=t||this.device.createCommandEncoder({label:"mipmapEncoder"});this._mipmapRunBundles(i,s),null===t&&this.device.queue.submit([i.finish()]),r.layers=s}_mipmapCreateBundles(e){const t=e.textureBindingViewDimension||"2d-array",r=this.getTransferPipeline(e.format,t),s=r.getBindGroupLayout(0),i=[];for(let n=1;n0)for(let t=0,n=s.length;t0){for(const s of e.layerUpdates)this._copyBufferToTexture(t.image,r.texture,i,s,e.flipY,s);e.clearLayerUpdates()}else for(let s=0;s0)for(let t=0,n=s.length;t0?e.width:r.size.width,l=a>0?e.height:r.size.height;try{o.queue.copyExternalImageToTexture({source:e,flipY:i},{texture:t,mipLevel:a,origin:{x:0,y:0,z:s},premultipliedAlpha:n},{width:u,height:l,depthOrArrayLayers:1})}catch(e){}}_getPassUtils(){let e=this._passUtils;return null===e&&(this._passUtils=e=new Yw(this.backend.device)),e}_generateMipmaps(e,t=null){this._getPassUtils().generateMipmaps(e,t)}_flipY(e,t,r=0){this._getPassUtils().flipY(e,t,r)}_copyBufferToTexture(e,t,r,s,i,n=0,a=0){const o=this.backend.device,u=e.data,l=this._getBytesPerTexel(r.format),d=e.width*l;o.queue.writeTexture({texture:t,mipLevel:a,origin:{x:0,y:0,z:s}},u,{offset:e.width*e.height*l*n,bytesPerRow:d},{width:e.width,height:e.height,depthOrArrayLayers:1}),!0===i&&this._flipY(t,r,s)}_copyCompressedBufferToTexture(e,t,r){const s=this.backend.device,i=this._getBlockData(r.format),n=r.size.depthOrArrayLayers>1;for(let a=0;a]*\s*([a-z_0-9]+(?:<[\s\S]+?>)?)/i,sC=/([a-z_0-9]+)\s*:\s*([a-z_0-9]+(?:<[\s\S]+?>)?)/gi,iC={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 nC extends oS{constructor(e){const{type:t,inputs:r,name:s,inputsCode:i,blockCode:n,outputType:a}=(e=>{const t=(e=e.trim()).match(rC);if(null!==t&&4===t.length){const r=t[2],s=[];let i=null;for(;null!==(i=sC.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 aC extends aS{parseFunction(e){return new nC(e)}}const oC={[si.READ_ONLY]:"read",[si.WRITE_ONLY]:"write",[si.READ_WRITE]:"read_write"},uC={[Gr]:"repeat",[ve]:"clamp",[kr]:"mirror"},lC={vertex:zR.VERTEX,fragment:zR.FRAGMENT,compute:zR.COMPUTE},dC={instance:!0,swizzleAssign:!1,storageBuffer:!0},cC={"^^":"tsl_xor"},hC={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"},pC={},gC={tsl_xor:new cT("fn tsl_xor( a : bool, b : bool ) -> bool { return ( a || b ) && !( a && b ); }"),mod_float:new cT("fn tsl_mod_float( x : f32, y : f32 ) -> f32 { return x - y * floor( x / y ); }"),mod_vec2:new cT("fn tsl_mod_vec2( x : vec2f, y : vec2f ) -> vec2f { return x - y * floor( x / y ); }"),mod_vec3:new cT("fn tsl_mod_vec3( x : vec3f, y : vec3f ) -> vec3f { return x - y * floor( x / y ); }"),mod_vec4:new cT("fn tsl_mod_vec4( x : vec4f, y : vec4f ) -> vec4f { return x - y * floor( x / y ); }"),equals_bool:new cT("fn tsl_equals_bool( a : bool, b : bool ) -> bool { return a == b; }"),equals_bvec2:new cT("fn tsl_equals_bvec2( a : vec2f, b : vec2f ) -> vec2 { return vec2( a.x == b.x, a.y == b.y ); }"),equals_bvec3:new cT("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 cT("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 cT("fn tsl_repeatWrapping_float( coord: f32 ) -> f32 { return fract( coord ); }"),mirrorWrapping_float:new cT("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 cT("fn tsl_clampWrapping_float( coord: f32 ) -> f32 { return clamp( coord, 0.0, 1.0 ); }"),biquadraticTexture:new cT("\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"),biquadraticTextureArray:new cT("\nfn tsl_biquadraticTexture_array( map : texture_2d_array, coord : vec2f, iRes : vec2u, layer : u32, 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, layer, level );\n\tlet rg2 = textureLoad( map, vec2u( iuv + vec2( 1.5, 0.5 ) ) % iRes, layer, level );\n\tlet rg3 = textureLoad( map, vec2u( iuv + vec2( 0.5, 1.5 ) ) % iRes, layer, level );\n\tlet rg4 = textureLoad( map, vec2u( iuv + vec2( 1.5, 1.5 ) ) % iRes, layer, level );\n\n\treturn mix( mix( rg1, rg2, f.x ), mix( rg3, rg4, f.x ), f.y );\n\n}\n")},mC={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",floatpack_snorm_2x16:"pack2x16snorm",floatpack_unorm_2x16:"pack2x16unorm",floatpack_float16_2x16:"pack2x16float",floatunpack_snorm_2x16:"unpack2x16snorm",floatunpack_unorm_2x16:"unpack2x16unorm",floatunpack_float16_2x16:"unpack2x16float"};let fC="";!0!==("undefined"!=typeof navigator&&/Firefox|Deno/g.test(navigator.userAgent))&&(fC+="diagnostic( off, derivative_uniformity );\n");class yC extends HN{constructor(e,t){super(e,t,new aC),this.uniformGroups={},this.uniformGroupsBindings={},this.builtins={},this.directives={},this.scopedArrays=new Map}_generateTextureSample(e,t,r,s,i,n=this.shaderStage){return"fragment"===n?s?i?`textureSample( ${t}, ${t}_sampler, ${r}, ${s}, ${i} )`:`textureSample( ${t}, ${t}_sampler, ${r}, ${s} )`:i?`textureSample( ${t}, ${t}_sampler, ${r}, ${i} )`:`textureSample( ${t}, ${t}_sampler, ${r} )`:this.generateTextureSampleLevel(e,t,r,"0",s)}generateTextureSampleLevel(e,t,r,s,i,n){return!1===this.isUnfilterable(e)?i?n?`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${i}, ${s}, ${n} )`:`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${i}, ${s} )`:n?`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${s}, ${n} )`:`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${s} )`:this.isFilteredTexture(e)?this.generateFilteredTexture(e,t,r,n,s,i):this.generateTextureLod(e,t,r,i,n,s)}generateWrapFunction(e){const t=`tsl_coord_${uC[e.wrapS]}S_${uC[e.wrapT]}_${e.is3DTexture||e.isData3DTexture?"3d":"2d"}T`;let r=pC[t];if(void 0===r){const s=[],i=e.is3DTexture||e.isData3DTexture?"vec3f":"vec2f";let n=`fn ${t}( coord : ${i} ) -> ${i} {\n\n\treturn ${i}(\n`;const a=(e,t)=>{e===Gr?(s.push(gC.repeatWrapping_float),n+=`\t\ttsl_repeatWrapping_float( coord.${t} )`):e===ve?(s.push(gC.clampWrapping_float),n+=`\t\ttsl_clampWrapping_float( coord.${t} )`):e===kr?(s.push(gC.mirrorWrapping_float),n+=`\t\ttsl_mirrorWrapping_float( coord.${t} )`):(n+=`\t\tcoord.${t}`,d(`WebGPURenderer: Unsupported texture wrap type "${e}" for vertex shader.`))};a(e.wrapS,"x"),n+=",\n",a(e.wrapT,"y"),(e.is3DTexture||e.isData3DTexture)&&(n+=",\n",a(e.wrapR,"z")),n+="\n\t);\n\n}\n",pC[t]=r=new cT(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.is3DTexture||e.isData3DTexture?"vec3":"vec2",n=u||e.isStorageTexture?t:`${t}${r?`, u32( ${r} )`:""}`,i=new wu(new gl(`textureDimensions( ${n} )`,a)),s.dimensionsSnippet[r]=i,(e.isArrayTexture||e.isDataArrayTexture||e.is3DTexture||e.isData3DTexture)&&(s.arrayLayerCount=new wu(new gl(`textureNumLayers(${t})`,"u32"))),e.isTextureCube&&(s.cubeFaceCount=new wu(new gl("6u","u32")))}return i.build(this)}generateFilteredTexture(e,t,r,s,i="0u",n){const a=this.generateWrapFunction(e),o=this.generateTextureDimension(e,t,i);return s&&(r=`${r} + vec2(${s}) / ${o}`),n?(this._include("biquadraticTextureArray"),`tsl_biquadraticTexture_array( ${t}, ${a}( ${r} ), ${o}, u32( ${n} ), u32( ${i} ) )`):(this._include("biquadraticTexture"),`tsl_biquadraticTexture( ${t}, ${a}( ${r} ), ${o}, u32( ${i} ) )`)}generateTextureLod(e,t,r,s,i,n="0u"){if(!0===e.isCubeTexture){i&&(r=`${r} + vec3(${i})`);return`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${e.isDepthTexture?"u32":"f32"}( ${n} ) )`}const a=this.generateWrapFunction(e),o=this.generateTextureDimension(e,t,n),u=e.is3DTexture||e.isData3DTexture?"vec3":"vec2";i&&(r=`${r} + ${u}(${i}) / ${u}( ${o} )`);return r=`${u}( clamp( floor( ${a}( ${r} ) * ${u}( ${o} ) ), ${`${u}( 0 )`}, ${`${u}( ${o} - ${"vec3"===u?"vec3( 1, 1, 1 )":"vec2( 1, 1 )"} )`} ) )`,this.generateTextureLoad(e,t,r,n,s,null)}generateStorageTextureLoad(e,t,r,s,i,n){let a;return n&&(r=`${r} + ${n}`),a=i?`textureLoad( ${t}, ${r}, ${i} )`:`textureLoad( ${t}, ${r} )`,a}generateTextureLoad(e,t,r,s,i,n){let a;return null===s&&(s="0u"),n&&(r=`${r} + ${n}`),i?a=`textureLoad( ${t}, ${r}, ${i}, u32( ${s} ) )`:(a=`textureLoad( ${t}, ${r}, u32( ${s} ) )`,this.renderer.backend.compatibilityMode&&e.isDepthTexture&&(a+=".x")),a}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&&this.renderer.hasCompatibility(A.TEXTURE_COMPARE)}isUnfilterable(e){return"float"!==this.getComponentTypeFromTexture(e)||!this.isAvailable("float32Filterable")&&e.type===Q||!1===this.isSampleCompare(e)&&e.minFilter===B&&e.magFilter===B||this.renderer.backend.utils.getTextureSampleData(e).primarySamples>1}generateTexture(e,t,r,s,i,n=this.shaderStage){let a=null;return a=this.isUnfilterable(e)?this.generateTextureLod(e,t,r,s,i,"0",n):this._generateTextureSample(e,t,r,s,i,n),a}generateTextureGrad(e,t,r,s,i,n,a=this.shaderStage){if("fragment"===a)return i?n?`textureSampleGrad( ${t}, ${t}_sampler, ${r}, ${i}, ${s[0]}, ${s[1]}, ${n} )`:`textureSampleGrad( ${t}, ${t}_sampler, ${r}, ${i}, ${s[0]}, ${s[1]} )`:n?`textureSampleGrad( ${t}, ${t}_sampler, ${r}, ${s[0]}, ${s[1]}, ${n} )`:`textureSampleGrad( ${t}, ${t}_sampler, ${r}, ${s[0]}, ${s[1]} )`;o(`WebGPURenderer: THREE.TextureNode.gradient() does not support ${a} shader.`)}generateTextureCompare(e,t,r,s,i,n,a=this.shaderStage){if("fragment"===a)return!0===e.isDepthTexture&&!0===e.isArrayTexture?n?`textureSampleCompare( ${t}, ${t}_sampler, ${r}, ${i}, ${s}, ${n} )`:`textureSampleCompare( ${t}, ${t}_sampler, ${r}, ${i}, ${s} )`:n?`textureSampleCompare( ${t}, ${t}_sampler, ${r}, ${s}, ${n} )`:`textureSampleCompare( ${t}, ${t}_sampler, ${r}, ${s} )`;o(`WebGPURenderer: THREE.DepthTexture.compareFunction() does not support ${a} shader.`)}generateTextureLevel(e,t,r,s,i,n){return!1===this.isUnfilterable(e)?i?n?`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${i}, ${s}, ${n} )`:`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${i}, ${s} )`:n?`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${s}, ${n} )`:`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${s} )`:this.isFilteredTexture(e)?this.generateFilteredTexture(e,t,r,n,s,i):this.generateTextureLod(e,t,r,i,n,s)}generateTextureBias(e,t,r,s,i,n,a=this.shaderStage){if("fragment"===a)return i?n?`textureSampleBias( ${t}, ${t}_sampler, ${r}, ${i}, ${s}, ${n} )`:`textureSampleBias( ${t}, ${t}_sampler, ${r}, ${i}, ${s} )`:n?`textureSampleBias( ${t}, ${t}_sampler, ${r}, ${s}, ${n} )`:`textureSampleBias( ${t}, ${t}_sampler, ${r}, ${s} )`;o(`WebGPURenderer: THREE.TextureNode.biasNode does not support ${a} 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||"cubeDepthTexture"===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=cC[e];return void 0!==t?(this._include(t),t):null}getNodeAccess(e,t){return"compute"!==t?!0===e.isAtomic?(d("WebGPURenderer: Atomic operations are only supported in compute shaders."),si.READ_WRITE):si.READ_ONLY:e.access}getStorageAccess(e,t){return oC[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||"cubeDepthTexture"===t||"storageTexture"===t||"texture3D"===t){let s=null;const n=this.getNodeAccess(e,r);"texture"===t||"storageTexture"===t?s=!0===e.value.is3DTexture?new aR(i.name,i.node,o,n):new iR(i.name,i.node,o,n):"cubeTexture"===t||"cubeDepthTexture"===t?s=new nR(i.name,i.node,o,n):"texture3D"===t&&(s=new aR(i.name,i.node,o,n)),s.store=!0===e.isStorageTextureNode,s.mipLevel=s.store?e.mipLevel:0,s.setVisibility(lC[r]);if(!0===e.value.isCubeTexture||!1===this.isUnfilterable(e.value)&&!1===s.store){const e=new jw(`${i.name}_sampler`,i.node,o);e.setVisibility(lC[r]),l.push(e,s),a=[e,s]}else l.push(s),a=[s]}else if("buffer"===t||"storageBuffer"===t||"indirectStorageBuffer"===t){const n=this.getSharedDataFromNode(e);let u=n.buffer;if(void 0===u){u=new("buffer"===t?YS:Qw)(e,o),n.buffer=u}u.setVisibility(u.getVisibility()|lC[r]),l.push(u),a=u,i.name=s||"NodeBuffer_"+i.id}else{let e=this.uniformGroups[u];void 0===e&&(e=new eR(u,o),e.setVisibility(zR.VERTEX|zR.FRAGMENT|zR.COMPUTE),this.uniformGroups[u]=e),-1===l.indexOf(e)&&l.push(e),a=this.getNodeUniform(i,t);const r=a.name;e.uniforms.some(e=>e.name===r)||e.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","builtinClipSpace","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||"cubeDepthTexture"===i.type||"storageTexture"===i.type||"texture3D"===i.type){const t=i.node.value;let s;(!0===t.isCubeTexture||!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&&!0===t.isDepthTexture)s="texture_depth_cube";else if(!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=tC(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=i.groupNode.name;if(void 0===n[e]){const t=this.uniformGroups[e];if(void 0!==t){const r=[];for(const e of t.uniforms){const t=e.getType(),s=this.getType(this.getVectorType(t));r.push(`\t${e.name} : ${s}`)}let s=this.uniformGroupsBindings[e];void 0===s&&(s={index:a.binding++,id:a.group},this.uniformGroupsBindings[e]=s),n[e]={index:s.index,id:s.id,snippets:r}}}}}for(const e in n){const t=n[e];i.push(this._getWGSLStructBinding(e,t.snippets.join(",\n"),"uniform",t.index,t.id))}return[...r,...s,...i].join("\n")}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.builtinClipSpace = ${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}getBitcastMethod(e){return`bitcast<${this.getType(e)}>`}getFloatPackingMethod(e){return this.getMethod(`floatpack_${e}_2x16`)}getFloatUnpackingMethod(e){return this.getMethod(`floatunpack_${e}_2x16`)}getTernary(e,t,r){return`select( ${r}, ${t}, ${e} )`}getType(e){return hC[e]||e}isAvailable(e){let t=dC[e];return void 0===t&&("float32Filterable"===e?t=this.renderer.hasFeature("float32-filterable"):"clipDistance"===e&&(t=this.renderer.hasFeature("clip-distances")),dC[e]=t),t}_getWGSLMethod(e){return void 0!==gC[e]&&this._include(e),mC[e]}_include(e){const t=gC[e];return t.build(this),this.addInclude(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${fC}\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 bC{constructor(e){this.backend=e}getCurrentDepthStencilFormat(e){let t;return e.depth&&(t=null!==e.depthTexture?this.getTextureFormatGPU(e.depthTexture):e.stencil?WA:$A),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.currentSamples}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}getCurrentColorFormats(e){return null!==e.textures?e.textures.map(e=>this.getTextureFormatGPU(e)):[this.getPreferredCanvasFormat()]}getCurrentColorSpace(e){return null!==e.textures?e.textures[0].colorSpace:this.backend.renderer.outputColorSpace}getPrimitiveTopology(e,t){return e.isPoints?OR:e.isLineSegments||e.isMesh&&!0===t.wireframe?VR:e.isLine?kR:e.isMesh?GR:void 0}getSampleCount(e){return e>=4?4:1}getSampleCountRenderContext(e){return null!==e.textures?this.getSampleCount(e.sampleCount):this.getSampleCount(this.backend.renderer.currentSamples)}getPreferredCanvasFormat(){const e=this.backend.parameters.outputType;if(void 0===e)return navigator.gpu.getPreferredCanvasFormat();if(e===ke)return wA;if(e===_e)return OA;throw new Error("Unsupported output buffer type.")}}const xC=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&&xC.set(Float16Array,["float16"]);const TC=new Map([[bt,["float16"]]]),_C=new Map([[Int32Array,"sint32"],[Int16Array,"sint32"],[Uint32Array,"uint32"],[Uint16Array,"uint32"],[Float32Array,"float32"]]);class vC{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;e0&&(void 0===n.groups&&(n.groups=[],n.versions=[]),n.versions[r]===s&&(o=n.groups[r])),void 0===o&&(o=this.createBindGroup(e,a),r>0&&(n.groups[r]=o,n.versions[r]=s)),n.group=o}updateBinding(e){const t=this.backend,r=t.device,s=e.buffer,i=t.get(e).buffer,n=e.updateRanges;if(0===n.length)r.queue.writeBuffer(i,0,s,0);else{const e=Kr(s),t=e?1:s.BYTES_PER_ELEMENT;for(let a=0,o=n.length;a1&&(i+=`-${e.texture.depthOrArrayLayers}`),i+=`-${r}-${s}`,a=e[i],void 0===a){const n=zw;let o;o=t.isSampledCubeTexture?kw:t.isSampledTexture3D?Gw:t.texture.isArrayTexture||t.texture.isDataArrayTexture||t.texture.isCompressedArrayTexture?Vw:Ow,a=e[i]=e.texture.createView({aspect:n,dimension:o,mipLevelCount:r,baseMipLevel:s})}}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})}_createLayoutEntries(e){const t=[];let r=0;for(const s of e.bindings){const e=this.backend,i={binding:r,visibility:s.visibility};if(s.isUniformBuffer||s.isStorageBuffer){const e={};s.isStorageBuffer&&(s.visibility&zR.COMPUTE&&(s.access===si.READ_WRITE||s.access===si.WRITE_ONLY)?e.type=Sw:e.type=Rw),i.buffer=e}else if(s.isSampledTexture&&s.store){const e={};e.format=this.backend.get(s.texture).texture.format;const t=s.access;e.access=t===si.READ_WRITE?ww:t===si.WRITE_ONLY?Aw:Ew,s.texture.isArrayTexture?e.viewDimension=Vw:s.texture.is3DTexture&&(e.viewDimension=Gw),i.storageTexture=e}else if(s.isSampledTexture){const t={},{primarySamples:r}=e.utils.getTextureSampleData(s.texture);if(r>1&&(t.multisampled=!0,s.texture.isDepthTexture||(t.sampleType=Fw)),s.texture.isDepthTexture)e.compatibilityMode&&null===s.texture.compareFunction?t.sampleType=Fw:t.sampleType=Lw;else if(s.texture.isDataTexture||s.texture.isDataArrayTexture||s.texture.isData3DTexture||s.texture.isStorageTexture){const e=s.texture.type;e===R?t.sampleType=Pw:e===S?t.sampleType=Dw:e===Q&&(this.backend.hasFeature("float32-filterable")?t.sampleType=Bw:t.sampleType=Fw)}s.isSampledCubeTexture?t.viewDimension=kw:s.texture.isArrayTexture||s.texture.isDataArrayTexture||s.texture.isCompressedArrayTexture?t.viewDimension=Vw:s.isSampledTexture3D&&(t.viewDimension=Gw),i.texture=t}else if(s.isSampler){const t={};s.texture.isDepthTexture&&(null!==s.texture.compareFunction&&e.hasCompatibility(A.TEXTURE_COMPARE)?t.type=Mw:t.type=Cw),i.sampler=t}else o(`WebGPUBindingUtils: Unsupported binding "${s}".`);t.push(i),r++}return t}deleteBindGroupData(e){const{backend:t}=this,r=t.get(e);r.layout&&(r.layout.usedTimes--,0===r.layout.usedTimes&&this._bindGroupLayoutCache.delete(r.layoutKey),r.layout=void 0,r.layoutKey=void 0)}dispose(){this._bindGroupLayoutCache.clear()}}class RC{constructor(e){this.backend=e}getMaxAnisotropy(){return 16}getUniformBufferLimit(){return this.backend.device.limits.maxUniformBufferBindingSize}}class AC{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:u}=n,l=this.backend,d=l.device,c=l.utils,h=l.get(n),p=[];for(const t of e.getBindings()){const e=l.get(t),{layoutGPU:r}=e.layout;p.push(r)}const g=l.attributeUtils.createShaderVertexBuffers(e);let m;s.blending===se||s.blending===et&&!1===s.transparent||(m=this._getBlending(s));let f={};!0===s.stencilWrite&&(f={compare:this._getStencilCompare(s),failOp:this._getStencilOperation(s.stencilFail),depthFailOp:this._getStencilOperation(s.stencilZFail),passOp:this._getStencilOperation(s.stencilZPass)});const y=this._getColorWriteMask(s),b=[];if(null!==e.context.textures){const t=e.context.textures,r=e.context.mrt;for(let e=0;e1},layout:d.createPipelineLayout({bindGroupLayouts:p})},E={},w=e.context.depth,C=e.context.stencil;if(!0!==w&&!0!==C||(!0===w&&(E.format=S,E.depthWriteEnabled=s.depthWrite,E.depthCompare=N),!0===C&&(E.stencilFront=f,E.stencilBack=f,E.stencilReadMask=s.stencilFuncMask,E.stencilWriteMask=s.stencilWriteMask),!0===s.polygonOffset&&(E.depthBias=s.polygonOffsetUnits,E.depthBiasSlopeScale=s.polygonOffsetFactor,E.depthBiasClamp=0),A.depthStencil=E),d.pushErrorScope("validation"),null===t)h.pipeline=d.createRenderPipeline(A),d.popErrorScope().then(e=>{null!==e&&(h.error=!0,o(e.message))});else{const e=new Promise(async e=>{try{h.pipeline=await d.createRenderPipelineAsync(A)}catch(e){}const t=await d.popErrorScope();null!==t&&(h.error=!0,o(t.message)),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.getCurrentColorFormats(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),{layoutGPU:s}=t.layout;a.push(s)}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===St){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:lw},r={srcFactor:i,dstFactor:n,operation:lw}};if(e.premultipliedAlpha)switch(s){case et:i(YE,tw,YE,tw);break;case Zt:i(YE,YE,YE,YE);break;case Yt:i(QE,JE,QE,YE);break;case Qt:i(rw,tw,QE,YE)}else switch(s){case et:i(ew,tw,YE,tw);break;case Zt:i(ew,YE,YE,YE);break;case Yt:o(`WebGPURenderer: "SubtractiveBlending" requires "${e.isMaterial?"material":"blendMode"}.premultipliedAlpha = true".`);break;case Qt:o(`WebGPURenderer: "MultiplyBlending" requires "${e.isMaterial?"material":"blendMode"}.premultipliedAlpha = true".`)}}if(void 0!==t&&void 0!==r)return{color:t,alpha:r};o("WebGPURenderer: Invalid blending: ",s)}_getBlendFactor(e){let t;switch(e){case Rt:t=QE;break;case qt:t=YE;break;case Ht:t=ZE;break;case Gt:t=JE;break;case tt:t=ew;break;case rt:t=tw;break;case $t:t=rw;break;case kt:t=sw;break;case zt:t=iw;break;case Vt:t=nw;break;case Wt:t=aw;break;case 211:t=ow;break;case 212:t=uw;break;default:o("WebGPURenderer: Blend factor not supported.",e)}return t}_getStencilCompare(e){let t;const r=e.stencilFunc;switch(r){case ss:t=$R;break;case rs:t=QR;break;case ts:t=WR;break;case es:t=qR;break;case Jr:t=HR;break;case Zr:t=KR;break;case Yr:t=jR;break;case Qr:t=XR;break;default:o("WebGPURenderer: Invalid stencil function.",r)}return t}_getStencilOperation(e){let t;switch(e){case cs:t=fw;break;case ds:t=yw;break;case ls:t=bw;break;case us:t=xw;break;case os:t=Tw;break;case as:t=_w;break;case ns:t=vw;break;case is:t=Nw;break;default:o("WebGPURenderer: Invalid stencil operation.",t)}return t}_getBlendOperation(e){let t;switch(e){case st:t=lw;break;case Ot:t=dw;break;case It:t=cw;break;case ps:t=hw;break;case hs:t=pw;break;default:o("WebGPUPipelineUtils: Blend equation not supported.",e)}return t}_getPrimitiveState(e,t,r){const s={},i=this.backend.utils;s.topology=i.getPrimitiveTopology(e,r),null!==t.index&&!0===e.isLine&&!0!==e.isLineSegments&&(s.stripIndexFormat=t.index.array instanceof Uint16Array?iA:nA);let n=r.side===L;return e.isMesh&&e.matrixWorld.determinant()<0&&(n=!n),s.frontFace=!0===n?tA:eA,s.cullMode=r.side===P?rA:sA,s}_getColorWriteMask(e){return!0===e.colorWrite?mw:gw}_getDepthCompare(e){let t;if(!1===e.depthTest)t=QR;else{const r=this.backend.parameters.reversedDepthBuffer?or[e.depthFunc]:e.depthFunc;switch(r){case ar:t=$R;break;case nr:t=QR;break;case ir:t=WR;break;case sr:t=qR;break;case rr:t=HR;break;case tr:t=KR;break;case er:t=jR;break;case Jt:t=XR;break;default:o("WebGPUPipelineUtils: Invalid depth function.",r)}}return t}}class EC extends DR{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 v(`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,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)),a={},o=[];for(const[t,r]of e){const e=t.match(/^(.*):f(\d+)$/),s=parseInt(e[2]);!1===o.includes(s)&&o.push(s),void 0===a[s]&&(a[s]=0);const i=n[r],u=n[r+1],l=Number(u-i)/1e6;this.timestamps.set(t,l),a[s]+=l}const u=a[o[o.length-1]];return this.resultBuffer.unmap(),this.lastValue=u,this.frames=o,u}catch(e){return o("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){o("Error waiting for pending resolve:",e)}if(this.resultBuffer&&"mapped"===this.resultBuffer.mapState)try{this.resultBuffer.unmap()}catch(e){o("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 wC extends yR{constructor(e={}){super(e),this.isWebGPUBackend=!0,this.parameters.alpha=void 0===e.alpha||e.alpha,this.parameters.requiredLimits=void 0===e.requiredLimits?{}:e.requiredLimits,this.compatibilityMode=null,this.device=null,this.defaultRenderPassdescriptor=null,this.utils=new bC(this),this.attributeUtils=new vC(this),this.bindingUtils=new SC(this),this.capabilities=new RC(this),this.pipelineUtils=new AC(this),this.textureUtils=new eC(this),this.occludedResolveCache=new Map;const t="undefined"==typeof navigator||!1===/Android/.test(navigator.userAgent);this._compatibility={[A.TEXTURE_COMPARE]:t}}async init(e){await super.init(e);const t=this.parameters;let r;if(void 0===t.device){const e={powerPreference:t.powerPreference,featureLevel:"compatibility"},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(Hw),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;this.compatibilityMode=!r.features.has("core-features-and-limits"),this.compatibilityMode&&(e._samples=0),r.lost.then(t=>{if("destroyed"===t.reason)return;const r={api:"WebGPU",message:t.message||"Unknown reason",reason:t.reason||null,originalEvent:t};e.onDeviceLost(r)}),this.device=r,this.trackTimestamp=this.trackTimestamp&&this.hasFeature(Hw.TimestampQuery),this.updateSize()}get context(){const e=this.renderer.getCanvasTarget(),t=this.get(e);let r=t.context;if(void 0===r){const s=this.parameters;r=!0===e.isDefaultCanvasTarget&&void 0!==s.context?s.context:e.domElement.getContext("webgpu"),"setAttribute"in e.domElement&&e.domElement.setAttribute("data-engine",`three.js r${Tt} webgpu`);const i=s.alpha?"premultiplied":"opaque",n=s.outputType===_e?"extended":"standard";r.configure({device:this.device,format:this.utils.getPreferredCanvasFormat(),usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.COPY_SRC,alphaMode:i,toneMapping:{mode:n}}),t.context=r}return r}get coordinateSystem(){return h}async getArrayBufferAsync(e){return await this.attributeUtils.getArrayBufferAsync(e)}getContext(){return this.context}_getDefaultRenderPassDescriptor(){const e=this.renderer,t=e.getCanvasTarget(),r=this.get(t),s=e.currentSamples;let i=r.descriptor;if(void 0===i||r.samples!==s){i={colorAttachments:[{view:null}]},!0!==e.depth&&!0!==e.stencil||(i.depthStencilAttachment={view:this.textureUtils.getDepthBuffer(e.depth,e.stencil).createView()});const t=i.colorAttachments[0];s>0?t.view=this.textureUtils.getColorBuffer().createView():t.resolveTarget=void 0,r.descriptor=i,r.samples=s}const n=i.colorAttachments[0];return s>0?n.resolveTarget=this.context.getCurrentTexture().createView():n.view=this.context.getCurrentTexture().createView(),i}_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;void 0!==i&&s.width===r.width&&s.height===r.height&&s.samples===r.samples||(i={},s.descriptors=i);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:ZR}),this.initTimestampQuery(Dt.RENDER,this.getTimestampUID(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;eo&&(i[0]=Math.min(a,o),i[1]=Math.ceil(a/o)),n.dispatchSize=i}i=n.dispatchSize}a.dispatchWorkgroups(i[0],i[1]||1,i[2]||1)}finishCompute(e){const t=this.get(e);t.passEncoderGPU.end(),this.device.queue.submit([t.cmdEncoderGPU.finish()])}_draw(e,t,r,s,i,n,a,o,u){const{object:l,material:d,context:c}=e,h=e.getIndex(),p=null!==h;this.pipelineUtils.setPipeline(o,s),u.pipeline=s;const g=u.bindingGroups;for(let e=0,t=i.length;e65535?4:2);for(let a=0;a1?0:a;!0===p?o.drawIndexed(r[a],s,e[a]/n,0,u):o.draw(r[a],s,e[a],u),t.update(l,r[a],s)}}else if(!0===p){const{vertexCount:r,instanceCount:s,firstVertex:i}=a,n=e.getIndirect();if(null!==n){const t=this.get(n).buffer,r=e.getIndirectOffset(),s=Array.isArray(r)?r:[r];for(let e=0;e0){const i=this.get(e.camera),a=e.camera.cameras,c=e.getBindingGroup("cameraIndex");if(void 0===i.indexesGPU||i.indexesGPU.length!==a.length){const e=this.get(c),t=[],r=new Uint32Array([0,0,0,0]);for(let s=0,i=a.length;s(d("WebGPURenderer: WebGPU is not available, running under WebGL2 backend."),new IR(e)));super(new t(e),e),this.library=new BC,this.isWebGPURenderer=!0,"undefined"!=typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe",{detail:this}))}}class LC extends Es{constructor(){super(),this.isBundleGroup=!0,this.type="BundleGroup",this.static=!0,this.version=0}set needsUpdate(e){!0===e&&this.version++}}class PC{constructor(e,t=wn(0,0,1,1)){this.renderer=e,this.outputNode=t,this.outputColorTransform=!0,this.needsUpdate=!0;const r=new fg;r.name="RenderPipeline",this._quadMesh=new ux(r),this._quadMesh.name="Render Pipeline",this._context=null}render(){const e=this.renderer;this._update(),null!==this._context.onBeforeRenderPipeline&&this._context.onBeforeRenderPipeline();const t=e.toneMapping,r=e.outputColorSpace;e.toneMapping=m,e.outputColorSpace=p.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.onAfterRenderPipeline&&this._context.onAfterRenderPipeline()}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={renderPipeline:this,onBeforeRenderPipeline:null,onAfterRenderPipeline:null};let i=this.outputNode;!0===this.outputColorTransform?(i=i.context(s),i=bl(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(){v('RenderPipeline: "renderAsync()" has been deprecated. Use "render()" and "await renderer.init();" when creating the renderer.'),await this.renderer.init(),this.render()}}class DC extends PC{constructor(e,t){v('PostProcessing: "PostProcessing" has been renamed to "RenderPipeline". Please update your code to use "THREE.RenderPipeline" instead.'),super(e,t)}}class UC extends N{constructor(e=1,t=1){super(),this.image={width:e,height:t},this.magFilter=de,this.minFilter=de,this.isStorageTexture=!0,this.mipmapsAutoUpdate=!0}setSize(e,t){this.image.width===e&&this.image.height===t||(this.image.width=e,this.image.height=t,this.dispose())}}class IC extends N{constructor(e=1,t=1,r=1){super(),this.isArrayTexture=!1,this.image={width:e,height:t,depth:r},this.magFilter=de,this.minFilter=de,this.wrapR=ve,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 OC extends N{constructor(e=1,t=1,r=1){super(),this.isArrayTexture=!0,this.image={width:e,height:t,depth:r},this.magFilter=de,this.minFilter=de,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 VC extends _x{constructor(e,t){super(e,t,Uint32Array),this.isIndirectStorageBufferAttribute=!0}}class kC extends ws{constructor(e){super(e),this.textures={},this.nodes={}}load(e,t,r,s){const i=new Cs(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):o(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]?(o("NodeLoader: Node type not found:",e),fn()):new this.nodes[e]}}class GC extends Ms{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 zC extends Bs{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 kC;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 GC;i.setTextures(t),i.setNodes(s),i.setNodeMaterials(this.nodeMaterials);for(let t=0,s=e.length;t 2 ? size : 0, size, size ); + this._setViewport( cubeUVRenderTarget, col * size, i > 2 ? size : 0, size, size ); renderer.render( scene, cubeCamera ); @@ -26041,9 +26044,7 @@ class PMREMGenerator { mesh.material = material; const size = this._cubeSize; - - _setViewport( cubeUVRenderTarget, 0, 0, 3 * size, 2 * size ); - + this._setViewport( cubeUVRenderTarget, 0, 0, 3 * size, 2 * size ); renderer.setRenderTarget( cubeUVRenderTarget ); renderer.render( mesh, _flatCamera ); @@ -26111,7 +26112,7 @@ class PMREMGenerator { ggxUniforms.roughness.value = adjustedRoughness; ggxUniforms.mipInt.value = _lodMax - lodIn; // Sample from input LOD - _setViewport( pingPongRenderTarget, x, y, 3 * outputSize, 2 * outputSize ); + this._setViewport( pingPongRenderTarget, x, y, 3 * outputSize, 2 * outputSize ); renderer.setRenderTarget( pingPongRenderTarget ); renderer.render( ggxMesh, _flatCamera ); @@ -26121,7 +26122,7 @@ class PMREMGenerator { ggxUniforms.roughness.value = 0.0; // Direct copy ggxUniforms.mipInt.value = _lodMax - lodOut; // Read from the level we just wrote - _setViewport( cubeUVRenderTarget, x, y, 3 * outputSize, 2 * outputSize ); + this._setViewport( cubeUVRenderTarget, x, y, 3 * outputSize, 2 * outputSize ); renderer.setRenderTarget( cubeUVRenderTarget ); renderer.render( ggxMesh, _flatCamera ); @@ -26247,12 +26248,29 @@ class PMREMGenerator { const x = 3 * outputSize * ( lodOut > _lodMax - LOD_MIN ? lodOut - _lodMax + LOD_MIN : 0 ); const y = 4 * ( this._cubeSize - outputSize ); - _setViewport( targetOut, x, y, 3 * outputSize, 2 * outputSize ); + this._setViewport( targetOut, x, y, 3 * outputSize, 2 * outputSize ); renderer.setRenderTarget( targetOut ); renderer.render( blurMesh, _flatCamera ); } + _setViewport( target, x, y, width, height ) { + + if ( this._renderer.isWebGLRenderer ) { + + target.viewport.set( x, target.height - height - y, width, height ); + target.scissor.set( x, target.height - height - y, width, height ); + + } else { + + target.viewport.set( x, y, width, height ); + target.scissor.set( x, y, width, height ); + + } + + } + + } function _createPlanes( lodMax ) { @@ -26358,13 +26376,6 @@ function _createRenderTarget( width, height ) { } -function _setViewport( target, x, y, width, height ) { - - target.viewport.set( x, y, width, height ); - target.scissor.set( x, y, width, height ); - -} - function _getMaterial( type ) { const material = new NodeMaterial(); @@ -29011,7 +29022,7 @@ class Animation { */ stop() { - this._context.cancelAnimationFrame( this._requestId ); + if ( this._context !== null ) this._context.cancelAnimationFrame( this._requestId ); this._requestId = null; @@ -38229,19 +38240,14 @@ class StorageTextureNode extends TextureNode { */ generate( builder, output ) { - let snippet; - if ( this.storeNode !== null ) { - snippet = this.generateStore( builder ); - - } else { - - snippet = super.generate( builder, output ); + this.generateStore( builder ); + return ''; } - return snippet; + return super.generate( builder, output ); } @@ -38316,7 +38322,7 @@ class StorageTextureNode extends TextureNode { const storeSnippet = storeNode.build( builder, 'vec4' ); const depthSnippet = depthNode ? depthNode.build( builder, 'int' ) : null; - const snippet = builder.generateTextureStore( builder, textureProperty, uvSnippet, depthSnippet, storeSnippet ); + const snippet = builder.generateTextureStore( this.value, textureProperty, uvSnippet, depthSnippet, storeSnippet ); builder.addLineFlowCode( snippet, this ); @@ -42754,14 +42760,12 @@ class LightsNode extends Node { if ( previousLightNodes !== null ) { - lightNode = getLightNodeById( light.id, previousLightNodes ); // reuse existing light node + lightNode = getLightNodeById( light.id, previousLightNodes ); } if ( lightNode === null ) { - // find the corresponding node type for a given light - const lightNodeClass = nodeLibrary.getLightNodeClass( light.constructor ); if ( lightNodeClass === null ) { @@ -42771,23 +42775,18 @@ class LightsNode extends Node { } - let lightNode = null; + if ( _lightsNodeRef.has( light ) === false ) { - if ( ! _lightsNodeRef.has( light ) ) { - - lightNode = new lightNodeClass( light ); - _lightsNodeRef.set( light, lightNode ); - - } else { - - lightNode = _lightsNodeRef.get( light ); + _lightsNodeRef.set( light, new lightNodeClass( light ) ); } - lightNodes.push( lightNode ); + lightNode = _lightsNodeRef.get( light ); } + lightNodes.push( lightNode ); + } } @@ -42866,8 +42865,6 @@ class LightsNode extends Node { builder.lightsNode = this; - // - let outgoingLightNode = this.outgoingLightNode; const context = builder.context; @@ -42883,16 +42880,10 @@ class LightsNode extends Node { const stack = builder.addStack(); - // - properties.nodes = stack.nodes; - // - lightingModel.start( builder ); - // - const { backdrop, backdropAlpha } = context; const { directDiffuse, directSpecular, indirectDiffuse, indirectSpecular } = context.reflectedLight; @@ -42917,12 +42908,8 @@ class LightsNode extends Node { outgoingLightNode.assign( totalDiffuseNode.add( totalSpecularNode ) ); - // - lightingModel.finish( builder ); - // - outgoingLightNode = outgoingLightNode.bypass( builder.removeStack() ); } else { @@ -42931,8 +42918,6 @@ class LightsNode extends Node { } - // - builder.lightsNode = currentLightsNode; return outgoingLightNode; @@ -47490,6 +47475,7 @@ var TSL = /*#__PURE__*/Object.freeze({ refractView: refractView, reinhardToneMapping: reinhardToneMapping, remap: remap, + remapClamp: remapClamp, renderGroup: renderGroup, renderOutput: renderOutput, rendererReference: rendererReference, @@ -54138,11 +54124,16 @@ class NodeManager extends DataMap { if ( object.isRenderObject ) { const nodeBuilderState = this.get( object ).nodeBuilderState; - nodeBuilderState.usedTimes --; - if ( nodeBuilderState.usedTimes === 0 ) { + if ( nodeBuilderState !== undefined ) { + + nodeBuilderState.usedTimes --; + + if ( nodeBuilderState.usedTimes === 0 ) { - this.nodeBuilderCache.delete( this.getForRenderCacheKey( object ) ); + this.nodeBuilderCache.delete( this.getForRenderCacheKey( object ) ); + + } } @@ -55400,6 +55391,8 @@ class XRRenderTarget extends RenderTarget { const _cameraLPos = /*@__PURE__*/ new Vector3(); const _cameraRPos = /*@__PURE__*/ new Vector3(); +const _contextNodeLib = /*@__PURE__*/ new WeakMap(); + /** * The XR manager is built on top of the WebXR Device API to * manage XR sessions with `WebGPURenderer`. @@ -55561,8 +55554,6 @@ class XRManager extends EventDispatcher { */ this._supportsGlBinding = typeof XRWebGLBinding !== 'undefined'; - this._frameBufferTargets = null; - /** * Helper function to create native WebXR Layer. * @@ -56209,19 +56200,23 @@ class XRManager extends EventDispatcher { const renderer = this._renderer; const wasPresenting = this.isPresenting; - const rendererOutputTarget = renderer.getOutputRenderTarget(); - const rendererFramebufferTarget = renderer._frameBufferTarget; + this.isPresenting = false; const rendererSize = new Vector2(); renderer.getSize( rendererSize ); - const rendererQuad = renderer._quad; + + const currentRenderTarget = renderer.getRenderTarget(); for ( const layer of this._layers ) { layer.renderTarget.isXRRenderTarget = this._session !== null; layer.renderTarget._hasExternalTextures = layer.renderTarget.isXRRenderTarget; + const currentContextNode = renderer.contextNode; + + let contextNode; + if ( layer.renderTarget.isXRRenderTarget && this._sessionUsesLayers ) { layer.xrlayer.transform = new XRRigidTransform( layer.plane.getWorldPosition( translationObject ), layer.plane.getWorldQuaternion( quaternionObject ) ); @@ -56233,42 +56228,46 @@ class XRManager extends EventDispatcher { undefined ); renderer._setXRLayerSize( layer.renderTarget.width, layer.renderTarget.height ); - renderer.setOutputRenderTarget( layer.renderTarget ); - renderer.setRenderTarget( null ); - renderer._frameBufferTarget = null; - this._frameBufferTargets || ( this._frameBufferTargets = new WeakMap() ); - const { frameBufferTarget, quad } = this._frameBufferTargets.get( layer.renderTarget ) || { frameBufferTarget: null, quad: null }; - if ( ! frameBufferTarget ) { + contextNode = _contextNodeLib.get( currentContextNode ); - renderer._quad = new QuadMesh( new NodeMaterial() ); - this._frameBufferTargets.set( layer.renderTarget, { frameBufferTarget: renderer._getFrameBufferTarget(), quad: renderer._quad } ); + if ( contextNode === undefined ) { - } else { + // Apply ToneMapping and OutputColorSpace directly in the material shader - renderer._frameBufferTarget = frameBufferTarget; - renderer._quad = quad; + contextNode = currentContextNode.context( { - } + getOutput: ( outputNode ) => { - layer.rendercall(); + return renderOutput( outputNode, renderer.toneMapping, renderer.outputColorSpace ); - renderer._frameBufferTarget = null; + } + + } ); + + _contextNodeLib.set( currentContextNode, contextNode ); + + } } else { - renderer.setRenderTarget( layer.renderTarget ); - layer.rendercall(); + contextNode = currentContextNode; } + renderer.contextNode = contextNode; + + renderer.setRenderTarget( layer.renderTarget ); + + layer.rendercall(); + + renderer.contextNode = currentContextNode; + } - renderer.setRenderTarget( null ); - renderer.setOutputRenderTarget( rendererOutputTarget ); - renderer._frameBufferTarget = rendererFramebufferTarget; + renderer.setRenderTarget( currentRenderTarget ); renderer._setXRLayerSize( rendererSize.x, rendererSize.y ); - renderer._quad = rendererQuad; + this.isPresenting = wasPresenting; } @@ -58690,9 +58689,10 @@ class Renderer { const { width, height } = this.getDrawingBufferSize( _drawingBufferSize ); const { depth, stencil } = this; - const canvasTarget = this._canvasTarget; + // TODO: Unify CanvasTarget and OutputRenderTarget + const target = this._outputRenderTarget || this._canvasTarget; - let frameBufferTarget = this._frameBufferTargets.get( canvasTarget ); + let frameBufferTarget = this._frameBufferTargets.get( target ); if ( frameBufferTarget === undefined ) { @@ -58712,17 +58712,17 @@ class Renderer { const dispose = () => { - canvasTarget.removeEventListener( 'dispose', dispose ); + target.removeEventListener( 'dispose', dispose ); frameBufferTarget.dispose(); - this._frameBufferTargets.delete( canvasTarget ); + this._frameBufferTargets.delete( target ); }; - canvasTarget.addEventListener( 'dispose', dispose ); + target.addEventListener( 'dispose', dispose ); - this._frameBufferTargets.set( canvasTarget, frameBufferTarget ); + this._frameBufferTargets.set( target, frameBufferTarget ); } @@ -58730,6 +58730,7 @@ class Renderer { frameBufferTarget.depthBuffer = depth; frameBufferTarget.stencilBuffer = stencil; + if ( outputRenderTarget !== null ) { frameBufferTarget.setSize( outputRenderTarget.width, outputRenderTarget.height, outputRenderTarget.depth ); @@ -58740,11 +58741,18 @@ class Renderer { } - frameBufferTarget.viewport.copy( canvasTarget._viewport ); - frameBufferTarget.scissor.copy( canvasTarget._scissor ); - frameBufferTarget.viewport.multiplyScalar( canvasTarget._pixelRatio ); - frameBufferTarget.scissor.multiplyScalar( canvasTarget._pixelRatio ); - frameBufferTarget.scissorTest = canvasTarget._scissorTest; + // RenderTarget || CanvasTarget + + const viewport = this._outputRenderTarget ? this._outputRenderTarget.viewport : target._viewport; + const scissor = this._outputRenderTarget ? this._outputRenderTarget.scissor : target._scissor; + const pixelRatio = this._outputRenderTarget ? 1 : target._pixelRatio; + const scissorTest = this._outputRenderTarget ? this._outputRenderTarget.scissorTest : target._scissorTest; + + frameBufferTarget.viewport.copy( viewport ); + frameBufferTarget.scissor.copy( scissor ); + frameBufferTarget.viewport.multiplyScalar( pixelRatio ); + frameBufferTarget.scissor.multiplyScalar( pixelRatio ); + frameBufferTarget.scissorTest = scissorTest; frameBufferTarget.multiview = outputRenderTarget !== null ? outputRenderTarget.multiview : false; frameBufferTarget.resolveDepthBuffer = outputRenderTarget !== null ? outputRenderTarget.resolveDepthBuffer : true; frameBufferTarget._autoAllocateDepthBuffer = outputRenderTarget !== null ? outputRenderTarget._autoAllocateDepthBuffer : false; @@ -74830,7 +74838,7 @@ class WGSLNodeBuilder extends NodeBuilder { isUnfilterable( texture ) { return this.getComponentTypeFromTexture( texture ) !== 'float' || - ( ! this.isAvailable( 'float32Filterable' ) && texture.isDataTexture === true && texture.type === FloatType ) || + ( ! this.isAvailable( 'float32Filterable' ) && texture.type === FloatType ) || ( this.isSampleCompare( texture ) === false && texture.minFilter === NearestFilter && texture.magFilter === NearestFilter ) || this.renderer.backend.utils.getTextureSampleData( texture ).primarySamples > 1; @@ -77800,7 +77808,7 @@ class WebGPUBindingUtils { } - } else if ( binding.texture.isDataTexture || binding.texture.isDataArrayTexture || binding.texture.isData3DTexture ) { + } else if ( binding.texture.isDataTexture || binding.texture.isDataArrayTexture || binding.texture.isData3DTexture || binding.texture.isStorageTexture ) { const type = binding.texture.type; diff --git a/build/three.webgpu.nodes.min.js b/build/three.webgpu.nodes.min.js index 0c28996e5a15c4..ee9e6583bc255e 100644 --- a/build/three.webgpu.nodes.min.js +++ b/build/three.webgpu.nodes.min.js @@ -3,4 +3,4 @@ * Copyright 2010-2026 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,error as o,EventDispatcher as u,MathUtils as l,warn as d,WebGLCoordinateSystem as c,WebGPUCoordinateSystem as h,ColorManagement as p,SRGBTransfer as g,NoToneMapping as m,StaticDrawUsage as f,InterleavedBufferAttribute as y,InterleavedBuffer as b,DynamicDrawUsage as x,NoColorSpace as T,log as _,warnOnce as v,Texture as N,UnsignedIntType as S,IntType as R,Compatibility as A,LessCompare as E,LessEqualCompare as w,GreaterCompare as C,GreaterEqualCompare as M,NearestFilter as B,Sphere as F,BackSide as L,DoubleSide as P,Euler as D,CubeTexture as U,CubeReflectionMapping as I,CubeRefractionMapping as O,TangentSpaceNormalMap as V,NoNormalPacking as k,NormalRGPacking as G,NormalGAPacking as z,ObjectSpaceNormalMap as $,RGFormat as W,RED_GREEN_RGTC2_Format as H,RG11_EAC_Format as q,InstancedBufferAttribute as j,InstancedInterleavedBuffer as X,DataArrayTexture as K,FloatType as Q,FramebufferTexture as Y,LinearMipmapLinearFilter as Z,DepthTexture as J,Material as ee,LineBasicMaterial as te,LineDashedMaterial as re,NoBlending as se,MeshNormalMaterial as ie,SRGBColorSpace as ne,RenderTarget as ae,BoxGeometry as oe,Mesh as ue,Scene as le,LinearFilter as de,CubeCamera as ce,EquirectangularReflectionMapping as he,EquirectangularRefractionMapping as pe,AddOperation as ge,MixOperation as me,MultiplyOperation as fe,MeshBasicMaterial as ye,MeshLambertMaterial as be,MeshPhongMaterial as xe,DataTexture as Te,HalfFloatType as _e,ClampToEdgeWrapping as ve,BufferGeometry as Ne,OrthographicCamera as Se,PerspectiveCamera as Re,LinearSRGBColorSpace as Ae,RGBAFormat as Ee,CubeUVReflectionMapping as we,BufferAttribute as Ce,MeshStandardMaterial as Me,MeshPhysicalMaterial as Be,MeshToonMaterial as Fe,MeshMatcapMaterial as Le,SpriteMaterial as Pe,PointsMaterial as De,ShadowMaterial as Ue,Uint32BufferAttribute as Ie,Uint16BufferAttribute as Oe,ByteType as Ve,UnsignedByteType as ke,ShortType as Ge,UnsignedShortType as ze,AlphaFormat as $e,RedFormat as We,RedIntegerFormat as He,DepthFormat as qe,DepthStencilFormat as je,RGBFormat as Xe,UnsignedShort4444Type as Ke,UnsignedShort5551Type as Qe,UnsignedInt248Type as Ye,UnsignedInt5999Type as Ze,UnsignedInt101111Type as Je,NormalBlending as et,SrcAlphaFactor as tt,OneMinusSrcAlphaFactor as rt,AddEquation as st,MaterialBlending as it,Plane as nt,Object3D as at,LinearMipMapLinearFilter as ot,Float32BufferAttribute as ut,UVMapping as lt,PCFShadowMap as dt,PCFSoftShadowMap as ct,VSMShadowMap as ht,BasicShadowMap as pt,CubeDepthTexture as gt,SphereGeometry as mt,LinearMipmapNearestFilter as ft,NearestMipmapLinearFilter as yt,Float16BufferAttribute as bt,yieldToMain as xt,REVISION as Tt,ArrayCamera as _t,PlaneGeometry as vt,FrontSide as Nt,CustomBlending as St,ZeroFactor as Rt,CylinderGeometry as At,Quaternion as Et,WebXRController as wt,RAD2DEG as Ct,FrustumArray as Mt,Frustum as Bt,RGIntegerFormat as Ft,RGBIntegerFormat as Lt,RGBAIntegerFormat as Pt,TimestampQuery as Dt,createCanvasElement as Ut,ReverseSubtractEquation as It,SubtractEquation as Ot,OneMinusDstAlphaFactor as Vt,OneMinusDstColorFactor as kt,OneMinusSrcColorFactor as Gt,DstAlphaFactor as zt,DstColorFactor as $t,SrcAlphaSaturateFactor as Wt,SrcColorFactor as Ht,OneFactor as qt,CullFaceNone as jt,CullFaceBack as Xt,CullFaceFront as Kt,MultiplyBlending as Qt,SubtractiveBlending as Yt,AdditiveBlending as Zt,NotEqualDepth as Jt,GreaterDepth as er,GreaterEqualDepth as tr,EqualDepth as rr,LessEqualDepth as sr,LessDepth as ir,AlwaysDepth as nr,NeverDepth as ar,ReversedDepthFuncs as or,RGB_S3TC_DXT1_Format as ur,RGBA_S3TC_DXT1_Format as lr,RGBA_S3TC_DXT3_Format as dr,RGBA_S3TC_DXT5_Format as cr,RGB_PVRTC_4BPPV1_Format as hr,RGB_PVRTC_2BPPV1_Format as pr,RGBA_PVRTC_4BPPV1_Format as gr,RGBA_PVRTC_2BPPV1_Format as mr,RGB_ETC1_Format as fr,RGB_ETC2_Format as yr,RGBA_ETC2_EAC_Format as br,R11_EAC_Format as xr,SIGNED_R11_EAC_Format as Tr,SIGNED_RG11_EAC_Format as _r,RGBA_ASTC_4x4_Format as vr,RGBA_ASTC_5x4_Format as Nr,RGBA_ASTC_5x5_Format as Sr,RGBA_ASTC_6x5_Format as Rr,RGBA_ASTC_6x6_Format as Ar,RGBA_ASTC_8x5_Format as Er,RGBA_ASTC_8x6_Format as wr,RGBA_ASTC_8x8_Format as Cr,RGBA_ASTC_10x5_Format as Mr,RGBA_ASTC_10x6_Format as Br,RGBA_ASTC_10x8_Format as Fr,RGBA_ASTC_10x10_Format as Lr,RGBA_ASTC_12x10_Format as Pr,RGBA_ASTC_12x12_Format as Dr,RGBA_BPTC_Format as Ur,RED_RGTC1_Format as Ir,SIGNED_RED_RGTC1_Format as Or,SIGNED_RED_GREEN_RGTC2_Format as Vr,MirroredRepeatWrapping as kr,RepeatWrapping as Gr,NearestMipmapNearestFilter as zr,NotEqualCompare as $r,EqualCompare as Wr,AlwaysCompare as Hr,NeverCompare as qr,LinearTransfer as jr,getByteLength as Xr,isTypedArray as Kr,NotEqualStencilFunc as Qr,GreaterStencilFunc as Yr,GreaterEqualStencilFunc as Zr,EqualStencilFunc as Jr,LessEqualStencilFunc as es,LessStencilFunc as ts,AlwaysStencilFunc as rs,NeverStencilFunc as ss,DecrementWrapStencilOp as is,IncrementWrapStencilOp as ns,DecrementStencilOp as as,IncrementStencilOp as os,InvertStencilOp as us,ReplaceStencilOp as ls,ZeroStencilOp as ds,KeepStencilOp as cs,MaxEquation as hs,MinEquation as ps,SpotLight as gs,PointLight as ms,DirectionalLight as fs,RectAreaLight as ys,AmbientLight as bs,HemisphereLight as xs,LightProbe as Ts,LinearToneMapping as _s,ReinhardToneMapping as vs,CineonToneMapping as Ns,ACESFilmicToneMapping as Ss,AgXToneMapping as Rs,NeutralToneMapping as As,Group as Es,Loader as ws,FileLoader as Cs,MaterialLoader as Ms,ObjectLoader as Bs}from"./three.core.min.js";export{AdditiveAnimationBlendMode,AnimationAction,AnimationClip,AnimationLoader,AnimationMixer,AnimationObjectGroup,AnimationUtils,ArcCurve,ArrowHelper,AttachedBindMode,Audio,AudioAnalyser,AudioContext,AudioListener,AudioLoader,AxesHelper,BasicDepthPacking,BatchedMesh,BezierInterpolant,Bone,BooleanKeyframeTrack,Box2,Box3,Box3Helper,BoxHelper,BufferGeometryLoader,Cache,Camera,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,ExternalTexture,ExtrudeGeometry,Fog,FogExp2,GLBufferAttribute,GLSL1,GLSL3,GridHelper,HemisphereLightHelper,IcosahedronGeometry,ImageBitmapLoader,ImageLoader,ImageUtils,InstancedBufferGeometry,InstancedMesh,Int16BufferAttribute,Int32BufferAttribute,Int8BufferAttribute,Interpolant,InterpolateBezier,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,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,TorusGeometry,TorusKnotGeometry,Triangle,TriangleFanDrawMode,TriangleStripDrawMode,TrianglesDrawMode,TubeGeometry,Uint8BufferAttribute,Uint8ClampedBufferAttribute,Uniform,UniformsGroup,VectorKeyframeTrack,VideoFrameTexture,VideoTexture,WebGL3DRenderTarget,WebGLArrayRenderTarget,WebGLRenderTarget,WireframeGeometry,WrapAroundEnding,ZeroCurvatureEnding,ZeroSlopeEnding,getConsoleFunction,setConsoleFunction}from"./three.core.min.js";const Fs=["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"],Ls=new WeakMap;class Ps{constructor(e){this.renderObjects=new WeakMap,this.hasNode=this.containsNode(e),this.hasAnimation=!0===e.object.isSkinnedMesh,this.refreshUniforms=Fs,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),indexId:r.index?r.index.id:null,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]={id:s.id,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!!(e.context.modelViewMatrix||e.context.modelNormalViewMatrix||e.context.getAO||e.context.getShadow)}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;if(o.id!==i.id)return o.id=i.id,!1;let d=0,c=0;for(const e in u)d++;for(const e in l){c++;const t=l[e],r=u[e];if(void 0===r)return delete l[e],!1;if(t.id!==r.id||t.version!==r.version)return t.id=r.id,t.version=r.version,!1}if(c!==d)return n.geometry.attributes=this.getAttributesData(u),!1;const h=i.index,p=o.indexId,g=o.indexVersion,m=h?h.id:null,f=h?h.version:null;if(p!==m||g!==f)return o.indexId=m,o.indexVersion=f,!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{const r=e.match(t);if(!r)return null;const s=r[1]||r[2]||"",i=r[3].split("?")[0],n=parseInt(r[4],10),a=parseInt(r[5],10);return{fn:s,file:i.split("/").pop(),line:n,column:a}}).filter(e=>e&&!Ds.some(t=>t.test(e.file)))}(e||(new Error).stack)}getLocation(){if(0===this.stack.length)return"[Unknown location]";const e=this.stack[0],t=e.fn;return`${t?`"${t}()" at `:""}"${e.file}:${e.line}"`}getError(e){if(0===this.stack.length)return e;return`${e}\n${this.stack.map(e=>{const t=`${e.file}:${e.line}:${e.column}`;return e.fn?` at ${e.fn} (${t})`:` at ${t}`}).join("\n")}`}}function Is(e,t=0){let r=3735928559^t,s=1103547991^t;if(e instanceof Array)for(let t,i=0;i>>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 Os=e=>Is(e),Vs=e=>Is(e),ks=(...e)=>Is(e),Gs=new Map([[1,"float"],[2,"vec2"],[3,"vec3"],[4,"vec4"],[9,"mat3"],[16,"mat4"]]),zs=new WeakMap;function $s(e){return Gs.get(e)}function Ws(e){if(/[iu]?vec\d/.test(e))return e.startsWith("ivec")?Int32Array:e.startsWith("uvec")?Uint32Array:Float32Array;if(/mat\d/.test(e))return Float32Array;if(/float/.test(e))return Float32Array;if(/uint/.test(e))return Uint32Array;if(/int/.test(e))return Int32Array;throw new Error(`THREE.NodeUtils: Unsupported type: ${e}`)}function Hs(e){return/float|int|uint/.test(e)?1:/vec2/.test(e)?2:/vec3/.test(e)?3:/vec4/.test(e)||/mat2/.test(e)?4:/mat3/.test(e)?9:/mat4/.test(e)?16:void o(`TSL: Unsupported type: ${e}`,new Us)}function qs(e){return/float|int|uint/.test(e)?1:/vec2/.test(e)?2:/vec3/.test(e)?3:/vec4/.test(e)||/mat2/.test(e)?4:/mat3/.test(e)?12:/mat4/.test(e)?16:void o(`TSL: Unsupported type: ${e}`,new Us)}function js(e){return/float|int|uint/.test(e)?4:/vec2/.test(e)?8:/vec3/.test(e)||/vec4/.test(e)?16:/mat2/.test(e)?8:/mat3/.test(e)||/mat4/.test(e)?16:void o(`TSL: Unsupported type: ${e}`,new Us)}function Xs(e){if(null==e)return null;const t=typeof e;return!0===e.isNode?"node":"number"===t?"float":"boolean"===t?"bool":"string"===t?"string":"function"===t?"shader":!0===e.isVector2?"vec2":!0===e.isVector3?"vec3":!0===e.isVector4?"vec4":!0===e.isMatrix2?"mat2":!0===e.isMatrix3?"mat3":!0===e.isMatrix4?"mat4":!0===e.isColor?"color":e instanceof ArrayBuffer?"ArrayBuffer":null}function Ks(o,...u){const l=o?o.slice(-4):void 0;return 1===u.length&&("vec2"===l?u=[u[0],u[0]]:"vec3"===l?u=[u[0],u[0],u[0]]:"vec4"===l&&(u=[u[0],u[0],u[0],u[0]])),"color"===o?new e(...u):"vec2"===l?new t(...u):"vec3"===l?new r(...u):"vec4"===l?new s(...u):"mat2"===l?new i(...u):"mat3"===l?new n(...u):"mat4"===l?new a(...u):"bool"===o?u[0]||!1:"float"===o||"int"===o||"uint"===o?u[0]||0:"string"===o?u[0]||"":"ArrayBuffer"===o?Zs(u[0]):null}function Qs(e){let t=zs.get(e);return void 0===t&&(t={},zs.set(e,t)),t}function Ys(e){let t="";const r=new Uint8Array(e);for(let e=0;ee.charCodeAt(0)).buffer}var Js=Object.freeze({__proto__:null,arrayBufferToBase64:Ys,base64ToArrayBuffer:Zs,getAlignmentFromType:js,getDataFromObject:Qs,getLengthFromType:Hs,getMemoryLengthFromType:qs,getTypeFromLength:$s,getTypedArrayFromType:Ws,getValueFromType:Ks,getValueType:Xs,hash:ks,hashArray:Vs,hashString:Os});const ei={VERTEX:"vertex",FRAGMENT:"fragment"},ti={NONE:"none",FRAME:"frame",RENDER:"render",OBJECT:"object"},ri={BOOLEAN:"bool",INTEGER:"int",FLOAT:"float",VECTOR2:"vec2",VECTOR3:"vec3",VECTOR4:"vec4",MATRIX2:"mat2",MATRIX3:"mat3",MATRIX4:"mat4"},si={READ_ONLY:"readOnly",WRITE_ONLY:"writeOnly",READ_WRITE:"readWrite"},ii=["fragment","vertex"],ni=["setup","analyze","generate"],ai=[...ii,"compute"],oi=["x","y","z","w"],ui={analyze:"setup",generate:"analyze"};let li=0;class di extends u{static get type(){return"Node"}constructor(e=null){super(),this.nodeType=e,this.updateType=ti.NONE,this.updateBeforeType=ti.NONE,this.updateAfterType=ti.NONE,this.version=0,this.name="",this.global=!1,this.parents=!1,this.isNode=!0,this._beforeNodes=null,this._cacheKey=null,this._uuid=null,this._cacheKeyVersion=0,this.id=li++,this.stackTrace=null,!0===di.captureStackTrace&&(this.stackTrace=new Us)}set needsUpdate(e){!0===e&&this.version++}get uuid(){return null===this._uuid&&(this._uuid=l.generateUUID()),this._uuid}get type(){return this.constructor.type}onUpdate(e,t){return this.updateType=t,this.update=e.bind(this),this}onFrameUpdate(e){return this.onUpdate(e,ti.FRAME)}onRenderUpdate(e){return this.onUpdate(e,ti.RENDER)}onObjectUpdate(e){return this.onUpdate(e,ti.OBJECT)}onReference(e){return this.updateReference=e.bind(this),this}updateReference(){return this}isGlobal(){return this.global}*getChildren(){for(const{childNode:e}of this._getChildren())yield e}dispose(){this.dispatchEvent({type:"dispose"})}traverse(e){e(this);for(const t of this.getChildren())t.traverse(e)}_getChildren(e=new Set){const t=[];e.add(this);for(const r of Object.getOwnPropertyNames(this)){const s=this[r];if(!0!==r.startsWith("_")&&!e.has(s))if(!0===Array.isArray(s))for(let e=0;e0&&(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}}di.captureStackTrace=!1;class ci extends di{static get type(){return"ArrayElementNode"}constructor(e,t){super(),this.node=e,this.indexNode=t,this.isArrayElementNode=!0}generateNodeType(e){return this.node.getElementType(e)}getMemberType(e,t){return this.node.getMemberType(e,t)}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 hi extends di{static get type(){return"ConvertNode"}constructor(e,t){super(),this.node=e,this.convertTo=t}generateNodeType(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 pi extends di{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 gi extends pi{static get type(){return"JoinNode"}constructor(e=[],t=null){super(t),this.nodes=e}generateNodeType(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 u=0;for(const t of i){if(u>=s){o(`TSL: Length of parameters exceeds maximum length of function '${r}()' type.`,this.stackTrace);break}let i,l=t.getNodeType(e),d=e.getTypeLength(l);u+d>s&&(o(`TSL: Length of '${r}()' data exceeds maximum length of output type.`,this.stackTrace),d=s-u,l=e.getTypeFromLength(d)),u+=d,i=t.build(e,l);if(e.getComponentType(l)!==n){const t=e.getTypeFromLength(d,n);i=e.format(i,l,t)}a.push(i)}const l=`${e.getType(r)}( ${a.join(", ")} )`;return e.format(l,r,t)}}const mi=oi.join("");class fi extends di{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(oi.indexOf(t)+1,e);return e}getComponentType(e){return e.getComponentType(this.node.getNodeType(e))}generateNodeType(e){return e.getTypeFromLength(this.components.length,this.getComponentType(e))}getScope(){return this.node.getScope()}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===mi.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 yi extends pi{static get type(){return"SetNode"}constructor(e,t,r){super(),this.sourceNode=e,this.components=t,this.targetNode=r}generateNodeType(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;e(e=>e.replace(/r|s/g,"x").replace(/g|t/g,"y").replace(/b|p/g,"z").replace(/a|q/g,"w"))(e).split("").sort().join("");di.prototype.assign=function(...e){if(!0!==this.isStackNode)return null!==Ni?Ni.assign(this,...e):o("TSL: No stack defined for assign operation. Make sure the assign is inside a Fn().",new Us),this;{const t=Si.get("assign");return this.addToStack(t(...e))}},di.prototype.toVarIntent=function(){return this},di.prototype.get=function(e){return new vi(this,e)};const Ei={};function wi(e,t,r){Ei[e]=Ei[t]=Ei[r]={get(){this._cache=this._cache||{};let t=this._cache[e];return void 0===t&&(t=new fi(this,e),this._cache[e]=t),t},set(t){this[e].assign(en(t))}};const s=e.toUpperCase(),i=t.toUpperCase(),n=r.toUpperCase();di.prototype["set"+s]=di.prototype["set"+i]=di.prototype["set"+n]=function(t){const r=Ai(e);return new yi(this,r,en(t))},di.prototype["flip"+s]=di.prototype["flip"+i]=di.prototype["flip"+n]=function(){const t=Ai(e);return new bi(this,t)}}const Ci=["x","y","z","w"],Mi=["r","g","b","a"],Bi=["s","t","p","q"];for(let e=0;e<4;e++){let t=Ci[e],r=Mi[e],s=Bi[e];wi(t,r,s);for(let i=0;i<4;i++){t=Ci[e]+Ci[i],r=Mi[e]+Mi[i],s=Bi[e]+Bi[i],wi(t,r,s);for(let n=0;n<4;n++){t=Ci[e]+Ci[i]+Ci[n],r=Mi[e]+Mi[i]+Mi[n],s=Bi[e]+Bi[i]+Bi[n],wi(t,r,s);for(let a=0;a<4;a++)t=Ci[e]+Ci[i]+Ci[n]+Ci[a],r=Mi[e]+Mi[i]+Mi[n]+Mi[a],s=Bi[e]+Bi[i]+Bi[n]+Bi[a],wi(t,r,s)}}}for(let e=0;e<32;e++)Ei[e]={get(){this._cache=this._cache||{};let t=this._cache[e];return void 0===t&&(t=new ci(this,new _i(e,"uint")),this._cache[e]=t),t},set(t){this[e].assign(en(t))}};Object.defineProperties(di.prototype,Ei);const Fi=new WeakMap,Li=function(e,t=null){for(const r in e)e[r]=en(e[r],t);return e},Pi=function(e,t=null){const r=e.length;for(let s=0;su?(o(`TSL: "${r}" parameter length exceeds limit.`,new Us),t.slice(0,u)):t}return null===t?n=(...t)=>i(new e(...sn(d(t)))):null!==r?(r=en(r),n=(...s)=>i(new e(t,...sn(d(s)),r))):n=(...r)=>i(new e(t,...sn(d(r)))),n.setParameterLength=(...e)=>(1===e.length?a=u=e[0]:2===e.length&&([a,u]=e),n),n.setName=e=>(l=e,n),n},Ui=function(e,...t){return new e(...sn(t))};class Ii extends di{constructor(e,t){super(),this.shaderNode=e,this.rawInputs=t,this.isShaderCallNodeInternal=!0}generateNodeType(e){return this.shaderNode.nodeType||this.getOutputNode(e).getNodeType(e)}getElementType(e){return this.getOutputNode(e).getElementType(e)}getMemberType(e,t){return this.getOutputNode(e).getMemberType(e,t)}call(e){const{shaderNode:t,rawInputs:r}=this,s=e.getNodeProperties(t),i=e.getClosestSubBuild(t.subBuilds)||"",n=i||"default";if(s[n])return s[n];const a=e.subBuildFn,o=e.fnCall;e.subBuildFn=i,e.fnCall=this;let u=null;if(t.layout){let s=Fi.get(e.constructor);void 0===s&&(s=new WeakMap,Fi.set(e.constructor,s));let i=s.get(t);void 0===i&&(i=en(e.buildFunctionNode(t)),s.set(t,i)),e.addInclude(i);const n=r?function(e){let t;rn(e);t=e[0]&&(e[0].isNode||Object.getPrototypeOf(e[0])!==Object.prototype)?[...e]:e[0];return t}(r):null;u=en(i.call(n))}else{const s=new Proxy(e,{get:(e,t,r)=>{let s;return s=Symbol.iterator===t?function*(){yield}:Reflect.get(e,t,r),s}}),i=r?function(e){let t=0;return rn(e),new Proxy(e,{get:(r,s,i)=>{let n;if("length"===s)return n=e.length,n;if(Symbol.iterator===s)n=function*(){for(const t of e)yield en(t)};else{if(e.length>0)if(Object.getPrototypeOf(e[0])===Object.prototype){const r=e[0];n=void 0===r[s]?r[t++]:Reflect.get(r,s,i)}else e[0]instanceof di&&(n=void 0===e[s]?e[t++]:Reflect.get(e,s,i));else n=Reflect.get(r,s,i);n=en(n)}return n}})}(r):null,n=Array.isArray(r)?r.length>0:null!==r,a=t.jsFunc,o=n||a.length>1?a(i,s):a(s);u=en(o)}return e.subBuildFn=a,e.fnCall=o,t.once&&(s[n]=u),u}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),o=e.fnCall;if(e.fnCall=this,"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 e.fnCall=o,r}}class Oi extends di{constructor(e,t){super(t),this.jsFunc=e,this.layout=null,this.global=!0,this.once=!1}setLayout(e){return this.layout=e,this}getLayout(){return this.layout}call(e=null){return new Ii(this,e)}setup(){return this.call()}}const Vi=[!1,!0],ki=[0,1,2,3],Gi=[-1,-2],zi=[.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],$i=new Map;for(const e of Vi)$i.set(e,new _i(e));const Wi=new Map;for(const e of ki)Wi.set(e,new _i(e,"uint"));const Hi=new Map([...Wi].map(e=>new _i(e.value,"int")));for(const e of Gi)Hi.set(e,new _i(e,"int"));const qi=new Map([...Hi].map(e=>new _i(e.value)));for(const e of zi)qi.set(e,new _i(e));for(const e of zi)qi.set(-e,new _i(-e));const ji={bool:$i,uint:Wi,ints:Hi,float:qi},Xi=new Map([...$i,...qi]),Ki=(e,t)=>Xi.has(e)?Xi.get(e):!0===e.isNode?e:new _i(e,t),Qi=function(e,t=null){return(...r)=>{for(const t of r)if(void 0===t)return o(`TSL: Invalid parameter for the type "${e}".`,new Us),new _i(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=[Ks(e,...r)]),1===r.length&&null!==t&&t.has(r[0]))return tn(t.get(r[0]));if(1===r.length){const t=Ki(r[0],e);return t.nodeType===e?tn(t):tn(new hi(t,e))}const s=r.map(e=>Ki(e));return tn(new gi(s,e))}};function Yi(e){return e&&e.isNode&&e.traverse(t=>{t.isConstNode&&(e=t.value)}),Boolean(e)}const Zi=e=>null!=e?e.nodeType||e.convertTo||("string"==typeof e?e:null):null;function Ji(e,t){return new Oi(e,t)}const en=(e,t=null)=>function(e,t=null){const r=Xs(e);return"node"===r?e:null===t&&("float"===r||"boolean"===r)||r&&"shader"!==r&&"string"!==r?en(Ki(e,t)):"shader"===r?e.isFn?e:dn(e):e}(e,t),tn=(e,t=null)=>en(e,t).toVarIntent(),rn=(e,t=null)=>new Li(e,t),sn=(e,t=null)=>new Pi(e,t),nn=(e,t=null,r=null,s=null)=>new Di(e,t,r,s),an=(e,...t)=>new Ui(e,...t),on=(e,t=null,r=null,s={})=>new Di(e,t,r,{...s,intent:!0});let un=0;class ln extends di{constructor(e,t=null){super();let r=null;null!==t&&("object"==typeof t?r=t.return:("string"==typeof t?r=t:o("TSL: Invalid layout type.",new Us),t=null)),this.shaderNode=new Ji(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"+un++,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}generateNodeType(e){return this.shaderNode.getNodeType(e)||"float"}call(...e){const t=this.shaderNode.call(e);return"void"===this.shaderNode.nodeType&&t.toStack(),t.toVarIntent()}once(e=null){return this.shaderNode.once=!0,this.shaderNode.subBuilds=e,this}generate(e){const t=this.getNodeType(e);return o('TSL: "Fn()" was declared but not invoked. Try calling it like "Fn()( ...params )".',this.stackTrace),e.generateConst(t)}}function dn(e,t=null){const r=new ln(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 cn=e=>{Ni=e},hn=()=>Ni,pn=(...e)=>Ni.If(...e);function gn(e){return Ni&&Ni.addToStack(e),e}Ri("toStack",gn);const mn=new Qi("color"),fn=new Qi("float",ji.float),yn=new Qi("int",ji.ints),bn=new Qi("uint",ji.uint),xn=new Qi("bool",ji.bool),Tn=new Qi("vec2"),_n=new Qi("ivec2"),vn=new Qi("uvec2"),Nn=new Qi("bvec2"),Sn=new Qi("vec3"),Rn=new Qi("ivec3"),An=new Qi("uvec3"),En=new Qi("bvec3"),wn=new Qi("vec4"),Cn=new Qi("ivec4"),Mn=new Qi("uvec4"),Bn=new Qi("bvec4"),Fn=new Qi("mat2"),Ln=new Qi("mat3"),Pn=new Qi("mat4");Ri("toColor",mn),Ri("toFloat",fn),Ri("toInt",yn),Ri("toUint",bn),Ri("toBool",xn),Ri("toVec2",Tn),Ri("toIVec2",_n),Ri("toUVec2",vn),Ri("toBVec2",Nn),Ri("toVec3",Sn),Ri("toIVec3",Rn),Ri("toUVec3",An),Ri("toBVec3",En),Ri("toVec4",wn),Ri("toIVec4",Cn),Ri("toUVec4",Mn),Ri("toBVec4",Bn),Ri("toMat2",Fn),Ri("toMat3",Ln),Ri("toMat4",Pn);const Dn=nn(ci).setParameterLength(2),Un=(e,t)=>new hi(en(e),t);Ri("element",Dn),Ri("convert",Un);Ri("append",e=>(d("TSL: .append() has been renamed to .toStack().",new Us),gn(e)));class In extends di{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}customCacheKey(){return Os(this.type+":"+(this.name||"")+":"+(this.varying?"1":"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 On=(e,t)=>new In(e,t),Vn=(e,t)=>new In(e,t,!0),kn=an(In,"vec4","DiffuseColor"),Gn=an(In,"vec3","DiffuseContribution"),zn=an(In,"vec3","EmissiveColor"),$n=an(In,"float","Roughness"),Wn=an(In,"float","Metalness"),Hn=an(In,"float","Clearcoat"),qn=an(In,"float","ClearcoatRoughness"),jn=an(In,"vec3","Sheen"),Xn=an(In,"float","SheenRoughness"),Kn=an(In,"float","Iridescence"),Qn=an(In,"float","IridescenceIOR"),Yn=an(In,"float","IridescenceThickness"),Zn=an(In,"float","AlphaT"),Jn=an(In,"float","Anisotropy"),ea=an(In,"vec3","AnisotropyT"),ta=an(In,"vec3","AnisotropyB"),ra=an(In,"color","SpecularColor"),sa=an(In,"color","SpecularColorBlended"),ia=an(In,"float","SpecularF90"),na=an(In,"float","Shininess"),aa=an(In,"vec4","Output"),oa=an(In,"float","dashSize"),ua=an(In,"float","gapSize"),la=an(In,"float","pointWidth"),da=an(In,"float","IOR"),ca=an(In,"float","Transmission"),ha=an(In,"float","Thickness"),pa=an(In,"float","AttenuationDistance"),ga=an(In,"color","AttenuationColor"),ma=an(In,"float","Dispersion");class fa extends di{static get type(){return"UniformGroupNode"}constructor(e,t=!1,r=1,s=null){super("string"),this.name=e,this.shared=t,this.order=r,this.updateType=s,this.isUniformGroup=!0}update(){this.needsUpdate=!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 ya=(e,t=1,r=null)=>new fa(e,!1,t,r),ba=(e,t=0,r=null)=>new fa(e,!0,t,r),xa=ba("frame",0,ti.FRAME),Ta=ba("render",0,ti.RENDER),_a=ya("object",1,ti.OBJECT);class va extends xi{static get type(){return"UniformNode"}constructor(e,t=null){super(e,t),this.isUniformNode=!0,this.name="",this.groupNode=_a}setName(e){return this.name=e,this}label(e){return d('TSL: "label()" has been deprecated. Use "setName()" instead.',new Us),this.setName(e)}setGroup(e){return this.groupNode=e,this}getGroup(){return this.groupNode}getUniformHash(e){return this.getHash(e)}onUpdate(e,t){return e=e.bind(this),super.onUpdate(t=>{const r=e(t,this);void 0!==r&&(this.value=r)},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 Na=(e,t)=>{const r=Zi(t||e);if(r===e&&(e=Ks(r)),e&&!0===e.isNode){let t=e.value;e.traverse(e=>{!0===e.isConstNode&&(t=e.value)}),e=t}return new va(e,r)};class Sa extends pi{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}generateNodeType(e){return null===this.nodeType?this.values[0].getNodeType(e):this.nodeType}getElementType(e){return this.getNodeType(e)}getMemberType(e,t){return null===this.nodeType?this.values[0].getMemberType(e,t):super.getMemberType(e,t)}generate(e){const t=this.getNodeType(e);return e.generateArray(t,this.count,this.values)}}const Ra=(...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 en(t)};Ri("toArray",(e,t)=>Ra(Array(t).fill(e)));class Aa extends pi{static get type(){return"AssignNode"}constructor(e,t){super(),this.targetNode=e,this.sourceNode=t,this.isAssignNode=!0}hasDependencies(){return!1}generateNodeType(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 oi.join("").slice(0,r)!==t.components}return!1}setup(e){const{targetNode:t,sourceNode:r}=this,s=t.getScope();e.getDataFromNode(s).assign=!0;const i=e.getNodeProperties(this);i.sourceNode=r,i.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)o("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?sn(t):rn(t[0]),new wa(en(e),t));Ri("call",Ca);const Ma={"==":"equal","!=":"notEqual","<":"lessThan",">":"greaterThan","<=":"lessThanEqual",">=":"greaterThanEqual","%":"mod"};class Ba extends pi{static get type(){return"OperatorNode"}constructor(e,t,r,...s){if(super(),s.length>0){let i=new Ba(e,t,r);for(let t=0;t>"===r||"<<"===r)return e.getIntegerType(n);if("!"===r||"&&"===r||"||"===r||"^^"===r)return"bool";if("=="===r||"!="===r||"<"===r||">"===r||"<="===r||">="===r){const t=Math.max(e.getTypeLength(n),e.getTypeLength(a));return t>1?`bvec${t}`:"bool"}if(e.isMatrix(n)){if("float"===a)return n;if(e.isVector(a))return e.getVectorFromMatrix(n);if(e.isMatrix(a))return n}else if(e.isMatrix(a)){if("float"===n)return a;if(e.isVector(n))return e.getVectorFromMatrix(a)}return e.getTypeLength(a)>e.getTypeLength(n)?a:n}generate(e,t){const r=this.op,{aNode:s,bNode:i}=this,n=this.getNodeType(e,t);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),l=i?i.build(e,o):null,d=e.getFunctionOperator(r);if("void"!==t){const s=e.renderer.coordinateSystem===c;if("=="===r||"!="===r||"<"===r||">"===r||"<="===r||">="===r)return s&&e.isVector(a)?e.format(`${this.getOperatorMethod(e,t)}( ${u}, ${l} )`,n,t):e.format(`( ${u} ${r} ${l} )`,n,t);if("%"===r)return e.isInteger(o)?e.format(`( ${u} % ${l} )`,n,t):e.format(`${this.getOperatorMethod(e,n)}( ${u}, ${l} )`,n,t);if("!"===r||"~"===r)return e.format(`(${r}${u})`,a,t);if(d)return e.format(`${d}( ${u}, ${l} )`,n,t);if(e.isMatrix(a)&&"float"===o)return e.format(`( ${l} ${r} ${u} )`,n,t);if("float"===a&&e.isMatrix(o))return e.format(`${u} ${r} ${l}`,n,t);{let i=`( ${u} ${r} ${l} )`;return!s&&"bool"===n&&e.isVector(a)&&e.isVector(o)&&(i=`all${i}`),e.format(i,n,t)}}if("void"!==a)return d?e.format(`${d}( ${u}, ${l} )`,n,t):e.isMatrix(a)&&"float"===o?e.format(`${l} ${r} ${u}`,n,t):e.format(`${u} ${r} ${l}`,n,t)}serialize(e){super.serialize(e),e.op=this.op}deserialize(e){super.deserialize(e),this.op=e.op}}const Fa=on(Ba,"+").setParameterLength(2,1/0).setName("add"),La=on(Ba,"-").setParameterLength(2,1/0).setName("sub"),Pa=on(Ba,"*").setParameterLength(2,1/0).setName("mul"),Da=on(Ba,"/").setParameterLength(2,1/0).setName("div"),Ua=on(Ba,"%").setParameterLength(2).setName("mod"),Ia=on(Ba,"==").setParameterLength(2).setName("equal"),Oa=on(Ba,"!=").setParameterLength(2).setName("notEqual"),Va=on(Ba,"<").setParameterLength(2).setName("lessThan"),ka=on(Ba,">").setParameterLength(2).setName("greaterThan"),Ga=on(Ba,"<=").setParameterLength(2).setName("lessThanEqual"),za=on(Ba,">=").setParameterLength(2).setName("greaterThanEqual"),$a=on(Ba,"&&").setParameterLength(2,1/0).setName("and"),Wa=on(Ba,"||").setParameterLength(2,1/0).setName("or"),Ha=on(Ba,"!").setParameterLength(1).setName("not"),qa=on(Ba,"^^").setParameterLength(2).setName("xor"),ja=on(Ba,"&").setParameterLength(2).setName("bitAnd"),Xa=on(Ba,"~").setParameterLength(1).setName("bitNot"),Ka=on(Ba,"|").setParameterLength(2).setName("bitOr"),Qa=on(Ba,"^").setParameterLength(2).setName("bitXor"),Ya=on(Ba,"<<").setParameterLength(2).setName("shiftLeft"),Za=on(Ba,">>").setParameterLength(2).setName("shiftRight"),Ja=dn(([e])=>(e.addAssign(1),e)),eo=dn(([e])=>(e.subAssign(1),e)),to=dn(([e])=>{const t=yn(e).toConst();return e.addAssign(1),t}),ro=dn(([e])=>{const t=yn(e).toConst();return e.subAssign(1),t});Ri("add",Fa),Ri("sub",La),Ri("mul",Pa),Ri("div",Da),Ri("mod",Ua),Ri("equal",Ia),Ri("notEqual",Oa),Ri("lessThan",Va),Ri("greaterThan",ka),Ri("lessThanEqual",Ga),Ri("greaterThanEqual",za),Ri("and",$a),Ri("or",Wa),Ri("not",Ha),Ri("xor",qa),Ri("bitAnd",ja),Ri("bitNot",Xa),Ri("bitOr",Ka),Ri("bitXor",Qa),Ri("shiftLeft",Ya),Ri("shiftRight",Za),Ri("incrementBefore",Ja),Ri("decrementBefore",eo),Ri("increment",to),Ri("decrement",ro);const so=(e,t)=>(d('TSL: "modInt()" is deprecated. Use "mod( int( ... ) )" instead.',new Us),Ua(yn(e),yn(t)));Ri("modInt",so);class io extends pi{static get type(){return"MathNode"}constructor(e,t,r=null,s=null){if(super(),(e===io.MAX||e===io.MIN)&&arguments.length>3){let i=new io(e,t,r);for(let t=2;tn&&i>a?t:n>a?r:a>i?s:t}generateNodeType(e){const t=this.method;return t===io.LENGTH||t===io.DISTANCE||t===io.DOT?"float":t===io.CROSS?"vec3":t===io.ALL||t===io.ANY?"bool":t===io.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===io.ONE_MINUS)i=La(1,t);else if(s===io.RECIPROCAL)i=Da(1,t);else if(s===io.DIFFERENCE)i=Fo(La(t,r));else if(s===io.TRANSFORM_DIRECTION){let s=t,n=r;e.isMatrix(s.getNodeType(e))?n=wn(Sn(n),0):s=wn(Sn(s),0);const a=Pa(s,n).xyz;i=So(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===io.NEGATE)return e.format("( - "+n.build(e,i)+" )",s,t);{const l=[];return r===io.CROSS?l.push(n.build(e,s),a.build(e,s)):u===c&&r===io.STEP?l.push(n.build(e,1===e.getTypeLength(n.getNodeType(e))?"float":i),a.build(e,i)):u!==c||r!==io.MIN&&r!==io.MAX?r===io.REFRACT?l.push(n.build(e,i),a.build(e,i),o.build(e,"float")):r===io.MIX?l.push(n.build(e,i),a.build(e,i),o.build(e,1===e.getTypeLength(o.getNodeType(e))?"float":i)):(u===h&&r===io.ATAN&&null!==a&&(r="atan2"),"fragment"===e.shaderStage||r!==io.DFDX&&r!==io.DFDY||(d(`TSL: '${r}' is not supported in the ${e.shaderStage} stage.`,this.stackTrace),r="/*"+r+"*/"),l.push(n.build(e,i)),null!==a&&l.push(a.build(e,i)),null!==o&&l.push(o.build(e,i))):l.push(n.build(e,i),a.build(e,1===e.getTypeLength(a.getNodeType(e))?"float":i)),e.format(`${e.getMethod(r,s)}( ${l.join(", ")} )`,s,t)}}serialize(e){super.serialize(e),e.method=this.method}deserialize(e){super.deserialize(e),this.method=e.method}}io.ALL="all",io.ANY="any",io.RADIANS="radians",io.DEGREES="degrees",io.EXP="exp",io.EXP2="exp2",io.LOG="log",io.LOG2="log2",io.SQRT="sqrt",io.INVERSE_SQRT="inversesqrt",io.FLOOR="floor",io.CEIL="ceil",io.NORMALIZE="normalize",io.FRACT="fract",io.SIN="sin",io.COS="cos",io.TAN="tan",io.ASIN="asin",io.ACOS="acos",io.ATAN="atan",io.ABS="abs",io.SIGN="sign",io.LENGTH="length",io.NEGATE="negate",io.ONE_MINUS="oneMinus",io.DFDX="dFdx",io.DFDY="dFdy",io.ROUND="round",io.RECIPROCAL="reciprocal",io.TRUNC="trunc",io.FWIDTH="fwidth",io.TRANSPOSE="transpose",io.DETERMINANT="determinant",io.INVERSE="inverse",io.EQUALS="equals",io.MIN="min",io.MAX="max",io.STEP="step",io.REFLECT="reflect",io.DISTANCE="distance",io.DIFFERENCE="difference",io.DOT="dot",io.CROSS="cross",io.POW="pow",io.TRANSFORM_DIRECTION="transformDirection",io.MIX="mix",io.CLAMP="clamp",io.REFRACT="refract",io.SMOOTHSTEP="smoothstep",io.FACEFORWARD="faceforward";const no=fn(1e-6),ao=fn(1e6),oo=fn(Math.PI),uo=fn(2*Math.PI),lo=fn(2*Math.PI),co=fn(.5*Math.PI),ho=on(io,io.ALL).setParameterLength(1),po=on(io,io.ANY).setParameterLength(1),go=on(io,io.RADIANS).setParameterLength(1),mo=on(io,io.DEGREES).setParameterLength(1),fo=on(io,io.EXP).setParameterLength(1),yo=on(io,io.EXP2).setParameterLength(1),bo=on(io,io.LOG).setParameterLength(1),xo=on(io,io.LOG2).setParameterLength(1),To=on(io,io.SQRT).setParameterLength(1),_o=on(io,io.INVERSE_SQRT).setParameterLength(1),vo=on(io,io.FLOOR).setParameterLength(1),No=on(io,io.CEIL).setParameterLength(1),So=on(io,io.NORMALIZE).setParameterLength(1),Ro=on(io,io.FRACT).setParameterLength(1),Ao=on(io,io.SIN).setParameterLength(1),Eo=on(io,io.COS).setParameterLength(1),wo=on(io,io.TAN).setParameterLength(1),Co=on(io,io.ASIN).setParameterLength(1),Mo=on(io,io.ACOS).setParameterLength(1),Bo=on(io,io.ATAN).setParameterLength(1,2),Fo=on(io,io.ABS).setParameterLength(1),Lo=on(io,io.SIGN).setParameterLength(1),Po=on(io,io.LENGTH).setParameterLength(1),Do=on(io,io.NEGATE).setParameterLength(1),Uo=on(io,io.ONE_MINUS).setParameterLength(1),Io=on(io,io.DFDX).setParameterLength(1),Oo=on(io,io.DFDY).setParameterLength(1),Vo=on(io,io.ROUND).setParameterLength(1),ko=on(io,io.RECIPROCAL).setParameterLength(1),Go=on(io,io.TRUNC).setParameterLength(1),zo=on(io,io.FWIDTH).setParameterLength(1),$o=on(io,io.TRANSPOSE).setParameterLength(1),Wo=on(io,io.DETERMINANT).setParameterLength(1),Ho=on(io,io.INVERSE).setParameterLength(1),qo=on(io,io.MIN).setParameterLength(2,1/0),jo=on(io,io.MAX).setParameterLength(2,1/0),Xo=on(io,io.STEP).setParameterLength(2),Ko=on(io,io.REFLECT).setParameterLength(2),Qo=on(io,io.DISTANCE).setParameterLength(2),Yo=on(io,io.DIFFERENCE).setParameterLength(2),Zo=on(io,io.DOT).setParameterLength(2),Jo=on(io,io.CROSS).setParameterLength(2),eu=on(io,io.POW).setParameterLength(2),tu=e=>Pa(e,e),ru=e=>Pa(e,e,e),su=e=>Pa(e,e,e,e),iu=on(io,io.TRANSFORM_DIRECTION).setParameterLength(2),nu=e=>Pa(Lo(e),eu(Fo(e),1/3)),au=e=>Zo(e,e),ou=on(io,io.MIX).setParameterLength(3),uu=(e,t=0,r=1)=>new io(io.CLAMP,en(e),en(t),en(r)),lu=e=>uu(e),du=on(io,io.REFRACT).setParameterLength(3),cu=on(io,io.SMOOTHSTEP).setParameterLength(3),hu=on(io,io.FACEFORWARD).setParameterLength(3),pu=dn(([e])=>{const t=Zo(e.xy,Tn(12.9898,78.233)),r=Ua(t,oo);return Ro(Ao(r).mul(43758.5453))}),gu=(e,t,r)=>ou(t,r,e),mu=(e,t,r)=>cu(t,r,e),fu=(e,t)=>Xo(t,e),yu=hu,bu=_o;Ri("all",ho),Ri("any",po),Ri("radians",go),Ri("degrees",mo),Ri("exp",fo),Ri("exp2",yo),Ri("log",bo),Ri("log2",xo),Ri("sqrt",To),Ri("inverseSqrt",_o),Ri("floor",vo),Ri("ceil",No),Ri("normalize",So),Ri("fract",Ro),Ri("sin",Ao),Ri("cos",Eo),Ri("tan",wo),Ri("asin",Co),Ri("acos",Mo),Ri("atan",Bo),Ri("abs",Fo),Ri("sign",Lo),Ri("length",Po),Ri("lengthSq",au),Ri("negate",Do),Ri("oneMinus",Uo),Ri("dFdx",Io),Ri("dFdy",Oo),Ri("round",Vo),Ri("reciprocal",ko),Ri("trunc",Go),Ri("fwidth",zo),Ri("min",qo),Ri("max",jo),Ri("step",fu),Ri("reflect",Ko),Ri("distance",Qo),Ri("dot",Zo),Ri("cross",Jo),Ri("pow",eu),Ri("pow2",tu),Ri("pow3",ru),Ri("pow4",su),Ri("transformDirection",iu),Ri("mix",gu),Ri("clamp",uu),Ri("refract",du),Ri("smoothstep",mu),Ri("faceForward",hu),Ri("difference",Yo),Ri("saturate",lu),Ri("cbrt",nu),Ri("transpose",$o),Ri("determinant",Wo),Ri("inverse",Ho),Ri("rand",pu);class xu extends di{static get type(){return"ConditionalNode"}constructor(e,t,r=null){super(),this.condNode=e,this.ifNode=t,this.elseNode=r}generateNodeType(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,r=this.ifNode.isolate(),s=this.elseNode?this.elseNode.isolate():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?On(r).build(e):"";s.nodeProperty=l;const c=i.build(e,"bool");if(e.context.uniformFlow&&null!==a){const s=n.build(e,r),i=a.build(e,r),o=e.getTernary(c,s,i);return e.format(o,r,t)}e.addFlowCode(`\n${e.tab}if ( ${c} ) {\n\n`).addFlowTab();let h=n.build(e,r);if(h&&(u?h=l+" = "+h+";":(h="return "+h+";",null===o&&(d("TSL: Return statement used in an inline 'Fn()'. Define a layout struct to allow return values.",this.stackTrace),h="// "+h))),e.removeFlowTab().addFlowCode(e.tab+"\t"+h+"\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&&(d("TSL: Return statement used in an inline 'Fn()'. Define a layout struct to allow return values.",this.stackTrace),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 Tu=nn(xu).setParameterLength(2,3);Ri("select",Tu);class _u extends di{static get type(){return"ContextNode"}constructor(e=null,t={}){super(),this.isContextNode=!0,this.node=e,this.value=t}getScope(){return this.node.getScope()}generateNodeType(e){return this.node.getNodeType(e)}getFlowContextData(){const e=[];return this.traverse(t=>{!0===t.isContextNode&&e.push(t.value)}),Object.assign({},...e)}getMemberType(e,t){return this.node.getMemberType(e,t)}analyze(e){const t=e.addContext(this.value);this.node.build(e),e.setContext(t)}setup(e){const t=e.addContext(this.value);this.node.build(e),e.setContext(t)}generate(e,t){const r=e.addContext(this.value),s=this.node.build(e,t);return e.setContext(r),s}}const vu=(e=null,t={})=>{let r=e;return null!==r&&!0===r.isNode||(t=r||t,r=null),new _u(r,t)},Nu=e=>vu(e,{uniformFlow:!0}),Su=(e,t)=>vu(e,{nodeName:t});function Ru(e,t,r=null){return vu(r,{getShadow:({light:r,shadowColorNode:s})=>t===r?s.mul(e):s})}function Au(e,t=null){return vu(t,{getAO:(t,{material:r})=>!0===r.transparent?t:null!==t?t.mul(e):e})}function Eu(e,t){return d('TSL: "label()" has been deprecated. Use "setName()" instead.'),Su(e,t)}Ri("context",vu),Ri("label",Eu),Ri("uniformFlow",Nu),Ri("setName",Su),Ri("builtinShadowContext",(e,t,r)=>Ru(t,r,e)),Ri("builtinAOContext",(e,t)=>Au(t,e));class wu extends di{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}isIntent(e){return!0!==e.getDataFromNode(this).forceDeclaration&&this.intent}getIntent(){return this.intent}getMemberType(e,t){return this.node.getMemberType(e,t)}getElementType(e){return this.node.getElementType(e)}generateNodeType(e){return this.node.getNodeType(e)}getArrayCount(e){return this.node.getArrayCount(e)}isAssign(e){return e.getDataFromNode(this).assign}build(...e){const t=e[0];if(!1===this._hasStack(t)&&"setup"===t.buildStage&&(t.context.nodeLoop||t.context.nodeBlock)){let e=!1;if(this.node.isShaderCallNodeInternal&&null===this.node.shaderNode.getLayout()&&t.fnCall&&t.fnCall.shaderNode){if(t.getDataFromNode(this.node.shaderNode).hasLoop){t.getDataFromNode(this).forceDeclaration=!0,e=!0}}const r=t.getBaseStack();e?r.addToStackBefore(this):r.addToStack(this)}return this.isIntent(t)&&!0!==this.isAssign(t)?this.node.build(...e):super.build(...e)}generate(e){const{node:t,name:r,readOnly:s}=this,{renderer:i}=e,n=!0===i.backend.isWebGPUBackend;let a=!1,u=!1;s&&(a=e.isDeterministic(t),u=n?s:a);const l=this.getNodeType(e);if("void"==l){!0!==this.isIntent(e)&&o('TSL: ".toVar()" can not be used with void type.',this.stackTrace);return t.build(e)}const d=e.getVectorType(l),c=t.build(e,d),h=e.getVarFromNode(this,r,d,void 0,u),p=e.getPropertyName(h);let g=p;if(u)if(n)g=a?`const ${p}`:`let ${p}`;else{const r=t.getArrayCount(e);g=`const ${e.getVar(h.type,p,r)}`}return e.addLineFlowCode(`${g} = ${c}`,this),p}_hasStack(e){return void 0!==e.getDataFromNode(this).stack}}const Cu=nn(wu),Mu=(e,t=null)=>Cu(e,t).toStack(),Bu=(e,t=null)=>Cu(e,t,!0).toStack(),Fu=e=>Cu(e).setIntent(!0).toStack();Ri("toVar",Mu),Ri("toConst",Bu),Ri("toVarIntent",Fu);class Lu extends di{static get type(){return"SubBuild"}constructor(e,t,r=null){super(r),this.node=e,this.name=t,this.isSubBuildNode=!0}generateNodeType(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 Pu=(e,t,r=null)=>new Lu(en(e),t,r);class Du extends di{static get type(){return"VaryingNode"}constructor(e,t=null){super(),this.node=Pu(e,"VERTEX"),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)}generateNodeType(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=Pu(this.node,"VERTEX")}return r.needsInterpolation||(r.needsInterpolation="fragment"===e.shaderStage),r}setup(e){this.setupVarying(e),e.flowNodeFromShaderStage(ei.VERTEX,this.node)}analyze(e){this.setupVarying(e),e.flowNodeFromShaderStage(ei.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,ei.VERTEX);e.flowNodeFromShaderStage(ei.VERTEX,r.node,i,n),r[t]=n}return e.getPropertyName(s)}}const Uu=nn(Du).setParameterLength(1,2),Iu=e=>Uu(e);Ri("toVarying",Uu),Ri("toVertexStage",Iu);const Ou=dn(([e])=>{const t=e.mul(.9478672986).add(.0521327014).pow(2.4),r=e.mul(.0773993808),s=e.lessThanEqual(.04045);return ou(t,r,s)}).setLayout({name:"sRGBTransferEOTF",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),Vu=dn(([e])=>{const t=e.pow(.41666).mul(1.055).sub(.055),r=e.mul(12.92),s=e.lessThanEqual(.0031308);return ou(t,r,s)}).setLayout({name:"sRGBTransferOETF",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),ku="WorkingColorSpace";class Gu extends pi{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===ku?p.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!==p.enabled&&r!==s&&r&&s?(p.getTransfer(r)===g&&(i=wn(Ou(i.rgb),i.a)),p.getPrimaries(r)!==p.getPrimaries(s)&&(i=wn(Ln(p._getMatrix(new n,r,s)).mul(i.rgb),i.a)),p.getTransfer(s)===g&&(i=wn(Vu(i.rgb),i.a)),i):i}}const zu=(e,t)=>new Gu(en(e),ku,t),$u=(e,t)=>new Gu(en(e),t,ku);Ri("workingToColorSpace",zu),Ri("colorSpaceToWorking",$u);let Wu=class extends ci{static get type(){return"ReferenceElementNode"}constructor(e,t){super(e,t),this.referenceNode=e,this.isReferenceElementNode=!0}generateNodeType(){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 Hu extends di{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=ti.OBJECT}setGroup(e){return this.group=e,this}element(e){return new Wu(this,en(e))}setNodeType(e){const t=Na(null,e);null!==this.group&&t.setGroup(this.group),this.node=t}generateNodeType(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;enew qu(e,t,r);class Xu extends pi{static get type(){return"ToneMappingNode"}constructor(e,t=Qu,r=null){super("vec3"),this._toneMapping=e,this.exposureNode=t,this.colorNode=r}customCacheKey(){return ks(this._toneMapping)}setToneMapping(e){return this._toneMapping=e,this}getToneMapping(){return this._toneMapping}setup(e){const t=this.colorNode||e.context.color,r=this._toneMapping;if(r===m)return t;let s=null;const i=e.renderer.library.getToneMappingFunction(r);return null!==i?s=wn(i(t.rgb,this.exposureNode),t.a):(o("ToneMappingNode: Unsupported Tone Mapping configuration.",r),s=t),s}}const Ku=(e,t,r)=>new Xu(e,en(t),en(r)),Qu=ju("toneMappingExposure","float");Ri("toneMapping",(e,t,r)=>Ku(t,r,e));const Yu=new WeakMap;function Zu(e,t){let r=Yu.get(e);return void 0===r&&(r=new b(e,t),Yu.set(e,r)),r}class Ju extends xi{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=f,this.instanced=!1,this.attribute=null,this.global=!0,e&&!0===e.isBufferAttribute&&e.itemSize<=4&&(this.attribute=e,this.usage=e.usage,this.instanced=e.isInstancedBufferAttribute)}getHash(e){let t;if(0===this.bufferStride&&0===this.bufferOffset){let r=e.globalCache.getData(this.value);void 0===r&&(r={node:this},e.globalCache.setData(this.value,r)),t=r.node.id}else t=this.id;return String(t)}generateNodeType(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=e.getTypeLength(t),s=this.value,i=this.bufferStride||r,n=this.bufferOffset;let a;a=!0===s.isInterleavedBuffer?s:!0===s.isBufferAttribute?Zu(s.array,i):Zu(s,i);const o=new y(a,r,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=Uu(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}}function el(e,t=null,r=0,s=0,i=f,n=!1){return"mat3"===t||null===t&&9===e.itemSize?Ln(new Ju(e,"vec3",9,0).setUsage(i).setInstanced(n),new Ju(e,"vec3",9,3).setUsage(i).setInstanced(n),new Ju(e,"vec3",9,6).setUsage(i).setInstanced(n)):"mat4"===t||null===t&&16===e.itemSize?Pn(new Ju(e,"vec4",16,0).setUsage(i).setInstanced(n),new Ju(e,"vec4",16,4).setUsage(i).setInstanced(n),new Ju(e,"vec4",16,8).setUsage(i).setInstanced(n),new Ju(e,"vec4",16,12).setUsage(i).setInstanced(n)):new Ju(e,t,r,s).setUsage(i)}const tl=(e,t=null,r=0,s=0)=>el(e,t,r,s),rl=(e,t=null,r=0,s=0)=>el(e,t,r,s,f,!0),sl=(e,t=null,r=0,s=0)=>el(e,t,r,s,x,!0);Ri("toAttribute",e=>tl(e.value));class il extends di{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=ti.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 d('TSL: "label()" has been deprecated. Use "setName()" instead.',new Us),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 nl=(e,t=[64])=>{(0===t.length||t.length>3)&&o("TSL: compute() workgroupSize must have 1, 2, or 3 elements",new Us);for(let e=0;enl(e,r).setCount(t);Ri("compute",al),Ri("computeKernel",nl);class ol extends di{static get type(){return"IsolateNode"}constructor(e,t=!0){super(),this.node=e,this.parent=t,this.isIsolateNode=!0}generateNodeType(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}setParent(e){return this.parent=e,this}getParent(){return this.parent}}const ul=e=>new ol(en(e));function ll(e,t=!0){return d('TSL: "cache()" has been deprecated. Use "isolate()" instead.'),ul(e).setParent(t)}Ri("cache",ll),Ri("isolate",ul);class dl extends di{static get type(){return"BypassNode"}constructor(e,t){super(),this.isBypassNode=!0,this.outputNode=e,this.callNode=t}generateNodeType(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 cl=nn(dl).setParameterLength(2);Ri("bypass",cl);const hl=dn(([e,t,r,s=fn(0),i=fn(1),n=xn(!1)])=>{let a=e.sub(t).div(r.sub(t));return Yi(n)&&(a=a.clamp()),a.mul(i.sub(s)).add(s)});Ri("remap",hl),Ri("remapClamp",function(e,t,r,s=fn(0),i=fn(1)){return hl(e,t,r,s,i,!0)});class pl extends di{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 gl=nn(pl).setParameterLength(1,2),ml=e=>(e?Tu(e,gl("discard")):gl("discard")).toStack();Ri("discard",ml);class fl extends pi{static get type(){return"RenderOutputNode"}constructor(e,t,r){super("vec4"),this.colorNode=e,this._toneMapping=t,this.outputColorSpace=r,this.isRenderOutputNode=!0}setToneMapping(e){return this._toneMapping=e,this}getToneMapping(){return this._toneMapping}setup({context:e}){let t=this.colorNode||e.color;const r=(null!==this._toneMapping?this._toneMapping:e.toneMapping)||m,s=(null!==this.outputColorSpace?this.outputColorSpace:e.outputColorSpace)||T;return r!==m&&(t=t.toneMapping(r)),s!==T&&s!==p.workingColorSpace&&(t=t.workingToColorSpace(s)),t}}const yl=(e,t=null,r=null)=>new fl(en(e),t,r);Ri("renderOutput",yl);class bl extends pi{static get type(){return"DebugNode"}constructor(e,t=null){super(),this.node=e,this.callback=t}generateNodeType(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);if(null!==t)t(e,r);else{const t="--- TSL debug - "+e.shaderStage+" shader ---",s="-".repeat(t.length);let i="";i+="// #"+t+"#\n",i+=e.flow.code.replace(/^\t/gm,"")+"\n",i+="/* ... */ "+r+" /* ... */\n",i+="// #"+s+"#\n",_(i)}return r}}const xl=(e,t=null)=>new bl(en(e),t).toStack();Ri("debug",xl);class Tl{constructor(){this._renderer=null,this.currentFrame=null}get nodeFrame(){return this._renderer._nodes.nodeFrame}setRenderer(e){return this._renderer=e,this}getRenderer(){return this._renderer}init(){}begin(){}finish(){}inspect(){}computeAsync(){}beginCompute(){}finishCompute(){}beginRender(){}finishRender(){}copyTextureToTexture(){}copyFramebufferToTexture(){}}class _l extends di{static get type(){return"InspectorNode"}constructor(e,t="",r=null){super(),this.node=e,this.name=t,this.callback=r,this.updateType=ti.FRAME,this.isInspectorNode=!0}getName(){return this.name||this.node.name}update(e){e.renderer.inspector.inspect(this)}generateNodeType(e){return this.node.getNodeType(e)}setup(e){let t=this.node;return!0===e.context.inspector&&null!==this.callback&&(t=this.callback(t)),!0!==e.renderer.backend.isWebGPUBackend&&e.renderer.inspector.constructor!==Tl&&v('TSL: ".toInspector()" is only available with WebGPU.'),t}}function vl(e,t="",r=null){return(e=en(e)).before(new _l(e,t,r))}Ri("toInspector",vl);class Nl extends di{static get type(){return"AttributeNode"}constructor(e,t=null){super(t),this.global=!0,this._attributeName=e}getHash(e){return this.getAttributeName(e)}generateNodeType(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 Uu(this).build(e,r)}return d(`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 Sl=(e,t=null)=>new Nl(e,t),Rl=(e=0)=>Sl("uv"+(e>0?e:""),"vec2");class Al extends di{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=nn(Al).setParameterLength(1,2);class wl extends va{static get type(){return"MaxMipLevelNode"}constructor(e){super(0),this._textureNode=e,this.updateType=ti.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 Cl=nn(wl).setParameterLength(1);class Ml extends Error{constructor(e,t=null){super(e),this.name="NodeError",this.stackTrace=t}}const Bl=new N;class Fl extends va{static get type(){return"TextureNode"}constructor(e=Bl,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.offsetNode=null,this.sampler=!0,this.updateMatrix=!1,this.updateType=ti.NONE,this.referenceNode=null,this._value=e,this._matrixUniform=null,this._flipYUniform=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}generateNodeType(){return!0===this.value.isDepthTexture?"float":this.value.type===S?"uvec4":this.value.type===R?"ivec4":"vec4"}getInputType(){return"texture"}getDefaultUV(){return Rl(this.value.channel)}updateReference(){return this.value}getTransformedUV(e){return null===this._matrixUniform&&(this._matrixUniform=Na(this.value.matrix)),this._matrixUniform.mul(Sn(e,1)).xy}setUpdateMatrix(e){return this.updateMatrix=e,this}setupUV(e,t){return e.isFlipY()&&(null===this._flipYUniform&&(this._flipYUniform=Na(!1)),t=t.toVar(),t=this.sampler?this._flipYUniform.select(t.flipY(),t):this._flipYUniform.select(t.setY(yn(El(this,this.levelNode).y).sub(t.y).sub(1)),t)),t}setup(e){const t=e.getNodeProperties(this);t.referenceNode=this.referenceNode;const r=this.value;if(!r||!0!==r.isTexture)throw new Ml("THREE.TSL: `texture( value )` function expects a valid instance of THREE.Texture().",this.stackTrace);const s=dn(()=>{let t=this.uvNode;return null!==t&&!0!==e.context.forceUVContext||!e.context.getUV||(t=e.context.getUV(this,e)),t||(t=this.getDefaultUV()),!0===this.updateMatrix&&(t=this.getTransformedUV(t)),t=this.setupUV(e,t),this.updateType=null!==this._matrixUniform||null!==this._flipYUniform?ti.OBJECT:ti.NONE,t})();let i=this.levelNode;null===i&&e.context.getTextureLevel&&(i=e.context.getTextureLevel(this));let n=null,a=null;if(null!==this.compareNode)if(e.renderer.hasCompatibility(A.TEXTURE_COMPARE))n=this.compareNode;else{const e=r.compareFunction;null===e||e===E||e===w||e===C||e===M?a=this.compareNode:(n=this.compareNode,v('TSL: Only "LessCompare", "LessEqualCompare", "GreaterCompare" and "GreaterEqualCompare" are supported for depth texture comparison fallback.'))}t.uvNode=s,t.levelNode=i,t.biasNode=this.biasNode,t.compareNode=n,t.compareStepNode=a,t.gradNode=this.gradNode,t.depthNode=this.depthNode,t.offsetNode=this.offsetNode}generateUV(e,t){return t.build(e,!0===this.sampler?"vec2":"ivec2")}generateOffset(e,t){return t.build(e,"ivec2")}generateSnippet(e,t,r,s,i,n,a,o,u){const l=this.value;let d;return d=i?e.generateTextureBias(l,t,r,i,n,u):o?e.generateTextureGrad(l,t,r,o,n,u):a?e.generateTextureCompare(l,t,r,a,n,u):!1===this.sampler?e.generateTextureLoad(l,t,r,s,n,u):s?e.generateTextureLevel(l,t,r,s,n,u):e.generateTexture(l,t,r,n,u),d}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),a=this.getNodeType(e);let o=n.propertyName;if(void 0===o){const{uvNode:t,levelNode:u,biasNode:l,compareNode:d,compareStepNode:c,depthNode:h,gradNode:p,offsetNode:g}=s,m=this.generateUV(e,t),f=u?u.build(e,"float"):null,y=l?l.build(e,"float"):null,b=h?h.build(e,"int"):null,x=d?d.build(e,"float"):null,T=c?c.build(e,"float"):null,_=p?[p[0].build(e,"vec2"),p[1].build(e,"vec2")]:null,v=g?this.generateOffset(e,g):null;let N=b;null===N&&r.isArrayTexture&&!0!==this.isTexture3DNode&&(N="0");const S=e.getVarFromNode(this);o=e.getPropertyName(S);let R=this.generateSnippet(e,i,m,f,y,N,x,_,v);if(null!==T){const t=r.compareFunction;R=t===C||t===M?Xo(gl(R,a),gl(T,"float")).build(e,a):Xo(gl(T,"float"),gl(R,a)).build(e,a)}e.addLineFlowCode(`${o} = ${R}`,this),n.snippet=R,n.propertyName=o}let u=o;return e.needsToWorkingColorSpace(r)&&(u=$u(gl(u,a),r.colorSpace).setup(e).build(e,a)),e.format(u,a,t)}}setSampler(e){return this.sampler=e,this}getSampler(){return this.sampler}sample(e){const t=this.clone();return t.uvNode=en(e),t.referenceNode=this.getBase(),en(t)}load(e){return this.sample(e).setSampler(!1)}blur(e){const t=this.clone();t.biasNode=en(e).mul(Cl(t)),t.referenceNode=this.getBase();const r=t.value;return!1===t.generateMipmaps&&(r&&!1===r.generateMipmaps||r.minFilter===B||r.magFilter===B)&&(d("TSL: texture().blur() requires mipmaps and sampling. Use .generateMipmaps=true and .minFilter/.magFilter=THREE.LinearFilter in the Texture."),t.biasNode=null),en(t)}level(e){const t=this.clone();return t.levelNode=en(e),t.referenceNode=this.getBase(),en(t)}size(e){return El(this,e)}bias(e){const t=this.clone();return t.biasNode=en(e),t.referenceNode=this.getBase(),en(t)}getBase(){return this.referenceNode?this.referenceNode.getBase():this}compare(e){const t=this.clone();return t.compareNode=en(e),t.referenceNode=this.getBase(),en(t)}grad(e,t){const r=this.clone();return r.gradNode=[en(e),en(t)],r.referenceNode=this.getBase(),en(r)}depth(e){const t=this.clone();return t.depthNode=en(e),t.referenceNode=this.getBase(),en(t)}offset(e){const t=this.clone();return t.offsetNode=en(e),t.referenceNode=this.getBase(),en(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();const r=this._flipYUniform;null!==r&&(r.value=e.image instanceof ImageBitmap&&!0===e.flipY||!0===e.isRenderTargetTexture||!0===e.isFramebufferTexture||!0===e.isDepthTexture)}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.offsetNode=this.offsetNode,e}}const Ll=nn(Fl).setParameterLength(1,4).setName("texture"),Pl=(e=Bl,t=null,r=null,s=null)=>{let i;return e&&!0===e.isTextureNode?(i=en(e.clone()),i.referenceNode=e.getBase(),null!==t&&(i.uvNode=en(t)),null!==r&&(i.levelNode=en(r)),null!==s&&(i.biasNode=en(s))):i=Ll(e,t,r,s),i},Dl=(...e)=>Pl(...e).setSampler(!1);class Ul extends va{static get type(){return"BufferNode"}constructor(e,t,r=0){super(e,t),this.isBufferNode=!0,this.bufferType=t,this.bufferCount=r,this.updateRanges=[]}addUpdateRange(e,t){this.updateRanges.push({start:e,count:t})}clearUpdateRanges(){this.updateRanges.length=0}getElementType(e){return this.getNodeType(e)}getInputType(){return"buffer"}}const Il=(e,t,r)=>new Ul(e,t,r);class Ol extends ci{static get type(){return"UniformArrayElementNode"}constructor(e,t){super(e,t),this.isArrayBufferElementNode=!0}generate(e){const t=super.generate(e),r=this.getNodeType(e),s=this.node.getPaddedType();return e.format(t,s,r)}}class Vl extends Ul{static get type(){return"UniformArrayNode"}constructor(e,t=null){super(null),this.array=e,this.elementType=null===t?Xs(e[0]):t,this.paddedType=this.getPaddedType(),this.updateType=ti.RENDER,this.isArrayBufferNode=!0}generateNodeType(){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;rnew Vl(e,t);class Gl extends di{constructor(e){super("float"),this.name=e,this.isBuiltinNode=!0}generate(){return this.name}}const zl=nn(Gl).setParameterLength(1);let $l,Wl;class Hl extends di{static get type(){return"ScreenNode"}constructor(e){super(),this.scope=e,this._output=null,this.isViewportNode=!0}generateNodeType(){return this.scope===Hl.DPR?"float":this.scope===Hl.VIEWPORT?"vec4":"vec2"}getUpdateType(){let e=ti.NONE;return this.scope!==Hl.SIZE&&this.scope!==Hl.VIEWPORT&&this.scope!==Hl.DPR||(e=ti.RENDER),this.updateType=e,e}update({renderer:e}){const t=e.getRenderTarget();this.scope===Hl.VIEWPORT?null!==t?Wl.copy(t.viewport):(e.getViewport(Wl),Wl.multiplyScalar(e.getPixelRatio())):this.scope===Hl.DPR?this._output.value=e.getPixelRatio():null!==t?($l.width=t.width,$l.height=t.height):e.getDrawingBufferSize($l)}setup(){const e=this.scope;let r=null;return r=e===Hl.SIZE?Na($l||($l=new t)):e===Hl.VIEWPORT?Na(Wl||(Wl=new s)):e===Hl.DPR?Na(1):Tn(Kl.div(Xl)),this._output=r,r}generate(e){if(this.scope===Hl.COORDINATE){let t=e.getFragCoord();if(e.isFlipY()){const r=e.getNodeProperties(Xl).outputNode.build(e);t=`${e.getType("vec2")}( ${t}.x, ${r}.y - ${t}.y )`}return t}return super.generate(e)}}Hl.COORDINATE="coordinate",Hl.VIEWPORT="viewport",Hl.SIZE="size",Hl.UV="uv",Hl.DPR="dpr";const ql=an(Hl,Hl.DPR),jl=an(Hl,Hl.UV),Xl=an(Hl,Hl.SIZE),Kl=an(Hl,Hl.COORDINATE),Ql=an(Hl,Hl.VIEWPORT),Yl=Ql.zw,Zl=Kl.sub(Ql.xy),Jl=Zl.div(Yl),ed=dn(()=>(d('TSL: "viewportResolution" is deprecated. Use "screenSize" instead.',new Us),Xl),"vec2").once()();let td=null,rd=null,sd=null,id=null,nd=null,ad=null,od=null,ud=null,ld=null,dd=null,cd=null,hd=null,pd=null,gd=null;const md=Na(0,"uint").setName("u_cameraIndex").setGroup(ba("cameraIndex")).toVarying("v_cameraIndex"),fd=Na("float").setName("cameraNear").setGroup(Ta).onRenderUpdate(({camera:e})=>e.near),yd=Na("float").setName("cameraFar").setGroup(Ta).onRenderUpdate(({camera:e})=>e.far),bd=dn(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.projectionMatrix);null===rd?rd=kl(r).setGroup(Ta).setName("cameraProjectionMatrices"):rd.array=r,t=rd.element(e.isMultiViewCamera?zl("gl_ViewID_OVR"):md).toConst("cameraProjectionMatrix")}else null===td&&(td=Na(e.projectionMatrix).setName("cameraProjectionMatrix").setGroup(Ta).onRenderUpdate(({camera:e})=>e.projectionMatrix)),t=td;return t}).once()(),xd=dn(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.projectionMatrixInverse);null===id?id=kl(r).setGroup(Ta).setName("cameraProjectionMatricesInverse"):id.array=r,t=id.element(e.isMultiViewCamera?zl("gl_ViewID_OVR"):md).toConst("cameraProjectionMatrixInverse")}else null===sd&&(sd=Na(e.projectionMatrixInverse).setName("cameraProjectionMatrixInverse").setGroup(Ta).onRenderUpdate(({camera:e})=>e.projectionMatrixInverse)),t=sd;return t}).once()(),Td=dn(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.matrixWorldInverse);null===ad?ad=kl(r).setGroup(Ta).setName("cameraViewMatrices"):ad.array=r,t=ad.element(e.isMultiViewCamera?zl("gl_ViewID_OVR"):md).toConst("cameraViewMatrix")}else null===nd&&(nd=Na(e.matrixWorldInverse).setName("cameraViewMatrix").setGroup(Ta).onRenderUpdate(({camera:e})=>e.matrixWorldInverse)),t=nd;return t}).once()(),_d=dn(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.matrixWorld);null===ud?ud=kl(r).setGroup(Ta).setName("cameraWorldMatrices"):ud.array=r,t=ud.element(e.isMultiViewCamera?zl("gl_ViewID_OVR"):md).toConst("cameraWorldMatrix")}else null===od&&(od=Na(e.matrixWorld).setName("cameraWorldMatrix").setGroup(Ta).onRenderUpdate(({camera:e})=>e.matrixWorld)),t=od;return t}).once()(),vd=dn(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.normalMatrix);null===dd?dd=kl(r).setGroup(Ta).setName("cameraNormalMatrices"):dd.array=r,t=dd.element(e.isMultiViewCamera?zl("gl_ViewID_OVR"):md).toConst("cameraNormalMatrix")}else null===ld&&(ld=Na(e.normalMatrix).setName("cameraNormalMatrix").setGroup(Ta).onRenderUpdate(({camera:e})=>e.normalMatrix)),t=ld;return t}).once()(),Nd=dn(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const s=[];for(let t=0,i=e.cameras.length;t{const r=e.cameras,s=t.array;for(let e=0,t=r.length;et.value.setFromMatrixPosition(e.matrixWorld))),t=cd;return t}).once()(),Sd=dn(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.viewport);null===gd?gd=kl(r,"vec4").setGroup(Ta).setName("cameraViewports"):gd.array=r,t=gd.element(md).toConst("cameraViewport")}else null===pd&&(pd=wn(0,0,Xl.x,Xl.y).toConst("cameraViewport")),t=pd;return t}).once()(),Rd=new F;class Ad extends di{static get type(){return"Object3DNode"}constructor(e,t=null){super(),this.scope=e,this.object3d=t,this.updateType=ti.OBJECT,this.uniformNode=new va(null)}generateNodeType(){const e=this.scope;return e===Ad.WORLD_MATRIX?"mat4":e===Ad.POSITION||e===Ad.VIEW_POSITION||e===Ad.DIRECTION||e===Ad.SCALE?"vec3":e===Ad.RADIUS?"float":void 0}update(e){const t=this.object3d,s=this.uniformNode,i=this.scope;if(i===Ad.WORLD_MATRIX)s.value=t.matrixWorld;else if(i===Ad.POSITION)s.value=s.value||new r,s.value.setFromMatrixPosition(t.matrixWorld);else if(i===Ad.SCALE)s.value=s.value||new r,s.value.setFromMatrixScale(t.matrixWorld);else if(i===Ad.DIRECTION)s.value=s.value||new r,t.getWorldDirection(s.value);else if(i===Ad.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===Ad.RADIUS){const r=e.object.geometry;null===r.boundingSphere&&r.computeBoundingSphere(),Rd.copy(r.boundingSphere).applyMatrix4(t.matrixWorld),s.value=Rd.radius}}generate(e){const t=this.scope;return t===Ad.WORLD_MATRIX?this.uniformNode.nodeType="mat4":t===Ad.POSITION||t===Ad.VIEW_POSITION||t===Ad.DIRECTION||t===Ad.SCALE?this.uniformNode.nodeType="vec3":t===Ad.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}}Ad.WORLD_MATRIX="worldMatrix",Ad.POSITION="position",Ad.SCALE="scale",Ad.VIEW_POSITION="viewPosition",Ad.DIRECTION="direction",Ad.RADIUS="radius";const Ed=nn(Ad,Ad.DIRECTION).setParameterLength(1),wd=nn(Ad,Ad.WORLD_MATRIX).setParameterLength(1),Cd=nn(Ad,Ad.POSITION).setParameterLength(1),Md=nn(Ad,Ad.SCALE).setParameterLength(1),Bd=nn(Ad,Ad.VIEW_POSITION).setParameterLength(1),Fd=nn(Ad,Ad.RADIUS).setParameterLength(1);class Ld extends Ad{static get type(){return"ModelNode"}constructor(e){super(e)}update(e){this.object3d=e.object,super.update(e)}}const Pd=an(Ld,Ld.DIRECTION),Dd=an(Ld,Ld.WORLD_MATRIX),Ud=an(Ld,Ld.POSITION),Id=an(Ld,Ld.SCALE),Od=an(Ld,Ld.VIEW_POSITION),Vd=an(Ld,Ld.RADIUS),kd=Na(new n).onObjectUpdate(({object:e},t)=>t.value.getNormalMatrix(e.matrixWorld)),Gd=Na(new a).onObjectUpdate(({object:e},t)=>t.value.copy(e.matrixWorld).invert()),zd=dn(e=>e.context.modelViewMatrix||$d).once()().toVar("modelViewMatrix"),$d=Td.mul(Dd),Wd=dn(e=>(e.context.isHighPrecisionModelViewMatrix=!0,Na("mat4").onObjectUpdate(({object:e,camera:t})=>e.modelViewMatrix.multiplyMatrices(t.matrixWorldInverse,e.matrixWorld)))).once()().toVar("highpModelViewMatrix"),Hd=dn(e=>{const t=e.context.isHighPrecisionModelViewMatrix;return Na("mat3").onObjectUpdate(({object:e,camera:r})=>(!0!==t&&e.modelViewMatrix.multiplyMatrices(r.matrixWorldInverse,e.matrixWorld),e.normalMatrix.getNormalMatrix(e.modelViewMatrix)))}).once()().toVar("highpModelNormalViewMatrix"),qd=dn(e=>"fragment"!==e.shaderStage?(v("TSL: `clipSpace` is only available in fragment stage."),wn()):e.context.clipSpace.toVarying("v_clipSpace")).once()(),jd=Sl("position","vec3"),Xd=jd.toVarying("positionLocal"),Kd=jd.toVarying("positionPrevious"),Qd=dn(e=>Dd.mul(Xd).xyz.toVarying(e.getSubBuildProperty("v_positionWorld")),"vec3").once(["POSITION"])(),Yd=dn(()=>Xd.transformDirection(Dd).toVarying("v_positionWorldDirection").normalize().toVar("positionWorldDirection"),"vec3").once(["POSITION"])(),Zd=dn(e=>{if("fragment"===e.shaderStage&&e.material.vertexNode){const e=xd.mul(qd);return e.xyz.div(e.w).toVar("positionView")}return e.context.setupPositionView().toVarying("v_positionView")},"vec3").once(["POSITION","VERTEX"])(),Jd=dn(e=>{let t;return t=e.camera.isOrthographicCamera?Sn(0,0,1):Zd.negate().toVarying("v_positionViewDirection").normalize(),t.toVar("positionViewDirection")},"vec3").once(["POSITION"])();class ec extends di{static get type(){return"FrontFacingNode"}constructor(){super("bool"),this.isFrontFacingNode=!0}generate(e){if("fragment"!==e.shaderStage)return"true";const{material:t}=e;return t.side===L?"false":e.getFrontFacing()}}const tc=an(ec),rc=fn(tc).mul(2).sub(1),sc=dn(([e],{material:t})=>{const r=t.side;return r===L?e=e.mul(-1):r===P&&(e=e.mul(rc)),e}),ic=Sl("normal","vec3"),nc=dn(e=>!1===e.geometry.hasAttribute("normal")?(d('TSL: Vertex attribute "normal" not found on geometry.'),Sn(0,1,0)):ic,"vec3").once()().toVar("normalLocal"),ac=Zd.dFdx().cross(Zd.dFdy()).normalize().toVar("normalFlat"),oc=dn(e=>{let t;return t=e.isFlatShading()?ac:pc(nc).toVarying("v_normalViewGeometry").normalize(),t},"vec3").once()().toVar("normalViewGeometry"),uc=dn(e=>{let t=oc.transformDirection(Td);return!0!==e.isFlatShading()&&(t=t.toVarying("v_normalWorldGeometry")),t.normalize().toVar("normalWorldGeometry")},"vec3").once()(),lc=dn(e=>{let t;return"NORMAL"===e.subBuildFn||"VERTEX"===e.subBuildFn?(t=oc,!0!==e.isFlatShading()&&(t=sc(t))):t=e.context.setupNormal().context({getUV:null,getTextureLevel:null}),t},"vec3").once(["NORMAL","VERTEX"])().toVar("normalView"),dc=lc.transformDirection(Td).toVar("normalWorld"),cc=dn(({subBuildFn:e,context:t})=>{let r;return r="NORMAL"===e||"VERTEX"===e?lc:t.setupClearcoatNormal().context({getUV:null,getTextureLevel:null}),r},"vec3").once(["NORMAL","VERTEX"])().toVar("clearcoatNormalView"),hc=dn(([e,t=Dd])=>{const r=Ln(t),s=e.div(Sn(r[0].dot(r[0]),r[1].dot(r[1]),r[2].dot(r[2])));return r.mul(s).xyz}),pc=dn(([e],t)=>{const r=t.context.modelNormalViewMatrix;if(r)return r.transformDirection(e);const s=kd.mul(e);return Td.transformDirection(s)}),gc=dn(()=>(d('TSL: "transformedNormalView" is deprecated. Use "normalView" instead.'),lc)).once(["NORMAL","VERTEX"])(),mc=dn(()=>(d('TSL: "transformedNormalWorld" is deprecated. Use "normalWorld" instead.'),dc)).once(["NORMAL","VERTEX"])(),fc=dn(()=>(d('TSL: "transformedClearcoatNormalView" is deprecated. Use "clearcoatNormalView" instead.'),cc)).once(["NORMAL","VERTEX"])(),yc=new D,bc=new a,xc=Na(0).onReference(({material:e})=>e).onObjectUpdate(({material:e})=>e.refractionRatio),Tc=Na(1).onReference(({material:e})=>e).onObjectUpdate(function({material:e,scene:t}){return e.envMap?e.envMapIntensity:t.environmentIntensity}),_c=Na(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?(yc.copy(r),bc.makeRotationFromEuler(yc)):bc.identity(),bc}),vc=Jd.negate().reflect(lc),Nc=Jd.negate().refract(lc,xc),Sc=vc.transformDirection(Td).toVar("reflectVector"),Rc=Nc.transformDirection(Td).toVar("reflectVector"),Ac=new U;class Ec extends Fl{static get type(){return"CubeTextureNode"}constructor(e,t=null,r=null,s=null){super(e,t,r,s),this.isCubeTextureNode=!0}getInputType(){return!0===this.value.isDepthTexture?"cubeDepthTexture":"cubeTexture"}getDefaultUV(){const e=this.value;return e.mapping===I?Sc:e.mapping===O?Rc:(o('CubeTextureNode: Mapping "%s" not supported.',e.mapping),Sn(0,0,0))}setUpdateMatrix(){}setupUV(e,t){const r=this.value;return!0===r.isDepthTexture?e.renderer.coordinateSystem===h?Sn(t.x,t.y.negate(),t.z):t:(e.renderer.coordinateSystem!==h&&r.isRenderTargetTexture||(t=Sn(t.x.negate(),t.yz)),_c.mul(t))}generateUV(e,t){return t.build(e,!0===this.sampler?"vec3":"ivec3")}}const wc=nn(Ec).setParameterLength(1,4).setName("cubeTexture"),Cc=(e=Ac,t=null,r=null,s=null)=>{let i;return e&&!0===e.isCubeTextureNode?(i=en(e.clone()),i.referenceNode=e,null!==t&&(i.uvNode=en(t)),null!==r&&(i.levelNode=en(r)),null!==s&&(i.biasNode=en(s))):i=wc(e,t,r,s),i};class Mc extends ci{static get type(){return"ReferenceElementNode"}constructor(e,t){super(e,t),this.referenceNode=e,this.isReferenceElementNode=!0}generateNodeType(){return this.referenceNode.uniformType}generate(e){const t=super.generate(e),r=this.referenceNode.getNodeType(e),s=this.getNodeType(e);return e.format(t,r,s)}}class Bc extends di{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=ti.OBJECT}element(e){return new Mc(this,en(e))}setGroup(e){return this.group=e,this}setName(e){return this.name=e,this}label(e){return d('TSL: "label()" has been deprecated. Use "setName()" instead.'),this.setName(e)}setNodeType(e){let t=null;t=null!==this.count?Il(null,e,this.count):Array.isArray(this.getValueFromReference())?kl(null,e):"texture"===e?Pl(null):"cubeTexture"===e?Cc(null):Na(null,e),null!==this.group&&t.setGroup(this.group),null!==this.name&&t.setName(this.name),this.node=t}generateNodeType(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;enew Bc(e,t,r),Lc=(e,t,r,s)=>new Bc(e,t,s,r);class Pc extends Bc{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 Dc=(e,t,r=null)=>new Pc(e,t,r),Uc=Rl(),Ic=Zd.dFdx(),Oc=Zd.dFdy(),Vc=Uc.dFdx(),kc=Uc.dFdy(),Gc=lc,zc=Oc.cross(Gc),$c=Gc.cross(Ic),Wc=zc.mul(Vc.x).add($c.mul(kc.x)),Hc=zc.mul(Vc.y).add($c.mul(kc.y)),qc=Wc.dot(Wc).max(Hc.dot(Hc)),jc=qc.equal(0).select(0,qc.inverseSqrt()),Xc=Wc.mul(jc).toVar("tangentViewFrame"),Kc=Hc.mul(jc).toVar("bitangentViewFrame"),Qc=Sl("tangent","vec4"),Yc=Qc.xyz.toVar("tangentLocal"),Zc=dn(e=>{let t;return t="VERTEX"===e.subBuildFn||e.geometry.hasAttribute("tangent")?zd.mul(wn(Yc,0)).xyz.toVarying("v_tangentView").normalize():Xc,!0!==e.isFlatShading()&&(t=sc(t)),t},"vec3").once(["NORMAL","VERTEX"])().toVar("tangentView"),Jc=Zc.transformDirection(Td).toVarying("v_tangentWorld").normalize().toVar("tangentWorld"),eh=dn(([e,t],r)=>{let s=e.mul(Qc.w).xyz;return"NORMAL"===r.subBuildFn&&!0!==r.isFlatShading()&&(s=s.toVarying(t)),s}).once(["NORMAL"]),th=eh(ic.cross(Qc),"v_bitangentGeometry").normalize().toVar("bitangentGeometry"),rh=eh(nc.cross(Yc),"v_bitangentLocal").normalize().toVar("bitangentLocal"),sh=dn(e=>{let t;return t="VERTEX"===e.subBuildFn||e.geometry.hasAttribute("tangent")?eh(lc.cross(Zc),"v_bitangentView").normalize():Kc,!0!==e.isFlatShading()&&(t=sc(t)),t},"vec3").once(["NORMAL","VERTEX"])().toVar("bitangentView"),ih=eh(dc.cross(Jc),"v_bitangentWorld").normalize().toVar("bitangentWorld"),nh=Ln(Zc,sh,lc).toVar("TBNViewMatrix"),ah=Jd.mul(nh),oh=dn(()=>{let e=ta.cross(Jd);return e=e.cross(ta).normalize(),e=ou(e,lc,Jn.mul($n.oneMinus()).oneMinus().pow2().pow2()).normalize(),e}).once()(),uh=e=>en(e).mul(.5).add(.5),lh=e=>Sn(e,To(lu(fn(1).sub(Zo(e,e)))));class dh extends pi{static get type(){return"NormalMapNode"}constructor(e,t=null){super("vec3"),this.node=e,this.scaleNode=t,this.normalMapType=V,this.unpackNormalMode=k}setup(e){const{normalMapType:t,scaleNode:r,unpackNormalMode:s}=this;let i=this.node.mul(2).sub(1);if(t===V?s===G?i=lh(i.xy):s===z?i=lh(i.yw):s!==k&&console.error(`THREE.NodeMaterial: Unexpected unpack normal mode: ${s}`):s!==k&&console.error(`THREE.NodeMaterial: Normal map type '${t}' is not compatible with unpack normal mode '${s}'`),null!==r){let t=r;!0===e.isFlatShading()&&(t=sc(t)),i=Sn(i.xy.mul(t),i.z)}let n=null;return t===$?n=pc(i):t===V?n=nh.mul(i).normalize():(o(`NodeMaterial: Unsupported normal map type: ${t}`),n=lc),n}}const ch=nn(dh).setParameterLength(1,2),hh=dn(({textureNode:e,bumpScale:t})=>{const r=t=>e.isolate().context({getUV:e=>t(e.uvNode||Rl()),forceUVContext:!0}),s=fn(r(e=>e));return Tn(fn(r(e=>e.add(e.dFdx()))).sub(s),fn(r(e=>e.add(e.dFdy()))).sub(s)).mul(t)}),ph=dn(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(rc),l=u.sign().mul(s.x.mul(a).add(s.y.mul(o)));return u.abs().mul(r).sub(l).normalize()});class gh extends pi{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=hh({textureNode:this.textureNode,bumpScale:e});return ph({surf_pos:Zd,surf_norm:lc,dHdxy:t})}}const mh=nn(gh).setParameterLength(1,2),fh=new Map;class yh extends di{static get type(){return"MaterialNode"}constructor(e){super(),this.scope=e}getCache(e,t){let r=fh.get(e);return void 0===r&&(r=Dc(e,t),fh.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===yh.COLOR){const e=void 0!==t.color?this.getColor(r):Sn();s=t.map&&!0===t.map.isTexture?e.mul(this.getTexture("map")):e}else if(r===yh.OPACITY){const e=this.getFloat(r);s=t.alphaMap&&!0===t.alphaMap.isTexture?e.mul(this.getTexture("alpha")):e}else if(r===yh.SPECULAR_STRENGTH)s=t.specularMap&&!0===t.specularMap.isTexture?this.getTexture("specular").r:fn(1);else if(r===yh.SPECULAR_INTENSITY){const e=this.getFloat(r);s=t.specularIntensityMap&&!0===t.specularIntensityMap.isTexture?e.mul(this.getTexture(r).a):e}else if(r===yh.SPECULAR_COLOR){const e=this.getColor(r);s=t.specularColorMap&&!0===t.specularColorMap.isTexture?e.mul(this.getTexture(r).rgb):e}else if(r===yh.ROUGHNESS){const e=this.getFloat(r);s=t.roughnessMap&&!0===t.roughnessMap.isTexture?e.mul(this.getTexture(r).g):e}else if(r===yh.METALNESS){const e=this.getFloat(r);s=t.metalnessMap&&!0===t.metalnessMap.isTexture?e.mul(this.getTexture(r).b):e}else if(r===yh.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===yh.NORMAL)t.normalMap?(s=ch(this.getTexture("normal"),this.getCache("normalScale","vec2")),s.normalMapType=t.normalMapType,t.normalMap.format!=W&&t.normalMap.format!=H&&t.normalMap.format!=q||(s.unpackNormalMode=G)):s=t.bumpMap?mh(this.getTexture("bump").r,this.getFloat("bumpScale")):lc;else if(r===yh.CLEARCOAT){const e=this.getFloat(r);s=t.clearcoatMap&&!0===t.clearcoatMap.isTexture?e.mul(this.getTexture(r).r):e}else if(r===yh.CLEARCOAT_ROUGHNESS){const e=this.getFloat(r);s=t.clearcoatRoughnessMap&&!0===t.clearcoatRoughnessMap.isTexture?e.mul(this.getTexture(r).r):e}else if(r===yh.CLEARCOAT_NORMAL)s=t.clearcoatNormalMap?ch(this.getTexture(r),this.getCache(r+"Scale","vec2")):lc;else if(r===yh.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===yh.SHEEN_ROUGHNESS){const e=this.getFloat(r);s=t.sheenRoughnessMap&&!0===t.sheenRoughnessMap.isTexture?e.mul(this.getTexture(r).a):e,s=s.clamp(1e-4,1)}else if(r===yh.ANISOTROPY)if(t.anisotropyMap&&!0===t.anisotropyMap.isTexture){const e=this.getTexture(r);s=Fn(tp.x,tp.y,tp.y.negate(),tp.x).mul(e.rg.mul(2).sub(Tn(1)).normalize().mul(e.b))}else s=tp;else if(r===yh.IRIDESCENCE_THICKNESS){const e=Fc("1","float",t.iridescenceThicknessRange);if(t.iridescenceThicknessMap){const i=Fc("0","float",t.iridescenceThicknessRange);s=e.sub(i).mul(this.getTexture(r).g).add(i)}else s=e}else if(r===yh.TRANSMISSION){const e=this.getFloat(r);s=t.transmissionMap?e.mul(this.getTexture(r).r):e}else if(r===yh.THICKNESS){const e=this.getFloat(r);s=t.thicknessMap?e.mul(this.getTexture(r).g):e}else if(r===yh.IOR)s=this.getFloat(r);else if(r===yh.LIGHT_MAP)s=this.getTexture(r).rgb.mul(this.getFloat("lightMapIntensity"));else if(r===yh.AO)s=this.getTexture(r).r.sub(1).mul(this.getFloat("aoMapIntensity")).add(1);else if(r===yh.LINE_DASH_OFFSET)s=t.dashOffset?this.getFloat(r):fn(0);else{const t=this.getNodeType(e);s=this.getCache(r,t)}return s}}yh.ALPHA_TEST="alphaTest",yh.COLOR="color",yh.OPACITY="opacity",yh.SHININESS="shininess",yh.SPECULAR="specular",yh.SPECULAR_STRENGTH="specularStrength",yh.SPECULAR_INTENSITY="specularIntensity",yh.SPECULAR_COLOR="specularColor",yh.REFLECTIVITY="reflectivity",yh.ROUGHNESS="roughness",yh.METALNESS="metalness",yh.NORMAL="normal",yh.CLEARCOAT="clearcoat",yh.CLEARCOAT_ROUGHNESS="clearcoatRoughness",yh.CLEARCOAT_NORMAL="clearcoatNormal",yh.EMISSIVE="emissive",yh.ROTATION="rotation",yh.SHEEN="sheen",yh.SHEEN_ROUGHNESS="sheenRoughness",yh.ANISOTROPY="anisotropy",yh.IRIDESCENCE="iridescence",yh.IRIDESCENCE_IOR="iridescenceIOR",yh.IRIDESCENCE_THICKNESS="iridescenceThickness",yh.IOR="ior",yh.TRANSMISSION="transmission",yh.THICKNESS="thickness",yh.ATTENUATION_DISTANCE="attenuationDistance",yh.ATTENUATION_COLOR="attenuationColor",yh.LINE_SCALE="scale",yh.LINE_DASH_SIZE="dashSize",yh.LINE_GAP_SIZE="gapSize",yh.LINE_WIDTH="linewidth",yh.LINE_DASH_OFFSET="dashOffset",yh.POINT_SIZE="size",yh.DISPERSION="dispersion",yh.LIGHT_MAP="light",yh.AO="ao";const bh=an(yh,yh.ALPHA_TEST),xh=an(yh,yh.COLOR),Th=an(yh,yh.SHININESS),_h=an(yh,yh.EMISSIVE),vh=an(yh,yh.OPACITY),Nh=an(yh,yh.SPECULAR),Sh=an(yh,yh.SPECULAR_INTENSITY),Rh=an(yh,yh.SPECULAR_COLOR),Ah=an(yh,yh.SPECULAR_STRENGTH),Eh=an(yh,yh.REFLECTIVITY),wh=an(yh,yh.ROUGHNESS),Ch=an(yh,yh.METALNESS),Mh=an(yh,yh.NORMAL),Bh=an(yh,yh.CLEARCOAT),Fh=an(yh,yh.CLEARCOAT_ROUGHNESS),Lh=an(yh,yh.CLEARCOAT_NORMAL),Ph=an(yh,yh.ROTATION),Dh=an(yh,yh.SHEEN),Uh=an(yh,yh.SHEEN_ROUGHNESS),Ih=an(yh,yh.ANISOTROPY),Oh=an(yh,yh.IRIDESCENCE),Vh=an(yh,yh.IRIDESCENCE_IOR),kh=an(yh,yh.IRIDESCENCE_THICKNESS),Gh=an(yh,yh.TRANSMISSION),zh=an(yh,yh.THICKNESS),$h=an(yh,yh.IOR),Wh=an(yh,yh.ATTENUATION_DISTANCE),Hh=an(yh,yh.ATTENUATION_COLOR),qh=an(yh,yh.LINE_SCALE),jh=an(yh,yh.LINE_DASH_SIZE),Xh=an(yh,yh.LINE_GAP_SIZE),Kh=an(yh,yh.LINE_WIDTH),Qh=an(yh,yh.LINE_DASH_OFFSET),Yh=an(yh,yh.POINT_SIZE),Zh=an(yh,yh.DISPERSION),Jh=an(yh,yh.LIGHT_MAP),ep=an(yh,yh.AO),tp=Na(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))}),rp=dn(e=>e.context.setupModelViewProjection(),"vec4").once()().toVarying("v_modelViewProjection");class sp extends ci{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 ip=nn(sp).setParameterLength(2);class np 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=$s(e.itemSize),r=e.count):s=t,super(e,s,r),this.isStorageBufferNode=!0,this.structTypeNode=i,this.access=si.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){let t;if(0===this.bufferCount){let r=e.globalCache.getData(this.value);void 0===r&&(r={node:this},e.globalCache.setData(this.value,r)),t=r.node.id}else t=this.id;return String(t)}getInputType(){return this.value.isIndirectStorageBufferAttribute?"indirectStorageBuffer":"storageBuffer"}element(e){return ip(this,e)}setPBO(e){return this.isPBO=e,this}getPBO(){return this.isPBO}setAccess(e){return this.access=e,this}toReadOnly(){return this.setAccess(si.READ_ONLY)}setAtomic(e){return this.isAtomic=e,this}toAtomic(){return this.setAtomic(!0)}getAttributeData(){return null===this._attribute&&(this._attribute=tl(this.value),this._varying=Uu(this._attribute)),{attribute:this._attribute,varying:this._varying}}generateNodeType(e){if(null!==this.structTypeNode)return this.structTypeNode.getNodeType(e);if(e.isAvailable("storageBuffer")||e.isAvailable("indirectStorageBuffer"))return super.generateNodeType(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 ap=(e,t=null,r=0)=>new np(e,t,r);class op extends di{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===op.VERTEX)s=e.getVertexIndex();else if(r===op.INSTANCE)s=e.getInstanceIndex();else if(r===op.DRAW)s=e.getDrawIndex();else if(r===op.INVOCATION_LOCAL)s=e.getInvocationLocalIndex();else if(r===op.INVOCATION_SUBGROUP)s=e.getInvocationSubgroupIndex();else{if(r!==op.SUBGROUP)throw new Error("THREE.IndexNode: Unknown scope: "+r);s=e.getSubgroupIndex()}if("vertex"===e.shaderStage||"compute"===e.shaderStage)i=s;else{i=Uu(this).build(e,t)}return i}}op.VERTEX="vertex",op.INSTANCE="instance",op.SUBGROUP="subgroup",op.INVOCATION_LOCAL="invocationLocal",op.INVOCATION_SUBGROUP="invocationSubgroup",op.DRAW="draw";const up=an(op,op.VERTEX),lp=an(op,op.INSTANCE),dp=an(op,op.SUBGROUP),cp=an(op,op.INVOCATION_SUBGROUP),hp=an(op,op.INVOCATION_LOCAL),pp=an(op,op.DRAW);class gp extends di{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=ti.FRAME,this.buffer=null,this.bufferColor=null,this.previousInstanceMatrixNode=null}get isStorageMatrix(){const{instanceMatrix:e}=this;return e&&!0===e.isStorageInstancedBufferAttribute}get isStorageColor(){const{instanceColor:e}=this;return e&&!0===e.isStorageInstancedBufferAttribute}setup(e){let{instanceMatrixNode:t,instanceColorNode:r}=this;null===t&&(t=this._createInstanceMatrixNode(!0,e),this.instanceMatrixNode=t);const{instanceColor:s,isStorageColor:i}=this;if(s&&null===r){if(i)r=ap(s,"vec3",Math.max(s.count,1)).element(lp);else{const e=new j(s.array,3),t=s.usage===x?sl:rl;this.bufferColor=e,r=Sn(t(e,"vec3",3,0))}this.instanceColorNode=r}const n=t.mul(Xd).xyz;if(Xd.assign(n),e.needsPreviousData()&&Kd.assign(this.getPreviousInstancedPosition(e)),e.hasGeometryAttribute("normal")){const e=hc(nc,t);nc.assign(e)}null!==this.instanceColorNode&&Vn("vec3","vInstanceColor").assign(this.instanceColorNode)}update(e){null!==this.buffer&&!0!==this.isStorageMatrix&&(this.buffer.clearUpdateRanges(),this.buffer.updateRanges.push(...this.instanceMatrix.updateRanges),this.instanceMatrix.version!==this.buffer.version&&(this.buffer.version=this.instanceMatrix.version)),this.instanceColor&&null!==this.bufferColor&&!0!==this.isStorageColor&&(this.bufferColor.clearUpdateRanges(),this.bufferColor.updateRanges.push(...this.instanceColor.updateRanges),this.instanceColor.version!==this.bufferColor.version&&(this.bufferColor.version=this.instanceColor.version)),null!==this.previousInstanceMatrixNode&&e.object.previousInstanceMatrix.array.set(this.instanceMatrix.array)}getPreviousInstancedPosition(e){const t=e.object;return null===this.previousInstanceMatrixNode&&(t.previousInstanceMatrix=this.instanceMatrix.clone(),this.previousInstanceMatrixNode=this._createInstanceMatrixNode(!1,e)),this.previousInstanceMatrixNode.mul(Kd).xyz}_createInstanceMatrixNode(e,t){let r;const{instanceMatrix:s}=this,{count:i}=s;if(this.isStorageMatrix)r=ap(s,"mat4",Math.max(i,1)).element(lp);else{if(16*i*4<=t.getUniformBufferLimit())r=Il(s.array,"mat4",Math.max(i,1)).element(lp);else{const t=new X(s.array,16,1);!0===e&&(this.buffer=t);const i=s.usage===x?sl:rl,n=[i(t,"vec4",16,0),i(t,"vec4",16,4),i(t,"vec4",16,8),i(t,"vec4",16,12)];r=Pn(...n)}}return r}}const mp=nn(gp).setParameterLength(2,3);class fp extends gp{static get type(){return"InstancedMeshNode"}constructor(e){const{count:t,instanceMatrix:r,instanceColor:s}=e;super(t,r,s),this.instancedMesh=e}}const yp=nn(fp).setParameterLength(1);class bp extends di{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=lp:this.batchingIdNode=pp);const t=dn(([e])=>{const t=yn(El(Dl(this.batchMesh._indirectTexture),0).x).toConst(),r=yn(e).mod(t).toConst(),s=yn(e).div(t).toConst();return Dl(this.batchMesh._indirectTexture,_n(r,s)).x}).setLayout({name:"getIndirectIndex",type:"uint",inputs:[{name:"id",type:"int"}]}),r=t(yn(this.batchingIdNode)),s=this.batchMesh._matricesTexture,i=yn(El(Dl(s),0).x).toConst(),n=fn(r).mul(4).toInt().toConst(),a=n.mod(i).toConst(),o=n.div(i).toConst(),u=Pn(Dl(s,_n(a,o)),Dl(s,_n(a.add(1),o)),Dl(s,_n(a.add(2),o)),Dl(s,_n(a.add(3),o))),l=this.batchMesh._colorsTexture;if(null!==l){const e=dn(([e])=>{const t=yn(El(Dl(l),0).x).toConst(),r=e,s=r.mod(t).toConst(),i=r.div(t).toConst();return Dl(l,_n(s,i)).rgb}).setLayout({name:"getBatchingColor",type:"vec3",inputs:[{name:"id",type:"int"}]}),t=e(r);Vn("vec3","vBatchColor").assign(t)}const d=Ln(u);Xd.assign(u.mul(Xd));const c=nc.div(Sn(d[0].dot(d[0]),d[1].dot(d[1]),d[2].dot(d[2]))),h=d.mul(c).xyz;nc.assign(h),e.hasGeometryAttribute("tangent")&&Yc.mulAssign(d)}}const xp=nn(bp).setParameterLength(1),Tp=new WeakMap;class _p extends di{static get type(){return"SkinningNode"}constructor(e){super("void"),this.skinnedMesh=e,this.updateType=ti.OBJECT,this.skinIndexNode=Sl("skinIndex","uvec4"),this.skinWeightNode=Sl("skinWeight","vec4"),this.bindMatrixNode=Fc("bindMatrix","mat4"),this.bindMatrixInverseNode=Fc("bindMatrixInverse","mat4"),this.boneMatricesNode=Lc("skeleton.boneMatrices","mat4",e.skeleton.bones.length),this.positionNode=Xd,this.toPositionNode=Xd,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=Fa(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}getSkinnedNormalAndTangent(e=this.boneMatricesNode,t=nc,r=Yc){const{skinIndexNode:s,skinWeightNode:i,bindMatrixNode:n,bindMatrixInverseNode:a}=this,o=e.element(s.x),u=e.element(s.y),l=e.element(s.z),d=e.element(s.w);let c=Fa(i.x.mul(o),i.y.mul(u),i.z.mul(l),i.w.mul(d));c=a.mul(c).mul(n);return{skinNormal:c.transformDirection(t).xyz,skinTangent:c.transformDirection(r).xyz}}getPreviousSkinnedPosition(e){const t=e.object;return null===this.previousBoneMatricesNode&&(t.skeleton.previousBoneMatrices=new Float32Array(t.skeleton.boneMatrices),this.previousBoneMatricesNode=Lc("skeleton.previousBoneMatrices","mat4",t.skeleton.bones.length)),this.getSkinnedPosition(this.previousBoneMatricesNode,Kd)}setup(e){e.needsPreviousData()&&Kd.assign(this.getPreviousSkinnedPosition(e));const t=this.getSkinnedPosition();if(this.toPositionNode&&this.toPositionNode.assign(t),e.hasGeometryAttribute("normal")){const{skinNormal:t,skinTangent:r}=this.getSkinnedNormalAndTangent();nc.assign(t),e.hasGeometryAttribute("tangent")&&Yc.assign(r)}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;Tp.get(t)!==e.frameId&&(Tp.set(t,e.frameId),null!==this.previousBoneMatricesNode&&(null===t.previousBoneMatrices&&(t.previousBoneMatrices=new Float32Array(t.boneMatrices)),t.previousBoneMatrices.set(t.boneMatrices)),t.update())}}const vp=e=>new _p(e);class Np extends di{static get type(){return"LoopNode"}constructor(e=[]){super("void"),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(l)?">=":"<")),a)n=`while ( ${l} )`;else{const r={start:u,end:l},s=r.start,i=r.end;let a;const g=()=>h.includes("<")?"+=":"-=";if(null!=p)switch(typeof p){case"function":a=e.flowStagesNode(t.updateNode,"void").code.replace(/\t|;/g,"");break;case"number":a=d+" "+g()+" "+e.generateConst(c,p);break;case"string":a=d+" "+p;break;default:p.isNode?a=d+" "+g()+" "+p.build(e):(o("TSL: 'Loop( { update: ... } )' is not a function, string or number.",this.stackTrace),a="break /* invalid update */")}else p="int"===c||"uint"===c?h.includes("<")?"++":"--":g()+" 1.",a=d+" "+p;n=`for ( ${e.getVar(c,d)+" = "+s}; ${d+" "+h+" "+i}; ${a} )`}e.addFlowCode((0===s?"\n":"")+e.tab+n+" {\n\n").addFlowTab()}const i=s.build(e,"void");t.returnsNode.build(e,"void"),e.removeFlowTab().addFlowCode("\n"+e.tab+i);for(let t=0,r=this.params.length-1;tnew Np(sn(e,"int")).toStack(),Rp=()=>gl("break").toStack(),Ap=new WeakMap,Ep=new s,wp=dn(({bufferMap:e,influence:t,stride:r,width:s,depth:i,offset:n})=>{const a=yn(up).mul(r).add(n),o=a.div(s),u=a.sub(o.mul(s));return Dl(e,_n(u,o)).depth(i).xyz.mul(t)});class Cp extends di{static get type(){return"MorphNode"}constructor(e){super("void"),this.mesh=e,this.morphBaseInfluence=Na(1),this.updateType=ti.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=Ap.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 K(m,h,p,a);f.type=Q,f.needsUpdate=!0;const y=4*c;for(let x=0;x{const t=fn(0).toVar();this.mesh.count>1&&null!==this.mesh.morphTexture&&void 0!==this.mesh.morphTexture?t.assign(Dl(this.mesh.morphTexture,_n(yn(e).add(1),yn(lp))).r):t.assign(Fc("morphTargetInfluences","float").element(e).toVar()),pn(t.notEqual(0),()=>{!0===s&&Xd.addAssign(wp({bufferMap:o,influence:t,stride:u,width:d,depth:e,offset:yn(0)})),!0===i&&nc.addAssign(wp({bufferMap:o,influence:t,stride:u,width:d,depth:e,offset:yn(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 Mp=nn(Cp).setParameterLength(1);class Bp extends di{static get type(){return"LightingNode"}constructor(){super("vec3"),this.isLightingNode=!0}}class Fp extends Bp{static get type(){return"AONode"}constructor(e=null){super(),this.aoNode=e}setup(e){e.context.ambientOcclusion.mulAssign(this.aoNode)}}class Lp extends _u{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:Sn().toVar("directDiffuse"),directSpecular:Sn().toVar("directSpecular"),indirectDiffuse:Sn().toVar("indirectDiffuse"),indirectSpecular:Sn().toVar("indirectSpecular")};return{radiance:Sn().toVar("radiance"),irradiance:Sn().toVar("irradiance"),iblIrradiance:Sn().toVar("iblIrradiance"),ambientOcclusion:fn(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 Pp=nn(Lp);class Dp extends Bp{static get type(){return"IrradianceNode"}constructor(e){super(),this.node=e}setup(e){e.context.irradiance.addAssign(this.node)}}const Up=new t;class Ip extends Fl{static get type(){return"ViewportTextureNode"}constructor(e=jl,t=null,r=null){let s=null;null===r?(s=new Y,s.minFilter=Z,r=s):s=r,super(r,e,t),this.generateMipmaps=!1,this.defaultFramebuffer=s,this.isOutputTextureNode=!0,this.updateBeforeType=ti.RENDER,this._cacheTextures=new WeakMap}getTextureForReference(e=null){let t,r;if(this.referenceNode?(t=this.referenceNode.defaultFramebuffer,r=this.referenceNode._cacheTextures):(t=this.defaultFramebuffer,r=this._cacheTextures),null===e)return t;if(!1===r.has(e)){const s=t.clone();r.set(e,s)}return r.get(e)}updateReference(e){const t=e.renderer,r=t.getRenderTarget(),s=t.getCanvasTarget(),i=r||s;return this.value=this.getTextureForReference(i),this.value}updateBefore(e){const t=e.renderer,r=t.getRenderTarget(),s=t.getCanvasTarget(),i=r||s;null===i?t.getDrawingBufferSize(Up):i.getDrawingBufferSize?i.getDrawingBufferSize(Up):Up.set(i.width,i.height);const n=this.getTextureForReference(i);n.image.width===Up.width&&n.image.height===Up.height||(n.image.width=Up.width,n.image.height=Up.height,n.needsUpdate=!0);const a=n.generateMipmaps;n.generateMipmaps=this.generateMipmaps,t.copyFramebufferToTexture(n),n.generateMipmaps=a}clone(){const e=new this.constructor(this.uvNode,this.levelNode,this.value);return e.generateMipmaps=this.generateMipmaps,e}}const Op=nn(Ip).setParameterLength(0,3),Vp=nn(Ip,null,null,{generateMipmaps:!0}).setParameterLength(0,3),kp=Vp(),Gp=(e=jl,t=null)=>kp.sample(e,t);let zp=null;class $p extends Ip{static get type(){return"ViewportDepthTextureNode"}constructor(e=jl,t=null,r=null){null===r&&(null===zp&&(zp=new J),r=zp),super(e,t,r)}}const Wp=nn($p).setParameterLength(0,3);class Hp extends di{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===Hp.DEPTH_BASE?e.getFragDepth():super.generate(e)}setup({camera:e}){const{scope:t}=this,r=this.valueNode;let s=null;if(t===Hp.DEPTH_BASE)null!==r&&(s=Zp().assign(r));else if(t===Hp.DEPTH)s=e.isPerspectiveCamera?Xp(Zd.z,fd,yd):qp(Zd.z,fd,yd);else if(t===Hp.LINEAR_DEPTH)if(null!==r)if(e.isPerspectiveCamera){const e=Qp(r,fd,yd);s=qp(e,fd,yd)}else s=r;else s=qp(Zd.z,fd,yd);return s}}Hp.DEPTH_BASE="depthBase",Hp.DEPTH="depth",Hp.LINEAR_DEPTH="linearDepth";const qp=(e,t,r)=>e.add(t).div(t.sub(r)),jp=dn(([e,t,r],s)=>!0===s.renderer.reversedDepthBuffer?r.sub(t).mul(e).sub(r):t.sub(r).mul(e).sub(t)),Xp=(e,t,r)=>t.add(e).mul(r).div(r.sub(t).mul(e)),Kp=(e,t,r)=>t.mul(e.add(r)).div(e.mul(t.sub(r))),Qp=dn(([e,t,r],s)=>!0===s.renderer.reversedDepthBuffer?t.mul(r).div(t.sub(r).mul(e).sub(t)):t.mul(r).div(r.sub(t).mul(e).sub(r))),Yp=(e,t,r)=>{t=t.max(1e-6).toVar();const s=xo(e.negate().div(t)),i=xo(r.div(t));return s.div(i)},Zp=nn(Hp,Hp.DEPTH_BASE),Jp=an(Hp,Hp.DEPTH),eg=nn(Hp,Hp.LINEAR_DEPTH).setParameterLength(0,1),tg=eg(Wp());Jp.assign=e=>Zp(e);class rg extends di{static get type(){return"ClippingNode"}constructor(e=rg.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===rg.ALPHA_TO_COVERAGE?this.setupAlphaToCoverage(r,s):this.scope===rg.HARDWARE?this.setupHardwareClipping(s,e):this.setupDefault(r,s)}setupAlphaToCoverage(e,t){return dn(()=>{const r=fn().toVar("distanceToPlane"),s=fn().toVar("distanceToGradient"),i=fn(1).toVar("clipOpacity"),n=t.length;if(!1===this.hardwareClipping&&n>0){const e=kl(t).setGroup(Ta);Sp(n,({i:t})=>{const n=e.element(t);r.assign(Zd.dot(n.xyz).negate().add(n.w)),s.assign(r.fwidth().div(2)),i.mulAssign(cu(s.negate(),s,r))})}const a=e.length;if(a>0){const t=kl(e).setGroup(Ta),n=fn(1).toVar("intersectionClipOpacity");Sp(a,({i:e})=>{const i=t.element(e);r.assign(Zd.dot(i.xyz).negate().add(i.w)),s.assign(r.fwidth().div(2)),n.mulAssign(cu(s.negate(),s,r).oneMinus())}),i.mulAssign(n.oneMinus())}kn.a.mulAssign(i),kn.a.equal(0).discard()})()}setupDefault(e,t){return dn(()=>{const r=t.length;if(!1===this.hardwareClipping&&r>0){const e=kl(t).setGroup(Ta);Sp(r,({i:t})=>{const r=e.element(t);Zd.dot(r.xyz).greaterThan(r.w).discard()})}const s=e.length;if(s>0){const t=kl(e).setGroup(Ta),r=xn(!0).toVar("clipped");Sp(s,({i:e})=>{const s=t.element(e);r.assign(Zd.dot(s.xyz).greaterThan(s.w).and(r))}),r.discard()}})()}setupHardwareClipping(e,t){const r=e.length;return t.enableHardwareClipping(r),dn(()=>{const s=kl(e).setGroup(Ta),i=zl(t.getClipDistance());Sp(r,({i:e})=>{const t=s.element(e),r=Zd.dot(t.xyz).sub(t.w).negate();i.element(e).assign(r)})})()}}rg.ALPHA_TO_COVERAGE="alphaToCoverage",rg.DEFAULT="default",rg.HARDWARE="hardware";const sg=dn(([e])=>Ro(Pa(1e4,Ao(Pa(17,e.x).add(Pa(.1,e.y)))).mul(Fa(.1,Fo(Ao(Pa(13,e.y).add(e.x))))))),ig=dn(([e])=>sg(Tn(sg(e.xy),e.z))),ng=dn(([e])=>{const t=jo(Po(Io(e.xyz)),Po(Oo(e.xyz))),r=fn(1).div(fn(.05).mul(t)).toVar("pixScale"),s=Tn(yo(vo(xo(r))),yo(No(xo(r)))),i=Tn(ig(vo(s.x.mul(e.xyz))),ig(vo(s.y.mul(e.xyz)))),n=Ro(xo(r)),a=Fa(Pa(n.oneMinus(),i.x),Pa(n,i.y)),o=qo(n,n.oneMinus()),u=Sn(a.mul(a).div(Pa(2,o).mul(La(1,o))),a.sub(Pa(.5,o)).div(La(1,o)),La(1,La(1,a).mul(La(1,a)).div(Pa(2,o).mul(La(1,o))))),l=a.lessThan(o.oneMinus()).select(a.lessThan(o).select(u.x,u.y),u.z);return uu(l,1e-6,1)}).setLayout({name:"getAlphaHashThreshold",type:"float",inputs:[{name:"position",type:"vec3"}]});class ag extends Nl{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 og=(e=0)=>new ag(e),ug=dn(([e,t])=>qo(1,e.oneMinus().div(t)).oneMinus()).setLayout({name:"blendBurn",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),lg=dn(([e,t])=>qo(e.div(t.oneMinus()),1)).setLayout({name:"blendDodge",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),dg=dn(([e,t])=>e.oneMinus().mul(t.oneMinus()).oneMinus()).setLayout({name:"blendScreen",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),cg=dn(([e,t])=>ou(e.mul(2).mul(t),e.oneMinus().mul(2).mul(t.oneMinus()).oneMinus(),Xo(.5,e))).setLayout({name:"blendOverlay",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),hg=dn(([e,t])=>{const r=t.a.add(e.a.mul(t.a.oneMinus()));return wn(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"}]}),pg=dn(([e])=>wn(e.rgb.mul(e.a),e.a),{color:"vec4",return:"vec4"}),gg=dn(([e])=>(pn(e.a.equal(0),()=>wn(0)),wn(e.rgb.div(e.a),e.a)),{color:"vec4",return:"vec4"});class mg extends ee{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.maskShadowNode=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,this.contextNode=null}_getNodeChildren(){const e=[];for(const t of Object.getOwnPropertyNames(this)){if(!0===t.startsWith("_"))continue;const r=this[t];r&&!0===r.isNode&&e.push({property:t,childNode:r})}return e}customProgramCacheKey(){const e=[];for(const{property:t,childNode:r}of this._getNodeChildren())e.push(Os(t.slice(0,-4)),r.getCacheKey());return this.type+Vs(e)}build(e){this.setup(e)}setupObserver(e){return new Ps(e)}setup(e){e.context.setupNormal=()=>Pu(this.setupNormal(e),"NORMAL","vec3"),e.context.setupPositionView=()=>this.setupPositionView(e),e.context.setupModelViewProjection=()=>this.setupModelViewProjection(e);const t=e.renderer,r=t.getRenderTarget();!0===t.contextNode.isContextNode?e.context={...e.context,...t.contextNode.getFlowContextData()}:o('NodeMaterial: "renderer.contextNode" must be an instance of `context()`.'),null!==this.contextNode&&(!0===this.contextNode.isContextNode?e.context={...e.context,...this.contextNode.getFlowContextData()}:o('NodeMaterial: "material.contextNode" must be an instance of `context()`.')),e.addStack();const s=this.setupVertex(e),i=Pu(this.vertexNode||s,"VERTEX");let n;e.context.clipSpace=i,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.addToStack(a);const i=wn(s,kn.a).max(0);n=this.setupOutput(e,i),aa.assign(n);const o=null!==this.outputNode;if(o&&(n=this.outputNode),e.context.getOutput&&(n=e.context.getOutput(n,e)),null!==r){const e=t.getMRT(),r=this.mrtNode;null!==e?(o&&aa.assign(n),n=e,null!==r&&(n=e.merge(r))):null!==r&&(n=r)}}else{let t=this.fragmentNode;!0!==t.isOutputStructNode&&(t=wn(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.currentSamples;this.alphaToCoverage&&t>1?s=new rg(rg.ALPHA_TO_COVERAGE):e.stack.addToStack(new rg)}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.addToStack(new rg(rg.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?Yp(Zd.z,fd,yd):qp(Zd.z,fd,yd))}null!==s&&Jp.assign(s).toStack()}setupPositionView(){return zd.mul(Xd).xyz}setupModelViewProjection(){return bd.mul(Zd)}setupVertex(e){return e.addStack(),this.setupPosition(e),e.context.position=e.removeStack(),rp}setupPosition(e){const{object:t,geometry:r}=e;if((r.morphAttributes.position||r.morphAttributes.normal||r.morphAttributes.color)&&Mp(t).toStack(),!0===t.isSkinnedMesh&&vp(t).toStack(),this.displacementMap){const e=Dc("displacementMap","texture"),t=Dc("displacementScale","float"),r=Dc("displacementBias","float");Xd.addAssign(nc.normalize().mul(e.x.mul(t).add(r)))}return t.isBatchedMesh&&xp(t).toStack(),t.isInstancedMesh&&t.instanceMatrix&&!0===t.instanceMatrix.isInstancedBufferAttribute&&yp(t).toStack(),null!==this.positionNode&&Xd.assign(Pu(this.positionNode,"POSITION","vec3")),Xd}setupDiffuseColor(e){const{object:t,geometry:r}=e;null!==this.maskNode&&xn(this.maskNode).not().discard();let s=this.colorNode?wn(this.colorNode):xh;if(!0===this.vertexColors&&r.hasAttribute("color")&&(s=s.mul(og())),t.instanceColor){s=Vn("vec3","vInstanceColor").mul(s)}if(t.isBatchedMesh&&t._colorsTexture){s=Vn("vec3","vBatchColor").mul(s)}kn.assign(s);const i=this.opacityNode?fn(this.opacityNode):vh;kn.a.assign(kn.a.mul(i));let n=null;(null!==this.alphaTestNode||this.alphaTest>0)&&(n=null!==this.alphaTestNode?fn(this.alphaTestNode):bh,!0===this.alphaToCoverage?(kn.a=cu(n,n.add(zo(kn.a)),kn.a),kn.a.lessThanEqual(0).discard()):kn.a.lessThanEqual(n).discard()),!0===this.alphaHash&&kn.a.lessThan(ng(Xd)).discard(),e.isOpaque()&&kn.a.assign(1)}setupVariants(){}setupOutgoingLight(){return!0===this.lights?Sn(0):kn.rgb}setupNormal(){return this.normalNode?Sn(this.normalNode):Mh}setupEnvironment(){let e=null;return this.envNode?e=this.envNode:this.envMap&&(e=this.envMap.isCubeTexture?Dc("envMap","cubeTexture"):Dc("envMap","texture")),e}setupLightMap(e){let t=null;return e.material.lightMap&&(t=new Dp(Jh)),t}setupLights(e){const t=[],r=this.setupEnvironment(e);r&&r.isLightingNode&&t.push(r);const s=this.setupLightMap(e);s&&s.isLightingNode&&t.push(s);let i=this.aoNode;null===i&&e.material.aoMap&&(i=ep),e.context.getAO&&(i=e.context.getAO(i,e)),i&&t.push(new Fp(i));let n=this.lightsNode||e.lightsNode;return t.length>0&&(n=e.renderer.lighting.createNode([...n.getLights(),...t])),n}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=Pp(n,t,r,s)}else null!==r&&(a=Sn(null!==s?ou(a,r,s):r));return(i&&!0===i.isNode||t.emissive&&!0===t.emissive.isColor)&&(zn.assign(Sn(i||_h)),a=a.add(zn)),a}setupFog(e,t){const r=e.fogNode;return r&&(aa.assign(t),t=wn(r.toVar())),t}setupPremultipliedAlpha(e,t){return pg(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=ee.prototype.toJSON.call(this,e);r.inputNodes={};for(const{property:t,childNode:s}of this._getNodeChildren())r.inputNodes[t]=s.toJSON(e).uuid;function s(e){const t=[];for(const r in e){const s=e[r];delete s.metadata,t.push(s)}return t}if(t){const t=s(e.textures),i=s(e.images),n=s(e.nodes);t.length>0&&(r.textures=t),i.length>0&&(r.images=i),n.length>0&&(r.nodes=n)}return r}copy(e){return this.lightsNode=e.lightsNode,this.envNode=e.envNode,this.aoNode=e.aoNode,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.maskShadowNode=e.maskShadowNode,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,this.contextNode=e.contextNode,super.copy(e)}}const fg=new te;class yg extends mg{static get type(){return"LineBasicNodeMaterial"}constructor(e){super(),this.isLineBasicNodeMaterial=!0,this.setDefaultValues(fg),this.setValues(e)}}const bg=new re;class xg extends mg{static get type(){return"LineDashedNodeMaterial"}constructor(e){super(),this.isLineDashedNodeMaterial=!0,this.setDefaultValues(bg),this.dashOffset=0,this.offsetNode=null,this.dashScaleNode=null,this.dashSizeNode=null,this.gapSizeNode=null,this.setValues(e)}setupVariants(){const e=this.offsetNode?fn(this.offsetNode):Qh,t=this.dashScaleNode?fn(this.dashScaleNode):qh,r=this.dashSizeNode?fn(this.dashSizeNode):jh,s=this.gapSizeNode?fn(this.gapSizeNode):Xh;oa.assign(r),ua.assign(s);const i=Uu(Sl("lineDistance").mul(t));(e?i.add(e):i).mod(oa.add(ua)).greaterThan(oa).discard()}}const Tg=new re;class _g extends mg{static get type(){return"Line2NodeMaterial"}constructor(e={}){super(),this.isLine2NodeMaterial=!0,this.setDefaultValues(Tg),this.vertexColors=e.vertexColors,this.dashOffset=0,this.lineColorNode=null,this.offsetNode=null,this.dashScaleNode=null,this.dashSizeNode=null,this.gapSizeNode=null,this.blending=se,this._useDash=e.dashed,this._useAlphaToCoverage=!0,this._useWorldUnits=!1,this.setValues(e)}setup(e){const{renderer:t}=e,r=this._useAlphaToCoverage,s=this.vertexColors,i=this._useDash,n=this._useWorldUnits,a=dn(({start:e,end:t})=>{const r=bd.element(2).element(2),s=bd.element(3).element(2).mul(-.5).div(r).sub(e.z).div(t.z.sub(e.z));return wn(ou(e.xyz,t.xyz,s),t.w)}).setLayout({name:"trimSegment",type:"vec4",inputs:[{name:"start",type:"vec4"},{name:"end",type:"vec4"}]});this.vertexNode=dn(()=>{const e=Sl("instanceStart"),t=Sl("instanceEnd"),r=wn(zd.mul(wn(e,1))).toVar("start"),s=wn(zd.mul(wn(t,1))).toVar("end");if(i){const e=this.dashScaleNode?fn(this.dashScaleNode):qh,t=this.offsetNode?fn(this.offsetNode):Qh,r=Sl("instanceDistanceStart"),s=Sl("instanceDistanceEnd");let i=jd.y.lessThan(.5).select(e.mul(r),e.mul(s));i=i.add(t),Vn("float","lineDistance").assign(i)}n&&(Vn("vec3","worldStart").assign(r.xyz),Vn("vec3","worldEnd").assign(s.xyz));const o=Ql.z.div(Ql.w),u=bd.element(2).element(3).equal(-1);pn(u,()=>{pn(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=bd.mul(r),d=bd.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=wn().toVar();if(n){const e=s.xyz.sub(r.xyz).normalize(),t=ou(r.xyz,s.xyz,.5).normalize(),n=e.cross(t).normalize(),a=e.cross(n),o=Vn("vec4","worldPos");o.assign(jd.y.lessThan(.5).select(r,s));const u=Kh.mul(.5);o.addAssign(wn(jd.x.lessThan(0).select(n.mul(u),n.mul(u).negate()),0)),i||(o.addAssign(wn(jd.y.lessThan(.5).select(e.mul(u).negate(),e.mul(u)),0)),o.addAssign(wn(a.mul(u),0)),pn(jd.y.greaterThan(1).or(jd.y.lessThan(0)),()=>{o.subAssign(wn(a.mul(2).mul(u),0))})),g.assign(bd.mul(o));const l=Sn().toVar();l.assign(jd.y.lessThan(.5).select(c,h)),g.z.assign(l.z.mul(g.w))}else{const e=Tn(p.y,p.x.negate()).toVar("offset");p.x.assign(p.x.div(o)),e.x.assign(e.x.div(o)),e.assign(jd.x.lessThan(0).select(e.negate(),e)),pn(jd.y.lessThan(0),()=>{e.assign(e.sub(p))}).ElseIf(jd.y.greaterThan(1),()=>{e.assign(e.add(p))}),e.assign(e.mul(Kh)),e.assign(e.div(Ql.w.div(ql))),g.assign(jd.y.lessThan(.5).select(l,d)),e.assign(e.mul(g.w)),g.assign(g.add(wn(e,0,0)))}return g})();const o=dn(({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 Tn(h,p)});if(this.colorNode=dn(()=>{const e=Rl();if(i){const t=this.dashSizeNode?fn(this.dashSizeNode):jh,r=this.gapSizeNode?fn(this.gapSizeNode):Xh;oa.assign(t),ua.assign(r);const s=Vn("float","lineDistance");e.y.lessThan(-1).or(e.y.greaterThan(1)).discard(),s.mod(oa.add(ua)).greaterThan(oa).discard()}const a=fn(1).toVar("alpha");if(n){const e=Vn("vec3","worldStart"),s=Vn("vec3","worldEnd"),n=Vn("vec4","worldPos").xyz.normalize().mul(1e5),u=s.sub(e),l=o({p1:e,p2:s,p3:Sn(0,0,0),p4:n}),d=e.add(u.mul(l.x)),c=n.mul(l.y),h=d.sub(c).length().div(Kh);if(!i)if(r&&t.currentSamples>0){const e=h.fwidth();a.assign(cu(e.negate().add(.5),e.add(.5),h).oneMinus())}else h.greaterThan(.5).discard()}else if(r&&t.currentSamples>0){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=fn(s.fwidth()).toVar("dlen");pn(e.y.abs().greaterThan(1),()=>{a.assign(cu(i.oneMinus(),i.add(1),s).oneMinus())})}else pn(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=Sl("instanceColorStart"),t=Sl("instanceColorEnd");u=jd.y.lessThan(.5).select(e,t).mul(xh)}else u=xh;return wn(u,a)})(),this.transparent){const e=this.opacityNode?fn(this.opacityNode):vh;this.outputNode=wn(this.colorNode.rgb.mul(e).add(Gp().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 vg=new ie;class Ng extends mg{static get type(){return"MeshNormalNodeMaterial"}constructor(e){super(),this.isMeshNormalNodeMaterial=!0,this.setDefaultValues(vg),this.setValues(e)}setupDiffuseColor(){const e=this.opacityNode?fn(this.opacityNode):vh;kn.assign($u(wn(uh(lc),e),ne))}}const Sg=dn(([e=Yd])=>{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 Tn(t,r)});class Rg extends ae{constructor(e=1,t={}){super(e,e,t),this.isCubeRenderTarget=!0;const r={width:e,height:e,depth:1},s=[r,r,r,r,r,r];this.texture=new U(s),this._setTextureOptions(t),this.texture.isRenderTargetTexture=!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 oe(5,5,5),n=Sg(Yd),a=new mg;a.colorNode=Pl(t,n,0),a.side=L,a.blending=se;const o=new ue(i,a),u=new le;u.add(o),t.minFilter===Z&&(t.minFilter=de);const l=new ce(1,10,this),d=e.getMRT();return e.setMRT(null),l.update(e,u),e.setMRT(d),t.minFilter=r,t.generateMipmaps=s,o.geometry.dispose(),o.material.dispose(),this}clear(e,t=!0,r=!0,s=!0){const i=e.getRenderTarget();for(let i=0;i<6;i++)e.setRenderTarget(this,i),e.clear(t,r,s);e.setRenderTarget(i)}}const Ag=new WeakMap;class Eg extends pi{static get type(){return"CubeMapNode"}constructor(e){super("vec3"),this.envNode=e,this._cubeTexture=null,this._cubeTextureNode=Cc(null);const t=new U;t.isRenderTargetTexture=!0,this._defaultTexture=t,this.updateBeforeType=ti.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===he||r===pe){if(Ag.has(e)){const t=Ag.get(e);Cg(t,e.mapping),this._cubeTexture=t}else{const r=e.image;if(function(e){return null!=e&&e.height>0}(r)){const s=new Rg(r.height);s.fromEquirectangularTexture(t,e),Cg(s.texture,e.mapping),this._cubeTexture=s.texture,Ag.set(e,s.texture),e.addEventListener("dispose",wg)}else this._cubeTexture=this._defaultTexture}this._cubeTextureNode.value=this._cubeTexture}else this._cubeTextureNode=this.envNode}}}setup(e){return this.updateBefore(e),this._cubeTextureNode}}function wg(e){const t=e.target;t.removeEventListener("dispose",wg);const r=Ag.get(t);void 0!==r&&(Ag.delete(t),r.dispose())}function Cg(e,t){t===he?e.mapping=I:t===pe&&(e.mapping=O)}const Mg=nn(Eg).setParameterLength(1);class Bg extends Bp{static get type(){return"BasicEnvironmentNode"}constructor(e=null){super(),this.envNode=e}setup(e){e.context.environment=Mg(this.envNode)}}class Fg extends Bp{static get type(){return"BasicLightMapNode"}constructor(e=null){super(),this.lightMapNode=e}setup(e){const t=fn(1/Math.PI);e.context.irradianceLightMap=this.lightMapNode.mul(t)}}class Lg{start(e){e.lightsNode.setupLights(e,e.lightsNode.getLightNodes(e)),this.indirect(e)}finish(){}direct(){}directRectArea(){}indirect(){}ambientOcclusion(){}}class Pg extends Lg{constructor(){super()}indirect({context:e}){const t=e.ambientOcclusion,r=e.reflectedLight,s=e.irradianceLightMap;r.indirectDiffuse.assign(wn(0)),s?r.indirectDiffuse.addAssign(s):r.indirectDiffuse.addAssign(wn(1,1,1,0)),r.indirectDiffuse.mulAssign(t),r.indirectDiffuse.mulAssign(kn.rgb)}finish(e){const{material:t,context:r}=e,s=r.outgoingLight,i=e.context.environment;if(i)switch(t.combine){case fe:s.rgb.assign(ou(s.rgb,s.rgb.mul(i.rgb),Ah.mul(Eh)));break;case me:s.rgb.assign(ou(s.rgb,i.rgb,Ah.mul(Eh)));break;case ge:s.rgb.addAssign(i.rgb.mul(Ah.mul(Eh)));break;default:d("BasicLightingModel: Unsupported .combine value:",t.combine)}}}const Dg=new ye;class Ug extends mg{static get type(){return"MeshBasicNodeMaterial"}constructor(e){super(),this.isMeshBasicNodeMaterial=!0,this.lights=!0,this.setDefaultValues(Dg),this.setValues(e)}setupNormal(){return sc(oc)}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new Bg(t):null}setupLightMap(e){let t=null;return e.material.lightMap&&(t=new Fg(Jh)),t}setupOutgoingLight(){return kn.rgb}setupLightingModel(){return new Pg}}const Ig=dn(({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))}),Og=dn(e=>e.diffuseColor.mul(1/Math.PI)),Vg=dn(({dotNH:e})=>na.mul(fn(.5)).add(1).mul(fn(1/Math.PI)).mul(e.pow(na))),kg=dn(({lightDirection:e})=>{const t=e.add(Jd).normalize(),r=lc.dot(t).clamp(),s=Jd.dot(t).clamp(),i=Ig({f0:ra,f90:1,dotVH:s}),n=fn(.25),a=Vg({dotNH:r});return i.mul(n).mul(a)});class Gg extends Pg{constructor(e=!0){super(),this.specular=e}direct({lightDirection:e,lightColor:t,reflectedLight:r}){const s=lc.dot(e).clamp().mul(t);r.directDiffuse.addAssign(s.mul(Og({diffuseColor:kn.rgb}))),!0===this.specular&&r.directSpecular.addAssign(s.mul(kg({lightDirection:e})).mul(Ah))}indirect(e){const{ambientOcclusion:t,irradiance:r,reflectedLight:s}=e.context;s.indirectDiffuse.addAssign(r.mul(Og({diffuseColor:kn}))),s.indirectDiffuse.mulAssign(t)}}const zg=new be;class $g extends mg{static get type(){return"MeshLambertNodeMaterial"}constructor(e){super(),this.isMeshLambertNodeMaterial=!0,this.lights=!0,this.setDefaultValues(zg),this.setValues(e)}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new Bg(t):null}setupLightingModel(){return new Gg(!1)}}const Wg=new xe;class Hg extends mg{static get type(){return"MeshPhongNodeMaterial"}constructor(e){super(),this.isMeshPhongNodeMaterial=!0,this.lights=!0,this.shininessNode=null,this.specularNode=null,this.setDefaultValues(Wg),this.setValues(e)}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new Bg(t):null}setupLightingModel(){return new Gg}setupVariants(){const e=(this.shininessNode?fn(this.shininessNode):Th).max(1e-4);na.assign(e);const t=this.specularNode||Nh;ra.assign(t)}copy(e){return this.shininessNode=e.shininessNode,this.specularNode=e.specularNode,super.copy(e)}}const qg=dn(e=>{if(!1===e.geometry.hasAttribute("normal"))return fn(0);const t=oc.dFdx().abs().max(oc.dFdy().abs());return t.x.max(t.y).max(t.z)}),jg=dn(e=>{const{roughness:t}=e,r=qg();let s=t.max(.0525);return s=s.add(r),s=s.min(1),s}),Xg=dn(({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 Da(.5,i.add(n).max(no))}).setLayout({name:"V_GGX_SmithCorrelated",type:"float",inputs:[{name:"alpha",type:"float"},{name:"dotNL",type:"float"},{name:"dotNV",type:"float"}]}),Kg=dn(({alphaT:e,alphaB:t,dotTV:r,dotBV:s,dotTL:i,dotBL:n,dotNV:a,dotNL:o})=>{const u=o.mul(Sn(e.mul(r),t.mul(s),a).length()),l=a.mul(Sn(e.mul(i),t.mul(n),o).length());return Da(.5,u.add(l))}).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"}]}),Qg=dn(({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"}]}),Yg=fn(1/Math.PI),Zg=dn(({alphaT:e,alphaB:t,dotNH:r,dotTH:s,dotBH:i})=>{const n=e.mul(t),a=Sn(t.mul(s),e.mul(i),n.mul(r)),o=a.dot(a),u=n.div(o);return Yg.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"}]}),Jg=dn(({lightDirection:e,f0:t,f90:r,roughness:s,f:i,normalView:n=lc,USE_IRIDESCENCE:a,USE_ANISOTROPY:o})=>{const u=s.pow2(),l=e.add(Jd).normalize(),d=n.dot(e).clamp(),c=n.dot(Jd).clamp(),h=n.dot(l).clamp(),p=Jd.dot(l).clamp();let g,m,f=Ig({f0:t,f90:r,dotVH:p});if(Yi(a)&&(f=Kn.mix(f,i)),Yi(o)){const t=ea.dot(e),r=ea.dot(Jd),s=ea.dot(l),i=ta.dot(e),n=ta.dot(Jd),a=ta.dot(l);g=Kg({alphaT:Zn,alphaB:u,dotTV:r,dotBV:n,dotTL:t,dotBL:i,dotNV:c,dotNL:d}),m=Zg({alphaT:Zn,alphaB:u,dotNH:h,dotTH:s,dotBH:a})}else g=Xg({alpha:u,dotNL:d,dotNV:c}),m=Qg({alpha:u,dotNH:h});return f.mul(g).mul(m)}),em=new Uint16Array([12469,15057,12620,14925,13266,14620,13807,14376,14323,13990,14545,13625,14713,13328,14840,12882,14931,12528,14996,12233,15039,11829,15066,11525,15080,11295,15085,10976,15082,10705,15073,10495,13880,14564,13898,14542,13977,14430,14158,14124,14393,13732,14556,13410,14702,12996,14814,12596,14891,12291,14937,11834,14957,11489,14958,11194,14943,10803,14921,10506,14893,10278,14858,9960,14484,14039,14487,14025,14499,13941,14524,13740,14574,13468,14654,13106,14743,12678,14818,12344,14867,11893,14889,11509,14893,11180,14881,10751,14852,10428,14812,10128,14765,9754,14712,9466,14764,13480,14764,13475,14766,13440,14766,13347,14769,13070,14786,12713,14816,12387,14844,11957,14860,11549,14868,11215,14855,10751,14825,10403,14782,10044,14729,9651,14666,9352,14599,9029,14967,12835,14966,12831,14963,12804,14954,12723,14936,12564,14917,12347,14900,11958,14886,11569,14878,11247,14859,10765,14828,10401,14784,10011,14727,9600,14660,9289,14586,8893,14508,8533,15111,12234,15110,12234,15104,12216,15092,12156,15067,12010,15028,11776,14981,11500,14942,11205,14902,10752,14861,10393,14812,9991,14752,9570,14682,9252,14603,8808,14519,8445,14431,8145,15209,11449,15208,11451,15202,11451,15190,11438,15163,11384,15117,11274,15055,10979,14994,10648,14932,10343,14871,9936,14803,9532,14729,9218,14645,8742,14556,8381,14461,8020,14365,7603,15273,10603,15272,10607,15267,10619,15256,10631,15231,10614,15182,10535,15118,10389,15042,10167,14963,9787,14883,9447,14800,9115,14710,8665,14615,8318,14514,7911,14411,7507,14279,7198,15314,9675,15313,9683,15309,9712,15298,9759,15277,9797,15229,9773,15166,9668,15084,9487,14995,9274,14898,8910,14800,8539,14697,8234,14590,7790,14479,7409,14367,7067,14178,6621,15337,8619,15337,8631,15333,8677,15325,8769,15305,8871,15264,8940,15202,8909,15119,8775,15022,8565,14916,8328,14804,8009,14688,7614,14569,7287,14448,6888,14321,6483,14088,6171,15350,7402,15350,7419,15347,7480,15340,7613,15322,7804,15287,7973,15229,8057,15148,8012,15046,7846,14933,7611,14810,7357,14682,7069,14552,6656,14421,6316,14251,5948,14007,5528,15356,5942,15356,5977,15353,6119,15348,6294,15332,6551,15302,6824,15249,7044,15171,7122,15070,7050,14949,6861,14818,6611,14679,6349,14538,6067,14398,5651,14189,5311,13935,4958,15359,4123,15359,4153,15356,4296,15353,4646,15338,5160,15311,5508,15263,5829,15188,6042,15088,6094,14966,6001,14826,5796,14678,5543,14527,5287,14377,4985,14133,4586,13869,4257,15360,1563,15360,1642,15358,2076,15354,2636,15341,3350,15317,4019,15273,4429,15203,4732,15105,4911,14981,4932,14836,4818,14679,4621,14517,4386,14359,4156,14083,3795,13808,3437,15360,122,15360,137,15358,285,15355,636,15344,1274,15322,2177,15281,2765,15215,3223,15120,3451,14995,3569,14846,3567,14681,3466,14511,3305,14344,3121,14037,2800,13753,2467,15360,0,15360,1,15359,21,15355,89,15346,253,15325,479,15287,796,15225,1148,15133,1492,15008,1749,14856,1882,14685,1886,14506,1783,14324,1608,13996,1398,13702,1183]);let tm=null;const rm=dn(({roughness:e,dotNV:t})=>{null===tm&&(tm=new Te(em,16,16,W,_e),tm.name="DFG_LUT",tm.minFilter=de,tm.magFilter=de,tm.wrapS=ve,tm.wrapT=ve,tm.generateMipmaps=!1,tm.needsUpdate=!0);const r=Tn(e,t);return Pl(tm,r).rg}),sm=dn(({lightDirection:e,f0:t,f90:r,roughness:s,f:i,USE_IRIDESCENCE:n,USE_ANISOTROPY:a})=>{const o=Jg({lightDirection:e,f0:t,f90:r,roughness:s,f:i,USE_IRIDESCENCE:n,USE_ANISOTROPY:a}),u=lc.dot(e).clamp(),l=lc.dot(Jd).clamp(),d=rm({roughness:s,dotNV:l}),c=rm({roughness:s,dotNV:u}),h=t.mul(d.x).add(r.mul(d.y)),p=t.mul(c.x).add(r.mul(c.y)),g=d.x.add(d.y),m=c.x.add(c.y),f=fn(1).sub(g),y=fn(1).sub(m),b=t.add(t.oneMinus().mul(.047619)),x=h.mul(p).mul(b).div(fn(1).sub(f.mul(y).mul(b).mul(b)).add(no)),T=f.mul(y),_=x.mul(T);return o.add(_)}),im=dn(e=>{const{dotNV:t,specularColor:r,specularF90:s,roughness:i}=e,n=rm({dotNV:t,roughness:i});return r.mul(n.x).add(s.mul(n.y))}),nm=dn(({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(Sn(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"}]}),am=dn(({roughness:e,dotNH:t})=>{const r=e.pow2(),s=fn(1).div(r),i=t.pow2().oneMinus().max(.0078125);return fn(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"}]}),om=dn(({dotNV:e,dotNL:t})=>fn(1).div(fn(4).mul(t.add(e).sub(t.mul(e))))).setLayout({name:"V_Neubelt",type:"float",inputs:[{name:"dotNV",type:"float"},{name:"dotNL",type:"float"}]}),um=dn(({lightDirection:e})=>{const t=e.add(Jd).normalize(),r=lc.dot(e).clamp(),s=lc.dot(Jd).clamp(),i=lc.dot(t).clamp(),n=am({roughness:Xn,dotNH:i}),a=om({dotNV:s,dotNL:r});return jn.mul(n).mul(a)}),lm=dn(({N:e,V:t,roughness:r})=>{const s=e.dot(t).saturate(),i=Tn(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"}]}),dm=dn(({f:e})=>{const t=e.length();return jo(t.mul(t).add(e.z).div(t.add(1)),0)}).setLayout({name:"LTC_ClippedSphereFormFactor",type:"float",inputs:[{name:"f",type:"vec3"}]}),cm=dn(({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,jo(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"}]}),hm=dn(({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=Sn().toVar();return pn(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(Ln(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=Sn(0).toVar();f.addAssign(cm({v1:h,v2:p})),f.addAssign(cm({v1:p,v2:g})),f.addAssign(cm({v1:g,v2:m})),f.addAssign(cm({v1:m,v2:h})),c.assign(Sn(dm({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"}]}),pm=dn(({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=Sn().toVar();return pn(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=Sn(0).toVar();d.addAssign(cm({v1:n,v2:a})),d.addAssign(cm({v1:a,v2:o})),d.addAssign(cm({v1:o,v2:l})),d.addAssign(cm({v1:l,v2:n})),u.assign(Sn(dm({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"}]}),gm=1/6,mm=e=>Pa(gm,Pa(e,Pa(e,e.negate().add(3)).sub(3)).add(1)),fm=e=>Pa(gm,Pa(e,Pa(e,Pa(3,e).sub(6))).add(4)),ym=e=>Pa(gm,Pa(e,Pa(e,Pa(-3,e).add(3)).add(3)).add(1)),bm=e=>Pa(gm,eu(e,3)),xm=e=>mm(e).add(fm(e)),Tm=e=>ym(e).add(bm(e)),_m=e=>Fa(-1,fm(e).div(mm(e).add(fm(e)))),vm=e=>Fa(1,bm(e).div(ym(e).add(bm(e)))),Nm=(e,t,r)=>{const s=e.uvNode,i=Pa(s,t.zw).add(.5),n=vo(i),a=Ro(i),o=xm(a.x),u=Tm(a.x),l=_m(a.x),d=vm(a.x),c=_m(a.y),h=vm(a.y),p=Tn(n.x.add(l),n.y.add(c)).sub(.5).mul(t.xy),g=Tn(n.x.add(d),n.y.add(c)).sub(.5).mul(t.xy),m=Tn(n.x.add(l),n.y.add(h)).sub(.5).mul(t.xy),f=Tn(n.x.add(d),n.y.add(h)).sub(.5).mul(t.xy),y=xm(a.y).mul(Fa(o.mul(e.sample(p).level(r)),u.mul(e.sample(g).level(r)))),b=Tm(a.y).mul(Fa(o.mul(e.sample(m).level(r)),u.mul(e.sample(f).level(r))));return y.add(b)},Sm=dn(([e,t])=>{const r=Tn(e.size(yn(t))),s=Tn(e.size(yn(t.add(1)))),i=Da(1,r),n=Da(1,s),a=Nm(e,wn(i,r),vo(t)),o=Nm(e,wn(n,s),No(t));return Ro(t).mix(a,o)}),Rm=dn(([e,t])=>{const r=t.mul(Cl(e));return Sm(e,r)}),Am=dn(([e,t,r,s,i])=>{const n=Sn(du(t.negate(),So(e),Da(1,s))),a=Sn(Po(i[0].xyz),Po(i[1].xyz),Po(i[2].xyz));return So(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"}]}),Em=dn(([e,t])=>e.mul(uu(t.mul(2).sub(2),0,1))).setLayout({name:"applyIorToRoughness",type:"float",inputs:[{name:"roughness",type:"float"},{name:"ior",type:"float"}]}),wm=Vp(),Cm=Gp(),Mm=dn(([e,t,r],{material:s})=>{const i=(s.side===L?wm:Cm).sample(e),n=xo(Xl.x).mul(Em(t,r));return Sm(i,n)}),Bm=dn(([e,t,r])=>(pn(r.notEqual(0),()=>{const s=bo(t).negate().div(r);return fo(s.negate().mul(e))}),Sn(1))).setLayout({name:"volumeAttenuation",type:"vec3",inputs:[{name:"transmissionDistance",type:"float"},{name:"attenuationColor",type:"vec3"},{name:"attenuationDistance",type:"float"}]}),Fm=dn(([e,t,r,s,i,n,a,o,u,l,d,c,h,p,g])=>{let m,f;if(g){m=wn().toVar(),f=Sn().toVar();const i=d.sub(1).mul(g.mul(.025)),n=Sn(d.sub(i),d,d.add(i));Sp({start:0,end:3},({i:i})=>{const d=n.element(i),g=Am(e,t,c,d,o),y=a.add(g),b=l.mul(u.mul(wn(y,1))),x=Tn(b.xy.div(b.w)).toVar();x.addAssign(1),x.divAssign(2),x.assign(Tn(x.x,x.y.oneMinus()));const T=Mm(x,r,d);m.element(i).assign(T.element(i)),m.a.addAssign(T.a),f.element(i).assign(s.element(i).mul(Bm(Po(g),h,p).element(i)))}),m.a.divAssign(3)}else{const i=Am(e,t,c,d,o),n=a.add(i),g=l.mul(u.mul(wn(n,1))),y=Tn(g.xy.div(g.w)).toVar();y.addAssign(1),y.divAssign(2),y.assign(Tn(y.x,y.y.oneMinus())),m=Mm(y,r,d),f=s.mul(Bm(Po(i),h,p))}const y=f.rgb.mul(m.rgb),b=e.dot(t).clamp(),x=Sn(im({dotNV:b,specularColor:i,specularF90:n,roughness:r})),T=f.r.add(f.g,f.b).div(3);return wn(x.oneMinus().mul(y),m.a.oneMinus().mul(T).oneMinus())}),Lm=Ln(3.2404542,-.969266,.0556434,-1.5371385,1.8760108,-.2040259,-.4985314,.041556,1.0572252),Pm=(e,t)=>e.sub(t).div(e.add(t)).pow2(),Dm=dn(({outsideIOR:e,eta2:t,cosTheta1:r,thinFilmThickness:s,baseF0:i})=>{const n=ou(e,t,cu(0,.03,s)),a=e.div(n).pow2().mul(r.pow2().oneMinus()).oneMinus();pn(a.lessThan(0),()=>Sn(1));const o=a.sqrt(),u=Pm(n,e),l=Ig({f0:u,f90:1,dotVH:r}),d=l.oneMinus(),c=n.lessThan(e).select(Math.PI,0),h=fn(Math.PI).sub(c),p=(e=>{const t=e.sqrt();return Sn(1).add(t).div(Sn(1).sub(t))})(i.clamp(0,.9999)),g=Pm(p,n.toVec3()),m=Ig({f0:g,f90:1,dotVH:o}),f=Sn(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=Sn(h).add(f),x=l.mul(m).clamp(1e-5,.9999),T=x.sqrt(),_=d.pow2().mul(m).div(Sn(1).sub(x)),v=l.add(_).toVar(),N=_.sub(d).toVar();return Sp({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=Sn(54856e-17,44201e-17,52481e-17),i=Sn(1681e3,1795300,2208400),n=Sn(43278e5,93046e5,66121e5),a=fn(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=Sn(o.x.add(a),o.y,o.z).div(1.0685e-7),Lm.mul(o)})(fn(e).mul(y),fn(e).mul(b)).mul(2);v.addAssign(N.mul(t))}),v.max(Sn(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"}]}),Um=dn(({normal:e,viewDir:t,roughness:r})=>{const s=e.dot(t).saturate(),i=r.mul(r),n=r.add(.1).reciprocal(),a=fn(-1.9362).add(r.mul(1.0678)).add(i.mul(.4573)).sub(n.mul(.8469)),o=fn(-.6014).add(r.mul(.5538)).sub(i.mul(.467)).sub(n.mul(.1255));return a.mul(s).add(o).exp().saturate()}),Im=Sn(.04),Om=fn(1);class Vm extends Lg{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,this.iridescenceF0Dielectric=null,this.iridescenceF0Metallic=null}start(e){if(!0===this.clearcoat&&(this.clearcoatRadiance=Sn().toVar("clearcoatRadiance"),this.clearcoatSpecularDirect=Sn().toVar("clearcoatSpecularDirect"),this.clearcoatSpecularIndirect=Sn().toVar("clearcoatSpecularIndirect")),!0===this.sheen&&(this.sheenSpecularDirect=Sn().toVar("sheenSpecularDirect"),this.sheenSpecularIndirect=Sn().toVar("sheenSpecularIndirect")),!0===this.iridescence){const e=lc.dot(Jd).clamp(),t=Dm({outsideIOR:fn(1),eta2:Qn,cosTheta1:e,thinFilmThickness:Yn,baseF0:ra}),r=Dm({outsideIOR:fn(1),eta2:Qn,cosTheta1:e,thinFilmThickness:Yn,baseF0:kn.rgb});this.iridescenceFresnel=ou(t,r,Wn),this.iridescenceF0Dielectric=nm({f:t,f90:1,dotVH:e}),this.iridescenceF0Metallic=nm({f:r,f90:1,dotVH:e}),this.iridescenceF0=ou(this.iridescenceF0Dielectric,this.iridescenceF0Metallic,Wn)}if(!0===this.transmission){const t=Qd,r=Nd.sub(Qd).normalize(),s=dc,i=e.context;i.backdrop=Fm(s,r,$n,Gn,sa,ia,t,Dd,Td,bd,da,ha,ga,pa,this.dispersion?ma:null),i.backdropAlpha=ca,kn.a.mulAssign(ou(1,i.backdrop.a,ca))}super.start(e)}computeMultiscattering(e,t,r,s,i=null){const n=lc.dot(Jd).clamp(),a=rm({roughness:$n,dotNV:n}),o=i?Kn.mix(s,i):s,u=o.mul(a.x).add(r.mul(a.y)),l=a.x.add(a.y).oneMinus(),d=o.add(o.oneMinus().mul(.047619)),c=u.mul(d).div(l.mul(d).oneMinus());e.addAssign(u),t.addAssign(c.mul(l))}direct({lightDirection:e,lightColor:t,reflectedLight:r}){const s=lc.dot(e).clamp().mul(t).toVar();if(!0===this.sheen){this.sheenSpecularDirect.addAssign(s.mul(um({lightDirection:e})));const t=Um({normal:lc,viewDir:Jd,roughness:Xn}),r=Um({normal:lc,viewDir:e,roughness:Xn}),i=jn.r.max(jn.g).max(jn.b).mul(t.max(r)).oneMinus();s.mulAssign(i)}if(!0===this.clearcoat){const r=cc.dot(e).clamp().mul(t);this.clearcoatSpecularDirect.addAssign(r.mul(Jg({lightDirection:e,f0:Im,f90:Om,roughness:qn,normalView:cc})))}r.directDiffuse.addAssign(s.mul(Og({diffuseColor:Gn}))),r.directSpecular.addAssign(s.mul(sm({lightDirection:e,f0:sa,f90:1,roughness:$n,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=lc,h=Jd,p=Zd.toVar(),g=lm({N:c,V:h,roughness:$n}),m=n.sample(g).toVar(),f=a.sample(g).toVar(),y=Ln(Sn(m.x,0,m.y),Sn(0,1,0),Sn(m.z,0,m.w)).toVar(),b=sa.mul(f.x).add(ia.sub(sa).mul(f.y)).toVar();if(i.directSpecular.addAssign(e.mul(b).mul(hm({N:c,V:h,P:p,mInv:y,p0:o,p1:u,p2:l,p3:d}))),i.directDiffuse.addAssign(e.mul(Gn).mul(hm({N:c,V:h,P:p,mInv:Ln(1,0,0,0,1,0,0,0,1),p0:o,p1:u,p2:l,p3:d}))),!0===this.clearcoat){const t=cc,r=lm({N:t,V:h,roughness:qn}),s=n.sample(r),i=a.sample(r),c=Ln(Sn(s.x,0,s.y),Sn(0,1,0),Sn(s.z,0,s.w)),g=Im.mul(i.x).add(Om.sub(Im).mul(i.y));this.clearcoatSpecularDirect.addAssign(e.mul(g).mul(hm({N:t,V:h,P:p,mInv:c,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,s=t.mul(Og({diffuseColor:Gn})).toVar();if(!0===this.sheen){const e=Um({normal:lc,viewDir:Jd,roughness:Xn}),t=jn.r.max(jn.g).max(jn.b).mul(e).oneMinus();s.mulAssign(t)}r.indirectDiffuse.addAssign(s)}indirectSpecular(e){const{radiance:t,iblIrradiance:r,reflectedLight:s}=e.context;if(!0===this.sheen&&this.sheenSpecularIndirect.addAssign(r.mul(jn,Um({normal:lc,viewDir:Jd,roughness:Xn}))),!0===this.clearcoat){const e=cc.dot(Jd).clamp(),t=im({dotNV:e,specularColor:Im,specularF90:Om,roughness:qn});this.clearcoatSpecularIndirect.addAssign(this.clearcoatRadiance.mul(t))}const i=Sn().toVar("singleScatteringDielectric"),n=Sn().toVar("multiScatteringDielectric"),a=Sn().toVar("singleScatteringMetallic"),o=Sn().toVar("multiScatteringMetallic");this.computeMultiscattering(i,n,ia,ra,this.iridescenceF0Dielectric),this.computeMultiscattering(a,o,ia,kn.rgb,this.iridescenceF0Metallic);const u=ou(i,a,Wn),l=ou(n,o,Wn),d=i.add(n),c=Gn.mul(d.oneMinus()),h=r.mul(1/Math.PI),p=t.mul(u).add(l.mul(h)).toVar(),g=c.mul(h).toVar();if(!0===this.sheen){const e=Um({normal:lc,viewDir:Jd,roughness:Xn}),t=jn.r.max(jn.g).max(jn.b).mul(e).oneMinus();p.mulAssign(t),g.mulAssign(t)}s.indirectSpecular.addAssign(p),s.indirectDiffuse.addAssign(g)}ambientOcclusion(e){const{ambientOcclusion:t,reflectedLight:r}=e.context,s=lc.dot(Jd).clamp().add(t),i=$n.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=cc.dot(Jd).clamp(),r=Ig({dotVH:e,f0:Im,f90:Om}),s=t.mul(Hn.mul(r).oneMinus()).add(this.clearcoatSpecularDirect.add(this.clearcoatSpecularIndirect).mul(Hn));t.assign(s)}if(!0===this.sheen){const e=t.add(this.sheenSpecularDirect,this.sheenSpecularIndirect.mul(1/Math.PI));t.assign(e)}}}const km=fn(1),Gm=fn(-2),zm=fn(.8),$m=fn(-1),Wm=fn(.4),Hm=fn(2),qm=fn(.305),jm=fn(3),Xm=fn(.21),Km=fn(4),Qm=fn(4),Ym=fn(16),Zm=dn(([e])=>{const t=Sn(Fo(e)).toVar(),r=fn(-1).toVar();return pn(t.x.greaterThan(t.z),()=>{pn(t.x.greaterThan(t.y),()=>{r.assign(Tu(e.x.greaterThan(0),0,3))}).Else(()=>{r.assign(Tu(e.y.greaterThan(0),1,4))})}).Else(()=>{pn(t.z.greaterThan(t.y),()=>{r.assign(Tu(e.z.greaterThan(0),2,5))}).Else(()=>{r.assign(Tu(e.y.greaterThan(0),1,4))})}),r}).setLayout({name:"getFace",type:"float",inputs:[{name:"direction",type:"vec3"}]}),Jm=dn(([e,t])=>{const r=Tn().toVar();return pn(t.equal(0),()=>{r.assign(Tn(e.z,e.y).div(Fo(e.x)))}).ElseIf(t.equal(1),()=>{r.assign(Tn(e.x.negate(),e.z.negate()).div(Fo(e.y)))}).ElseIf(t.equal(2),()=>{r.assign(Tn(e.x.negate(),e.y).div(Fo(e.z)))}).ElseIf(t.equal(3),()=>{r.assign(Tn(e.z.negate(),e.y).div(Fo(e.x)))}).ElseIf(t.equal(4),()=>{r.assign(Tn(e.x.negate(),e.z).div(Fo(e.y)))}).Else(()=>{r.assign(Tn(e.x,e.y).div(Fo(e.z)))}),Pa(.5,r.add(1))}).setLayout({name:"getUV",type:"vec2",inputs:[{name:"direction",type:"vec3"},{name:"face",type:"float"}]}),ef=dn(([e])=>{const t=fn(0).toVar();return pn(e.greaterThanEqual(zm),()=>{t.assign(km.sub(e).mul($m.sub(Gm)).div(km.sub(zm)).add(Gm))}).ElseIf(e.greaterThanEqual(Wm),()=>{t.assign(zm.sub(e).mul(Hm.sub($m)).div(zm.sub(Wm)).add($m))}).ElseIf(e.greaterThanEqual(qm),()=>{t.assign(Wm.sub(e).mul(jm.sub(Hm)).div(Wm.sub(qm)).add(Hm))}).ElseIf(e.greaterThanEqual(Xm),()=>{t.assign(qm.sub(e).mul(Km.sub(jm)).div(qm.sub(Xm)).add(jm))}).Else(()=>{t.assign(fn(-2).mul(xo(Pa(1.16,e))))}),t}).setLayout({name:"roughnessToMip",type:"float",inputs:[{name:"roughness",type:"float"}]}),tf=dn(([e,t])=>{const r=e.toVar();r.assign(Pa(2,r).sub(1));const s=Sn(r,1).toVar();return pn(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"}]}),rf=dn(([e,t,r,s,i,n])=>{const a=fn(r),o=Sn(t),u=uu(ef(a),Gm,n),l=Ro(u),d=vo(u),c=Sn(sf(e,o,d,s,i,n)).toVar();return pn(l.notEqual(0),()=>{const t=Sn(sf(e,o,d.add(1),s,i,n)).toVar();c.assign(ou(c,t,l))}),c}),sf=dn(([e,t,r,s,i,n])=>{const a=fn(r).toVar(),o=Sn(t),u=fn(Zm(o)).toVar(),l=fn(jo(Qm.sub(a),0)).toVar();a.assign(jo(a,Qm));const d=fn(yo(a)).toVar(),c=Tn(Jm(o,u).mul(d.sub(2)).add(1)).toVar();return pn(u.greaterThan(2),()=>{c.y.addAssign(d),u.subAssign(3)}),c.x.addAssign(u.mul(d)),c.x.addAssign(l.mul(Pa(3,Ym))),c.y.addAssign(Pa(4,yo(n).sub(d))),c.x.mulAssign(s),c.y.mulAssign(i),e.sample(c).grad(Tn(),Tn())}),nf=dn(({envMap:e,mipInt:t,outputDirection:r,theta:s,axis:i,CUBEUV_TEXEL_WIDTH:n,CUBEUV_TEXEL_HEIGHT:a,CUBEUV_MAX_MIP:o})=>{const u=Eo(s),l=r.mul(u).add(i.cross(r).mul(Ao(s))).add(i.mul(i.dot(r).mul(u.oneMinus())));return sf(e,l,t,n,a,o)}),af=dn(({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=Sn(Tu(t,r,Jo(r,s))).toVar();pn(h.equal(Sn(0)),()=>{h.assign(Sn(s.z,0,s.x.negate()))}),h.assign(So(h));const p=Sn().toVar();return p.addAssign(i.element(0).mul(nf({theta:0,axis:h,outputDirection:s,mipInt:o,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c}))),Sp({start:yn(1),end:e},({i:e})=>{pn(e.greaterThanEqual(n),()=>{Rp()});const t=fn(a.mul(fn(e))).toVar();p.addAssign(i.element(e).mul(nf({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(nf({theta:t,axis:h,outputDirection:s,mipInt:o,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c})))}),wn(p,1)}),of=dn(([e])=>{const t=bn(e).toVar();return t.assign(t.shiftLeft(bn(16)).bitOr(t.shiftRight(bn(16)))),t.assign(t.bitAnd(bn(1431655765)).shiftLeft(bn(1)).bitOr(t.bitAnd(bn(2863311530)).shiftRight(bn(1)))),t.assign(t.bitAnd(bn(858993459)).shiftLeft(bn(2)).bitOr(t.bitAnd(bn(3435973836)).shiftRight(bn(2)))),t.assign(t.bitAnd(bn(252645135)).shiftLeft(bn(4)).bitOr(t.bitAnd(bn(4042322160)).shiftRight(bn(4)))),t.assign(t.bitAnd(bn(16711935)).shiftLeft(bn(8)).bitOr(t.bitAnd(bn(4278255360)).shiftRight(bn(8)))),fn(t).mul(2.3283064365386963e-10)}),uf=dn(([e,t])=>Tn(fn(e).div(fn(t)),of(e))),lf=dn(([e,t,r])=>{const s=r.mul(r).toConst(),i=Sn(1,0,0).toConst(),n=Jo(t,i).toConst(),a=To(e.x).toConst(),o=Pa(2,3.14159265359).mul(e.y).toConst(),u=a.mul(Eo(o)).toConst(),l=a.mul(Ao(o)).toVar(),d=Pa(.5,t.z.add(1)).toConst();l.assign(d.oneMinus().mul(To(u.mul(u).oneMinus())).add(d.mul(l)));const c=i.mul(u).add(n.mul(l)).add(t.mul(To(jo(0,u.mul(u).add(l.mul(l)).oneMinus()))));return So(Sn(s.mul(c.x),s.mul(c.y),jo(0,c.z)))}),df=dn(({roughness:e,mipInt:t,envMap:r,N_immutable:s,GGX_SAMPLES:i,CUBEUV_TEXEL_WIDTH:n,CUBEUV_TEXEL_HEIGHT:a,CUBEUV_MAX_MIP:o})=>{const u=Sn(s).toVar(),l=Sn(0).toVar(),d=fn(0).toVar();return pn(e.lessThan(.001),()=>{l.assign(sf(r,u,t,n,a,o))}).Else(()=>{const s=Tu(Fo(u.z).lessThan(.999),Sn(0,0,1),Sn(1,0,0)),c=So(Jo(s,u)).toVar(),h=Jo(u,c).toVar();Sp({start:bn(0),end:i},({i:s})=>{const p=uf(s,i),g=lf(p,Sn(0,0,1),e),m=So(c.mul(g.x).add(h.mul(g.y)).add(u.mul(g.z))),f=So(m.mul(Zo(u,m).mul(2)).sub(u)),y=jo(Zo(u,f),0);pn(y.greaterThan(0),()=>{const e=sf(r,f,t,n,a,o);l.addAssign(e.mul(y)),d.addAssign(y)})}),pn(d.greaterThan(0),()=>{l.assign(l.div(d))})}),wn(l,1)}),cf=[.125,.215,.35,.446,.526,.582],hf=20,pf=new Se(-1,1,1,-1,0,1),gf=new Re(90,1),mf=new e;let ff=null,yf=0,bf=0;const xf=new r,Tf=new WeakMap,_f=[3,1,5,0,4,2],vf=tf(Rl(),Sl("faceIndex")).normalize(),Nf=Sn(vf.x,vf.y,vf.z);class Sf{constructor(e){this._renderer=e,this._pingPongRenderTarget=null,this._lodMax=0,this._cubeSize=0,this._sizeLods=[],this._sigmas=[],this._lodMeshes=[],this._blurMaterial=null,this._ggxMaterial=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=xf,renderTarget:o=null}=i;if(this._setSize(n),!1===this._hasInitialized){d('PMREMGenerator: ".fromScene()" called before the backend is initialized. Try using "await renderer.init()" instead.');const n=o||this._allocateTarget();return i.renderTarget=n,this.fromSceneAsync(e,t,r,s,i),n}ff=this._renderer.getRenderTarget(),yf=this._renderer.getActiveCubeFace(),bf=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 v('PMREMGenerator: ".fromSceneAsync()" is deprecated. Use "await renderer.init()" instead.'),await this._renderer.init(),this.fromScene(e,t,r,s,i)}fromEquirectangular(e,t=null){if(!1===this._hasInitialized){d('PMREMGenerator: .fromEquirectangular() called before the backend is initialized. Try using "await renderer.init()" 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 v('PMREMGenerator: ".fromEquirectangularAsync()" is deprecated. Use "await renderer.init()" instead.'),await this._renderer.init(),this._fromTexture(e,t)}fromCubemap(e,t=null){if(!1===this._hasInitialized){d("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 v('PMREMGenerator: ".fromCubemapAsync()" is deprecated. Use "await renderer.init()" instead.'),await this._renderer.init(),this._fromTexture(e,t)}async compileCubemapShader(){null===this._cubemapMaterial&&(this._cubemapMaterial=wf(),await this._compileMaterial(this._cubemapMaterial))}async compileEquirectangularShader(){null===this._equirectMaterial&&(this._equirectMaterial=Cf(),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===I||e.mapping===O?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._ggxMaterial&&this._ggxMaterial.dispose(),null!==this._pingPongRenderTarget&&this._pingPongRenderTarget.dispose();for(let e=0;ee-4?o=cf[a-e+4-1]:0===a&&(o=0),r.push(o);const u=1/(n-2),l=-u,d=1+u,c=[l,l,d,l,d,d,l,l,d,d,l,d],h=6,p=6,g=3,m=2,f=1,y=new Float32Array(g*p*h),b=new Float32Array(m*p*h),x=new Float32Array(f*p*h);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=_f[e];y.set(s,g*p*i),b.set(c,m*p*i);const n=[i,i,i,i,i,i];x.set(n,f*p*i)}const T=new Ne;T.setAttribute("position",new Ce(y,g)),T.setAttribute("uv",new Ce(b,m)),T.setAttribute("faceIndex",new Ce(x,f)),s.push(new ue(T,null)),i>4&&i--}return{lodMeshes:s,sizeLods:t,sigmas:r}}(t)),this._blurMaterial=function(e,t,s){const i=kl(new Array(hf).fill(0)),n=Na(new r(0,1,0)),a=Na(0),o=fn(hf),u=Na(0),l=Na(1),d=Pl(),c=Na(0),h=fn(1/t),p=fn(1/s),g=fn(e),m={n:o,latitudinal:u,weights:i,poleAxis:n,outputDirection:Nf,dTheta:a,samples:l,envMap:d,mipInt:c,CUBEUV_TEXEL_WIDTH:h,CUBEUV_TEXEL_HEIGHT:p,CUBEUV_MAX_MIP:g},f=Ef("blur");return f.fragmentNode=af({...m,latitudinal:u.equal(1)}),Tf.set(f,m),f}(t,e.width,e.height),this._ggxMaterial=function(e,t,r){const s=Pl(),i=Na(0),n=Na(0),a=fn(1/t),o=fn(1/r),u=fn(e),l={envMap:s,roughness:i,mipInt:n,CUBEUV_TEXEL_WIDTH:a,CUBEUV_TEXEL_HEIGHT:o,CUBEUV_MAX_MIP:u},d=Ef("ggx");return d.fragmentNode=df({...l,N_immutable:Nf,GGX_SAMPLES:bn(512)}),Tf.set(d,l),d}(t,e.width,e.height)}}async _compileMaterial(e){const t=new ue(new Ne,e);await this._renderer.compile(t,pf)}_sceneToCubeUV(e,t,r,s,i){const n=gf;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(mf),u.autoClear=!1,null===this._backgroundBox&&(this._backgroundBox=new ue(new oe,new ye({name:"PMREM.Background",side:L,depthWrite:!1,depthTest:!1})));const d=this._backgroundBox,c=d.material;let h=!1;const p=e.background;p?p.isColor&&(c.color.copy(p),e.background=null,h=!0):(c.color.copy(mf),h=!0),u.setRenderTarget(s),u.clear(),h&&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;Af(s,r*l,t>2?l:0,l,l),u.render(e,n)}u.autoClear=l,e.background=p}_textureToCubeUV(e,t){const r=this._renderer,s=e.mapping===I||e.mapping===O;s?null===this._cubemapMaterial&&(this._cubemapMaterial=wf(e)):null===this._equirectMaterial&&(this._equirectMaterial=Cf(e));const i=s?this._cubemapMaterial:this._equirectMaterial;i.fragmentNode.value=e;const n=this._lodMeshes[0];n.material=i;const a=this._cubeSize;Af(t,0,0,3*a,2*a),r.setRenderTarget(t),r.render(n,pf)}_applyPMREM(e){const t=this._renderer,r=t.autoClear;t.autoClear=!1;const s=this._lodMeshes.length;for(let t=1;tc-4?r-c+4:0),g=4*(this._cubeSize-h);e.texture.frame=(e.texture.frame||0)+1,o.envMap.value=e.texture,o.roughness.value=d,o.mipInt.value=c-t,Af(i,p,g,3*h,2*h),s.setRenderTarget(i),s.render(a,pf),i.texture.frame=(i.texture.frame||0)+1,o.envMap.value=i.texture,o.roughness.value=0,o.mipInt.value=c-r,Af(e,p,g,3*h,2*h),s.setRenderTarget(e),s.render(a,pf)}_blur(e,t,r,s,i){const n=this._pingPongRenderTarget;this._halfBlur(e,n,t,r,s,"latitudinal",i),this._halfBlur(n,e,r,r,s,"longitudinal",i)}_halfBlur(e,t,r,s,i,n,a){const u=this._renderer,l=this._blurMaterial;"latitudinal"!==n&&"longitudinal"!==n&&o("blur direction must be either latitudinal or longitudinal!");const c=this._lodMeshes[s];c.material=l;const h=Tf.get(l),p=this._sizeLods[r]-1,g=isFinite(i)?Math.PI/(2*p):2*Math.PI/39,m=i/g,f=isFinite(i)?1+Math.floor(3*m):hf;f>hf&&d(`sigmaRadians, ${i}, is too large and will clip, as it requested ${f} samples when the maximum is set to 20`);const y=[];let b=0;for(let e=0;ex-4?s-x+4:0),4*(this._cubeSize-T),3*T,2*T),u.setRenderTarget(t),u.render(c,pf)}}function Rf(e,t){const r=new ae(e,t,{magFilter:de,minFilter:de,generateMipmaps:!1,type:_e,format:Ee,colorSpace:Ae});return r.texture.mapping=we,r.texture.name="PMREM.cubeUv",r.texture.isPMREMTexture=!0,r.scissorTest=!0,r}function Af(e,t,r,s,i){e.viewport.set(t,r,s,i),e.scissor.set(t,r,s,i)}function Ef(e){const t=new mg;return t.depthTest=!1,t.depthWrite=!1,t.blending=se,t.name=`PMREM_${e}`,t}function wf(e){const t=Ef("cubemap");return t.fragmentNode=Cc(e,Nf),t}function Cf(e){const t=Ef("equirect");return t.fragmentNode=Pl(e,Sg(Nf),0),t}const Mf=new WeakMap;function Bf(e,t,r){const s=function(e){let t=Mf.get(e);void 0===t&&(t=new WeakMap,Mf.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 Ff extends pi{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 N;s.isRenderTargetTexture=!0,this._texture=Pl(s),this._width=Na(0),this._height=Na(0),this._maxMip=Na(0),this.updateBeforeType=ti.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:Bf(s,e.renderer,this._generator),null!==t&&(this._pmrem=t,this.updateFromTexture(t)))}setup(e){null===this._generator&&(this._generator=new Sf(e.renderer)),this.updateBefore(e);let t=this.uvNode;null===t&&e.context.getUV&&(t=e.context.getUV(this,e)),t=_c.mul(Sn(t.x,t.y.negate(),t.z));let r=this.levelNode;return null===r&&e.context.getTextureLevel&&(r=e.context.getTextureLevel(this)),rf(this._texture,t,r,this._width,this._height,this._maxMip)}dispose(){super.dispose(),null!==this._generator&&this._generator.dispose()}}const Lf=nn(Ff).setParameterLength(1,3),Pf=new WeakMap;class Df extends Bp{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 s=r.isTextureNode?r.value:t[r.property],i=this._getPMREMNodeCache(e.renderer);let n=i.get(s);void 0===n&&(n=Lf(s),i.set(s,n)),r=n}const s=!0===t.useAnisotropy||t.anisotropy>0?oh:lc,i=r.context(Uf($n,s)).mul(Tc),n=r.context(If(dc)).mul(Math.PI).mul(Tc),a=ul(i),o=ul(n);e.context.radiance.addAssign(a),e.context.iblIrradiance.addAssign(o);const u=e.context.lightingModel.clearcoatRadiance;if(u){const e=r.context(Uf(qn,cc)).mul(Tc),t=ul(e);u.addAssign(t)}}_getPMREMNodeCache(e){let t=Pf.get(e);return void 0===t&&(t=new WeakMap,Pf.set(e,t)),t}}const Uf=(e,t)=>{let r=null;return{getUV:()=>(null===r&&(r=Jd.negate().reflect(t),r=su(e).mix(r,t).normalize(),r=r.transformDirection(Td)),r),getTextureLevel:()=>e}},If=e=>({getUV:()=>e,getTextureLevel:()=>fn(1)}),Of=new Me;class Vf extends mg{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(Of),this.setValues(e)}setupEnvironment(e){let t=super.setupEnvironment(e);return null===t&&e.environmentNode&&(t=e.environmentNode),t?new Df(t):null}setupLightingModel(){return new Vm}setupSpecular(){const e=ou(Sn(.04),kn.rgb,Wn);ra.assign(Sn(.04)),sa.assign(e),ia.assign(1)}setupVariants(){const e=this.metalnessNode?fn(this.metalnessNode):Ch;Wn.assign(e);let t=this.roughnessNode?fn(this.roughnessNode):wh;t=jg({roughness:t}),$n.assign(t),this.setupSpecular(),Gn.assign(kn.rgb.mul(e.oneMinus()))}copy(e){return this.emissiveNode=e.emissiveNode,this.metalnessNode=e.metalnessNode,this.roughnessNode=e.roughnessNode,super.copy(e)}}const kf=new Be;class Gf extends Vf{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(kf),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?fn(this.iorNode):$h;da.assign(e),ra.assign(qo(tu(da.sub(1).div(da.add(1))).mul(Rh),Sn(1)).mul(Sh)),sa.assign(ou(ra,kn.rgb,Wn)),ia.assign(ou(Sh,1,Wn))}setupLightingModel(){return new Vm(this.useClearcoat,this.useSheen,this.useIridescence,this.useAnisotropy,this.useTransmission,this.useDispersion)}setupVariants(e){if(super.setupVariants(e),this.useClearcoat){const e=this.clearcoatNode?fn(this.clearcoatNode):Bh,t=this.clearcoatRoughnessNode?fn(this.clearcoatRoughnessNode):Fh;Hn.assign(e),qn.assign(jg({roughness:t}))}if(this.useSheen){const e=this.sheenNode?Sn(this.sheenNode):Dh,t=this.sheenRoughnessNode?fn(this.sheenRoughnessNode):Uh;jn.assign(e),Xn.assign(t)}if(this.useIridescence){const e=this.iridescenceNode?fn(this.iridescenceNode):Oh,t=this.iridescenceIORNode?fn(this.iridescenceIORNode):Vh,r=this.iridescenceThicknessNode?fn(this.iridescenceThicknessNode):kh;Kn.assign(e),Qn.assign(t),Yn.assign(r)}if(this.useAnisotropy){const e=(this.anisotropyNode?Tn(this.anisotropyNode):Ih).toVar();Jn.assign(e.length()),pn(Jn.equal(0),()=>{e.assign(Tn(1,0))}).Else(()=>{e.divAssign(Tn(Jn)),Jn.assign(Jn.saturate())}),Zn.assign(Jn.pow2().mix($n.pow2(),1)),ea.assign(nh[0].mul(e.x).add(nh[1].mul(e.y))),ta.assign(nh[1].mul(e.x).sub(nh[0].mul(e.y)))}if(this.useTransmission){const e=this.transmissionNode?fn(this.transmissionNode):Gh,t=this.thicknessNode?fn(this.thicknessNode):zh,r=this.attenuationDistanceNode?fn(this.attenuationDistanceNode):Wh,s=this.attenuationColorNode?Sn(this.attenuationColorNode):Hh;if(ca.assign(e),ha.assign(t),pa.assign(r),ga.assign(s),this.useDispersion){const e=this.dispersionNode?fn(this.dispersionNode):Zh;ma.assign(e)}}}setupClearcoatNormal(){return this.clearcoatNormalNode?Sn(this.clearcoatNormalNode):Lh}setup(e){e.context.setupClearcoatNormal=()=>Pu(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.iorNode=e.iorNode,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 zf extends Vm{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(lc.mul(a)).normalize(),h=fn(Jd.dot(c.negate()).saturate().pow(l).mul(d)),p=Sn(h.add(o).mul(n));r.directDiffuse.addAssign(p.mul(u.mul(t)))}super.direct({lightDirection:e,lightColor:t,reflectedLight:r},s)}}class $f extends Gf{static get type(){return"MeshSSSNodeMaterial"}constructor(e){super(e),this.thicknessColorNode=null,this.thicknessDistortionNode=fn(.1),this.thicknessAmbientNode=fn(0),this.thicknessAttenuationNode=fn(.1),this.thicknessPowerNode=fn(2),this.thicknessScaleNode=fn(10)}get useSSS(){return null!==this.thicknessColorNode}setupLightingModel(){return new zf(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 Wf=dn(({normal:e,lightDirection:t,builder:r})=>{const s=e.dot(t),i=Tn(s.mul(.5).add(.5),0);if(r.material.gradientMap){const e=Dc("gradientMap","texture").context({getUV:()=>i});return Sn(e.r)}{const e=i.fwidth().mul(.5);return ou(Sn(.7),Sn(1),cu(fn(.7).sub(e.x),fn(.7).add(e.x),i.x))}});class Hf extends Lg{direct({lightDirection:e,lightColor:t,reflectedLight:r},s){const i=Wf({normal:ic,lightDirection:e,builder:s}).mul(t);r.directDiffuse.addAssign(i.mul(Og({diffuseColor:kn.rgb})))}indirect(e){const{ambientOcclusion:t,irradiance:r,reflectedLight:s}=e.context;s.indirectDiffuse.addAssign(r.mul(Og({diffuseColor:kn}))),s.indirectDiffuse.mulAssign(t)}}const qf=new Fe;class jf extends mg{static get type(){return"MeshToonNodeMaterial"}constructor(e){super(),this.isMeshToonNodeMaterial=!0,this.lights=!0,this.setDefaultValues(qf),this.setValues(e)}setupLightingModel(){return new Hf}}const Xf=dn(()=>{const e=Sn(Jd.z,0,Jd.x.negate()).normalize(),t=Jd.cross(e);return Tn(e.dot(lc),t.dot(lc)).mul(.495).add(.5)}).once(["NORMAL","VERTEX"])().toVar("matcapUV"),Kf=new Le;class Qf extends mg{static get type(){return"MeshMatcapNodeMaterial"}constructor(e){super(),this.isMeshMatcapNodeMaterial=!0,this.setDefaultValues(Kf),this.setValues(e)}setupVariants(e){const t=Xf;let r;r=e.material.matcap?Dc("matcap","texture").context({getUV:()=>t}):Sn(ou(.2,.8,t.y)),kn.rgb.mulAssign(r.rgb)}}class Yf extends pi{static get type(){return"RotateNode"}constructor(e,t){super(),this.positionNode=e,this.rotationNode=t}generateNodeType(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 Fn(e,s,s.negate(),e).mul(r)}{const e=t,s=Pn(wn(1,0,0,0),wn(0,Eo(e.x),Ao(e.x).negate(),0),wn(0,Ao(e.x),Eo(e.x),0),wn(0,0,0,1)),i=Pn(wn(Eo(e.y),0,Ao(e.y),0),wn(0,1,0,0),wn(Ao(e.y).negate(),0,Eo(e.y),0),wn(0,0,0,1)),n=Pn(wn(Eo(e.z),Ao(e.z).negate(),0,0),wn(Ao(e.z),Eo(e.z),0,0),wn(0,0,1,0),wn(0,0,0,1));return s.mul(i).mul(n).mul(wn(r,1)).xyz}}}const Zf=nn(Yf).setParameterLength(2),Jf=new Pe;class ey extends mg{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(Jf),this.setValues(e)}setupPositionView(e){const{object:t,camera:r}=e,{positionNode:s,rotationNode:i,scaleNode:n,sizeAttenuation:a}=this,o=zd.mul(Sn(s||0));let u=Tn(Dd[0].xyz.length(),Dd[1].xyz.length());null!==n&&(u=u.mul(Tn(n))),r.isPerspectiveCamera&&!1===a&&(u=u.mul(o.z.negate()));let l=jd.xy;if(t.center&&!0===t.center.isVector2){const e=((e,t,r)=>new Hu(e,t,r))("center","vec2",t);l=l.sub(e.sub(.5))}l=l.mul(u);const d=fn(i||Ph),c=Zf(l,d);return wn(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 ty=new De,ry=new t;class sy extends ey{static get type(){return"PointsNodeMaterial"}constructor(e){super(),this.sizeNode=null,this.isPointsNodeMaterial=!0,this.setDefaultValues(ty),this.setValues(e)}setupPositionView(){const{positionNode:e}=this;return zd.mul(Sn(e||Xd)).xyz}setupVertexSprite(e){const{material:t,camera:r}=e,{rotationNode:s,scaleNode:i,sizeNode:n,sizeAttenuation:a}=this;let o=super.setupVertex(e);if(!0!==t.isNodeMaterial)return o;let u=null!==n?Tn(n):Yh;u=u.mul(ql),r.isPerspectiveCamera&&!0===a&&(u=u.mul(iy.div(Zd.z.negate()))),i&&i.isNode&&(u=u.mul(Tn(i)));let l=jd.xy;if(s&&s.isNode){const e=fn(s);l=Zf(l,e)}return l=l.mul(u),l=l.div(Yl.div(2)),l=l.mul(o.w),o=o.add(wn(l,0,0)),o}setupVertex(e){return e.object.isPoints?super.setupVertex(e):this.setupVertexSprite(e)}get alphaToCoverage(){return this._useAlphaToCoverage}set alphaToCoverage(e){this._useAlphaToCoverage!==e&&(this._useAlphaToCoverage=e,this.needsUpdate=!0)}}const iy=Na(1).onFrameUpdate(function({renderer:e}){const t=e.getSize(ry);this.value=.5*t.y});class ny extends Lg{constructor(){super(),this.shadowNode=fn(1).toVar("shadowMask")}direct({lightNode:e}){null!==e.shadowNode&&this.shadowNode.mulAssign(e.shadowNode)}finish({context:e}){kn.a.mulAssign(this.shadowNode.oneMinus()),e.outgoingLight.rgb.assign(kn.rgb)}}const ay=new Ue;class oy extends mg{static get type(){return"ShadowNodeMaterial"}constructor(e){super(),this.isShadowNodeMaterial=!0,this.lights=!0,this.transparent=!0,this.setDefaultValues(ay),this.setValues(e)}setupLightingModel(){return new ny}}const uy=On("vec3"),ly=On("vec3"),dy=On("vec3");class cy extends Lg{constructor(){super()}start(e){const{material:t}=e,r=On("vec3"),s=On("vec3");pn(Nd.sub(Qd).length().greaterThan(Vd.mul(2)),()=>{r.assign(Nd),s.assign(Qd)}).Else(()=>{r.assign(Qd),s.assign(Nd)});const i=s.sub(r),n=Na("int").onRenderUpdate(({material:e})=>e.steps),a=i.length().div(n).toVar(),o=i.normalize().toVar(),u=fn(0).toVar(),l=Sn(1).toVar();t.offsetNode&&u.addAssign(t.offsetNode.mul(a)),Sp(n,()=>{const s=r.add(o.mul(u)),i=Td.mul(wn(s,1)).xyz;let n;null!==t.depthNode&&(ly.assign(eg(Xp(i.z,fd,yd))),e.context.sceneDepthNode=eg(t.depthNode).toVar()),e.context.positionWorld=s,e.context.shadowPositionWorld=s,e.context.positionView=i,uy.assign(0),t.scatteringNode&&(n=t.scatteringNode({positionRay:s})),super.start(e),n&&uy.mulAssign(n);const d=uy.mul(.01).negate().mul(a).exp();l.mulAssign(d),u.addAssign(a)}),dy.addAssign(l.saturate().oneMinus())}scatteringLight(e,t){const r=t.context.sceneDepthNode;r?pn(r.greaterThanEqual(ly),()=>{uy.addAssign(e)}):uy.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(pm({P:l,p0:n,p1:a,p2:o,p3:u})).pow(1.5);this.scatteringLight(d,i)}finish(e){e.context.outgoingLight.assign(dy)}}class hy extends mg{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=L,this.depthTest=!1,this.depthWrite=!1,this.setValues(e)}setupLightingModel(){return new cy}}class py{constructor(e,t,r){this.renderer=e,this.nodes=t,this.info=r,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,this.renderer._inspector.begin(),null!==this._animationLoop&&this._animationLoop(t,r),this.renderer._inspector.finish()};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 gy{constructor(){this.weakMaps={}}_getWeakMap(e){const t=e.length;let r=this.weakMaps[t];return void 0===r&&(r=new WeakMap,this.weakMaps[t]=r),r}get(e){let t=this._getWeakMap(e);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)}getIndirectOffset(){return this._geometries.getIndirectOffset(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.id),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||Array.isArray(e.morphTargetInfluences))&&(s+=e.uuid+","),s+=this.context.id+",",s+=e.receiveShadow+",",Os(s)}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=ks(e,this.camera.cameras.length)),this.object.receiveShadow&&(e=ks(e,1)),e=ks(e,this.renderer.contextNode.id,this.renderer.contextNode.version),e}getCacheKey(){return this.getMaterialCacheKey()+this.getDynamicCacheKey()}dispose(){this.material.removeEventListener("dispose",this.onMaterialDispose),this.geometry.removeEventListener("dispose",this.onGeometryDispose),this.onDispose()}}const yy=[];class by{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);yy[0]=e,yy[1]=t,yy[2]=n,yy[3]=i;let l=u.get(yy);return void 0===l?(l=this.createRenderObject(this.nodes,this.geometries,this.renderer,e,t,r,s,i,n,a,o),u.set(yy,l)):(l.camera=s,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)),yy[0]=null,yy[1]=null,yy[2]=null,yy[3]=null,l}getChainMap(e="default"){return this.chainMaps[e]||(this.chainMaps[e]=new gy)}dispose(){this.chainMaps={}}createRenderObject(e,t,r,s,i,n,a,o,u,l,d){const c=this.getChainMap(d),h=new fy(e,t,r,s,i,n,a,o,u,l);return h.onDispose=()=>{this.pipelines.delete(h),this.bindings.deleteForRender(h),this.nodes.delete(h),c.delete(h.getChainArray())},h}}class xy{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 Ty=1,_y=2,vy=3,Ny=4,Sy=16;class Ry extends xy{constructor(e,t){super(),this.backend=e,this.info=t}delete(e){const t=super.delete(e);return null!==t&&(this.backend.destroyAttribute(e),this.info.destroyAttribute(e)),t}update(e,t){const r=this.get(e);if(void 0===r.version)t===Ty?(this.backend.createAttribute(e),this.info.createAttribute(e)):t===_y?(this.backend.createIndexAttribute(e),this.info.createIndexAttribute(e)):t===vy?(this.backend.createStorageAttribute(e),this.info.createStorageAttribute(e)):t===Ny&&(this.backend.createIndirectStorageAttribute(e),this.info.createIndirectStorageAttribute(e)),r.version=this._getBufferAttribute(e).version;else{const t=this._getBufferAttribute(e);(r.version=65535?Ie:Oe)(t,1);return i.version=Ay(e),i.__id=Ey(e),i}class Cy extends xy{constructor(e,t){super(),this.attributes=e,this.info=t,this.wireframes=new WeakMap,this.attributeCall=new WeakMap,this._geometryDisposeListeners=new Map}has(e){const t=e.geometry;return super.has(t)&&!0===this.get(t).initialized}updateForRender(e){!1===this.has(e)&&this.initGeometry(e),this.updateAttributes(e)}initGeometry(e){const t=e.geometry;this.get(t).initialized=!0,this.info.memory.geometries++;const r=()=>{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),this._geometryDisposeListeners.delete(t)};t.addEventListener("dispose",r),this._geometryDisposeListeners.set(t,r)}updateAttributes(e){const t=e.getAttributes();for(const e of t)e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute?this.updateAttribute(e,vy):this.updateAttribute(e,Ty);const r=this.getIndex(e);null!==r&&this.updateAttribute(r,_y);const s=e.geometry.indirect;null!==s&&this.updateAttribute(s,Ny)}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}getIndirectOffset(e){return e.geometry.indirectOffset}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=wy(t),e.set(t,r)):r.version===Ay(t)&&r.__id===Ey(t)||(this.attributes.delete(r),r=wy(t),e.set(t,r)),s=r}return s}dispose(){for(const[e,t]of this._geometryDisposeListeners.entries())e.removeEventListener("dispose",t);this._geometryDisposeListeners.clear()}}class My{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,attributes:0,indexAttributes:0,storageAttributes:0,indirectStorageAttributes:0,programs:0,renderTargets:0,total:0,texturesSize:0,attributesSize:0,indexAttributesSize:0,storageAttributesSize:0,indirectStorageAttributesSize:0},this.memoryMap=new Map}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):o("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;for(const e in this.memory)this.memory[e]=0;this.memoryMap.clear()}createTexture(e){const t=this._getTextureMemorySize(e);this.memoryMap.set(e,t),this.memory.textures++,this.memory.total+=t,this.memory.texturesSize+=t}destroyTexture(e){const t=this.memoryMap.get(e)||0;this.memoryMap.delete(e),this.memory.textures--,this.memory.total-=t,this.memory.texturesSize-=t}_createAttribute(e,t){const r=this._getAttributeMemorySize(e);this.memoryMap.set(e,{size:r,type:t}),this.memory[t]++,this.memory.total+=r,this.memory[t+"Size"]+=r}createAttribute(e){this._createAttribute(e,"attributes")}createIndexAttribute(e){this._createAttribute(e,"indexAttributes")}createStorageAttribute(e){this._createAttribute(e,"storageAttributes")}createIndirectStorageAttribute(e){this._createAttribute(e,"indirectStorageAttributes")}destroyAttribute(e){const t=this.memoryMap.get(e);t&&(this.memoryMap.delete(e),this.memory[t.type]--,this.memory.total-=t.size,this.memory[t.type+"Size"]-=t.size)}_getTextureMemorySize(e){if(e.isCompressedTexture)return 1;let t=1;e.type===Ve||e.type===ke?t=1:e.type===Ge||e.type===ze||e.type===_e?t=2:e.type!==R&&e.type!==S&&e.type!==Q||(t=4);let r=4;e.format===$e||e.format===We||e.format===He||e.format===qe||e.format===je?r=1:e.format===Xe&&(r=3);let s=t*r;e.type===Ke||e.type===Qe?s=2:e.type!==Ye&&e.type!==Ze&&e.type!==Je||(s=4);const i=e.width||1,n=e.height||1,a=e.isCubeTexture?6:e.depth||1;let o=i*n*a*s;const u=e.mipmaps;if(u&&u.length>0){let e=0;for(let t=0;t>t))*(r.height||Math.max(1,n>>t))*a*s}}o+=e}else e.generateMipmaps&&(o*=1.333);return Math.round(o)}_getAttributeMemorySize(e){return e.isInterleavedBufferAttribute&&(e=e.data),e.array?e.array.byteLength:e.count&&e.itemSize?e.count*e.itemSize*4:0}}class By{constructor(e){this.cacheKey=e,this.usedTimes=0}}class Fy extends By{constructor(e,t,r){super(e),this.vertexProgram=t,this.fragmentProgram=r}}class Ly extends By{constructor(e,t){super(e),this.computeProgram=t,this.isComputePipeline=!0}}let Py=0;class Dy{constructor(e,t,r,s=null,i=null){this.id=Py++,this.code=e,this.stage=t,this.name=r,this.transforms=s,this.attributes=i,this.usedTimes=0}}class Uy extends xy{constructor(e,t,r){super(),this.backend=e,this.nodes=t,this.info=r,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 Dy(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 Dy(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 Dy(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}isReady(e){const t=this.get(e).pipeline;if(void 0===t)return!1;const r=this.backend.get(t);return void 0!==r.pipeline&&null!==r.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 Ly(r,t),this.caches.set(r,i),this.backend.createComputePipeline(i,s),this.info.memory.programs++),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 Fy(s,t,r),this.caches.set(s,n),e.pipeline=n,this.backend.createRenderPipeline(e,i),this.info.memory.programs++),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),this.info.memory.programs--}_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 Iy extends xy{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))}deleteForCompute(e){const t=this.nodes.getForCompute(e).bindings;for(const e of t)this.backend.deleteBindGroupData(e),this.delete(e)}deleteForRender(e){const t=e.getBindings();for(const e of t)this.backend.deleteBindGroupData(e),this.delete(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.isSampler)this.textures.updateSampler(t.texture);else if(t.isStorageBuffer){const e=t.attribute,r=e.isIndirectStorageBufferAttribute?Ny:vy;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(!1!==this.nodes.updateGroup(t)){if(t.isStorageBuffer){const e=t.attribute,i=e.isIndirectStorageBufferAttribute?Ny:vy,n=r.get(t);this.attributes.update(e,i),n.attribute!==e&&(n.attribute=e,s=!0)}if(t.isUniformBuffer){t.update()&&r.updateBinding(t)}else if(t.isSampledTexture){const o=t.update(),u=t.texture,l=this.textures.get(u);o&&(this.textures.updateTexture(u),t.generation!==l.generation&&(t.generation=l.generation,s=!0),l.bindGroups.add(e));if(void 0!==r.get(u).externalTexture||l.isDefaultTexture?i=!1:(n=10*n+u.id,a+=u.version),!0===u.isStorageTexture&&!0===u.mipmapsAutoUpdate){const e=this.get(u);!0===t.store?e.needsMipmap=!0:this.textures.needsMipmaps(u)&&!0===e.needsMipmap&&(this.backend.generateMipmaps(u),e.needsMipmap=!1)}}else if(t.isSampler){if(t.update()){const e=this.textures.updateSampler(t.texture);t.samplerKey!==e&&(t.samplerKey=e,s=!0)}}t.isBuffer&&t.updateRanges.length>0&&t.clearUpdateRanges()}}!0===s&&this.backend.updateBindings(e,t,i?n:0,a)}}function Oy(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 Vy(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 ky(e){return(e.transmission>0||e.transmissionNode&&e.transmissionNode.isNode)&&e.side===P&&!1===e.forceSinglePass}class Gy{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||r.transmissionNode&&r.transmissionNode.isNode||r.backdropNode&&r.backdropNode.isNode?(ky(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||r.transmissionNode&&r.transmissionNode.isNode||r.backdropNode&&r.backdropNode.isNode?(ky(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||Oy),this.transparentDoublePass.length>1&&this.transparentDoublePass.sort(t||Vy),this.transparent.length>1&&this.transparent.sort(t||Vy)}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 J,l.format=e.stencilBuffer?je:qe,l.type=e.stencilBuffer?Ye:S,l.image.width=o,l.image.height=u,l.image.depth=a.depth,l.renderTarget=e,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{this._destroyRenderTarget(e)},e.addEventListener("dispose",r.onDispose))}updateTexture(e,t={}){const r=this.get(e);if(!0===r.initialized&&r.version===e.version)return;const s=e.isRenderTargetTexture||e.isDepthTexture||e.isFramebufferTexture,i=this.backend;if(s&&!0===r.initialized&&i.destroyTexture(e),e.isFramebufferTexture){const t=this.renderer.getRenderTarget();e.type=t?t.texture.type:ke}const{width:n,height:a,depth:o}=this.getSize(e);if(t.width=n,t.height=a,t.depth=o,t.needsMipmaps=this.needsMipmaps(e),t.levels=t.needsMipmaps?this.getMipLevels(e,n,a):1,e.isCubeTexture&&e.mipmaps.length>0&&t.levels++,s||!0===e.isStorageTexture||!0===e.isExternalTexture)i.createTexture(e,t),r.generation=e.version;else if(e.version>0){const s=e.image;if(void 0===s)d("Renderer: Texture marked for update but image is undefined.");else if(!1===s.complete)d("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);const n=!0===e.isStorageTexture&&!1===e.mipmapsAutoUpdate;t.needsMipmaps&&0===e.mipmaps.length&&!n&&i.generateMipmaps(e),e.onUpdate&&e.onUpdate(e)}}else i.createDefaultTexture(e),r.isDefaultTexture=!0,r.generation=e.version;!0!==r.initialized&&(r.initialized=!0,r.generation=e.version,r.bindGroups=new Set,this.info.createTexture(e),e.isVideoTexture&&!0===p.enabled&&p.getTransfer(e.colorSpace)!==g&&d("WebGPURenderer: Video textures must use a color space with a sRGB transfer function, e.g. SRGBColorSpace."),r.onDispose=()=>{this._destroyTexture(e)},e.addEventListener("dispose",r.onDispose)),r.version=e.version}updateSampler(e){return this.backend.updateSampler(e)}getSize(e,t=Xy){let r=e.images?e.images[0]:e.image;return r?(void 0!==r.image&&(r=r.image),"undefined"!=typeof HTMLVideoElement&&r instanceof HTMLVideoElement?(t.width=r.videoWidth||1,t.height=r.videoHeight||1,t.depth=1):"undefined"!=typeof VideoFrame&&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.mipmaps.length>0?e.mipmaps.length:!0===e.isCompressedTexture?1:Math.floor(Math.log2(Math.max(t,r)))+1,s}needsMipmaps(e){return!0===e.generateMipmaps||e.mipmaps.length>0}_destroyRenderTarget(e){if(!0===this.has(e)){const t=this.get(e),r=t.textures,s=t.depthTexture;e.removeEventListener("dispose",t.onDispose);for(let e=0;e=2)for(let r=0;r{if(this._currentNode=t,!t.isVarNode||!t.isIntent(e)||!0===t.isAssign(e))if("setup"===s)t.build(e);else if("analyze"===s)t.build(e,this);else if("generate"===s){const r=e.getDataFromNode(t,"any").stages,s=r&&r[e.shaderStage];if(t.isVarNode&&s&&1===s.length&&s[0]&&s[0].isStackNode)return;t.build(e,"void")}},n=[...this.nodes];for(const e of n)i(e);this._currentNode=null;const a=this.nodes.filter(e=>-1===n.indexOf(e));for(const e of a)i(e);let o;return o=this.hasOutput(e)?this.outputNode.build(e,...t):super.build(e,...t),cn(r),e.removeActiveStack(this),o}}const Jy=nn(Zy).setParameterLength(0,1);class eb extends di{static get type(){return"StructTypeNode"}constructor(e,t=null){var r;super("struct"),this.membersLayout=(r=e,Object.entries(r).map(([e,t])=>"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=1,r=0;for(const s of this.membersLayout){const i=s.type,n=qs(i),a=js(i)/e;t=Math.max(t,a);const o=r%t%a;0!==o&&(r+=a-o),r+=n}return Math.ceil(r/t)*t}getMemberType(e,t){const r=this.membersLayout.find(e=>e.name===t);return r?r.type:"void"}generateNodeType(e){return e.getStructTypeFromNode(this,this.membersLayout,this.name).name}setup(e){e.getStructTypeFromNode(this,this.membersLayout,this.name),e.addInclude(this)}generate(e){return this.getNodeType(e)}}class tb extends di{static get type(){return"StructNode"}constructor(e,t){super("vec3"),this.structTypeNode=e,this.values=t,this.isStructNode=!0}generateNodeType(e){return this.structTypeNode.getNodeType(e)}getMemberType(e,t){return this.structTypeNode.getMemberType(e,t)}_getChildren(){const e=super._getChildren(),t=e.find(e=>e.childNode===this.structTypeNode);return e.splice(e.indexOf(t),1),e.push(t),e}generate(e){const t=e.getVarFromNode(this),r=t.type,s=e.getPropertyName(t);return e.addLineFlowCode(`${s} = ${e.generateStruct(r,this.structTypeNode.membersLayout,this.values)}`,this),t.name}}class rb extends di{static get type(){return"OutputStructNode"}constructor(...e){super(),this.members=e,this.isOutputStructNode=!0}generateNodeType(){return"OutputType"}generate(e){const t=e.getDataFromNode(this);if(void 0===t.membersLayout){const r=this.members,s=[];for(let t=0;tnew db(e,"uint","float"),pb={};class gb extends io{static get type(){return"BitcountNode"}constructor(e,t){super(e,t),this.isBitcountNode=!0}_resolveElementType(e,t,r){"int"===r?t.assign(cb(e,"uint")):t.assign(e)}_returnDataNode(e){switch(e){case"uint":return bn;case"int":return yn;case"uvec2":return vn;case"uvec3":return An;case"uvec4":return Mn;case"ivec2":return _n;case"ivec3":return Rn;case"ivec4":return Cn}}_createTrailingZerosBaseLayout(e,t){const r=this._returnDataNode(t);return dn(([e])=>{const s=bn(0);this._resolveElementType(e,s,t);const i=fn(s.bitAnd(Do(s))),n=hb(i).shiftRight(23).sub(127);return r(n)}).setLayout({name:e,type:t,inputs:[{name:"value",type:t}]})}_createLeadingZerosBaseLayout(e,t){const r=this._returnDataNode(t);return dn(([e])=>{pn(e.equal(bn(0)),()=>bn(32));const s=bn(0),i=bn(0);return this._resolveElementType(e,s,t),pn(s.shiftRight(16).equal(0),()=>{i.addAssign(16),s.shiftLeftAssign(16)}),pn(s.shiftRight(24).equal(0),()=>{i.addAssign(8),s.shiftLeftAssign(8)}),pn(s.shiftRight(28).equal(0),()=>{i.addAssign(4),s.shiftLeftAssign(4)}),pn(s.shiftRight(30).equal(0),()=>{i.addAssign(2),s.shiftLeftAssign(2)}),pn(s.shiftRight(31).equal(0),()=>{i.addAssign(1)}),r(i)}).setLayout({name:e,type:t,inputs:[{name:"value",type:t}]})}_createOneBitsBaseLayout(e,t){const r=this._returnDataNode(t);return dn(([e])=>{const s=bn(0);this._resolveElementType(e,s,t),s.assign(s.sub(s.shiftRight(bn(1)).bitAnd(bn(1431655765)))),s.assign(s.bitAnd(bn(858993459)).add(s.shiftRight(bn(2)).bitAnd(bn(858993459))));const i=s.add(s.shiftRight(bn(4))).bitAnd(bn(252645135)).mul(bn(16843009)).shiftRight(bn(24));return r(i)}).setLayout({name:e,type:t,inputs:[{name:"value",type:t}]})}_createMainLayout(e,t,r,s){const i=this._returnDataNode(t);return dn(([e])=>{if(1===r)return i(s(e));{const t=i(0),n=["x","y","z","w"];for(let i=0;id(r))()}}gb.COUNT_TRAILING_ZEROS="countTrailingZeros",gb.COUNT_LEADING_ZEROS="countLeadingZeros",gb.COUNT_ONE_BITS="countOneBits";const mb=on(gb,gb.COUNT_TRAILING_ZEROS).setParameterLength(1),fb=on(gb,gb.COUNT_LEADING_ZEROS).setParameterLength(1),yb=on(gb,gb.COUNT_ONE_BITS).setParameterLength(1),bb=dn(([e])=>{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)}),xb=(e,t)=>eu(Pa(4,e.mul(La(1,e))),t);class Tb extends pi{static get type(){return"PackFloatNode"}constructor(e,t){super(),this.vectorNode=t,this.encoding=e,this.isPackFloatNode=!0}generateNodeType(){return"uint"}generate(e){const t=this.vectorNode.getNodeType(e);return`${e.getFloatPackingMethod(this.encoding)}(${this.vectorNode.build(e,t)})`}}const _b=on(Tb,"snorm").setParameterLength(1),vb=on(Tb,"unorm").setParameterLength(1),Nb=on(Tb,"float16").setParameterLength(1);class Sb extends pi{static get type(){return"UnpackFloatNode"}constructor(e,t){super(),this.uintNode=t,this.encoding=e,this.isUnpackFloatNode=!0}generateNodeType(){return"vec2"}generate(e){const t=this.uintNode.getNodeType(e);return`${e.getFloatUnpackingMethod(this.encoding)}(${this.uintNode.build(e,t)})`}}const Rb=on(Sb,"snorm").setParameterLength(1),Ab=on(Sb,"unorm").setParameterLength(1),Eb=on(Sb,"float16").setParameterLength(1),wb=dn(([e])=>e.fract().sub(.5).abs()).setLayout({name:"tri",type:"float",inputs:[{name:"x",type:"float"}]}),Cb=dn(([e])=>Sn(wb(e.z.add(wb(e.y.mul(1)))),wb(e.z.add(wb(e.x.mul(1)))),wb(e.y.add(wb(e.x.mul(1)))))).setLayout({name:"tri3",type:"vec3",inputs:[{name:"p",type:"vec3"}]}),Mb=dn(([e,t,r])=>{const s=Sn(e).toVar(),i=fn(1.4).toVar(),n=fn(0).toVar(),a=Sn(s).toVar();return Sp({start:fn(0),end:fn(3),type:"float",condition:"<="},()=>{const e=Sn(Cb(a.mul(2))).toVar();s.addAssign(e.add(r.mul(fn(.1).mul(t)))),a.mulAssign(1.8),i.mulAssign(1.5),s.mulAssign(1.2);const o=fn(wb(s.z.add(wb(s.x.add(wb(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 Bb extends di{static get type(){return"FunctionOverloadingNode"}constructor(e=[],...t){super(),this.functionNodes=e,this.parametersNodes=t,this._candidateFn=null,this.global=!0}generateNodeType(e){return this.getCandidateFn(e).shaderNode.layout.type}getCandidateFn(e){const t=this.parametersNodes;let r=this._candidateFn;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._candidateFn=r=s}return r}setup(e){return this.getCandidateFn(e)(...this.parametersNodes)}}const Fb=nn(Bb),Lb=e=>(...t)=>Fb(e,...t),Pb=Na(0).setGroup(Ta).onRenderUpdate(e=>e.time),Db=Na(0).setGroup(Ta).onRenderUpdate(e=>e.deltaTime),Ub=Na(0,"uint").setGroup(Ta).onRenderUpdate(e=>e.frameId);const Ib=dn(([e,t,r=Tn(.5)])=>Zf(e.sub(r),t).add(r)),Ob=dn(([e,t,r=Tn(.5)])=>{const s=e.sub(r),i=s.dot(s),n=i.mul(i).mul(t);return e.add(s.mul(n))}),Vb=dn(({position:e=null,horizontal:t=!0,vertical:r=!1})=>{let s;null!==e?(s=Dd.toVar(),s[3][0]=e.x,s[3][1]=e.y,s[3][2]=e.z):s=Dd;const i=Td.mul(s);return Yi(t)&&(i[0][0]=Dd[0].length(),i[0][1]=0,i[0][2]=0),Yi(r)&&(i[1][0]=0,i[1][1]=Dd[1].length(),i[1][2]=0),i[2][0]=0,i[2][1]=0,i[2][2]=1,bd.mul(i).mul(Xd)}),kb=dn(([e=null])=>{const t=eg();return eg(Wp(e)).sub(t).lessThan(0).select(jl,e)}),Gb=dn(([e,t=Rl(),r=fn(0)])=>{const s=e.x,i=e.y,n=r.mod(s.mul(i)).floor(),a=n.mod(s),o=i.sub(n.add(1).div(s).ceil()),u=e.reciprocal(),l=Tn(a,o);return t.add(l).mul(u)}),zb=dn(([e,t=null,r=null,s=fn(1),i=Xd,n=nc])=>{let a=n.abs().normalize();a=a.div(a.dot(Sn(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=Pl(d,o).mul(a.x),g=Pl(c,u).mul(a.y),m=Pl(h,l).mul(a.z);return Fa(p,g,m)}),$b=new nt,Wb=new r,Hb=new r,qb=new r,jb=new a,Xb=new r(0,0,-1),Kb=new s,Qb=new r,Yb=new r,Zb=new s,Jb=new t,ex=new ae,tx=jl.flipX();ex.depthTexture=new J(1,1);let rx=!1;class sx extends Fl{static get type(){return"ReflectorNode"}constructor(e={}){super(e.defaultTexture||ex.texture,tx),this._reflectorBaseNode=e.reflector||new ix(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=new sx({defaultTexture:ex.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.offsetNode=this.offsetNode,e._reflectorBaseNode=this._reflectorBaseNode,e}dispose(){super.dispose(),this._reflectorBaseNode.dispose()}}class ix extends di{static get type(){return"ReflectorBaseNode"}constructor(e,t={}){super();const{target:r=new at,resolutionScale:s=1,generateMipmaps:i=!1,bounces:n=!0,depth:a=!1,samples:o=0}=t;this.textureNode=e,this.target=r,this.resolutionScale=s,void 0!==t.resolution&&(v('ReflectorNode: The "resolution" parameter has been renamed to "resolutionScale".'),this.resolutionScale=t.resolution),this.generateMipmaps=i,this.bounces=n,this.depth=a,this.samples=o,this.updateBeforeType=n?ti.RENDER:ti.FRAME,this.virtualCameras=new WeakMap,this.renderTargets=new Map,this.forceUpdate=!1,this.hasOutput=!1}_updateResolution(e,t){const r=this.resolutionScale;t.getDrawingBufferSize(Jb),e.setSize(Math.round(Jb.width*r),Math.round(Jb.height*r))}setup(e){return this._updateResolution(ex,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 ae(0,0,{type:_e,samples:this.samples}),!0===this.generateMipmaps&&(t.texture.minFilter=ot,t.texture.generateMipmaps=!0),!0===this.depth&&(t.depthTexture=new J),this.renderTargets.set(e,t)),t}updateBefore(e){if(!1===this.bounces&&rx)return!1;rx=!0;const{scene:t,camera:r,renderer:s,material:i}=e,{target:n}=this,a=this.getVirtualCamera(r),o=this.getRenderTarget(a);s.getDrawingBufferSize(Jb),this._updateResolution(o,s),Hb.setFromMatrixPosition(n.matrixWorld),qb.setFromMatrixPosition(r.matrixWorld),jb.extractRotation(n.matrixWorld),Wb.set(0,0,1),Wb.applyMatrix4(jb),Qb.subVectors(Hb,qb);let u=!1;if(!0===Qb.dot(Wb)>0&&!1===this.forceUpdate){if(!1===this.hasOutput)return void(rx=!1);u=!0}Qb.reflect(Wb).negate(),Qb.add(Hb),jb.extractRotation(r.matrixWorld),Xb.set(0,0,-1),Xb.applyMatrix4(jb),Xb.add(qb),Yb.subVectors(Hb,Xb),Yb.reflect(Wb).negate(),Yb.add(Hb),a.coordinateSystem=r.coordinateSystem,a.position.copy(Qb),a.up.set(0,1,0),a.up.applyMatrix4(jb),a.up.reflect(Wb),a.lookAt(Yb),a.near=r.near,a.far=r.far,a.updateMatrixWorld(),a.projectionMatrix.copy(r.projectionMatrix),$b.setFromNormalAndCoplanarPoint(Wb,Hb),$b.applyMatrix4(a.matrixWorldInverse),Kb.set($b.normal.x,$b.normal.y,$b.normal.z,$b.constant);const l=a.projectionMatrix;Zb.x=(Math.sign(Kb.x)+l.elements[8])/l.elements[0],Zb.y=(Math.sign(Kb.y)+l.elements[9])/l.elements[5],Zb.z=-1,Zb.w=(1+l.elements[10])/l.elements[14],Kb.multiplyScalar(1/Kb.dot(Zb));l.elements[2]=Kb.x,l.elements[6]=Kb.y,l.elements[10]=s.coordinateSystem===h?Kb.z-0:Kb.z+1-0,l.elements[14]=Kb.w,this.textureNode.value=o.texture,!0===this.depth&&(this.textureNode.getDepthNode().value=o.depthTexture),i.visible=!1;const d=s.getRenderTarget(),c=s.getMRT(),p=s.autoClear;s.setMRT(null),s.setRenderTarget(o),s.autoClear=!0;const g=t.name;t.name=(t.name||"Scene")+" [ Reflector ]",u?(s.clear(),this.hasOutput=!1):(s.render(t,a),this.hasOutput=!0),t.name=g,s.setMRT(c),s.setRenderTarget(d),s.autoClear=p,i.visible=!0,rx=!1,this.forceUpdate=!1}get resolution(){return v('ReflectorNode: The "resolution" property has been renamed to "resolutionScale".'),this.resolutionScale}set resolution(e){v('ReflectorNode: The "resolution" property has been renamed to "resolutionScale".'),this.resolutionScale=e}}const nx=new Se(-1,1,1,-1,0,1);class ax extends Ne{constructor(e=!1){super();const t=!1===e?[0,-1,0,1,2,1]:[0,2,0,0,2,0];this.setAttribute("position",new ut([-1,3,0,-1,-1,0,3,-1,0],3)),this.setAttribute("uv",new ut(t,2))}}const ox=new ax;class ux extends ue{constructor(e=null){super(ox,e),this.camera=nx,this.isQuadMesh=!0}async renderAsync(e){v('QuadMesh: "renderAsync()" has been deprecated. Use "render()" and "await renderer.init();" when creating the renderer.'),await e.init(),e.render(this,nx)}render(e){e.render(this,nx)}}const lx=new t;class dx extends Fl{static get type(){return"RTTNode"}constructor(e,t=null,r=null,s={type:_e}){const i=new ae(t,r,s);super(i.texture,Rl()),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 ux(new mg),this.updateBeforeType=ti.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(lx),s=Math.floor(r.width*t),i=Math.floor(r.height*t);s===this.renderTarget.width&&i===this.renderTarget.height||(this.renderTarget.setSize(s,i),this.textureNeedsUpdate=!0)}let t="RTT";this.node.name&&(t=this.node.name+" [ "+t+" ]"),this._quadMesh.material.fragmentNode=this._rttNode,this._quadMesh.name=t;const r=e.getRenderTarget();e.setRenderTarget(this.renderTarget),this._quadMesh.render(e),e.setRenderTarget(r)}clone(){const e=new Fl(this.value,this.uvNode,this.levelNode);return e.sampler=this.sampler,e.referenceNode=this,e}}const cx=(e,...t)=>new dx(en(e),...t),hx=dn(([e,t,r],s)=>{let i;s.renderer.coordinateSystem===h?(e=Tn(e.x,e.y.oneMinus()).mul(2).sub(1),i=wn(Sn(e,t),1)):i=wn(Sn(e.x,e.y.oneMinus(),t).mul(2).sub(1),1);const n=wn(r.mul(i));return n.xyz.div(n.w)}),px=dn(([e,t])=>{const r=t.mul(wn(e,1)),s=r.xy.div(r.w).mul(.5).add(.5).toVar();return Tn(s.x,s.y.oneMinus())}),gx=dn(([e,t,r])=>{const s=El(Dl(t)),i=_n(e.mul(s)).toVar(),n=Dl(t,i).toVar(),a=Dl(t,i.sub(_n(2,0))).toVar(),o=Dl(t,i.sub(_n(1,0))).toVar(),u=Dl(t,i.add(_n(1,0))).toVar(),l=Dl(t,i.add(_n(2,0))).toVar(),d=Dl(t,i.add(_n(0,2))).toVar(),c=Dl(t,i.add(_n(0,1))).toVar(),h=Dl(t,i.sub(_n(0,1))).toVar(),p=Dl(t,i.sub(_n(0,2))).toVar(),g=Fo(La(fn(2).mul(o).sub(a),n)).toVar(),m=Fo(La(fn(2).mul(u).sub(l),n)).toVar(),f=Fo(La(fn(2).mul(c).sub(d),n)).toVar(),y=Fo(La(fn(2).mul(h).sub(p),n)).toVar(),b=hx(e,n,r).toVar(),x=g.lessThan(m).select(b.sub(hx(e.sub(Tn(fn(1).div(s.x),0)),o,r)),b.negate().add(hx(e.add(Tn(fn(1).div(s.x),0)),u,r))),T=f.lessThan(y).select(b.sub(hx(e.add(Tn(0,fn(1).div(s.y))),c,r)),b.negate().add(hx(e.sub(Tn(0,fn(1).div(s.y))),h,r)));return So(Jo(x,T))}),mx=dn(([e])=>Ro(fn(52.9829189).mul(Ro(Zo(e,Tn(.06711056,.00583715)))))).setLayout({name:"interleavedGradientNoise",type:"float",inputs:[{name:"position",type:"vec2"}]}),fx=dn(([e,t,r])=>{const s=fn(2.399963229728653),i=To(fn(e).add(.5).div(fn(t))),n=fn(e).mul(s).add(r);return Tn(Eo(n),Ao(n)).mul(i)}).setLayout({name:"vogelDiskSample",type:"vec2",inputs:[{name:"sampleIndex",type:"int"},{name:"samplesCount",type:"int"},{name:"phi",type:"float"}]});class yx extends di{static get type(){return"SampleNode"}constructor(e,t=null){super(),this.callback=e,this.uvNode=t,this.isSampleNode=!0}setup(){return this.sample(Rl())}sample(e){return this.callback(e)}}class bx extends di{static get type(){return"EventNode"}constructor(e,t){super("void"),this.eventType=e,this.callback=t,e===bx.OBJECT?this.updateType=ti.OBJECT:e===bx.MATERIAL?this.updateType=ti.RENDER:e===bx.BEFORE_OBJECT?this.updateBeforeType=ti.OBJECT:e===bx.BEFORE_MATERIAL&&(this.updateBeforeType=ti.RENDER)}update(e){this.callback(e)}updateBefore(e){this.callback(e)}}bx.OBJECT="object",bx.MATERIAL="material",bx.BEFORE_OBJECT="beforeObject",bx.BEFORE_MATERIAL="beforeMaterial";const xx=(e,t)=>new bx(e,t).toStack();class Tx extends j{constructor(e,t,r=Float32Array){super(ArrayBuffer.isView(e)?e:new r(e*t),t),this.isStorageInstancedBufferAttribute=!0}}class _x extends Ce{constructor(e,t,r=Float32Array){super(ArrayBuffer.isView(e)?e:new r(e*t),t),this.isStorageBufferAttribute=!0}}class vx extends di{static get type(){return"PointUVNode"}constructor(){super("vec2"),this.isPointUVNode=!0}generate(){return"vec2( gl_PointCoord.x, 1.0 - gl_PointCoord.y )"}}const Nx=an(vx),Sx=new D,Rx=new a,Ax=Na(0).setGroup(Ta).onRenderUpdate(({scene:e})=>e.backgroundBlurriness),Ex=Na(1).setGroup(Ta).onRenderUpdate(({scene:e})=>e.backgroundIntensity),wx=Na(new a).setGroup(Ta).onRenderUpdate(({scene:e})=>{const t=e.background;return null!==t&&t.isTexture&&t.mapping!==lt?(Sx.copy(e.backgroundRotation),Sx.x*=-1,Sx.y*=-1,Sx.z*=-1,Rx.makeRotationFromEuler(Sx)):Rx.identity(),Rx});class Cx extends Fl{static get type(){return"StorageTextureNode"}constructor(e,t,r=null){super(e,t),this.storeNode=r,this.mipLevel=0,this.isStorageTextureNode=!0,this.access=si.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}setMipLevel(e){return this.mipLevel=e,this}generate(e,t){let r;return r=null!==this.storeNode?this.generateStore(e):super.generate(e,t),r}generateSnippet(e,t,r,s,i,n,a,o,u){const l=this.value;return e.generateStorageTextureLoad(l,t,r,s,n,u)}toReadWrite(){return this.setAccess(si.READ_WRITE)}toReadOnly(){return this.setAccess(si.READ_ONLY)}toWriteOnly(){return this.setAccess(si.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.mipLevel=this.mipLevel,e.access=this.access,e}}const Mx=nn(Cx).setParameterLength(1,3),Bx=dn(({texture:e,uv:t})=>{const r=1e-4,s=Sn().toVar();return pn(t.x.lessThan(r),()=>{s.assign(Sn(1,0,0))}).ElseIf(t.y.lessThan(r),()=>{s.assign(Sn(0,1,0))}).ElseIf(t.z.lessThan(r),()=>{s.assign(Sn(0,0,1))}).ElseIf(t.x.greaterThan(.9999),()=>{s.assign(Sn(-1,0,0))}).ElseIf(t.y.greaterThan(.9999),()=>{s.assign(Sn(0,-1,0))}).ElseIf(t.z.greaterThan(.9999),()=>{s.assign(Sn(0,0,-1))}).Else(()=>{const r=.01,i=e.sample(t.add(Sn(-.01,0,0))).r.sub(e.sample(t.add(Sn(r,0,0))).r),n=e.sample(t.add(Sn(0,-.01,0))).r.sub(e.sample(t.add(Sn(0,r,0))).r),a=e.sample(t.add(Sn(0,0,-.01))).r.sub(e.sample(t.add(Sn(0,0,r))).r);s.assign(Sn(i,n,a))}),s.normalize()});class Fx extends Fl{static get type(){return"Texture3DNode"}constructor(e,t=null,r=null){super(e,t,r),this.isTexture3DNode=!0}getInputType(){return"texture3D"}getDefaultUV(){return Sn(.5,.5,.5)}setUpdateMatrix(){}generateUV(e,t){return t.build(e,!0===this.sampler?"vec3":"ivec3")}generateOffset(e,t){return t.build(e,"ivec3")}normal(e){return Bx({texture:this,uv:e})}}const Lx=nn(Fx).setParameterLength(1,3);class Px extends Bc{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 Dx=new WeakMap;class Ux extends pi{static get type(){return"VelocityNode"}constructor(){super("vec2"),this.projectionMatrix=null,this.updateType=ti.OBJECT,this.updateAfterType=ti.OBJECT,this.previousModelWorldMatrix=Na(new a),this.previousProjectionMatrix=Na(new a).setGroup(Ta),this.previousCameraViewMatrix=Na(new a)}setProjectionMatrix(e){this.projectionMatrix=e}update({frameId:e,camera:t,object:r}){const s=Ox(r);this.previousModelWorldMatrix.value.copy(s);const i=Ix(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}){Ox(e).copy(e.matrixWorld)}setup(){const e=null===this.projectionMatrix?bd:Na(this.projectionMatrix),t=this.previousCameraViewMatrix.mul(this.previousModelWorldMatrix),r=e.mul(zd).mul(Xd),s=this.previousProjectionMatrix.mul(t).mul(Kd),i=r.xy.div(r.w),n=s.xy.div(s.w);return La(i,n)}}function Ix(e){let t=Dx.get(e);return void 0===t&&(t={},Dx.set(e,t)),t}function Ox(e,t=0){const r=Ix(e);let s=r[t];return void 0===s&&(r[t]=s=new a,r[t].copy(e.matrixWorld)),s}const Vx=an(Ux),kx=dn(([e])=>Wx(e.rgb)),Gx=dn(([e,t=fn(1)])=>t.mix(Wx(e.rgb),e.rgb)),zx=dn(([e,t=fn(1)])=>{const r=Fa(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 ou(e.rgb,s,i)}),$x=dn(([e,t=fn(1)])=>{const r=Sn(.57735,.57735,.57735),s=t.cos();return Sn(e.rgb.mul(s).add(r.cross(e.rgb).mul(t.sin()).add(r.mul(Zo(r,e.rgb).mul(s.oneMinus())))))}),Wx=(e,t=Sn(p.getLuminanceCoefficients(new r)))=>Zo(e,t),Hx=dn(([e,t=Sn(1),s=Sn(0),i=Sn(1),n=fn(1),a=Sn(p.getLuminanceCoefficients(new r,Ae))])=>{const o=e.rgb.dot(Sn(a)),u=jo(e.rgb.mul(t).add(s),0).toVar(),l=u.pow(i).toVar();return pn(u.r.greaterThan(0),()=>{u.r.assign(l.r)}),pn(u.g.greaterThan(0),()=>{u.g.assign(l.g)}),pn(u.b.greaterThan(0),()=>{u.b.assign(l.b)}),u.assign(o.add(u.sub(o).mul(n))),wn(u.rgb,e.a)}),qx=dn(([e,t])=>e.mul(t).floor().div(t));let jx=null;class Xx extends Ip{static get type(){return"ViewportSharedTextureNode"}constructor(e=jl,t=null){null===jx&&(jx=new Y),super(e,t,jx)}getTextureForReference(){return jx}updateReference(){return this}}const Kx=nn(Xx).setParameterLength(0,2),Qx=new t;class Yx extends Fl{static get type(){return"PassTextureNode"}constructor(e,t){super(t),this.passNode=e,this.isPassTextureNode=!0,this.setUpdateMatrix(!1)}setup(e){return e.getNodeProperties(this).passNode=this.passNode,super.setup(e)}clone(){return new this.constructor(this.passNode,this.value)}}class Zx extends Yx{static get type(){return"PassMultipleTextureNode"}constructor(e,t,r=!1){super(e,null),this.textureName=t,this.previousTexture=r,this.isPassMultipleTextureNode=!0}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.offsetNode=this.offsetNode,e}}class Jx extends pi{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 J;i.isRenderTargetTexture=!0,i.name="depth";const n=new ae(this._width*this._pixelRatio,this._height*this._pixelRatio,{type:_e,...s});n.texture.name="output",n.depthTexture=i,this.renderTarget=n,this.overrideMaterial=null,this.transparent=!0,this.opaque=!0,this.contextNode=null,this._contextNodeCache=null,this._textures={output:n.texture,depth:i},this._textureNodes={},this._linearDepthNodes={},this._viewZNodes={},this._previousTextures={},this._previousTextureNodes={},this._cameraNear=Na(0),this._cameraFar=Na(0),this._mrt=null,this._layers=null,this._resolutionScale=1,this._viewport=null,this._scissor=null,this.isPassNode=!0,this.updateBeforeType=ti.FRAME,this.global=!0}setResolutionScale(e){return this._resolutionScale=e,this}getResolutionScale(){return this._resolutionScale}setResolution(e){return d("PassNode: .setResolution() is deprecated. Use .setResolutionScale() instead."),this.setResolutionScale(e)}getResolution(){return d("PassNode: .getResolution() is deprecated. Use .getResolutionScale() instead."),this.getResolutionScale()}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=new Zx(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=new Zx(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=Qp(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=qp(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.getOutputBufferType(),this.scope===Jx.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),Qx.set(n.width,n.height)):(s=this.camera,i=t.getPixelRatio(),t.getSize(Qx)),this._pixelRatio=i,this.setSize(Qx.width,Qx.height);const a=t.getRenderTarget(),o=t.getMRT(),u=t.autoClear,l=t.transparent,d=t.opaque,c=s.layers.mask,h=t.contextNode,p=r.overrideMaterial;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);null!==this.overrideMaterial&&(r.overrideMaterial=this.overrideMaterial),t.setRenderTarget(this.renderTarget),t.setMRT(this._mrt),t.autoClear=!0,t.transparent=this.transparent,t.opaque=this.opaque,null!==this.contextNode&&(null!==this._contextNodeCache&&this._contextNodeCache.version===this.version||(this._contextNodeCache={version:this.version,context:vu({...t.contextNode.getFlowContextData(),...this.contextNode.getFlowContextData()})}),t.contextNode=this._contextNodeCache.context);const g=r.name;r.name=this.name?this.name:r.name,t.render(r,s),r.name=g,r.overrideMaterial=p,t.setRenderTarget(a),t.setMRT(o),t.autoClear=u,t.transparent=l,t.opaque=d,t.contextNode=h,s.layers.mask=c}setSize(e,t){this._width=e,this._height=t;const r=Math.floor(this._width*this._pixelRatio*this._resolutionScale),s=Math.floor(this._height*this._pixelRatio*this._resolutionScale);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._resolutionScale).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._resolutionScale).floor())}setPixelRatio(e){this._pixelRatio=e,this.setSize(this._width,this._height)}dispose(){this.renderTarget.dispose()}}Jx.COLOR="color",Jx.DEPTH="depth";class eT extends Jx{static get type(){return"ToonOutlinePassNode"}constructor(e,t,r,s,i){super(Jx.COLOR,e,t),this.colorNode=r,this.thicknessNode=s,this.alphaNode=i,this._materialCache=new WeakMap,this.name="Outline Pass"}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 mg;e.isMeshToonOutlineMaterial=!0,e.name="Toon_Outline",e.side=L;const t=nc.negate(),r=bd.mul(zd),s=fn(1),i=r.mul(wn(Xd,1)),n=r.mul(wn(Xd.add(t),1)),a=So(i.sub(n));return e.vertexNode=i.add(a.mul(this.thicknessNode).mul(i.w).mul(s)),e.colorNode=wn(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 tT=dn(([e,t])=>e.mul(t).clamp()).setLayout({name:"linearToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),rT=dn(([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"}]}),sT=dn(([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"}]}),iT=dn(([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)}),nT=dn(([e,t])=>{const r=Ln(.59719,.35458,.04823,.076,.90834,.01566,.0284,.13383,.83777),s=Ln(1.60475,-.53108,-.07367,-.10208,1.10813,-.00605,-.00327,-.07276,1.07602);return e=e.mul(t).div(.6),e=r.mul(e),e=iT(e),(e=s.mul(e)).clamp()}).setLayout({name:"acesFilmicToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),aT=Ln(Sn(1.6605,-.1246,-.0182),Sn(-.5876,1.1329,-.1006),Sn(-.0728,-.0083,1.1187)),oT=Ln(Sn(.6274,.0691,.0164),Sn(.3293,.9195,.088),Sn(.0433,.0113,.8956)),uT=dn(([e])=>{const t=Sn(e).toVar(),r=Sn(t.mul(t)).toVar(),s=Sn(r.mul(r)).toVar();return fn(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))))}),lT=dn(([e,t])=>{const r=Sn(e).toVar(),s=Ln(Sn(.856627153315983,.137318972929847,.11189821299995),Sn(.0951212405381588,.761241990602591,.0767994186031903),Sn(.0482516061458583,.101439036467562,.811302368396859)),i=Ln(Sn(1.1271005818144368,-.1413297634984383,-.14132976349843826),Sn(-.11060664309660323,1.157823702216272,-.11060664309660294),Sn(-.016493938717834573,-.016493938717834257,1.2519364065950405)),n=fn(-12.47393),a=fn(4.026069);return r.mulAssign(t),r.assign(oT.mul(r)),r.assign(s.mul(r)),r.assign(jo(r,1e-10)),r.assign(xo(r)),r.assign(r.sub(n).div(a.sub(n))),r.assign(uu(r,0,1)),r.assign(uT(r)),r.assign(i.mul(r)),r.assign(eu(jo(Sn(0),r),Sn(2.2))),r.assign(aT.mul(r)),r.assign(uu(r,0,1)),r}).setLayout({name:"agxToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),dT=dn(([e,t])=>{const r=fn(.76),s=fn(.15);e=e.mul(t);const i=qo(e.r,qo(e.g,e.b)),n=Tu(i.lessThan(.08),i.sub(Pa(6.25,i.mul(i))),.04);e.subAssign(n);const a=jo(e.r,jo(e.g,e.b));pn(a.lessThan(r),()=>e);const o=La(1,r),u=La(1,o.mul(o).div(a.add(o.sub(r))));e.mulAssign(u.div(a));const l=La(1,Da(1,s.mul(a.sub(u)).add(1)));return ou(e,Sn(u),l)}).setLayout({name:"neutralToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]});class cT extends di{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 hT=nn(cT).setParameterLength(1,3);class pT extends cT{static get type(){return"FunctionNode"}constructor(e="",t=[],r=""){super(e,t,r)}generateNodeType(e){return this.getNodeFunction(e).type}getMemberType(e,t){const r=this.getNodeType(e);return e.getStructTypeNode(r).getMemberType(e,t)}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 gT=(e,t=[],r="")=>{for(let e=0;es.call(...e);return i.functionNode=s,i};function mT(e){let t;const r=e.context.getViewZ;return void 0!==r&&(t=r(this)),(t||Zd.z).negate()}const fT=dn(([e,t],r)=>{const s=mT(r);return cu(e,t,s)}),yT=dn(([e],t)=>{const r=mT(t);return e.mul(e,r,r).negate().exp().oneMinus()}),bT=dn(([e,t],r)=>{const s=mT(r),i=t.sub(Qd.y).max(0).toConst().mul(s).toConst();return e.mul(e,i,i).negate().exp().oneMinus()}),xT=dn(([e,t])=>wn(t.toFloat().mix(aa.rgb,e.toVec3()),aa.a));let TT=null,_T=null;class vT extends di{static get type(){return"RangeNode"}constructor(e=fn(),t=fn()){super(),this.minNode=e,this.maxNode=t}getVectorLength(e){const t=this.getConstNode(this.minNode),r=this.getConstNode(this.maxNode),s=e.getTypeLength(Xs(t.value)),i=e.getTypeLength(Xs(r.value));return s>i?s:i}generateNodeType(e){return e.object.count>1?e.getTypeFromLength(this.getVectorLength(e)):"float"}getConstNode(e){let t=null;if(e.traverse(e=>{!0===e.isConstNode&&(t=e)}),null===t)throw new Ml('THREE.TSL: No "ConstNode" found in node graph.',this.stackTrace);return t}setup(e){const t=e.object;let r=null;if(t.count>1){const i=this.getConstNode(this.minNode),n=this.getConstNode(this.maxNode),a=i.value,o=n.value,u=e.getTypeLength(Xs(a)),d=e.getTypeLength(Xs(o));TT=TT||new s,_T=_T||new s,TT.setScalar(0),_T.setScalar(0),1===u?TT.setScalar(a):a.isColor?TT.set(a.r,a.g,a.b,1):TT.set(a.x,a.y,a.z||0,a.w||0),1===d?_T.setScalar(o):o.isColor?_T.set(o.r,o.g,o.b,1):_T.set(o.x,o.y,o.z||0,o.w||0);const c=4,h=c*t.count,p=new Float32Array(h);for(let e=0;enew ST(e,t),AT=RT("numWorkgroups","uvec3"),ET=RT("workgroupId","uvec3"),wT=RT("globalId","uvec3"),CT=RT("localId","uvec3"),MT=RT("subgroupSize","uint");class BT extends di{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)}}const FT=nn(BT);class LT extends ci{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 PT extends di{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 d('TSL: "label()" has been deprecated. Use "setName()" instead.',new Us),this.setName(e)}setScope(e){return this.scope=e,this}getElementType(){return this.elementType}getInputType(){return`${this.scope}Array`}element(e){return new LT(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 DT extends di{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)}generateNodeType(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=gl(l,i).toConst()),t.constNode.build(e);e.addLineFlowCode(l,this)}}DT.ATOMIC_LOAD="atomicLoad",DT.ATOMIC_STORE="atomicStore",DT.ATOMIC_ADD="atomicAdd",DT.ATOMIC_SUB="atomicSub",DT.ATOMIC_MAX="atomicMax",DT.ATOMIC_MIN="atomicMin",DT.ATOMIC_AND="atomicAnd",DT.ATOMIC_OR="atomicOr",DT.ATOMIC_XOR="atomicXor";const UT=nn(DT),IT=(e,t,r)=>UT(e,t,r).toStack();class OT extends pi{static get type(){return"SubgroupFunctionNode"}constructor(e,t=null,r=null){super(),this.method=e,this.aNode=t,this.bNode=r}getInputType(e){const t=this.aNode?this.aNode.getNodeType(e):null,r=this.bNode?this.bNode.getNodeType(e):null;return(e.isMatrix(t)?0:e.getTypeLength(t))>(e.isMatrix(r)?0:e.getTypeLength(r))?t:r}generateNodeType(e){const t=this.method;return t===OT.SUBGROUP_ELECT?"bool":t===OT.SUBGROUP_BALLOT?"uvec4":this.getInputType(e)}generate(e,t){const r=this.method,s=this.getNodeType(e),i=this.getInputType(e),n=this.aNode,a=this.bNode,o=[];if(r===OT.SUBGROUP_BROADCAST||r===OT.SUBGROUP_SHUFFLE||r===OT.QUAD_BROADCAST){const t=a.getNodeType(e);o.push(n.build(e,s),a.build(e,"float"===t?"int":s))}else r===OT.SUBGROUP_SHUFFLE_XOR||r===OT.SUBGROUP_SHUFFLE_DOWN||r===OT.SUBGROUP_SHUFFLE_UP?o.push(n.build(e,s),a.build(e,"uint")):(null!==n&&o.push(n.build(e,i)),null!==a&&o.push(a.build(e,i)));const u=0===o.length?"()":`( ${o.join(", ")} )`;return e.format(`${e.getMethod(r,s)}${u}`,s,t)}serialize(e){super.serialize(e),e.method=this.method}deserialize(e){super.deserialize(e),this.method=e.method}}OT.SUBGROUP_ELECT="subgroupElect",OT.SUBGROUP_BALLOT="subgroupBallot",OT.SUBGROUP_ADD="subgroupAdd",OT.SUBGROUP_INCLUSIVE_ADD="subgroupInclusiveAdd",OT.SUBGROUP_EXCLUSIVE_AND="subgroupExclusiveAdd",OT.SUBGROUP_MUL="subgroupMul",OT.SUBGROUP_INCLUSIVE_MUL="subgroupInclusiveMul",OT.SUBGROUP_EXCLUSIVE_MUL="subgroupExclusiveMul",OT.SUBGROUP_AND="subgroupAnd",OT.SUBGROUP_OR="subgroupOr",OT.SUBGROUP_XOR="subgroupXor",OT.SUBGROUP_MIN="subgroupMin",OT.SUBGROUP_MAX="subgroupMax",OT.SUBGROUP_ALL="subgroupAll",OT.SUBGROUP_ANY="subgroupAny",OT.SUBGROUP_BROADCAST_FIRST="subgroupBroadcastFirst",OT.QUAD_SWAP_X="quadSwapX",OT.QUAD_SWAP_Y="quadSwapY",OT.QUAD_SWAP_DIAGONAL="quadSwapDiagonal",OT.SUBGROUP_BROADCAST="subgroupBroadcast",OT.SUBGROUP_SHUFFLE="subgroupShuffle",OT.SUBGROUP_SHUFFLE_XOR="subgroupShuffleXor",OT.SUBGROUP_SHUFFLE_UP="subgroupShuffleUp",OT.SUBGROUP_SHUFFLE_DOWN="subgroupShuffleDown",OT.QUAD_BROADCAST="quadBroadcast";const VT=on(OT,OT.SUBGROUP_ELECT).setParameterLength(0),kT=on(OT,OT.SUBGROUP_BALLOT).setParameterLength(1),GT=on(OT,OT.SUBGROUP_ADD).setParameterLength(1),zT=on(OT,OT.SUBGROUP_INCLUSIVE_ADD).setParameterLength(1),$T=on(OT,OT.SUBGROUP_EXCLUSIVE_AND).setParameterLength(1),WT=on(OT,OT.SUBGROUP_MUL).setParameterLength(1),HT=on(OT,OT.SUBGROUP_INCLUSIVE_MUL).setParameterLength(1),qT=on(OT,OT.SUBGROUP_EXCLUSIVE_MUL).setParameterLength(1),jT=on(OT,OT.SUBGROUP_AND).setParameterLength(1),XT=on(OT,OT.SUBGROUP_OR).setParameterLength(1),KT=on(OT,OT.SUBGROUP_XOR).setParameterLength(1),QT=on(OT,OT.SUBGROUP_MIN).setParameterLength(1),YT=on(OT,OT.SUBGROUP_MAX).setParameterLength(1),ZT=on(OT,OT.SUBGROUP_ALL).setParameterLength(0),JT=on(OT,OT.SUBGROUP_ANY).setParameterLength(0),e_=on(OT,OT.SUBGROUP_BROADCAST_FIRST).setParameterLength(2),t_=on(OT,OT.QUAD_SWAP_X).setParameterLength(1),r_=on(OT,OT.QUAD_SWAP_Y).setParameterLength(1),s_=on(OT,OT.QUAD_SWAP_DIAGONAL).setParameterLength(1),i_=on(OT,OT.SUBGROUP_BROADCAST).setParameterLength(2),n_=on(OT,OT.SUBGROUP_SHUFFLE).setParameterLength(2),a_=on(OT,OT.SUBGROUP_SHUFFLE_XOR).setParameterLength(2),o_=on(OT,OT.SUBGROUP_SHUFFLE_UP).setParameterLength(2),u_=on(OT,OT.SUBGROUP_SHUFFLE_DOWN).setParameterLength(2),l_=on(OT,OT.QUAD_BROADCAST).setParameterLength(1);let d_;function c_(e){d_=d_||new WeakMap;let t=d_.get(e);return void 0===t&&d_.set(e,t={}),t}function h_(e){const t=c_(e);return t.shadowMatrix||(t.shadowMatrix=Na("mat4").setGroup(Ta).onRenderUpdate(t=>(!0===e.castShadow&&!1!==t.renderer.shadowMap.enabled||(e.shadow.camera.coordinateSystem!==t.camera.coordinateSystem&&(e.shadow.camera.coordinateSystem=t.camera.coordinateSystem,e.shadow.camera.updateProjectionMatrix()),e.shadow.updateMatrices(e)),e.shadow.matrix)))}function p_(e,t=Qd){const r=h_(e).mul(t);return r.xyz.div(r.w)}function g_(e){const t=c_(e);return t.position||(t.position=Na(new r).setGroup(Ta).onRenderUpdate((t,r)=>r.value.setFromMatrixPosition(e.matrixWorld)))}function m_(e){const t=c_(e);return t.targetPosition||(t.targetPosition=Na(new r).setGroup(Ta).onRenderUpdate((t,r)=>r.value.setFromMatrixPosition(e.target.matrixWorld)))}function f_(e){const t=c_(e);return t.viewPosition||(t.viewPosition=Na(new r).setGroup(Ta).onRenderUpdate(({camera:t},s)=>{s.value=s.value||new r,s.value.setFromMatrixPosition(e.matrixWorld),s.value.applyMatrix4(t.matrixWorldInverse)}))}const y_=e=>Td.transformDirection(g_(e).sub(m_(e))),b_=(e,t)=>{for(const r of t)if(r.isAnalyticLightNode&&r.light.id===e)return r;return null},x_=new WeakMap,T_=[];class __ extends di{static get type(){return"LightsNode"}constructor(){super("vec3"),this.totalDiffuseNode=On("vec3","totalDiffuse"),this.totalSpecularNode=On("vec3","totalSpecular"),this.outgoingLightNode=On("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(en(e));else{let s=null;if(null!==r&&(s=b_(e.id,r)),null===s){const r=i.getLightNodeClass(e.constructor);if(null===r){d(`LightsNode.setupNodeLights: Light node not found for ${e.constructor.name}`);continue}let s=null;x_.has(e)?s=x_.get(e):(s=new r(e),x_.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=Sn(null!==l?l.mix(g,u):u)),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 v_ extends di{static get type(){return"ShadowBaseNode"}constructor(e){super(),this.light=e,this.updateBeforeType=ti.RENDER,this.isShadowBaseNode=!0}setupShadowPosition({context:e,material:t}){N_.assign(t.receivedShadowPositionNode||e.shadowPositionWorld||Qd)}}const N_=On("vec3","shadowPositionWorld");function S_(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 R_(e,t){return t=S_(e,t),e.setMRT(null),e.setRenderObjectFunction(null),e.setClearColor(0,1),e.autoClear=!0,t}function A_(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 E_(e,t={}){return t.background=e.background,t.backgroundNode=e.backgroundNode,t.overrideMaterial=e.overrideMaterial,t}function w_(e,t){return t=E_(e,t),e.background=null,e.backgroundNode=null,e.overrideMaterial=null,t}function C_(e,t){e.background=t.background,e.backgroundNode=t.backgroundNode,e.overrideMaterial=t.overrideMaterial}function M_(e,t,r){return r=w_(t,r=R_(e,r))}function B_(e,t,r){A_(e,r),C_(t,r)}var F_=Object.freeze({__proto__:null,resetRendererAndSceneState:M_,resetRendererState:R_,resetSceneState:w_,restoreRendererAndSceneState:B_,restoreRendererState:A_,restoreSceneState:C_,saveRendererAndSceneState:function(e,t,r={}){return r=E_(t,r=S_(e,r))},saveRendererState:S_,saveSceneState:E_});const L_=new WeakMap,P_=dn(({depthTexture:e,shadowCoord:t,depthLayer:r})=>{let s=Pl(e,t.xy).setName("t_basic");return e.isArrayTexture&&(s=s.depth(r)),s.compare(t.z)}),D_=dn(({depthTexture:e,shadowCoord:t,shadow:r,depthLayer:s})=>{const i=(t,r)=>{let i=Pl(e,t);return e.isArrayTexture&&(i=i.depth(s)),i.compare(r)},n=Fc("mapSize","vec2",r).setGroup(Ta),a=Fc("radius","float",r).setGroup(Ta),o=Tn(1).div(n),u=a.mul(o.x),l=mx(Kl.xy).mul(6.28318530718);return Fa(i(t.xy.add(fx(0,5,l).mul(u)),t.z),i(t.xy.add(fx(1,5,l).mul(u)),t.z),i(t.xy.add(fx(2,5,l).mul(u)),t.z),i(t.xy.add(fx(3,5,l).mul(u)),t.z),i(t.xy.add(fx(4,5,l).mul(u)),t.z)).mul(.2)}),U_=dn(({depthTexture:e,shadowCoord:t,shadow:r,depthLayer:s})=>{const i=(t,r)=>{let i=Pl(e,t);return e.isArrayTexture&&(i=i.depth(s)),i.compare(r)},n=Fc("mapSize","vec2",r).setGroup(Ta),a=Tn(1).div(n),o=a.x,u=a.y,l=t.xy,d=Ro(l.mul(n).add(.5));return l.subAssign(d.mul(a)),Fa(i(l,t.z),i(l.add(Tn(o,0)),t.z),i(l.add(Tn(0,u)),t.z),i(l.add(a),t.z),ou(i(l.add(Tn(o.negate(),0)),t.z),i(l.add(Tn(o.mul(2),0)),t.z),d.x),ou(i(l.add(Tn(o.negate(),u)),t.z),i(l.add(Tn(o.mul(2),u)),t.z),d.x),ou(i(l.add(Tn(0,u.negate())),t.z),i(l.add(Tn(0,u.mul(2))),t.z),d.y),ou(i(l.add(Tn(o,u.negate())),t.z),i(l.add(Tn(o,u.mul(2))),t.z),d.y),ou(ou(i(l.add(Tn(o.negate(),u.negate())),t.z),i(l.add(Tn(o.mul(2),u.negate())),t.z),d.x),ou(i(l.add(Tn(o.negate(),u.mul(2))),t.z),i(l.add(Tn(o.mul(2),u.mul(2))),t.z),d.x),d.y)).mul(1/9)}),I_=dn(({depthTexture:e,shadowCoord:t,depthLayer:r},s)=>{let i=Pl(e).sample(t.xy);e.isArrayTexture&&(i=i.depth(r)),i=i.rg;const n=i.x,a=jo(1e-7,i.y.mul(i.y)),o=s.renderer.reversedDepthBuffer?Xo(n,t.z):Xo(t.z,n),u=fn(1).toVar();return pn(o.notEqual(1),()=>{const e=t.z.sub(n);let r=a.div(a.add(e.mul(e)));r=uu(La(r,.3).div(.65)),u.assign(jo(o,r))}),u}),O_=e=>{let t=L_.get(e);return void 0===t&&(t=new mg,t.colorNode=wn(0,0,0,1),t.isShadowPassMaterial=!0,t.name="ShadowMaterial",t.blending=se,t.fog=!1,L_.set(e,t)),t},V_=e=>{const t=L_.get(e);void 0!==t&&(t.dispose(),L_.delete(e))},k_=new gy,G_=[],z_=(e,t,r,s)=>{G_[0]=e,G_[1]=t;let i=k_.get(G_);return void 0!==i&&i.shadowType===r&&i.useVelocity===s||(i=(i,n,a,o,u,l,...d)=>{(!0===i.castShadow||i.receiveShadow&&r===ht)&&(s&&(Qs(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,k_.set(G_,i)),G_[0]=null,G_[1]=null,i},$_=dn(({samples:e,radius:t,size:r,shadowPass:s,depthLayer:i})=>{const n=fn(0).toVar("meanVertical"),a=fn(0).toVar("squareMeanVertical"),o=e.lessThanEqual(fn(1)).select(fn(0),fn(2).div(e.sub(1))),u=e.lessThanEqual(fn(1)).select(fn(0),fn(-1));Sp({start:yn(0),end:yn(e),type:"int",condition:"<"},({i:e})=>{const l=u.add(fn(e).mul(o));let d=s.sample(Fa(Kl.xy,Tn(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=To(a.sub(n.mul(n)).max(0));return Tn(n,l)}),W_=dn(({samples:e,radius:t,size:r,shadowPass:s,depthLayer:i})=>{const n=fn(0).toVar("meanHorizontal"),a=fn(0).toVar("squareMeanHorizontal"),o=e.lessThanEqual(fn(1)).select(fn(0),fn(2).div(e.sub(1))),u=e.lessThanEqual(fn(1)).select(fn(0),fn(-1));Sp({start:yn(0),end:yn(e),type:"int",condition:"<"},({i:e})=>{const l=u.add(fn(e).mul(o));let d=s.sample(Fa(Kl.xy,Tn(l,0).mul(t)).div(r));s.value.isArrayTexture&&(d=d.depth(i)),n.addAssign(d.x),a.addAssign(Fa(d.y.mul(d.y),d.x.mul(d.x)))}),n.divAssign(e),a.divAssign(e);const l=To(a.sub(n.mul(n)).max(0));return Tn(n,l)}),H_=[P_,D_,U_,I_];let q_;const j_=new ux;class X_ extends v_{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._currentShadowType=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,fn(1))}setupShadowCoord(e,t){const{shadow:r}=this,{renderer:s}=e,i=r.biasNode||Fc("bias","float",r).setGroup(Ta);let n,a=t;if(r.camera.isOrthographicCamera||!0!==s.logarithmicDepthBuffer)a=a.xyz.div(a.w),n=a.z;else{const e=a.w;a=a.xy.div(e);const t=Fc("near","float",r.camera).setGroup(Ta),s=Fc("far","float",r.camera).setGroup(Ta);n=Yp(e.negate(),t,s)}return a=Sn(a.x,a.y.oneMinus(),s.reversedDepthBuffer?n.sub(i):n.add(i)),a}getShadowFilterFn(e){return H_[e]}setupRenderTarget(e,t){const r=new J(e.mapSize.width,e.mapSize.height);r.name="ShadowDepthTexture",r.compareFunction=t.renderer.reversedDepthBuffer?M:w;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,camera:r}=e,{light:s,shadow:i}=this,{depthTexture:n,shadowMap:a}=this.setupRenderTarget(i,e),o=t.shadowMap.type,u=t.hasCompatibility(A.TEXTURE_COMPARE);if(o!==dt&&o!==ct||!u?(n.minFilter=B,n.magFilter=B):(n.minFilter=de,n.magFilter=de),i.camera.coordinateSystem=r.coordinateSystem,i.camera.updateProjectionMatrix(),o===ht&&!0!==i.isPointLightShadow){n.compareFunction=null,a.depth>1?(a._vsmShadowMapVertical||(a._vsmShadowMapVertical=e.createRenderTarget(i.mapSize.width,i.mapSize.height,{format:W,type:_e,depth:a.depth,depthBuffer:!1}),a._vsmShadowMapVertical.texture.name="VSMVertical"),this.vsmShadowMapVertical=a._vsmShadowMapVertical,a._vsmShadowMapHorizontal||(a._vsmShadowMapHorizontal=e.createRenderTarget(i.mapSize.width,i.mapSize.height,{format:W,type:_e,depth:a.depth,depthBuffer:!1}),a._vsmShadowMapHorizontal.texture.name="VSMHorizontal"),this.vsmShadowMapHorizontal=a._vsmShadowMapHorizontal):(this.vsmShadowMapVertical=e.createRenderTarget(i.mapSize.width,i.mapSize.height,{format:W,type:_e,depthBuffer:!1}),this.vsmShadowMapHorizontal=e.createRenderTarget(i.mapSize.width,i.mapSize.height,{format:W,type:_e,depthBuffer:!1}));let t=Pl(n);n.isArrayTexture&&(t=t.depth(this.depthLayer));let r=Pl(this.vsmShadowMapVertical.texture);n.isArrayTexture&&(r=r.depth(this.depthLayer));const s=Fc("blurSamples","float",i).setGroup(Ta),o=Fc("radius","float",i).setGroup(Ta),u=Fc("mapSize","vec2",i).setGroup(Ta);let l=this.vsmMaterialVertical||(this.vsmMaterialVertical=new mg);l.fragmentNode=$_({samples:s,radius:o,size:u,shadowPass:t,depthLayer:this.depthLayer}).context(e.getSharedContext()),l.name="VSMVertical",l=this.vsmMaterialHorizontal||(this.vsmMaterialHorizontal=new mg),l.fragmentNode=W_({samples:s,radius:o,size:u,shadowPass:r,depthLayer:this.depthLayer}).context(e.getSharedContext()),l.name="VSMHorizontal"}const l=Fc("intensity","float",i).setGroup(Ta),d=Fc("normalBias","float",i).setGroup(Ta),c=h_(s).mul(N_.add(dc.mul(d))),h=this.setupShadowCoord(e,c),p=i.filterNode||this.getShadowFilterFn(t.shadowMap.type)||null;if(null===p)throw new Error("THREE.WebGPURenderer: Shadow map type not supported yet.");const g=o===ht&&!0!==i.isPointLightShadow?this.vsmShadowMapHorizontal.texture:n,m=this.setupShadowFilter(e,{filterFn:p,shadowTexture:a.texture,depthTexture:g,shadowCoord:h,shadow:i,depthLayer:this.depthLayer});let f,y;!0===t.shadowMap.transmitted&&(a.texture.isCubeTexture?f=Cc(a.texture,h.xyz):(f=Pl(a.texture,h),n.isArrayTexture&&(f=f.depth(this.depthLayer)))),y=f?ou(1,m.rgb.mix(f,1),l.mul(f.a)).toVar():ou(1,m,l).toVar(),this.shadowMap=a,this.shadow.map=a;const b=`${this.light.type} Shadow [ ${this.light.name||"ID: "+this.light.id} ]`;return f&&y.toInspector(`${b} / Color`,()=>this.shadowMap.texture.isCubeTexture?Cc(this.shadowMap.texture):Pl(this.shadowMap.texture)),y.toInspector(`${b} / Depth`,()=>this.shadowMap.texture.isCubeTexture?Cc(this.shadowMap.texture).r.oneMinus():Dl(this.shadowMap.depthTexture,Rl().mul(El(Pl(this.shadowMap.depthTexture)))).r.oneMinus())}setup(e){if(!1!==e.renderer.shadowMap.enabled)return dn(()=>{const t=e.renderer.shadowMap.type;this._currentShadowType!==t&&(this._reset(),this._node=null);let r=this._node;return this.setupShadowPosition(e),null===r&&(this._node=r=this.setupShadow(e),this._currentShadowType=t),e.material.receivedShadowNode&&(r=e.material.receivedShadowNode(r)),r})()}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);const a=n.name;n.name=`Shadow Map [ ${s.name||"ID: "+s.id} ]`,i.render(n,t.camera),n.name=a}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");q_=M_(i,n,q_),n.overrideMaterial=O_(r),i.setRenderObjectFunction(z_(i,s,o,h)),i.setClearColor(0,0),i.setRenderTarget(t),this.renderShadow(e),i.setRenderObjectFunction(d),o===ht&&!0!==s.isPointLightShadow&&this.vsmPass(i),s.camera.layers.mask=l,B_(i,n,q_)}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),j_.material=this.vsmMaterialVertical,j_.render(e),e.setRenderTarget(this.vsmShadowMapHorizontal),j_.material=this.vsmMaterialHorizontal,j_.render(e)}dispose(){this._reset(),super.dispose()}_reset(){this._currentShadowType=null,V_(this.light),this.shadowMap&&(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)}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 K_=(e,t)=>new X_(e,t),Q_=new e,Y_=new a,Z_=new r,J_=new r,ev=[new r(1,0,0),new r(-1,0,0),new r(0,-1,0),new r(0,1,0),new r(0,0,1),new r(0,0,-1)],tv=[new r(0,-1,0),new r(0,-1,0),new r(0,0,-1),new r(0,0,1),new r(0,-1,0),new r(0,-1,0)],rv=[new r(1,0,0),new r(-1,0,0),new r(0,1,0),new r(0,-1,0),new r(0,0,1),new r(0,0,-1)],sv=[new r(0,-1,0),new r(0,-1,0),new r(0,0,1),new r(0,0,-1),new r(0,-1,0),new r(0,-1,0)],iv=dn(({depthTexture:e,bd3D:t,dp:r})=>Cc(e,t).compare(r)),nv=dn(({depthTexture:e,bd3D:t,dp:r,shadow:s})=>{const i=Fc("radius","float",s).setGroup(Ta),n=Fc("mapSize","vec2",s).setGroup(Ta),a=i.div(n.x),o=Fo(t),u=So(Jo(t,o.x.greaterThan(o.z).select(Sn(0,1,0),Sn(1,0,0)))),l=Jo(t,u),d=mx(Kl.xy).mul(6.28318530718),c=fx(0,5,d),h=fx(1,5,d),p=fx(2,5,d),g=fx(3,5,d),m=fx(4,5,d);return Cc(e,t.add(u.mul(c.x).add(l.mul(c.y)).mul(a))).compare(r).add(Cc(e,t.add(u.mul(h.x).add(l.mul(h.y)).mul(a))).compare(r)).add(Cc(e,t.add(u.mul(p.x).add(l.mul(p.y)).mul(a))).compare(r)).add(Cc(e,t.add(u.mul(g.x).add(l.mul(g.y)).mul(a))).compare(r)).add(Cc(e,t.add(u.mul(m.x).add(l.mul(m.y)).mul(a))).compare(r)).mul(.2)}),av=dn(({filterFn:e,depthTexture:t,shadowCoord:r,shadow:s},i)=>{const n=r.xyz.toConst(),a=n.abs().toConst(),o=a.x.max(a.y).max(a.z),u=Na("float").setGroup(Ta).onRenderUpdate(()=>s.camera.near),l=Na("float").setGroup(Ta).onRenderUpdate(()=>s.camera.far),d=Fc("bias","float",s).setGroup(Ta),c=fn(1).toVar();return pn(o.sub(l).lessThanEqual(0).and(o.sub(u).greaterThanEqual(0)),()=>{let r;i.renderer.reversedDepthBuffer?(r=Kp(o.negate(),u,l),r.subAssign(d)):(r=Xp(o.negate(),u,l),r.addAssign(d));const a=n.normalize();c.assign(e({depthTexture:t,bd3D:a,dp:r,shadow:s}))}),c});class ov extends X_{static get type(){return"PointShadowNode"}constructor(e,t=null){super(e,t)}getShadowFilterFn(e){return e===pt?iv:nv}setupShadowCoord(e,t){return t}setupShadowFilter(e,{filterFn:t,depthTexture:r,shadowCoord:s,shadow:i}){return av({filterFn:t,depthTexture:r,shadowCoord:s,shadow:i})}setupRenderTarget(e,t){const r=new gt(e.mapSize.width);r.name="PointShadowDepthTexture",r.compareFunction=t.renderer.reversedDepthBuffer?M:w;const s=t.createCubeRenderTarget(e.mapSize.width);return s.texture.name="PointShadowMap",s.depthTexture=r,{shadowMap:s,depthTexture:r}}renderShadow(e){const{shadow:t,shadowMap:r,light:s}=this,{renderer:i,scene:n}=e,a=t.camera,o=t.matrix,u=i.coordinateSystem===h,l=u?ev:rv,d=u?tv:sv;r.setSize(t.mapSize.width,t.mapSize.width);const c=i.autoClear,p=i.getClearColor(Q_),g=i.getClearAlpha();i.autoClear=!1,i.setClearColor(t.clearColor,t.clearAlpha);for(let e=0;e<6;e++){i.setRenderTarget(r,e),i.clear();const u=s.distance||a.far;u!==a.far&&(a.far=u,a.updateProjectionMatrix()),Z_.setFromMatrixPosition(s.matrixWorld),a.position.copy(Z_),J_.copy(a.position),J_.add(l[e]),a.up.copy(d[e]),a.lookAt(J_),a.updateMatrixWorld(),o.makeTranslation(-Z_.x,-Z_.y,-Z_.z),Y_.multiplyMatrices(a.projectionMatrix,a.matrixWorldInverse),t._frustum.setFromProjectionMatrix(Y_,a.coordinateSystem,a.reversedDepth);const c=n.name;n.name=`Point Light Shadow [ ${s.name||"ID: "+s.id} ] - Face ${e+1}`,i.render(n,a),n.name=c}i.autoClear=c,i.setClearColor(p,g)}}const uv=(e,t)=>new ov(e,t);class lv extends Bp{static get type(){return"AnalyticLightNode"}constructor(t=null){super(),this.light=t,this.color=new e,this.colorNode=t&&t.colorNode||Na(this.color).setGroup(Ta),this.baseColorNode=null,this.shadowNode=null,this.shadowColorNode=null,this.isAnalyticLightNode=!0,this.updateType=ti.FRAME,t&&t.shadow&&(this._shadowDisposeListener=()=>{this.disposeShadow()},t.addEventListener("dispose",this._shadowDisposeListener))}dispose(){this._shadowDisposeListener&&this.light.removeEventListener("dispose",this._shadowDisposeListener),super.dispose()}disposeShadow(){null!==this.shadowNode&&(this.shadowNode.dispose(),this.shadowNode=null),this.shadowColorNode=null,null!==this.baseColorNode&&(this.colorNode=this.baseColorNode,this.baseColorNode=null)}getHash(){return this.light.uuid}getLightVector(e){return f_(this.light).sub(e.context.positionView||Zd)}setupDirect(){}setupDirectRectArea(){}setupShadowNode(){return K_(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?en(e):this.setupShadowNode(),this.shadowNode=t,this.shadowColorNode=r=this.colorNode.mul(t),this.baseColorNode=this.colorNode}e.context.getShadow&&(r=e.context.getShadow(this,e)),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 dv=dn(({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)}),cv=({color:e,lightVector:t,cutoffDistance:r,decayExponent:s})=>{const i=t.normalize(),n=t.length(),a=dv({lightDistance:n,cutoffDistance:r,decayExponent:s});return{lightDirection:i,lightColor:e.mul(a)}};class hv extends lv{static get type(){return"PointLightNode"}constructor(e=null){super(e),this.cutoffDistanceNode=Na(0).setGroup(Ta),this.decayExponentNode=Na(2).setGroup(Ta)}update(e){const{light:t}=this;super.update(e),this.cutoffDistanceNode.value=t.distance,this.decayExponentNode.value=t.decay}setupShadowNode(){return uv(this.light)}setupDirect(e){return cv({color:this.colorNode,lightVector:this.getLightVector(e),cutoffDistance:this.cutoffDistanceNode,decayExponent:this.decayExponentNode})}}const pv=dn(([e=Rl()])=>{const t=e.mul(2),r=t.x.floor(),s=t.y.floor();return r.add(s).mod(2).sign()}),gv=dn(([e=Rl()],{renderer:t,material:r})=>{const s=au(e.mul(2).sub(1));let i;if(r.alphaToCoverage&&t.currentSamples>0){const e=fn(s.fwidth()).toVar();i=cu(e.oneMinus(),e.add(1),s).oneMinus()}else i=Tu(s.greaterThan(1),0,1);return i}),mv=dn(([e,t,r])=>{const s=fn(r).toVar(),i=fn(t).toVar(),n=xn(e).toVar();return Tu(n,i,s)}).setLayout({name:"mx_select",type:"float",inputs:[{name:"b",type:"bool"},{name:"t",type:"float"},{name:"f",type:"float"}]}),fv=dn(([e,t])=>{const r=xn(t).toVar(),s=fn(e).toVar();return Tu(r,s.negate(),s)}).setLayout({name:"mx_negate_if",type:"float",inputs:[{name:"val",type:"float"},{name:"b",type:"bool"}]}),yv=dn(([e])=>{const t=fn(e).toVar();return yn(vo(t))}).setLayout({name:"mx_floor",type:"int",inputs:[{name:"x",type:"float"}]}),bv=dn(([e,t])=>{const r=fn(e).toVar();return t.assign(yv(r)),r.sub(fn(t))}),xv=Lb([dn(([e,t,r,s,i,n])=>{const a=fn(n).toVar(),o=fn(i).toVar(),u=fn(s).toVar(),l=fn(r).toVar(),d=fn(t).toVar(),c=fn(e).toVar(),h=fn(La(1,o)).toVar();return La(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"}]}),dn(([e,t,r,s,i,n])=>{const a=fn(n).toVar(),o=fn(i).toVar(),u=Sn(s).toVar(),l=Sn(r).toVar(),d=Sn(t).toVar(),c=Sn(e).toVar(),h=fn(La(1,o)).toVar();return La(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"}]})]),Tv=Lb([dn(([e,t,r,s,i,n,a,o,u,l,d])=>{const c=fn(d).toVar(),h=fn(l).toVar(),p=fn(u).toVar(),g=fn(o).toVar(),m=fn(a).toVar(),f=fn(n).toVar(),y=fn(i).toVar(),b=fn(s).toVar(),x=fn(r).toVar(),T=fn(t).toVar(),_=fn(e).toVar(),v=fn(La(1,p)).toVar(),N=fn(La(1,h)).toVar();return fn(La(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"}]}),dn(([e,t,r,s,i,n,a,o,u,l,d])=>{const c=fn(d).toVar(),h=fn(l).toVar(),p=fn(u).toVar(),g=Sn(o).toVar(),m=Sn(a).toVar(),f=Sn(n).toVar(),y=Sn(i).toVar(),b=Sn(s).toVar(),x=Sn(r).toVar(),T=Sn(t).toVar(),_=Sn(e).toVar(),v=fn(La(1,p)).toVar(),N=fn(La(1,h)).toVar();return fn(La(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"}]})]),_v=dn(([e,t,r])=>{const s=fn(r).toVar(),i=fn(t).toVar(),n=bn(e).toVar(),a=bn(n.bitAnd(bn(7))).toVar(),o=fn(mv(a.lessThan(bn(4)),i,s)).toVar(),u=fn(Pa(2,mv(a.lessThan(bn(4)),s,i))).toVar();return fv(o,xn(a.bitAnd(bn(1)))).add(fv(u,xn(a.bitAnd(bn(2)))))}).setLayout({name:"mx_gradient_float_0",type:"float",inputs:[{name:"hash",type:"uint"},{name:"x",type:"float"},{name:"y",type:"float"}]}),vv=dn(([e,t,r,s])=>{const i=fn(s).toVar(),n=fn(r).toVar(),a=fn(t).toVar(),o=bn(e).toVar(),u=bn(o.bitAnd(bn(15))).toVar(),l=fn(mv(u.lessThan(bn(8)),a,n)).toVar(),d=fn(mv(u.lessThan(bn(4)),n,mv(u.equal(bn(12)).or(u.equal(bn(14))),a,i))).toVar();return fv(l,xn(u.bitAnd(bn(1)))).add(fv(d,xn(u.bitAnd(bn(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"}]}),Nv=Lb([_v,vv]),Sv=dn(([e,t,r])=>{const s=fn(r).toVar(),i=fn(t).toVar(),n=An(e).toVar();return Sn(Nv(n.x,i,s),Nv(n.y,i,s),Nv(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"}]}),Rv=dn(([e,t,r,s])=>{const i=fn(s).toVar(),n=fn(r).toVar(),a=fn(t).toVar(),o=An(e).toVar();return Sn(Nv(o.x,a,n,i),Nv(o.y,a,n,i),Nv(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"}]}),Av=Lb([Sv,Rv]),Ev=dn(([e])=>{const t=fn(e).toVar();return Pa(.6616,t)}).setLayout({name:"mx_gradient_scale2d_0",type:"float",inputs:[{name:"v",type:"float"}]}),wv=dn(([e])=>{const t=fn(e).toVar();return Pa(.982,t)}).setLayout({name:"mx_gradient_scale3d_0",type:"float",inputs:[{name:"v",type:"float"}]}),Cv=Lb([Ev,dn(([e])=>{const t=Sn(e).toVar();return Pa(.6616,t)}).setLayout({name:"mx_gradient_scale2d_1",type:"vec3",inputs:[{name:"v",type:"vec3"}]})]),Mv=Lb([wv,dn(([e])=>{const t=Sn(e).toVar();return Pa(.982,t)}).setLayout({name:"mx_gradient_scale3d_1",type:"vec3",inputs:[{name:"v",type:"vec3"}]})]),Bv=dn(([e,t])=>{const r=yn(t).toVar(),s=bn(e).toVar();return s.shiftLeft(r).bitOr(s.shiftRight(yn(32).sub(r)))}).setLayout({name:"mx_rotl32",type:"uint",inputs:[{name:"x",type:"uint"},{name:"k",type:"int"}]}),Fv=dn(([e,t,r])=>{e.subAssign(r),e.bitXorAssign(Bv(r,yn(4))),r.addAssign(t),t.subAssign(e),t.bitXorAssign(Bv(e,yn(6))),e.addAssign(r),r.subAssign(t),r.bitXorAssign(Bv(t,yn(8))),t.addAssign(e),e.subAssign(r),e.bitXorAssign(Bv(r,yn(16))),r.addAssign(t),t.subAssign(e),t.bitXorAssign(Bv(e,yn(19))),e.addAssign(r),r.subAssign(t),r.bitXorAssign(Bv(t,yn(4))),t.addAssign(e)}),Lv=dn(([e,t,r])=>{const s=bn(r).toVar(),i=bn(t).toVar(),n=bn(e).toVar();return s.bitXorAssign(i),s.subAssign(Bv(i,yn(14))),n.bitXorAssign(s),n.subAssign(Bv(s,yn(11))),i.bitXorAssign(n),i.subAssign(Bv(n,yn(25))),s.bitXorAssign(i),s.subAssign(Bv(i,yn(16))),n.bitXorAssign(s),n.subAssign(Bv(s,yn(4))),i.bitXorAssign(n),i.subAssign(Bv(n,yn(14))),s.bitXorAssign(i),s.subAssign(Bv(i,yn(24))),s}).setLayout({name:"mx_bjfinal",type:"uint",inputs:[{name:"a",type:"uint"},{name:"b",type:"uint"},{name:"c",type:"uint"}]}),Pv=dn(([e])=>{const t=bn(e).toVar();return fn(t).div(fn(bn(yn(4294967295))))}).setLayout({name:"mx_bits_to_01",type:"float",inputs:[{name:"bits",type:"uint"}]}),Dv=dn(([e])=>{const t=fn(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"}]}),Uv=Lb([dn(([e])=>{const t=yn(e).toVar(),r=bn(bn(1)).toVar(),s=bn(bn(yn(3735928559)).add(r.shiftLeft(bn(2))).add(bn(13))).toVar();return Lv(s.add(bn(t)),s,s)}).setLayout({name:"mx_hash_int_0",type:"uint",inputs:[{name:"x",type:"int"}]}),dn(([e,t])=>{const r=yn(t).toVar(),s=yn(e).toVar(),i=bn(bn(2)).toVar(),n=bn().toVar(),a=bn().toVar(),o=bn().toVar();return n.assign(a.assign(o.assign(bn(yn(3735928559)).add(i.shiftLeft(bn(2))).add(bn(13))))),n.addAssign(bn(s)),a.addAssign(bn(r)),Lv(n,a,o)}).setLayout({name:"mx_hash_int_1",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"}]}),dn(([e,t,r])=>{const s=yn(r).toVar(),i=yn(t).toVar(),n=yn(e).toVar(),a=bn(bn(3)).toVar(),o=bn().toVar(),u=bn().toVar(),l=bn().toVar();return o.assign(u.assign(l.assign(bn(yn(3735928559)).add(a.shiftLeft(bn(2))).add(bn(13))))),o.addAssign(bn(n)),u.addAssign(bn(i)),l.addAssign(bn(s)),Lv(o,u,l)}).setLayout({name:"mx_hash_int_2",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"}]}),dn(([e,t,r,s])=>{const i=yn(s).toVar(),n=yn(r).toVar(),a=yn(t).toVar(),o=yn(e).toVar(),u=bn(bn(4)).toVar(),l=bn().toVar(),d=bn().toVar(),c=bn().toVar();return l.assign(d.assign(c.assign(bn(yn(3735928559)).add(u.shiftLeft(bn(2))).add(bn(13))))),l.addAssign(bn(o)),d.addAssign(bn(a)),c.addAssign(bn(n)),Fv(l,d,c),l.addAssign(bn(i)),Lv(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"}]}),dn(([e,t,r,s,i])=>{const n=yn(i).toVar(),a=yn(s).toVar(),o=yn(r).toVar(),u=yn(t).toVar(),l=yn(e).toVar(),d=bn(bn(5)).toVar(),c=bn().toVar(),h=bn().toVar(),p=bn().toVar();return c.assign(h.assign(p.assign(bn(yn(3735928559)).add(d.shiftLeft(bn(2))).add(bn(13))))),c.addAssign(bn(l)),h.addAssign(bn(u)),p.addAssign(bn(o)),Fv(c,h,p),c.addAssign(bn(a)),h.addAssign(bn(n)),Lv(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"}]})]),Iv=Lb([dn(([e,t])=>{const r=yn(t).toVar(),s=yn(e).toVar(),i=bn(Uv(s,r)).toVar(),n=An().toVar();return n.x.assign(i.bitAnd(yn(255))),n.y.assign(i.shiftRight(yn(8)).bitAnd(yn(255))),n.z.assign(i.shiftRight(yn(16)).bitAnd(yn(255))),n}).setLayout({name:"mx_hash_vec3_0",type:"uvec3",inputs:[{name:"x",type:"int"},{name:"y",type:"int"}]}),dn(([e,t,r])=>{const s=yn(r).toVar(),i=yn(t).toVar(),n=yn(e).toVar(),a=bn(Uv(n,i,s)).toVar(),o=An().toVar();return o.x.assign(a.bitAnd(yn(255))),o.y.assign(a.shiftRight(yn(8)).bitAnd(yn(255))),o.z.assign(a.shiftRight(yn(16)).bitAnd(yn(255))),o}).setLayout({name:"mx_hash_vec3_1",type:"uvec3",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"}]})]),Ov=Lb([dn(([e])=>{const t=Tn(e).toVar(),r=yn().toVar(),s=yn().toVar(),i=fn(bv(t.x,r)).toVar(),n=fn(bv(t.y,s)).toVar(),a=fn(Dv(i)).toVar(),o=fn(Dv(n)).toVar(),u=fn(xv(Nv(Uv(r,s),i,n),Nv(Uv(r.add(yn(1)),s),i.sub(1),n),Nv(Uv(r,s.add(yn(1))),i,n.sub(1)),Nv(Uv(r.add(yn(1)),s.add(yn(1))),i.sub(1),n.sub(1)),a,o)).toVar();return Cv(u)}).setLayout({name:"mx_perlin_noise_float_0",type:"float",inputs:[{name:"p",type:"vec2"}]}),dn(([e])=>{const t=Sn(e).toVar(),r=yn().toVar(),s=yn().toVar(),i=yn().toVar(),n=fn(bv(t.x,r)).toVar(),a=fn(bv(t.y,s)).toVar(),o=fn(bv(t.z,i)).toVar(),u=fn(Dv(n)).toVar(),l=fn(Dv(a)).toVar(),d=fn(Dv(o)).toVar(),c=fn(Tv(Nv(Uv(r,s,i),n,a,o),Nv(Uv(r.add(yn(1)),s,i),n.sub(1),a,o),Nv(Uv(r,s.add(yn(1)),i),n,a.sub(1),o),Nv(Uv(r.add(yn(1)),s.add(yn(1)),i),n.sub(1),a.sub(1),o),Nv(Uv(r,s,i.add(yn(1))),n,a,o.sub(1)),Nv(Uv(r.add(yn(1)),s,i.add(yn(1))),n.sub(1),a,o.sub(1)),Nv(Uv(r,s.add(yn(1)),i.add(yn(1))),n,a.sub(1),o.sub(1)),Nv(Uv(r.add(yn(1)),s.add(yn(1)),i.add(yn(1))),n.sub(1),a.sub(1),o.sub(1)),u,l,d)).toVar();return Mv(c)}).setLayout({name:"mx_perlin_noise_float_1",type:"float",inputs:[{name:"p",type:"vec3"}]})]),Vv=Lb([dn(([e])=>{const t=Tn(e).toVar(),r=yn().toVar(),s=yn().toVar(),i=fn(bv(t.x,r)).toVar(),n=fn(bv(t.y,s)).toVar(),a=fn(Dv(i)).toVar(),o=fn(Dv(n)).toVar(),u=Sn(xv(Av(Iv(r,s),i,n),Av(Iv(r.add(yn(1)),s),i.sub(1),n),Av(Iv(r,s.add(yn(1))),i,n.sub(1)),Av(Iv(r.add(yn(1)),s.add(yn(1))),i.sub(1),n.sub(1)),a,o)).toVar();return Cv(u)}).setLayout({name:"mx_perlin_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"vec2"}]}),dn(([e])=>{const t=Sn(e).toVar(),r=yn().toVar(),s=yn().toVar(),i=yn().toVar(),n=fn(bv(t.x,r)).toVar(),a=fn(bv(t.y,s)).toVar(),o=fn(bv(t.z,i)).toVar(),u=fn(Dv(n)).toVar(),l=fn(Dv(a)).toVar(),d=fn(Dv(o)).toVar(),c=Sn(Tv(Av(Iv(r,s,i),n,a,o),Av(Iv(r.add(yn(1)),s,i),n.sub(1),a,o),Av(Iv(r,s.add(yn(1)),i),n,a.sub(1),o),Av(Iv(r.add(yn(1)),s.add(yn(1)),i),n.sub(1),a.sub(1),o),Av(Iv(r,s,i.add(yn(1))),n,a,o.sub(1)),Av(Iv(r.add(yn(1)),s,i.add(yn(1))),n.sub(1),a,o.sub(1)),Av(Iv(r,s.add(yn(1)),i.add(yn(1))),n,a.sub(1),o.sub(1)),Av(Iv(r.add(yn(1)),s.add(yn(1)),i.add(yn(1))),n.sub(1),a.sub(1),o.sub(1)),u,l,d)).toVar();return Mv(c)}).setLayout({name:"mx_perlin_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec3"}]})]),kv=Lb([dn(([e])=>{const t=fn(e).toVar(),r=yn(yv(t)).toVar();return Pv(Uv(r))}).setLayout({name:"mx_cell_noise_float_0",type:"float",inputs:[{name:"p",type:"float"}]}),dn(([e])=>{const t=Tn(e).toVar(),r=yn(yv(t.x)).toVar(),s=yn(yv(t.y)).toVar();return Pv(Uv(r,s))}).setLayout({name:"mx_cell_noise_float_1",type:"float",inputs:[{name:"p",type:"vec2"}]}),dn(([e])=>{const t=Sn(e).toVar(),r=yn(yv(t.x)).toVar(),s=yn(yv(t.y)).toVar(),i=yn(yv(t.z)).toVar();return Pv(Uv(r,s,i))}).setLayout({name:"mx_cell_noise_float_2",type:"float",inputs:[{name:"p",type:"vec3"}]}),dn(([e])=>{const t=wn(e).toVar(),r=yn(yv(t.x)).toVar(),s=yn(yv(t.y)).toVar(),i=yn(yv(t.z)).toVar(),n=yn(yv(t.w)).toVar();return Pv(Uv(r,s,i,n))}).setLayout({name:"mx_cell_noise_float_3",type:"float",inputs:[{name:"p",type:"vec4"}]})]),Gv=Lb([dn(([e])=>{const t=fn(e).toVar(),r=yn(yv(t)).toVar();return Sn(Pv(Uv(r,yn(0))),Pv(Uv(r,yn(1))),Pv(Uv(r,yn(2))))}).setLayout({name:"mx_cell_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"float"}]}),dn(([e])=>{const t=Tn(e).toVar(),r=yn(yv(t.x)).toVar(),s=yn(yv(t.y)).toVar();return Sn(Pv(Uv(r,s,yn(0))),Pv(Uv(r,s,yn(1))),Pv(Uv(r,s,yn(2))))}).setLayout({name:"mx_cell_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec2"}]}),dn(([e])=>{const t=Sn(e).toVar(),r=yn(yv(t.x)).toVar(),s=yn(yv(t.y)).toVar(),i=yn(yv(t.z)).toVar();return Sn(Pv(Uv(r,s,i,yn(0))),Pv(Uv(r,s,i,yn(1))),Pv(Uv(r,s,i,yn(2))))}).setLayout({name:"mx_cell_noise_vec3_2",type:"vec3",inputs:[{name:"p",type:"vec3"}]}),dn(([e])=>{const t=wn(e).toVar(),r=yn(yv(t.x)).toVar(),s=yn(yv(t.y)).toVar(),i=yn(yv(t.z)).toVar(),n=yn(yv(t.w)).toVar();return Sn(Pv(Uv(r,s,i,n,yn(0))),Pv(Uv(r,s,i,n,yn(1))),Pv(Uv(r,s,i,n,yn(2))))}).setLayout({name:"mx_cell_noise_vec3_3",type:"vec3",inputs:[{name:"p",type:"vec4"}]})]),zv=dn(([e,t,r,s])=>{const i=fn(s).toVar(),n=fn(r).toVar(),a=yn(t).toVar(),o=Sn(e).toVar(),u=fn(0).toVar(),l=fn(1).toVar();return Sp(a,()=>{u.addAssign(l.mul(Ov(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"}]}),$v=dn(([e,t,r,s])=>{const i=fn(s).toVar(),n=fn(r).toVar(),a=yn(t).toVar(),o=Sn(e).toVar(),u=Sn(0).toVar(),l=fn(1).toVar();return Sp(a,()=>{u.addAssign(l.mul(Vv(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"}]}),Wv=dn(([e,t,r,s])=>{const i=fn(s).toVar(),n=fn(r).toVar(),a=yn(t).toVar(),o=Sn(e).toVar();return Tn(zv(o,a,n,i),zv(o.add(Sn(yn(19),yn(193),yn(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"}]}),Hv=dn(([e,t,r,s])=>{const i=fn(s).toVar(),n=fn(r).toVar(),a=yn(t).toVar(),o=Sn(e).toVar(),u=Sn($v(o,a,n,i)).toVar(),l=fn(zv(o.add(Sn(yn(19),yn(193),yn(17))),a,n,i)).toVar();return wn(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"}]}),qv=Lb([dn(([e,t,r,s,i,n,a])=>{const o=yn(a).toVar(),u=fn(n).toVar(),l=yn(i).toVar(),d=yn(s).toVar(),c=yn(r).toVar(),h=yn(t).toVar(),p=Tn(e).toVar(),g=Sn(Gv(Tn(h.add(d),c.add(l)))).toVar(),m=Tn(g.x,g.y).toVar();m.subAssign(.5),m.mulAssign(u),m.addAssign(.5);const f=Tn(Tn(fn(h),fn(c)).add(m)).toVar(),y=Tn(f.sub(p)).toVar();return pn(o.equal(yn(2)),()=>Fo(y.x).add(Fo(y.y))),pn(o.equal(yn(3)),()=>jo(Fo(y.x),Fo(y.y))),Zo(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"}]}),dn(([e,t,r,s,i,n,a,o,u])=>{const l=yn(u).toVar(),d=fn(o).toVar(),c=yn(a).toVar(),h=yn(n).toVar(),p=yn(i).toVar(),g=yn(s).toVar(),m=yn(r).toVar(),f=yn(t).toVar(),y=Sn(e).toVar(),b=Sn(Gv(Sn(f.add(p),m.add(h),g.add(c)))).toVar();b.subAssign(.5),b.mulAssign(d),b.addAssign(.5);const x=Sn(Sn(fn(f),fn(m),fn(g)).add(b)).toVar(),T=Sn(x.sub(y)).toVar();return pn(l.equal(yn(2)),()=>Fo(T.x).add(Fo(T.y)).add(Fo(T.z))),pn(l.equal(yn(3)),()=>jo(Fo(T.x),Fo(T.y),Fo(T.z))),Zo(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"}]})]),jv=dn(([e,t,r])=>{const s=yn(r).toVar(),i=fn(t).toVar(),n=Tn(e).toVar(),a=yn().toVar(),o=yn().toVar(),u=Tn(bv(n.x,a),bv(n.y,o)).toVar(),l=fn(1e6).toVar();return Sp({start:-1,end:yn(1),name:"x",condition:"<="},({x:e})=>{Sp({start:-1,end:yn(1),name:"y",condition:"<="},({y:t})=>{const r=fn(qv(u,e,t,a,o,i,s)).toVar();l.assign(qo(l,r))})}),pn(s.equal(yn(0)),()=>{l.assign(To(l))}),l}).setLayout({name:"mx_worley_noise_float_0",type:"float",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),Xv=dn(([e,t,r])=>{const s=yn(r).toVar(),i=fn(t).toVar(),n=Tn(e).toVar(),a=yn().toVar(),o=yn().toVar(),u=Tn(bv(n.x,a),bv(n.y,o)).toVar(),l=Tn(1e6,1e6).toVar();return Sp({start:-1,end:yn(1),name:"x",condition:"<="},({x:e})=>{Sp({start:-1,end:yn(1),name:"y",condition:"<="},({y:t})=>{const r=fn(qv(u,e,t,a,o,i,s)).toVar();pn(r.lessThan(l.x),()=>{l.y.assign(l.x),l.x.assign(r)}).ElseIf(r.lessThan(l.y),()=>{l.y.assign(r)})})}),pn(s.equal(yn(0)),()=>{l.assign(To(l))}),l}).setLayout({name:"mx_worley_noise_vec2_0",type:"vec2",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),Kv=dn(([e,t,r])=>{const s=yn(r).toVar(),i=fn(t).toVar(),n=Tn(e).toVar(),a=yn().toVar(),o=yn().toVar(),u=Tn(bv(n.x,a),bv(n.y,o)).toVar(),l=Sn(1e6,1e6,1e6).toVar();return Sp({start:-1,end:yn(1),name:"x",condition:"<="},({x:e})=>{Sp({start:-1,end:yn(1),name:"y",condition:"<="},({y:t})=>{const r=fn(qv(u,e,t,a,o,i,s)).toVar();pn(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)})})}),pn(s.equal(yn(0)),()=>{l.assign(To(l))}),l}).setLayout({name:"mx_worley_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),Qv=Lb([jv,dn(([e,t,r])=>{const s=yn(r).toVar(),i=fn(t).toVar(),n=Sn(e).toVar(),a=yn().toVar(),o=yn().toVar(),u=yn().toVar(),l=Sn(bv(n.x,a),bv(n.y,o),bv(n.z,u)).toVar(),d=fn(1e6).toVar();return Sp({start:-1,end:yn(1),name:"x",condition:"<="},({x:e})=>{Sp({start:-1,end:yn(1),name:"y",condition:"<="},({y:t})=>{Sp({start:-1,end:yn(1),name:"z",condition:"<="},({z:r})=>{const n=fn(qv(l,e,t,r,a,o,u,i,s)).toVar();d.assign(qo(d,n))})})}),pn(s.equal(yn(0)),()=>{d.assign(To(d))}),d}).setLayout({name:"mx_worley_noise_float_1",type:"float",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),Yv=Lb([Xv,dn(([e,t,r])=>{const s=yn(r).toVar(),i=fn(t).toVar(),n=Sn(e).toVar(),a=yn().toVar(),o=yn().toVar(),u=yn().toVar(),l=Sn(bv(n.x,a),bv(n.y,o),bv(n.z,u)).toVar(),d=Tn(1e6,1e6).toVar();return Sp({start:-1,end:yn(1),name:"x",condition:"<="},({x:e})=>{Sp({start:-1,end:yn(1),name:"y",condition:"<="},({y:t})=>{Sp({start:-1,end:yn(1),name:"z",condition:"<="},({z:r})=>{const n=fn(qv(l,e,t,r,a,o,u,i,s)).toVar();pn(n.lessThan(d.x),()=>{d.y.assign(d.x),d.x.assign(n)}).ElseIf(n.lessThan(d.y),()=>{d.y.assign(n)})})})}),pn(s.equal(yn(0)),()=>{d.assign(To(d))}),d}).setLayout({name:"mx_worley_noise_vec2_1",type:"vec2",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),Zv=Lb([Kv,dn(([e,t,r])=>{const s=yn(r).toVar(),i=fn(t).toVar(),n=Sn(e).toVar(),a=yn().toVar(),o=yn().toVar(),u=yn().toVar(),l=Sn(bv(n.x,a),bv(n.y,o),bv(n.z,u)).toVar(),d=Sn(1e6,1e6,1e6).toVar();return Sp({start:-1,end:yn(1),name:"x",condition:"<="},({x:e})=>{Sp({start:-1,end:yn(1),name:"y",condition:"<="},({y:t})=>{Sp({start:-1,end:yn(1),name:"z",condition:"<="},({z:r})=>{const n=fn(qv(l,e,t,r,a,o,u,i,s)).toVar();pn(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)})})})}),pn(s.equal(yn(0)),()=>{d.assign(To(d))}),d}).setLayout({name:"mx_worley_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),Jv=dn(([e,t,r,s,i,n,a,o,u,l,d])=>{const c=yn(e).toVar(),h=Tn(t).toVar(),p=Tn(r).toVar(),g=Tn(s).toVar(),m=fn(i).toVar(),f=fn(n).toVar(),y=fn(a).toVar(),b=xn(o).toVar(),x=yn(u).toVar(),T=fn(l).toVar(),_=fn(d).toVar(),v=h.mul(p).add(g),N=fn(0).toVar();return pn(c.equal(yn(0)),()=>{N.assign(Vv(v))}),pn(c.equal(yn(1)),()=>{N.assign(Gv(v))}),pn(c.equal(yn(2)),()=>{N.assign(Zv(v,m,yn(0)))}),pn(c.equal(yn(3)),()=>{N.assign($v(Sn(v,0),x,T,_))}),N.assign(N.mul(y.sub(f)).add(f)),pn(b,()=>{N.assign(uu(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"}]}),eN=dn(([e,t,r,s,i,n,a,o,u,l,d])=>{const c=yn(e).toVar(),h=Sn(t).toVar(),p=Sn(r).toVar(),g=Sn(s).toVar(),m=fn(i).toVar(),f=fn(n).toVar(),y=fn(a).toVar(),b=xn(o).toVar(),x=yn(u).toVar(),T=fn(l).toVar(),_=fn(d).toVar(),v=h.mul(p).add(g),N=fn(0).toVar();return pn(c.equal(yn(0)),()=>{N.assign(Vv(v))}),pn(c.equal(yn(1)),()=>{N.assign(Gv(v))}),pn(c.equal(yn(2)),()=>{N.assign(Zv(v,m,yn(0)))}),pn(c.equal(yn(3)),()=>{N.assign($v(v,x,T,_))}),N.assign(N.mul(y.sub(f)).add(f)),pn(b,()=>{N.assign(uu(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"}]}),tN=dn(([e])=>{const t=e.y,r=e.z,s=Sn().toVar();return pn(t.lessThan(1e-4),()=>{s.assign(Sn(r,r,r))}).Else(()=>{let i=e.x;i=i.sub(vo(i)).mul(6).toVar();const n=yn(Go(i)),a=i.sub(fn(n)),o=r.mul(t.oneMinus()),u=r.mul(t.mul(a).oneMinus()),l=r.mul(t.mul(a.oneMinus()).oneMinus());pn(n.equal(yn(0)),()=>{s.assign(Sn(r,l,o))}).ElseIf(n.equal(yn(1)),()=>{s.assign(Sn(u,r,o))}).ElseIf(n.equal(yn(2)),()=>{s.assign(Sn(o,r,l))}).ElseIf(n.equal(yn(3)),()=>{s.assign(Sn(o,u,r))}).ElseIf(n.equal(yn(4)),()=>{s.assign(Sn(l,o,r))}).Else(()=>{s.assign(Sn(r,o,u))})}),s}).setLayout({name:"mx_hsvtorgb",type:"vec3",inputs:[{name:"hsv",type:"vec3"}]}),rN=dn(([e])=>{const t=Sn(e).toVar(),r=fn(t.x).toVar(),s=fn(t.y).toVar(),i=fn(t.z).toVar(),n=fn(qo(r,qo(s,i))).toVar(),a=fn(jo(r,jo(s,i))).toVar(),o=fn(a.sub(n)).toVar(),u=fn().toVar(),l=fn().toVar(),d=fn().toVar();return d.assign(a),pn(a.greaterThan(0),()=>{l.assign(o.div(a))}).Else(()=>{l.assign(0)}),pn(l.lessThanEqual(0),()=>{u.assign(0)}).Else(()=>{pn(r.greaterThanEqual(a),()=>{u.assign(s.sub(i).div(o))}).ElseIf(s.greaterThanEqual(a),()=>{u.assign(Fa(2,i.sub(r).div(o)))}).Else(()=>{u.assign(Fa(4,r.sub(s).div(o)))}),u.mulAssign(1/6),pn(u.lessThan(0),()=>{u.addAssign(1)})}),Sn(u,l,d)}).setLayout({name:"mx_rgbtohsv",type:"vec3",inputs:[{name:"c",type:"vec3"}]}),sN=dn(([e])=>{const t=Sn(e).toVar(),r=En(ka(t,Sn(.04045))).toVar(),s=Sn(t.div(12.92)).toVar(),i=Sn(eu(jo(t.add(Sn(.055)),Sn(0)).div(1.055),Sn(2.4))).toVar();return ou(s,i,r)}).setLayout({name:"mx_srgb_texture_to_lin_rec709",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),iN=(e,t)=>{e=fn(e),t=fn(t);const r=Tn(t.dFdx(),t.dFdy()).length().mul(.7071067811865476);return cu(e.sub(r),e.add(r),t)},nN=(e,t,r,s)=>ou(e,t,r[s].clamp()),aN=(e,t,r,s,i)=>ou(e,t,iN(r,s[i])),oN=dn(([e,t,r])=>{const s=So(e).toVar(),i=La(fn(.5).mul(t.sub(r)),Qd).div(s).toVar(),n=La(fn(-.5).mul(t.sub(r)),Qd).div(s).toVar(),a=Sn().toVar();a.x=s.x.greaterThan(fn(0)).select(i.x,n.x),a.y=s.y.greaterThan(fn(0)).select(i.y,n.y),a.z=s.z.greaterThan(fn(0)).select(i.z,n.z);const o=qo(a.x,a.y,a.z).toVar();return Qd.add(s.mul(o)).toVar().sub(r)}),uN=dn(([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 lN=Object.freeze({__proto__:null,BRDF_GGX:Jg,BRDF_Lambert:Og,BasicPointShadowFilter:iv,BasicShadowFilter:P_,Break:Rp,Const:Bu,Continue:()=>gl("continue").toStack(),DFGLUT:rm,D_GGX:Qg,Discard:ml,EPSILON:no,F_Schlick:Ig,Fn:dn,HALF_PI:co,INFINITY:ao,If:pn,Loop:Sp,NodeAccess:si,NodeShaderStage:ei,NodeType:ri,NodeUpdateType:ti,OnBeforeMaterialUpdate:e=>xx(bx.BEFORE_MATERIAL,e),OnBeforeObjectUpdate:e=>xx(bx.BEFORE_OBJECT,e),OnMaterialUpdate:e=>xx(bx.MATERIAL,e),OnObjectUpdate:e=>xx(bx.OBJECT,e),PCFShadowFilter:D_,PCFSoftShadowFilter:U_,PI:oo,PI2:uo,PointShadowFilter:nv,Return:()=>gl("return").toStack(),Schlick_to_F0:nm,ShaderNode:Ji,Stack:gn,Switch:(...e)=>Ni.Switch(...e),TBNViewMatrix:nh,TWO_PI:lo,VSMShadowFilter:I_,V_GGX_SmithCorrelated:Xg,Var:Mu,VarIntent:Fu,abs:Fo,acesFilmicToneMapping:nT,acos:Mo,add:Fa,addMethodChaining:Ri,addNodeElement:function(e){d("TSL: AddNodeElement has been removed in favor of tree-shaking. Trying add",e)},agxToneMapping:lT,all:ho,alphaT:Zn,and:$a,anisotropy:Jn,anisotropyB:ta,anisotropyT:ea,any:po,append:e=>(d("TSL: append() has been renamed to Stack().",new Us),gn(e)),array:Ra,arrayBuffer:e=>new _i(e,"ArrayBuffer"),asin:Co,assign:Ea,atan:Bo,atomicAdd:(e,t)=>IT(DT.ATOMIC_ADD,e,t),atomicAnd:(e,t)=>IT(DT.ATOMIC_AND,e,t),atomicFunc:IT,atomicLoad:e=>IT(DT.ATOMIC_LOAD,e,null),atomicMax:(e,t)=>IT(DT.ATOMIC_MAX,e,t),atomicMin:(e,t)=>IT(DT.ATOMIC_MIN,e,t),atomicOr:(e,t)=>IT(DT.ATOMIC_OR,e,t),atomicStore:(e,t)=>IT(DT.ATOMIC_STORE,e,t),atomicSub:(e,t)=>IT(DT.ATOMIC_SUB,e,t),atomicXor:(e,t)=>IT(DT.ATOMIC_XOR,e,t),attenuationColor:ga,attenuationDistance:pa,attribute:Sl,attributeArray:(e,t="float")=>{let r,s;!0===t.isStruct?(r=t.layout.getLength(),s=Ws("float")):(r=Hs(t),s=Ws(t));const i=new _x(e,r,s);return ap(i,t,e)},backgroundBlurriness:Ax,backgroundIntensity:Ex,backgroundRotation:wx,batch:xp,bentNormalView:oh,billboarding:Vb,bitAnd:ja,bitNot:Xa,bitOr:Ka,bitXor:Qa,bitangentGeometry:th,bitangentLocal:rh,bitangentView:sh,bitangentWorld:ih,bitcast:cb,blendBurn:ug,blendColor:hg,blendDodge:lg,blendOverlay:cg,blendScreen:dg,blur:af,bool:xn,buffer:Il,bufferAttribute:tl,builtin:zl,builtinAOContext:Au,builtinShadowContext:Ru,bumpMap:mh,bvec2:Nn,bvec3:En,bvec4:Bn,bypass:cl,cache:ll,call:Ca,cameraFar:yd,cameraIndex:md,cameraNear:fd,cameraNormalMatrix:vd,cameraPosition:Nd,cameraProjectionMatrix:bd,cameraProjectionMatrixInverse:xd,cameraViewMatrix:Td,cameraViewport:Sd,cameraWorldMatrix:_d,cbrt:nu,cdl:Hx,ceil:No,checker:pv,cineonToneMapping:sT,clamp:uu,clearcoat:Hn,clearcoatNormalView:cc,clearcoatRoughness:qn,clipSpace:qd,code:hT,color:mn,colorSpaceToWorking:$u,colorToDirection:e=>en(e).mul(2).sub(1),compute:al,computeKernel:nl,computeSkinning:(e,t=null)=>{const r=new _p(e);return r.positionNode=ap(new j(e.geometry.getAttribute("position").array,3),"vec3").setPBO(!0).toReadOnly().element(lp).toVar(),r.skinIndexNode=ap(new j(new Uint32Array(e.geometry.getAttribute("skinIndex").array),4),"uvec4").setPBO(!0).toReadOnly().element(lp).toVar(),r.skinWeightNode=ap(new j(e.geometry.getAttribute("skinWeight").array,4),"vec4").setPBO(!0).toReadOnly().element(lp).toVar(),r.bindMatrixNode=Na(e.bindMatrix,"mat4"),r.bindMatrixInverseNode=Na(e.bindMatrixInverse,"mat4"),r.boneMatricesNode=Il(e.skeleton.boneMatrices,"mat4",e.skeleton.bones.length),r.toPositionNode=t,en(r)},context:vu,convert:Un,convertColorSpace:(e,t,r)=>new Gu(en(e),t,r),convertToTexture:(e,...t)=>e.isSampleNode||e.isTextureNode?e:e.isPassNode?e.getTextureNode():cx(e,...t),cos:Eo,countLeadingZeros:fb,countOneBits:yb,countTrailingZeros:mb,cross:Jo,cubeTexture:Cc,cubeTextureBase:wc,dFdx:Io,dFdy:Oo,dashSize:oa,debug:xl,decrement:ro,decrementBefore:eo,defaultBuildStages:ni,defaultShaderStages:ii,defined:Yi,degrees:mo,deltaTime:Db,densityFogFactor:yT,depth:Jp,depthPass:(e,t,r)=>new Jx(Jx.DEPTH,e,t,r),determinant:Wo,difference:Yo,diffuseColor:kn,diffuseContribution:Gn,directPointLight:cv,directionToColor:uh,directionToFaceDirection:sc,dispersion:ma,disposeShadowMaterial:V_,distance:Qo,div:Da,dot:Zo,drawIndex:pp,dynamicBufferAttribute:(e,t=null,r=0,s=0)=>el(e,t,r,s,x),element:Dn,emissive:zn,equal:Ia,equirectUV:Sg,exp:fo,exp2:yo,exponentialHeightFogFactor:bT,expression:gl,faceDirection:rc,faceForward:hu,faceforward:yu,float:fn,floatBitsToInt:e=>new db(e,"int","float"),floatBitsToUint:hb,floor:vo,fog:xT,fract:Ro,frameGroup:xa,frameId:Ub,frontFacing:tc,fwidth:zo,gain:(e,t)=>e.lessThan(.5)?xb(e.mul(2),t).div(2):La(1,xb(Pa(La(1,e),2),t).div(2)),gapSize:ua,getConstNodeType:Zi,getCurrentStack:hn,getDirection:tf,getDistanceAttenuation:dv,getGeometryRoughness:qg,getNormalFromDepth:gx,getParallaxCorrectNormal:oN,getRoughness:jg,getScreenPosition:px,getShIrradianceAt:uN,getShadowMaterial:O_,getShadowRenderObjectFunction:z_,getTextureIndex:ob,getViewPosition:hx,ggxConvolution:df,globalId:wT,glsl:(e,t)=>hT(e,t,"glsl"),glslFn:(e,t)=>gT(e,t,"glsl"),grayscale:kx,greaterThan:ka,greaterThanEqual:za,hash:bb,highpModelNormalViewMatrix:Hd,highpModelViewMatrix:Wd,hue:$x,increment:to,incrementBefore:Ja,inspector:vl,instance:mp,instanceIndex:lp,instancedArray:(e,t="float")=>{let r,s;!0===t.isStruct?(r=t.layout.getLength(),s=Ws("float")):(r=Hs(t),s=Ws(t));const i=new Tx(e,r,s);return ap(i,t,i.count)},instancedBufferAttribute:rl,instancedDynamicBufferAttribute:sl,instancedMesh:yp,int:yn,intBitsToFloat:e=>new db(e,"float","int"),interleavedGradientNoise:mx,inverse:Ho,inverseSqrt:_o,inversesqrt:bu,invocationLocalIndex:hp,invocationSubgroupIndex:cp,ior:da,iridescence:Kn,iridescenceIOR:Qn,iridescenceThickness:Yn,isolate:ul,ivec2:_n,ivec3:Rn,ivec4:Cn,js:(e,t)=>hT(e,t,"js"),label:Eu,length:Po,lengthSq:au,lessThan:Va,lessThanEqual:Ga,lightPosition:g_,lightProjectionUV:p_,lightShadowMatrix:h_,lightTargetDirection:y_,lightTargetPosition:m_,lightViewPosition:f_,lightingContext:Pp,lights:(e=[])=>(new __).setLights(e),linearDepth:eg,linearToneMapping:tT,localId:CT,log:bo,log2:xo,logarithmicDepthToViewZ:(e,t,r)=>{const s=e.mul(bo(r.div(t)));return fn(Math.E).pow(s).mul(t).negate()},luminance:Wx,mat2:Fn,mat3:Ln,mat4:Pn,matcapUV:Xf,materialAO:ep,materialAlphaTest:bh,materialAnisotropy:Ih,materialAnisotropyVector:tp,materialAttenuationColor:Hh,materialAttenuationDistance:Wh,materialClearcoat:Bh,materialClearcoatNormal:Lh,materialClearcoatRoughness:Fh,materialColor:xh,materialDispersion:Zh,materialEmissive:_h,materialEnvIntensity:Tc,materialEnvRotation:_c,materialIOR:$h,materialIridescence:Oh,materialIridescenceIOR:Vh,materialIridescenceThickness:kh,materialLightMap:Jh,materialLineDashOffset:Qh,materialLineDashSize:jh,materialLineGapSize:Xh,materialLineScale:qh,materialLineWidth:Kh,materialMetalness:Ch,materialNormal:Mh,materialOpacity:vh,materialPointSize:Yh,materialReference:Dc,materialReflectivity:Eh,materialRefractionRatio:xc,materialRotation:Ph,materialRoughness:wh,materialSheen:Dh,materialSheenRoughness:Uh,materialShininess:Th,materialSpecular:Nh,materialSpecularColor:Rh,materialSpecularIntensity:Sh,materialSpecularStrength:Ah,materialThickness:zh,materialTransmission:Gh,max:jo,maxMipLevel:Cl,mediumpModelViewMatrix:$d,metalness:Wn,min:qo,mix:ou,mixElement:gu,mod:Ua,modInt:so,modelDirection:Pd,modelNormalMatrix:kd,modelPosition:Ud,modelRadius:Vd,modelScale:Id,modelViewMatrix:zd,modelViewPosition:Od,modelViewProjection:rp,modelWorldMatrix:Dd,modelWorldMatrixInverse:Gd,morphReference:Mp,mrt:lb,mul:Pa,mx_aastep:iN,mx_add:(e,t=fn(0))=>Fa(e,t),mx_atan2:(e=fn(0),t=fn(1))=>Bo(e,t),mx_cell_noise_float:(e=Rl())=>kv(e.convert("vec2|vec3")),mx_contrast:(e,t=1,r=.5)=>fn(e).sub(r).mul(t).add(r),mx_divide:(e,t=fn(1))=>Da(e,t),mx_fractal_noise_float:(e=Rl(),t=3,r=2,s=.5,i=1)=>zv(e,yn(t),r,s).mul(i),mx_fractal_noise_vec2:(e=Rl(),t=3,r=2,s=.5,i=1)=>Wv(e,yn(t),r,s).mul(i),mx_fractal_noise_vec3:(e=Rl(),t=3,r=2,s=.5,i=1)=>$v(e,yn(t),r,s).mul(i),mx_fractal_noise_vec4:(e=Rl(),t=3,r=2,s=.5,i=1)=>Hv(e,yn(t),r,s).mul(i),mx_frame:()=>Ub,mx_heighttonormal:(e,t)=>(e=Sn(e),t=fn(t),mh(e,t)),mx_hsvtorgb:tN,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=fn(1))=>La(t,e),mx_modulo:(e,t=fn(1))=>Ua(e,t),mx_multiply:(e,t=fn(1))=>Pa(e,t),mx_noise_float:(e=Rl(),t=1,r=0)=>Ov(e.convert("vec2|vec3")).mul(t).add(r),mx_noise_vec3:(e=Rl(),t=1,r=0)=>Vv(e.convert("vec2|vec3")).mul(t).add(r),mx_noise_vec4:(e=Rl(),t=1,r=0)=>{e=e.convert("vec2|vec3");return wn(Vv(e),Ov(e.add(Tn(19,73)))).mul(t).add(r)},mx_place2d:(e,t=Tn(.5,.5),r=Tn(1,1),s=fn(0),i=Tn(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=Tn(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=fn(1))=>eu(e,t),mx_ramp4:(e,t,r,s,i=Rl())=>{const n=i.x.clamp(),a=i.y.clamp(),o=ou(e,t,n),u=ou(r,s,n);return ou(o,u,a)},mx_ramplr:(e,t,r=Rl())=>nN(e,t,r,"x"),mx_ramptb:(e,t,r=Rl())=>nN(e,t,r,"y"),mx_rgbtohsv:rN,mx_rotate2d:(e,t)=>{e=Tn(e);const r=(t=fn(t)).mul(Math.PI/180);return Zf(e,r)},mx_rotate3d:(e,t,r)=>{e=Sn(e),t=fn(t),r=Sn(r);const s=t.mul(Math.PI/180),i=r.normalize(),n=s.cos(),a=s.sin(),o=fn(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=fn(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=Rl())=>aN(e,t,r,s,"x"),mx_splittb:(e,t,r,s=Rl())=>aN(e,t,r,s,"y"),mx_srgb_texture_to_lin_rec709:sN,mx_subtract:(e,t=fn(0))=>La(e,t),mx_timer:()=>Pb,mx_transform_uv:(e=1,t=0,r=Rl())=>r.mul(e).add(t),mx_unifiednoise2d:(e,t=Rl(),r=Tn(1,1),s=Tn(0,0),i=1,n=0,a=1,o=!1,u=1,l=2,d=.5)=>Jv(e,t.convert("vec2|vec3"),r,s,i,n,a,o,u,l,d),mx_unifiednoise3d:(e,t=Rl(),r=Tn(1,1),s=Tn(0,0),i=1,n=0,a=1,o=!1,u=1,l=2,d=.5)=>eN(e,t.convert("vec2|vec3"),r,s,i,n,a,o,u,l,d),mx_worley_noise_float:(e=Rl(),t=1)=>Qv(e.convert("vec2|vec3"),t,yn(1)),mx_worley_noise_vec2:(e=Rl(),t=1)=>Yv(e.convert("vec2|vec3"),t,yn(1)),mx_worley_noise_vec3:(e=Rl(),t=1)=>Zv(e.convert("vec2|vec3"),t,yn(1)),negate:Do,neutralToneMapping:dT,nodeArray:sn,nodeImmutable:an,nodeObject:en,nodeObjectIntent:tn,nodeObjects:rn,nodeProxy:nn,nodeProxyIntent:on,normalFlat:ac,normalGeometry:ic,normalLocal:nc,normalMap:ch,normalView:lc,normalViewGeometry:oc,normalWorld:dc,normalWorldGeometry:uc,normalize:So,not:Ha,notEqual:Oa,numWorkgroups:AT,objectDirection:Ed,objectGroup:_a,objectPosition:Cd,objectRadius:Fd,objectScale:Md,objectViewPosition:Bd,objectWorldMatrix:wd,oneMinus:Uo,or:Wa,orthographicDepthToViewZ:jp,oscSawtooth:(e=Pb)=>e.fract(),oscSine:(e=Pb)=>e.add(.75).mul(2*Math.PI).sin().mul(.5).add(.5),oscSquare:(e=Pb)=>e.fract().round(),oscTriangle:(e=Pb)=>e.add(.5).fract().mul(2).sub(1).abs(),output:aa,outputStruct:sb,overloadingFn:Lb,packHalf2x16:Nb,packSnorm2x16:_b,packUnorm2x16:vb,parabola:xb,parallaxDirection:ah,parallaxUV:(e,t)=>e.sub(ah.mul(t)),parameter:(e,t)=>new Yy(e,t),pass:(e,t,r)=>new Jx(Jx.COLOR,e,t,r),passTexture:(e,t)=>new Yx(e,t),pcurve:(e,t,r)=>eu(Da(eu(e,t),Fa(eu(e,t),eu(La(1,e),r))),1/t),perspectiveDepthToViewZ:Qp,pmremTexture:Lf,pointShadow:uv,pointUV:Nx,pointWidth:la,positionGeometry:jd,positionLocal:Xd,positionPrevious:Kd,positionView:Zd,positionViewDirection:Jd,positionWorld:Qd,positionWorldDirection:Yd,posterize:qx,pow:eu,pow2:tu,pow3:ru,pow4:su,premultiplyAlpha:pg,property:On,quadBroadcast:l_,quadSwapDiagonal:s_,quadSwapX:t_,quadSwapY:r_,radians:go,rand:pu,range:NT,rangeFogFactor:fT,reciprocal:ko,reference:Fc,referenceBuffer:Lc,reflect:Ko,reflectVector:Sc,reflectView:vc,reflector:e=>new sx(e),refract:du,refractVector:Rc,refractView:Nc,reinhardToneMapping:rT,remap:hl,renderGroup:Ta,renderOutput:yl,rendererReference:ju,replaceDefaultUV:function(e,t=null){return vu(t,{getUV:"function"==typeof e?e:()=>e})},rotate:Zf,rotateUV:Ib,roughness:$n,round:Vo,rtt:cx,sRGBTransferEOTF:Ou,sRGBTransferOETF:Vu,sample:(e,t=null)=>new yx(e,en(t)),sampler:e=>(!0===e.isNode?e:Pl(e)).convert("sampler"),samplerComparison:e=>(!0===e.isNode?e:Pl(e)).convert("samplerComparison"),saturate:lu,saturation:Gx,screenCoordinate:Kl,screenDPR:ql,screenSize:Xl,screenUV:jl,select:Tu,setCurrentStack:cn,setName:Su,shaderStages:ai,shadow:K_,shadowPositionWorld:N_,shapeCircle:gv,sharedUniformGroup:ba,sheen:jn,sheenRoughness:Xn,shiftLeft:Ya,shiftRight:Za,shininess:na,sign:Lo,sin:Ao,sinc:(e,t)=>Ao(oo.mul(t.mul(e).sub(1))).div(oo.mul(t.mul(e).sub(1))),skinning:vp,smoothstep:cu,smoothstepElement:mu,specularColor:ra,specularColorBlended:sa,specularF90:ia,spherizeUV:Ob,split:(e,t)=>new fi(en(e),t),spritesheetUV:Gb,sqrt:To,stack:Jy,step:Xo,stepElement:fu,storage:ap,storageBarrier:()=>FT("storage").toStack(),storageTexture:Mx,string:(e="")=>new _i(e,"string"),struct:(e,t=null)=>{const r=new eb(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;eLx(e,t).level(r),texture3DLoad:(...e)=>Lx(...e).setSampler(!1),textureBarrier:()=>FT("texture").toStack(),textureBicubic:Rm,textureBicubicLevel:Sm,textureCubeUV:rf,textureLevel:(e,t,r)=>Pl(e,t).level(r),textureLoad:Dl,textureSize:El,textureStore:(e,t,r)=>{let s;return!0===e.isStorageTextureNode?(s=e.clone(),s.uvNode=t,s.storeNode=r):s=Mx(e,t,r),null!==r&&s.toStack(),s},thickness:ha,time:Pb,toneMapping:Ku,toneMappingExposure:Qu,toonOutlinePass:(t,r,s=new e(0,0,0),i=.003,n=1)=>new eT(t,r,en(s),en(i),en(n)),transformDirection:iu,transformNormal:hc,transformNormalToView:pc,transformedClearcoatNormalView:fc,transformedNormalView:gc,transformedNormalWorld:mc,transmission:ca,transpose:$o,triNoise3D:Mb,triplanarTexture:(...e)=>zb(...e),triplanarTextures:zb,trunc:Go,uint:bn,uintBitsToFloat:e=>new db(e,"float","uint"),uniform:Na,uniformArray:kl,uniformCubeTexture:(e=Ac)=>wc(e),uniformFlow:Nu,uniformGroup:ya,uniformTexture:(e=Bl)=>Pl(e),unpackHalf2x16:Eb,unpackNormal:lh,unpackSnorm2x16:Rb,unpackUnorm2x16:Ab,unpremultiplyAlpha:gg,userData:(e,t,r)=>new Px(e,t,r),uv:Rl,uvec2:vn,uvec3:An,uvec4:Mn,varying:Uu,varyingProperty:Vn,vec2:Tn,vec3:Sn,vec4:wn,vectorComponents:oi,velocity:Vx,vertexColor:og,vertexIndex:up,vertexStage:Iu,vibrance:zx,viewZToLogarithmicDepth:Yp,viewZToOrthographicDepth:qp,viewZToPerspectiveDepth:Xp,viewZToReversedOrthographicDepth:(e,t,r)=>e.add(r).div(r.sub(t)),viewZToReversedPerspectiveDepth:Kp,viewport:Ql,viewportCoordinate:Zl,viewportDepthTexture:Wp,viewportLinearDepth:tg,viewportMipTexture:Vp,viewportOpaqueMipTexture:Gp,viewportResolution:ed,viewportSafeUV:kb,viewportSharedTexture:Kx,viewportSize:Yl,viewportTexture:Op,viewportUV:Jl,vogelDiskSample:fx,wgsl:(e,t)=>hT(e,t,"wgsl"),wgslFn:(e,t)=>gT(e,t,"wgsl"),workgroupArray:(e,t)=>new PT("Workgroup",e,t),workgroupBarrier:()=>FT("workgroup").toStack(),workgroupId:ET,workingToColorSpace:zu,xor:qa});const dN=new Qy;class cN extends xy{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(dN),dN.a=s._clearColor.a;else if(!0===i.isColor)i.getRGB(dN),dN.a=1,n=!0;else if(!0===i.isNode){const u=this.get(e),l=i;dN.copy(s._clearColor);let d=u.backgroundMesh;if(void 0===d){const h=wn(l).mul(Ex).context({getUV:()=>wx.mul(uc),getTextureLevel:()=>Ax}),p=bd.element(3).element(3).equal(1),g=Da(1,bd.element(1).element(1)).mul(3),m=p.select(Xd.mul(g),Xd),f=zd.mul(wn(m,0));let y=bd.mul(wn(f.xyz,1));y=y.setZ(y.w);const b=new mg;function x(){i.removeEventListener("dispose",x),d.material.dispose(),d.geometry.dispose()}b.name="Background.material",b.side=L,b.depthTest=!1,b.depthWrite=!1,b.allowOverride=!1,b.fog=!1,b.lights=!1,b.vertexNode=y,b.colorNode=h,u.backgroundMeshNode=h,u.backgroundMesh=d=new ue(new mt(1,32,32),b),d.frustumCulled=!1,d.name="Background.mesh",i.addEventListener("dispose",x)}const c=l.getCacheKey();u.backgroundCacheKey!==c&&(u.backgroundMeshNode.node=wn(l).mul(Ex),u.backgroundMeshNode.needsUpdate=!0,d.material.needsUpdate=!0,u.backgroundCacheKey=c),t.unshift(d,d.geometry,d.material,0,0,null,null)}else o("Renderer: Unsupported background configuration.",i);const a=s.xr.getEnvironmentBlendMode();if("additive"===a?dN.set(0,0,0,1):"alpha-blend"===a&&dN.set(0,0,0,0),!0===s.autoClear||!0===n){const T=r.clearColorValue;T.r=dN.r,T.g=dN.g,T.b=dN.b,T.a=dN.a,!0!==s.backend.isWebGLBackend&&!0!==s.alpha||(T.r*=T.a,T.g*=T.a,T.b*=T.a),r.depthClearValue=s.getClearDepth(),r.stencilClearValue=s.getClearStencil(),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 hN=0;class pN{constructor(e="",t=[]){this.name=e,this.bindings=t,this.id=hN++}}class gN{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 pN(t.name,[]);e.push(r);for(const e of t.bindings)r.bindings.push(e.clone())}else e.push(t)}return e}}class mN{constructor(e,t,r=null){this.isNodeAttribute=!0,this.name=e,this.type=t,this.node=r}}class fN{constructor(e,t,r){this.isNodeUniform=!0,this.name=e,this.type=t,this.node=r}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 yN{constructor(e,t,r=!1,s=null){this.isNodeVar=!0,this.name=e,this.type=t,this.readOnly=r,this.count=s}}class bN extends yN{constructor(e,t,r=null,s=null){super(e,t),this.needsInterpolation=!1,this.isNodeVarying=!0,this.interpolationType=r,this.interpolationSampling=s}}class xN{constructor(e,t,r=""){this.name=e,this.type=t,this.code=r,Object.defineProperty(this,"isNodeCode",{value:!0})}}let TN=0;class _N{constructor(e=null){this.id=TN++,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 vN{constructor(e,t){this.name=e,this.members=t,this.output=!1}}class NN{constructor(e,t){this.name=e,this.value=t,this.boundary=0,this.itemSize=0,this.offset=0,this.index=-1}setValue(e){this.value=e}getValue(){return this.value}}class SN extends NN{constructor(e,t=0){super(e,t),this.isNumberUniform=!0,this.boundary=4,this.itemSize=1}}class RN extends NN{constructor(e,r=new t){super(e,r),this.isVector2Uniform=!0,this.boundary=8,this.itemSize=2}}class AN extends NN{constructor(e,t=new r){super(e,t),this.isVector3Uniform=!0,this.boundary=16,this.itemSize=3}}class EN extends NN{constructor(e,t=new s){super(e,t),this.isVector4Uniform=!0,this.boundary=16,this.itemSize=4}}class wN extends NN{constructor(t,r=new e){super(t,r),this.isColorUniform=!0,this.boundary=16,this.itemSize=3}}class CN extends NN{constructor(e,t=new i){super(e,t),this.isMatrix2Uniform=!0,this.boundary=8,this.itemSize=4}}class MN extends NN{constructor(e,t=new n){super(e,t),this.isMatrix3Uniform=!0,this.boundary=48,this.itemSize=12}}class BN extends NN{constructor(e,t=new a){super(e,t),this.isMatrix4Uniform=!0,this.boundary=64,this.itemSize=16}}class FN extends SN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class LN extends RN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class PN extends AN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class DN extends EN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class UN extends wN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class IN extends CN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class ON extends MN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class VN extends BN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}let kN=0;const GN=new WeakMap,zN=new WeakMap,$N=new Map([[Int8Array,"int"],[Int16Array,"int"],[Int32Array,"int"],[Uint8Array,"uint"],[Uint16Array,"uint"],[Uint32Array,"uint"],[Float32Array,"float"]]),WN=e=>/e/g.test(e)?String(e).replace(/\+/g,""):(e=Number(e))+(e%1?"":".0");class HN{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.types={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=Jy(),this.stacks=[],this.tab="\t",this.currentFunctionNode=null,this.context={material:this.material},this.cache=new _N,this.globalCache=this.cache,this.flowsData=new WeakMap,this.shaderStage=null,this.buildStage=null,this.subBuildLayers=[],this.activeStacks=[],this.subBuildFn=null,this.fnCall=null,Object.defineProperty(this,"id",{value:kN++})}isFlatShading(){return!0===this.material.flatShading||!1===this.geometry.hasAttribute("normal")}isOpaque(){const e=this.material;return!1===e.transparent&&e.blending===et&&!1===e.alphaToCoverage}createRenderTarget(e,t,r){return new ae(e,t,r)}createCubeRenderTarget(e,t){return new Rg(e,t)}includes(e){return this.nodes.includes(e)}getOutputStructName(){}_getBindGroup(e,t){const r=t[0].groupNode;let s,i=r.shared;if(i)for(let e=1;ee.nodeUniform.node.id-t.nodeUniform.node.id);for(const t of e.uniforms)r+=t.nodeUniform.node.id}else r+=e.nodeUniform.id;const i=this.renderer._currentRenderContext||this.renderer;let n=GN.get(i);void 0===n&&(n=new Map,GN.set(i,n));const a=Os(r);s=n.get(a),void 0===s&&(s=new pN(e,t),n.set(a,s))}else s=new pN(e,t);return s}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 ai)for(const s in r[e]){const i=r[e][s],n=t[s]||(t[s]=[]);for(const e of i)!1===n.includes(e)&&n.push(e)}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")}( ${WN(n.r)}, ${WN(n.g)}, ${WN(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 mN(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===R)return"int";if(t===S)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=$s(e);const s="float"===t?"":t[0];return!0===/mat2/.test(t)&&(r=r.replace("vec","mat")),s+r}getTypeFromArray(e){return $N.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 bt||!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")}setActiveStack(e){this.activeStacks.push(e)}removeActiveStack(e){if(this.activeStacks[this.activeStacks.length-1]!==e)throw new Error("NodeBuilder: Invalid active stack removal.");this.activeStacks.pop()}getActiveStack(){return this.activeStacks[this.activeStacks.length-1]}getBaseStack(){return this.activeStacks[0]}addStack(){this.stack=Jy(this.stack);const e=hn();return this.stacks.push(e),cn(this.stack),this.stack}removeStack(){const e=this.stack;for(const t of e.nodes){this.getDataFromNode(t).stack=e}return this.stack=e.parent,cn(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,"vertex");let s=r.bufferAttribute;if(void 0===s){const i=this.uniforms.index++;s=new mN("nodeAttribute"+i,t,e),this.bufferAttributes.push(s),r.bufferAttribute=s}return s}getStructTypeNode(e,t=this.shaderStage){return this.types[t][e]||null}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 a=this.structs.index++;null===r&&(r="StructType"+a),n=new vN(r,t),this.structs[s].push(n),this.types[s][r]=e,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 fN(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 yN(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 bN(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,d(`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 xN("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 pT,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 Yy(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 _N,this.stack=Jy();for(const r of ni)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(){d("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(){d("Abstract function.")}getVaryings(){d("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(){d("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(){d("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&&(o(`NodeMaterial: Material "${t.type}" is not compatible.`),e=new mg),e.build(this)}else this.addFlow("compute",e);for(const e of ni){this.setBuildStage(e),this.context.position&&this.context.position.isNode&&this.flowNodeFromShaderStage("vertex",this.context.position);for(const t of ai){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}async buildAsync(){const{object:e,material:t,renderer:r}=this;if(null!==t){let e=r.library.fromMaterial(t);null===e&&(o(`NodeMaterial: Material "${t.type}" is not compatible.`),e=new mg),e.build(this)}else this.addFlow("compute",e);for(const e of ni){this.setBuildStage(e),this.context.position&&this.context.position.isNode&&this.flowNodeFromShaderStage("vertex",this.context.position);for(const t of ai){this.setShaderStage(t);const r=this.flowNodes[t];for(const t of r)"generate"===e?this.flowNode(t):t.build(this);await xt()}}return this.setBuildStage(null),this.setShaderStage(null),this.buildCode(),this.buildUpdateNodes(),this}getSharedDataFromNode(e){let t=zN.get(e);return void 0===t&&(t={}),t}getNodeUniform(e,t){const r=this.getSharedDataFromNode(e);let s=r.cache;if(void 0===s){if("float"===t||"int"===t||"uint"===t)s=new FN(e);else if("vec2"===t||"ivec2"===t||"uvec2"===t)s=new LN(e);else if("vec3"===t||"ivec3"===t||"uvec3"===t)s=new PN(e);else if("vec4"===t||"ivec4"===t||"uvec4"===t)s=new DN(e);else if("color"===t)s=new UN(e);else if("mat2"===t)s=new IN(e);else if("mat3"===t)s=new ON(e);else{if("mat4"!==t)throw new Error(`Uniform "${t}" not implemented.`);s=new VN(e)}r.cache=s}return s}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${Tt} - Node System\n`}needsPreviousData(){const e=this.renderer.getMRT();return e&&e.has("velocity")||!0===Qs(this.object).useVelocity}}class qN{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={renderId:0,frameId:0},e.set(t,r)),r}updateBeforeNode(e){const t=e.getUpdateBeforeType(),r=e.updateReference(this);if(t===ti.FRAME){const t=this._getMaps(this.updateBeforeMap,r);if(t.frameId!==this.frameId){const r=t.frameId;t.frameId=this.frameId,!1===e.updateBefore(this)&&(t.frameId=r)}}else if(t===ti.RENDER){const t=this._getMaps(this.updateBeforeMap,r);if(t.renderId!==this.renderId){const r=t.renderId;t.renderId=this.renderId,!1===e.updateBefore(this)&&(t.renderId=r)}}else t===ti.OBJECT&&e.updateBefore(this)}updateAfterNode(e){const t=e.getUpdateAfterType(),r=e.updateReference(this);if(t===ti.FRAME){const t=this._getMaps(this.updateAfterMap,r);t.frameId!==this.frameId&&!1!==e.updateAfter(this)&&(t.frameId=this.frameId)}else if(t===ti.RENDER){const t=this._getMaps(this.updateAfterMap,r);t.renderId!==this.renderId&&!1!==e.updateAfter(this)&&(t.renderId=this.renderId)}else t===ti.OBJECT&&e.updateAfter(this)}updateNode(e){const t=e.getUpdateType(),r=e.updateReference(this);if(t===ti.FRAME){const t=this._getMaps(this.updateMap,r);t.frameId!==this.frameId&&!1!==e.update(this)&&(t.frameId=this.frameId)}else if(t===ti.RENDER){const t=this._getMaps(this.updateMap,r);t.renderId!==this.renderId&&!1!==e.update(this)&&(t.renderId=this.renderId)}else t===ti.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 jN{constructor(e,t,r=null,s="",i=!1){this.type=e,this.name=t,this.count=r,this.qualifier=s,this.isConst=i}}jN.isNodeFunctionInput=!0;class XN extends lv{static get type(){return"AmbientLightNode"}constructor(e=null){super(e)}setup({context:e}){e.irradiance.addAssign(this.colorNode)}}class KN extends lv{static get type(){return"DirectionalLightNode"}constructor(e=null){super(e)}setupDirect(){const e=this.colorNode;return{lightDirection:y_(this.light),lightColor:e}}}class QN extends lv{static get type(){return"HemisphereLightNode"}constructor(t=null){super(t),this.lightPositionNode=g_(t),this.lightDirectionNode=this.lightPositionNode.normalize(),this.groundColorNode=Na(new e).setGroup(Ta)}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=dc.dot(s).mul(.5).add(.5),n=ou(r,t,i);e.context.irradiance.addAssign(n)}}class YN extends lv{static get type(){return"SpotLightNode"}constructor(e=null){super(e),this.coneCosNode=Na(0).setGroup(Ta),this.penumbraCosNode=Na(0).setGroup(Ta),this.cutoffDistanceNode=Na(0).setGroup(Ta),this.decayExponentNode=Na(0).setGroup(Ta),this.colorNode=Na(this.color).setGroup(Ta)}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 cu(r,s,t)}getLightCoord(e){const t=e.getNodeProperties(this);let r=t.projectionUV;return void 0===r&&(r=p_(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(y_(i)),u=this.getSpotAttenuation(e,o),l=n.length(),d=dv({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=Pl(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 ZN extends YN{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=Pl(r,Tn(e,0),0).r}else s=super.getSpotAttenuation(t);return s}}class JN extends lv{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=kl(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=uN(dc,this.lightProbe);e.context.irradiance.addAssign(t)}}const eS=dn(([e,t])=>{const r=e.abs().sub(t);return Po(jo(r,0)).add(qo(jo(r.x,r.y),0))});class tS extends YN{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=fn(0),r=this.penumbraCosNode,s=h_(this.light).mul(e.context.positionWorld||Qd);return pn(s.w.greaterThan(0),()=>{const e=s.xyz.div(s.w),i=eS(e.xy.sub(Tn(.5)),Tn(.5)),n=Da(-1,La(1,Mo(r)).sub(1));t.assign(lu(i.mul(-2).mul(n)))}),t}}const rS=new a,sS=new a;let iS=null;class nS extends lv{static get type(){return"RectAreaLightNode"}constructor(e=null){super(e),this.halfHeight=Na(new r).setGroup(Ta),this.halfWidth=Na(new r).setGroup(Ta),this.updateType=ti.RENDER}update(e){super.update(e);const{light:t}=this,r=e.camera.matrixWorldInverse;sS.identity(),rS.copy(t.matrixWorld),rS.premultiply(r),sS.extractRotation(rS),this.halfWidth.value.set(.5*t.width,0,0),this.halfHeight.value.set(0,.5*t.height,0),this.halfWidth.value.applyMatrix4(sS),this.halfHeight.value.applyMatrix4(sS)}setupDirectRectArea(e){let t,r;e.isAvailable("float32Filterable")?(t=Pl(iS.LTC_FLOAT_1),r=Pl(iS.LTC_FLOAT_2)):(t=Pl(iS.LTC_HALF_1),r=Pl(iS.LTC_HALF_2));const{colorNode:s,light:i}=this;return{lightColor:s,lightPosition:f_(i),halfWidth:this.halfWidth,halfHeight:this.halfHeight,ltc_1:t,ltc_2:r}}static setLTC(e){iS=e}}class aS{parseFunction(){d("Abstract function.")}}class oS{constructor(e,t,r="",s=""){this.type=e,this.inputs=t,this.name=r,this.precision=s}getCode(){d("Abstract function.")}}oS.isNodeFunction=!0;const uS=/^\s*(highp|mediump|lowp)?\s*([a-z_0-9]+)\s*([a-z_0-9]+)?\s*\(([\s\S]*?)\)/i,lS=/[a-z_0-9]+/gi,dS="#pragma main";class cS extends oS{constructor(e){const{type:t,inputs:r,name:s,precision:i,inputsCode:n,blockCode:a,headerCode:o}=(e=>{const t=(e=e.trim()).indexOf(dS),r=-1!==t?e.slice(t+12):e,s=r.match(uS);if(null!==s&&5===s.length){const i=s[4],n=[];let a=null;for(;null!==(a=lS.exec(i));)n.push(a);const o=[];let u=0;for(;u{let r=this._createNodeBuilder(e,e.material);try{t?await r.buildAsync():r.build()}catch(s){r=this._createNodeBuilder(e,new mg),t?await r.buildAsync():r.build(),o("TSL: "+s)}return r})().then(e=>(s=this._createNodeBuilderState(e),i.set(n,s),s.usedTimes++,r.nodeBuilderState=s,s));{let t=this._createNodeBuilder(e,e.material);try{t.build()}catch(r){t=this._createNodeBuilder(e,new mg),t.build();let s=r.stackTrace;!s&&r.stack&&(s=new Us(r.stack)),o("TSL: "+r,s)}s=this._createNodeBuilderState(t),i.set(n,s)}}s.usedTimes++,r.nodeBuilderState=s}return s}getForRenderAsync(e){const t=this.getForRender(e,!0);return t.then?t:Promise.resolve(t)}getForRenderDeferred(e){const t=this.get(e);if(void 0!==t.nodeBuilderState)return t.nodeBuilderState;const r=this.getForRenderCacheKey(e),s=this.nodeBuilderCache.get(r);return void 0!==s?(s.usedTimes++,t.nodeBuilderState=s,s):(!0!==t.pendingBuild&&(t.pendingBuild=!0,this._buildQueue.push(()=>this.getForRenderAsync(e).then(()=>{t.pendingBuild=!1})),this._processBuildQueue()),null)}_processBuildQueue(){if(this._buildInProgress||0===this._buildQueue.length)return;this._buildInProgress=!0;this._buildQueue.shift()().then(()=>{this._buildInProgress=!1,this._processBuildQueue()})}delete(e){if(e.isRenderObject){const t=this.get(e).nodeBuilderState;t.usedTimes--,0===t.usedTimes&&this.nodeBuilderCache.delete(this.getForRenderCacheKey(e))}return super.delete(e)}getForCompute(e){const t=this.get(e);let r=t.nodeBuilderState;if(void 0===r){const s=this.backend.createNodeBuilder(e,this.renderer);s.build(),r=this._createNodeBuilderState(s),t.nodeBuilderState=r}return r}_createNodeBuilderState(e){return new gN(e.vertexShader,e.fragmentShader,e.computeShader,e.getAttributesArray(),e.getBindings(),e.updateNodes,e.updateBeforeNodes,e.updateAfterNodes,e.observer,e.transforms)}getEnvironmentNode(e){this.updateEnvironment(e);let t=null;if(e.environmentNode&&e.environmentNode.isNode)t=e.environmentNode;else{const r=this.get(e);r.environmentNode&&(t=r.environmentNode)}return t}getBackgroundNode(e){this.updateBackground(e);let t=null;if(e.backgroundNode&&e.backgroundNode.isNode)t=e.backgroundNode;else{const r=this.get(e);r.backgroundNode&&(t=r.backgroundNode)}return t}getFogNode(e){return this.updateFog(e),e.fogNode||this.get(e).fogNode||null}getCacheKey(e,t){gS[0]=e,gS[1]=t;const r=this.renderer.info.calls,s=this.callHashCache.get(gS)||{};if(s.callId!==r){const i=this.getEnvironmentNode(e),n=this.getFogNode(e);t&&mS.push(t.getCacheKey(!0)),i&&mS.push(i.getCacheKey()),n&&mS.push(n.getCacheKey()),mS.push(this.renderer.getOutputRenderTarget()&&this.renderer.getOutputRenderTarget().multiview?1:0),mS.push(this.renderer.shadowMap.enabled?1:0),mS.push(this.renderer.shadowMap.type),s.callId=r,s.cacheKey=Vs(mS),this.callHashCache.set(gS,s),mS.length=0}return gS[0]=null,gS[1]=null,s.cacheKey}get isToneMappingState(){return!this.renderer.getRenderTarget()}updateBackground(e){const t=this.get(e),r=e.background;if(r){const s=0===e.backgroundBlurriness&&t.backgroundBlurriness>0||e.backgroundBlurriness>0&&0===t.backgroundBlurriness;if(t.background!==r||s){const i=this.getCacheNode("background",r,()=>{if(!0===r.isCubeTexture||r.mapping===he||r.mapping===pe||r.mapping===we){if(e.backgroundBlurriness>0||r.mapping===we)return Lf(r);{let e;return e=!0===r.isCubeTexture?Cc(r):Pl(r),Mg(e)}}if(!0===r.isTexture)return Pl(r,jl.flipY()).setUpdateMatrix(!0);!0!==r.isColor&&o("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=Fc("color","color",r).setGroup(Ta),t=Fc("density","float",r).setGroup(Ta);return xT(e,yT(t))}if(r.isFog){const e=Fc("color","color",r).setGroup(Ta),t=Fc("near","float",r).setGroup(Ta),s=Fc("far","float",r).setGroup(Ta);return xT(e,fT(t,s))}o("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?Cc(r):!0===r.isTexture?Pl(r):void o("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 pS.get(e)!==this.getOutputCacheKey()}getOutputNode(e){const t=this.renderer,r=this.getOutputCacheKey(),s=e.isArrayTexture?Pl(e,jl).depth(zl("gl_ViewID_OVR")).renderOutput(t.toneMapping,t.currentColorSpace):Pl(e,jl).renderOutput(t.toneMapping,t.currentColorSpace);return pS.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 qN,this.nodeBuilderCache=new Map,this.cacheLib={}}}const yS=new nt;class bS{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 AS(i.framebufferWidth,i.framebufferHeight,{format:Ee,type:ke,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=-5&i.layers.mask,a.layers.mask=-3&i.layers.mask;const o=e.parent,u=i.cameras;MS(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 PS(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 DS(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(this._renderTarget,this._mrt),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(){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 fS(this,r),this._animation=new py(this,this._nodes,this.info),this._attributes=new Ry(r,this.info),this._background=new cN(this,this._nodes),this._geometries=new Cy(this._attributes,this.info),this._textures=new Ky(this,r,this.info),this._pipelines=new Uy(r,this._nodes,this.info),this._bindings=new Iy(r,this._nodes,this._textures,this._attributes,this._pipelines,this.info),this._objects=new by(this,this._nodes,this._geometries,this._pipelines,this._bindings,this.info),this._renderLists=new $y(this.lighting),this._bundles=new _S,this._renderContexts=new jy(this),this._animation.start(),this._initialized=!0,this._inspector.init(),e(this)})),this._initPromise}get domElement(){return this._canvasTarget.domElement}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._handleObjectFunction,u=this._compilationPromises;null===r&&(r=e);const l=!0===e.isScene?e:!0===r.isScene?r:IS,d=this.needsFrameBufferTarget&&null===this._renderTarget?this._getFrameBufferTarget():this._renderTarget||this._outputRenderTarget,c=this._renderContexts.get(d,this._mrt),h=this._activeMipmapLevel,p=[];this._currentRenderContext=c,this._currentRenderObjectFunction=this.renderObject,this._handleObjectFunction=this._createObjectPipeline,this._compilationPromises=p,s.renderId++,s.update(),c.depth=this.depth,c.stencil=this.stencil,c.clippingContext||(c.clippingContext=new bS),c.clippingContext.updateGlobal(l,t),l.onBeforeRender(this,e,t,d);const g=this._renderLists.get(l,t);if(g.begin(),this._projectObject(e,t,0,g,c.clippingContext),r!==e&&r.traverseVisible(function(e){e.isLight&&e.layers.test(t.layers)&&g.pushLight(e)}),g.finish(),null!==d){this._textures.updateRenderTarget(d,h);const e=this._textures.get(d);c.textures=e.textures,c.depthTexture=e.depthTexture}else c.textures=null,c.depthTexture=null;r!==e?this._background.update(r,g,c):this._background.update(l,g,c);const m=g.opaque,f=g.transparent,y=g.transparentDoublePass,b=g.lightsNode;!0===this.opaque&&m.length>0&&this._renderObjects(m,t,l,b),!0===this.transparent&&f.length>0&&this._renderTransparents(f,y,t,l,b),s.renderId=i,this._currentRenderContext=n,this._currentRenderObjectFunction=a,this._handleObjectFunction=o,this._compilationPromises=u;for(const e of p){const t=this._objects.get(e.object,e.material,e.scene,e.camera,e.lightsNode,e.renderContext,e.clippingContext,e.passId);t.drawRange=e.object.geometry.drawRange,t.group=e.group,this._geometries.updateForRender(t),await this._nodes.getForRenderAsync(t),this._nodes.updateBefore(t),this._nodes.updateForRender(t),this._bindings.updateForRender(t);const r=[];this._pipelines.getForRender(t,r),r.length>0&&await Promise.all(r),this._nodes.updateAfter(t),await xt()}}async renderAsync(e,t){v('Renderer: "renderAsync()" has been deprecated. Use "render()" and "await renderer.init();" when creating the renderer.'),await this.init(),this.render(e,t)}async waitForGPU(){o("Renderer: waitForGPU() has been removed. Read https://github.com/mrdoob/three.js/issues/32012 for more information.")}set inspector(e){null!==this._inspector&&this._inspector.setRenderer(null),this._inspector=e,this._inspector.setRenderer(this)}get inspector(){return this._inspector}set highPrecision(e){const t=this.contextNode.value;!0===e?(t.modelViewMatrix=Wd,t.modelNormalViewMatrix=Hd):this.highPrecision&&(delete t.modelViewMatrix,delete t.modelNormalViewMatrix)}get highPrecision(){const e=this.contextNode.value;return e.modelViewMatrix===Wd&&e.modelNormalViewMatrix===Hd}setMRT(e){return this._mrt=e,this}getMRT(){return this._mrt}getOutputBufferType(){return this._outputBufferType}getColorBufferType(){return v('Renderer: ".getColorBufferType()" has been renamed to ".getOutputBufferType()".'),this.getOutputBufferType()}_onDeviceLost(e){let t=`THREE.WebGPURenderer: ${e.api} Device Lost:\n\nMessage: ${e.message}`;e.reason&&(t+=`\nReason: ${e.reason}`),o(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{u.removeEventListener("dispose",e),l.dispose(),this._frameBufferTargets.delete(u)};u.addEventListener("dispose",e),this._frameBufferTargets.set(u,l)}const d=this.getOutputRenderTarget();return l.depthBuffer=a,l.stencilBuffer=o,null!==d?l.setSize(d.width,d.height,d.depth):l.setSize(i,n,1),l.viewport.copy(u._viewport),l.scissor.copy(u._scissor),l.viewport.multiplyScalar(u._pixelRatio),l.scissor.multiplyScalar(u._pixelRatio),l.scissorTest=u._scissorTest,l.multiview=null!==d&&d.multiview,l.resolveDepthBuffer=null===d||d.resolveDepthBuffer,l._autoAllocateDepthBuffer=null!==d&&d._autoAllocateDepthBuffer,l}_renderScene(e,t,r=!0){if(!0===this._isDeviceLost)return;const s=r?this._getFrameBufferTarget():null,i=this._nodes.nodeFrame,n=i.renderId,a=this._currentRenderContext,o=this._currentRenderObjectFunction,u=this._handleObjectFunction;this._callDepth++;const l=!0===e.isScene?e:IS,d=this._renderTarget||this._outputRenderTarget,c=this._activeCubeFace,h=this._activeMipmapLevel;let p;null!==s?(p=s,this.setRenderTarget(p)):p=d;const g=this._renderContexts.get(p,this._mrt,this._callDepth);this._currentRenderContext=g,this._currentRenderObjectFunction=this._renderObjectFunction||this.renderObject,this._handleObjectFunction=this._renderObjectDirect,this.info.calls++,this.info.render.calls++,this.info.render.frameCalls++,i.renderId=this.info.calls,this.backend.updateTimeStampUID(g),this.inspector.beginRender(this.backend.getTimestampUID(g),e,t,p);const m=this.xr;if(!1===m.isPresenting){let e=!1;if(!0===this.reversedDepthBuffer&&!0!==t.reversedDepth){if(t._reversedDepth=!0,t.isArrayCamera)for(const e of t.cameras)e._reversedDepth=!0;e=!0}const r=this.coordinateSystem;if(t.coordinateSystem!==r){if(t.coordinateSystem=r,t.isArrayCamera)for(const e of t.cameras)e.coordinateSystem=r;e=!0}if(!0===e&&(t.updateProjectionMatrix(),t.isArrayCamera))for(const e of t.cameras)e.updateProjectionMatrix()}!0===e.matrixWorldAutoUpdate&&e.updateMatrixWorld(),null===t.parent&&!0===t.matrixWorldAutoUpdate&&t.updateMatrixWorld(),!0===m.enabled&&!0===m.isPresenting&&(!0===m.cameraAutoUpdate&&m.updateCamera(t),t=m.getCamera());const f=this._canvasTarget;let y=f._viewport,b=f._scissor,x=f._pixelRatio;null!==p&&(y=p.viewport,b=p.scissor,x=1),this.getDrawingBufferSize(OS),VS.set(0,0,OS.width,OS.height);const T=void 0===y.minDepth?0:y.minDepth,_=void 0===y.maxDepth?1:y.maxDepth;g.viewportValue.copy(y).multiplyScalar(x).floor(),g.viewportValue.width>>=h,g.viewportValue.height>>=h,g.viewportValue.minDepth=T,g.viewportValue.maxDepth=_,g.viewport=!1===g.viewportValue.equals(VS),g.scissorValue.copy(b).multiplyScalar(x).floor(),g.scissor=f._scissorTest&&!1===g.scissorValue.equals(VS),g.scissorValue.width>>=h,g.scissorValue.height>>=h,g.clippingContext||(g.clippingContext=new bS),g.clippingContext.updateGlobal(l,t),l.onBeforeRender(this,e,t,p);const v=t.isArrayCamera?GS:kS;t.isArrayCamera||(zS.multiplyMatrices(t.projectionMatrix,t.matrixWorldInverse),v.setFromProjectionMatrix(zS,t.coordinateSystem,t.reversedDepth));const N=this._renderLists.get(e,t);if(N.begin(),this._projectObject(e,t,0,N,g.clippingContext),N.finish(),!0===this.sortObjects&&N.sort(this._opaqueSort,this._transparentSort),null!==p){this._textures.updateRenderTarget(p,h);const e=this._textures.get(p);g.textures=e.textures,g.depthTexture=e.depthTexture,g.width=e.width,g.height=e.height,g.renderTarget=p,g.depth=p.depthBuffer,g.stencil=p.stencilBuffer}else g.textures=null,g.depthTexture=null,g.width=OS.width,g.height=OS.height,g.depth=this.depth,g.stencil=this.stencil;g.width>>=h,g.height>>=h,g.activeCubeFace=c,g.activeMipmapLevel=h,g.occlusionQueryCount=N.occlusionQueryCount,g.scissorValue.max($S.set(0,0,0,0)),g.scissorValue.x+g.scissorValue.width>g.width&&(g.scissorValue.width=Math.max(g.width-g.scissorValue.x,0)),g.scissorValue.y+g.scissorValue.height>g.height&&(g.scissorValue.height=Math.max(g.height-g.scissorValue.y,0)),this._background.update(l,N,g),g.camera=t,this.backend.beginRender(g);const{bundles:S,lightsNode:R,transparentDoublePass:A,transparent:E,opaque:w}=N;return S.length>0&&this._renderBundles(S,l,R),!0===this.opaque&&w.length>0&&this._renderObjects(w,t,l,R),!0===this.transparent&&E.length>0&&this._renderTransparents(E,A,t,l,R),this.backend.finishRender(g),i.renderId=n,this._currentRenderContext=a,this._currentRenderObjectFunction=o,this._handleObjectFunction=u,this._callDepth--,null!==s&&(this.setRenderTarget(d,c,h),this._renderOutput(p)),l.onAfterRender(this,e,t,p),this.inspector.finishRender(this.backend.getTimestampUID(g)),g}_setXRLayerSize(e,t){this._canvasTarget._width=e,this._canvasTarget._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.capabilities.getMaxAnisotropy()}getActiveCubeFace(){return this._activeCubeFace}getActiveMipmapLevel(){return this._activeMipmapLevel}async setAnimationLoop(e){!1===this._initialized&&await this.init(),this._animation.setAnimationLoop(e)}getAnimationLoop(){return this._animation.getAnimationLoop()}async getArrayBufferAsync(e){return await this.backend.getArrayBufferAsync(e)}getContext(){return this.backend.getContext()}getPixelRatio(){return this._canvasTarget.getPixelRatio()}getDrawingBufferSize(e){return this._canvasTarget.getDrawingBufferSize(e)}getSize(e){return this._canvasTarget.getSize(e)}setPixelRatio(e=1){this._canvasTarget.setPixelRatio(e)}setDrawingBufferSize(e,t,r){this.xr&&this.xr.isPresenting||this._canvasTarget.setDrawingBufferSize(e,t,r)}setSize(e,t,r=!0){this.xr&&this.xr.isPresenting||this._canvasTarget.setSize(e,t,r)}setOpaqueSort(e){this._opaqueSort=e}setTransparentSort(e){this._transparentSort=e}getScissor(e){return this._canvasTarget.getScissor(e)}setScissor(e,t,r,s){this._canvasTarget.setScissor(e,t,r,s)}getScissorTest(){return this._canvasTarget.getScissorTest()}setScissorTest(e){this._canvasTarget.setScissorTest(e),this.backend.setScissorTest(e)}getViewport(e){return this._canvasTarget.getViewport(e)}setViewport(e,t,r,s,i=0,n=1){this._canvasTarget.setViewport(e,t,r,s,i,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!0===this.reversedDepthBuffer?1-this._clearDepth: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)throw new Error('Renderer: .clear() called before the backend is initialized. Use "await renderer.init();" before before using this method.');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.get(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;const t=this.backend.getClearColor();i.clearColorValue.r=t.r,i.clearColorValue.g=t.g,i.clearColorValue.b=t.b,i.clearColorValue.a=t.a,i.clearDepthValue=this.getClearDepth(),i.clearStencilValue=this.getClearStencil(),i.activeCubeFace=this.getActiveCubeFace(),i.activeMipmapLevel=this.getActiveMipmapLevel()}this.backend.clear(e,t,r,i),null!==s&&null===this._renderTarget&&this._renderOutput(s)}clearColor(){this.clear(!0,!1,!1)}clearDepth(){this.clear(!1,!0,!1)}clearStencil(){this.clear(!1,!1,!0)}async clearAsync(e=!0,t=!0,r=!0){v('Renderer: "clearAsync()" has been deprecated. Use "clear()" and "await renderer.init();" when creating the renderer.'),await this.init(),this.clear(e,t,r)}async clearColorAsync(){v('Renderer: "clearColorAsync()" has been deprecated. Use "clearColor()" and "await renderer.init();" when creating the renderer.'),this.clear(!0,!1,!1)}async clearDepthAsync(){v('Renderer: "clearDepthAsync()" has been deprecated. Use "clearDepth()" and "await renderer.init();" when creating the renderer.'),this.clear(!1,!0,!1)}async clearStencilAsync(){v('Renderer: "clearStencilAsync()" has been deprecated. Use "clearStencil()" and "await renderer.init();" when creating the renderer.'),this.clear(!1,!1,!0)}get needsFrameBufferTarget(){const e=this.currentToneMapping!==m,t=this.currentColorSpace!==p.workingColorSpace;return e||t}get samples(){return this._samples}get currentSamples(){let e=this._samples;return null!==this._renderTarget?e=this._renderTarget.samples:this.needsFrameBufferTarget&&(e=0),e}get currentToneMapping(){return this.isOutputTarget?this.toneMapping:m}get currentColorSpace(){return this.isOutputTarget?this.outputColorSpace:p.workingColorSpace}get isOutputTarget(){return this._renderTarget===this._outputRenderTarget||null===this._renderTarget}dispose(){if(!0===this._initialized){this.info.dispose(),this.backend.dispose(),this._animation.dispose(),this._objects.dispose(),this._geometries.dispose(),this._pipelines.dispose(),this._nodes.dispose(),this._bindings.dispose(),this._renderLists.dispose(),this._renderContexts.dispose(),this._textures.dispose();for(const e of this._frameBufferTargets.keys())e.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}setCanvasTarget(e){this._canvasTarget.removeEventListener("resize",this._onCanvasTargetResize),this._canvasTarget=e,this._canvasTarget.addEventListener("resize",this._onCanvasTargetResize)}getCanvasTarget(){return this._canvasTarget}_resetXRState(){this.backend.setXRTarget(null),this.setOutputRenderTarget(null),this.setRenderTarget(null);for(const e of this._frameBufferTargets.keys())e.dispose()}setRenderObjectFunction(e){this._renderObjectFunction=e}getRenderObjectFunction(){return this._renderObjectFunction}compute(e,t=null){if(!0===this._isDeviceLost)return;if(!1===this._initialized)return d("Renderer: .compute() called before the backend is initialized. Try using .computeAsync() instead."),this.computeAsync(e,t);const r=this._nodes.nodeFrame,s=r.renderId;this.info.calls++,this.info.compute.calls++,this.info.compute.frameCalls++,r.renderId=this.info.calls,this.backend.updateTimeStampUID(e),this.inspector.beginCompute(this.backend.getTimestampUID(e),e);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.deleteForCompute(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,this.inspector.finishCompute(this.backend.getTimestampUID(e))}async computeAsync(e,t=null){!1===this._initialized&&await this.init(),this.compute(e,t)}async hasFeatureAsync(e){return v('Renderer: "hasFeatureAsync()" has been deprecated. Use "hasFeature()" and "await renderer.init();" when creating the renderer.'),await this.init(),this.hasFeature(e)}async resolveTimestampsAsync(e="render"){return!1===this._initialized&&await this.init(),this.backend.resolveTimestampsAsync(e)}hasFeature(e){if(!1===this._initialized)throw new Error('Renderer: .hasFeature() called before the backend is initialized. Use "await renderer.init();" before before using this method.');return this.backend.hasFeature(e)}hasInitialized(){return this._initialized}async initTextureAsync(e){v('Renderer: "initTextureAsync()" has been deprecated. Use "initTexture()" and "await renderer.init();" when creating the renderer.'),await this.init(),this.initTexture(e)}initTexture(e){if(!1===this._initialized)throw new Error('Renderer: .initTexture() called before the backend is initialized. Use "await renderer.init();" before before using this method.');this._textures.updateTexture(e)}initRenderTarget(e){if(!1===this._initialized)throw new Error('Renderer: .initRenderTarget() called before the backend is initialized. Use "await renderer.init();" before before using this method.');this._textures.updateRenderTarget(e);const t=this._textures.get(e),r=this._renderContexts.get(e);r.textures=t.textures,r.depthTexture=t.depthTexture,r.width=t.width,r.height=t.height,r.renderTarget=e,r.depth=e.depthBuffer,r.stencil=e.stencilBuffer,this.backend.initRenderTarget(r)}copyFramebufferToTexture(e,t=null){if(null!==t)if(t.isVector2)t=$S.set(t.x,t.y,e.image.width,e.image.height).floor();else{if(!t.isVector4)return void o("Renderer.copyFramebufferToTexture: Invalid rectangle.");t=$S.copy(t).floor()}else t=$S.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),this._inspector.copyFramebufferToTexture(e)}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),this._inspector.copyTextureToTexture(e,t)}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?GS:kS;if(!e.frustumCulled||n.intersectsSprite(e,t)){!0===this.sortObjects&&$S.setFromMatrixPosition(e.matrixWorld).applyMatrix4(zS);const{geometry:t,material:n}=e;n.visible&&s.push(e,t,n,r,$S.z,null,i)}}else if(e.isLineLoop)o("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?GS:kS;if(!e.frustumCulled||n.intersectsObject(e,t)){const{geometry:t,material:n}=e;if(!0===this.sortObjects&&(null===t.boundingSphere&&t.computeBoundingSphere(),$S.copy(t.boundingSphere.center).applyMatrix4(e.matrixWorld).applyMatrix4(zS)),Array.isArray(n)){const a=t.groups;for(let o=0,u=a.length;o0){for(const{material:e}of t)e.side=L;this._renderObjects(t,r,s,i,"backSide");for(const{material:e}of t)e.side=Nt;this._renderObjects(e,r,s,i);for(const{material:e}of t)e.side=P}else this._renderObjects(e,r,s,i)}_renderObjects(e,t,r,s,i=null){for(let n=0,a=e.length;n(t.not().discard(),e))(u)}}e.depthNode&&e.depthNode.isNode&&(l=e.depthNode),e.castShadowPositionNode&&e.castShadowPositionNode.isNode?o=e.castShadowPositionNode:e.positionNode&&e.positionNode.isNode&&(o=e.positionNode),r={version:t,colorNode:u,depthNode:l,positionNode:o},this._cacheShadowNodes.set(e,r)}return r}renderObject(e,t,r,s,i,n,a,o=null,u=null){let l,d,c,h,p=!1;if(e.onBeforeRender(this,t,r,s,i,n),!0===i.allowOverride&&null!==t.overrideMaterial){const e=t.overrideMaterial;if(p=!0,l=e.isNodeMaterial?e.colorNode:null,d=e.isNodeMaterial?e.depthNode:null,c=e.isNodeMaterial?e.positionNode:null,h=t.overrideMaterial.side,i.positionNode&&i.positionNode.isNode&&(e.positionNode=i.positionNode),e.alphaTest=i.alphaTest,e.alphaMap=i.alphaMap,e.transparent=i.transparent||i.transmission>0||i.transmissionNode&&i.transmissionNode.isNode||i.backdropNode&&i.backdropNode.isNode,e.isShadowPassMaterial){const{colorNode:t,depthNode:r,positionNode:s}=this._getShadowNodes(i);this.shadowMap.type===ht?e.side=null!==i.shadowSide?i.shadowSide:i.side:e.side=null!==i.shadowSide?i.shadowSide:WS[i.side],null!==t&&(e.colorNode=t),null!==r&&(e.depthNode=r),null!==s&&(e.positionNode=s)}i=e}!0===i.transparent&&i.side===P&&!1===i.forceSinglePass?(i.side=L,this._handleObjectFunction(e,i,t,r,a,n,o,"backSide"),i.side=Nt,this._handleObjectFunction(e,i,t,r,a,n,o,u),i.side=P):this._handleObjectFunction(e,i,t,r,a,n,o,u),p&&(t.overrideMaterial.colorNode=l,t.overrideMaterial.depthNode=d,t.overrideMaterial.positionNode=c,t.overrideMaterial.side=h),e.onAfterRender(this,t,r,s,i,n)}hasCompatibility(e){if(!1===this._initialized)throw new Error('Renderer: .hasCompatibility() called before the backend is initialized. Use "await renderer.init();" before using this method.');return this.backend.hasCompatibility(e)}_renderObjectDirect(e,t,r,s,i,n,a,o){const u=this._objects.get(e,t,r,s,i,this._currentRenderContext,a,o);if(u.drawRange=e.geometry.drawRange,u.group=n,null!==this._currentRenderBundle){this.backend.get(this._currentRenderBundle).renderObjects.push(u),u.bundle=this._currentRenderBundle.bundleGroup}const l=this._nodes.needsRefresh(u);l&&(this._nodes.updateBefore(u),this._geometries.updateForRender(u),this._nodes.updateForRender(u),this._bindings.updateForRender(u)),this._pipelines.updateForRender(u),this._pipelines.isReady(u)&&(this.backend.draw(u,this.info),l&&this._nodes.updateAfter(u))}_createObjectPipeline(e,t,r,s,i,n,a,o){if(null!==this._compilationPromises)return void this._compilationPromises.push({object:e,material:t,scene:r,camera:s,lightsNode:i,group:n,clippingContext:a,passId:o,renderContext:this._currentRenderContext});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)}_onCanvasTargetResize(){this._initialized&&this.backend.updateSize()}get compile(){return this.compileAsync}}class qS{constructor(e=""){this.name=e,this.visibility=0}setVisibility(e){this.visibility|=e}getVisibility(){return this.visibility}clone(){return Object.assign(new this.constructor,this)}}class jS extends qS{constructor(e,t=null){super(e),this.isBuffer=!0,this.bytesPerElement=Float32Array.BYTES_PER_ELEMENT,this._buffer=t,this._updateRanges=[]}get updateRanges(){return this._updateRanges}addUpdateRange(e,t){this.updateRanges.push({start:e,count:t})}clearUpdateRanges(){this.updateRanges.length=0}get byteLength(){return(e=this._buffer.byteLength)+(Sy-e%Sy)%Sy;var e}get buffer(){return this._buffer}update(){return!0}}class XS extends jS{constructor(e,t=null){super(e,t),this.isUniformBuffer=!0}}let KS=0;class QS extends XS{constructor(e,t){super("UniformBuffer_"+KS++,e?e.value:null),this.nodeUniform=e,this.groupNode=t,this.isNodeUniformBuffer=!0}set updateRanges(e){this.nodeUniform.updateRanges=e}get updateRanges(){return this.nodeUniform.updateRanges}addUpdateRange(e,t){this.nodeUniform.addUpdateRange(e,t)}clearUpdateRanges(){this.nodeUniform.clearUpdateRanges()}get buffer(){return this.nodeUniform.value}}class YS extends XS{constructor(e){super(e),this.isUniformsGroup=!0,this._values=null,this.uniforms=[],this._updateRangeCache=new Map}addUniformUpdateRange(e){const t=e.index;if(!0!==this._updateRangeCache.has(t)){const r=this.updateRanges,s={start:e.offset,count:e.itemSize};r.push(s),this._updateRangeCache.set(t,s)}}clearUpdateRanges(){this._updateRangeCache.clear(),super.clearUpdateRanges()}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.generation=null,this.version=-1},this.texture=t,this.version=t?t.version:-1,this.generation=null,this.samplerKey="",this.isSampler=!0}set texture(e){this._texture!==e&&(this._texture&&this._texture.removeEventListener("dispose",this._onTextureDispose),this._texture=e,this.generation=null,this.version=-1,this._texture&&this._texture.addEventListener("dispose",this._onTextureDispose))}get texture(){return this._texture}update(){const{texture:e,version:t}=this;return t!==e.version&&(this.version=e.version,!0)}clone(){const e=super.clone();return e._texture=null,e._onTextureDispose=()=>{e.generation=null,e.version=-1},e.texture=this.texture,e}}let tR=0;class rR extends eR{constructor(e,t){super(e,t),this.id=tR++,this.store=!1,this.mipLevel=0,this.isSampledTexture=!0}}class sR extends rR{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 iR extends sR{constructor(e,t,r,s=null){super(e,t,r,s),this.isSampledCubeTexture=!0}}class nR extends sR{constructor(e,t,r,s=null){super(e,t,r,s),this.isSampledTexture3D=!0}}const aR={bitcast_int_uint:new cT("uint tsl_bitcast_int_to_uint ( int x ) { return floatBitsToUint( intBitsToFloat ( x ) ); }"),bitcast_uint_int:new cT("uint tsl_bitcast_uint_to_int ( uint x ) { return floatBitsToInt( uintBitsToFloat ( x ) ); }")},oR={textureDimensions:"textureSize",equals:"equal",bitcast_float_int:"floatBitsToInt",bitcast_int_float:"intBitsToFloat",bitcast_uint_float:"uintBitsToFloat",bitcast_float_uint:"floatBitsToUint",bitcast_uint_int:"tsl_bitcast_uint_to_int",bitcast_int_uint:"tsl_bitcast_int_to_uint",floatpack_snorm_2x16:"packSnorm2x16",floatpack_unorm_2x16:"packUnorm2x16",floatpack_float16_2x16:"packHalf2x16",floatunpack_snorm_2x16:"unpackSnorm2x16",floatunpack_unorm_2x16:"unpackUnorm2x16",floatunpack_float16_2x16:"unpackHalf2x16"},uR={low:"lowp",medium:"mediump",high:"highp"},lR={swizzleAssign:!0,storageBuffer:!1},dR={perspective:"smooth",linear:"noperspective"},cR={centroid:"centroid"},hR="\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 highp sampler2DShadow;\nprecision highp sampler2DArrayShadow;\nprecision highp samplerCubeShadow;\n";class pR extends HN{constructor(e,t){super(e,t,new hS),this.uniformGroups={},this.transforms=[],this.extensions={},this.builtins={vertex:[],fragment:[],compute:[]}}needsToWorkingColorSpace(e){return!0===e.isVideoTexture&&e.colorSpace!==T}_include(e){const t=aR[e];return t.build(this),this.addInclude(t),t}getMethod(e){return void 0!==aR[e]&&this._include(e),oR[e]||e}getBitcastMethod(e,t){return this.getMethod(`bitcast_${t}_${e}`)}getFloatPackingMethod(e){return this.getMethod(`floatpack_${e}_2x16`)}getFloatUnpackingMethod(e){return this.getMethod(`floatunpack_${e}_2x16`)}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?He:We;2===s?n=i?Ft:W:3===s?n=i?Lt:Xe:4===s&&(n=i?Pt:Ee);const a={Float32Array:Q,Uint8Array:ke,Uint16Array:ze,Uint32Array:S,Int8Array:Ve,Int16Array:Ge,Int32Array:R,Uint8ClampedArray:ke},o=Math.pow(2,Math.ceil(Math.log2(Math.sqrt(r/s))));let u=Math.ceil(r/s/o);o*u*s0?i:"";t=`${r.name} {\n\t${s} ${e.name}[${n}];\n};\n`}else{const t=e.groupNode.name;if(void 0===s[t]){const e=this.uniformGroups[t];if(void 0!==e){const r=[];for(const t of e.uniforms){const e=t.getType(),s=this.getVectorType(e),i=t.nodeUniform.node.precision;let n=`${s} ${t.name};`;null!==i&&(n=uR[i]+" "+n),r.push("\t"+n)}s[t]=r}}i=!0}if(!i){const s=e.node.precision;null!==s&&(t=uR[s]+" "+t),t="uniform "+t,r.push(t)}}let i="";for(const e in s){const t=s[e];i+=this._getGLSLUniformStruct(e,t.join("\n"))+"\n"}return i+=r.join("\n"),i}getTypeFromAttribute(e){let t=super.getTypeFromAttribute(e);if(/^[iu]/.test(t)&&e.gpuType!==R){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+=`${dR[s.interpolationType]||s.interpolationType} ${cR[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+=`${dR[e.interpolationType]||e.interpolationType} ${cR[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`}getSubgroupSize(){o("GLSLNodeBuilder: WebGLBackend does not support the subgroupSize node")}getInvocationSubgroupIndex(){o("GLSLNodeBuilder: WebGLBackend does not support the invocationSubgroupIndex node")}getSubgroupIndex(){o("GLSLNodeBuilder: WebGLBackend does not support the subgroupIndex node")}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=lR[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)}lR[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 sR(i.name,i.node,s),u.push(a);else if("cubeTexture"===t||"cubeDepthTexture"===t)a=new iR(i.name,i.node,s),u.push(a);else if("texture3D"===t)a=new nR(i.name,i.node,s),u.push(a);else if("buffer"===t){i.name=`buffer${e.id}`;const t=this.getSharedDataFromNode(e);let r=t.buffer;void 0===r&&(e.name=`NodeBuffer_${e.id}`,r=new QS(e,s),r.name=e.name,t.buffer=r),u.push(r),a=r}else{let e=this.uniformGroups[o];void 0===e?(e=new JS(o,s),this.uniformGroups[o]=e,u.push(e)):-1===u.indexOf(e)&&u.push(e),a=this.getNodeUniform(i,t);const r=a.name;e.uniforms.some(e=>e.name===r)||e.addUniform(a)}n.uniformGPU=a}return i}}let gR=null,mR=null;class fR{constructor(e={}){this.parameters=Object.assign({},e),this.data=new WeakMap,this.renderer=null,this.domElement=null,this.timestampQueryPool={[Dt.RENDER]:null,[Dt.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(){}updateSampler(){}createDefaultTexture(){}createTexture(){}updateTexture(){}generateMipmaps(){}destroyTexture(){}async copyTextureToBuffer(){}copyTextureToTexture(){}copyFramebufferToTexture(){}createAttribute(){}createIndexAttribute(){}createStorageAttribute(){}updateAttribute(){}destroyAttribute(){}getContext(){}updateSize(){}updateViewport(){}updateTimeStampUID(e){const t=this.get(e),r=this.renderer.info.frame;let s;s=!0===e.isComputeNode?"c:"+this.renderer.info.compute.frameCalls:"r:"+this.renderer.info.render.frameCalls,t.timestampUID=s+":"+e.id+":f"+r}getTimestampUID(e){return this.get(e).timestampUID}getTimestampFrames(e){const t=this.timestampQueryPool[e];return t?t.getTimestampFrames():[]}_getQueryPool(e){const t=e.startsWith("c:")?Dt.COMPUTE:Dt.RENDER;return this.timestampQueryPool[t]}getTimestamp(e){return this._getQueryPool(e).getTimestamp(e)}hasTimestamp(e){return this._getQueryPool(e).hasTimestamp(e)}isOccluded(){}async resolveTimestampsAsync(e="render"){if(!this.trackTimestamp)return void v("WebGPURenderer: Timestamp tracking is disabled.");const t=this.timestampQueryPool[e];if(!t)return;const r=await t.resolveQueriesAsync();return this.renderer.info[e].timestamp=r,r}async getArrayBufferAsync(){}async hasFeatureAsync(){}hasFeature(){}getDrawingBufferSize(){return gR=gR||new t,this.renderer.getDrawingBufferSize(gR)}setScissorTest(){}getClearColor(){const e=this.renderer;return mR=mR||new Qy,e.getClearColor(mR),mR.getRGB(mR),mR}getDomElement(){let e=this.domElement;return null===e&&(e=void 0!==this.parameters.canvas?this.parameters.canvas:Ut(),"setAttribute"in e&&e.setAttribute("data-engine",`three.js r${Tt} webgpu`),this.domElement=e),e}hasCompatibility(){return!1}initRenderTarget(){}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)}deleteBindGroupData(){}dispose(){}}let yR,bR,xR=0;class TR{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 _R{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===R,id:xR++};if(e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute){const e=this._createBuffer(s,t,i,n);d=new TR(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;e0?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 SR,RR,AR,ER=!1;class wR{constructor(e){this.backend=e,this.gl=e.gl,this.extensions=e.extensions,this.defaultTextures={},this._srcFramebuffer=null,this._dstFramebuffer=null,!1===ER&&(this._init(),ER=!0)}_init(){const e=this.gl;SR={[Gr]:e.REPEAT,[ve]:e.CLAMP_TO_EDGE,[kr]:e.MIRRORED_REPEAT},RR={[B]:e.NEAREST,[zr]:e.NEAREST_MIPMAP_NEAREST,[yt]:e.NEAREST_MIPMAP_LINEAR,[de]:e.LINEAR,[ft]:e.LINEAR_MIPMAP_NEAREST,[Z]:e.LINEAR_MIPMAP_LINEAR},AR={[qr]:e.NEVER,[Hr]:e.ALWAYS,[E]:e.LESS,[w]:e.LEQUAL,[Wr]:e.EQUAL,[M]:e.GEQUAL,[C]:e.GREATER,[$r]: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];d("WebGLBackend: 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?jr:p.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===g?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),r===n.UNSIGNED_INT_10F_11F_11F_REV&&(o=n.R11F_G11F_B10F)}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?jr:p.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===g?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=p.getPrimaries(p.workingColorSpace),a=t.colorSpace===T?null:p.getPrimaries(t.colorSpace),o=t.colorSpace===T||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,SR[t.wrapS]),r.texParameteri(e,r.TEXTURE_WRAP_T,SR[t.wrapT]),e!==r.TEXTURE_3D&&e!==r.TEXTURE_2D_ARRAY||t.isArrayTexture||r.texParameteri(e,r.TEXTURE_WRAP_R,SR[t.wrapR]),r.texParameteri(e,r.TEXTURE_MAG_FILTER,RR[t.magFilter]);const u=void 0!==t.mipmaps&&t.mipmaps.length>0,l=t.minFilter===de&&u?Z:t.minFilter;if(r.texParameteri(e,r.TEXTURE_MIN_FILTER,RR[l]),t.compareFunction&&(r.texParameteri(e,r.TEXTURE_COMPARE_MODE,r.COMPARE_REF_TO_TEXTURE),r.texParameteri(e,r.TEXTURE_COMPARE_FUNC,AR[t.compareFunction])),!0===s.has("EXT_texture_filter_anisotropic")){if(t.magFilter===B)return;if(t.minFilter!==yt&&t.minFilter!==Z)return;if(t.type===Q&&!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.capabilities.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})}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){const t=Xr(s.width,s.height,e.format,e.type);for(const i of e.layerUpdates){const e=s.data.subarray(i*t/s.data.BYTES_PER_ELEMENT,(i+1)*t/s.data.BYTES_PER_ELEMENT);r.texSubImage3D(r.TEXTURE_2D_ARRAY,0,0,0,i,s.width,s.height,1,o,u,e)}e.clearLayerUpdates()}else r.texSubImage3D(r.TEXTURE_2D_ARRAY,0,0,0,0,s.width,s.height,s.depth,o,u,s.data)}else if(e.isData3DTexture){const e=t.image;r.texSubImage3D(r.TEXTURE_3D,0,0,0,0,e.width,e.height,e.depth,o,u,e.data)}else if(e.isVideoTexture)e.update(),r.texImage2D(a,0,l,o,u,t.image);else{const n=e.mipmaps;if(n.length>0)for(let e=0,t=n.length;e0,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();a.state.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),a.state.bindFramebuffer(o.READ_FRAMEBUFFER,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}dispose(){const{gl:e}=this;null!==this._srcFramebuffer&&e.deleteFramebuffer(this._srcFramebuffer),null!==this._dstFramebuffer&&e.deleteFramebuffer(this._dstFramebuffer)}}function CR(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 MR{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 BR{constructor(e){this.backend=e,this.maxAnisotropy=null,this.maxUniformBlockSize=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}getUniformBufferLimit(){if(null!==this.maxUniformBlockSize)return this.maxUniformBlockSize;const e=this.backend.gl;return this.maxUniformBlockSize=e.getParameter(e.MAX_UNIFORM_BLOCK_SIZE),this.maxUniformBlockSize}}const FR={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",WEBGL_compressed_texture_s3tc:"texture-compression-s3tc",EXT_texture_compression_bptc:"texture-compression-bc",EXT_disjoint_timer_query_webgl2:"timestamp-query",OVR_multiview2:"OVR_multiview2"};class LR{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 v(`WebGLTimestampQueryPool [${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,t),t}beginQuery(e){if(!this.trackTimestamp||this.isDisposed)return;const t=this.queryOffsets.get(e);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){o("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);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){o("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=new Map;for(const[t,r]of this.queryOffsets){if("ended"===this.queryStates.get(r)){const s=this.queries[r];e.set(t,this.resolveQuery(s))}}if(0===e.size)return this.lastValue;const t={},r=[];for(const[s,i]of e){const e=s.match(/^(.*):f(\d+)$/),n=parseInt(e[2]);!1===r.includes(n)&&r.push(n),void 0===t[n]&&(t[n]=0);const a=await i;this.timestamps.set(s,a),t[n]+=a}const s=t[r[r.length-1]];return this.lastValue=s,this.frames=r,this.currentQueryIndex=0,this.queryOffsets.clear(),this.queryStates.clear(),this.activeQuery=null,s}catch(e){return o("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){o("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 UR extends fR{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.currentSamples>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 MR(this),this.capabilities=new BR(this),this.attributeUtils=new _R(this),this.textureUtils=new wR(this),this.bufferRenderer=new LR(this),this.state=new vR(this),this.utils=new NR(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.extensions.get("EXT_clip_control"),this.disjoint=this.extensions.get("EXT_disjoint_timer_query_webgl2"),this.parallel=this.extensions.get("KHR_parallel_shader_compile"),this.drawBuffersIndexedExt=this.extensions.get("OES_draw_buffers_indexed"),t.reversedDepthBuffer&&(this.extensions.has("EXT_clip_control")?e.reversedDepthBuffer=!0:(d("WebGPURenderer: Unable to use reversed depth buffer due to missing EXT_clip_control extension. Fallback to default depth buffer."),e.reversedDepthBuffer=!1)),e.reversedDepthBuffer&&this.state.setReversedDepth(!0)}get coordinateSystem(){return c}async getArrayBufferAsync(e){return await this.attributeUtils.getArrayBufferAsync(e)}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&&d("WebGLBackend: Render-to-texture extension was disabled because an external texture was provided"),e._autoAllocateDepthBuffer=!1}}initTimestampQuery(e,t){if(!this.disjoint||!this.trackTimestamp)return;this.timestampQueryPool[e]||(this.timestampQueryPool[e]=new DR(this.gl,e,2048));const r=this.timestampQueryPool[e];null!==r.allocateQueriesForContext(t)&&r.beginQuery(t)}prepareTimestampBuffer(e,t){if(!this.disjoint||!this.trackTimestamp)return;this.timestampQueryPool[e].endQuery(t)}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)this.updateScissor(e);else{const{width:e,height:r}=this.getDrawingBufferSize();t.scissor(0,0,e,r)}this.initTimestampQuery(Dt.RENDER,this.getTimestampUID(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;e{let a=0;for(let t=0;t1?t.renderInstances(r,s,i):t.render(r,s)}draw(e){const{object:t,pipeline:r,material:s,context:i,hardwareClippingPlanes:n}=e,{programGPU:a}=this.get(r),{gl:o,state:u}=this,l=this.get(i),d=e.getDrawParameters();if(null===d)return;this._bindUniforms(e.getBindings());const c=t.isMesh&&t.matrixWorld.determinant()<0;u.setMaterial(s,c,n),null!==i.mrt&&null!==i.textures&&u.setMRTBlending(i.textures,i.mrt,s),u.useProgram(a);const h=e.getAttributes(),p=this.get(h);let g=p.vaoGPU;if(void 0===g){const e=this._getVaoKey(h);g=this.vaoCache[e],void 0===g&&(g=this._createVao(h),this.vaoCache[e]=g,p.vaoGPU=g)}const m=e.getIndex(),f=null!==m?this.get(m).bufferGPU:null;u.setVertexState(g,f);const y=l.lastOcclusionObject;if(y!==t&&void 0!==y){if(null!==y&&!0===y.occlusionTest&&(o.endQuery(o.ANY_SAMPLES_PASSED),l.occlusionQueryIndex++),!0===t.occlusionTest){const e=o.createQuery();o.beginQuery(o.ANY_SAMPLES_PASSED,e),l.occlusionQueries[l.occlusionQueryIndex]=e,l.occlusionQueryObjects[l.occlusionQueryIndex]=t}l.lastOcclusionObject=t}const b=this.bufferRenderer;t.isPoints?b.mode=o.POINTS:t.isLineSegments?b.mode=o.LINES:t.isLine?b.mode=o.LINE_STRIP:t.isLineLoop?b.mode=o.LINE_LOOP:!0===s.wireframe?(u.setLineWidth(s.wireframeLinewidth*this.renderer.getPixelRatio()),b.mode=o.LINES):b.mode=o.TRIANGLES;const{vertexCount:x,instanceCount:T}=d;let{firstVertex:_}=d;if(b.object=t,null!==m){_*=m.array.BYTES_PER_ELEMENT;const e=this.get(m);b.index=m.count,b.type=e.type}else b.index=0;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");o("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&&d("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,pipeline: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;eFR[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=qy(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,i=this.renderer._activeMipmapLevel;t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_CUBE_MAP_POSITIVE_X+r,e,i)}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&&!1===this._useMultisampledExtension(s)){const n=i.framebuffers[e.getCacheKey()];let a=t.COLOR_BUFFER_BIT;s.resolveDepthBuffer&&(s.depthBuffer&&(a|=t.DEPTH_BUFFER_BIT),s.stencilBuffer&&s.resolveStencilBuffer&&(a|=t.STENCIL_BUFFER_BIT));const o=i.msaaFrameBuffer,u=i.msaaRenderbuffers,l=e.textures,d=l.length>1;if(r.bindFramebuffer(t.READ_FRAMEBUFFER,o),r.bindFramebuffer(t.DRAW_FRAMEBUFFER,n),d)for(let e=0;e0&&!0===this.extensions.has("WEBGL_multisampled_render_to_texture")&&!1!==e._autoAllocateDepthBuffer}dispose(){null!==this.textureUtils&&this.textureUtils.dispose();const e=this.extensions.get("WEBGL_lose_context");e&&e.loseContext(),this.renderer.domElement.removeEventListener("webglcontextlost",this._onContextLost)}}const IR="point-list",OR="line-list",VR="line-strip",kR="triangle-list",GR="undefined"!=typeof self&&self.GPUShaderStage?self.GPUShaderStage:{VERTEX:1,FRAGMENT:2,COMPUTE:4},zR="never",$R="less",WR="equal",HR="less-equal",qR="greater",jR="not-equal",XR="greater-equal",KR="always",QR="store",YR="load",ZR="clear",JR="ccw",eA="cw",tA="none",rA="back",sA="uint16",iA="uint32",nA="r8unorm",aA="r8snorm",oA="r8uint",uA="r8sint",lA="r16uint",dA="r16sint",cA="r16float",hA="rg8unorm",pA="rg8snorm",gA="rg8uint",mA="rg8sint",fA="r32uint",yA="r32sint",bA="r32float",xA="rg16uint",TA="rg16sint",_A="rg16float",vA="rgba8unorm",NA="rgba8unorm-srgb",SA="rgba8snorm",RA="rgba8uint",AA="rgba8sint",EA="bgra8unorm",wA="bgra8unorm-srgb",CA="rgb9e5ufloat",MA="rgb10a2unorm",BA="rg11b10ufloat",FA="rg32uint",LA="rg32sint",PA="rg32float",DA="rgba16uint",UA="rgba16sint",IA="rgba16float",OA="rgba32uint",VA="rgba32sint",kA="rgba32float",GA="depth16unorm",zA="depth24plus",$A="depth24plus-stencil8",WA="depth32float",HA="depth32float-stencil8",qA="bc1-rgba-unorm",jA="bc1-rgba-unorm-srgb",XA="bc2-rgba-unorm",KA="bc2-rgba-unorm-srgb",QA="bc3-rgba-unorm",YA="bc3-rgba-unorm-srgb",ZA="bc4-r-unorm",JA="bc4-r-snorm",eE="bc5-rg-unorm",tE="bc5-rg-snorm",rE="bc6h-rgb-ufloat",sE="bc6h-rgb-float",iE="bc7-rgba-unorm",nE="bc7-rgba-unorm-srgb",aE="etc2-rgb8unorm",oE="etc2-rgb8unorm-srgb",uE="etc2-rgb8a1unorm",lE="etc2-rgb8a1unorm-srgb",dE="etc2-rgba8unorm",cE="etc2-rgba8unorm-srgb",hE="eac-r11unorm",pE="eac-r11snorm",gE="eac-rg11unorm",mE="eac-rg11snorm",fE="astc-4x4-unorm",yE="astc-4x4-unorm-srgb",bE="astc-5x4-unorm",xE="astc-5x4-unorm-srgb",TE="astc-5x5-unorm",_E="astc-5x5-unorm-srgb",vE="astc-6x5-unorm",NE="astc-6x5-unorm-srgb",SE="astc-6x6-unorm",RE="astc-6x6-unorm-srgb",AE="astc-8x5-unorm",EE="astc-8x5-unorm-srgb",wE="astc-8x6-unorm",CE="astc-8x6-unorm-srgb",ME="astc-8x8-unorm",BE="astc-8x8-unorm-srgb",FE="astc-10x5-unorm",LE="astc-10x5-unorm-srgb",PE="astc-10x6-unorm",DE="astc-10x6-unorm-srgb",UE="astc-10x8-unorm",IE="astc-10x8-unorm-srgb",OE="astc-10x10-unorm",VE="astc-10x10-unorm-srgb",kE="astc-12x10-unorm",GE="astc-12x10-unorm-srgb",zE="astc-12x12-unorm",$E="astc-12x12-unorm-srgb",WE="clamp-to-edge",HE="repeat",qE="mirror-repeat",jE="linear",XE="nearest",KE="zero",QE="one",YE="src",ZE="one-minus-src",JE="src-alpha",ew="one-minus-src-alpha",tw="dst",rw="one-minus-dst",sw="dst-alpha",iw="one-minus-dst-alpha",nw="src-alpha-saturated",aw="constant",ow="one-minus-constant",uw="add",lw="subtract",dw="reverse-subtract",cw="min",hw="max",pw=0,gw=15,mw="keep",fw="zero",yw="replace",bw="invert",xw="increment-clamp",Tw="decrement-clamp",_w="increment-wrap",vw="decrement-wrap",Nw="storage",Sw="read-only-storage",Rw="write-only",Aw="read-only",Ew="read-write",ww="non-filtering",Cw="comparison",Mw="float",Bw="unfilterable-float",Fw="depth",Lw="sint",Pw="uint",Dw="2d",Uw="3d",Iw="2d",Ow="2d-array",Vw="cube",kw="3d",Gw="all",zw="vertex",$w="instance",Ww={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"},Hw={"texture-compression-s3tc":"texture-compression-bc","texture-compression-etc1":"texture-compression-etc2"};class qw extends eR{constructor(e,t,r){super(e,t?t.value:null),this.textureNode=t,this.groupNode=r}update(){const{textureNode:e}=this;return this.texture!==e.value?(this.texture=e.value,!0):super.update()}}class jw extends jS{constructor(e,t){super(e,t?t.array:null),this._attribute=t,this.isStorageBuffer=!0}get attribute(){return this._attribute}}let Xw=0;class Kw extends jw{constructor(e,t){super("StorageBuffer_"+Xw++,e?e.value:null),this.nodeUniform=e,this.access=e?e.access:si.READ_WRITE,this.groupNode=t}get attribute(){return this.nodeUniform.value}get buffer(){return this.nodeUniform.value.array}}class Qw extends xy{constructor(e){super(),this.device=e;this.mipmapSampler=e.createSampler({minFilter:jE}),this.flipYSampler=e.createSampler({minFilter:XE}),this.flipUniformBuffer=e.createBuffer({size:4,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST}),e.queue.writeBuffer(this.flipUniformBuffer,0,new Uint32Array([1])),this.noFlipUniformBuffer=e.createBuffer({size:4,usage:GPUBufferUsage.UNIFORM}),this.transferPipelines={},this.mipmapShaderModule=e.createShaderModule({label:"mipmap",code:"\nstruct VarysStruct {\n\t@builtin( position ) Position: vec4f,\n\t@location( 0 ) vTex : vec2f,\n\t@location( 1 ) @interpolate(flat, either) vBaseArrayLayer: u32,\n};\n\n@group( 0 ) @binding ( 2 )\nvar flipY: u32;\n\n@vertex\nfn mainVS(\n\t\t@builtin( vertex_index ) vertexIndex : u32,\n\t\t@builtin( instance_index ) instanceIndex : u32 ) -> VarysStruct {\n\n\tvar Varys : VarysStruct;\n\n\tvar pos = array(\n\t\tvec2f( -1, -1 ),\n\t\tvec2f( -1, 3 ),\n\t\tvec2f( 3, -1 ),\n\t);\n\n\tlet p = pos[ vertexIndex ];\n\tlet mult = select( vec2f( 0.5, -0.5 ), vec2f( 0.5, 0.5 ), flipY != 0 );\n\tVarys.vTex = p * mult + vec2f( 0.5 );\n\tVarys.Position = vec4f( p, 0, 1 );\n\tVarys.vBaseArrayLayer = instanceIndex;\n\n\treturn Varys;\n\n}\n\n@group( 0 ) @binding( 0 )\nvar imgSampler : sampler;\n\n@group( 0 ) @binding( 1 )\nvar img2d : texture_2d;\n\n@fragment\nfn main_2d( Varys: VarysStruct ) -> @location( 0 ) vec4 {\n\n\treturn textureSample( img2d, imgSampler, Varys.vTex );\n\n}\n\n@group( 0 ) @binding( 1 )\nvar img2dArray : texture_2d_array;\n\n@fragment\nfn main_2d_array( Varys: VarysStruct ) -> @location( 0 ) vec4 {\n\n\treturn textureSample( img2dArray, imgSampler, Varys.vTex, Varys.vBaseArrayLayer );\n\n}\n\nconst faceMat = array(\n mat3x3f( 0, 0, -2, 0, -2, 0, 1, 1, 1 ), // pos-x\n mat3x3f( 0, 0, 2, 0, -2, 0, -1, 1, -1 ), // neg-x\n mat3x3f( 2, 0, 0, 0, 0, 2, -1, 1, -1 ), // pos-y\n mat3x3f( 2, 0, 0, 0, 0, -2, -1, -1, 1 ), // neg-y\n mat3x3f( 2, 0, 0, 0, -2, 0, -1, 1, 1 ), // pos-z\n mat3x3f( -2, 0, 0, 0, -2, 0, 1, 1, -1 ), // neg-z\n);\n\n@group( 0 ) @binding( 1 )\nvar imgCube : texture_cube;\n\n@fragment\nfn main_cube( Varys: VarysStruct ) -> @location( 0 ) vec4 {\n\n\treturn textureSample( imgCube, imgSampler, faceMat[ Varys.vBaseArrayLayer ] * vec3f( fract( Varys.vTex ), 1 ) );\n\n}\n"})}getTransferPipeline(e,t){const r=`${e}-${t=t||"2d-array"}`;let s=this.transferPipelines[r];return void 0===s&&(s=this.device.createRenderPipeline({label:`mipmap-${e}-${t}`,vertex:{module:this.mipmapShaderModule},fragment:{module:this.mipmapShaderModule,entryPoint:`main_${t.replace("-","_")}`,targets:[{format:e}]},layout:"auto"}),this.transferPipelines[r]=s),s}flipY(e,t,r=0){const s=t.format,{width:i,height:n}=t.size,a=this.device.createTexture({size:{width:i,height:n},format:s,usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.TEXTURE_BINDING}),o=this.getTransferPipeline(s,e.textureBindingViewDimension),u=this.getTransferPipeline(s,a.textureBindingViewDimension),l=this.device.createCommandEncoder({}),d=(e,t,r,s,i,n)=>{const a=e.getBindGroupLayout(0),o=this.device.createBindGroup({layout:a,entries:[{binding:0,resource:this.flipYSampler},{binding:1,resource:t.createView({dimension:t.textureBindingViewDimension||"2d-array",baseMipLevel:0,mipLevelCount:1})},{binding:2,resource:{buffer:n?this.flipUniformBuffer:this.noFlipUniformBuffer}}]}),u=l.beginRenderPass({colorAttachments:[{view:s.createView({dimension:"2d",baseMipLevel:0,mipLevelCount:1,baseArrayLayer:i,arrayLayerCount:1}),loadOp:ZR,storeOp:QR}]});u.setPipeline(e),u.setBindGroup(0,o),u.draw(3,1,0,r),u.end()};d(o,e,r,a,0,!1),d(u,a,0,e,r,!0),this.device.queue.submit([l.finish()]),a.destroy()}generateMipmaps(e,t=null){const r=this.get(e),s=r.layers||this._mipmapCreateBundles(e),i=t||this.device.createCommandEncoder({label:"mipmapEncoder"});this._mipmapRunBundles(i,s),null===t&&this.device.queue.submit([i.finish()]),r.layers=s}_mipmapCreateBundles(e){const t=e.textureBindingViewDimension||"2d-array",r=this.getTransferPipeline(e.format,t),s=r.getBindGroupLayout(0),i=[];for(let n=1;n0)for(let t=0,n=s.length;t0){for(const s of e.layerUpdates)this._copyBufferToTexture(t.image,r.texture,i,s,e.flipY,s);e.clearLayerUpdates()}else for(let s=0;s0)for(let t=0,n=s.length;t0?e.width:r.size.width,l=a>0?e.height:r.size.height;try{o.queue.copyExternalImageToTexture({source:e,flipY:i},{texture:t,mipLevel:a,origin:{x:0,y:0,z:s},premultipliedAlpha:n},{width:u,height:l,depthOrArrayLayers:1})}catch(e){}}_getPassUtils(){let e=this._passUtils;return null===e&&(this._passUtils=e=new Qw(this.backend.device)),e}_generateMipmaps(e,t=null){this._getPassUtils().generateMipmaps(e,t)}_flipY(e,t,r=0){this._getPassUtils().flipY(e,t,r)}_copyBufferToTexture(e,t,r,s,i,n=0,a=0){const o=this.backend.device,u=e.data,l=this._getBytesPerTexel(r.format),d=e.width*l;o.queue.writeTexture({texture:t,mipLevel:a,origin:{x:0,y:0,z:s}},u,{offset:e.width*e.height*l*n,bytesPerRow:d},{width:e.width,height:e.height,depthOrArrayLayers:1}),!0===i&&this._flipY(t,r,s)}_copyCompressedBufferToTexture(e,t,r){const s=this.backend.device,i=this._getBlockData(r.format),n=r.size.depthOrArrayLayers>1;for(let a=0;a]*\s*([a-z_0-9]+(?:<[\s\S]+?>)?)/i,rC=/([a-z_0-9]+)\s*:\s*([a-z_0-9]+(?:<[\s\S]+?>)?)/gi,sC={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 iC extends oS{constructor(e){const{type:t,inputs:r,name:s,inputsCode:i,blockCode:n,outputType:a}=(e=>{const t=(e=e.trim()).match(tC);if(null!==t&&4===t.length){const r=t[2],s=[];let i=null;for(;null!==(i=rC.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 nC extends aS{parseFunction(e){return new iC(e)}}const aC={[si.READ_ONLY]:"read",[si.WRITE_ONLY]:"write",[si.READ_WRITE]:"read_write"},oC={[Gr]:"repeat",[ve]:"clamp",[kr]:"mirror"},uC={vertex:GR.VERTEX,fragment:GR.FRAGMENT,compute:GR.COMPUTE},lC={instance:!0,swizzleAssign:!1,storageBuffer:!0},dC={"^^":"tsl_xor"},cC={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"},hC={},pC={tsl_xor:new cT("fn tsl_xor( a : bool, b : bool ) -> bool { return ( a || b ) && !( a && b ); }"),mod_float:new cT("fn tsl_mod_float( x : f32, y : f32 ) -> f32 { return x - y * floor( x / y ); }"),mod_vec2:new cT("fn tsl_mod_vec2( x : vec2f, y : vec2f ) -> vec2f { return x - y * floor( x / y ); }"),mod_vec3:new cT("fn tsl_mod_vec3( x : vec3f, y : vec3f ) -> vec3f { return x - y * floor( x / y ); }"),mod_vec4:new cT("fn tsl_mod_vec4( x : vec4f, y : vec4f ) -> vec4f { return x - y * floor( x / y ); }"),equals_bool:new cT("fn tsl_equals_bool( a : bool, b : bool ) -> bool { return a == b; }"),equals_bvec2:new cT("fn tsl_equals_bvec2( a : vec2f, b : vec2f ) -> vec2 { return vec2( a.x == b.x, a.y == b.y ); }"),equals_bvec3:new cT("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 cT("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 cT("fn tsl_repeatWrapping_float( coord: f32 ) -> f32 { return fract( coord ); }"),mirrorWrapping_float:new cT("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 cT("fn tsl_clampWrapping_float( coord: f32 ) -> f32 { return clamp( coord, 0.0, 1.0 ); }"),biquadraticTexture:new cT("\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"),biquadraticTextureArray:new cT("\nfn tsl_biquadraticTexture_array( map : texture_2d_array, coord : vec2f, iRes : vec2u, layer : u32, 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, layer, level );\n\tlet rg2 = textureLoad( map, vec2u( iuv + vec2( 1.5, 0.5 ) ) % iRes, layer, level );\n\tlet rg3 = textureLoad( map, vec2u( iuv + vec2( 0.5, 1.5 ) ) % iRes, layer, level );\n\tlet rg4 = textureLoad( map, vec2u( iuv + vec2( 1.5, 1.5 ) ) % iRes, layer, level );\n\n\treturn mix( mix( rg1, rg2, f.x ), mix( rg3, rg4, f.x ), f.y );\n\n}\n")},gC={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",floatpack_snorm_2x16:"pack2x16snorm",floatpack_unorm_2x16:"pack2x16unorm",floatpack_float16_2x16:"pack2x16float",floatunpack_snorm_2x16:"unpack2x16snorm",floatunpack_unorm_2x16:"unpack2x16unorm",floatunpack_float16_2x16:"unpack2x16float"};let mC="";!0!==("undefined"!=typeof navigator&&/Firefox|Deno/g.test(navigator.userAgent))&&(mC+="diagnostic( off, derivative_uniformity );\n");class fC extends HN{constructor(e,t){super(e,t,new nC),this.uniformGroups={},this.uniformGroupsBindings={},this.builtins={},this.directives={},this.scopedArrays=new Map}_generateTextureSample(e,t,r,s,i,n=this.shaderStage){return"fragment"===n?s?i?`textureSample( ${t}, ${t}_sampler, ${r}, ${s}, ${i} )`:`textureSample( ${t}, ${t}_sampler, ${r}, ${s} )`:i?`textureSample( ${t}, ${t}_sampler, ${r}, ${i} )`:`textureSample( ${t}, ${t}_sampler, ${r} )`:this.generateTextureSampleLevel(e,t,r,"0",s)}generateTextureSampleLevel(e,t,r,s,i,n){return!1===this.isUnfilterable(e)?i?n?`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${i}, ${s}, ${n} )`:`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${i}, ${s} )`:n?`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${s}, ${n} )`:`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${s} )`:this.isFilteredTexture(e)?this.generateFilteredTexture(e,t,r,n,s,i):this.generateTextureLod(e,t,r,i,n,s)}generateWrapFunction(e){const t=`tsl_coord_${oC[e.wrapS]}S_${oC[e.wrapT]}_${e.is3DTexture||e.isData3DTexture?"3d":"2d"}T`;let r=hC[t];if(void 0===r){const s=[],i=e.is3DTexture||e.isData3DTexture?"vec3f":"vec2f";let n=`fn ${t}( coord : ${i} ) -> ${i} {\n\n\treturn ${i}(\n`;const a=(e,t)=>{e===Gr?(s.push(pC.repeatWrapping_float),n+=`\t\ttsl_repeatWrapping_float( coord.${t} )`):e===ve?(s.push(pC.clampWrapping_float),n+=`\t\ttsl_clampWrapping_float( coord.${t} )`):e===kr?(s.push(pC.mirrorWrapping_float),n+=`\t\ttsl_mirrorWrapping_float( coord.${t} )`):(n+=`\t\tcoord.${t}`,d(`WebGPURenderer: Unsupported texture wrap type "${e}" for vertex shader.`))};a(e.wrapS,"x"),n+=",\n",a(e.wrapT,"y"),(e.is3DTexture||e.isData3DTexture)&&(n+=",\n",a(e.wrapR,"z")),n+="\n\t);\n\n}\n",hC[t]=r=new cT(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.is3DTexture||e.isData3DTexture?"vec3":"vec2",n=u||e.isStorageTexture?t:`${t}${r?`, u32( ${r} )`:""}`,i=new wu(new pl(`textureDimensions( ${n} )`,a)),s.dimensionsSnippet[r]=i,(e.isArrayTexture||e.isDataArrayTexture||e.is3DTexture||e.isData3DTexture)&&(s.arrayLayerCount=new wu(new pl(`textureNumLayers(${t})`,"u32"))),e.isTextureCube&&(s.cubeFaceCount=new wu(new pl("6u","u32")))}return i.build(this)}generateFilteredTexture(e,t,r,s,i="0u",n){const a=this.generateWrapFunction(e),o=this.generateTextureDimension(e,t,i);return s&&(r=`${r} + vec2(${s}) / ${o}`),n?(this._include("biquadraticTextureArray"),`tsl_biquadraticTexture_array( ${t}, ${a}( ${r} ), ${o}, u32( ${n} ), u32( ${i} ) )`):(this._include("biquadraticTexture"),`tsl_biquadraticTexture( ${t}, ${a}( ${r} ), ${o}, u32( ${i} ) )`)}generateTextureLod(e,t,r,s,i,n="0u"){if(!0===e.isCubeTexture){i&&(r=`${r} + vec3(${i})`);return`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${e.isDepthTexture?"u32":"f32"}( ${n} ) )`}const a=this.generateWrapFunction(e),o=this.generateTextureDimension(e,t,n),u=e.is3DTexture||e.isData3DTexture?"vec3":"vec2";i&&(r=`${r} + ${u}(${i}) / ${u}( ${o} )`);return r=`${u}( clamp( floor( ${a}( ${r} ) * ${u}( ${o} ) ), ${`${u}( 0 )`}, ${`${u}( ${o} - ${"vec3"===u?"vec3( 1, 1, 1 )":"vec2( 1, 1 )"} )`} ) )`,this.generateTextureLoad(e,t,r,n,s,null)}generateStorageTextureLoad(e,t,r,s,i,n){let a;return n&&(r=`${r} + ${n}`),a=i?`textureLoad( ${t}, ${r}, ${i} )`:`textureLoad( ${t}, ${r} )`,a}generateTextureLoad(e,t,r,s,i,n){let a;return null===s&&(s="0u"),n&&(r=`${r} + ${n}`),i?a=`textureLoad( ${t}, ${r}, ${i}, u32( ${s} ) )`:(a=`textureLoad( ${t}, ${r}, u32( ${s} ) )`,this.renderer.backend.compatibilityMode&&e.isDepthTexture&&(a+=".x")),a}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&&this.renderer.hasCompatibility(A.TEXTURE_COMPARE)}isUnfilterable(e){return"float"!==this.getComponentTypeFromTexture(e)||!this.isAvailable("float32Filterable")&&!0===e.isDataTexture&&e.type===Q||!1===this.isSampleCompare(e)&&e.minFilter===B&&e.magFilter===B||this.renderer.backend.utils.getTextureSampleData(e).primarySamples>1}generateTexture(e,t,r,s,i,n=this.shaderStage){let a=null;return a=this.isUnfilterable(e)?this.generateTextureLod(e,t,r,s,i,"0",n):this._generateTextureSample(e,t,r,s,i,n),a}generateTextureGrad(e,t,r,s,i,n,a=this.shaderStage){if("fragment"===a)return i?n?`textureSampleGrad( ${t}, ${t}_sampler, ${r}, ${i}, ${s[0]}, ${s[1]}, ${n} )`:`textureSampleGrad( ${t}, ${t}_sampler, ${r}, ${i}, ${s[0]}, ${s[1]} )`:n?`textureSampleGrad( ${t}, ${t}_sampler, ${r}, ${s[0]}, ${s[1]}, ${n} )`:`textureSampleGrad( ${t}, ${t}_sampler, ${r}, ${s[0]}, ${s[1]} )`;o(`WebGPURenderer: THREE.TextureNode.gradient() does not support ${a} shader.`)}generateTextureCompare(e,t,r,s,i,n,a=this.shaderStage){if("fragment"===a)return!0===e.isDepthTexture&&!0===e.isArrayTexture?n?`textureSampleCompare( ${t}, ${t}_sampler, ${r}, ${i}, ${s}, ${n} )`:`textureSampleCompare( ${t}, ${t}_sampler, ${r}, ${i}, ${s} )`:n?`textureSampleCompare( ${t}, ${t}_sampler, ${r}, ${s}, ${n} )`:`textureSampleCompare( ${t}, ${t}_sampler, ${r}, ${s} )`;o(`WebGPURenderer: THREE.DepthTexture.compareFunction() does not support ${a} shader.`)}generateTextureLevel(e,t,r,s,i,n){return!1===this.isUnfilterable(e)?i?n?`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${i}, ${s}, ${n} )`:`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${i}, ${s} )`:n?`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${s}, ${n} )`:`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${s} )`:this.isFilteredTexture(e)?this.generateFilteredTexture(e,t,r,n,s,i):this.generateTextureLod(e,t,r,i,n,s)}generateTextureBias(e,t,r,s,i,n,a=this.shaderStage){if("fragment"===a)return i?n?`textureSampleBias( ${t}, ${t}_sampler, ${r}, ${i}, ${s}, ${n} )`:`textureSampleBias( ${t}, ${t}_sampler, ${r}, ${i}, ${s} )`:n?`textureSampleBias( ${t}, ${t}_sampler, ${r}, ${s}, ${n} )`:`textureSampleBias( ${t}, ${t}_sampler, ${r}, ${s} )`;o(`WebGPURenderer: THREE.TextureNode.biasNode does not support ${a} 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||"cubeDepthTexture"===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=dC[e];return void 0!==t?(this._include(t),t):null}getNodeAccess(e,t){return"compute"!==t?!0===e.isAtomic?(d("WebGPURenderer: Atomic operations are only supported in compute shaders."),si.READ_WRITE):si.READ_ONLY:e.access}getStorageAccess(e,t){return aC[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||"cubeDepthTexture"===t||"storageTexture"===t||"texture3D"===t){let s=null;const n=this.getNodeAccess(e,r);"texture"===t||"storageTexture"===t?s=!0===e.value.is3DTexture?new nR(i.name,i.node,o,n):new sR(i.name,i.node,o,n):"cubeTexture"===t||"cubeDepthTexture"===t?s=new iR(i.name,i.node,o,n):"texture3D"===t&&(s=new nR(i.name,i.node,o,n)),s.store=!0===e.isStorageTextureNode,s.mipLevel=s.store?e.mipLevel:0,s.setVisibility(uC[r]);if(!0===e.value.isCubeTexture||!1===this.isUnfilterable(e.value)&&!1===s.store){const e=new qw(`${i.name}_sampler`,i.node,o);e.setVisibility(uC[r]),l.push(e,s),a=[e,s]}else l.push(s),a=[s]}else if("buffer"===t||"storageBuffer"===t||"indirectStorageBuffer"===t){const n=this.getSharedDataFromNode(e);let u=n.buffer;if(void 0===u){u=new("buffer"===t?QS:Kw)(e,o),n.buffer=u}u.setVisibility(u.getVisibility()|uC[r]),l.push(u),a=u,i.name=s||"NodeBuffer_"+i.id}else{let e=this.uniformGroups[u];void 0===e&&(e=new JS(u,o),e.setVisibility(GR.VERTEX|GR.FRAGMENT|GR.COMPUTE),this.uniformGroups[u]=e),-1===l.indexOf(e)&&l.push(e),a=this.getNodeUniform(i,t);const r=a.name;e.uniforms.some(e=>e.name===r)||e.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","builtinClipSpace","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||"cubeDepthTexture"===i.type||"storageTexture"===i.type||"texture3D"===i.type){const t=i.node.value;let s;(!0===t.isCubeTexture||!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&&!0===t.isDepthTexture)s="texture_depth_cube";else if(!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=eC(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=i.groupNode.name;if(void 0===n[e]){const t=this.uniformGroups[e];if(void 0!==t){const r=[];for(const e of t.uniforms){const t=e.getType(),s=this.getType(this.getVectorType(t));r.push(`\t${e.name} : ${s}`)}let s=this.uniformGroupsBindings[e];void 0===s&&(s={index:a.binding++,id:a.group},this.uniformGroupsBindings[e]=s),n[e]={index:s.index,id:s.id,snippets:r}}}}}for(const e in n){const t=n[e];i.push(this._getWGSLStructBinding(e,t.snippets.join(",\n"),"uniform",t.index,t.id))}return[...r,...s,...i].join("\n")}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.builtinClipSpace = ${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}getBitcastMethod(e){return`bitcast<${this.getType(e)}>`}getFloatPackingMethod(e){return this.getMethod(`floatpack_${e}_2x16`)}getFloatUnpackingMethod(e){return this.getMethod(`floatunpack_${e}_2x16`)}getTernary(e,t,r){return`select( ${r}, ${t}, ${e} )`}getType(e){return cC[e]||e}isAvailable(e){let t=lC[e];return void 0===t&&("float32Filterable"===e?t=this.renderer.hasFeature("float32-filterable"):"clipDistance"===e&&(t=this.renderer.hasFeature("clip-distances")),lC[e]=t),t}_getWGSLMethod(e){return void 0!==pC[e]&&this._include(e),gC[e]}_include(e){const t=pC[e];return t.build(this),this.addInclude(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${mC}\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 yC{constructor(e){this.backend=e}getCurrentDepthStencilFormat(e){let t;return e.depth&&(t=null!==e.depthTexture?this.getTextureFormatGPU(e.depthTexture):e.stencil?$A:zA),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.currentSamples}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}getCurrentColorFormats(e){return null!==e.textures?e.textures.map(e=>this.getTextureFormatGPU(e)):[this.getPreferredCanvasFormat()]}getCurrentColorSpace(e){return null!==e.textures?e.textures[0].colorSpace:this.backend.renderer.outputColorSpace}getPrimitiveTopology(e,t){return e.isPoints?IR:e.isLineSegments||e.isMesh&&!0===t.wireframe?OR:e.isLine?VR:e.isMesh?kR:void 0}getSampleCount(e){return e>=4?4:1}getSampleCountRenderContext(e){return null!==e.textures?this.getSampleCount(e.sampleCount):this.getSampleCount(this.backend.renderer.currentSamples)}getPreferredCanvasFormat(){const e=this.backend.parameters.outputType;if(void 0===e)return navigator.gpu.getPreferredCanvasFormat();if(e===ke)return EA;if(e===_e)return IA;throw new Error("Unsupported output buffer type.")}}const bC=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&&bC.set(Float16Array,["float16"]);const xC=new Map([[bt,["float16"]]]),TC=new Map([[Int32Array,"sint32"],[Int16Array,"sint32"],[Uint32Array,"uint32"],[Uint16Array,"uint32"],[Float32Array,"float32"]]);class _C{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;e0&&(void 0===n.groups&&(n.groups=[],n.versions=[]),n.versions[r]===s&&(o=n.groups[r])),void 0===o&&(o=this.createBindGroup(e,a),r>0&&(n.groups[r]=o,n.versions[r]=s)),n.group=o}updateBinding(e){const t=this.backend,r=t.device,s=e.buffer,i=t.get(e).buffer,n=e.updateRanges;if(0===n.length)r.queue.writeBuffer(i,0,s,0);else{const e=Kr(s),t=e?1:s.BYTES_PER_ELEMENT;for(let a=0,o=n.length;a1&&(i+=`-${e.texture.depthOrArrayLayers}`),i+=`-${r}-${s}`,a=e[i],void 0===a){const n=Gw;let o;o=t.isSampledCubeTexture?Vw:t.isSampledTexture3D?kw:t.texture.isArrayTexture||t.texture.isDataArrayTexture||t.texture.isCompressedArrayTexture?Ow:Iw,a=e[i]=e.texture.createView({aspect:n,dimension:o,mipLevelCount:r,baseMipLevel:s})}}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})}_createLayoutEntries(e){const t=[];let r=0;for(const s of e.bindings){const e=this.backend,i={binding:r,visibility:s.visibility};if(s.isUniformBuffer||s.isStorageBuffer){const e={};s.isStorageBuffer&&(s.visibility&GR.COMPUTE&&(s.access===si.READ_WRITE||s.access===si.WRITE_ONLY)?e.type=Nw:e.type=Sw),i.buffer=e}else if(s.isSampledTexture&&s.store){const e={};e.format=this.backend.get(s.texture).texture.format;const t=s.access;e.access=t===si.READ_WRITE?Ew:t===si.WRITE_ONLY?Rw:Aw,s.texture.isArrayTexture?e.viewDimension=Ow:s.texture.is3DTexture&&(e.viewDimension=kw),i.storageTexture=e}else if(s.isSampledTexture){const t={},{primarySamples:r}=e.utils.getTextureSampleData(s.texture);if(r>1&&(t.multisampled=!0,s.texture.isDepthTexture||(t.sampleType=Bw)),s.texture.isDepthTexture)e.compatibilityMode&&null===s.texture.compareFunction?t.sampleType=Bw:t.sampleType=Fw;else if(s.texture.isDataTexture||s.texture.isDataArrayTexture||s.texture.isData3DTexture){const e=s.texture.type;e===R?t.sampleType=Lw:e===S?t.sampleType=Pw:e===Q&&(this.backend.hasFeature("float32-filterable")?t.sampleType=Mw:t.sampleType=Bw)}s.isSampledCubeTexture?t.viewDimension=Vw:s.texture.isArrayTexture||s.texture.isDataArrayTexture||s.texture.isCompressedArrayTexture?t.viewDimension=Ow:s.isSampledTexture3D&&(t.viewDimension=kw),i.texture=t}else if(s.isSampler){const t={};s.texture.isDepthTexture&&(null!==s.texture.compareFunction&&e.hasCompatibility(A.TEXTURE_COMPARE)?t.type=Cw:t.type=ww),i.sampler=t}else o(`WebGPUBindingUtils: Unsupported binding "${s}".`);t.push(i),r++}return t}deleteBindGroupData(e){const{backend:t}=this,r=t.get(e);r.layout&&(r.layout.usedTimes--,0===r.layout.usedTimes&&this._bindGroupLayoutCache.delete(r.layoutKey),r.layout=void 0,r.layoutKey=void 0)}dispose(){this._bindGroupLayoutCache.clear()}}class SC{constructor(e){this.backend=e}getMaxAnisotropy(){return 16}getUniformBufferLimit(){return this.backend.device.limits.maxUniformBufferBindingSize}}class RC{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:u}=n,l=this.backend,d=l.device,c=l.utils,h=l.get(n),p=[];for(const t of e.getBindings()){const e=l.get(t),{layoutGPU:r}=e.layout;p.push(r)}const g=l.attributeUtils.createShaderVertexBuffers(e);let m;s.blending===se||s.blending===et&&!1===s.transparent||(m=this._getBlending(s));let f={};!0===s.stencilWrite&&(f={compare:this._getStencilCompare(s),failOp:this._getStencilOperation(s.stencilFail),depthFailOp:this._getStencilOperation(s.stencilZFail),passOp:this._getStencilOperation(s.stencilZPass)});const y=this._getColorWriteMask(s),b=[];if(null!==e.context.textures){const t=e.context.textures,r=e.context.mrt;for(let e=0;e1},layout:d.createPipelineLayout({bindGroupLayouts:p})},E={},w=e.context.depth,C=e.context.stencil;if(!0!==w&&!0!==C||(!0===w&&(E.format=S,E.depthWriteEnabled=s.depthWrite,E.depthCompare=N),!0===C&&(E.stencilFront=f,E.stencilBack=f,E.stencilReadMask=s.stencilFuncMask,E.stencilWriteMask=s.stencilWriteMask),!0===s.polygonOffset&&(E.depthBias=s.polygonOffsetUnits,E.depthBiasSlopeScale=s.polygonOffsetFactor,E.depthBiasClamp=0),A.depthStencil=E),d.pushErrorScope("validation"),null===t)h.pipeline=d.createRenderPipeline(A),d.popErrorScope().then(e=>{null!==e&&(h.error=!0,o(e.message))});else{const e=new Promise(async e=>{try{h.pipeline=await d.createRenderPipelineAsync(A)}catch(e){}const t=await d.popErrorScope();null!==t&&(h.error=!0,o(t.message)),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.getCurrentColorFormats(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),{layoutGPU:s}=t.layout;a.push(s)}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===St){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:uw},r={srcFactor:i,dstFactor:n,operation:uw}};if(e.premultipliedAlpha)switch(s){case et:i(QE,ew,QE,ew);break;case Zt:i(QE,QE,QE,QE);break;case Yt:i(KE,ZE,KE,QE);break;case Qt:i(tw,ew,KE,QE)}else switch(s){case et:i(JE,ew,QE,ew);break;case Zt:i(JE,QE,QE,QE);break;case Yt:o(`WebGPURenderer: "SubtractiveBlending" requires "${e.isMaterial?"material":"blendMode"}.premultipliedAlpha = true".`);break;case Qt:o(`WebGPURenderer: "MultiplyBlending" requires "${e.isMaterial?"material":"blendMode"}.premultipliedAlpha = true".`)}}if(void 0!==t&&void 0!==r)return{color:t,alpha:r};o("WebGPURenderer: Invalid blending: ",s)}_getBlendFactor(e){let t;switch(e){case Rt:t=KE;break;case qt:t=QE;break;case Ht:t=YE;break;case Gt:t=ZE;break;case tt:t=JE;break;case rt:t=ew;break;case $t:t=tw;break;case kt:t=rw;break;case zt:t=sw;break;case Vt:t=iw;break;case Wt:t=nw;break;case 211:t=aw;break;case 212:t=ow;break;default:o("WebGPURenderer: Blend factor not supported.",e)}return t}_getStencilCompare(e){let t;const r=e.stencilFunc;switch(r){case ss:t=zR;break;case rs:t=KR;break;case ts:t=$R;break;case es:t=HR;break;case Jr:t=WR;break;case Zr:t=XR;break;case Yr:t=qR;break;case Qr:t=jR;break;default:o("WebGPURenderer: Invalid stencil function.",r)}return t}_getStencilOperation(e){let t;switch(e){case cs:t=mw;break;case ds:t=fw;break;case ls:t=yw;break;case us:t=bw;break;case os:t=xw;break;case as:t=Tw;break;case ns:t=_w;break;case is:t=vw;break;default:o("WebGPURenderer: Invalid stencil operation.",t)}return t}_getBlendOperation(e){let t;switch(e){case st:t=uw;break;case Ot:t=lw;break;case It:t=dw;break;case ps:t=cw;break;case hs:t=hw;break;default:o("WebGPUPipelineUtils: Blend equation not supported.",e)}return t}_getPrimitiveState(e,t,r){const s={},i=this.backend.utils;s.topology=i.getPrimitiveTopology(e,r),null!==t.index&&!0===e.isLine&&!0!==e.isLineSegments&&(s.stripIndexFormat=t.index.array instanceof Uint16Array?sA:iA);let n=r.side===L;return e.isMesh&&e.matrixWorld.determinant()<0&&(n=!n),s.frontFace=!0===n?eA:JR,s.cullMode=r.side===P?tA:rA,s}_getColorWriteMask(e){return!0===e.colorWrite?gw:pw}_getDepthCompare(e){let t;if(!1===e.depthTest)t=KR;else{const r=this.backend.parameters.reversedDepthBuffer?or[e.depthFunc]:e.depthFunc;switch(r){case ar:t=zR;break;case nr:t=KR;break;case ir:t=$R;break;case sr:t=HR;break;case rr:t=WR;break;case tr:t=XR;break;case er:t=qR;break;case Jt:t=jR;break;default:o("WebGPUPipelineUtils: Invalid depth function.",r)}}return t}}class AC extends PR{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 v(`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,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)),a={},o=[];for(const[t,r]of e){const e=t.match(/^(.*):f(\d+)$/),s=parseInt(e[2]);!1===o.includes(s)&&o.push(s),void 0===a[s]&&(a[s]=0);const i=n[r],u=n[r+1],l=Number(u-i)/1e6;this.timestamps.set(t,l),a[s]+=l}const u=a[o[o.length-1]];return this.resultBuffer.unmap(),this.lastValue=u,this.frames=o,u}catch(e){return o("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){o("Error waiting for pending resolve:",e)}if(this.resultBuffer&&"mapped"===this.resultBuffer.mapState)try{this.resultBuffer.unmap()}catch(e){o("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 EC extends fR{constructor(e={}){super(e),this.isWebGPUBackend=!0,this.parameters.alpha=void 0===e.alpha||e.alpha,this.parameters.requiredLimits=void 0===e.requiredLimits?{}:e.requiredLimits,this.compatibilityMode=null,this.device=null,this.defaultRenderPassdescriptor=null,this.utils=new yC(this),this.attributeUtils=new _C(this),this.bindingUtils=new NC(this),this.capabilities=new SC(this),this.pipelineUtils=new RC(this),this.textureUtils=new Jw(this),this.occludedResolveCache=new Map;const t="undefined"==typeof navigator||!1===/Android/.test(navigator.userAgent);this._compatibility={[A.TEXTURE_COMPARE]:t}}async init(e){await super.init(e);const t=this.parameters;let r;if(void 0===t.device){const e={powerPreference:t.powerPreference,featureLevel:"compatibility"},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(Ww),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;this.compatibilityMode=!r.features.has("core-features-and-limits"),this.compatibilityMode&&(e._samples=0),r.lost.then(t=>{if("destroyed"===t.reason)return;const r={api:"WebGPU",message:t.message||"Unknown reason",reason:t.reason||null,originalEvent:t};e.onDeviceLost(r)}),this.device=r,this.trackTimestamp=this.trackTimestamp&&this.hasFeature(Ww.TimestampQuery),this.updateSize()}get context(){const e=this.renderer.getCanvasTarget(),t=this.get(e);let r=t.context;if(void 0===r){const s=this.parameters;r=!0===e.isDefaultCanvasTarget&&void 0!==s.context?s.context:e.domElement.getContext("webgpu"),"setAttribute"in e.domElement&&e.domElement.setAttribute("data-engine",`three.js r${Tt} webgpu`);const i=s.alpha?"premultiplied":"opaque",n=s.outputType===_e?"extended":"standard";r.configure({device:this.device,format:this.utils.getPreferredCanvasFormat(),usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.COPY_SRC,alphaMode:i,toneMapping:{mode:n}}),t.context=r}return r}get coordinateSystem(){return h}async getArrayBufferAsync(e){return await this.attributeUtils.getArrayBufferAsync(e)}getContext(){return this.context}_getDefaultRenderPassDescriptor(){const e=this.renderer,t=e.getCanvasTarget(),r=this.get(t),s=e.currentSamples;let i=r.descriptor;if(void 0===i||r.samples!==s){i={colorAttachments:[{view:null}]},!0!==e.depth&&!0!==e.stencil||(i.depthStencilAttachment={view:this.textureUtils.getDepthBuffer(e.depth,e.stencil).createView()});const t=i.colorAttachments[0];s>0?t.view=this.textureUtils.getColorBuffer().createView():t.resolveTarget=void 0,r.descriptor=i,r.samples=s}const n=i.colorAttachments[0];return s>0?n.resolveTarget=this.context.getCurrentTexture().createView():n.view=this.context.getCurrentTexture().createView(),i}_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;void 0!==i&&s.width===r.width&&s.height===r.height&&s.samples===r.samples||(i={},s.descriptors=i);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:YR}),this.initTimestampQuery(Dt.RENDER,this.getTimestampUID(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;eo&&(i[0]=Math.min(a,o),i[1]=Math.ceil(a/o)),n.dispatchSize=i}i=n.dispatchSize}a.dispatchWorkgroups(i[0],i[1]||1,i[2]||1)}finishCompute(e){const t=this.get(e);t.passEncoderGPU.end(),this.device.queue.submit([t.cmdEncoderGPU.finish()])}_draw(e,t,r,s,i,n,a,o,u){const{object:l,material:d,context:c}=e,h=e.getIndex(),p=null!==h;this.pipelineUtils.setPipeline(o,s),u.pipeline=s;const g=u.bindingGroups;for(let e=0,t=i.length;e65535?4:2);for(let a=0;a1?0:a;!0===p?o.drawIndexed(r[a],s,e[a]/n,0,u):o.draw(r[a],s,e[a],u),t.update(l,r[a],s)}}else if(!0===p){const{vertexCount:r,instanceCount:s,firstVertex:i}=a,n=e.getIndirect();if(null!==n){const t=this.get(n).buffer,r=e.getIndirectOffset(),s=Array.isArray(r)?r:[r];for(let e=0;e0){const i=this.get(e.camera),a=e.camera.cameras,c=e.getBindingGroup("cameraIndex");if(void 0===i.indexesGPU||i.indexesGPU.length!==a.length){const e=this.get(c),t=[],r=new Uint32Array([0,0,0,0]);for(let s=0,i=a.length;s(d("WebGPURenderer: WebGPU is not available, running under WebGL2 backend."),new UR(e)));super(new t(e),e),this.library=new MC,this.isWebGPURenderer=!0}}class FC extends Es{constructor(){super(),this.isBundleGroup=!0,this.type="BundleGroup",this.static=!0,this.version=0}set needsUpdate(e){!0===e&&this.version++}}class LC{constructor(e,t=wn(0,0,1,1)){this.renderer=e,this.outputNode=t,this.outputColorTransform=!0,this.needsUpdate=!0;const r=new mg;r.name="RenderPipeline",this._quadMesh=new ux(r),this._quadMesh.name="Render Pipeline",this._context=null}render(){const e=this.renderer;this._update(),null!==this._context.onBeforeRenderPipeline&&this._context.onBeforeRenderPipeline();const t=e.toneMapping,r=e.outputColorSpace;e.toneMapping=m,e.outputColorSpace=p.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.onAfterRenderPipeline&&this._context.onAfterRenderPipeline()}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={renderPipeline:this,onBeforeRenderPipeline:null,onAfterRenderPipeline:null};let i=this.outputNode;!0===this.outputColorTransform?(i=i.context(s),i=yl(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(){v('RenderPipeline: "renderAsync()" has been deprecated. Use "render()" and "await renderer.init();" when creating the renderer.'),await this.renderer.init(),this.render()}}class PC extends LC{constructor(e,t){v('PostProcessing: "PostProcessing" has been renamed to "RenderPipeline". Please update your code to use "THREE.RenderPipeline" instead.'),super(e,t)}}class DC extends N{constructor(e=1,t=1){super(),this.image={width:e,height:t},this.magFilter=de,this.minFilter=de,this.isStorageTexture=!0,this.mipmapsAutoUpdate=!0}setSize(e,t){this.image.width===e&&this.image.height===t||(this.image.width=e,this.image.height=t,this.dispose())}}class UC extends _x{constructor(e,t){super(e,t,Uint32Array),this.isIndirectStorageBufferAttribute=!0}}class IC extends ws{constructor(e){super(e),this.textures={},this.nodes={}}load(e,t,r,s){const i=new Cs(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):o(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]?(o("NodeLoader: Node type not found:",e),fn()):new this.nodes[e]}}class OC extends Ms{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 VC extends Bs{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 IC;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 OC;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]={id:s.id,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!!(e.context.modelViewMatrix||e.context.modelNormalViewMatrix||e.context.getAO||e.context.getShadow)}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;if(o.id!==i.id)return o.id=i.id,!1;let d=0,c=0;for(const e in u)d++;for(const e in l){c++;const t=l[e],r=u[e];if(void 0===r)return delete l[e],!1;if(t.id!==r.id||t.version!==r.version)return t.id=r.id,t.version=r.version,!1}if(c!==d)return n.geometry.attributes=this.getAttributesData(u),!1;const h=i.index,p=o.indexId,g=o.indexVersion,m=h?h.id:null,f=h?h.version:null;if(p!==m||g!==f)return o.indexId=m,o.indexVersion=f,!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{const r=e.match(t);if(!r)return null;const s=r[1]||r[2]||"",i=r[3].split("?")[0],n=parseInt(r[4],10),a=parseInt(r[5],10);return{fn:s,file:i.split("/").pop(),line:n,column:a}}).filter(e=>e&&!Ds.some(t=>t.test(e.file)))}(e||(new Error).stack)}getLocation(){if(0===this.stack.length)return"[Unknown location]";const e=this.stack[0],t=e.fn;return`${t?`"${t}()" at `:""}"${e.file}:${e.line}"`}getError(e){if(0===this.stack.length)return e;return`${e}\n${this.stack.map(e=>{const t=`${e.file}:${e.line}:${e.column}`;return e.fn?` at ${e.fn} (${t})`:` at ${t}`}).join("\n")}`}}function Is(e,t=0){let r=3735928559^t,s=1103547991^t;if(e instanceof Array)for(let t,i=0;i>>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 Os=e=>Is(e),Vs=e=>Is(e),ks=(...e)=>Is(e),Gs=new Map([[1,"float"],[2,"vec2"],[3,"vec3"],[4,"vec4"],[9,"mat3"],[16,"mat4"]]),zs=new WeakMap;function $s(e){return Gs.get(e)}function Ws(e){if(/[iu]?vec\d/.test(e))return e.startsWith("ivec")?Int32Array:e.startsWith("uvec")?Uint32Array:Float32Array;if(/mat\d/.test(e))return Float32Array;if(/float/.test(e))return Float32Array;if(/uint/.test(e))return Uint32Array;if(/int/.test(e))return Int32Array;throw new Error(`THREE.NodeUtils: Unsupported type: ${e}`)}function Hs(e){return/float|int|uint/.test(e)?1:/vec2/.test(e)?2:/vec3/.test(e)?3:/vec4/.test(e)||/mat2/.test(e)?4:/mat3/.test(e)?9:/mat4/.test(e)?16:void o(`TSL: Unsupported type: ${e}`,new Us)}function qs(e){return/float|int|uint/.test(e)?1:/vec2/.test(e)?2:/vec3/.test(e)?3:/vec4/.test(e)||/mat2/.test(e)?4:/mat3/.test(e)?12:/mat4/.test(e)?16:void o(`TSL: Unsupported type: ${e}`,new Us)}function js(e){return/float|int|uint/.test(e)?4:/vec2/.test(e)?8:/vec3/.test(e)||/vec4/.test(e)?16:/mat2/.test(e)?8:/mat3/.test(e)||/mat4/.test(e)?16:void o(`TSL: Unsupported type: ${e}`,new Us)}function Xs(e){if(null==e)return null;const t=typeof e;return!0===e.isNode?"node":"number"===t?"float":"boolean"===t?"bool":"string"===t?"string":"function"===t?"shader":!0===e.isVector2?"vec2":!0===e.isVector3?"vec3":!0===e.isVector4?"vec4":!0===e.isMatrix2?"mat2":!0===e.isMatrix3?"mat3":!0===e.isMatrix4?"mat4":!0===e.isColor?"color":e instanceof ArrayBuffer?"ArrayBuffer":null}function Ks(o,...u){const l=o?o.slice(-4):void 0;return 1===u.length&&("vec2"===l?u=[u[0],u[0]]:"vec3"===l?u=[u[0],u[0],u[0]]:"vec4"===l&&(u=[u[0],u[0],u[0],u[0]])),"color"===o?new e(...u):"vec2"===l?new t(...u):"vec3"===l?new r(...u):"vec4"===l?new s(...u):"mat2"===l?new i(...u):"mat3"===l?new n(...u):"mat4"===l?new a(...u):"bool"===o?u[0]||!1:"float"===o||"int"===o||"uint"===o?u[0]||0:"string"===o?u[0]||"":"ArrayBuffer"===o?Zs(u[0]):null}function Qs(e){let t=zs.get(e);return void 0===t&&(t={},zs.set(e,t)),t}function Ys(e){let t="";const r=new Uint8Array(e);for(let e=0;ee.charCodeAt(0)).buffer}var Js=Object.freeze({__proto__:null,arrayBufferToBase64:Ys,base64ToArrayBuffer:Zs,getAlignmentFromType:js,getDataFromObject:Qs,getLengthFromType:Hs,getMemoryLengthFromType:qs,getTypeFromLength:$s,getTypedArrayFromType:Ws,getValueFromType:Ks,getValueType:Xs,hash:ks,hashArray:Vs,hashString:Os});const ei={VERTEX:"vertex",FRAGMENT:"fragment"},ti={NONE:"none",FRAME:"frame",RENDER:"render",OBJECT:"object"},ri={BOOLEAN:"bool",INTEGER:"int",FLOAT:"float",VECTOR2:"vec2",VECTOR3:"vec3",VECTOR4:"vec4",MATRIX2:"mat2",MATRIX3:"mat3",MATRIX4:"mat4"},si={READ_ONLY:"readOnly",WRITE_ONLY:"writeOnly",READ_WRITE:"readWrite"},ii=["fragment","vertex"],ni=["setup","analyze","generate"],ai=[...ii,"compute"],oi=["x","y","z","w"],ui={analyze:"setup",generate:"analyze"};let li=0;class di extends u{static get type(){return"Node"}constructor(e=null){super(),this.nodeType=e,this.updateType=ti.NONE,this.updateBeforeType=ti.NONE,this.updateAfterType=ti.NONE,this.version=0,this.name="",this.global=!1,this.parents=!1,this.isNode=!0,this._beforeNodes=null,this._cacheKey=null,this._uuid=null,this._cacheKeyVersion=0,this.id=li++,this.stackTrace=null,!0===di.captureStackTrace&&(this.stackTrace=new Us)}set needsUpdate(e){!0===e&&this.version++}get uuid(){return null===this._uuid&&(this._uuid=l.generateUUID()),this._uuid}get type(){return this.constructor.type}onUpdate(e,t){return this.updateType=t,this.update=e.bind(this),this}onFrameUpdate(e){return this.onUpdate(e,ti.FRAME)}onRenderUpdate(e){return this.onUpdate(e,ti.RENDER)}onObjectUpdate(e){return this.onUpdate(e,ti.OBJECT)}onReference(e){return this.updateReference=e.bind(this),this}updateReference(){return this}isGlobal(){return this.global}*getChildren(){for(const{childNode:e}of this._getChildren())yield e}dispose(){this.dispatchEvent({type:"dispose"})}traverse(e){e(this);for(const t of this.getChildren())t.traverse(e)}_getChildren(e=new Set){const t=[];e.add(this);for(const r of Object.getOwnPropertyNames(this)){const s=this[r];if(!0!==r.startsWith("_")&&!e.has(s))if(!0===Array.isArray(s))for(let e=0;e0&&(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}}di.captureStackTrace=!1;class ci extends di{static get type(){return"ArrayElementNode"}constructor(e,t){super(),this.node=e,this.indexNode=t,this.isArrayElementNode=!0}generateNodeType(e){return this.node.getElementType(e)}getMemberType(e,t){return this.node.getMemberType(e,t)}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 hi extends di{static get type(){return"ConvertNode"}constructor(e,t){super(),this.node=e,this.convertTo=t}generateNodeType(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 pi extends di{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 gi extends pi{static get type(){return"JoinNode"}constructor(e=[],t=null){super(t),this.nodes=e}generateNodeType(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 u=0;for(const t of i){if(u>=s){o(`TSL: Length of parameters exceeds maximum length of function '${r}()' type.`,this.stackTrace);break}let i,l=t.getNodeType(e),d=e.getTypeLength(l);u+d>s&&(o(`TSL: Length of '${r}()' data exceeds maximum length of output type.`,this.stackTrace),d=s-u,l=e.getTypeFromLength(d)),u+=d,i=t.build(e,l);if(e.getComponentType(l)!==n){const t=e.getTypeFromLength(d,n);i=e.format(i,l,t)}a.push(i)}const l=`${e.getType(r)}( ${a.join(", ")} )`;return e.format(l,r,t)}}const mi=oi.join("");class fi extends di{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(oi.indexOf(t)+1,e);return e}getComponentType(e){return e.getComponentType(this.node.getNodeType(e))}generateNodeType(e){return e.getTypeFromLength(this.components.length,this.getComponentType(e))}getScope(){return this.node.getScope()}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===mi.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 yi extends pi{static get type(){return"SetNode"}constructor(e,t,r){super(),this.sourceNode=e,this.components=t,this.targetNode=r}generateNodeType(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;e(e=>e.replace(/r|s/g,"x").replace(/g|t/g,"y").replace(/b|p/g,"z").replace(/a|q/g,"w"))(e).split("").sort().join("");di.prototype.assign=function(...e){if(!0!==this.isStackNode)return null!==Ni?Ni.assign(this,...e):o("TSL: No stack defined for assign operation. Make sure the assign is inside a Fn().",new Us),this;{const t=Si.get("assign");return this.addToStack(t(...e))}},di.prototype.toVarIntent=function(){return this},di.prototype.get=function(e){return new vi(this,e)};const Ei={};function wi(e,t,r){Ei[e]=Ei[t]=Ei[r]={get(){this._cache=this._cache||{};let t=this._cache[e];return void 0===t&&(t=new fi(this,e),this._cache[e]=t),t},set(t){this[e].assign(en(t))}};const s=e.toUpperCase(),i=t.toUpperCase(),n=r.toUpperCase();di.prototype["set"+s]=di.prototype["set"+i]=di.prototype["set"+n]=function(t){const r=Ai(e);return new yi(this,r,en(t))},di.prototype["flip"+s]=di.prototype["flip"+i]=di.prototype["flip"+n]=function(){const t=Ai(e);return new bi(this,t)}}const Ci=["x","y","z","w"],Mi=["r","g","b","a"],Bi=["s","t","p","q"];for(let e=0;e<4;e++){let t=Ci[e],r=Mi[e],s=Bi[e];wi(t,r,s);for(let i=0;i<4;i++){t=Ci[e]+Ci[i],r=Mi[e]+Mi[i],s=Bi[e]+Bi[i],wi(t,r,s);for(let n=0;n<4;n++){t=Ci[e]+Ci[i]+Ci[n],r=Mi[e]+Mi[i]+Mi[n],s=Bi[e]+Bi[i]+Bi[n],wi(t,r,s);for(let a=0;a<4;a++)t=Ci[e]+Ci[i]+Ci[n]+Ci[a],r=Mi[e]+Mi[i]+Mi[n]+Mi[a],s=Bi[e]+Bi[i]+Bi[n]+Bi[a],wi(t,r,s)}}}for(let e=0;e<32;e++)Ei[e]={get(){this._cache=this._cache||{};let t=this._cache[e];return void 0===t&&(t=new ci(this,new _i(e,"uint")),this._cache[e]=t),t},set(t){this[e].assign(en(t))}};Object.defineProperties(di.prototype,Ei);const Fi=new WeakMap,Li=function(e,t=null){for(const r in e)e[r]=en(e[r],t);return e},Pi=function(e,t=null){const r=e.length;for(let s=0;su?(o(`TSL: "${r}" parameter length exceeds limit.`,new Us),t.slice(0,u)):t}return null===t?n=(...t)=>i(new e(...sn(d(t)))):null!==r?(r=en(r),n=(...s)=>i(new e(t,...sn(d(s)),r))):n=(...r)=>i(new e(t,...sn(d(r)))),n.setParameterLength=(...e)=>(1===e.length?a=u=e[0]:2===e.length&&([a,u]=e),n),n.setName=e=>(l=e,n),n},Ui=function(e,...t){return new e(...sn(t))};class Ii extends di{constructor(e,t){super(),this.shaderNode=e,this.rawInputs=t,this.isShaderCallNodeInternal=!0}generateNodeType(e){return this.shaderNode.nodeType||this.getOutputNode(e).getNodeType(e)}getElementType(e){return this.getOutputNode(e).getElementType(e)}getMemberType(e,t){return this.getOutputNode(e).getMemberType(e,t)}call(e){const{shaderNode:t,rawInputs:r}=this,s=e.getNodeProperties(t),i=e.getClosestSubBuild(t.subBuilds)||"",n=i||"default";if(s[n])return s[n];const a=e.subBuildFn,o=e.fnCall;e.subBuildFn=i,e.fnCall=this;let u=null;if(t.layout){let s=Fi.get(e.constructor);void 0===s&&(s=new WeakMap,Fi.set(e.constructor,s));let i=s.get(t);void 0===i&&(i=en(e.buildFunctionNode(t)),s.set(t,i)),e.addInclude(i);const n=r?function(e){let t;rn(e);t=e[0]&&(e[0].isNode||Object.getPrototypeOf(e[0])!==Object.prototype)?[...e]:e[0];return t}(r):null;u=en(i.call(n))}else{const s=new Proxy(e,{get:(e,t,r)=>{let s;return s=Symbol.iterator===t?function*(){yield}:Reflect.get(e,t,r),s}}),i=r?function(e){let t=0;return rn(e),new Proxy(e,{get:(r,s,i)=>{let n;if("length"===s)return n=e.length,n;if(Symbol.iterator===s)n=function*(){for(const t of e)yield en(t)};else{if(e.length>0)if(Object.getPrototypeOf(e[0])===Object.prototype){const r=e[0];n=void 0===r[s]?r[t++]:Reflect.get(r,s,i)}else e[0]instanceof di&&(n=void 0===e[s]?e[t++]:Reflect.get(e,s,i));else n=Reflect.get(r,s,i);n=en(n)}return n}})}(r):null,n=Array.isArray(r)?r.length>0:null!==r,a=t.jsFunc,o=n||a.length>1?a(i,s):a(s);u=en(o)}return e.subBuildFn=a,e.fnCall=o,t.once&&(s[n]=u),u}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),o=e.fnCall;if(e.fnCall=this,"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 e.fnCall=o,r}}class Oi extends di{constructor(e,t){super(t),this.jsFunc=e,this.layout=null,this.global=!0,this.once=!1}setLayout(e){return this.layout=e,this}getLayout(){return this.layout}call(e=null){return new Ii(this,e)}setup(){return this.call()}}const Vi=[!1,!0],ki=[0,1,2,3],Gi=[-1,-2],zi=[.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],$i=new Map;for(const e of Vi)$i.set(e,new _i(e));const Wi=new Map;for(const e of ki)Wi.set(e,new _i(e,"uint"));const Hi=new Map([...Wi].map(e=>new _i(e.value,"int")));for(const e of Gi)Hi.set(e,new _i(e,"int"));const qi=new Map([...Hi].map(e=>new _i(e.value)));for(const e of zi)qi.set(e,new _i(e));for(const e of zi)qi.set(-e,new _i(-e));const ji={bool:$i,uint:Wi,ints:Hi,float:qi},Xi=new Map([...$i,...qi]),Ki=(e,t)=>Xi.has(e)?Xi.get(e):!0===e.isNode?e:new _i(e,t),Qi=function(e,t=null){return(...r)=>{for(const t of r)if(void 0===t)return o(`TSL: Invalid parameter for the type "${e}".`,new Us),new _i(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=[Ks(e,...r)]),1===r.length&&null!==t&&t.has(r[0]))return tn(t.get(r[0]));if(1===r.length){const t=Ki(r[0],e);return t.nodeType===e?tn(t):tn(new hi(t,e))}const s=r.map(e=>Ki(e));return tn(new gi(s,e))}};function Yi(e){return e&&e.isNode&&e.traverse(t=>{t.isConstNode&&(e=t.value)}),Boolean(e)}const Zi=e=>null!=e?e.nodeType||e.convertTo||("string"==typeof e?e:null):null;function Ji(e,t){return new Oi(e,t)}const en=(e,t=null)=>function(e,t=null){const r=Xs(e);return"node"===r?e:null===t&&("float"===r||"boolean"===r)||r&&"shader"!==r&&"string"!==r?en(Ki(e,t)):"shader"===r?e.isFn?e:dn(e):e}(e,t),tn=(e,t=null)=>en(e,t).toVarIntent(),rn=(e,t=null)=>new Li(e,t),sn=(e,t=null)=>new Pi(e,t),nn=(e,t=null,r=null,s=null)=>new Di(e,t,r,s),an=(e,...t)=>new Ui(e,...t),on=(e,t=null,r=null,s={})=>new Di(e,t,r,{...s,intent:!0});let un=0;class ln extends di{constructor(e,t=null){super();let r=null;null!==t&&("object"==typeof t?r=t.return:("string"==typeof t?r=t:o("TSL: Invalid layout type.",new Us),t=null)),this.shaderNode=new Ji(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"+un++,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}generateNodeType(e){return this.shaderNode.getNodeType(e)||"float"}call(...e){const t=this.shaderNode.call(e);return"void"===this.shaderNode.nodeType&&t.toStack(),t.toVarIntent()}once(e=null){return this.shaderNode.once=!0,this.shaderNode.subBuilds=e,this}generate(e){const t=this.getNodeType(e);return o('TSL: "Fn()" was declared but not invoked. Try calling it like "Fn()( ...params )".',this.stackTrace),e.generateConst(t)}}function dn(e,t=null){const r=new ln(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 cn=e=>{Ni=e},hn=()=>Ni,pn=(...e)=>Ni.If(...e);function gn(e){return Ni&&Ni.addToStack(e),e}Ri("toStack",gn);const mn=new Qi("color"),fn=new Qi("float",ji.float),yn=new Qi("int",ji.ints),bn=new Qi("uint",ji.uint),xn=new Qi("bool",ji.bool),Tn=new Qi("vec2"),_n=new Qi("ivec2"),vn=new Qi("uvec2"),Nn=new Qi("bvec2"),Sn=new Qi("vec3"),Rn=new Qi("ivec3"),An=new Qi("uvec3"),En=new Qi("bvec3"),wn=new Qi("vec4"),Cn=new Qi("ivec4"),Mn=new Qi("uvec4"),Bn=new Qi("bvec4"),Fn=new Qi("mat2"),Ln=new Qi("mat3"),Pn=new Qi("mat4");Ri("toColor",mn),Ri("toFloat",fn),Ri("toInt",yn),Ri("toUint",bn),Ri("toBool",xn),Ri("toVec2",Tn),Ri("toIVec2",_n),Ri("toUVec2",vn),Ri("toBVec2",Nn),Ri("toVec3",Sn),Ri("toIVec3",Rn),Ri("toUVec3",An),Ri("toBVec3",En),Ri("toVec4",wn),Ri("toIVec4",Cn),Ri("toUVec4",Mn),Ri("toBVec4",Bn),Ri("toMat2",Fn),Ri("toMat3",Ln),Ri("toMat4",Pn);const Dn=nn(ci).setParameterLength(2),Un=(e,t)=>new hi(en(e),t);Ri("element",Dn),Ri("convert",Un);Ri("append",e=>(d("TSL: .append() has been renamed to .toStack().",new Us),gn(e)));class In extends di{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}customCacheKey(){return Os(this.type+":"+(this.name||"")+":"+(this.varying?"1":"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 On=(e,t)=>new In(e,t),Vn=(e,t)=>new In(e,t,!0),kn=an(In,"vec4","DiffuseColor"),Gn=an(In,"vec3","DiffuseContribution"),zn=an(In,"vec3","EmissiveColor"),$n=an(In,"float","Roughness"),Wn=an(In,"float","Metalness"),Hn=an(In,"float","Clearcoat"),qn=an(In,"float","ClearcoatRoughness"),jn=an(In,"vec3","Sheen"),Xn=an(In,"float","SheenRoughness"),Kn=an(In,"float","Iridescence"),Qn=an(In,"float","IridescenceIOR"),Yn=an(In,"float","IridescenceThickness"),Zn=an(In,"float","AlphaT"),Jn=an(In,"float","Anisotropy"),ea=an(In,"vec3","AnisotropyT"),ta=an(In,"vec3","AnisotropyB"),ra=an(In,"color","SpecularColor"),sa=an(In,"color","SpecularColorBlended"),ia=an(In,"float","SpecularF90"),na=an(In,"float","Shininess"),aa=an(In,"vec4","Output"),oa=an(In,"float","dashSize"),ua=an(In,"float","gapSize"),la=an(In,"float","pointWidth"),da=an(In,"float","IOR"),ca=an(In,"float","Transmission"),ha=an(In,"float","Thickness"),pa=an(In,"float","AttenuationDistance"),ga=an(In,"color","AttenuationColor"),ma=an(In,"float","Dispersion");class fa extends di{static get type(){return"UniformGroupNode"}constructor(e,t=!1,r=1,s=null){super("string"),this.name=e,this.shared=t,this.order=r,this.updateType=s,this.isUniformGroup=!0}update(){this.needsUpdate=!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 ya=(e,t=1,r=null)=>new fa(e,!1,t,r),ba=(e,t=0,r=null)=>new fa(e,!0,t,r),xa=ba("frame",0,ti.FRAME),Ta=ba("render",0,ti.RENDER),_a=ya("object",1,ti.OBJECT);class va extends xi{static get type(){return"UniformNode"}constructor(e,t=null){super(e,t),this.isUniformNode=!0,this.name="",this.groupNode=_a}setName(e){return this.name=e,this}label(e){return d('TSL: "label()" has been deprecated. Use "setName()" instead.',new Us),this.setName(e)}setGroup(e){return this.groupNode=e,this}getGroup(){return this.groupNode}getUniformHash(e){return this.getHash(e)}onUpdate(e,t){return e=e.bind(this),super.onUpdate(t=>{const r=e(t,this);void 0!==r&&(this.value=r)},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 Na=(e,t)=>{const r=Zi(t||e);if(r===e&&(e=Ks(r)),e&&!0===e.isNode){let t=e.value;e.traverse(e=>{!0===e.isConstNode&&(t=e.value)}),e=t}return new va(e,r)};class Sa extends pi{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}generateNodeType(e){return null===this.nodeType?this.values[0].getNodeType(e):this.nodeType}getElementType(e){return this.getNodeType(e)}getMemberType(e,t){return null===this.nodeType?this.values[0].getMemberType(e,t):super.getMemberType(e,t)}generate(e){const t=this.getNodeType(e);return e.generateArray(t,this.count,this.values)}}const Ra=(...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 en(t)};Ri("toArray",(e,t)=>Ra(Array(t).fill(e)));class Aa extends pi{static get type(){return"AssignNode"}constructor(e,t){super(),this.targetNode=e,this.sourceNode=t,this.isAssignNode=!0}hasDependencies(){return!1}generateNodeType(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 oi.join("").slice(0,r)!==t.components}return!1}setup(e){const{targetNode:t,sourceNode:r}=this,s=t.getScope();e.getDataFromNode(s).assign=!0;const i=e.getNodeProperties(this);i.sourceNode=r,i.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)o("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?sn(t):rn(t[0]),new wa(en(e),t));Ri("call",Ca);const Ma={"==":"equal","!=":"notEqual","<":"lessThan",">":"greaterThan","<=":"lessThanEqual",">=":"greaterThanEqual","%":"mod"};class Ba extends pi{static get type(){return"OperatorNode"}constructor(e,t,r,...s){if(super(),s.length>0){let i=new Ba(e,t,r);for(let t=0;t>"===r||"<<"===r)return e.getIntegerType(n);if("!"===r||"&&"===r||"||"===r||"^^"===r)return"bool";if("=="===r||"!="===r||"<"===r||">"===r||"<="===r||">="===r){const t=Math.max(e.getTypeLength(n),e.getTypeLength(a));return t>1?`bvec${t}`:"bool"}if(e.isMatrix(n)){if("float"===a)return n;if(e.isVector(a))return e.getVectorFromMatrix(n);if(e.isMatrix(a))return n}else if(e.isMatrix(a)){if("float"===n)return a;if(e.isVector(n))return e.getVectorFromMatrix(a)}return e.getTypeLength(a)>e.getTypeLength(n)?a:n}generate(e,t){const r=this.op,{aNode:s,bNode:i}=this,n=this.getNodeType(e,t);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),l=i?i.build(e,o):null,d=e.getFunctionOperator(r);if("void"!==t){const s=e.renderer.coordinateSystem===c;if("=="===r||"!="===r||"<"===r||">"===r||"<="===r||">="===r)return s&&e.isVector(a)?e.format(`${this.getOperatorMethod(e,t)}( ${u}, ${l} )`,n,t):e.format(`( ${u} ${r} ${l} )`,n,t);if("%"===r)return e.isInteger(o)?e.format(`( ${u} % ${l} )`,n,t):e.format(`${this.getOperatorMethod(e,n)}( ${u}, ${l} )`,n,t);if("!"===r||"~"===r)return e.format(`(${r}${u})`,a,t);if(d)return e.format(`${d}( ${u}, ${l} )`,n,t);if(e.isMatrix(a)&&"float"===o)return e.format(`( ${l} ${r} ${u} )`,n,t);if("float"===a&&e.isMatrix(o))return e.format(`${u} ${r} ${l}`,n,t);{let i=`( ${u} ${r} ${l} )`;return!s&&"bool"===n&&e.isVector(a)&&e.isVector(o)&&(i=`all${i}`),e.format(i,n,t)}}if("void"!==a)return d?e.format(`${d}( ${u}, ${l} )`,n,t):e.isMatrix(a)&&"float"===o?e.format(`${l} ${r} ${u}`,n,t):e.format(`${u} ${r} ${l}`,n,t)}serialize(e){super.serialize(e),e.op=this.op}deserialize(e){super.deserialize(e),this.op=e.op}}const Fa=on(Ba,"+").setParameterLength(2,1/0).setName("add"),La=on(Ba,"-").setParameterLength(2,1/0).setName("sub"),Pa=on(Ba,"*").setParameterLength(2,1/0).setName("mul"),Da=on(Ba,"/").setParameterLength(2,1/0).setName("div"),Ua=on(Ba,"%").setParameterLength(2).setName("mod"),Ia=on(Ba,"==").setParameterLength(2).setName("equal"),Oa=on(Ba,"!=").setParameterLength(2).setName("notEqual"),Va=on(Ba,"<").setParameterLength(2).setName("lessThan"),ka=on(Ba,">").setParameterLength(2).setName("greaterThan"),Ga=on(Ba,"<=").setParameterLength(2).setName("lessThanEqual"),za=on(Ba,">=").setParameterLength(2).setName("greaterThanEqual"),$a=on(Ba,"&&").setParameterLength(2,1/0).setName("and"),Wa=on(Ba,"||").setParameterLength(2,1/0).setName("or"),Ha=on(Ba,"!").setParameterLength(1).setName("not"),qa=on(Ba,"^^").setParameterLength(2).setName("xor"),ja=on(Ba,"&").setParameterLength(2).setName("bitAnd"),Xa=on(Ba,"~").setParameterLength(1).setName("bitNot"),Ka=on(Ba,"|").setParameterLength(2).setName("bitOr"),Qa=on(Ba,"^").setParameterLength(2).setName("bitXor"),Ya=on(Ba,"<<").setParameterLength(2).setName("shiftLeft"),Za=on(Ba,">>").setParameterLength(2).setName("shiftRight"),Ja=dn(([e])=>(e.addAssign(1),e)),eo=dn(([e])=>(e.subAssign(1),e)),to=dn(([e])=>{const t=yn(e).toConst();return e.addAssign(1),t}),ro=dn(([e])=>{const t=yn(e).toConst();return e.subAssign(1),t});Ri("add",Fa),Ri("sub",La),Ri("mul",Pa),Ri("div",Da),Ri("mod",Ua),Ri("equal",Ia),Ri("notEqual",Oa),Ri("lessThan",Va),Ri("greaterThan",ka),Ri("lessThanEqual",Ga),Ri("greaterThanEqual",za),Ri("and",$a),Ri("or",Wa),Ri("not",Ha),Ri("xor",qa),Ri("bitAnd",ja),Ri("bitNot",Xa),Ri("bitOr",Ka),Ri("bitXor",Qa),Ri("shiftLeft",Ya),Ri("shiftRight",Za),Ri("incrementBefore",Ja),Ri("decrementBefore",eo),Ri("increment",to),Ri("decrement",ro);const so=(e,t)=>(d('TSL: "modInt()" is deprecated. Use "mod( int( ... ) )" instead.',new Us),Ua(yn(e),yn(t)));Ri("modInt",so);class io extends pi{static get type(){return"MathNode"}constructor(e,t,r=null,s=null){if(super(),(e===io.MAX||e===io.MIN)&&arguments.length>3){let i=new io(e,t,r);for(let t=2;tn&&i>a?t:n>a?r:a>i?s:t}generateNodeType(e){const t=this.method;return t===io.LENGTH||t===io.DISTANCE||t===io.DOT?"float":t===io.CROSS?"vec3":t===io.ALL||t===io.ANY?"bool":t===io.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===io.ONE_MINUS)i=La(1,t);else if(s===io.RECIPROCAL)i=Da(1,t);else if(s===io.DIFFERENCE)i=Fo(La(t,r));else if(s===io.TRANSFORM_DIRECTION){let s=t,n=r;e.isMatrix(s.getNodeType(e))?n=wn(Sn(n),0):s=wn(Sn(s),0);const a=Pa(s,n).xyz;i=So(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===io.NEGATE)return e.format("( - "+n.build(e,i)+" )",s,t);{const l=[];return r===io.CROSS?l.push(n.build(e,s),a.build(e,s)):u===c&&r===io.STEP?l.push(n.build(e,1===e.getTypeLength(n.getNodeType(e))?"float":i),a.build(e,i)):u!==c||r!==io.MIN&&r!==io.MAX?r===io.REFRACT?l.push(n.build(e,i),a.build(e,i),o.build(e,"float")):r===io.MIX?l.push(n.build(e,i),a.build(e,i),o.build(e,1===e.getTypeLength(o.getNodeType(e))?"float":i)):(u===h&&r===io.ATAN&&null!==a&&(r="atan2"),"fragment"===e.shaderStage||r!==io.DFDX&&r!==io.DFDY||(d(`TSL: '${r}' is not supported in the ${e.shaderStage} stage.`,this.stackTrace),r="/*"+r+"*/"),l.push(n.build(e,i)),null!==a&&l.push(a.build(e,i)),null!==o&&l.push(o.build(e,i))):l.push(n.build(e,i),a.build(e,1===e.getTypeLength(a.getNodeType(e))?"float":i)),e.format(`${e.getMethod(r,s)}( ${l.join(", ")} )`,s,t)}}serialize(e){super.serialize(e),e.method=this.method}deserialize(e){super.deserialize(e),this.method=e.method}}io.ALL="all",io.ANY="any",io.RADIANS="radians",io.DEGREES="degrees",io.EXP="exp",io.EXP2="exp2",io.LOG="log",io.LOG2="log2",io.SQRT="sqrt",io.INVERSE_SQRT="inversesqrt",io.FLOOR="floor",io.CEIL="ceil",io.NORMALIZE="normalize",io.FRACT="fract",io.SIN="sin",io.COS="cos",io.TAN="tan",io.ASIN="asin",io.ACOS="acos",io.ATAN="atan",io.ABS="abs",io.SIGN="sign",io.LENGTH="length",io.NEGATE="negate",io.ONE_MINUS="oneMinus",io.DFDX="dFdx",io.DFDY="dFdy",io.ROUND="round",io.RECIPROCAL="reciprocal",io.TRUNC="trunc",io.FWIDTH="fwidth",io.TRANSPOSE="transpose",io.DETERMINANT="determinant",io.INVERSE="inverse",io.EQUALS="equals",io.MIN="min",io.MAX="max",io.STEP="step",io.REFLECT="reflect",io.DISTANCE="distance",io.DIFFERENCE="difference",io.DOT="dot",io.CROSS="cross",io.POW="pow",io.TRANSFORM_DIRECTION="transformDirection",io.MIX="mix",io.CLAMP="clamp",io.REFRACT="refract",io.SMOOTHSTEP="smoothstep",io.FACEFORWARD="faceforward";const no=fn(1e-6),ao=fn(1e6),oo=fn(Math.PI),uo=fn(2*Math.PI),lo=fn(2*Math.PI),co=fn(.5*Math.PI),ho=on(io,io.ALL).setParameterLength(1),po=on(io,io.ANY).setParameterLength(1),go=on(io,io.RADIANS).setParameterLength(1),mo=on(io,io.DEGREES).setParameterLength(1),fo=on(io,io.EXP).setParameterLength(1),yo=on(io,io.EXP2).setParameterLength(1),bo=on(io,io.LOG).setParameterLength(1),xo=on(io,io.LOG2).setParameterLength(1),To=on(io,io.SQRT).setParameterLength(1),_o=on(io,io.INVERSE_SQRT).setParameterLength(1),vo=on(io,io.FLOOR).setParameterLength(1),No=on(io,io.CEIL).setParameterLength(1),So=on(io,io.NORMALIZE).setParameterLength(1),Ro=on(io,io.FRACT).setParameterLength(1),Ao=on(io,io.SIN).setParameterLength(1),Eo=on(io,io.COS).setParameterLength(1),wo=on(io,io.TAN).setParameterLength(1),Co=on(io,io.ASIN).setParameterLength(1),Mo=on(io,io.ACOS).setParameterLength(1),Bo=on(io,io.ATAN).setParameterLength(1,2),Fo=on(io,io.ABS).setParameterLength(1),Lo=on(io,io.SIGN).setParameterLength(1),Po=on(io,io.LENGTH).setParameterLength(1),Do=on(io,io.NEGATE).setParameterLength(1),Uo=on(io,io.ONE_MINUS).setParameterLength(1),Io=on(io,io.DFDX).setParameterLength(1),Oo=on(io,io.DFDY).setParameterLength(1),Vo=on(io,io.ROUND).setParameterLength(1),ko=on(io,io.RECIPROCAL).setParameterLength(1),Go=on(io,io.TRUNC).setParameterLength(1),zo=on(io,io.FWIDTH).setParameterLength(1),$o=on(io,io.TRANSPOSE).setParameterLength(1),Wo=on(io,io.DETERMINANT).setParameterLength(1),Ho=on(io,io.INVERSE).setParameterLength(1),qo=on(io,io.MIN).setParameterLength(2,1/0),jo=on(io,io.MAX).setParameterLength(2,1/0),Xo=on(io,io.STEP).setParameterLength(2),Ko=on(io,io.REFLECT).setParameterLength(2),Qo=on(io,io.DISTANCE).setParameterLength(2),Yo=on(io,io.DIFFERENCE).setParameterLength(2),Zo=on(io,io.DOT).setParameterLength(2),Jo=on(io,io.CROSS).setParameterLength(2),eu=on(io,io.POW).setParameterLength(2),tu=e=>Pa(e,e),ru=e=>Pa(e,e,e),su=e=>Pa(e,e,e,e),iu=on(io,io.TRANSFORM_DIRECTION).setParameterLength(2),nu=e=>Pa(Lo(e),eu(Fo(e),1/3)),au=e=>Zo(e,e),ou=on(io,io.MIX).setParameterLength(3),uu=(e,t=0,r=1)=>new io(io.CLAMP,en(e),en(t),en(r)),lu=e=>uu(e),du=on(io,io.REFRACT).setParameterLength(3),cu=on(io,io.SMOOTHSTEP).setParameterLength(3),hu=on(io,io.FACEFORWARD).setParameterLength(3),pu=dn(([e])=>{const t=Zo(e.xy,Tn(12.9898,78.233)),r=Ua(t,oo);return Ro(Ao(r).mul(43758.5453))}),gu=(e,t,r)=>ou(t,r,e),mu=(e,t,r)=>cu(t,r,e),fu=(e,t)=>Xo(t,e),yu=hu,bu=_o;Ri("all",ho),Ri("any",po),Ri("radians",go),Ri("degrees",mo),Ri("exp",fo),Ri("exp2",yo),Ri("log",bo),Ri("log2",xo),Ri("sqrt",To),Ri("inverseSqrt",_o),Ri("floor",vo),Ri("ceil",No),Ri("normalize",So),Ri("fract",Ro),Ri("sin",Ao),Ri("cos",Eo),Ri("tan",wo),Ri("asin",Co),Ri("acos",Mo),Ri("atan",Bo),Ri("abs",Fo),Ri("sign",Lo),Ri("length",Po),Ri("lengthSq",au),Ri("negate",Do),Ri("oneMinus",Uo),Ri("dFdx",Io),Ri("dFdy",Oo),Ri("round",Vo),Ri("reciprocal",ko),Ri("trunc",Go),Ri("fwidth",zo),Ri("min",qo),Ri("max",jo),Ri("step",fu),Ri("reflect",Ko),Ri("distance",Qo),Ri("dot",Zo),Ri("cross",Jo),Ri("pow",eu),Ri("pow2",tu),Ri("pow3",ru),Ri("pow4",su),Ri("transformDirection",iu),Ri("mix",gu),Ri("clamp",uu),Ri("refract",du),Ri("smoothstep",mu),Ri("faceForward",hu),Ri("difference",Yo),Ri("saturate",lu),Ri("cbrt",nu),Ri("transpose",$o),Ri("determinant",Wo),Ri("inverse",Ho),Ri("rand",pu);class xu extends di{static get type(){return"ConditionalNode"}constructor(e,t,r=null){super(),this.condNode=e,this.ifNode=t,this.elseNode=r}generateNodeType(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,r=this.ifNode.isolate(),s=this.elseNode?this.elseNode.isolate():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?On(r).build(e):"";s.nodeProperty=l;const c=i.build(e,"bool");if(e.context.uniformFlow&&null!==a){const s=n.build(e,r),i=a.build(e,r),o=e.getTernary(c,s,i);return e.format(o,r,t)}e.addFlowCode(`\n${e.tab}if ( ${c} ) {\n\n`).addFlowTab();let h=n.build(e,r);if(h&&(u?h=l+" = "+h+";":(h="return "+h+";",null===o&&(d("TSL: Return statement used in an inline 'Fn()'. Define a layout struct to allow return values.",this.stackTrace),h="// "+h))),e.removeFlowTab().addFlowCode(e.tab+"\t"+h+"\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&&(d("TSL: Return statement used in an inline 'Fn()'. Define a layout struct to allow return values.",this.stackTrace),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 Tu=nn(xu).setParameterLength(2,3);Ri("select",Tu);class _u extends di{static get type(){return"ContextNode"}constructor(e=null,t={}){super(),this.isContextNode=!0,this.node=e,this.value=t}getScope(){return this.node.getScope()}generateNodeType(e){return this.node.getNodeType(e)}getFlowContextData(){const e=[];return this.traverse(t=>{!0===t.isContextNode&&e.push(t.value)}),Object.assign({},...e)}getMemberType(e,t){return this.node.getMemberType(e,t)}analyze(e){const t=e.addContext(this.value);this.node.build(e),e.setContext(t)}setup(e){const t=e.addContext(this.value);this.node.build(e),e.setContext(t)}generate(e,t){const r=e.addContext(this.value),s=this.node.build(e,t);return e.setContext(r),s}}const vu=(e=null,t={})=>{let r=e;return null!==r&&!0===r.isNode||(t=r||t,r=null),new _u(r,t)},Nu=e=>vu(e,{uniformFlow:!0}),Su=(e,t)=>vu(e,{nodeName:t});function Ru(e,t,r=null){return vu(r,{getShadow:({light:r,shadowColorNode:s})=>t===r?s.mul(e):s})}function Au(e,t=null){return vu(t,{getAO:(t,{material:r})=>!0===r.transparent?t:null!==t?t.mul(e):e})}function Eu(e,t){return d('TSL: "label()" has been deprecated. Use "setName()" instead.'),Su(e,t)}Ri("context",vu),Ri("label",Eu),Ri("uniformFlow",Nu),Ri("setName",Su),Ri("builtinShadowContext",(e,t,r)=>Ru(t,r,e)),Ri("builtinAOContext",(e,t)=>Au(t,e));class wu extends di{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}isIntent(e){return!0!==e.getDataFromNode(this).forceDeclaration&&this.intent}getIntent(){return this.intent}getMemberType(e,t){return this.node.getMemberType(e,t)}getElementType(e){return this.node.getElementType(e)}generateNodeType(e){return this.node.getNodeType(e)}getArrayCount(e){return this.node.getArrayCount(e)}isAssign(e){return e.getDataFromNode(this).assign}build(...e){const t=e[0];if(!1===this._hasStack(t)&&"setup"===t.buildStage&&(t.context.nodeLoop||t.context.nodeBlock)){let e=!1;if(this.node.isShaderCallNodeInternal&&null===this.node.shaderNode.getLayout()&&t.fnCall&&t.fnCall.shaderNode){if(t.getDataFromNode(this.node.shaderNode).hasLoop){t.getDataFromNode(this).forceDeclaration=!0,e=!0}}const r=t.getBaseStack();e?r.addToStackBefore(this):r.addToStack(this)}return this.isIntent(t)&&!0!==this.isAssign(t)?this.node.build(...e):super.build(...e)}generate(e){const{node:t,name:r,readOnly:s}=this,{renderer:i}=e,n=!0===i.backend.isWebGPUBackend;let a=!1,u=!1;s&&(a=e.isDeterministic(t),u=n?s:a);const l=this.getNodeType(e);if("void"==l){!0!==this.isIntent(e)&&o('TSL: ".toVar()" can not be used with void type.',this.stackTrace);return t.build(e)}const d=e.getVectorType(l),c=t.build(e,d),h=e.getVarFromNode(this,r,d,void 0,u),p=e.getPropertyName(h);let g=p;if(u)if(n)g=a?`const ${p}`:`let ${p}`;else{const r=t.getArrayCount(e);g=`const ${e.getVar(h.type,p,r)}`}return e.addLineFlowCode(`${g} = ${c}`,this),p}_hasStack(e){return void 0!==e.getDataFromNode(this).stack}}const Cu=nn(wu),Mu=(e,t=null)=>Cu(e,t).toStack(),Bu=(e,t=null)=>Cu(e,t,!0).toStack(),Fu=e=>Cu(e).setIntent(!0).toStack();Ri("toVar",Mu),Ri("toConst",Bu),Ri("toVarIntent",Fu);class Lu extends di{static get type(){return"SubBuild"}constructor(e,t,r=null){super(r),this.node=e,this.name=t,this.isSubBuildNode=!0}generateNodeType(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 Pu=(e,t,r=null)=>new Lu(en(e),t,r);class Du extends di{static get type(){return"VaryingNode"}constructor(e,t=null){super(),this.node=Pu(e,"VERTEX"),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)}generateNodeType(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=Pu(this.node,"VERTEX")}return r.needsInterpolation||(r.needsInterpolation="fragment"===e.shaderStage),r}setup(e){this.setupVarying(e),e.flowNodeFromShaderStage(ei.VERTEX,this.node)}analyze(e){this.setupVarying(e),e.flowNodeFromShaderStage(ei.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,ei.VERTEX);e.flowNodeFromShaderStage(ei.VERTEX,r.node,i,n),r[t]=n}return e.getPropertyName(s)}}const Uu=nn(Du).setParameterLength(1,2),Iu=e=>Uu(e);Ri("toVarying",Uu),Ri("toVertexStage",Iu);const Ou=dn(([e])=>{const t=e.mul(.9478672986).add(.0521327014).pow(2.4),r=e.mul(.0773993808),s=e.lessThanEqual(.04045);return ou(t,r,s)}).setLayout({name:"sRGBTransferEOTF",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),Vu=dn(([e])=>{const t=e.pow(.41666).mul(1.055).sub(.055),r=e.mul(12.92),s=e.lessThanEqual(.0031308);return ou(t,r,s)}).setLayout({name:"sRGBTransferOETF",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),ku="WorkingColorSpace";class Gu extends pi{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===ku?p.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!==p.enabled&&r!==s&&r&&s?(p.getTransfer(r)===g&&(i=wn(Ou(i.rgb),i.a)),p.getPrimaries(r)!==p.getPrimaries(s)&&(i=wn(Ln(p._getMatrix(new n,r,s)).mul(i.rgb),i.a)),p.getTransfer(s)===g&&(i=wn(Vu(i.rgb),i.a)),i):i}}const zu=(e,t)=>new Gu(en(e),ku,t),$u=(e,t)=>new Gu(en(e),t,ku);Ri("workingToColorSpace",zu),Ri("colorSpaceToWorking",$u);let Wu=class extends ci{static get type(){return"ReferenceElementNode"}constructor(e,t){super(e,t),this.referenceNode=e,this.isReferenceElementNode=!0}generateNodeType(){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 Hu extends di{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=ti.OBJECT}setGroup(e){return this.group=e,this}element(e){return new Wu(this,en(e))}setNodeType(e){const t=Na(null,e);null!==this.group&&t.setGroup(this.group),this.node=t}generateNodeType(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;enew qu(e,t,r);class Xu extends pi{static get type(){return"ToneMappingNode"}constructor(e,t=Qu,r=null){super("vec3"),this._toneMapping=e,this.exposureNode=t,this.colorNode=r}customCacheKey(){return ks(this._toneMapping)}setToneMapping(e){return this._toneMapping=e,this}getToneMapping(){return this._toneMapping}setup(e){const t=this.colorNode||e.context.color,r=this._toneMapping;if(r===m)return t;let s=null;const i=e.renderer.library.getToneMappingFunction(r);return null!==i?s=wn(i(t.rgb,this.exposureNode),t.a):(o("ToneMappingNode: Unsupported Tone Mapping configuration.",r),s=t),s}}const Ku=(e,t,r)=>new Xu(e,en(t),en(r)),Qu=ju("toneMappingExposure","float");Ri("toneMapping",(e,t,r)=>Ku(t,r,e));const Yu=new WeakMap;function Zu(e,t){let r=Yu.get(e);return void 0===r&&(r=new b(e,t),Yu.set(e,r)),r}class Ju extends xi{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=f,this.instanced=!1,this.attribute=null,this.global=!0,e&&!0===e.isBufferAttribute&&e.itemSize<=4&&(this.attribute=e,this.usage=e.usage,this.instanced=e.isInstancedBufferAttribute)}getHash(e){let t;if(0===this.bufferStride&&0===this.bufferOffset){let r=e.globalCache.getData(this.value);void 0===r&&(r={node:this},e.globalCache.setData(this.value,r)),t=r.node.id}else t=this.id;return String(t)}generateNodeType(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=e.getTypeLength(t),s=this.value,i=this.bufferStride||r,n=this.bufferOffset;let a;a=!0===s.isInterleavedBuffer?s:!0===s.isBufferAttribute?Zu(s.array,i):Zu(s,i);const o=new y(a,r,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=Uu(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}}function el(e,t=null,r=0,s=0,i=f,n=!1){return"mat3"===t||null===t&&9===e.itemSize?Ln(new Ju(e,"vec3",9,0).setUsage(i).setInstanced(n),new Ju(e,"vec3",9,3).setUsage(i).setInstanced(n),new Ju(e,"vec3",9,6).setUsage(i).setInstanced(n)):"mat4"===t||null===t&&16===e.itemSize?Pn(new Ju(e,"vec4",16,0).setUsage(i).setInstanced(n),new Ju(e,"vec4",16,4).setUsage(i).setInstanced(n),new Ju(e,"vec4",16,8).setUsage(i).setInstanced(n),new Ju(e,"vec4",16,12).setUsage(i).setInstanced(n)):new Ju(e,t,r,s).setUsage(i)}const tl=(e,t=null,r=0,s=0)=>el(e,t,r,s),rl=(e,t=null,r=0,s=0)=>el(e,t,r,s,f,!0),sl=(e,t=null,r=0,s=0)=>el(e,t,r,s,x,!0);Ri("toAttribute",e=>tl(e.value));class il extends di{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=ti.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 d('TSL: "label()" has been deprecated. Use "setName()" instead.',new Us),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 nl=(e,t=[64])=>{(0===t.length||t.length>3)&&o("TSL: compute() workgroupSize must have 1, 2, or 3 elements",new Us);for(let e=0;enl(e,r).setCount(t);Ri("compute",al),Ri("computeKernel",nl);class ol extends di{static get type(){return"IsolateNode"}constructor(e,t=!0){super(),this.node=e,this.parent=t,this.isIsolateNode=!0}generateNodeType(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}setParent(e){return this.parent=e,this}getParent(){return this.parent}}const ul=e=>new ol(en(e));function ll(e,t=!0){return d('TSL: "cache()" has been deprecated. Use "isolate()" instead.'),ul(e).setParent(t)}Ri("cache",ll),Ri("isolate",ul);class dl extends di{static get type(){return"BypassNode"}constructor(e,t){super(),this.isBypassNode=!0,this.outputNode=e,this.callNode=t}generateNodeType(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 cl=nn(dl).setParameterLength(2);Ri("bypass",cl);const hl=dn(([e,t,r,s=fn(0),i=fn(1),n=xn(!1)])=>{let a=e.sub(t).div(r.sub(t));return Yi(n)&&(a=a.clamp()),a.mul(i.sub(s)).add(s)});function pl(e,t,r,s=fn(0),i=fn(1)){return hl(e,t,r,s,i,!0)}Ri("remap",hl),Ri("remapClamp",pl);class gl extends di{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 ml=nn(gl).setParameterLength(1,2),fl=e=>(e?Tu(e,ml("discard")):ml("discard")).toStack();Ri("discard",fl);class yl extends pi{static get type(){return"RenderOutputNode"}constructor(e,t,r){super("vec4"),this.colorNode=e,this._toneMapping=t,this.outputColorSpace=r,this.isRenderOutputNode=!0}setToneMapping(e){return this._toneMapping=e,this}getToneMapping(){return this._toneMapping}setup({context:e}){let t=this.colorNode||e.color;const r=(null!==this._toneMapping?this._toneMapping:e.toneMapping)||m,s=(null!==this.outputColorSpace?this.outputColorSpace:e.outputColorSpace)||T;return r!==m&&(t=t.toneMapping(r)),s!==T&&s!==p.workingColorSpace&&(t=t.workingToColorSpace(s)),t}}const bl=(e,t=null,r=null)=>new yl(en(e),t,r);Ri("renderOutput",bl);class xl extends pi{static get type(){return"DebugNode"}constructor(e,t=null){super(),this.node=e,this.callback=t}generateNodeType(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);if(null!==t)t(e,r);else{const t="--- TSL debug - "+e.shaderStage+" shader ---",s="-".repeat(t.length);let i="";i+="// #"+t+"#\n",i+=e.flow.code.replace(/^\t/gm,"")+"\n",i+="/* ... */ "+r+" /* ... */\n",i+="// #"+s+"#\n",_(i)}return r}}const Tl=(e,t=null)=>new xl(en(e),t).toStack();Ri("debug",Tl);class _l extends u{constructor(){super(),this._renderer=null,this.currentFrame=null}get nodeFrame(){return this._renderer._nodes.nodeFrame}setRenderer(e){return this._renderer=e,this}getRenderer(){return this._renderer}init(){}begin(){}finish(){}inspect(){}computeAsync(){}beginCompute(){}finishCompute(){}beginRender(){}finishRender(){}copyTextureToTexture(){}copyFramebufferToTexture(){}}class vl extends di{static get type(){return"InspectorNode"}constructor(e,t="",r=null){super(),this.node=e,this.name=t,this.callback=r,this.updateType=ti.FRAME,this.isInspectorNode=!0}getName(){return this.name||this.node.name}update(e){e.renderer.inspector.inspect(this)}generateNodeType(e){return this.node.getNodeType(e)}setup(e){let t=this.node;return!0===e.context.inspector&&null!==this.callback&&(t=this.callback(t)),!0!==e.renderer.backend.isWebGPUBackend&&e.renderer.inspector.constructor!==_l&&v('TSL: ".toInspector()" is only available with WebGPU.'),t}}function Nl(e,t="",r=null){return(e=en(e)).before(new vl(e,t,r))}Ri("toInspector",Nl);class Sl extends di{static get type(){return"AttributeNode"}constructor(e,t=null){super(t),this.global=!0,this._attributeName=e}getHash(e){return this.getAttributeName(e)}generateNodeType(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 Uu(this).build(e,r)}return d(`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 Rl=(e,t=null)=>new Sl(e,t),Al=(e=0)=>Rl("uv"+(e>0?e:""),"vec2");class El extends di{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 wl=nn(El).setParameterLength(1,2);class Cl extends va{static get type(){return"MaxMipLevelNode"}constructor(e){super(0),this._textureNode=e,this.updateType=ti.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 Ml=nn(Cl).setParameterLength(1);class Bl extends Error{constructor(e,t=null){super(e),this.name="NodeError",this.stackTrace=t}}const Fl=new N;class Ll extends va{static get type(){return"TextureNode"}constructor(e=Fl,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.offsetNode=null,this.sampler=!0,this.updateMatrix=!1,this.updateType=ti.NONE,this.referenceNode=null,this._value=e,this._matrixUniform=null,this._flipYUniform=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}generateNodeType(){return!0===this.value.isDepthTexture?"float":this.value.type===S?"uvec4":this.value.type===R?"ivec4":"vec4"}getInputType(){return"texture"}getDefaultUV(){return Al(this.value.channel)}updateReference(){return this.value}getTransformedUV(e){return null===this._matrixUniform&&(this._matrixUniform=Na(this.value.matrix)),this._matrixUniform.mul(Sn(e,1)).xy}setUpdateMatrix(e){return this.updateMatrix=e,this}setupUV(e,t){return e.isFlipY()&&(null===this._flipYUniform&&(this._flipYUniform=Na(!1)),t=t.toVar(),t=this.sampler?this._flipYUniform.select(t.flipY(),t):this._flipYUniform.select(t.setY(yn(wl(this,this.levelNode).y).sub(t.y).sub(1)),t)),t}setup(e){const t=e.getNodeProperties(this);t.referenceNode=this.referenceNode;const r=this.value;if(!r||!0!==r.isTexture)throw new Bl("THREE.TSL: `texture( value )` function expects a valid instance of THREE.Texture().",this.stackTrace);const s=dn(()=>{let t=this.uvNode;return null!==t&&!0!==e.context.forceUVContext||!e.context.getUV||(t=e.context.getUV(this,e)),t||(t=this.getDefaultUV()),!0===this.updateMatrix&&(t=this.getTransformedUV(t)),t=this.setupUV(e,t),this.updateType=null!==this._matrixUniform||null!==this._flipYUniform?ti.OBJECT:ti.NONE,t})();let i=this.levelNode;null===i&&e.context.getTextureLevel&&(i=e.context.getTextureLevel(this));let n=null,a=null;if(null!==this.compareNode)if(e.renderer.hasCompatibility(A.TEXTURE_COMPARE))n=this.compareNode;else{const e=r.compareFunction;null===e||e===E||e===w||e===C||e===M?a=this.compareNode:(n=this.compareNode,v('TSL: Only "LessCompare", "LessEqualCompare", "GreaterCompare" and "GreaterEqualCompare" are supported for depth texture comparison fallback.'))}t.uvNode=s,t.levelNode=i,t.biasNode=this.biasNode,t.compareNode=n,t.compareStepNode=a,t.gradNode=this.gradNode,t.depthNode=this.depthNode,t.offsetNode=this.offsetNode}generateUV(e,t){return t.build(e,!0===this.sampler?"vec2":"ivec2")}generateOffset(e,t){return t.build(e,"ivec2")}generateSnippet(e,t,r,s,i,n,a,o,u){const l=this.value;let d;return d=i?e.generateTextureBias(l,t,r,i,n,u):o?e.generateTextureGrad(l,t,r,o,n,u):a?e.generateTextureCompare(l,t,r,a,n,u):!1===this.sampler?e.generateTextureLoad(l,t,r,s,n,u):s?e.generateTextureLevel(l,t,r,s,n,u):e.generateTexture(l,t,r,n,u),d}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),a=this.getNodeType(e);let o=n.propertyName;if(void 0===o){const{uvNode:t,levelNode:u,biasNode:l,compareNode:d,compareStepNode:c,depthNode:h,gradNode:p,offsetNode:g}=s,m=this.generateUV(e,t),f=u?u.build(e,"float"):null,y=l?l.build(e,"float"):null,b=h?h.build(e,"int"):null,x=d?d.build(e,"float"):null,T=c?c.build(e,"float"):null,_=p?[p[0].build(e,"vec2"),p[1].build(e,"vec2")]:null,v=g?this.generateOffset(e,g):null;let N=b;null===N&&r.isArrayTexture&&!0!==this.isTexture3DNode&&(N="0");const S=e.getVarFromNode(this);o=e.getPropertyName(S);let R=this.generateSnippet(e,i,m,f,y,N,x,_,v);if(null!==T){const t=r.compareFunction;R=t===C||t===M?Xo(ml(R,a),ml(T,"float")).build(e,a):Xo(ml(T,"float"),ml(R,a)).build(e,a)}e.addLineFlowCode(`${o} = ${R}`,this),n.snippet=R,n.propertyName=o}let u=o;return e.needsToWorkingColorSpace(r)&&(u=$u(ml(u,a),r.colorSpace).setup(e).build(e,a)),e.format(u,a,t)}}setSampler(e){return this.sampler=e,this}getSampler(){return this.sampler}sample(e){const t=this.clone();return t.uvNode=en(e),t.referenceNode=this.getBase(),en(t)}load(e){return this.sample(e).setSampler(!1)}blur(e){const t=this.clone();t.biasNode=en(e).mul(Ml(t)),t.referenceNode=this.getBase();const r=t.value;return!1===t.generateMipmaps&&(r&&!1===r.generateMipmaps||r.minFilter===B||r.magFilter===B)&&(d("TSL: texture().blur() requires mipmaps and sampling. Use .generateMipmaps=true and .minFilter/.magFilter=THREE.LinearFilter in the Texture."),t.biasNode=null),en(t)}level(e){const t=this.clone();return t.levelNode=en(e),t.referenceNode=this.getBase(),en(t)}size(e){return wl(this,e)}bias(e){const t=this.clone();return t.biasNode=en(e),t.referenceNode=this.getBase(),en(t)}getBase(){return this.referenceNode?this.referenceNode.getBase():this}compare(e){const t=this.clone();return t.compareNode=en(e),t.referenceNode=this.getBase(),en(t)}grad(e,t){const r=this.clone();return r.gradNode=[en(e),en(t)],r.referenceNode=this.getBase(),en(r)}depth(e){const t=this.clone();return t.depthNode=en(e),t.referenceNode=this.getBase(),en(t)}offset(e){const t=this.clone();return t.offsetNode=en(e),t.referenceNode=this.getBase(),en(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();const r=this._flipYUniform;null!==r&&(r.value=e.image instanceof ImageBitmap&&!0===e.flipY||!0===e.isRenderTargetTexture||!0===e.isFramebufferTexture||!0===e.isDepthTexture)}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.offsetNode=this.offsetNode,e}}const Pl=nn(Ll).setParameterLength(1,4).setName("texture"),Dl=(e=Fl,t=null,r=null,s=null)=>{let i;return e&&!0===e.isTextureNode?(i=en(e.clone()),i.referenceNode=e.getBase(),null!==t&&(i.uvNode=en(t)),null!==r&&(i.levelNode=en(r)),null!==s&&(i.biasNode=en(s))):i=Pl(e,t,r,s),i},Ul=(...e)=>Dl(...e).setSampler(!1);class Il extends va{static get type(){return"BufferNode"}constructor(e,t,r=0){super(e,t),this.isBufferNode=!0,this.bufferType=t,this.bufferCount=r,this.updateRanges=[]}addUpdateRange(e,t){this.updateRanges.push({start:e,count:t})}clearUpdateRanges(){this.updateRanges.length=0}getElementType(e){return this.getNodeType(e)}getInputType(){return"buffer"}}const Ol=(e,t,r)=>new Il(e,t,r);class Vl extends ci{static get type(){return"UniformArrayElementNode"}constructor(e,t){super(e,t),this.isArrayBufferElementNode=!0}generate(e){const t=super.generate(e),r=this.getNodeType(e),s=this.node.getPaddedType();return e.format(t,s,r)}}class kl extends Il{static get type(){return"UniformArrayNode"}constructor(e,t=null){super(null),this.array=e,this.elementType=null===t?Xs(e[0]):t,this.paddedType=this.getPaddedType(),this.updateType=ti.RENDER,this.isArrayBufferNode=!0}generateNodeType(){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;rnew kl(e,t);class zl extends di{constructor(e){super("float"),this.name=e,this.isBuiltinNode=!0}generate(){return this.name}}const $l=nn(zl).setParameterLength(1);let Wl,Hl;class ql extends di{static get type(){return"ScreenNode"}constructor(e){super(),this.scope=e,this._output=null,this.isViewportNode=!0}generateNodeType(){return this.scope===ql.DPR?"float":this.scope===ql.VIEWPORT?"vec4":"vec2"}getUpdateType(){let e=ti.NONE;return this.scope!==ql.SIZE&&this.scope!==ql.VIEWPORT&&this.scope!==ql.DPR||(e=ti.RENDER),this.updateType=e,e}update({renderer:e}){const t=e.getRenderTarget();this.scope===ql.VIEWPORT?null!==t?Hl.copy(t.viewport):(e.getViewport(Hl),Hl.multiplyScalar(e.getPixelRatio())):this.scope===ql.DPR?this._output.value=e.getPixelRatio():null!==t?(Wl.width=t.width,Wl.height=t.height):e.getDrawingBufferSize(Wl)}setup(){const e=this.scope;let r=null;return r=e===ql.SIZE?Na(Wl||(Wl=new t)):e===ql.VIEWPORT?Na(Hl||(Hl=new s)):e===ql.DPR?Na(1):Tn(Ql.div(Kl)),this._output=r,r}generate(e){if(this.scope===ql.COORDINATE){let t=e.getFragCoord();if(e.isFlipY()){const r=e.getNodeProperties(Kl).outputNode.build(e);t=`${e.getType("vec2")}( ${t}.x, ${r}.y - ${t}.y )`}return t}return super.generate(e)}}ql.COORDINATE="coordinate",ql.VIEWPORT="viewport",ql.SIZE="size",ql.UV="uv",ql.DPR="dpr";const jl=an(ql,ql.DPR),Xl=an(ql,ql.UV),Kl=an(ql,ql.SIZE),Ql=an(ql,ql.COORDINATE),Yl=an(ql,ql.VIEWPORT),Zl=Yl.zw,Jl=Ql.sub(Yl.xy),ed=Jl.div(Zl),td=dn(()=>(d('TSL: "viewportResolution" is deprecated. Use "screenSize" instead.',new Us),Kl),"vec2").once()();let rd=null,sd=null,id=null,nd=null,ad=null,od=null,ud=null,ld=null,dd=null,cd=null,hd=null,pd=null,gd=null,md=null;const fd=Na(0,"uint").setName("u_cameraIndex").setGroup(ba("cameraIndex")).toVarying("v_cameraIndex"),yd=Na("float").setName("cameraNear").setGroup(Ta).onRenderUpdate(({camera:e})=>e.near),bd=Na("float").setName("cameraFar").setGroup(Ta).onRenderUpdate(({camera:e})=>e.far),xd=dn(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.projectionMatrix);null===sd?sd=Gl(r).setGroup(Ta).setName("cameraProjectionMatrices"):sd.array=r,t=sd.element(e.isMultiViewCamera?$l("gl_ViewID_OVR"):fd).toConst("cameraProjectionMatrix")}else null===rd&&(rd=Na(e.projectionMatrix).setName("cameraProjectionMatrix").setGroup(Ta).onRenderUpdate(({camera:e})=>e.projectionMatrix)),t=rd;return t}).once()(),Td=dn(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.projectionMatrixInverse);null===nd?nd=Gl(r).setGroup(Ta).setName("cameraProjectionMatricesInverse"):nd.array=r,t=nd.element(e.isMultiViewCamera?$l("gl_ViewID_OVR"):fd).toConst("cameraProjectionMatrixInverse")}else null===id&&(id=Na(e.projectionMatrixInverse).setName("cameraProjectionMatrixInverse").setGroup(Ta).onRenderUpdate(({camera:e})=>e.projectionMatrixInverse)),t=id;return t}).once()(),_d=dn(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.matrixWorldInverse);null===od?od=Gl(r).setGroup(Ta).setName("cameraViewMatrices"):od.array=r,t=od.element(e.isMultiViewCamera?$l("gl_ViewID_OVR"):fd).toConst("cameraViewMatrix")}else null===ad&&(ad=Na(e.matrixWorldInverse).setName("cameraViewMatrix").setGroup(Ta).onRenderUpdate(({camera:e})=>e.matrixWorldInverse)),t=ad;return t}).once()(),vd=dn(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.matrixWorld);null===ld?ld=Gl(r).setGroup(Ta).setName("cameraWorldMatrices"):ld.array=r,t=ld.element(e.isMultiViewCamera?$l("gl_ViewID_OVR"):fd).toConst("cameraWorldMatrix")}else null===ud&&(ud=Na(e.matrixWorld).setName("cameraWorldMatrix").setGroup(Ta).onRenderUpdate(({camera:e})=>e.matrixWorld)),t=ud;return t}).once()(),Nd=dn(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.normalMatrix);null===cd?cd=Gl(r).setGroup(Ta).setName("cameraNormalMatrices"):cd.array=r,t=cd.element(e.isMultiViewCamera?$l("gl_ViewID_OVR"):fd).toConst("cameraNormalMatrix")}else null===dd&&(dd=Na(e.normalMatrix).setName("cameraNormalMatrix").setGroup(Ta).onRenderUpdate(({camera:e})=>e.normalMatrix)),t=dd;return t}).once()(),Sd=dn(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const s=[];for(let t=0,i=e.cameras.length;t{const r=e.cameras,s=t.array;for(let e=0,t=r.length;et.value.setFromMatrixPosition(e.matrixWorld))),t=hd;return t}).once()(),Rd=dn(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.viewport);null===md?md=Gl(r,"vec4").setGroup(Ta).setName("cameraViewports"):md.array=r,t=md.element(fd).toConst("cameraViewport")}else null===gd&&(gd=wn(0,0,Kl.x,Kl.y).toConst("cameraViewport")),t=gd;return t}).once()(),Ad=new F;class Ed extends di{static get type(){return"Object3DNode"}constructor(e,t=null){super(),this.scope=e,this.object3d=t,this.updateType=ti.OBJECT,this.uniformNode=new va(null)}generateNodeType(){const e=this.scope;return e===Ed.WORLD_MATRIX?"mat4":e===Ed.POSITION||e===Ed.VIEW_POSITION||e===Ed.DIRECTION||e===Ed.SCALE?"vec3":e===Ed.RADIUS?"float":void 0}update(e){const t=this.object3d,s=this.uniformNode,i=this.scope;if(i===Ed.WORLD_MATRIX)s.value=t.matrixWorld;else if(i===Ed.POSITION)s.value=s.value||new r,s.value.setFromMatrixPosition(t.matrixWorld);else if(i===Ed.SCALE)s.value=s.value||new r,s.value.setFromMatrixScale(t.matrixWorld);else if(i===Ed.DIRECTION)s.value=s.value||new r,t.getWorldDirection(s.value);else if(i===Ed.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===Ed.RADIUS){const r=e.object.geometry;null===r.boundingSphere&&r.computeBoundingSphere(),Ad.copy(r.boundingSphere).applyMatrix4(t.matrixWorld),s.value=Ad.radius}}generate(e){const t=this.scope;return t===Ed.WORLD_MATRIX?this.uniformNode.nodeType="mat4":t===Ed.POSITION||t===Ed.VIEW_POSITION||t===Ed.DIRECTION||t===Ed.SCALE?this.uniformNode.nodeType="vec3":t===Ed.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}}Ed.WORLD_MATRIX="worldMatrix",Ed.POSITION="position",Ed.SCALE="scale",Ed.VIEW_POSITION="viewPosition",Ed.DIRECTION="direction",Ed.RADIUS="radius";const wd=nn(Ed,Ed.DIRECTION).setParameterLength(1),Cd=nn(Ed,Ed.WORLD_MATRIX).setParameterLength(1),Md=nn(Ed,Ed.POSITION).setParameterLength(1),Bd=nn(Ed,Ed.SCALE).setParameterLength(1),Fd=nn(Ed,Ed.VIEW_POSITION).setParameterLength(1),Ld=nn(Ed,Ed.RADIUS).setParameterLength(1);class Pd extends Ed{static get type(){return"ModelNode"}constructor(e){super(e)}update(e){this.object3d=e.object,super.update(e)}}const Dd=an(Pd,Pd.DIRECTION),Ud=an(Pd,Pd.WORLD_MATRIX),Id=an(Pd,Pd.POSITION),Od=an(Pd,Pd.SCALE),Vd=an(Pd,Pd.VIEW_POSITION),kd=an(Pd,Pd.RADIUS),Gd=Na(new n).onObjectUpdate(({object:e},t)=>t.value.getNormalMatrix(e.matrixWorld)),zd=Na(new a).onObjectUpdate(({object:e},t)=>t.value.copy(e.matrixWorld).invert()),$d=dn(e=>e.context.modelViewMatrix||Wd).once()().toVar("modelViewMatrix"),Wd=_d.mul(Ud),Hd=dn(e=>(e.context.isHighPrecisionModelViewMatrix=!0,Na("mat4").onObjectUpdate(({object:e,camera:t})=>e.modelViewMatrix.multiplyMatrices(t.matrixWorldInverse,e.matrixWorld)))).once()().toVar("highpModelViewMatrix"),qd=dn(e=>{const t=e.context.isHighPrecisionModelViewMatrix;return Na("mat3").onObjectUpdate(({object:e,camera:r})=>(!0!==t&&e.modelViewMatrix.multiplyMatrices(r.matrixWorldInverse,e.matrixWorld),e.normalMatrix.getNormalMatrix(e.modelViewMatrix)))}).once()().toVar("highpModelNormalViewMatrix"),jd=dn(e=>"fragment"!==e.shaderStage?(v("TSL: `clipSpace` is only available in fragment stage."),wn()):e.context.clipSpace.toVarying("v_clipSpace")).once()(),Xd=Rl("position","vec3"),Kd=Xd.toVarying("positionLocal"),Qd=Xd.toVarying("positionPrevious"),Yd=dn(e=>Ud.mul(Kd).xyz.toVarying(e.getSubBuildProperty("v_positionWorld")),"vec3").once(["POSITION"])(),Zd=dn(()=>Kd.transformDirection(Ud).toVarying("v_positionWorldDirection").normalize().toVar("positionWorldDirection"),"vec3").once(["POSITION"])(),Jd=dn(e=>{if("fragment"===e.shaderStage&&e.material.vertexNode){const e=Td.mul(jd);return e.xyz.div(e.w).toVar("positionView")}return e.context.setupPositionView().toVarying("v_positionView")},"vec3").once(["POSITION","VERTEX"])(),ec=dn(e=>{let t;return t=e.camera.isOrthographicCamera?Sn(0,0,1):Jd.negate().toVarying("v_positionViewDirection").normalize(),t.toVar("positionViewDirection")},"vec3").once(["POSITION"])();class tc extends di{static get type(){return"FrontFacingNode"}constructor(){super("bool"),this.isFrontFacingNode=!0}generate(e){if("fragment"!==e.shaderStage)return"true";const{material:t}=e;return t.side===L?"false":e.getFrontFacing()}}const rc=an(tc),sc=fn(rc).mul(2).sub(1),ic=dn(([e],{material:t})=>{const r=t.side;return r===L?e=e.mul(-1):r===P&&(e=e.mul(sc)),e}),nc=Rl("normal","vec3"),ac=dn(e=>!1===e.geometry.hasAttribute("normal")?(d('TSL: Vertex attribute "normal" not found on geometry.'),Sn(0,1,0)):nc,"vec3").once()().toVar("normalLocal"),oc=Jd.dFdx().cross(Jd.dFdy()).normalize().toVar("normalFlat"),uc=dn(e=>{let t;return t=e.isFlatShading()?oc:gc(ac).toVarying("v_normalViewGeometry").normalize(),t},"vec3").once()().toVar("normalViewGeometry"),lc=dn(e=>{let t=uc.transformDirection(_d);return!0!==e.isFlatShading()&&(t=t.toVarying("v_normalWorldGeometry")),t.normalize().toVar("normalWorldGeometry")},"vec3").once()(),dc=dn(e=>{let t;return"NORMAL"===e.subBuildFn||"VERTEX"===e.subBuildFn?(t=uc,!0!==e.isFlatShading()&&(t=ic(t))):t=e.context.setupNormal().context({getUV:null,getTextureLevel:null}),t},"vec3").once(["NORMAL","VERTEX"])().toVar("normalView"),cc=dc.transformDirection(_d).toVar("normalWorld"),hc=dn(({subBuildFn:e,context:t})=>{let r;return r="NORMAL"===e||"VERTEX"===e?dc:t.setupClearcoatNormal().context({getUV:null,getTextureLevel:null}),r},"vec3").once(["NORMAL","VERTEX"])().toVar("clearcoatNormalView"),pc=dn(([e,t=Ud])=>{const r=Ln(t),s=e.div(Sn(r[0].dot(r[0]),r[1].dot(r[1]),r[2].dot(r[2])));return r.mul(s).xyz}),gc=dn(([e],t)=>{const r=t.context.modelNormalViewMatrix;if(r)return r.transformDirection(e);const s=Gd.mul(e);return _d.transformDirection(s)}),mc=dn(()=>(d('TSL: "transformedNormalView" is deprecated. Use "normalView" instead.'),dc)).once(["NORMAL","VERTEX"])(),fc=dn(()=>(d('TSL: "transformedNormalWorld" is deprecated. Use "normalWorld" instead.'),cc)).once(["NORMAL","VERTEX"])(),yc=dn(()=>(d('TSL: "transformedClearcoatNormalView" is deprecated. Use "clearcoatNormalView" instead.'),hc)).once(["NORMAL","VERTEX"])(),bc=new D,xc=new a,Tc=Na(0).onReference(({material:e})=>e).onObjectUpdate(({material:e})=>e.refractionRatio),_c=Na(1).onReference(({material:e})=>e).onObjectUpdate(function({material:e,scene:t}){return e.envMap?e.envMapIntensity:t.environmentIntensity}),vc=Na(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?(bc.copy(r),xc.makeRotationFromEuler(bc)):xc.identity(),xc}),Nc=ec.negate().reflect(dc),Sc=ec.negate().refract(dc,Tc),Rc=Nc.transformDirection(_d).toVar("reflectVector"),Ac=Sc.transformDirection(_d).toVar("reflectVector"),Ec=new U;class wc extends Ll{static get type(){return"CubeTextureNode"}constructor(e,t=null,r=null,s=null){super(e,t,r,s),this.isCubeTextureNode=!0}getInputType(){return!0===this.value.isDepthTexture?"cubeDepthTexture":"cubeTexture"}getDefaultUV(){const e=this.value;return e.mapping===I?Rc:e.mapping===O?Ac:(o('CubeTextureNode: Mapping "%s" not supported.',e.mapping),Sn(0,0,0))}setUpdateMatrix(){}setupUV(e,t){const r=this.value;return!0===r.isDepthTexture?e.renderer.coordinateSystem===h?Sn(t.x,t.y.negate(),t.z):t:(e.renderer.coordinateSystem!==h&&r.isRenderTargetTexture||(t=Sn(t.x.negate(),t.yz)),vc.mul(t))}generateUV(e,t){return t.build(e,!0===this.sampler?"vec3":"ivec3")}}const Cc=nn(wc).setParameterLength(1,4).setName("cubeTexture"),Mc=(e=Ec,t=null,r=null,s=null)=>{let i;return e&&!0===e.isCubeTextureNode?(i=en(e.clone()),i.referenceNode=e,null!==t&&(i.uvNode=en(t)),null!==r&&(i.levelNode=en(r)),null!==s&&(i.biasNode=en(s))):i=Cc(e,t,r,s),i};class Bc extends ci{static get type(){return"ReferenceElementNode"}constructor(e,t){super(e,t),this.referenceNode=e,this.isReferenceElementNode=!0}generateNodeType(){return this.referenceNode.uniformType}generate(e){const t=super.generate(e),r=this.referenceNode.getNodeType(e),s=this.getNodeType(e);return e.format(t,r,s)}}class Fc extends di{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=ti.OBJECT}element(e){return new Bc(this,en(e))}setGroup(e){return this.group=e,this}setName(e){return this.name=e,this}label(e){return d('TSL: "label()" has been deprecated. Use "setName()" instead.'),this.setName(e)}setNodeType(e){let t=null;t=null!==this.count?Ol(null,e,this.count):Array.isArray(this.getValueFromReference())?Gl(null,e):"texture"===e?Dl(null):"cubeTexture"===e?Mc(null):Na(null,e),null!==this.group&&t.setGroup(this.group),null!==this.name&&t.setName(this.name),this.node=t}generateNodeType(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;enew Fc(e,t,r),Pc=(e,t,r,s)=>new Fc(e,t,s,r);class Dc extends Fc{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 Uc=(e,t,r=null)=>new Dc(e,t,r),Ic=Al(),Oc=Jd.dFdx(),Vc=Jd.dFdy(),kc=Ic.dFdx(),Gc=Ic.dFdy(),zc=dc,$c=Vc.cross(zc),Wc=zc.cross(Oc),Hc=$c.mul(kc.x).add(Wc.mul(Gc.x)),qc=$c.mul(kc.y).add(Wc.mul(Gc.y)),jc=Hc.dot(Hc).max(qc.dot(qc)),Xc=jc.equal(0).select(0,jc.inverseSqrt()),Kc=Hc.mul(Xc).toVar("tangentViewFrame"),Qc=qc.mul(Xc).toVar("bitangentViewFrame"),Yc=Rl("tangent","vec4"),Zc=Yc.xyz.toVar("tangentLocal"),Jc=dn(e=>{let t;return t="VERTEX"===e.subBuildFn||e.geometry.hasAttribute("tangent")?$d.mul(wn(Zc,0)).xyz.toVarying("v_tangentView").normalize():Kc,!0!==e.isFlatShading()&&(t=ic(t)),t},"vec3").once(["NORMAL","VERTEX"])().toVar("tangentView"),eh=Jc.transformDirection(_d).toVarying("v_tangentWorld").normalize().toVar("tangentWorld"),th=dn(([e,t],r)=>{let s=e.mul(Yc.w).xyz;return"NORMAL"===r.subBuildFn&&!0!==r.isFlatShading()&&(s=s.toVarying(t)),s}).once(["NORMAL"]),rh=th(nc.cross(Yc),"v_bitangentGeometry").normalize().toVar("bitangentGeometry"),sh=th(ac.cross(Zc),"v_bitangentLocal").normalize().toVar("bitangentLocal"),ih=dn(e=>{let t;return t="VERTEX"===e.subBuildFn||e.geometry.hasAttribute("tangent")?th(dc.cross(Jc),"v_bitangentView").normalize():Qc,!0!==e.isFlatShading()&&(t=ic(t)),t},"vec3").once(["NORMAL","VERTEX"])().toVar("bitangentView"),nh=th(cc.cross(eh),"v_bitangentWorld").normalize().toVar("bitangentWorld"),ah=Ln(Jc,ih,dc).toVar("TBNViewMatrix"),oh=ec.mul(ah),uh=dn(()=>{let e=ta.cross(ec);return e=e.cross(ta).normalize(),e=ou(e,dc,Jn.mul($n.oneMinus()).oneMinus().pow2().pow2()).normalize(),e}).once()(),lh=e=>en(e).mul(.5).add(.5),dh=e=>Sn(e,To(lu(fn(1).sub(Zo(e,e)))));class ch extends pi{static get type(){return"NormalMapNode"}constructor(e,t=null){super("vec3"),this.node=e,this.scaleNode=t,this.normalMapType=V,this.unpackNormalMode=k}setup(e){const{normalMapType:t,scaleNode:r,unpackNormalMode:s}=this;let i=this.node.mul(2).sub(1);if(t===V?s===G?i=dh(i.xy):s===z?i=dh(i.yw):s!==k&&console.error(`THREE.NodeMaterial: Unexpected unpack normal mode: ${s}`):s!==k&&console.error(`THREE.NodeMaterial: Normal map type '${t}' is not compatible with unpack normal mode '${s}'`),null!==r){let t=r;!0===e.isFlatShading()&&(t=ic(t)),i=Sn(i.xy.mul(t),i.z)}let n=null;return t===$?n=gc(i):t===V?n=ah.mul(i).normalize():(o(`NodeMaterial: Unsupported normal map type: ${t}`),n=dc),n}}const hh=nn(ch).setParameterLength(1,2),ph=dn(({textureNode:e,bumpScale:t})=>{const r=t=>e.isolate().context({getUV:e=>t(e.uvNode||Al()),forceUVContext:!0}),s=fn(r(e=>e));return Tn(fn(r(e=>e.add(e.dFdx()))).sub(s),fn(r(e=>e.add(e.dFdy()))).sub(s)).mul(t)}),gh=dn(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(sc),l=u.sign().mul(s.x.mul(a).add(s.y.mul(o)));return u.abs().mul(r).sub(l).normalize()});class mh extends pi{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=ph({textureNode:this.textureNode,bumpScale:e});return gh({surf_pos:Jd,surf_norm:dc,dHdxy:t})}}const fh=nn(mh).setParameterLength(1,2),yh=new Map;class bh extends di{static get type(){return"MaterialNode"}constructor(e){super(),this.scope=e}getCache(e,t){let r=yh.get(e);return void 0===r&&(r=Uc(e,t),yh.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===bh.COLOR){const e=void 0!==t.color?this.getColor(r):Sn();s=t.map&&!0===t.map.isTexture?e.mul(this.getTexture("map")):e}else if(r===bh.OPACITY){const e=this.getFloat(r);s=t.alphaMap&&!0===t.alphaMap.isTexture?e.mul(this.getTexture("alpha")):e}else if(r===bh.SPECULAR_STRENGTH)s=t.specularMap&&!0===t.specularMap.isTexture?this.getTexture("specular").r:fn(1);else if(r===bh.SPECULAR_INTENSITY){const e=this.getFloat(r);s=t.specularIntensityMap&&!0===t.specularIntensityMap.isTexture?e.mul(this.getTexture(r).a):e}else if(r===bh.SPECULAR_COLOR){const e=this.getColor(r);s=t.specularColorMap&&!0===t.specularColorMap.isTexture?e.mul(this.getTexture(r).rgb):e}else if(r===bh.ROUGHNESS){const e=this.getFloat(r);s=t.roughnessMap&&!0===t.roughnessMap.isTexture?e.mul(this.getTexture(r).g):e}else if(r===bh.METALNESS){const e=this.getFloat(r);s=t.metalnessMap&&!0===t.metalnessMap.isTexture?e.mul(this.getTexture(r).b):e}else if(r===bh.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===bh.NORMAL)t.normalMap?(s=hh(this.getTexture("normal"),this.getCache("normalScale","vec2")),s.normalMapType=t.normalMapType,t.normalMap.format!=W&&t.normalMap.format!=H&&t.normalMap.format!=q||(s.unpackNormalMode=G)):s=t.bumpMap?fh(this.getTexture("bump").r,this.getFloat("bumpScale")):dc;else if(r===bh.CLEARCOAT){const e=this.getFloat(r);s=t.clearcoatMap&&!0===t.clearcoatMap.isTexture?e.mul(this.getTexture(r).r):e}else if(r===bh.CLEARCOAT_ROUGHNESS){const e=this.getFloat(r);s=t.clearcoatRoughnessMap&&!0===t.clearcoatRoughnessMap.isTexture?e.mul(this.getTexture(r).r):e}else if(r===bh.CLEARCOAT_NORMAL)s=t.clearcoatNormalMap?hh(this.getTexture(r),this.getCache(r+"Scale","vec2")):dc;else if(r===bh.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===bh.SHEEN_ROUGHNESS){const e=this.getFloat(r);s=t.sheenRoughnessMap&&!0===t.sheenRoughnessMap.isTexture?e.mul(this.getTexture(r).a):e,s=s.clamp(1e-4,1)}else if(r===bh.ANISOTROPY)if(t.anisotropyMap&&!0===t.anisotropyMap.isTexture){const e=this.getTexture(r);s=Fn(rp.x,rp.y,rp.y.negate(),rp.x).mul(e.rg.mul(2).sub(Tn(1)).normalize().mul(e.b))}else s=rp;else if(r===bh.IRIDESCENCE_THICKNESS){const e=Lc("1","float",t.iridescenceThicknessRange);if(t.iridescenceThicknessMap){const i=Lc("0","float",t.iridescenceThicknessRange);s=e.sub(i).mul(this.getTexture(r).g).add(i)}else s=e}else if(r===bh.TRANSMISSION){const e=this.getFloat(r);s=t.transmissionMap?e.mul(this.getTexture(r).r):e}else if(r===bh.THICKNESS){const e=this.getFloat(r);s=t.thicknessMap?e.mul(this.getTexture(r).g):e}else if(r===bh.IOR)s=this.getFloat(r);else if(r===bh.LIGHT_MAP)s=this.getTexture(r).rgb.mul(this.getFloat("lightMapIntensity"));else if(r===bh.AO)s=this.getTexture(r).r.sub(1).mul(this.getFloat("aoMapIntensity")).add(1);else if(r===bh.LINE_DASH_OFFSET)s=t.dashOffset?this.getFloat(r):fn(0);else{const t=this.getNodeType(e);s=this.getCache(r,t)}return s}}bh.ALPHA_TEST="alphaTest",bh.COLOR="color",bh.OPACITY="opacity",bh.SHININESS="shininess",bh.SPECULAR="specular",bh.SPECULAR_STRENGTH="specularStrength",bh.SPECULAR_INTENSITY="specularIntensity",bh.SPECULAR_COLOR="specularColor",bh.REFLECTIVITY="reflectivity",bh.ROUGHNESS="roughness",bh.METALNESS="metalness",bh.NORMAL="normal",bh.CLEARCOAT="clearcoat",bh.CLEARCOAT_ROUGHNESS="clearcoatRoughness",bh.CLEARCOAT_NORMAL="clearcoatNormal",bh.EMISSIVE="emissive",bh.ROTATION="rotation",bh.SHEEN="sheen",bh.SHEEN_ROUGHNESS="sheenRoughness",bh.ANISOTROPY="anisotropy",bh.IRIDESCENCE="iridescence",bh.IRIDESCENCE_IOR="iridescenceIOR",bh.IRIDESCENCE_THICKNESS="iridescenceThickness",bh.IOR="ior",bh.TRANSMISSION="transmission",bh.THICKNESS="thickness",bh.ATTENUATION_DISTANCE="attenuationDistance",bh.ATTENUATION_COLOR="attenuationColor",bh.LINE_SCALE="scale",bh.LINE_DASH_SIZE="dashSize",bh.LINE_GAP_SIZE="gapSize",bh.LINE_WIDTH="linewidth",bh.LINE_DASH_OFFSET="dashOffset",bh.POINT_SIZE="size",bh.DISPERSION="dispersion",bh.LIGHT_MAP="light",bh.AO="ao";const xh=an(bh,bh.ALPHA_TEST),Th=an(bh,bh.COLOR),_h=an(bh,bh.SHININESS),vh=an(bh,bh.EMISSIVE),Nh=an(bh,bh.OPACITY),Sh=an(bh,bh.SPECULAR),Rh=an(bh,bh.SPECULAR_INTENSITY),Ah=an(bh,bh.SPECULAR_COLOR),Eh=an(bh,bh.SPECULAR_STRENGTH),wh=an(bh,bh.REFLECTIVITY),Ch=an(bh,bh.ROUGHNESS),Mh=an(bh,bh.METALNESS),Bh=an(bh,bh.NORMAL),Fh=an(bh,bh.CLEARCOAT),Lh=an(bh,bh.CLEARCOAT_ROUGHNESS),Ph=an(bh,bh.CLEARCOAT_NORMAL),Dh=an(bh,bh.ROTATION),Uh=an(bh,bh.SHEEN),Ih=an(bh,bh.SHEEN_ROUGHNESS),Oh=an(bh,bh.ANISOTROPY),Vh=an(bh,bh.IRIDESCENCE),kh=an(bh,bh.IRIDESCENCE_IOR),Gh=an(bh,bh.IRIDESCENCE_THICKNESS),zh=an(bh,bh.TRANSMISSION),$h=an(bh,bh.THICKNESS),Wh=an(bh,bh.IOR),Hh=an(bh,bh.ATTENUATION_DISTANCE),qh=an(bh,bh.ATTENUATION_COLOR),jh=an(bh,bh.LINE_SCALE),Xh=an(bh,bh.LINE_DASH_SIZE),Kh=an(bh,bh.LINE_GAP_SIZE),Qh=an(bh,bh.LINE_WIDTH),Yh=an(bh,bh.LINE_DASH_OFFSET),Zh=an(bh,bh.POINT_SIZE),Jh=an(bh,bh.DISPERSION),ep=an(bh,bh.LIGHT_MAP),tp=an(bh,bh.AO),rp=Na(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))}),sp=dn(e=>e.context.setupModelViewProjection(),"vec4").once()().toVarying("v_modelViewProjection");class ip extends ci{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 np=nn(ip).setParameterLength(2);class ap extends Il{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=$s(e.itemSize),r=e.count):s=t,super(e,s,r),this.isStorageBufferNode=!0,this.structTypeNode=i,this.access=si.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){let t;if(0===this.bufferCount){let r=e.globalCache.getData(this.value);void 0===r&&(r={node:this},e.globalCache.setData(this.value,r)),t=r.node.id}else t=this.id;return String(t)}getInputType(){return this.value.isIndirectStorageBufferAttribute?"indirectStorageBuffer":"storageBuffer"}element(e){return np(this,e)}setPBO(e){return this.isPBO=e,this}getPBO(){return this.isPBO}setAccess(e){return this.access=e,this}toReadOnly(){return this.setAccess(si.READ_ONLY)}setAtomic(e){return this.isAtomic=e,this}toAtomic(){return this.setAtomic(!0)}getAttributeData(){return null===this._attribute&&(this._attribute=tl(this.value),this._varying=Uu(this._attribute)),{attribute:this._attribute,varying:this._varying}}generateNodeType(e){if(null!==this.structTypeNode)return this.structTypeNode.getNodeType(e);if(e.isAvailable("storageBuffer")||e.isAvailable("indirectStorageBuffer"))return super.generateNodeType(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 op=(e,t=null,r=0)=>new ap(e,t,r);class up extends di{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===up.VERTEX)s=e.getVertexIndex();else if(r===up.INSTANCE)s=e.getInstanceIndex();else if(r===up.DRAW)s=e.getDrawIndex();else if(r===up.INVOCATION_LOCAL)s=e.getInvocationLocalIndex();else if(r===up.INVOCATION_SUBGROUP)s=e.getInvocationSubgroupIndex();else{if(r!==up.SUBGROUP)throw new Error("THREE.IndexNode: Unknown scope: "+r);s=e.getSubgroupIndex()}if("vertex"===e.shaderStage||"compute"===e.shaderStage)i=s;else{i=Uu(this).build(e,t)}return i}}up.VERTEX="vertex",up.INSTANCE="instance",up.SUBGROUP="subgroup",up.INVOCATION_LOCAL="invocationLocal",up.INVOCATION_SUBGROUP="invocationSubgroup",up.DRAW="draw";const lp=an(up,up.VERTEX),dp=an(up,up.INSTANCE),cp=an(up,up.SUBGROUP),hp=an(up,up.INVOCATION_SUBGROUP),pp=an(up,up.INVOCATION_LOCAL),gp=an(up,up.DRAW);class mp extends di{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=ti.FRAME,this.buffer=null,this.bufferColor=null,this.previousInstanceMatrixNode=null}get isStorageMatrix(){const{instanceMatrix:e}=this;return e&&!0===e.isStorageInstancedBufferAttribute}get isStorageColor(){const{instanceColor:e}=this;return e&&!0===e.isStorageInstancedBufferAttribute}setup(e){let{instanceMatrixNode:t,instanceColorNode:r}=this;null===t&&(t=this._createInstanceMatrixNode(!0,e),this.instanceMatrixNode=t);const{instanceColor:s,isStorageColor:i}=this;if(s&&null===r){if(i)r=op(s,"vec3",Math.max(s.count,1)).element(dp);else{const e=new j(s.array,3),t=s.usage===x?sl:rl;this.bufferColor=e,r=Sn(t(e,"vec3",3,0))}this.instanceColorNode=r}const n=t.mul(Kd).xyz;if(Kd.assign(n),e.needsPreviousData()&&Qd.assign(this.getPreviousInstancedPosition(e)),e.hasGeometryAttribute("normal")){const e=pc(ac,t);ac.assign(e)}null!==this.instanceColorNode&&Vn("vec3","vInstanceColor").assign(this.instanceColorNode)}update(e){null!==this.buffer&&!0!==this.isStorageMatrix&&(this.buffer.clearUpdateRanges(),this.buffer.updateRanges.push(...this.instanceMatrix.updateRanges),this.instanceMatrix.version!==this.buffer.version&&(this.buffer.version=this.instanceMatrix.version)),this.instanceColor&&null!==this.bufferColor&&!0!==this.isStorageColor&&(this.bufferColor.clearUpdateRanges(),this.bufferColor.updateRanges.push(...this.instanceColor.updateRanges),this.instanceColor.version!==this.bufferColor.version&&(this.bufferColor.version=this.instanceColor.version)),null!==this.previousInstanceMatrixNode&&e.object.previousInstanceMatrix.array.set(this.instanceMatrix.array)}getPreviousInstancedPosition(e){const t=e.object;return null===this.previousInstanceMatrixNode&&(t.previousInstanceMatrix=this.instanceMatrix.clone(),this.previousInstanceMatrixNode=this._createInstanceMatrixNode(!1,e)),this.previousInstanceMatrixNode.mul(Qd).xyz}_createInstanceMatrixNode(e,t){let r;const{instanceMatrix:s}=this,{count:i}=s;if(this.isStorageMatrix)r=op(s,"mat4",Math.max(i,1)).element(dp);else{if(16*i*4<=t.getUniformBufferLimit())r=Ol(s.array,"mat4",Math.max(i,1)).element(dp);else{const t=new X(s.array,16,1);!0===e&&(this.buffer=t);const i=s.usage===x?sl:rl,n=[i(t,"vec4",16,0),i(t,"vec4",16,4),i(t,"vec4",16,8),i(t,"vec4",16,12)];r=Pn(...n)}}return r}}const fp=nn(mp).setParameterLength(2,3);class yp extends mp{static get type(){return"InstancedMeshNode"}constructor(e){const{count:t,instanceMatrix:r,instanceColor:s}=e;super(t,r,s),this.instancedMesh=e}}const bp=nn(yp).setParameterLength(1);class xp extends di{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=dp:this.batchingIdNode=gp);const t=dn(([e])=>{const t=yn(wl(Ul(this.batchMesh._indirectTexture),0).x).toConst(),r=yn(e).mod(t).toConst(),s=yn(e).div(t).toConst();return Ul(this.batchMesh._indirectTexture,_n(r,s)).x}).setLayout({name:"getIndirectIndex",type:"uint",inputs:[{name:"id",type:"int"}]}),r=t(yn(this.batchingIdNode)),s=this.batchMesh._matricesTexture,i=yn(wl(Ul(s),0).x).toConst(),n=fn(r).mul(4).toInt().toConst(),a=n.mod(i).toConst(),o=n.div(i).toConst(),u=Pn(Ul(s,_n(a,o)),Ul(s,_n(a.add(1),o)),Ul(s,_n(a.add(2),o)),Ul(s,_n(a.add(3),o))),l=this.batchMesh._colorsTexture;if(null!==l){const e=dn(([e])=>{const t=yn(wl(Ul(l),0).x).toConst(),r=e,s=r.mod(t).toConst(),i=r.div(t).toConst();return Ul(l,_n(s,i)).rgb}).setLayout({name:"getBatchingColor",type:"vec3",inputs:[{name:"id",type:"int"}]}),t=e(r);Vn("vec3","vBatchColor").assign(t)}const d=Ln(u);Kd.assign(u.mul(Kd));const c=ac.div(Sn(d[0].dot(d[0]),d[1].dot(d[1]),d[2].dot(d[2]))),h=d.mul(c).xyz;ac.assign(h),e.hasGeometryAttribute("tangent")&&Zc.mulAssign(d)}}const Tp=nn(xp).setParameterLength(1),_p=new WeakMap;class vp extends di{static get type(){return"SkinningNode"}constructor(e){super("void"),this.skinnedMesh=e,this.updateType=ti.OBJECT,this.skinIndexNode=Rl("skinIndex","uvec4"),this.skinWeightNode=Rl("skinWeight","vec4"),this.bindMatrixNode=Lc("bindMatrix","mat4"),this.bindMatrixInverseNode=Lc("bindMatrixInverse","mat4"),this.boneMatricesNode=Pc("skeleton.boneMatrices","mat4",e.skeleton.bones.length),this.positionNode=Kd,this.toPositionNode=Kd,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=Fa(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}getSkinnedNormalAndTangent(e=this.boneMatricesNode,t=ac,r=Zc){const{skinIndexNode:s,skinWeightNode:i,bindMatrixNode:n,bindMatrixInverseNode:a}=this,o=e.element(s.x),u=e.element(s.y),l=e.element(s.z),d=e.element(s.w);let c=Fa(i.x.mul(o),i.y.mul(u),i.z.mul(l),i.w.mul(d));c=a.mul(c).mul(n);return{skinNormal:c.transformDirection(t).xyz,skinTangent:c.transformDirection(r).xyz}}getPreviousSkinnedPosition(e){const t=e.object;return null===this.previousBoneMatricesNode&&(t.skeleton.previousBoneMatrices=new Float32Array(t.skeleton.boneMatrices),this.previousBoneMatricesNode=Pc("skeleton.previousBoneMatrices","mat4",t.skeleton.bones.length)),this.getSkinnedPosition(this.previousBoneMatricesNode,Qd)}setup(e){e.needsPreviousData()&&Qd.assign(this.getPreviousSkinnedPosition(e));const t=this.getSkinnedPosition();if(this.toPositionNode&&this.toPositionNode.assign(t),e.hasGeometryAttribute("normal")){const{skinNormal:t,skinTangent:r}=this.getSkinnedNormalAndTangent();ac.assign(t),e.hasGeometryAttribute("tangent")&&Zc.assign(r)}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;_p.get(t)!==e.frameId&&(_p.set(t,e.frameId),null!==this.previousBoneMatricesNode&&(null===t.previousBoneMatrices&&(t.previousBoneMatrices=new Float32Array(t.boneMatrices)),t.previousBoneMatrices.set(t.boneMatrices)),t.update())}}const Np=e=>new vp(e);class Sp extends di{static get type(){return"LoopNode"}constructor(e=[]){super("void"),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(l)?">=":"<")),a)n=`while ( ${l} )`;else{const r={start:u,end:l},s=r.start,i=r.end;let a;const g=()=>h.includes("<")?"+=":"-=";if(null!=p)switch(typeof p){case"function":a=e.flowStagesNode(t.updateNode,"void").code.replace(/\t|;/g,"");break;case"number":a=d+" "+g()+" "+e.generateConst(c,p);break;case"string":a=d+" "+p;break;default:p.isNode?a=d+" "+g()+" "+p.build(e):(o("TSL: 'Loop( { update: ... } )' is not a function, string or number.",this.stackTrace),a="break /* invalid update */")}else p="int"===c||"uint"===c?h.includes("<")?"++":"--":g()+" 1.",a=d+" "+p;n=`for ( ${e.getVar(c,d)+" = "+s}; ${d+" "+h+" "+i}; ${a} )`}e.addFlowCode((0===s?"\n":"")+e.tab+n+" {\n\n").addFlowTab()}const i=s.build(e,"void");t.returnsNode.build(e,"void"),e.removeFlowTab().addFlowCode("\n"+e.tab+i);for(let t=0,r=this.params.length-1;tnew Sp(sn(e,"int")).toStack(),Ap=()=>ml("break").toStack(),Ep=new WeakMap,wp=new s,Cp=dn(({bufferMap:e,influence:t,stride:r,width:s,depth:i,offset:n})=>{const a=yn(lp).mul(r).add(n),o=a.div(s),u=a.sub(o.mul(s));return Ul(e,_n(u,o)).depth(i).xyz.mul(t)});class Mp extends di{static get type(){return"MorphNode"}constructor(e){super("void"),this.mesh=e,this.morphBaseInfluence=Na(1),this.updateType=ti.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=Ep.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 K(m,h,p,a);f.type=Q,f.needsUpdate=!0;const y=4*c;for(let x=0;x{const t=fn(0).toVar();this.mesh.count>1&&null!==this.mesh.morphTexture&&void 0!==this.mesh.morphTexture?t.assign(Ul(this.mesh.morphTexture,_n(yn(e).add(1),yn(dp))).r):t.assign(Lc("morphTargetInfluences","float").element(e).toVar()),pn(t.notEqual(0),()=>{!0===s&&Kd.addAssign(Cp({bufferMap:o,influence:t,stride:u,width:d,depth:e,offset:yn(0)})),!0===i&&ac.addAssign(Cp({bufferMap:o,influence:t,stride:u,width:d,depth:e,offset:yn(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 Bp=nn(Mp).setParameterLength(1);class Fp extends di{static get type(){return"LightingNode"}constructor(){super("vec3"),this.isLightingNode=!0}}class Lp extends Fp{static get type(){return"AONode"}constructor(e=null){super(),this.aoNode=e}setup(e){e.context.ambientOcclusion.mulAssign(this.aoNode)}}class Pp extends _u{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:Sn().toVar("directDiffuse"),directSpecular:Sn().toVar("directSpecular"),indirectDiffuse:Sn().toVar("indirectDiffuse"),indirectSpecular:Sn().toVar("indirectSpecular")};return{radiance:Sn().toVar("radiance"),irradiance:Sn().toVar("irradiance"),iblIrradiance:Sn().toVar("iblIrradiance"),ambientOcclusion:fn(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 Dp=nn(Pp);class Up extends Fp{static get type(){return"IrradianceNode"}constructor(e){super(),this.node=e}setup(e){e.context.irradiance.addAssign(this.node)}}const Ip=new t;class Op extends Ll{static get type(){return"ViewportTextureNode"}constructor(e=Xl,t=null,r=null){let s=null;null===r?(s=new Y,s.minFilter=Z,r=s):s=r,super(r,e,t),this.generateMipmaps=!1,this.defaultFramebuffer=s,this.isOutputTextureNode=!0,this.updateBeforeType=ti.RENDER,this._cacheTextures=new WeakMap}getTextureForReference(e=null){let t,r;if(this.referenceNode?(t=this.referenceNode.defaultFramebuffer,r=this.referenceNode._cacheTextures):(t=this.defaultFramebuffer,r=this._cacheTextures),null===e)return t;if(!1===r.has(e)){const s=t.clone();r.set(e,s)}return r.get(e)}updateReference(e){const t=e.renderer,r=t.getRenderTarget(),s=t.getCanvasTarget(),i=r||s;return this.value=this.getTextureForReference(i),this.value}updateBefore(e){const t=e.renderer,r=t.getRenderTarget(),s=t.getCanvasTarget(),i=r||s;null===i?t.getDrawingBufferSize(Ip):i.getDrawingBufferSize?i.getDrawingBufferSize(Ip):Ip.set(i.width,i.height);const n=this.getTextureForReference(i);n.image.width===Ip.width&&n.image.height===Ip.height||(n.image.width=Ip.width,n.image.height=Ip.height,n.needsUpdate=!0);const a=n.generateMipmaps;n.generateMipmaps=this.generateMipmaps,t.copyFramebufferToTexture(n),n.generateMipmaps=a}clone(){const e=new this.constructor(this.uvNode,this.levelNode,this.value);return e.generateMipmaps=this.generateMipmaps,e}}const Vp=nn(Op).setParameterLength(0,3),kp=nn(Op,null,null,{generateMipmaps:!0}).setParameterLength(0,3),Gp=kp(),zp=(e=Xl,t=null)=>Gp.sample(e,t);let $p=null;class Wp extends Op{static get type(){return"ViewportDepthTextureNode"}constructor(e=Xl,t=null,r=null){null===r&&(null===$p&&($p=new J),r=$p),super(e,t,r)}}const Hp=nn(Wp).setParameterLength(0,3);class qp extends di{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===qp.DEPTH_BASE?e.getFragDepth():super.generate(e)}setup({camera:e}){const{scope:t}=this,r=this.valueNode;let s=null;if(t===qp.DEPTH_BASE)null!==r&&(s=Jp().assign(r));else if(t===qp.DEPTH)s=e.isPerspectiveCamera?Kp(Jd.z,yd,bd):jp(Jd.z,yd,bd);else if(t===qp.LINEAR_DEPTH)if(null!==r)if(e.isPerspectiveCamera){const e=Yp(r,yd,bd);s=jp(e,yd,bd)}else s=r;else s=jp(Jd.z,yd,bd);return s}}qp.DEPTH_BASE="depthBase",qp.DEPTH="depth",qp.LINEAR_DEPTH="linearDepth";const jp=(e,t,r)=>e.add(t).div(t.sub(r)),Xp=dn(([e,t,r],s)=>!0===s.renderer.reversedDepthBuffer?r.sub(t).mul(e).sub(r):t.sub(r).mul(e).sub(t)),Kp=(e,t,r)=>t.add(e).mul(r).div(r.sub(t).mul(e)),Qp=(e,t,r)=>t.mul(e.add(r)).div(e.mul(t.sub(r))),Yp=dn(([e,t,r],s)=>!0===s.renderer.reversedDepthBuffer?t.mul(r).div(t.sub(r).mul(e).sub(t)):t.mul(r).div(r.sub(t).mul(e).sub(r))),Zp=(e,t,r)=>{t=t.max(1e-6).toVar();const s=xo(e.negate().div(t)),i=xo(r.div(t));return s.div(i)},Jp=nn(qp,qp.DEPTH_BASE),eg=an(qp,qp.DEPTH),tg=nn(qp,qp.LINEAR_DEPTH).setParameterLength(0,1),rg=tg(Hp());eg.assign=e=>Jp(e);class sg extends di{static get type(){return"ClippingNode"}constructor(e=sg.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===sg.ALPHA_TO_COVERAGE?this.setupAlphaToCoverage(r,s):this.scope===sg.HARDWARE?this.setupHardwareClipping(s,e):this.setupDefault(r,s)}setupAlphaToCoverage(e,t){return dn(()=>{const r=fn().toVar("distanceToPlane"),s=fn().toVar("distanceToGradient"),i=fn(1).toVar("clipOpacity"),n=t.length;if(!1===this.hardwareClipping&&n>0){const e=Gl(t).setGroup(Ta);Rp(n,({i:t})=>{const n=e.element(t);r.assign(Jd.dot(n.xyz).negate().add(n.w)),s.assign(r.fwidth().div(2)),i.mulAssign(cu(s.negate(),s,r))})}const a=e.length;if(a>0){const t=Gl(e).setGroup(Ta),n=fn(1).toVar("intersectionClipOpacity");Rp(a,({i:e})=>{const i=t.element(e);r.assign(Jd.dot(i.xyz).negate().add(i.w)),s.assign(r.fwidth().div(2)),n.mulAssign(cu(s.negate(),s,r).oneMinus())}),i.mulAssign(n.oneMinus())}kn.a.mulAssign(i),kn.a.equal(0).discard()})()}setupDefault(e,t){return dn(()=>{const r=t.length;if(!1===this.hardwareClipping&&r>0){const e=Gl(t).setGroup(Ta);Rp(r,({i:t})=>{const r=e.element(t);Jd.dot(r.xyz).greaterThan(r.w).discard()})}const s=e.length;if(s>0){const t=Gl(e).setGroup(Ta),r=xn(!0).toVar("clipped");Rp(s,({i:e})=>{const s=t.element(e);r.assign(Jd.dot(s.xyz).greaterThan(s.w).and(r))}),r.discard()}})()}setupHardwareClipping(e,t){const r=e.length;return t.enableHardwareClipping(r),dn(()=>{const s=Gl(e).setGroup(Ta),i=$l(t.getClipDistance());Rp(r,({i:e})=>{const t=s.element(e),r=Jd.dot(t.xyz).sub(t.w).negate();i.element(e).assign(r)})})()}}sg.ALPHA_TO_COVERAGE="alphaToCoverage",sg.DEFAULT="default",sg.HARDWARE="hardware";const ig=dn(([e])=>Ro(Pa(1e4,Ao(Pa(17,e.x).add(Pa(.1,e.y)))).mul(Fa(.1,Fo(Ao(Pa(13,e.y).add(e.x))))))),ng=dn(([e])=>ig(Tn(ig(e.xy),e.z))),ag=dn(([e])=>{const t=jo(Po(Io(e.xyz)),Po(Oo(e.xyz))),r=fn(1).div(fn(.05).mul(t)).toVar("pixScale"),s=Tn(yo(vo(xo(r))),yo(No(xo(r)))),i=Tn(ng(vo(s.x.mul(e.xyz))),ng(vo(s.y.mul(e.xyz)))),n=Ro(xo(r)),a=Fa(Pa(n.oneMinus(),i.x),Pa(n,i.y)),o=qo(n,n.oneMinus()),u=Sn(a.mul(a).div(Pa(2,o).mul(La(1,o))),a.sub(Pa(.5,o)).div(La(1,o)),La(1,La(1,a).mul(La(1,a)).div(Pa(2,o).mul(La(1,o))))),l=a.lessThan(o.oneMinus()).select(a.lessThan(o).select(u.x,u.y),u.z);return uu(l,1e-6,1)}).setLayout({name:"getAlphaHashThreshold",type:"float",inputs:[{name:"position",type:"vec3"}]});class og extends Sl{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 ug=(e=0)=>new og(e),lg=dn(([e,t])=>qo(1,e.oneMinus().div(t)).oneMinus()).setLayout({name:"blendBurn",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),dg=dn(([e,t])=>qo(e.div(t.oneMinus()),1)).setLayout({name:"blendDodge",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),cg=dn(([e,t])=>e.oneMinus().mul(t.oneMinus()).oneMinus()).setLayout({name:"blendScreen",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),hg=dn(([e,t])=>ou(e.mul(2).mul(t),e.oneMinus().mul(2).mul(t.oneMinus()).oneMinus(),Xo(.5,e))).setLayout({name:"blendOverlay",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),pg=dn(([e,t])=>{const r=t.a.add(e.a.mul(t.a.oneMinus()));return wn(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"}]}),gg=dn(([e])=>wn(e.rgb.mul(e.a),e.a),{color:"vec4",return:"vec4"}),mg=dn(([e])=>(pn(e.a.equal(0),()=>wn(0)),wn(e.rgb.div(e.a),e.a)),{color:"vec4",return:"vec4"});class fg extends ee{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.maskShadowNode=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,this.contextNode=null}_getNodeChildren(){const e=[];for(const t of Object.getOwnPropertyNames(this)){if(!0===t.startsWith("_"))continue;const r=this[t];r&&!0===r.isNode&&e.push({property:t,childNode:r})}return e}customProgramCacheKey(){const e=[];for(const{property:t,childNode:r}of this._getNodeChildren())e.push(Os(t.slice(0,-4)),r.getCacheKey());return this.type+Vs(e)}build(e){this.setup(e)}setupObserver(e){return new Ps(e)}setup(e){e.context.setupNormal=()=>Pu(this.setupNormal(e),"NORMAL","vec3"),e.context.setupPositionView=()=>this.setupPositionView(e),e.context.setupModelViewProjection=()=>this.setupModelViewProjection(e);const t=e.renderer,r=t.getRenderTarget();!0===t.contextNode.isContextNode?e.context={...e.context,...t.contextNode.getFlowContextData()}:o('NodeMaterial: "renderer.contextNode" must be an instance of `context()`.'),null!==this.contextNode&&(!0===this.contextNode.isContextNode?e.context={...e.context,...this.contextNode.getFlowContextData()}:o('NodeMaterial: "material.contextNode" must be an instance of `context()`.')),e.addStack();const s=this.setupVertex(e),i=Pu(this.vertexNode||s,"VERTEX");let n;e.context.clipSpace=i,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.addToStack(a);const i=wn(s,kn.a).max(0);n=this.setupOutput(e,i),aa.assign(n);const o=null!==this.outputNode;if(o&&(n=this.outputNode),e.context.getOutput&&(n=e.context.getOutput(n,e)),null!==r){const e=t.getMRT(),r=this.mrtNode;null!==e?(o&&aa.assign(n),n=e,null!==r&&(n=e.merge(r))):null!==r&&(n=r)}}else{let t=this.fragmentNode;!0!==t.isOutputStructNode&&(t=wn(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.currentSamples;this.alphaToCoverage&&t>1?s=new sg(sg.ALPHA_TO_COVERAGE):e.stack.addToStack(new sg)}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.addToStack(new sg(sg.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?Zp(Jd.z,yd,bd):jp(Jd.z,yd,bd))}null!==s&&eg.assign(s).toStack()}setupPositionView(){return $d.mul(Kd).xyz}setupModelViewProjection(){return xd.mul(Jd)}setupVertex(e){return e.addStack(),this.setupPosition(e),e.context.position=e.removeStack(),sp}setupPosition(e){const{object:t,geometry:r}=e;if((r.morphAttributes.position||r.morphAttributes.normal||r.morphAttributes.color)&&Bp(t).toStack(),!0===t.isSkinnedMesh&&Np(t).toStack(),this.displacementMap){const e=Uc("displacementMap","texture"),t=Uc("displacementScale","float"),r=Uc("displacementBias","float");Kd.addAssign(ac.normalize().mul(e.x.mul(t).add(r)))}return t.isBatchedMesh&&Tp(t).toStack(),t.isInstancedMesh&&t.instanceMatrix&&!0===t.instanceMatrix.isInstancedBufferAttribute&&bp(t).toStack(),null!==this.positionNode&&Kd.assign(Pu(this.positionNode,"POSITION","vec3")),Kd}setupDiffuseColor(e){const{object:t,geometry:r}=e;null!==this.maskNode&&xn(this.maskNode).not().discard();let s=this.colorNode?wn(this.colorNode):Th;if(!0===this.vertexColors&&r.hasAttribute("color")&&(s=s.mul(ug())),t.instanceColor){s=Vn("vec3","vInstanceColor").mul(s)}if(t.isBatchedMesh&&t._colorsTexture){s=Vn("vec3","vBatchColor").mul(s)}kn.assign(s);const i=this.opacityNode?fn(this.opacityNode):Nh;kn.a.assign(kn.a.mul(i));let n=null;(null!==this.alphaTestNode||this.alphaTest>0)&&(n=null!==this.alphaTestNode?fn(this.alphaTestNode):xh,!0===this.alphaToCoverage?(kn.a=cu(n,n.add(zo(kn.a)),kn.a),kn.a.lessThanEqual(0).discard()):kn.a.lessThanEqual(n).discard()),!0===this.alphaHash&&kn.a.lessThan(ag(Kd)).discard(),e.isOpaque()&&kn.a.assign(1)}setupVariants(){}setupOutgoingLight(){return!0===this.lights?Sn(0):kn.rgb}setupNormal(){return this.normalNode?Sn(this.normalNode):Bh}setupEnvironment(){let e=null;return this.envNode?e=this.envNode:this.envMap&&(e=this.envMap.isCubeTexture?Uc("envMap","cubeTexture"):Uc("envMap","texture")),e}setupLightMap(e){let t=null;return e.material.lightMap&&(t=new Up(ep)),t}setupLights(e){const t=[],r=this.setupEnvironment(e);r&&r.isLightingNode&&t.push(r);const s=this.setupLightMap(e);s&&s.isLightingNode&&t.push(s);let i=this.aoNode;null===i&&e.material.aoMap&&(i=tp),e.context.getAO&&(i=e.context.getAO(i,e)),i&&t.push(new Lp(i));let n=this.lightsNode||e.lightsNode;return t.length>0&&(n=e.renderer.lighting.createNode([...n.getLights(),...t])),n}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=Dp(n,t,r,s)}else null!==r&&(a=Sn(null!==s?ou(a,r,s):r));return(i&&!0===i.isNode||t.emissive&&!0===t.emissive.isColor)&&(zn.assign(Sn(i||vh)),a=a.add(zn)),a}setupFog(e,t){const r=e.fogNode;return r&&(aa.assign(t),t=wn(r.toVar())),t}setupPremultipliedAlpha(e,t){return gg(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=ee.prototype.toJSON.call(this,e);r.inputNodes={};for(const{property:t,childNode:s}of this._getNodeChildren())r.inputNodes[t]=s.toJSON(e).uuid;function s(e){const t=[];for(const r in e){const s=e[r];delete s.metadata,t.push(s)}return t}if(t){const t=s(e.textures),i=s(e.images),n=s(e.nodes);t.length>0&&(r.textures=t),i.length>0&&(r.images=i),n.length>0&&(r.nodes=n)}return r}copy(e){return this.lightsNode=e.lightsNode,this.envNode=e.envNode,this.aoNode=e.aoNode,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.maskShadowNode=e.maskShadowNode,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,this.contextNode=e.contextNode,super.copy(e)}}const yg=new te;class bg extends fg{static get type(){return"LineBasicNodeMaterial"}constructor(e){super(),this.isLineBasicNodeMaterial=!0,this.setDefaultValues(yg),this.setValues(e)}}const xg=new re;class Tg extends fg{static get type(){return"LineDashedNodeMaterial"}constructor(e){super(),this.isLineDashedNodeMaterial=!0,this.setDefaultValues(xg),this.dashOffset=0,this.offsetNode=null,this.dashScaleNode=null,this.dashSizeNode=null,this.gapSizeNode=null,this.setValues(e)}setupVariants(){const e=this.offsetNode?fn(this.offsetNode):Yh,t=this.dashScaleNode?fn(this.dashScaleNode):jh,r=this.dashSizeNode?fn(this.dashSizeNode):Xh,s=this.gapSizeNode?fn(this.gapSizeNode):Kh;oa.assign(r),ua.assign(s);const i=Uu(Rl("lineDistance").mul(t));(e?i.add(e):i).mod(oa.add(ua)).greaterThan(oa).discard()}}const _g=new re;class vg extends fg{static get type(){return"Line2NodeMaterial"}constructor(e={}){super(),this.isLine2NodeMaterial=!0,this.setDefaultValues(_g),this.vertexColors=e.vertexColors,this.dashOffset=0,this.lineColorNode=null,this.offsetNode=null,this.dashScaleNode=null,this.dashSizeNode=null,this.gapSizeNode=null,this.blending=se,this._useDash=e.dashed,this._useAlphaToCoverage=!0,this._useWorldUnits=!1,this.setValues(e)}setup(e){const{renderer:t}=e,r=this._useAlphaToCoverage,s=this.vertexColors,i=this._useDash,n=this._useWorldUnits,a=dn(({start:e,end:t})=>{const r=xd.element(2).element(2),s=xd.element(3).element(2).mul(-.5).div(r).sub(e.z).div(t.z.sub(e.z));return wn(ou(e.xyz,t.xyz,s),t.w)}).setLayout({name:"trimSegment",type:"vec4",inputs:[{name:"start",type:"vec4"},{name:"end",type:"vec4"}]});this.vertexNode=dn(()=>{const e=Rl("instanceStart"),t=Rl("instanceEnd"),r=wn($d.mul(wn(e,1))).toVar("start"),s=wn($d.mul(wn(t,1))).toVar("end");if(i){const e=this.dashScaleNode?fn(this.dashScaleNode):jh,t=this.offsetNode?fn(this.offsetNode):Yh,r=Rl("instanceDistanceStart"),s=Rl("instanceDistanceEnd");let i=Xd.y.lessThan(.5).select(e.mul(r),e.mul(s));i=i.add(t),Vn("float","lineDistance").assign(i)}n&&(Vn("vec3","worldStart").assign(r.xyz),Vn("vec3","worldEnd").assign(s.xyz));const o=Yl.z.div(Yl.w),u=xd.element(2).element(3).equal(-1);pn(u,()=>{pn(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=xd.mul(r),d=xd.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=wn().toVar();if(n){const e=s.xyz.sub(r.xyz).normalize(),t=ou(r.xyz,s.xyz,.5).normalize(),n=e.cross(t).normalize(),a=e.cross(n),o=Vn("vec4","worldPos");o.assign(Xd.y.lessThan(.5).select(r,s));const u=Qh.mul(.5);o.addAssign(wn(Xd.x.lessThan(0).select(n.mul(u),n.mul(u).negate()),0)),i||(o.addAssign(wn(Xd.y.lessThan(.5).select(e.mul(u).negate(),e.mul(u)),0)),o.addAssign(wn(a.mul(u),0)),pn(Xd.y.greaterThan(1).or(Xd.y.lessThan(0)),()=>{o.subAssign(wn(a.mul(2).mul(u),0))})),g.assign(xd.mul(o));const l=Sn().toVar();l.assign(Xd.y.lessThan(.5).select(c,h)),g.z.assign(l.z.mul(g.w))}else{const e=Tn(p.y,p.x.negate()).toVar("offset");p.x.assign(p.x.div(o)),e.x.assign(e.x.div(o)),e.assign(Xd.x.lessThan(0).select(e.negate(),e)),pn(Xd.y.lessThan(0),()=>{e.assign(e.sub(p))}).ElseIf(Xd.y.greaterThan(1),()=>{e.assign(e.add(p))}),e.assign(e.mul(Qh)),e.assign(e.div(Yl.w.div(jl))),g.assign(Xd.y.lessThan(.5).select(l,d)),e.assign(e.mul(g.w)),g.assign(g.add(wn(e,0,0)))}return g})();const o=dn(({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 Tn(h,p)});if(this.colorNode=dn(()=>{const e=Al();if(i){const t=this.dashSizeNode?fn(this.dashSizeNode):Xh,r=this.gapSizeNode?fn(this.gapSizeNode):Kh;oa.assign(t),ua.assign(r);const s=Vn("float","lineDistance");e.y.lessThan(-1).or(e.y.greaterThan(1)).discard(),s.mod(oa.add(ua)).greaterThan(oa).discard()}const a=fn(1).toVar("alpha");if(n){const e=Vn("vec3","worldStart"),s=Vn("vec3","worldEnd"),n=Vn("vec4","worldPos").xyz.normalize().mul(1e5),u=s.sub(e),l=o({p1:e,p2:s,p3:Sn(0,0,0),p4:n}),d=e.add(u.mul(l.x)),c=n.mul(l.y),h=d.sub(c).length().div(Qh);if(!i)if(r&&t.currentSamples>0){const e=h.fwidth();a.assign(cu(e.negate().add(.5),e.add(.5),h).oneMinus())}else h.greaterThan(.5).discard()}else if(r&&t.currentSamples>0){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=fn(s.fwidth()).toVar("dlen");pn(e.y.abs().greaterThan(1),()=>{a.assign(cu(i.oneMinus(),i.add(1),s).oneMinus())})}else pn(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=Rl("instanceColorStart"),t=Rl("instanceColorEnd");u=Xd.y.lessThan(.5).select(e,t).mul(Th)}else u=Th;return wn(u,a)})(),this.transparent){const e=this.opacityNode?fn(this.opacityNode):Nh;this.outputNode=wn(this.colorNode.rgb.mul(e).add(zp().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 Ng=new ie;class Sg extends fg{static get type(){return"MeshNormalNodeMaterial"}constructor(e){super(),this.isMeshNormalNodeMaterial=!0,this.setDefaultValues(Ng),this.setValues(e)}setupDiffuseColor(){const e=this.opacityNode?fn(this.opacityNode):Nh;kn.assign($u(wn(lh(dc),e),ne))}}const Rg=dn(([e=Zd])=>{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 Tn(t,r)});class Ag extends ae{constructor(e=1,t={}){super(e,e,t),this.isCubeRenderTarget=!0;const r={width:e,height:e,depth:1},s=[r,r,r,r,r,r];this.texture=new U(s),this._setTextureOptions(t),this.texture.isRenderTargetTexture=!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 oe(5,5,5),n=Rg(Zd),a=new fg;a.colorNode=Dl(t,n,0),a.side=L,a.blending=se;const o=new ue(i,a),u=new le;u.add(o),t.minFilter===Z&&(t.minFilter=de);const l=new ce(1,10,this),d=e.getMRT();return e.setMRT(null),l.update(e,u),e.setMRT(d),t.minFilter=r,t.generateMipmaps=s,o.geometry.dispose(),o.material.dispose(),this}clear(e,t=!0,r=!0,s=!0){const i=e.getRenderTarget();for(let i=0;i<6;i++)e.setRenderTarget(this,i),e.clear(t,r,s);e.setRenderTarget(i)}}const Eg=new WeakMap;class wg extends pi{static get type(){return"CubeMapNode"}constructor(e){super("vec3"),this.envNode=e,this._cubeTexture=null,this._cubeTextureNode=Mc(null);const t=new U;t.isRenderTargetTexture=!0,this._defaultTexture=t,this.updateBeforeType=ti.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===he||r===pe){if(Eg.has(e)){const t=Eg.get(e);Mg(t,e.mapping),this._cubeTexture=t}else{const r=e.image;if(function(e){return null!=e&&e.height>0}(r)){const s=new Ag(r.height);s.fromEquirectangularTexture(t,e),Mg(s.texture,e.mapping),this._cubeTexture=s.texture,Eg.set(e,s.texture),e.addEventListener("dispose",Cg)}else this._cubeTexture=this._defaultTexture}this._cubeTextureNode.value=this._cubeTexture}else this._cubeTextureNode=this.envNode}}}setup(e){return this.updateBefore(e),this._cubeTextureNode}}function Cg(e){const t=e.target;t.removeEventListener("dispose",Cg);const r=Eg.get(t);void 0!==r&&(Eg.delete(t),r.dispose())}function Mg(e,t){t===he?e.mapping=I:t===pe&&(e.mapping=O)}const Bg=nn(wg).setParameterLength(1);class Fg extends Fp{static get type(){return"BasicEnvironmentNode"}constructor(e=null){super(),this.envNode=e}setup(e){e.context.environment=Bg(this.envNode)}}class Lg extends Fp{static get type(){return"BasicLightMapNode"}constructor(e=null){super(),this.lightMapNode=e}setup(e){const t=fn(1/Math.PI);e.context.irradianceLightMap=this.lightMapNode.mul(t)}}class Pg{start(e){e.lightsNode.setupLights(e,e.lightsNode.getLightNodes(e)),this.indirect(e)}finish(){}direct(){}directRectArea(){}indirect(){}ambientOcclusion(){}}class Dg extends Pg{constructor(){super()}indirect({context:e}){const t=e.ambientOcclusion,r=e.reflectedLight,s=e.irradianceLightMap;r.indirectDiffuse.assign(wn(0)),s?r.indirectDiffuse.addAssign(s):r.indirectDiffuse.addAssign(wn(1,1,1,0)),r.indirectDiffuse.mulAssign(t),r.indirectDiffuse.mulAssign(kn.rgb)}finish(e){const{material:t,context:r}=e,s=r.outgoingLight,i=e.context.environment;if(i)switch(t.combine){case fe:s.rgb.assign(ou(s.rgb,s.rgb.mul(i.rgb),Eh.mul(wh)));break;case me:s.rgb.assign(ou(s.rgb,i.rgb,Eh.mul(wh)));break;case ge:s.rgb.addAssign(i.rgb.mul(Eh.mul(wh)));break;default:d("BasicLightingModel: Unsupported .combine value:",t.combine)}}}const Ug=new ye;class Ig extends fg{static get type(){return"MeshBasicNodeMaterial"}constructor(e){super(),this.isMeshBasicNodeMaterial=!0,this.lights=!0,this.setDefaultValues(Ug),this.setValues(e)}setupNormal(){return ic(uc)}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new Fg(t):null}setupLightMap(e){let t=null;return e.material.lightMap&&(t=new Lg(ep)),t}setupOutgoingLight(){return kn.rgb}setupLightingModel(){return new Dg}}const Og=dn(({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))}),Vg=dn(e=>e.diffuseColor.mul(1/Math.PI)),kg=dn(({dotNH:e})=>na.mul(fn(.5)).add(1).mul(fn(1/Math.PI)).mul(e.pow(na))),Gg=dn(({lightDirection:e})=>{const t=e.add(ec).normalize(),r=dc.dot(t).clamp(),s=ec.dot(t).clamp(),i=Og({f0:ra,f90:1,dotVH:s}),n=fn(.25),a=kg({dotNH:r});return i.mul(n).mul(a)});class zg extends Dg{constructor(e=!0){super(),this.specular=e}direct({lightDirection:e,lightColor:t,reflectedLight:r}){const s=dc.dot(e).clamp().mul(t);r.directDiffuse.addAssign(s.mul(Vg({diffuseColor:kn.rgb}))),!0===this.specular&&r.directSpecular.addAssign(s.mul(Gg({lightDirection:e})).mul(Eh))}indirect(e){const{ambientOcclusion:t,irradiance:r,reflectedLight:s}=e.context;s.indirectDiffuse.addAssign(r.mul(Vg({diffuseColor:kn}))),s.indirectDiffuse.mulAssign(t)}}const $g=new be;class Wg extends fg{static get type(){return"MeshLambertNodeMaterial"}constructor(e){super(),this.isMeshLambertNodeMaterial=!0,this.lights=!0,this.setDefaultValues($g),this.setValues(e)}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new Fg(t):null}setupLightingModel(){return new zg(!1)}}const Hg=new xe;class qg extends fg{static get type(){return"MeshPhongNodeMaterial"}constructor(e){super(),this.isMeshPhongNodeMaterial=!0,this.lights=!0,this.shininessNode=null,this.specularNode=null,this.setDefaultValues(Hg),this.setValues(e)}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new Fg(t):null}setupLightingModel(){return new zg}setupVariants(){const e=(this.shininessNode?fn(this.shininessNode):_h).max(1e-4);na.assign(e);const t=this.specularNode||Sh;ra.assign(t)}copy(e){return this.shininessNode=e.shininessNode,this.specularNode=e.specularNode,super.copy(e)}}const jg=dn(e=>{if(!1===e.geometry.hasAttribute("normal"))return fn(0);const t=uc.dFdx().abs().max(uc.dFdy().abs());return t.x.max(t.y).max(t.z)}),Xg=dn(e=>{const{roughness:t}=e,r=jg();let s=t.max(.0525);return s=s.add(r),s=s.min(1),s}),Kg=dn(({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 Da(.5,i.add(n).max(no))}).setLayout({name:"V_GGX_SmithCorrelated",type:"float",inputs:[{name:"alpha",type:"float"},{name:"dotNL",type:"float"},{name:"dotNV",type:"float"}]}),Qg=dn(({alphaT:e,alphaB:t,dotTV:r,dotBV:s,dotTL:i,dotBL:n,dotNV:a,dotNL:o})=>{const u=o.mul(Sn(e.mul(r),t.mul(s),a).length()),l=a.mul(Sn(e.mul(i),t.mul(n),o).length());return Da(.5,u.add(l))}).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"}]}),Yg=dn(({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"}]}),Zg=fn(1/Math.PI),Jg=dn(({alphaT:e,alphaB:t,dotNH:r,dotTH:s,dotBH:i})=>{const n=e.mul(t),a=Sn(t.mul(s),e.mul(i),n.mul(r)),o=a.dot(a),u=n.div(o);return Zg.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"}]}),em=dn(({lightDirection:e,f0:t,f90:r,roughness:s,f:i,normalView:n=dc,USE_IRIDESCENCE:a,USE_ANISOTROPY:o})=>{const u=s.pow2(),l=e.add(ec).normalize(),d=n.dot(e).clamp(),c=n.dot(ec).clamp(),h=n.dot(l).clamp(),p=ec.dot(l).clamp();let g,m,f=Og({f0:t,f90:r,dotVH:p});if(Yi(a)&&(f=Kn.mix(f,i)),Yi(o)){const t=ea.dot(e),r=ea.dot(ec),s=ea.dot(l),i=ta.dot(e),n=ta.dot(ec),a=ta.dot(l);g=Qg({alphaT:Zn,alphaB:u,dotTV:r,dotBV:n,dotTL:t,dotBL:i,dotNV:c,dotNL:d}),m=Jg({alphaT:Zn,alphaB:u,dotNH:h,dotTH:s,dotBH:a})}else g=Kg({alpha:u,dotNL:d,dotNV:c}),m=Yg({alpha:u,dotNH:h});return f.mul(g).mul(m)}),tm=new Uint16Array([12469,15057,12620,14925,13266,14620,13807,14376,14323,13990,14545,13625,14713,13328,14840,12882,14931,12528,14996,12233,15039,11829,15066,11525,15080,11295,15085,10976,15082,10705,15073,10495,13880,14564,13898,14542,13977,14430,14158,14124,14393,13732,14556,13410,14702,12996,14814,12596,14891,12291,14937,11834,14957,11489,14958,11194,14943,10803,14921,10506,14893,10278,14858,9960,14484,14039,14487,14025,14499,13941,14524,13740,14574,13468,14654,13106,14743,12678,14818,12344,14867,11893,14889,11509,14893,11180,14881,10751,14852,10428,14812,10128,14765,9754,14712,9466,14764,13480,14764,13475,14766,13440,14766,13347,14769,13070,14786,12713,14816,12387,14844,11957,14860,11549,14868,11215,14855,10751,14825,10403,14782,10044,14729,9651,14666,9352,14599,9029,14967,12835,14966,12831,14963,12804,14954,12723,14936,12564,14917,12347,14900,11958,14886,11569,14878,11247,14859,10765,14828,10401,14784,10011,14727,9600,14660,9289,14586,8893,14508,8533,15111,12234,15110,12234,15104,12216,15092,12156,15067,12010,15028,11776,14981,11500,14942,11205,14902,10752,14861,10393,14812,9991,14752,9570,14682,9252,14603,8808,14519,8445,14431,8145,15209,11449,15208,11451,15202,11451,15190,11438,15163,11384,15117,11274,15055,10979,14994,10648,14932,10343,14871,9936,14803,9532,14729,9218,14645,8742,14556,8381,14461,8020,14365,7603,15273,10603,15272,10607,15267,10619,15256,10631,15231,10614,15182,10535,15118,10389,15042,10167,14963,9787,14883,9447,14800,9115,14710,8665,14615,8318,14514,7911,14411,7507,14279,7198,15314,9675,15313,9683,15309,9712,15298,9759,15277,9797,15229,9773,15166,9668,15084,9487,14995,9274,14898,8910,14800,8539,14697,8234,14590,7790,14479,7409,14367,7067,14178,6621,15337,8619,15337,8631,15333,8677,15325,8769,15305,8871,15264,8940,15202,8909,15119,8775,15022,8565,14916,8328,14804,8009,14688,7614,14569,7287,14448,6888,14321,6483,14088,6171,15350,7402,15350,7419,15347,7480,15340,7613,15322,7804,15287,7973,15229,8057,15148,8012,15046,7846,14933,7611,14810,7357,14682,7069,14552,6656,14421,6316,14251,5948,14007,5528,15356,5942,15356,5977,15353,6119,15348,6294,15332,6551,15302,6824,15249,7044,15171,7122,15070,7050,14949,6861,14818,6611,14679,6349,14538,6067,14398,5651,14189,5311,13935,4958,15359,4123,15359,4153,15356,4296,15353,4646,15338,5160,15311,5508,15263,5829,15188,6042,15088,6094,14966,6001,14826,5796,14678,5543,14527,5287,14377,4985,14133,4586,13869,4257,15360,1563,15360,1642,15358,2076,15354,2636,15341,3350,15317,4019,15273,4429,15203,4732,15105,4911,14981,4932,14836,4818,14679,4621,14517,4386,14359,4156,14083,3795,13808,3437,15360,122,15360,137,15358,285,15355,636,15344,1274,15322,2177,15281,2765,15215,3223,15120,3451,14995,3569,14846,3567,14681,3466,14511,3305,14344,3121,14037,2800,13753,2467,15360,0,15360,1,15359,21,15355,89,15346,253,15325,479,15287,796,15225,1148,15133,1492,15008,1749,14856,1882,14685,1886,14506,1783,14324,1608,13996,1398,13702,1183]);let rm=null;const sm=dn(({roughness:e,dotNV:t})=>{null===rm&&(rm=new Te(tm,16,16,W,_e),rm.name="DFG_LUT",rm.minFilter=de,rm.magFilter=de,rm.wrapS=ve,rm.wrapT=ve,rm.generateMipmaps=!1,rm.needsUpdate=!0);const r=Tn(e,t);return Dl(rm,r).rg}),im=dn(({lightDirection:e,f0:t,f90:r,roughness:s,f:i,USE_IRIDESCENCE:n,USE_ANISOTROPY:a})=>{const o=em({lightDirection:e,f0:t,f90:r,roughness:s,f:i,USE_IRIDESCENCE:n,USE_ANISOTROPY:a}),u=dc.dot(e).clamp(),l=dc.dot(ec).clamp(),d=sm({roughness:s,dotNV:l}),c=sm({roughness:s,dotNV:u}),h=t.mul(d.x).add(r.mul(d.y)),p=t.mul(c.x).add(r.mul(c.y)),g=d.x.add(d.y),m=c.x.add(c.y),f=fn(1).sub(g),y=fn(1).sub(m),b=t.add(t.oneMinus().mul(.047619)),x=h.mul(p).mul(b).div(fn(1).sub(f.mul(y).mul(b).mul(b)).add(no)),T=f.mul(y),_=x.mul(T);return o.add(_)}),nm=dn(e=>{const{dotNV:t,specularColor:r,specularF90:s,roughness:i}=e,n=sm({dotNV:t,roughness:i});return r.mul(n.x).add(s.mul(n.y))}),am=dn(({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(Sn(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"}]}),om=dn(({roughness:e,dotNH:t})=>{const r=e.pow2(),s=fn(1).div(r),i=t.pow2().oneMinus().max(.0078125);return fn(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"}]}),um=dn(({dotNV:e,dotNL:t})=>fn(1).div(fn(4).mul(t.add(e).sub(t.mul(e))))).setLayout({name:"V_Neubelt",type:"float",inputs:[{name:"dotNV",type:"float"},{name:"dotNL",type:"float"}]}),lm=dn(({lightDirection:e})=>{const t=e.add(ec).normalize(),r=dc.dot(e).clamp(),s=dc.dot(ec).clamp(),i=dc.dot(t).clamp(),n=om({roughness:Xn,dotNH:i}),a=um({dotNV:s,dotNL:r});return jn.mul(n).mul(a)}),dm=dn(({N:e,V:t,roughness:r})=>{const s=e.dot(t).saturate(),i=Tn(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"}]}),cm=dn(({f:e})=>{const t=e.length();return jo(t.mul(t).add(e.z).div(t.add(1)),0)}).setLayout({name:"LTC_ClippedSphereFormFactor",type:"float",inputs:[{name:"f",type:"vec3"}]}),hm=dn(({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,jo(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"}]}),pm=dn(({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=Sn().toVar();return pn(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(Ln(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=Sn(0).toVar();f.addAssign(hm({v1:h,v2:p})),f.addAssign(hm({v1:p,v2:g})),f.addAssign(hm({v1:g,v2:m})),f.addAssign(hm({v1:m,v2:h})),c.assign(Sn(cm({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"}]}),gm=dn(({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=Sn().toVar();return pn(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=Sn(0).toVar();d.addAssign(hm({v1:n,v2:a})),d.addAssign(hm({v1:a,v2:o})),d.addAssign(hm({v1:o,v2:l})),d.addAssign(hm({v1:l,v2:n})),u.assign(Sn(cm({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"}]}),mm=1/6,fm=e=>Pa(mm,Pa(e,Pa(e,e.negate().add(3)).sub(3)).add(1)),ym=e=>Pa(mm,Pa(e,Pa(e,Pa(3,e).sub(6))).add(4)),bm=e=>Pa(mm,Pa(e,Pa(e,Pa(-3,e).add(3)).add(3)).add(1)),xm=e=>Pa(mm,eu(e,3)),Tm=e=>fm(e).add(ym(e)),_m=e=>bm(e).add(xm(e)),vm=e=>Fa(-1,ym(e).div(fm(e).add(ym(e)))),Nm=e=>Fa(1,xm(e).div(bm(e).add(xm(e)))),Sm=(e,t,r)=>{const s=e.uvNode,i=Pa(s,t.zw).add(.5),n=vo(i),a=Ro(i),o=Tm(a.x),u=_m(a.x),l=vm(a.x),d=Nm(a.x),c=vm(a.y),h=Nm(a.y),p=Tn(n.x.add(l),n.y.add(c)).sub(.5).mul(t.xy),g=Tn(n.x.add(d),n.y.add(c)).sub(.5).mul(t.xy),m=Tn(n.x.add(l),n.y.add(h)).sub(.5).mul(t.xy),f=Tn(n.x.add(d),n.y.add(h)).sub(.5).mul(t.xy),y=Tm(a.y).mul(Fa(o.mul(e.sample(p).level(r)),u.mul(e.sample(g).level(r)))),b=_m(a.y).mul(Fa(o.mul(e.sample(m).level(r)),u.mul(e.sample(f).level(r))));return y.add(b)},Rm=dn(([e,t])=>{const r=Tn(e.size(yn(t))),s=Tn(e.size(yn(t.add(1)))),i=Da(1,r),n=Da(1,s),a=Sm(e,wn(i,r),vo(t)),o=Sm(e,wn(n,s),No(t));return Ro(t).mix(a,o)}),Am=dn(([e,t])=>{const r=t.mul(Ml(e));return Rm(e,r)}),Em=dn(([e,t,r,s,i])=>{const n=Sn(du(t.negate(),So(e),Da(1,s))),a=Sn(Po(i[0].xyz),Po(i[1].xyz),Po(i[2].xyz));return So(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"}]}),wm=dn(([e,t])=>e.mul(uu(t.mul(2).sub(2),0,1))).setLayout({name:"applyIorToRoughness",type:"float",inputs:[{name:"roughness",type:"float"},{name:"ior",type:"float"}]}),Cm=kp(),Mm=zp(),Bm=dn(([e,t,r],{material:s})=>{const i=(s.side===L?Cm:Mm).sample(e),n=xo(Kl.x).mul(wm(t,r));return Rm(i,n)}),Fm=dn(([e,t,r])=>(pn(r.notEqual(0),()=>{const s=bo(t).negate().div(r);return fo(s.negate().mul(e))}),Sn(1))).setLayout({name:"volumeAttenuation",type:"vec3",inputs:[{name:"transmissionDistance",type:"float"},{name:"attenuationColor",type:"vec3"},{name:"attenuationDistance",type:"float"}]}),Lm=dn(([e,t,r,s,i,n,a,o,u,l,d,c,h,p,g])=>{let m,f;if(g){m=wn().toVar(),f=Sn().toVar();const i=d.sub(1).mul(g.mul(.025)),n=Sn(d.sub(i),d,d.add(i));Rp({start:0,end:3},({i:i})=>{const d=n.element(i),g=Em(e,t,c,d,o),y=a.add(g),b=l.mul(u.mul(wn(y,1))),x=Tn(b.xy.div(b.w)).toVar();x.addAssign(1),x.divAssign(2),x.assign(Tn(x.x,x.y.oneMinus()));const T=Bm(x,r,d);m.element(i).assign(T.element(i)),m.a.addAssign(T.a),f.element(i).assign(s.element(i).mul(Fm(Po(g),h,p).element(i)))}),m.a.divAssign(3)}else{const i=Em(e,t,c,d,o),n=a.add(i),g=l.mul(u.mul(wn(n,1))),y=Tn(g.xy.div(g.w)).toVar();y.addAssign(1),y.divAssign(2),y.assign(Tn(y.x,y.y.oneMinus())),m=Bm(y,r,d),f=s.mul(Fm(Po(i),h,p))}const y=f.rgb.mul(m.rgb),b=e.dot(t).clamp(),x=Sn(nm({dotNV:b,specularColor:i,specularF90:n,roughness:r})),T=f.r.add(f.g,f.b).div(3);return wn(x.oneMinus().mul(y),m.a.oneMinus().mul(T).oneMinus())}),Pm=Ln(3.2404542,-.969266,.0556434,-1.5371385,1.8760108,-.2040259,-.4985314,.041556,1.0572252),Dm=(e,t)=>e.sub(t).div(e.add(t)).pow2(),Um=dn(({outsideIOR:e,eta2:t,cosTheta1:r,thinFilmThickness:s,baseF0:i})=>{const n=ou(e,t,cu(0,.03,s)),a=e.div(n).pow2().mul(r.pow2().oneMinus()).oneMinus();pn(a.lessThan(0),()=>Sn(1));const o=a.sqrt(),u=Dm(n,e),l=Og({f0:u,f90:1,dotVH:r}),d=l.oneMinus(),c=n.lessThan(e).select(Math.PI,0),h=fn(Math.PI).sub(c),p=(e=>{const t=e.sqrt();return Sn(1).add(t).div(Sn(1).sub(t))})(i.clamp(0,.9999)),g=Dm(p,n.toVec3()),m=Og({f0:g,f90:1,dotVH:o}),f=Sn(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=Sn(h).add(f),x=l.mul(m).clamp(1e-5,.9999),T=x.sqrt(),_=d.pow2().mul(m).div(Sn(1).sub(x)),v=l.add(_).toVar(),N=_.sub(d).toVar();return Rp({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=Sn(54856e-17,44201e-17,52481e-17),i=Sn(1681e3,1795300,2208400),n=Sn(43278e5,93046e5,66121e5),a=fn(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=Sn(o.x.add(a),o.y,o.z).div(1.0685e-7),Pm.mul(o)})(fn(e).mul(y),fn(e).mul(b)).mul(2);v.addAssign(N.mul(t))}),v.max(Sn(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"}]}),Im=dn(({normal:e,viewDir:t,roughness:r})=>{const s=e.dot(t).saturate(),i=r.mul(r),n=r.add(.1).reciprocal(),a=fn(-1.9362).add(r.mul(1.0678)).add(i.mul(.4573)).sub(n.mul(.8469)),o=fn(-.6014).add(r.mul(.5538)).sub(i.mul(.467)).sub(n.mul(.1255));return a.mul(s).add(o).exp().saturate()}),Om=Sn(.04),Vm=fn(1);class km extends Pg{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,this.iridescenceF0Dielectric=null,this.iridescenceF0Metallic=null}start(e){if(!0===this.clearcoat&&(this.clearcoatRadiance=Sn().toVar("clearcoatRadiance"),this.clearcoatSpecularDirect=Sn().toVar("clearcoatSpecularDirect"),this.clearcoatSpecularIndirect=Sn().toVar("clearcoatSpecularIndirect")),!0===this.sheen&&(this.sheenSpecularDirect=Sn().toVar("sheenSpecularDirect"),this.sheenSpecularIndirect=Sn().toVar("sheenSpecularIndirect")),!0===this.iridescence){const e=dc.dot(ec).clamp(),t=Um({outsideIOR:fn(1),eta2:Qn,cosTheta1:e,thinFilmThickness:Yn,baseF0:ra}),r=Um({outsideIOR:fn(1),eta2:Qn,cosTheta1:e,thinFilmThickness:Yn,baseF0:kn.rgb});this.iridescenceFresnel=ou(t,r,Wn),this.iridescenceF0Dielectric=am({f:t,f90:1,dotVH:e}),this.iridescenceF0Metallic=am({f:r,f90:1,dotVH:e}),this.iridescenceF0=ou(this.iridescenceF0Dielectric,this.iridescenceF0Metallic,Wn)}if(!0===this.transmission){const t=Yd,r=Sd.sub(Yd).normalize(),s=cc,i=e.context;i.backdrop=Lm(s,r,$n,Gn,sa,ia,t,Ud,_d,xd,da,ha,ga,pa,this.dispersion?ma:null),i.backdropAlpha=ca,kn.a.mulAssign(ou(1,i.backdrop.a,ca))}super.start(e)}computeMultiscattering(e,t,r,s,i=null){const n=dc.dot(ec).clamp(),a=sm({roughness:$n,dotNV:n}),o=i?Kn.mix(s,i):s,u=o.mul(a.x).add(r.mul(a.y)),l=a.x.add(a.y).oneMinus(),d=o.add(o.oneMinus().mul(.047619)),c=u.mul(d).div(l.mul(d).oneMinus());e.addAssign(u),t.addAssign(c.mul(l))}direct({lightDirection:e,lightColor:t,reflectedLight:r}){const s=dc.dot(e).clamp().mul(t).toVar();if(!0===this.sheen){this.sheenSpecularDirect.addAssign(s.mul(lm({lightDirection:e})));const t=Im({normal:dc,viewDir:ec,roughness:Xn}),r=Im({normal:dc,viewDir:e,roughness:Xn}),i=jn.r.max(jn.g).max(jn.b).mul(t.max(r)).oneMinus();s.mulAssign(i)}if(!0===this.clearcoat){const r=hc.dot(e).clamp().mul(t);this.clearcoatSpecularDirect.addAssign(r.mul(em({lightDirection:e,f0:Om,f90:Vm,roughness:qn,normalView:hc})))}r.directDiffuse.addAssign(s.mul(Vg({diffuseColor:Gn}))),r.directSpecular.addAssign(s.mul(im({lightDirection:e,f0:sa,f90:1,roughness:$n,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=dc,h=ec,p=Jd.toVar(),g=dm({N:c,V:h,roughness:$n}),m=n.sample(g).toVar(),f=a.sample(g).toVar(),y=Ln(Sn(m.x,0,m.y),Sn(0,1,0),Sn(m.z,0,m.w)).toVar(),b=sa.mul(f.x).add(ia.sub(sa).mul(f.y)).toVar();if(i.directSpecular.addAssign(e.mul(b).mul(pm({N:c,V:h,P:p,mInv:y,p0:o,p1:u,p2:l,p3:d}))),i.directDiffuse.addAssign(e.mul(Gn).mul(pm({N:c,V:h,P:p,mInv:Ln(1,0,0,0,1,0,0,0,1),p0:o,p1:u,p2:l,p3:d}))),!0===this.clearcoat){const t=hc,r=dm({N:t,V:h,roughness:qn}),s=n.sample(r),i=a.sample(r),c=Ln(Sn(s.x,0,s.y),Sn(0,1,0),Sn(s.z,0,s.w)),g=Om.mul(i.x).add(Vm.sub(Om).mul(i.y));this.clearcoatSpecularDirect.addAssign(e.mul(g).mul(pm({N:t,V:h,P:p,mInv:c,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,s=t.mul(Vg({diffuseColor:Gn})).toVar();if(!0===this.sheen){const e=Im({normal:dc,viewDir:ec,roughness:Xn}),t=jn.r.max(jn.g).max(jn.b).mul(e).oneMinus();s.mulAssign(t)}r.indirectDiffuse.addAssign(s)}indirectSpecular(e){const{radiance:t,iblIrradiance:r,reflectedLight:s}=e.context;if(!0===this.sheen&&this.sheenSpecularIndirect.addAssign(r.mul(jn,Im({normal:dc,viewDir:ec,roughness:Xn}))),!0===this.clearcoat){const e=hc.dot(ec).clamp(),t=nm({dotNV:e,specularColor:Om,specularF90:Vm,roughness:qn});this.clearcoatSpecularIndirect.addAssign(this.clearcoatRadiance.mul(t))}const i=Sn().toVar("singleScatteringDielectric"),n=Sn().toVar("multiScatteringDielectric"),a=Sn().toVar("singleScatteringMetallic"),o=Sn().toVar("multiScatteringMetallic");this.computeMultiscattering(i,n,ia,ra,this.iridescenceF0Dielectric),this.computeMultiscattering(a,o,ia,kn.rgb,this.iridescenceF0Metallic);const u=ou(i,a,Wn),l=ou(n,o,Wn),d=i.add(n),c=Gn.mul(d.oneMinus()),h=r.mul(1/Math.PI),p=t.mul(u).add(l.mul(h)).toVar(),g=c.mul(h).toVar();if(!0===this.sheen){const e=Im({normal:dc,viewDir:ec,roughness:Xn}),t=jn.r.max(jn.g).max(jn.b).mul(e).oneMinus();p.mulAssign(t),g.mulAssign(t)}s.indirectSpecular.addAssign(p),s.indirectDiffuse.addAssign(g)}ambientOcclusion(e){const{ambientOcclusion:t,reflectedLight:r}=e.context,s=dc.dot(ec).clamp().add(t),i=$n.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=hc.dot(ec).clamp(),r=Og({dotVH:e,f0:Om,f90:Vm}),s=t.mul(Hn.mul(r).oneMinus()).add(this.clearcoatSpecularDirect.add(this.clearcoatSpecularIndirect).mul(Hn));t.assign(s)}if(!0===this.sheen){const e=t.add(this.sheenSpecularDirect,this.sheenSpecularIndirect.mul(1/Math.PI));t.assign(e)}}}const Gm=fn(1),zm=fn(-2),$m=fn(.8),Wm=fn(-1),Hm=fn(.4),qm=fn(2),jm=fn(.305),Xm=fn(3),Km=fn(.21),Qm=fn(4),Ym=fn(4),Zm=fn(16),Jm=dn(([e])=>{const t=Sn(Fo(e)).toVar(),r=fn(-1).toVar();return pn(t.x.greaterThan(t.z),()=>{pn(t.x.greaterThan(t.y),()=>{r.assign(Tu(e.x.greaterThan(0),0,3))}).Else(()=>{r.assign(Tu(e.y.greaterThan(0),1,4))})}).Else(()=>{pn(t.z.greaterThan(t.y),()=>{r.assign(Tu(e.z.greaterThan(0),2,5))}).Else(()=>{r.assign(Tu(e.y.greaterThan(0),1,4))})}),r}).setLayout({name:"getFace",type:"float",inputs:[{name:"direction",type:"vec3"}]}),ef=dn(([e,t])=>{const r=Tn().toVar();return pn(t.equal(0),()=>{r.assign(Tn(e.z,e.y).div(Fo(e.x)))}).ElseIf(t.equal(1),()=>{r.assign(Tn(e.x.negate(),e.z.negate()).div(Fo(e.y)))}).ElseIf(t.equal(2),()=>{r.assign(Tn(e.x.negate(),e.y).div(Fo(e.z)))}).ElseIf(t.equal(3),()=>{r.assign(Tn(e.z.negate(),e.y).div(Fo(e.x)))}).ElseIf(t.equal(4),()=>{r.assign(Tn(e.x.negate(),e.z).div(Fo(e.y)))}).Else(()=>{r.assign(Tn(e.x,e.y).div(Fo(e.z)))}),Pa(.5,r.add(1))}).setLayout({name:"getUV",type:"vec2",inputs:[{name:"direction",type:"vec3"},{name:"face",type:"float"}]}),tf=dn(([e])=>{const t=fn(0).toVar();return pn(e.greaterThanEqual($m),()=>{t.assign(Gm.sub(e).mul(Wm.sub(zm)).div(Gm.sub($m)).add(zm))}).ElseIf(e.greaterThanEqual(Hm),()=>{t.assign($m.sub(e).mul(qm.sub(Wm)).div($m.sub(Hm)).add(Wm))}).ElseIf(e.greaterThanEqual(jm),()=>{t.assign(Hm.sub(e).mul(Xm.sub(qm)).div(Hm.sub(jm)).add(qm))}).ElseIf(e.greaterThanEqual(Km),()=>{t.assign(jm.sub(e).mul(Qm.sub(Xm)).div(jm.sub(Km)).add(Xm))}).Else(()=>{t.assign(fn(-2).mul(xo(Pa(1.16,e))))}),t}).setLayout({name:"roughnessToMip",type:"float",inputs:[{name:"roughness",type:"float"}]}),rf=dn(([e,t])=>{const r=e.toVar();r.assign(Pa(2,r).sub(1));const s=Sn(r,1).toVar();return pn(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"}]}),sf=dn(([e,t,r,s,i,n])=>{const a=fn(r),o=Sn(t),u=uu(tf(a),zm,n),l=Ro(u),d=vo(u),c=Sn(nf(e,o,d,s,i,n)).toVar();return pn(l.notEqual(0),()=>{const t=Sn(nf(e,o,d.add(1),s,i,n)).toVar();c.assign(ou(c,t,l))}),c}),nf=dn(([e,t,r,s,i,n])=>{const a=fn(r).toVar(),o=Sn(t),u=fn(Jm(o)).toVar(),l=fn(jo(Ym.sub(a),0)).toVar();a.assign(jo(a,Ym));const d=fn(yo(a)).toVar(),c=Tn(ef(o,u).mul(d.sub(2)).add(1)).toVar();return pn(u.greaterThan(2),()=>{c.y.addAssign(d),u.subAssign(3)}),c.x.addAssign(u.mul(d)),c.x.addAssign(l.mul(Pa(3,Zm))),c.y.addAssign(Pa(4,yo(n).sub(d))),c.x.mulAssign(s),c.y.mulAssign(i),e.sample(c).grad(Tn(),Tn())}),af=dn(({envMap:e,mipInt:t,outputDirection:r,theta:s,axis:i,CUBEUV_TEXEL_WIDTH:n,CUBEUV_TEXEL_HEIGHT:a,CUBEUV_MAX_MIP:o})=>{const u=Eo(s),l=r.mul(u).add(i.cross(r).mul(Ao(s))).add(i.mul(i.dot(r).mul(u.oneMinus())));return nf(e,l,t,n,a,o)}),of=dn(({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=Sn(Tu(t,r,Jo(r,s))).toVar();pn(h.equal(Sn(0)),()=>{h.assign(Sn(s.z,0,s.x.negate()))}),h.assign(So(h));const p=Sn().toVar();return p.addAssign(i.element(0).mul(af({theta:0,axis:h,outputDirection:s,mipInt:o,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c}))),Rp({start:yn(1),end:e},({i:e})=>{pn(e.greaterThanEqual(n),()=>{Ap()});const t=fn(a.mul(fn(e))).toVar();p.addAssign(i.element(e).mul(af({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(af({theta:t,axis:h,outputDirection:s,mipInt:o,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c})))}),wn(p,1)}),uf=dn(([e])=>{const t=bn(e).toVar();return t.assign(t.shiftLeft(bn(16)).bitOr(t.shiftRight(bn(16)))),t.assign(t.bitAnd(bn(1431655765)).shiftLeft(bn(1)).bitOr(t.bitAnd(bn(2863311530)).shiftRight(bn(1)))),t.assign(t.bitAnd(bn(858993459)).shiftLeft(bn(2)).bitOr(t.bitAnd(bn(3435973836)).shiftRight(bn(2)))),t.assign(t.bitAnd(bn(252645135)).shiftLeft(bn(4)).bitOr(t.bitAnd(bn(4042322160)).shiftRight(bn(4)))),t.assign(t.bitAnd(bn(16711935)).shiftLeft(bn(8)).bitOr(t.bitAnd(bn(4278255360)).shiftRight(bn(8)))),fn(t).mul(2.3283064365386963e-10)}),lf=dn(([e,t])=>Tn(fn(e).div(fn(t)),uf(e))),df=dn(([e,t,r])=>{const s=r.mul(r).toConst(),i=Sn(1,0,0).toConst(),n=Jo(t,i).toConst(),a=To(e.x).toConst(),o=Pa(2,3.14159265359).mul(e.y).toConst(),u=a.mul(Eo(o)).toConst(),l=a.mul(Ao(o)).toVar(),d=Pa(.5,t.z.add(1)).toConst();l.assign(d.oneMinus().mul(To(u.mul(u).oneMinus())).add(d.mul(l)));const c=i.mul(u).add(n.mul(l)).add(t.mul(To(jo(0,u.mul(u).add(l.mul(l)).oneMinus()))));return So(Sn(s.mul(c.x),s.mul(c.y),jo(0,c.z)))}),cf=dn(({roughness:e,mipInt:t,envMap:r,N_immutable:s,GGX_SAMPLES:i,CUBEUV_TEXEL_WIDTH:n,CUBEUV_TEXEL_HEIGHT:a,CUBEUV_MAX_MIP:o})=>{const u=Sn(s).toVar(),l=Sn(0).toVar(),d=fn(0).toVar();return pn(e.lessThan(.001),()=>{l.assign(nf(r,u,t,n,a,o))}).Else(()=>{const s=Tu(Fo(u.z).lessThan(.999),Sn(0,0,1),Sn(1,0,0)),c=So(Jo(s,u)).toVar(),h=Jo(u,c).toVar();Rp({start:bn(0),end:i},({i:s})=>{const p=lf(s,i),g=df(p,Sn(0,0,1),e),m=So(c.mul(g.x).add(h.mul(g.y)).add(u.mul(g.z))),f=So(m.mul(Zo(u,m).mul(2)).sub(u)),y=jo(Zo(u,f),0);pn(y.greaterThan(0),()=>{const e=nf(r,f,t,n,a,o);l.addAssign(e.mul(y)),d.addAssign(y)})}),pn(d.greaterThan(0),()=>{l.assign(l.div(d))})}),wn(l,1)}),hf=[.125,.215,.35,.446,.526,.582],pf=20,gf=new Se(-1,1,1,-1,0,1),mf=new Re(90,1),ff=new e;let yf=null,bf=0,xf=0;const Tf=new r,_f=new WeakMap,vf=[3,1,5,0,4,2],Nf=rf(Al(),Rl("faceIndex")).normalize(),Sf=Sn(Nf.x,Nf.y,Nf.z);class Rf{constructor(e){this._renderer=e,this._pingPongRenderTarget=null,this._lodMax=0,this._cubeSize=0,this._sizeLods=[],this._sigmas=[],this._lodMeshes=[],this._blurMaterial=null,this._ggxMaterial=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=Tf,renderTarget:o=null}=i;if(this._setSize(n),!1===this._hasInitialized){d('PMREMGenerator: ".fromScene()" called before the backend is initialized. Try using "await renderer.init()" instead.');const n=o||this._allocateTarget();return i.renderTarget=n,this.fromSceneAsync(e,t,r,s,i),n}yf=this._renderer.getRenderTarget(),bf=this._renderer.getActiveCubeFace(),xf=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 v('PMREMGenerator: ".fromSceneAsync()" is deprecated. Use "await renderer.init()" instead.'),await this._renderer.init(),this.fromScene(e,t,r,s,i)}fromEquirectangular(e,t=null){if(!1===this._hasInitialized){d('PMREMGenerator: .fromEquirectangular() called before the backend is initialized. Try using "await renderer.init()" 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 v('PMREMGenerator: ".fromEquirectangularAsync()" is deprecated. Use "await renderer.init()" instead.'),await this._renderer.init(),this._fromTexture(e,t)}fromCubemap(e,t=null){if(!1===this._hasInitialized){d("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 v('PMREMGenerator: ".fromCubemapAsync()" is deprecated. Use "await renderer.init()" instead.'),await this._renderer.init(),this._fromTexture(e,t)}async compileCubemapShader(){null===this._cubemapMaterial&&(this._cubemapMaterial=wf(),await this._compileMaterial(this._cubemapMaterial))}async compileEquirectangularShader(){null===this._equirectMaterial&&(this._equirectMaterial=Cf(),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===I||e.mapping===O?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._ggxMaterial&&this._ggxMaterial.dispose(),null!==this._pingPongRenderTarget&&this._pingPongRenderTarget.dispose();for(let e=0;ee-4?o=hf[a-e+4-1]:0===a&&(o=0),r.push(o);const u=1/(n-2),l=-u,d=1+u,c=[l,l,d,l,d,d,l,l,d,d,l,d],h=6,p=6,g=3,m=2,f=1,y=new Float32Array(g*p*h),b=new Float32Array(m*p*h),x=new Float32Array(f*p*h);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=vf[e];y.set(s,g*p*i),b.set(c,m*p*i);const n=[i,i,i,i,i,i];x.set(n,f*p*i)}const T=new Ne;T.setAttribute("position",new Ce(y,g)),T.setAttribute("uv",new Ce(b,m)),T.setAttribute("faceIndex",new Ce(x,f)),s.push(new ue(T,null)),i>4&&i--}return{lodMeshes:s,sizeLods:t,sigmas:r}}(t)),this._blurMaterial=function(e,t,s){const i=Gl(new Array(pf).fill(0)),n=Na(new r(0,1,0)),a=Na(0),o=fn(pf),u=Na(0),l=Na(1),d=Dl(),c=Na(0),h=fn(1/t),p=fn(1/s),g=fn(e),m={n:o,latitudinal:u,weights:i,poleAxis:n,outputDirection:Sf,dTheta:a,samples:l,envMap:d,mipInt:c,CUBEUV_TEXEL_WIDTH:h,CUBEUV_TEXEL_HEIGHT:p,CUBEUV_MAX_MIP:g},f=Ef("blur");return f.fragmentNode=of({...m,latitudinal:u.equal(1)}),_f.set(f,m),f}(t,e.width,e.height),this._ggxMaterial=function(e,t,r){const s=Dl(),i=Na(0),n=Na(0),a=fn(1/t),o=fn(1/r),u=fn(e),l={envMap:s,roughness:i,mipInt:n,CUBEUV_TEXEL_WIDTH:a,CUBEUV_TEXEL_HEIGHT:o,CUBEUV_MAX_MIP:u},d=Ef("ggx");return d.fragmentNode=cf({...l,N_immutable:Sf,GGX_SAMPLES:bn(512)}),_f.set(d,l),d}(t,e.width,e.height)}}async _compileMaterial(e){const t=new ue(new Ne,e);await this._renderer.compile(t,gf)}_sceneToCubeUV(e,t,r,s,i){const n=mf;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(ff),u.autoClear=!1,null===this._backgroundBox&&(this._backgroundBox=new ue(new oe,new ye({name:"PMREM.Background",side:L,depthWrite:!1,depthTest:!1})));const d=this._backgroundBox,c=d.material;let h=!1;const p=e.background;p?p.isColor&&(c.color.copy(p),e.background=null,h=!0):(c.color.copy(ff),h=!0),u.setRenderTarget(s),u.clear(),h&&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;this._setViewport(s,r*l,t>2?l:0,l,l),u.render(e,n)}u.autoClear=l,e.background=p}_textureToCubeUV(e,t){const r=this._renderer,s=e.mapping===I||e.mapping===O;s?null===this._cubemapMaterial&&(this._cubemapMaterial=wf(e)):null===this._equirectMaterial&&(this._equirectMaterial=Cf(e));const i=s?this._cubemapMaterial:this._equirectMaterial;i.fragmentNode.value=e;const n=this._lodMeshes[0];n.material=i;const a=this._cubeSize;this._setViewport(t,0,0,3*a,2*a),r.setRenderTarget(t),r.render(n,gf)}_applyPMREM(e){const t=this._renderer,r=t.autoClear;t.autoClear=!1;const s=this._lodMeshes.length;for(let t=1;tc-4?r-c+4:0),g=4*(this._cubeSize-h);e.texture.frame=(e.texture.frame||0)+1,o.envMap.value=e.texture,o.roughness.value=d,o.mipInt.value=c-t,this._setViewport(i,p,g,3*h,2*h),s.setRenderTarget(i),s.render(a,gf),i.texture.frame=(i.texture.frame||0)+1,o.envMap.value=i.texture,o.roughness.value=0,o.mipInt.value=c-r,this._setViewport(e,p,g,3*h,2*h),s.setRenderTarget(e),s.render(a,gf)}_blur(e,t,r,s,i){const n=this._pingPongRenderTarget;this._halfBlur(e,n,t,r,s,"latitudinal",i),this._halfBlur(n,e,r,r,s,"longitudinal",i)}_halfBlur(e,t,r,s,i,n,a){const u=this._renderer,l=this._blurMaterial;"latitudinal"!==n&&"longitudinal"!==n&&o("blur direction must be either latitudinal or longitudinal!");const c=this._lodMeshes[s];c.material=l;const h=_f.get(l),p=this._sizeLods[r]-1,g=isFinite(i)?Math.PI/(2*p):2*Math.PI/39,m=i/g,f=isFinite(i)?1+Math.floor(3*m):pf;f>pf&&d(`sigmaRadians, ${i}, is too large and will clip, as it requested ${f} samples when the maximum is set to 20`);const y=[];let b=0;for(let e=0;ex-4?s-x+4:0),v=4*(this._cubeSize-T);this._setViewport(t,_,v,3*T,2*T),u.setRenderTarget(t),u.render(c,gf)}_setViewport(e,t,r,s,i){this._renderer.isWebGLRenderer?(e.viewport.set(t,e.height-i-r,s,i),e.scissor.set(t,e.height-i-r,s,i)):(e.viewport.set(t,r,s,i),e.scissor.set(t,r,s,i))}}function Af(e,t){const r=new ae(e,t,{magFilter:de,minFilter:de,generateMipmaps:!1,type:_e,format:Ee,colorSpace:Ae});return r.texture.mapping=we,r.texture.name="PMREM.cubeUv",r.texture.isPMREMTexture=!0,r.scissorTest=!0,r}function Ef(e){const t=new fg;return t.depthTest=!1,t.depthWrite=!1,t.blending=se,t.name=`PMREM_${e}`,t}function wf(e){const t=Ef("cubemap");return t.fragmentNode=Mc(e,Sf),t}function Cf(e){const t=Ef("equirect");return t.fragmentNode=Dl(e,Rg(Sf),0),t}const Mf=new WeakMap;function Bf(e,t,r){const s=function(e){let t=Mf.get(e);void 0===t&&(t=new WeakMap,Mf.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 Ff extends pi{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 N;s.isRenderTargetTexture=!0,this._texture=Dl(s),this._width=Na(0),this._height=Na(0),this._maxMip=Na(0),this.updateBeforeType=ti.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:Bf(s,e.renderer,this._generator),null!==t&&(this._pmrem=t,this.updateFromTexture(t)))}setup(e){null===this._generator&&(this._generator=new Rf(e.renderer)),this.updateBefore(e);let t=this.uvNode;null===t&&e.context.getUV&&(t=e.context.getUV(this,e)),t=vc.mul(Sn(t.x,t.y.negate(),t.z));let r=this.levelNode;return null===r&&e.context.getTextureLevel&&(r=e.context.getTextureLevel(this)),sf(this._texture,t,r,this._width,this._height,this._maxMip)}dispose(){super.dispose(),null!==this._generator&&this._generator.dispose()}}const Lf=nn(Ff).setParameterLength(1,3),Pf=new WeakMap;class Df extends Fp{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 s=r.isTextureNode?r.value:t[r.property],i=this._getPMREMNodeCache(e.renderer);let n=i.get(s);void 0===n&&(n=Lf(s),i.set(s,n)),r=n}const s=!0===t.useAnisotropy||t.anisotropy>0?uh:dc,i=r.context(Uf($n,s)).mul(_c),n=r.context(If(cc)).mul(Math.PI).mul(_c),a=ul(i),o=ul(n);e.context.radiance.addAssign(a),e.context.iblIrradiance.addAssign(o);const u=e.context.lightingModel.clearcoatRadiance;if(u){const e=r.context(Uf(qn,hc)).mul(_c),t=ul(e);u.addAssign(t)}}_getPMREMNodeCache(e){let t=Pf.get(e);return void 0===t&&(t=new WeakMap,Pf.set(e,t)),t}}const Uf=(e,t)=>{let r=null;return{getUV:()=>(null===r&&(r=ec.negate().reflect(t),r=su(e).mix(r,t).normalize(),r=r.transformDirection(_d)),r),getTextureLevel:()=>e}},If=e=>({getUV:()=>e,getTextureLevel:()=>fn(1)}),Of=new Me;class Vf extends fg{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(Of),this.setValues(e)}setupEnvironment(e){let t=super.setupEnvironment(e);return null===t&&e.environmentNode&&(t=e.environmentNode),t?new Df(t):null}setupLightingModel(){return new km}setupSpecular(){const e=ou(Sn(.04),kn.rgb,Wn);ra.assign(Sn(.04)),sa.assign(e),ia.assign(1)}setupVariants(){const e=this.metalnessNode?fn(this.metalnessNode):Mh;Wn.assign(e);let t=this.roughnessNode?fn(this.roughnessNode):Ch;t=Xg({roughness:t}),$n.assign(t),this.setupSpecular(),Gn.assign(kn.rgb.mul(e.oneMinus()))}copy(e){return this.emissiveNode=e.emissiveNode,this.metalnessNode=e.metalnessNode,this.roughnessNode=e.roughnessNode,super.copy(e)}}const kf=new Be;class Gf extends Vf{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(kf),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?fn(this.iorNode):Wh;da.assign(e),ra.assign(qo(tu(da.sub(1).div(da.add(1))).mul(Ah),Sn(1)).mul(Rh)),sa.assign(ou(ra,kn.rgb,Wn)),ia.assign(ou(Rh,1,Wn))}setupLightingModel(){return new km(this.useClearcoat,this.useSheen,this.useIridescence,this.useAnisotropy,this.useTransmission,this.useDispersion)}setupVariants(e){if(super.setupVariants(e),this.useClearcoat){const e=this.clearcoatNode?fn(this.clearcoatNode):Fh,t=this.clearcoatRoughnessNode?fn(this.clearcoatRoughnessNode):Lh;Hn.assign(e),qn.assign(Xg({roughness:t}))}if(this.useSheen){const e=this.sheenNode?Sn(this.sheenNode):Uh,t=this.sheenRoughnessNode?fn(this.sheenRoughnessNode):Ih;jn.assign(e),Xn.assign(t)}if(this.useIridescence){const e=this.iridescenceNode?fn(this.iridescenceNode):Vh,t=this.iridescenceIORNode?fn(this.iridescenceIORNode):kh,r=this.iridescenceThicknessNode?fn(this.iridescenceThicknessNode):Gh;Kn.assign(e),Qn.assign(t),Yn.assign(r)}if(this.useAnisotropy){const e=(this.anisotropyNode?Tn(this.anisotropyNode):Oh).toVar();Jn.assign(e.length()),pn(Jn.equal(0),()=>{e.assign(Tn(1,0))}).Else(()=>{e.divAssign(Tn(Jn)),Jn.assign(Jn.saturate())}),Zn.assign(Jn.pow2().mix($n.pow2(),1)),ea.assign(ah[0].mul(e.x).add(ah[1].mul(e.y))),ta.assign(ah[1].mul(e.x).sub(ah[0].mul(e.y)))}if(this.useTransmission){const e=this.transmissionNode?fn(this.transmissionNode):zh,t=this.thicknessNode?fn(this.thicknessNode):$h,r=this.attenuationDistanceNode?fn(this.attenuationDistanceNode):Hh,s=this.attenuationColorNode?Sn(this.attenuationColorNode):qh;if(ca.assign(e),ha.assign(t),pa.assign(r),ga.assign(s),this.useDispersion){const e=this.dispersionNode?fn(this.dispersionNode):Jh;ma.assign(e)}}}setupClearcoatNormal(){return this.clearcoatNormalNode?Sn(this.clearcoatNormalNode):Ph}setup(e){e.context.setupClearcoatNormal=()=>Pu(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.iorNode=e.iorNode,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 zf extends km{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(dc.mul(a)).normalize(),h=fn(ec.dot(c.negate()).saturate().pow(l).mul(d)),p=Sn(h.add(o).mul(n));r.directDiffuse.addAssign(p.mul(u.mul(t)))}super.direct({lightDirection:e,lightColor:t,reflectedLight:r},s)}}class $f extends Gf{static get type(){return"MeshSSSNodeMaterial"}constructor(e){super(e),this.thicknessColorNode=null,this.thicknessDistortionNode=fn(.1),this.thicknessAmbientNode=fn(0),this.thicknessAttenuationNode=fn(.1),this.thicknessPowerNode=fn(2),this.thicknessScaleNode=fn(10)}get useSSS(){return null!==this.thicknessColorNode}setupLightingModel(){return new zf(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 Wf=dn(({normal:e,lightDirection:t,builder:r})=>{const s=e.dot(t),i=Tn(s.mul(.5).add(.5),0);if(r.material.gradientMap){const e=Uc("gradientMap","texture").context({getUV:()=>i});return Sn(e.r)}{const e=i.fwidth().mul(.5);return ou(Sn(.7),Sn(1),cu(fn(.7).sub(e.x),fn(.7).add(e.x),i.x))}});class Hf extends Pg{direct({lightDirection:e,lightColor:t,reflectedLight:r},s){const i=Wf({normal:nc,lightDirection:e,builder:s}).mul(t);r.directDiffuse.addAssign(i.mul(Vg({diffuseColor:kn.rgb})))}indirect(e){const{ambientOcclusion:t,irradiance:r,reflectedLight:s}=e.context;s.indirectDiffuse.addAssign(r.mul(Vg({diffuseColor:kn}))),s.indirectDiffuse.mulAssign(t)}}const qf=new Fe;class jf extends fg{static get type(){return"MeshToonNodeMaterial"}constructor(e){super(),this.isMeshToonNodeMaterial=!0,this.lights=!0,this.setDefaultValues(qf),this.setValues(e)}setupLightingModel(){return new Hf}}const Xf=dn(()=>{const e=Sn(ec.z,0,ec.x.negate()).normalize(),t=ec.cross(e);return Tn(e.dot(dc),t.dot(dc)).mul(.495).add(.5)}).once(["NORMAL","VERTEX"])().toVar("matcapUV"),Kf=new Le;class Qf extends fg{static get type(){return"MeshMatcapNodeMaterial"}constructor(e){super(),this.isMeshMatcapNodeMaterial=!0,this.setDefaultValues(Kf),this.setValues(e)}setupVariants(e){const t=Xf;let r;r=e.material.matcap?Uc("matcap","texture").context({getUV:()=>t}):Sn(ou(.2,.8,t.y)),kn.rgb.mulAssign(r.rgb)}}class Yf extends pi{static get type(){return"RotateNode"}constructor(e,t){super(),this.positionNode=e,this.rotationNode=t}generateNodeType(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 Fn(e,s,s.negate(),e).mul(r)}{const e=t,s=Pn(wn(1,0,0,0),wn(0,Eo(e.x),Ao(e.x).negate(),0),wn(0,Ao(e.x),Eo(e.x),0),wn(0,0,0,1)),i=Pn(wn(Eo(e.y),0,Ao(e.y),0),wn(0,1,0,0),wn(Ao(e.y).negate(),0,Eo(e.y),0),wn(0,0,0,1)),n=Pn(wn(Eo(e.z),Ao(e.z).negate(),0,0),wn(Ao(e.z),Eo(e.z),0,0),wn(0,0,1,0),wn(0,0,0,1));return s.mul(i).mul(n).mul(wn(r,1)).xyz}}}const Zf=nn(Yf).setParameterLength(2),Jf=new Pe;class ey extends fg{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(Jf),this.setValues(e)}setupPositionView(e){const{object:t,camera:r}=e,{positionNode:s,rotationNode:i,scaleNode:n,sizeAttenuation:a}=this,o=$d.mul(Sn(s||0));let u=Tn(Ud[0].xyz.length(),Ud[1].xyz.length());null!==n&&(u=u.mul(Tn(n))),r.isPerspectiveCamera&&!1===a&&(u=u.mul(o.z.negate()));let l=Xd.xy;if(t.center&&!0===t.center.isVector2){const e=((e,t,r)=>new Hu(e,t,r))("center","vec2",t);l=l.sub(e.sub(.5))}l=l.mul(u);const d=fn(i||Dh),c=Zf(l,d);return wn(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 ty=new De,ry=new t;class sy extends ey{static get type(){return"PointsNodeMaterial"}constructor(e){super(),this.sizeNode=null,this.isPointsNodeMaterial=!0,this.setDefaultValues(ty),this.setValues(e)}setupPositionView(){const{positionNode:e}=this;return $d.mul(Sn(e||Kd)).xyz}setupVertexSprite(e){const{material:t,camera:r}=e,{rotationNode:s,scaleNode:i,sizeNode:n,sizeAttenuation:a}=this;let o=super.setupVertex(e);if(!0!==t.isNodeMaterial)return o;let u=null!==n?Tn(n):Zh;u=u.mul(jl),r.isPerspectiveCamera&&!0===a&&(u=u.mul(iy.div(Jd.z.negate()))),i&&i.isNode&&(u=u.mul(Tn(i)));let l=Xd.xy;if(s&&s.isNode){const e=fn(s);l=Zf(l,e)}return l=l.mul(u),l=l.div(Zl.div(2)),l=l.mul(o.w),o=o.add(wn(l,0,0)),o}setupVertex(e){return e.object.isPoints?super.setupVertex(e):this.setupVertexSprite(e)}get alphaToCoverage(){return this._useAlphaToCoverage}set alphaToCoverage(e){this._useAlphaToCoverage!==e&&(this._useAlphaToCoverage=e,this.needsUpdate=!0)}}const iy=Na(1).onFrameUpdate(function({renderer:e}){const t=e.getSize(ry);this.value=.5*t.y});class ny extends Pg{constructor(){super(),this.shadowNode=fn(1).toVar("shadowMask")}direct({lightNode:e}){null!==e.shadowNode&&this.shadowNode.mulAssign(e.shadowNode)}finish({context:e}){kn.a.mulAssign(this.shadowNode.oneMinus()),e.outgoingLight.rgb.assign(kn.rgb)}}const ay=new Ue;class oy extends fg{static get type(){return"ShadowNodeMaterial"}constructor(e){super(),this.isShadowNodeMaterial=!0,this.lights=!0,this.transparent=!0,this.setDefaultValues(ay),this.setValues(e)}setupLightingModel(){return new ny}}const uy=On("vec3"),ly=On("vec3"),dy=On("vec3");class cy extends Pg{constructor(){super()}start(e){const{material:t}=e,r=On("vec3"),s=On("vec3");pn(Sd.sub(Yd).length().greaterThan(kd.mul(2)),()=>{r.assign(Sd),s.assign(Yd)}).Else(()=>{r.assign(Yd),s.assign(Sd)});const i=s.sub(r),n=Na("int").onRenderUpdate(({material:e})=>e.steps),a=i.length().div(n).toVar(),o=i.normalize().toVar(),u=fn(0).toVar(),l=Sn(1).toVar();t.offsetNode&&u.addAssign(t.offsetNode.mul(a)),Rp(n,()=>{const s=r.add(o.mul(u)),i=_d.mul(wn(s,1)).xyz;let n;null!==t.depthNode&&(ly.assign(tg(Kp(i.z,yd,bd))),e.context.sceneDepthNode=tg(t.depthNode).toVar()),e.context.positionWorld=s,e.context.shadowPositionWorld=s,e.context.positionView=i,uy.assign(0),t.scatteringNode&&(n=t.scatteringNode({positionRay:s})),super.start(e),n&&uy.mulAssign(n);const d=uy.mul(.01).negate().mul(a).exp();l.mulAssign(d),u.addAssign(a)}),dy.addAssign(l.saturate().oneMinus())}scatteringLight(e,t){const r=t.context.sceneDepthNode;r?pn(r.greaterThanEqual(ly),()=>{uy.addAssign(e)}):uy.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(gm({P:l,p0:n,p1:a,p2:o,p3:u})).pow(1.5);this.scatteringLight(d,i)}finish(e){e.context.outgoingLight.assign(dy)}}class hy extends fg{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=L,this.depthTest=!1,this.depthWrite=!1,this.setValues(e)}setupLightingModel(){return new cy}}class py{constructor(e,t,r){this.renderer=e,this.nodes=t,this.info=r,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,this.renderer._inspector.begin(),null!==this._animationLoop&&this._animationLoop(t,r),this.renderer._inspector.finish()};e()}stop(){null!==this._context&&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 gy{constructor(){this.weakMaps={}}_getWeakMap(e){const t=e.length;let r=this.weakMaps[t];return void 0===r&&(r=new WeakMap,this.weakMaps[t]=r),r}get(e){let t=this._getWeakMap(e);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)}getIndirectOffset(){return this._geometries.getIndirectOffset(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.id),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||Array.isArray(e.morphTargetInfluences))&&(s+=e.uuid+","),s+=this.context.id+",",s+=e.receiveShadow+",",Os(s)}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=ks(e,this.camera.cameras.length)),this.object.receiveShadow&&(e=ks(e,1)),e=ks(e,this.renderer.contextNode.id,this.renderer.contextNode.version),e}getCacheKey(){return this.getMaterialCacheKey()+this.getDynamicCacheKey()}dispose(){this.material.removeEventListener("dispose",this.onMaterialDispose),this.geometry.removeEventListener("dispose",this.onGeometryDispose),this.onDispose()}}const yy=[];class by{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);yy[0]=e,yy[1]=t,yy[2]=n,yy[3]=i;let l=u.get(yy);return void 0===l?(l=this.createRenderObject(this.nodes,this.geometries,this.renderer,e,t,r,s,i,n,a,o),u.set(yy,l)):(l.camera=s,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)),yy[0]=null,yy[1]=null,yy[2]=null,yy[3]=null,l}getChainMap(e="default"){return this.chainMaps[e]||(this.chainMaps[e]=new gy)}dispose(){this.chainMaps={}}createRenderObject(e,t,r,s,i,n,a,o,u,l,d){const c=this.getChainMap(d),h=new fy(e,t,r,s,i,n,a,o,u,l);return h.onDispose=()=>{this.pipelines.delete(h),this.bindings.deleteForRender(h),this.nodes.delete(h),c.delete(h.getChainArray())},h}}class xy{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 Ty=1,_y=2,vy=3,Ny=4,Sy=16;class Ry extends xy{constructor(e,t){super(),this.backend=e,this.info=t}delete(e){const t=super.delete(e);return null!==t&&(this.backend.destroyAttribute(e),this.info.destroyAttribute(e)),t}update(e,t){const r=this.get(e);if(void 0===r.version)t===Ty?(this.backend.createAttribute(e),this.info.createAttribute(e)):t===_y?(this.backend.createIndexAttribute(e),this.info.createIndexAttribute(e)):t===vy?(this.backend.createStorageAttribute(e),this.info.createStorageAttribute(e)):t===Ny&&(this.backend.createIndirectStorageAttribute(e),this.info.createIndirectStorageAttribute(e)),r.version=this._getBufferAttribute(e).version;else{const t=this._getBufferAttribute(e);(r.version=65535?Ie:Oe)(t,1);return i.version=Ay(e),i.__id=Ey(e),i}class Cy extends xy{constructor(e,t){super(),this.attributes=e,this.info=t,this.wireframes=new WeakMap,this.attributeCall=new WeakMap,this._geometryDisposeListeners=new Map}has(e){const t=e.geometry;return super.has(t)&&!0===this.get(t).initialized}updateForRender(e){!1===this.has(e)&&this.initGeometry(e),this.updateAttributes(e)}initGeometry(e){const t=e.geometry;this.get(t).initialized=!0,this.info.memory.geometries++;const r=()=>{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),this._geometryDisposeListeners.delete(t)};t.addEventListener("dispose",r),this._geometryDisposeListeners.set(t,r)}updateAttributes(e){const t=e.getAttributes();for(const e of t)e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute?this.updateAttribute(e,vy):this.updateAttribute(e,Ty);const r=this.getIndex(e);null!==r&&this.updateAttribute(r,_y);const s=e.geometry.indirect;null!==s&&this.updateAttribute(s,Ny)}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}getIndirectOffset(e){return e.geometry.indirectOffset}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=wy(t),e.set(t,r)):r.version===Ay(t)&&r.__id===Ey(t)||(this.attributes.delete(r),r=wy(t),e.set(t,r)),s=r}return s}dispose(){for(const[e,t]of this._geometryDisposeListeners.entries())e.removeEventListener("dispose",t);this._geometryDisposeListeners.clear()}}class My{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,attributes:0,indexAttributes:0,storageAttributes:0,indirectStorageAttributes:0,programs:0,renderTargets:0,total:0,texturesSize:0,attributesSize:0,indexAttributesSize:0,storageAttributesSize:0,indirectStorageAttributesSize:0},this.memoryMap=new Map}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):o("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;for(const e in this.memory)this.memory[e]=0;this.memoryMap.clear()}createTexture(e){const t=this._getTextureMemorySize(e);this.memoryMap.set(e,t),this.memory.textures++,this.memory.total+=t,this.memory.texturesSize+=t}destroyTexture(e){const t=this.memoryMap.get(e)||0;this.memoryMap.delete(e),this.memory.textures--,this.memory.total-=t,this.memory.texturesSize-=t}_createAttribute(e,t){const r=this._getAttributeMemorySize(e);this.memoryMap.set(e,{size:r,type:t}),this.memory[t]++,this.memory.total+=r,this.memory[t+"Size"]+=r}createAttribute(e){this._createAttribute(e,"attributes")}createIndexAttribute(e){this._createAttribute(e,"indexAttributes")}createStorageAttribute(e){this._createAttribute(e,"storageAttributes")}createIndirectStorageAttribute(e){this._createAttribute(e,"indirectStorageAttributes")}destroyAttribute(e){const t=this.memoryMap.get(e);t&&(this.memoryMap.delete(e),this.memory[t.type]--,this.memory.total-=t.size,this.memory[t.type+"Size"]-=t.size)}_getTextureMemorySize(e){if(e.isCompressedTexture)return 1;let t=1;e.type===Ve||e.type===ke?t=1:e.type===Ge||e.type===ze||e.type===_e?t=2:e.type!==R&&e.type!==S&&e.type!==Q||(t=4);let r=4;e.format===$e||e.format===We||e.format===He||e.format===qe||e.format===je?r=1:e.format===Xe&&(r=3);let s=t*r;e.type===Ke||e.type===Qe?s=2:e.type!==Ye&&e.type!==Ze&&e.type!==Je||(s=4);const i=e.width||1,n=e.height||1,a=e.isCubeTexture?6:e.depth||1;let o=i*n*a*s;const u=e.mipmaps;if(u&&u.length>0){let e=0;for(let t=0;t>t))*(r.height||Math.max(1,n>>t))*a*s}}o+=e}else e.generateMipmaps&&(o*=1.333);return Math.round(o)}_getAttributeMemorySize(e){return e.isInterleavedBufferAttribute&&(e=e.data),e.array?e.array.byteLength:e.count&&e.itemSize?e.count*e.itemSize*4:0}}class By{constructor(e){this.cacheKey=e,this.usedTimes=0}}class Fy extends By{constructor(e,t,r){super(e),this.vertexProgram=t,this.fragmentProgram=r}}class Ly extends By{constructor(e,t){super(e),this.computeProgram=t,this.isComputePipeline=!0}}let Py=0;class Dy{constructor(e,t,r,s=null,i=null){this.id=Py++,this.code=e,this.stage=t,this.name=r,this.transforms=s,this.attributes=i,this.usedTimes=0}}class Uy extends xy{constructor(e,t,r){super(),this.backend=e,this.nodes=t,this.info=r,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 Dy(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 Dy(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 Dy(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}isReady(e){const t=this.get(e).pipeline;if(void 0===t)return!1;const r=this.backend.get(t);return void 0!==r.pipeline&&null!==r.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 Ly(r,t),this.caches.set(r,i),this.backend.createComputePipeline(i,s),this.info.memory.programs++),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 Fy(s,t,r),this.caches.set(s,n),e.pipeline=n,this.backend.createRenderPipeline(e,i),this.info.memory.programs++),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),this.info.memory.programs--}_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 Iy extends xy{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))}deleteForCompute(e){const t=this.nodes.getForCompute(e).bindings;for(const e of t)this.backend.deleteBindGroupData(e),this.delete(e)}deleteForRender(e){const t=e.getBindings();for(const e of t)this.backend.deleteBindGroupData(e),this.delete(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.isSampler)this.textures.updateSampler(t.texture);else if(t.isStorageBuffer){const e=t.attribute,r=e.isIndirectStorageBufferAttribute?Ny:vy;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(!1!==this.nodes.updateGroup(t)){if(t.isStorageBuffer){const e=t.attribute,i=e.isIndirectStorageBufferAttribute?Ny:vy,n=r.get(t);this.attributes.update(e,i),n.attribute!==e&&(n.attribute=e,s=!0)}if(t.isUniformBuffer){t.update()&&r.updateBinding(t)}else if(t.isSampledTexture){const o=t.update(),u=t.texture,l=this.textures.get(u);o&&(this.textures.updateTexture(u),t.generation!==l.generation&&(t.generation=l.generation,s=!0),l.bindGroups.add(e));if(void 0!==r.get(u).externalTexture||l.isDefaultTexture?i=!1:(n=10*n+u.id,a+=u.version),!0===u.isStorageTexture&&!0===u.mipmapsAutoUpdate){const e=this.get(u);!0===t.store?e.needsMipmap=!0:this.textures.needsMipmaps(u)&&!0===e.needsMipmap&&(this.backend.generateMipmaps(u),e.needsMipmap=!1)}}else if(t.isSampler){if(t.update()){const e=this.textures.updateSampler(t.texture);t.samplerKey!==e&&(t.samplerKey=e,s=!0)}}t.isBuffer&&t.updateRanges.length>0&&t.clearUpdateRanges()}}!0===s&&this.backend.updateBindings(e,t,i?n:0,a)}}function Oy(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 Vy(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 ky(e){return(e.transmission>0||e.transmissionNode&&e.transmissionNode.isNode)&&e.side===P&&!1===e.forceSinglePass}class Gy{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||r.transmissionNode&&r.transmissionNode.isNode||r.backdropNode&&r.backdropNode.isNode?(ky(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||r.transmissionNode&&r.transmissionNode.isNode||r.backdropNode&&r.backdropNode.isNode?(ky(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||Oy),this.transparentDoublePass.length>1&&this.transparentDoublePass.sort(t||Vy),this.transparent.length>1&&this.transparent.sort(t||Vy)}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 J,l.format=e.stencilBuffer?je:qe,l.type=e.stencilBuffer?Ye:S,l.image.width=o,l.image.height=u,l.image.depth=a.depth,l.renderTarget=e,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{this._destroyRenderTarget(e)},e.addEventListener("dispose",r.onDispose))}updateTexture(e,t={}){const r=this.get(e);if(!0===r.initialized&&r.version===e.version)return;const s=e.isRenderTargetTexture||e.isDepthTexture||e.isFramebufferTexture,i=this.backend;if(s&&!0===r.initialized&&i.destroyTexture(e),e.isFramebufferTexture){const t=this.renderer.getRenderTarget();e.type=t?t.texture.type:ke}const{width:n,height:a,depth:o}=this.getSize(e);if(t.width=n,t.height=a,t.depth=o,t.needsMipmaps=this.needsMipmaps(e),t.levels=t.needsMipmaps?this.getMipLevels(e,n,a):1,e.isCubeTexture&&e.mipmaps.length>0&&t.levels++,s||!0===e.isStorageTexture||!0===e.isExternalTexture)i.createTexture(e,t),r.generation=e.version;else if(e.version>0){const s=e.image;if(void 0===s)d("Renderer: Texture marked for update but image is undefined.");else if(!1===s.complete)d("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);const n=!0===e.isStorageTexture&&!1===e.mipmapsAutoUpdate;t.needsMipmaps&&0===e.mipmaps.length&&!n&&i.generateMipmaps(e),e.onUpdate&&e.onUpdate(e)}}else i.createDefaultTexture(e),r.isDefaultTexture=!0,r.generation=e.version;!0!==r.initialized&&(r.initialized=!0,r.generation=e.version,r.bindGroups=new Set,this.info.createTexture(e),e.isVideoTexture&&!0===p.enabled&&p.getTransfer(e.colorSpace)!==g&&d("WebGPURenderer: Video textures must use a color space with a sRGB transfer function, e.g. SRGBColorSpace."),r.onDispose=()=>{this._destroyTexture(e)},e.addEventListener("dispose",r.onDispose)),r.version=e.version}updateSampler(e){return this.backend.updateSampler(e)}getSize(e,t=Xy){let r=e.images?e.images[0]:e.image;return r?(void 0!==r.image&&(r=r.image),"undefined"!=typeof HTMLVideoElement&&r instanceof HTMLVideoElement?(t.width=r.videoWidth||1,t.height=r.videoHeight||1,t.depth=1):"undefined"!=typeof VideoFrame&&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.mipmaps.length>0?e.mipmaps.length:!0===e.isCompressedTexture?1:Math.floor(Math.log2(Math.max(t,r)))+1,s}needsMipmaps(e){return!0===e.generateMipmaps||e.mipmaps.length>0}_destroyRenderTarget(e){if(!0===this.has(e)){const t=this.get(e),r=t.textures,s=t.depthTexture;e.removeEventListener("dispose",t.onDispose);for(let e=0;e=2)for(let r=0;r{if(this._currentNode=t,!t.isVarNode||!t.isIntent(e)||!0===t.isAssign(e))if("setup"===s)t.build(e);else if("analyze"===s)t.build(e,this);else if("generate"===s){const r=e.getDataFromNode(t,"any").stages,s=r&&r[e.shaderStage];if(t.isVarNode&&s&&1===s.length&&s[0]&&s[0].isStackNode)return;t.build(e,"void")}},n=[...this.nodes];for(const e of n)i(e);this._currentNode=null;const a=this.nodes.filter(e=>-1===n.indexOf(e));for(const e of a)i(e);let o;return o=this.hasOutput(e)?this.outputNode.build(e,...t):super.build(e,...t),cn(r),e.removeActiveStack(this),o}}const Jy=nn(Zy).setParameterLength(0,1);class eb extends di{static get type(){return"StructTypeNode"}constructor(e,t=null){var r;super("struct"),this.membersLayout=(r=e,Object.entries(r).map(([e,t])=>"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=1,r=0;for(const s of this.membersLayout){const i=s.type,n=qs(i),a=js(i)/e;t=Math.max(t,a);const o=r%t%a;0!==o&&(r+=a-o),r+=n}return Math.ceil(r/t)*t}getMemberType(e,t){const r=this.membersLayout.find(e=>e.name===t);return r?r.type:"void"}generateNodeType(e){return e.getStructTypeFromNode(this,this.membersLayout,this.name).name}setup(e){e.getStructTypeFromNode(this,this.membersLayout,this.name),e.addInclude(this)}generate(e){return this.getNodeType(e)}}class tb extends di{static get type(){return"StructNode"}constructor(e,t){super("vec3"),this.structTypeNode=e,this.values=t,this.isStructNode=!0}generateNodeType(e){return this.structTypeNode.getNodeType(e)}getMemberType(e,t){return this.structTypeNode.getMemberType(e,t)}_getChildren(){const e=super._getChildren(),t=e.find(e=>e.childNode===this.structTypeNode);return e.splice(e.indexOf(t),1),e.push(t),e}generate(e){const t=e.getVarFromNode(this),r=t.type,s=e.getPropertyName(t);return e.addLineFlowCode(`${s} = ${e.generateStruct(r,this.structTypeNode.membersLayout,this.values)}`,this),t.name}}class rb extends di{static get type(){return"OutputStructNode"}constructor(...e){super(),this.members=e,this.isOutputStructNode=!0}generateNodeType(){return"OutputType"}generate(e){const t=e.getDataFromNode(this);if(void 0===t.membersLayout){const r=this.members,s=[];for(let t=0;tnew db(e,"uint","float"),pb={};class gb extends io{static get type(){return"BitcountNode"}constructor(e,t){super(e,t),this.isBitcountNode=!0}_resolveElementType(e,t,r){"int"===r?t.assign(cb(e,"uint")):t.assign(e)}_returnDataNode(e){switch(e){case"uint":return bn;case"int":return yn;case"uvec2":return vn;case"uvec3":return An;case"uvec4":return Mn;case"ivec2":return _n;case"ivec3":return Rn;case"ivec4":return Cn}}_createTrailingZerosBaseLayout(e,t){const r=this._returnDataNode(t);return dn(([e])=>{const s=bn(0);this._resolveElementType(e,s,t);const i=fn(s.bitAnd(Do(s))),n=hb(i).shiftRight(23).sub(127);return r(n)}).setLayout({name:e,type:t,inputs:[{name:"value",type:t}]})}_createLeadingZerosBaseLayout(e,t){const r=this._returnDataNode(t);return dn(([e])=>{pn(e.equal(bn(0)),()=>bn(32));const s=bn(0),i=bn(0);return this._resolveElementType(e,s,t),pn(s.shiftRight(16).equal(0),()=>{i.addAssign(16),s.shiftLeftAssign(16)}),pn(s.shiftRight(24).equal(0),()=>{i.addAssign(8),s.shiftLeftAssign(8)}),pn(s.shiftRight(28).equal(0),()=>{i.addAssign(4),s.shiftLeftAssign(4)}),pn(s.shiftRight(30).equal(0),()=>{i.addAssign(2),s.shiftLeftAssign(2)}),pn(s.shiftRight(31).equal(0),()=>{i.addAssign(1)}),r(i)}).setLayout({name:e,type:t,inputs:[{name:"value",type:t}]})}_createOneBitsBaseLayout(e,t){const r=this._returnDataNode(t);return dn(([e])=>{const s=bn(0);this._resolveElementType(e,s,t),s.assign(s.sub(s.shiftRight(bn(1)).bitAnd(bn(1431655765)))),s.assign(s.bitAnd(bn(858993459)).add(s.shiftRight(bn(2)).bitAnd(bn(858993459))));const i=s.add(s.shiftRight(bn(4))).bitAnd(bn(252645135)).mul(bn(16843009)).shiftRight(bn(24));return r(i)}).setLayout({name:e,type:t,inputs:[{name:"value",type:t}]})}_createMainLayout(e,t,r,s){const i=this._returnDataNode(t);return dn(([e])=>{if(1===r)return i(s(e));{const t=i(0),n=["x","y","z","w"];for(let i=0;id(r))()}}gb.COUNT_TRAILING_ZEROS="countTrailingZeros",gb.COUNT_LEADING_ZEROS="countLeadingZeros",gb.COUNT_ONE_BITS="countOneBits";const mb=on(gb,gb.COUNT_TRAILING_ZEROS).setParameterLength(1),fb=on(gb,gb.COUNT_LEADING_ZEROS).setParameterLength(1),yb=on(gb,gb.COUNT_ONE_BITS).setParameterLength(1),bb=dn(([e])=>{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)}),xb=(e,t)=>eu(Pa(4,e.mul(La(1,e))),t);class Tb extends pi{static get type(){return"PackFloatNode"}constructor(e,t){super(),this.vectorNode=t,this.encoding=e,this.isPackFloatNode=!0}generateNodeType(){return"uint"}generate(e){const t=this.vectorNode.getNodeType(e);return`${e.getFloatPackingMethod(this.encoding)}(${this.vectorNode.build(e,t)})`}}const _b=on(Tb,"snorm").setParameterLength(1),vb=on(Tb,"unorm").setParameterLength(1),Nb=on(Tb,"float16").setParameterLength(1);class Sb extends pi{static get type(){return"UnpackFloatNode"}constructor(e,t){super(),this.uintNode=t,this.encoding=e,this.isUnpackFloatNode=!0}generateNodeType(){return"vec2"}generate(e){const t=this.uintNode.getNodeType(e);return`${e.getFloatUnpackingMethod(this.encoding)}(${this.uintNode.build(e,t)})`}}const Rb=on(Sb,"snorm").setParameterLength(1),Ab=on(Sb,"unorm").setParameterLength(1),Eb=on(Sb,"float16").setParameterLength(1),wb=dn(([e])=>e.fract().sub(.5).abs()).setLayout({name:"tri",type:"float",inputs:[{name:"x",type:"float"}]}),Cb=dn(([e])=>Sn(wb(e.z.add(wb(e.y.mul(1)))),wb(e.z.add(wb(e.x.mul(1)))),wb(e.y.add(wb(e.x.mul(1)))))).setLayout({name:"tri3",type:"vec3",inputs:[{name:"p",type:"vec3"}]}),Mb=dn(([e,t,r])=>{const s=Sn(e).toVar(),i=fn(1.4).toVar(),n=fn(0).toVar(),a=Sn(s).toVar();return Rp({start:fn(0),end:fn(3),type:"float",condition:"<="},()=>{const e=Sn(Cb(a.mul(2))).toVar();s.addAssign(e.add(r.mul(fn(.1).mul(t)))),a.mulAssign(1.8),i.mulAssign(1.5),s.mulAssign(1.2);const o=fn(wb(s.z.add(wb(s.x.add(wb(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 Bb extends di{static get type(){return"FunctionOverloadingNode"}constructor(e=[],...t){super(),this.functionNodes=e,this.parametersNodes=t,this._candidateFn=null,this.global=!0}generateNodeType(e){return this.getCandidateFn(e).shaderNode.layout.type}getCandidateFn(e){const t=this.parametersNodes;let r=this._candidateFn;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._candidateFn=r=s}return r}setup(e){return this.getCandidateFn(e)(...this.parametersNodes)}}const Fb=nn(Bb),Lb=e=>(...t)=>Fb(e,...t),Pb=Na(0).setGroup(Ta).onRenderUpdate(e=>e.time),Db=Na(0).setGroup(Ta).onRenderUpdate(e=>e.deltaTime),Ub=Na(0,"uint").setGroup(Ta).onRenderUpdate(e=>e.frameId);const Ib=dn(([e,t,r=Tn(.5)])=>Zf(e.sub(r),t).add(r)),Ob=dn(([e,t,r=Tn(.5)])=>{const s=e.sub(r),i=s.dot(s),n=i.mul(i).mul(t);return e.add(s.mul(n))}),Vb=dn(({position:e=null,horizontal:t=!0,vertical:r=!1})=>{let s;null!==e?(s=Ud.toVar(),s[3][0]=e.x,s[3][1]=e.y,s[3][2]=e.z):s=Ud;const i=_d.mul(s);return Yi(t)&&(i[0][0]=Ud[0].length(),i[0][1]=0,i[0][2]=0),Yi(r)&&(i[1][0]=0,i[1][1]=Ud[1].length(),i[1][2]=0),i[2][0]=0,i[2][1]=0,i[2][2]=1,xd.mul(i).mul(Kd)}),kb=dn(([e=null])=>{const t=tg();return tg(Hp(e)).sub(t).lessThan(0).select(Xl,e)}),Gb=dn(([e,t=Al(),r=fn(0)])=>{const s=e.x,i=e.y,n=r.mod(s.mul(i)).floor(),a=n.mod(s),o=i.sub(n.add(1).div(s).ceil()),u=e.reciprocal(),l=Tn(a,o);return t.add(l).mul(u)}),zb=dn(([e,t=null,r=null,s=fn(1),i=Kd,n=ac])=>{let a=n.abs().normalize();a=a.div(a.dot(Sn(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=Dl(d,o).mul(a.x),g=Dl(c,u).mul(a.y),m=Dl(h,l).mul(a.z);return Fa(p,g,m)}),$b=new ot,Wb=new r,Hb=new r,qb=new r,jb=new a,Xb=new r(0,0,-1),Kb=new s,Qb=new r,Yb=new r,Zb=new s,Jb=new t,ex=new ae,tx=Xl.flipX();ex.depthTexture=new J(1,1);let rx=!1;class sx extends Ll{static get type(){return"ReflectorNode"}constructor(e={}){super(e.defaultTexture||ex.texture,tx),this._reflectorBaseNode=e.reflector||new ix(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=new sx({defaultTexture:ex.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.offsetNode=this.offsetNode,e._reflectorBaseNode=this._reflectorBaseNode,e}dispose(){super.dispose(),this._reflectorBaseNode.dispose()}}class ix extends di{static get type(){return"ReflectorBaseNode"}constructor(e,t={}){super();const{target:r=new nt,resolutionScale:s=1,generateMipmaps:i=!1,bounces:n=!0,depth:a=!1,samples:o=0}=t;this.textureNode=e,this.target=r,this.resolutionScale=s,void 0!==t.resolution&&(v('ReflectorNode: The "resolution" parameter has been renamed to "resolutionScale".'),this.resolutionScale=t.resolution),this.generateMipmaps=i,this.bounces=n,this.depth=a,this.samples=o,this.updateBeforeType=n?ti.RENDER:ti.FRAME,this.virtualCameras=new WeakMap,this.renderTargets=new Map,this.forceUpdate=!1,this.hasOutput=!1}_updateResolution(e,t){const r=this.resolutionScale;t.getDrawingBufferSize(Jb),e.setSize(Math.round(Jb.width*r),Math.round(Jb.height*r))}setup(e){return this._updateResolution(ex,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 ae(0,0,{type:_e,samples:this.samples}),!0===this.generateMipmaps&&(t.texture.minFilter=at,t.texture.generateMipmaps=!0),!0===this.depth&&(t.depthTexture=new J),this.renderTargets.set(e,t)),t}updateBefore(e){if(!1===this.bounces&&rx)return!1;rx=!0;const{scene:t,camera:r,renderer:s,material:i}=e,{target:n}=this,a=this.getVirtualCamera(r),o=this.getRenderTarget(a);s.getDrawingBufferSize(Jb),this._updateResolution(o,s),Hb.setFromMatrixPosition(n.matrixWorld),qb.setFromMatrixPosition(r.matrixWorld),jb.extractRotation(n.matrixWorld),Wb.set(0,0,1),Wb.applyMatrix4(jb),Qb.subVectors(Hb,qb);let u=!1;if(!0===Qb.dot(Wb)>0&&!1===this.forceUpdate){if(!1===this.hasOutput)return void(rx=!1);u=!0}Qb.reflect(Wb).negate(),Qb.add(Hb),jb.extractRotation(r.matrixWorld),Xb.set(0,0,-1),Xb.applyMatrix4(jb),Xb.add(qb),Yb.subVectors(Hb,Xb),Yb.reflect(Wb).negate(),Yb.add(Hb),a.coordinateSystem=r.coordinateSystem,a.position.copy(Qb),a.up.set(0,1,0),a.up.applyMatrix4(jb),a.up.reflect(Wb),a.lookAt(Yb),a.near=r.near,a.far=r.far,a.updateMatrixWorld(),a.projectionMatrix.copy(r.projectionMatrix),$b.setFromNormalAndCoplanarPoint(Wb,Hb),$b.applyMatrix4(a.matrixWorldInverse),Kb.set($b.normal.x,$b.normal.y,$b.normal.z,$b.constant);const l=a.projectionMatrix;Zb.x=(Math.sign(Kb.x)+l.elements[8])/l.elements[0],Zb.y=(Math.sign(Kb.y)+l.elements[9])/l.elements[5],Zb.z=-1,Zb.w=(1+l.elements[10])/l.elements[14],Kb.multiplyScalar(1/Kb.dot(Zb));l.elements[2]=Kb.x,l.elements[6]=Kb.y,l.elements[10]=s.coordinateSystem===h?Kb.z-0:Kb.z+1-0,l.elements[14]=Kb.w,this.textureNode.value=o.texture,!0===this.depth&&(this.textureNode.getDepthNode().value=o.depthTexture),i.visible=!1;const d=s.getRenderTarget(),c=s.getMRT(),p=s.autoClear;s.setMRT(null),s.setRenderTarget(o),s.autoClear=!0;const g=t.name;t.name=(t.name||"Scene")+" [ Reflector ]",u?(s.clear(),this.hasOutput=!1):(s.render(t,a),this.hasOutput=!0),t.name=g,s.setMRT(c),s.setRenderTarget(d),s.autoClear=p,i.visible=!0,rx=!1,this.forceUpdate=!1}get resolution(){return v('ReflectorNode: The "resolution" property has been renamed to "resolutionScale".'),this.resolutionScale}set resolution(e){v('ReflectorNode: The "resolution" property has been renamed to "resolutionScale".'),this.resolutionScale=e}}const nx=new Se(-1,1,1,-1,0,1);class ax extends Ne{constructor(e=!1){super();const t=!1===e?[0,-1,0,1,2,1]:[0,2,0,0,2,0];this.setAttribute("position",new ut([-1,3,0,-1,-1,0,3,-1,0],3)),this.setAttribute("uv",new ut(t,2))}}const ox=new ax;class ux extends ue{constructor(e=null){super(ox,e),this.camera=nx,this.isQuadMesh=!0}async renderAsync(e){v('QuadMesh: "renderAsync()" has been deprecated. Use "render()" and "await renderer.init();" when creating the renderer.'),await e.init(),e.render(this,nx)}render(e){e.render(this,nx)}}const lx=new t;class dx extends Ll{static get type(){return"RTTNode"}constructor(e,t=null,r=null,s={type:_e}){const i=new ae(t,r,s);super(i.texture,Al()),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 ux(new fg),this.updateBeforeType=ti.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(lx),s=Math.floor(r.width*t),i=Math.floor(r.height*t);s===this.renderTarget.width&&i===this.renderTarget.height||(this.renderTarget.setSize(s,i),this.textureNeedsUpdate=!0)}let t="RTT";this.node.name&&(t=this.node.name+" [ "+t+" ]"),this._quadMesh.material.fragmentNode=this._rttNode,this._quadMesh.name=t;const r=e.getRenderTarget();e.setRenderTarget(this.renderTarget),this._quadMesh.render(e),e.setRenderTarget(r)}clone(){const e=new Ll(this.value,this.uvNode,this.levelNode);return e.sampler=this.sampler,e.referenceNode=this,e}}const cx=(e,...t)=>new dx(en(e),...t),hx=dn(([e,t,r],s)=>{let i;s.renderer.coordinateSystem===h?(e=Tn(e.x,e.y.oneMinus()).mul(2).sub(1),i=wn(Sn(e,t),1)):i=wn(Sn(e.x,e.y.oneMinus(),t).mul(2).sub(1),1);const n=wn(r.mul(i));return n.xyz.div(n.w)}),px=dn(([e,t])=>{const r=t.mul(wn(e,1)),s=r.xy.div(r.w).mul(.5).add(.5).toVar();return Tn(s.x,s.y.oneMinus())}),gx=dn(([e,t,r])=>{const s=wl(Ul(t)),i=_n(e.mul(s)).toVar(),n=Ul(t,i).toVar(),a=Ul(t,i.sub(_n(2,0))).toVar(),o=Ul(t,i.sub(_n(1,0))).toVar(),u=Ul(t,i.add(_n(1,0))).toVar(),l=Ul(t,i.add(_n(2,0))).toVar(),d=Ul(t,i.add(_n(0,2))).toVar(),c=Ul(t,i.add(_n(0,1))).toVar(),h=Ul(t,i.sub(_n(0,1))).toVar(),p=Ul(t,i.sub(_n(0,2))).toVar(),g=Fo(La(fn(2).mul(o).sub(a),n)).toVar(),m=Fo(La(fn(2).mul(u).sub(l),n)).toVar(),f=Fo(La(fn(2).mul(c).sub(d),n)).toVar(),y=Fo(La(fn(2).mul(h).sub(p),n)).toVar(),b=hx(e,n,r).toVar(),x=g.lessThan(m).select(b.sub(hx(e.sub(Tn(fn(1).div(s.x),0)),o,r)),b.negate().add(hx(e.add(Tn(fn(1).div(s.x),0)),u,r))),T=f.lessThan(y).select(b.sub(hx(e.add(Tn(0,fn(1).div(s.y))),c,r)),b.negate().add(hx(e.sub(Tn(0,fn(1).div(s.y))),h,r)));return So(Jo(x,T))}),mx=dn(([e])=>Ro(fn(52.9829189).mul(Ro(Zo(e,Tn(.06711056,.00583715)))))).setLayout({name:"interleavedGradientNoise",type:"float",inputs:[{name:"position",type:"vec2"}]}),fx=dn(([e,t,r])=>{const s=fn(2.399963229728653),i=To(fn(e).add(.5).div(fn(t))),n=fn(e).mul(s).add(r);return Tn(Eo(n),Ao(n)).mul(i)}).setLayout({name:"vogelDiskSample",type:"vec2",inputs:[{name:"sampleIndex",type:"int"},{name:"samplesCount",type:"int"},{name:"phi",type:"float"}]});class yx extends di{static get type(){return"SampleNode"}constructor(e,t=null){super(),this.callback=e,this.uvNode=t,this.isSampleNode=!0}setup(){return this.sample(Al())}sample(e){return this.callback(e)}}class bx extends di{static get type(){return"EventNode"}constructor(e,t){super("void"),this.eventType=e,this.callback=t,e===bx.OBJECT?this.updateType=ti.OBJECT:e===bx.MATERIAL?this.updateType=ti.RENDER:e===bx.BEFORE_OBJECT?this.updateBeforeType=ti.OBJECT:e===bx.BEFORE_MATERIAL&&(this.updateBeforeType=ti.RENDER)}update(e){this.callback(e)}updateBefore(e){this.callback(e)}}bx.OBJECT="object",bx.MATERIAL="material",bx.BEFORE_OBJECT="beforeObject",bx.BEFORE_MATERIAL="beforeMaterial";const xx=(e,t)=>new bx(e,t).toStack();class Tx extends j{constructor(e,t,r=Float32Array){super(ArrayBuffer.isView(e)?e:new r(e*t),t),this.isStorageInstancedBufferAttribute=!0}}class _x extends Ce{constructor(e,t,r=Float32Array){super(ArrayBuffer.isView(e)?e:new r(e*t),t),this.isStorageBufferAttribute=!0}}class vx extends di{static get type(){return"PointUVNode"}constructor(){super("vec2"),this.isPointUVNode=!0}generate(){return"vec2( gl_PointCoord.x, 1.0 - gl_PointCoord.y )"}}const Nx=an(vx),Sx=new D,Rx=new a,Ax=Na(0).setGroup(Ta).onRenderUpdate(({scene:e})=>e.backgroundBlurriness),Ex=Na(1).setGroup(Ta).onRenderUpdate(({scene:e})=>e.backgroundIntensity),wx=Na(new a).setGroup(Ta).onRenderUpdate(({scene:e})=>{const t=e.background;return null!==t&&t.isTexture&&t.mapping!==lt?(Sx.copy(e.backgroundRotation),Sx.x*=-1,Sx.y*=-1,Sx.z*=-1,Rx.makeRotationFromEuler(Sx)):Rx.identity(),Rx});class Cx extends Ll{static get type(){return"StorageTextureNode"}constructor(e,t,r=null){super(e,t),this.storeNode=r,this.mipLevel=0,this.isStorageTextureNode=!0,this.access=si.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}setMipLevel(e){return this.mipLevel=e,this}generate(e,t){return null!==this.storeNode?(this.generateStore(e),""):super.generate(e,t)}generateSnippet(e,t,r,s,i,n,a,o,u){const l=this.value;return e.generateStorageTextureLoad(l,t,r,s,n,u)}toReadWrite(){return this.setAccess(si.READ_WRITE)}toReadOnly(){return this.setAccess(si.READ_ONLY)}toWriteOnly(){return this.setAccess(si.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(this.value,n,a,u,o);e.addLineFlowCode(l,this)}clone(){const e=super.clone();return e.storeNode=this.storeNode,e.mipLevel=this.mipLevel,e.access=this.access,e}}const Mx=nn(Cx).setParameterLength(1,3),Bx=dn(({texture:e,uv:t})=>{const r=1e-4,s=Sn().toVar();return pn(t.x.lessThan(r),()=>{s.assign(Sn(1,0,0))}).ElseIf(t.y.lessThan(r),()=>{s.assign(Sn(0,1,0))}).ElseIf(t.z.lessThan(r),()=>{s.assign(Sn(0,0,1))}).ElseIf(t.x.greaterThan(.9999),()=>{s.assign(Sn(-1,0,0))}).ElseIf(t.y.greaterThan(.9999),()=>{s.assign(Sn(0,-1,0))}).ElseIf(t.z.greaterThan(.9999),()=>{s.assign(Sn(0,0,-1))}).Else(()=>{const r=.01,i=e.sample(t.add(Sn(-.01,0,0))).r.sub(e.sample(t.add(Sn(r,0,0))).r),n=e.sample(t.add(Sn(0,-.01,0))).r.sub(e.sample(t.add(Sn(0,r,0))).r),a=e.sample(t.add(Sn(0,0,-.01))).r.sub(e.sample(t.add(Sn(0,0,r))).r);s.assign(Sn(i,n,a))}),s.normalize()});class Fx extends Ll{static get type(){return"Texture3DNode"}constructor(e,t=null,r=null){super(e,t,r),this.isTexture3DNode=!0}getInputType(){return"texture3D"}getDefaultUV(){return Sn(.5,.5,.5)}setUpdateMatrix(){}generateUV(e,t){return t.build(e,!0===this.sampler?"vec3":"ivec3")}generateOffset(e,t){return t.build(e,"ivec3")}normal(e){return Bx({texture:this,uv:e})}}const Lx=nn(Fx).setParameterLength(1,3);class Px extends Fc{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 Dx=new WeakMap;class Ux extends pi{static get type(){return"VelocityNode"}constructor(){super("vec2"),this.projectionMatrix=null,this.updateType=ti.OBJECT,this.updateAfterType=ti.OBJECT,this.previousModelWorldMatrix=Na(new a),this.previousProjectionMatrix=Na(new a).setGroup(Ta),this.previousCameraViewMatrix=Na(new a)}setProjectionMatrix(e){this.projectionMatrix=e}update({frameId:e,camera:t,object:r}){const s=Ox(r);this.previousModelWorldMatrix.value.copy(s);const i=Ix(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}){Ox(e).copy(e.matrixWorld)}setup(){const e=null===this.projectionMatrix?xd:Na(this.projectionMatrix),t=this.previousCameraViewMatrix.mul(this.previousModelWorldMatrix),r=e.mul($d).mul(Kd),s=this.previousProjectionMatrix.mul(t).mul(Qd),i=r.xy.div(r.w),n=s.xy.div(s.w);return La(i,n)}}function Ix(e){let t=Dx.get(e);return void 0===t&&(t={},Dx.set(e,t)),t}function Ox(e,t=0){const r=Ix(e);let s=r[t];return void 0===s&&(r[t]=s=new a,r[t].copy(e.matrixWorld)),s}const Vx=an(Ux),kx=dn(([e])=>Wx(e.rgb)),Gx=dn(([e,t=fn(1)])=>t.mix(Wx(e.rgb),e.rgb)),zx=dn(([e,t=fn(1)])=>{const r=Fa(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 ou(e.rgb,s,i)}),$x=dn(([e,t=fn(1)])=>{const r=Sn(.57735,.57735,.57735),s=t.cos();return Sn(e.rgb.mul(s).add(r.cross(e.rgb).mul(t.sin()).add(r.mul(Zo(r,e.rgb).mul(s.oneMinus())))))}),Wx=(e,t=Sn(p.getLuminanceCoefficients(new r)))=>Zo(e,t),Hx=dn(([e,t=Sn(1),s=Sn(0),i=Sn(1),n=fn(1),a=Sn(p.getLuminanceCoefficients(new r,Ae))])=>{const o=e.rgb.dot(Sn(a)),u=jo(e.rgb.mul(t).add(s),0).toVar(),l=u.pow(i).toVar();return pn(u.r.greaterThan(0),()=>{u.r.assign(l.r)}),pn(u.g.greaterThan(0),()=>{u.g.assign(l.g)}),pn(u.b.greaterThan(0),()=>{u.b.assign(l.b)}),u.assign(o.add(u.sub(o).mul(n))),wn(u.rgb,e.a)}),qx=dn(([e,t])=>e.mul(t).floor().div(t));let jx=null;class Xx extends Op{static get type(){return"ViewportSharedTextureNode"}constructor(e=Xl,t=null){null===jx&&(jx=new Y),super(e,t,jx)}getTextureForReference(){return jx}updateReference(){return this}}const Kx=nn(Xx).setParameterLength(0,2),Qx=new t;class Yx extends Ll{static get type(){return"PassTextureNode"}constructor(e,t){super(t),this.passNode=e,this.isPassTextureNode=!0,this.setUpdateMatrix(!1)}setup(e){return e.getNodeProperties(this).passNode=this.passNode,super.setup(e)}clone(){return new this.constructor(this.passNode,this.value)}}class Zx extends Yx{static get type(){return"PassMultipleTextureNode"}constructor(e,t,r=!1){super(e,null),this.textureName=t,this.previousTexture=r,this.isPassMultipleTextureNode=!0}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.offsetNode=this.offsetNode,e}}class Jx extends pi{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 J;i.isRenderTargetTexture=!0,i.name="depth";const n=new ae(this._width*this._pixelRatio,this._height*this._pixelRatio,{type:_e,...s});n.texture.name="output",n.depthTexture=i,this.renderTarget=n,this.overrideMaterial=null,this.transparent=!0,this.opaque=!0,this.contextNode=null,this._contextNodeCache=null,this._textures={output:n.texture,depth:i},this._textureNodes={},this._linearDepthNodes={},this._viewZNodes={},this._previousTextures={},this._previousTextureNodes={},this._cameraNear=Na(0),this._cameraFar=Na(0),this._mrt=null,this._layers=null,this._resolutionScale=1,this._viewport=null,this._scissor=null,this.isPassNode=!0,this.updateBeforeType=ti.FRAME,this.global=!0}setResolutionScale(e){return this._resolutionScale=e,this}getResolutionScale(){return this._resolutionScale}setResolution(e){return d("PassNode: .setResolution() is deprecated. Use .setResolutionScale() instead."),this.setResolutionScale(e)}getResolution(){return d("PassNode: .getResolution() is deprecated. Use .getResolutionScale() instead."),this.getResolutionScale()}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=new Zx(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=new Zx(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=Yp(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=jp(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.getOutputBufferType(),this.scope===Jx.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),Qx.set(n.width,n.height)):(s=this.camera,i=t.getPixelRatio(),t.getSize(Qx)),this._pixelRatio=i,this.setSize(Qx.width,Qx.height);const a=t.getRenderTarget(),o=t.getMRT(),u=t.autoClear,l=t.transparent,d=t.opaque,c=s.layers.mask,h=t.contextNode,p=r.overrideMaterial;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);null!==this.overrideMaterial&&(r.overrideMaterial=this.overrideMaterial),t.setRenderTarget(this.renderTarget),t.setMRT(this._mrt),t.autoClear=!0,t.transparent=this.transparent,t.opaque=this.opaque,null!==this.contextNode&&(null!==this._contextNodeCache&&this._contextNodeCache.version===this.version||(this._contextNodeCache={version:this.version,context:vu({...t.contextNode.getFlowContextData(),...this.contextNode.getFlowContextData()})}),t.contextNode=this._contextNodeCache.context);const g=r.name;r.name=this.name?this.name:r.name,t.render(r,s),r.name=g,r.overrideMaterial=p,t.setRenderTarget(a),t.setMRT(o),t.autoClear=u,t.transparent=l,t.opaque=d,t.contextNode=h,s.layers.mask=c}setSize(e,t){this._width=e,this._height=t;const r=Math.floor(this._width*this._pixelRatio*this._resolutionScale),s=Math.floor(this._height*this._pixelRatio*this._resolutionScale);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._resolutionScale).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._resolutionScale).floor())}setPixelRatio(e){this._pixelRatio=e,this.setSize(this._width,this._height)}dispose(){this.renderTarget.dispose()}}Jx.COLOR="color",Jx.DEPTH="depth";class eT extends Jx{static get type(){return"ToonOutlinePassNode"}constructor(e,t,r,s,i){super(Jx.COLOR,e,t),this.colorNode=r,this.thicknessNode=s,this.alphaNode=i,this._materialCache=new WeakMap,this.name="Outline Pass"}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 fg;e.isMeshToonOutlineMaterial=!0,e.name="Toon_Outline",e.side=L;const t=ac.negate(),r=xd.mul($d),s=fn(1),i=r.mul(wn(Kd,1)),n=r.mul(wn(Kd.add(t),1)),a=So(i.sub(n));return e.vertexNode=i.add(a.mul(this.thicknessNode).mul(i.w).mul(s)),e.colorNode=wn(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 tT=dn(([e,t])=>e.mul(t).clamp()).setLayout({name:"linearToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),rT=dn(([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"}]}),sT=dn(([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"}]}),iT=dn(([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)}),nT=dn(([e,t])=>{const r=Ln(.59719,.35458,.04823,.076,.90834,.01566,.0284,.13383,.83777),s=Ln(1.60475,-.53108,-.07367,-.10208,1.10813,-.00605,-.00327,-.07276,1.07602);return e=e.mul(t).div(.6),e=r.mul(e),e=iT(e),(e=s.mul(e)).clamp()}).setLayout({name:"acesFilmicToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),aT=Ln(Sn(1.6605,-.1246,-.0182),Sn(-.5876,1.1329,-.1006),Sn(-.0728,-.0083,1.1187)),oT=Ln(Sn(.6274,.0691,.0164),Sn(.3293,.9195,.088),Sn(.0433,.0113,.8956)),uT=dn(([e])=>{const t=Sn(e).toVar(),r=Sn(t.mul(t)).toVar(),s=Sn(r.mul(r)).toVar();return fn(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))))}),lT=dn(([e,t])=>{const r=Sn(e).toVar(),s=Ln(Sn(.856627153315983,.137318972929847,.11189821299995),Sn(.0951212405381588,.761241990602591,.0767994186031903),Sn(.0482516061458583,.101439036467562,.811302368396859)),i=Ln(Sn(1.1271005818144368,-.1413297634984383,-.14132976349843826),Sn(-.11060664309660323,1.157823702216272,-.11060664309660294),Sn(-.016493938717834573,-.016493938717834257,1.2519364065950405)),n=fn(-12.47393),a=fn(4.026069);return r.mulAssign(t),r.assign(oT.mul(r)),r.assign(s.mul(r)),r.assign(jo(r,1e-10)),r.assign(xo(r)),r.assign(r.sub(n).div(a.sub(n))),r.assign(uu(r,0,1)),r.assign(uT(r)),r.assign(i.mul(r)),r.assign(eu(jo(Sn(0),r),Sn(2.2))),r.assign(aT.mul(r)),r.assign(uu(r,0,1)),r}).setLayout({name:"agxToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),dT=dn(([e,t])=>{const r=fn(.76),s=fn(.15);e=e.mul(t);const i=qo(e.r,qo(e.g,e.b)),n=Tu(i.lessThan(.08),i.sub(Pa(6.25,i.mul(i))),.04);e.subAssign(n);const a=jo(e.r,jo(e.g,e.b));pn(a.lessThan(r),()=>e);const o=La(1,r),u=La(1,o.mul(o).div(a.add(o.sub(r))));e.mulAssign(u.div(a));const l=La(1,Da(1,s.mul(a.sub(u)).add(1)));return ou(e,Sn(u),l)}).setLayout({name:"neutralToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]});class cT extends di{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 hT=nn(cT).setParameterLength(1,3);class pT extends cT{static get type(){return"FunctionNode"}constructor(e="",t=[],r=""){super(e,t,r)}generateNodeType(e){return this.getNodeFunction(e).type}getMemberType(e,t){const r=this.getNodeType(e);return e.getStructTypeNode(r).getMemberType(e,t)}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 gT=(e,t=[],r="")=>{for(let e=0;es.call(...e);return i.functionNode=s,i};function mT(e){let t;const r=e.context.getViewZ;return void 0!==r&&(t=r(this)),(t||Jd.z).negate()}const fT=dn(([e,t],r)=>{const s=mT(r);return cu(e,t,s)}),yT=dn(([e],t)=>{const r=mT(t);return e.mul(e,r,r).negate().exp().oneMinus()}),bT=dn(([e,t],r)=>{const s=mT(r),i=t.sub(Yd.y).max(0).toConst().mul(s).toConst();return e.mul(e,i,i).negate().exp().oneMinus()}),xT=dn(([e,t])=>wn(t.toFloat().mix(aa.rgb,e.toVec3()),aa.a));let TT=null,_T=null;class vT extends di{static get type(){return"RangeNode"}constructor(e=fn(),t=fn()){super(),this.minNode=e,this.maxNode=t}getVectorLength(e){const t=this.getConstNode(this.minNode),r=this.getConstNode(this.maxNode),s=e.getTypeLength(Xs(t.value)),i=e.getTypeLength(Xs(r.value));return s>i?s:i}generateNodeType(e){return e.object.count>1?e.getTypeFromLength(this.getVectorLength(e)):"float"}getConstNode(e){let t=null;if(e.traverse(e=>{!0===e.isConstNode&&(t=e)}),null===t)throw new Bl('THREE.TSL: No "ConstNode" found in node graph.',this.stackTrace);return t}setup(e){const t=e.object;let r=null;if(t.count>1){const i=this.getConstNode(this.minNode),n=this.getConstNode(this.maxNode),a=i.value,o=n.value,u=e.getTypeLength(Xs(a)),d=e.getTypeLength(Xs(o));TT=TT||new s,_T=_T||new s,TT.setScalar(0),_T.setScalar(0),1===u?TT.setScalar(a):a.isColor?TT.set(a.r,a.g,a.b,1):TT.set(a.x,a.y,a.z||0,a.w||0),1===d?_T.setScalar(o):o.isColor?_T.set(o.r,o.g,o.b,1):_T.set(o.x,o.y,o.z||0,o.w||0);const c=4,h=c*t.count,p=new Float32Array(h);for(let e=0;enew ST(e,t),AT=RT("numWorkgroups","uvec3"),ET=RT("workgroupId","uvec3"),wT=RT("globalId","uvec3"),CT=RT("localId","uvec3"),MT=RT("subgroupSize","uint");class BT extends di{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)}}const FT=nn(BT);class LT extends ci{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 PT extends di{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 d('TSL: "label()" has been deprecated. Use "setName()" instead.',new Us),this.setName(e)}setScope(e){return this.scope=e,this}getElementType(){return this.elementType}getInputType(){return`${this.scope}Array`}element(e){return new LT(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 DT extends di{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)}generateNodeType(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=ml(l,i).toConst()),t.constNode.build(e);e.addLineFlowCode(l,this)}}DT.ATOMIC_LOAD="atomicLoad",DT.ATOMIC_STORE="atomicStore",DT.ATOMIC_ADD="atomicAdd",DT.ATOMIC_SUB="atomicSub",DT.ATOMIC_MAX="atomicMax",DT.ATOMIC_MIN="atomicMin",DT.ATOMIC_AND="atomicAnd",DT.ATOMIC_OR="atomicOr",DT.ATOMIC_XOR="atomicXor";const UT=nn(DT),IT=(e,t,r)=>UT(e,t,r).toStack();class OT extends pi{static get type(){return"SubgroupFunctionNode"}constructor(e,t=null,r=null){super(),this.method=e,this.aNode=t,this.bNode=r}getInputType(e){const t=this.aNode?this.aNode.getNodeType(e):null,r=this.bNode?this.bNode.getNodeType(e):null;return(e.isMatrix(t)?0:e.getTypeLength(t))>(e.isMatrix(r)?0:e.getTypeLength(r))?t:r}generateNodeType(e){const t=this.method;return t===OT.SUBGROUP_ELECT?"bool":t===OT.SUBGROUP_BALLOT?"uvec4":this.getInputType(e)}generate(e,t){const r=this.method,s=this.getNodeType(e),i=this.getInputType(e),n=this.aNode,a=this.bNode,o=[];if(r===OT.SUBGROUP_BROADCAST||r===OT.SUBGROUP_SHUFFLE||r===OT.QUAD_BROADCAST){const t=a.getNodeType(e);o.push(n.build(e,s),a.build(e,"float"===t?"int":s))}else r===OT.SUBGROUP_SHUFFLE_XOR||r===OT.SUBGROUP_SHUFFLE_DOWN||r===OT.SUBGROUP_SHUFFLE_UP?o.push(n.build(e,s),a.build(e,"uint")):(null!==n&&o.push(n.build(e,i)),null!==a&&o.push(a.build(e,i)));const u=0===o.length?"()":`( ${o.join(", ")} )`;return e.format(`${e.getMethod(r,s)}${u}`,s,t)}serialize(e){super.serialize(e),e.method=this.method}deserialize(e){super.deserialize(e),this.method=e.method}}OT.SUBGROUP_ELECT="subgroupElect",OT.SUBGROUP_BALLOT="subgroupBallot",OT.SUBGROUP_ADD="subgroupAdd",OT.SUBGROUP_INCLUSIVE_ADD="subgroupInclusiveAdd",OT.SUBGROUP_EXCLUSIVE_AND="subgroupExclusiveAdd",OT.SUBGROUP_MUL="subgroupMul",OT.SUBGROUP_INCLUSIVE_MUL="subgroupInclusiveMul",OT.SUBGROUP_EXCLUSIVE_MUL="subgroupExclusiveMul",OT.SUBGROUP_AND="subgroupAnd",OT.SUBGROUP_OR="subgroupOr",OT.SUBGROUP_XOR="subgroupXor",OT.SUBGROUP_MIN="subgroupMin",OT.SUBGROUP_MAX="subgroupMax",OT.SUBGROUP_ALL="subgroupAll",OT.SUBGROUP_ANY="subgroupAny",OT.SUBGROUP_BROADCAST_FIRST="subgroupBroadcastFirst",OT.QUAD_SWAP_X="quadSwapX",OT.QUAD_SWAP_Y="quadSwapY",OT.QUAD_SWAP_DIAGONAL="quadSwapDiagonal",OT.SUBGROUP_BROADCAST="subgroupBroadcast",OT.SUBGROUP_SHUFFLE="subgroupShuffle",OT.SUBGROUP_SHUFFLE_XOR="subgroupShuffleXor",OT.SUBGROUP_SHUFFLE_UP="subgroupShuffleUp",OT.SUBGROUP_SHUFFLE_DOWN="subgroupShuffleDown",OT.QUAD_BROADCAST="quadBroadcast";const VT=on(OT,OT.SUBGROUP_ELECT).setParameterLength(0),kT=on(OT,OT.SUBGROUP_BALLOT).setParameterLength(1),GT=on(OT,OT.SUBGROUP_ADD).setParameterLength(1),zT=on(OT,OT.SUBGROUP_INCLUSIVE_ADD).setParameterLength(1),$T=on(OT,OT.SUBGROUP_EXCLUSIVE_AND).setParameterLength(1),WT=on(OT,OT.SUBGROUP_MUL).setParameterLength(1),HT=on(OT,OT.SUBGROUP_INCLUSIVE_MUL).setParameterLength(1),qT=on(OT,OT.SUBGROUP_EXCLUSIVE_MUL).setParameterLength(1),jT=on(OT,OT.SUBGROUP_AND).setParameterLength(1),XT=on(OT,OT.SUBGROUP_OR).setParameterLength(1),KT=on(OT,OT.SUBGROUP_XOR).setParameterLength(1),QT=on(OT,OT.SUBGROUP_MIN).setParameterLength(1),YT=on(OT,OT.SUBGROUP_MAX).setParameterLength(1),ZT=on(OT,OT.SUBGROUP_ALL).setParameterLength(0),JT=on(OT,OT.SUBGROUP_ANY).setParameterLength(0),e_=on(OT,OT.SUBGROUP_BROADCAST_FIRST).setParameterLength(2),t_=on(OT,OT.QUAD_SWAP_X).setParameterLength(1),r_=on(OT,OT.QUAD_SWAP_Y).setParameterLength(1),s_=on(OT,OT.QUAD_SWAP_DIAGONAL).setParameterLength(1),i_=on(OT,OT.SUBGROUP_BROADCAST).setParameterLength(2),n_=on(OT,OT.SUBGROUP_SHUFFLE).setParameterLength(2),a_=on(OT,OT.SUBGROUP_SHUFFLE_XOR).setParameterLength(2),o_=on(OT,OT.SUBGROUP_SHUFFLE_UP).setParameterLength(2),u_=on(OT,OT.SUBGROUP_SHUFFLE_DOWN).setParameterLength(2),l_=on(OT,OT.QUAD_BROADCAST).setParameterLength(1);let d_;function c_(e){d_=d_||new WeakMap;let t=d_.get(e);return void 0===t&&d_.set(e,t={}),t}function h_(e){const t=c_(e);return t.shadowMatrix||(t.shadowMatrix=Na("mat4").setGroup(Ta).onRenderUpdate(t=>(!0===e.castShadow&&!1!==t.renderer.shadowMap.enabled||(e.shadow.camera.coordinateSystem!==t.camera.coordinateSystem&&(e.shadow.camera.coordinateSystem=t.camera.coordinateSystem,e.shadow.camera.updateProjectionMatrix()),e.shadow.updateMatrices(e)),e.shadow.matrix)))}function p_(e,t=Yd){const r=h_(e).mul(t);return r.xyz.div(r.w)}function g_(e){const t=c_(e);return t.position||(t.position=Na(new r).setGroup(Ta).onRenderUpdate((t,r)=>r.value.setFromMatrixPosition(e.matrixWorld)))}function m_(e){const t=c_(e);return t.targetPosition||(t.targetPosition=Na(new r).setGroup(Ta).onRenderUpdate((t,r)=>r.value.setFromMatrixPosition(e.target.matrixWorld)))}function f_(e){const t=c_(e);return t.viewPosition||(t.viewPosition=Na(new r).setGroup(Ta).onRenderUpdate(({camera:t},s)=>{s.value=s.value||new r,s.value.setFromMatrixPosition(e.matrixWorld),s.value.applyMatrix4(t.matrixWorldInverse)}))}const y_=e=>_d.transformDirection(g_(e).sub(m_(e))),b_=(e,t)=>{for(const r of t)if(r.isAnalyticLightNode&&r.light.id===e)return r;return null},x_=new WeakMap,T_=[];class __ extends di{static get type(){return"LightsNode"}constructor(){super("vec3"),this.totalDiffuseNode=On("vec3","totalDiffuse"),this.totalSpecularNode=On("vec3","totalSpecular"),this.outgoingLightNode=On("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(en(e));else{let s=null;if(null!==r&&(s=b_(e.id,r)),null===s){const t=i.getLightNodeClass(e.constructor);if(null===t){d(`LightsNode.setupNodeLights: Light node not found for ${e.constructor.name}`);continue}!1===x_.has(e)&&x_.set(e,new t(e)),s=x_.get(e)}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=Sn(null!==l?l.mix(g,u):u)),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 v_ extends di{static get type(){return"ShadowBaseNode"}constructor(e){super(),this.light=e,this.updateBeforeType=ti.RENDER,this.isShadowBaseNode=!0}setupShadowPosition({context:e,material:t}){N_.assign(t.receivedShadowPositionNode||e.shadowPositionWorld||Yd)}}const N_=On("vec3","shadowPositionWorld");function S_(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 R_(e,t){return t=S_(e,t),e.setMRT(null),e.setRenderObjectFunction(null),e.setClearColor(0,1),e.autoClear=!0,t}function A_(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 E_(e,t={}){return t.background=e.background,t.backgroundNode=e.backgroundNode,t.overrideMaterial=e.overrideMaterial,t}function w_(e,t){return t=E_(e,t),e.background=null,e.backgroundNode=null,e.overrideMaterial=null,t}function C_(e,t){e.background=t.background,e.backgroundNode=t.backgroundNode,e.overrideMaterial=t.overrideMaterial}function M_(e,t,r){return r=w_(t,r=R_(e,r))}function B_(e,t,r){A_(e,r),C_(t,r)}var F_=Object.freeze({__proto__:null,resetRendererAndSceneState:M_,resetRendererState:R_,resetSceneState:w_,restoreRendererAndSceneState:B_,restoreRendererState:A_,restoreSceneState:C_,saveRendererAndSceneState:function(e,t,r={}){return r=E_(t,r=S_(e,r))},saveRendererState:S_,saveSceneState:E_});const L_=new WeakMap,P_=dn(({depthTexture:e,shadowCoord:t,depthLayer:r})=>{let s=Dl(e,t.xy).setName("t_basic");return e.isArrayTexture&&(s=s.depth(r)),s.compare(t.z)}),D_=dn(({depthTexture:e,shadowCoord:t,shadow:r,depthLayer:s})=>{const i=(t,r)=>{let i=Dl(e,t);return e.isArrayTexture&&(i=i.depth(s)),i.compare(r)},n=Lc("mapSize","vec2",r).setGroup(Ta),a=Lc("radius","float",r).setGroup(Ta),o=Tn(1).div(n),u=a.mul(o.x),l=mx(Ql.xy).mul(6.28318530718);return Fa(i(t.xy.add(fx(0,5,l).mul(u)),t.z),i(t.xy.add(fx(1,5,l).mul(u)),t.z),i(t.xy.add(fx(2,5,l).mul(u)),t.z),i(t.xy.add(fx(3,5,l).mul(u)),t.z),i(t.xy.add(fx(4,5,l).mul(u)),t.z)).mul(.2)}),U_=dn(({depthTexture:e,shadowCoord:t,shadow:r,depthLayer:s})=>{const i=(t,r)=>{let i=Dl(e,t);return e.isArrayTexture&&(i=i.depth(s)),i.compare(r)},n=Lc("mapSize","vec2",r).setGroup(Ta),a=Tn(1).div(n),o=a.x,u=a.y,l=t.xy,d=Ro(l.mul(n).add(.5));return l.subAssign(d.mul(a)),Fa(i(l,t.z),i(l.add(Tn(o,0)),t.z),i(l.add(Tn(0,u)),t.z),i(l.add(a),t.z),ou(i(l.add(Tn(o.negate(),0)),t.z),i(l.add(Tn(o.mul(2),0)),t.z),d.x),ou(i(l.add(Tn(o.negate(),u)),t.z),i(l.add(Tn(o.mul(2),u)),t.z),d.x),ou(i(l.add(Tn(0,u.negate())),t.z),i(l.add(Tn(0,u.mul(2))),t.z),d.y),ou(i(l.add(Tn(o,u.negate())),t.z),i(l.add(Tn(o,u.mul(2))),t.z),d.y),ou(ou(i(l.add(Tn(o.negate(),u.negate())),t.z),i(l.add(Tn(o.mul(2),u.negate())),t.z),d.x),ou(i(l.add(Tn(o.negate(),u.mul(2))),t.z),i(l.add(Tn(o.mul(2),u.mul(2))),t.z),d.x),d.y)).mul(1/9)}),I_=dn(({depthTexture:e,shadowCoord:t,depthLayer:r},s)=>{let i=Dl(e).sample(t.xy);e.isArrayTexture&&(i=i.depth(r)),i=i.rg;const n=i.x,a=jo(1e-7,i.y.mul(i.y)),o=s.renderer.reversedDepthBuffer?Xo(n,t.z):Xo(t.z,n),u=fn(1).toVar();return pn(o.notEqual(1),()=>{const e=t.z.sub(n);let r=a.div(a.add(e.mul(e)));r=uu(La(r,.3).div(.65)),u.assign(jo(o,r))}),u}),O_=e=>{let t=L_.get(e);return void 0===t&&(t=new fg,t.colorNode=wn(0,0,0,1),t.isShadowPassMaterial=!0,t.name="ShadowMaterial",t.blending=se,t.fog=!1,L_.set(e,t)),t},V_=e=>{const t=L_.get(e);void 0!==t&&(t.dispose(),L_.delete(e))},k_=new gy,G_=[],z_=(e,t,r,s)=>{G_[0]=e,G_[1]=t;let i=k_.get(G_);return void 0!==i&&i.shadowType===r&&i.useVelocity===s||(i=(i,n,a,o,u,l,...d)=>{(!0===i.castShadow||i.receiveShadow&&r===ht)&&(s&&(Qs(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,k_.set(G_,i)),G_[0]=null,G_[1]=null,i},$_=dn(({samples:e,radius:t,size:r,shadowPass:s,depthLayer:i})=>{const n=fn(0).toVar("meanVertical"),a=fn(0).toVar("squareMeanVertical"),o=e.lessThanEqual(fn(1)).select(fn(0),fn(2).div(e.sub(1))),u=e.lessThanEqual(fn(1)).select(fn(0),fn(-1));Rp({start:yn(0),end:yn(e),type:"int",condition:"<"},({i:e})=>{const l=u.add(fn(e).mul(o));let d=s.sample(Fa(Ql.xy,Tn(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=To(a.sub(n.mul(n)).max(0));return Tn(n,l)}),W_=dn(({samples:e,radius:t,size:r,shadowPass:s,depthLayer:i})=>{const n=fn(0).toVar("meanHorizontal"),a=fn(0).toVar("squareMeanHorizontal"),o=e.lessThanEqual(fn(1)).select(fn(0),fn(2).div(e.sub(1))),u=e.lessThanEqual(fn(1)).select(fn(0),fn(-1));Rp({start:yn(0),end:yn(e),type:"int",condition:"<"},({i:e})=>{const l=u.add(fn(e).mul(o));let d=s.sample(Fa(Ql.xy,Tn(l,0).mul(t)).div(r));s.value.isArrayTexture&&(d=d.depth(i)),n.addAssign(d.x),a.addAssign(Fa(d.y.mul(d.y),d.x.mul(d.x)))}),n.divAssign(e),a.divAssign(e);const l=To(a.sub(n.mul(n)).max(0));return Tn(n,l)}),H_=[P_,D_,U_,I_];let q_;const j_=new ux;class X_ extends v_{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._currentShadowType=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,fn(1))}setupShadowCoord(e,t){const{shadow:r}=this,{renderer:s}=e,i=r.biasNode||Lc("bias","float",r).setGroup(Ta);let n,a=t;if(r.camera.isOrthographicCamera||!0!==s.logarithmicDepthBuffer)a=a.xyz.div(a.w),n=a.z;else{const e=a.w;a=a.xy.div(e);const t=Lc("near","float",r.camera).setGroup(Ta),s=Lc("far","float",r.camera).setGroup(Ta);n=Zp(e.negate(),t,s)}return a=Sn(a.x,a.y.oneMinus(),s.reversedDepthBuffer?n.sub(i):n.add(i)),a}getShadowFilterFn(e){return H_[e]}setupRenderTarget(e,t){const r=new J(e.mapSize.width,e.mapSize.height);r.name="ShadowDepthTexture",r.compareFunction=t.renderer.reversedDepthBuffer?M:w;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,camera:r}=e,{light:s,shadow:i}=this,{depthTexture:n,shadowMap:a}=this.setupRenderTarget(i,e),o=t.shadowMap.type,u=t.hasCompatibility(A.TEXTURE_COMPARE);if(o!==dt&&o!==ct||!u?(n.minFilter=B,n.magFilter=B):(n.minFilter=de,n.magFilter=de),i.camera.coordinateSystem=r.coordinateSystem,i.camera.updateProjectionMatrix(),o===ht&&!0!==i.isPointLightShadow){n.compareFunction=null,a.depth>1?(a._vsmShadowMapVertical||(a._vsmShadowMapVertical=e.createRenderTarget(i.mapSize.width,i.mapSize.height,{format:W,type:_e,depth:a.depth,depthBuffer:!1}),a._vsmShadowMapVertical.texture.name="VSMVertical"),this.vsmShadowMapVertical=a._vsmShadowMapVertical,a._vsmShadowMapHorizontal||(a._vsmShadowMapHorizontal=e.createRenderTarget(i.mapSize.width,i.mapSize.height,{format:W,type:_e,depth:a.depth,depthBuffer:!1}),a._vsmShadowMapHorizontal.texture.name="VSMHorizontal"),this.vsmShadowMapHorizontal=a._vsmShadowMapHorizontal):(this.vsmShadowMapVertical=e.createRenderTarget(i.mapSize.width,i.mapSize.height,{format:W,type:_e,depthBuffer:!1}),this.vsmShadowMapHorizontal=e.createRenderTarget(i.mapSize.width,i.mapSize.height,{format:W,type:_e,depthBuffer:!1}));let t=Dl(n);n.isArrayTexture&&(t=t.depth(this.depthLayer));let r=Dl(this.vsmShadowMapVertical.texture);n.isArrayTexture&&(r=r.depth(this.depthLayer));const s=Lc("blurSamples","float",i).setGroup(Ta),o=Lc("radius","float",i).setGroup(Ta),u=Lc("mapSize","vec2",i).setGroup(Ta);let l=this.vsmMaterialVertical||(this.vsmMaterialVertical=new fg);l.fragmentNode=$_({samples:s,radius:o,size:u,shadowPass:t,depthLayer:this.depthLayer}).context(e.getSharedContext()),l.name="VSMVertical",l=this.vsmMaterialHorizontal||(this.vsmMaterialHorizontal=new fg),l.fragmentNode=W_({samples:s,radius:o,size:u,shadowPass:r,depthLayer:this.depthLayer}).context(e.getSharedContext()),l.name="VSMHorizontal"}const l=Lc("intensity","float",i).setGroup(Ta),d=Lc("normalBias","float",i).setGroup(Ta),c=h_(s).mul(N_.add(cc.mul(d))),h=this.setupShadowCoord(e,c),p=i.filterNode||this.getShadowFilterFn(t.shadowMap.type)||null;if(null===p)throw new Error("THREE.WebGPURenderer: Shadow map type not supported yet.");const g=o===ht&&!0!==i.isPointLightShadow?this.vsmShadowMapHorizontal.texture:n,m=this.setupShadowFilter(e,{filterFn:p,shadowTexture:a.texture,depthTexture:g,shadowCoord:h,shadow:i,depthLayer:this.depthLayer});let f,y;!0===t.shadowMap.transmitted&&(a.texture.isCubeTexture?f=Mc(a.texture,h.xyz):(f=Dl(a.texture,h),n.isArrayTexture&&(f=f.depth(this.depthLayer)))),y=f?ou(1,m.rgb.mix(f,1),l.mul(f.a)).toVar():ou(1,m,l).toVar(),this.shadowMap=a,this.shadow.map=a;const b=`${this.light.type} Shadow [ ${this.light.name||"ID: "+this.light.id} ]`;return f&&y.toInspector(`${b} / Color`,()=>this.shadowMap.texture.isCubeTexture?Mc(this.shadowMap.texture):Dl(this.shadowMap.texture)),y.toInspector(`${b} / Depth`,()=>this.shadowMap.texture.isCubeTexture?Mc(this.shadowMap.texture).r.oneMinus():Ul(this.shadowMap.depthTexture,Al().mul(wl(Dl(this.shadowMap.depthTexture)))).r.oneMinus())}setup(e){if(!1!==e.renderer.shadowMap.enabled)return dn(()=>{const t=e.renderer.shadowMap.type;this._currentShadowType!==t&&(this._reset(),this._node=null);let r=this._node;return this.setupShadowPosition(e),null===r&&(this._node=r=this.setupShadow(e),this._currentShadowType=t),e.material.receivedShadowNode&&(r=e.material.receivedShadowNode(r)),r})()}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);const a=n.name;n.name=`Shadow Map [ ${s.name||"ID: "+s.id} ]`,i.render(n,t.camera),n.name=a}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");q_=M_(i,n,q_),n.overrideMaterial=O_(r),i.setRenderObjectFunction(z_(i,s,o,h)),i.setClearColor(0,0),i.setRenderTarget(t),this.renderShadow(e),i.setRenderObjectFunction(d),o===ht&&!0!==s.isPointLightShadow&&this.vsmPass(i),s.camera.layers.mask=l,B_(i,n,q_)}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),j_.material=this.vsmMaterialVertical,j_.render(e),e.setRenderTarget(this.vsmShadowMapHorizontal),j_.material=this.vsmMaterialHorizontal,j_.render(e)}dispose(){this._reset(),super.dispose()}_reset(){this._currentShadowType=null,V_(this.light),this.shadowMap&&(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)}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 K_=(e,t)=>new X_(e,t),Q_=new e,Y_=new a,Z_=new r,J_=new r,ev=[new r(1,0,0),new r(-1,0,0),new r(0,-1,0),new r(0,1,0),new r(0,0,1),new r(0,0,-1)],tv=[new r(0,-1,0),new r(0,-1,0),new r(0,0,-1),new r(0,0,1),new r(0,-1,0),new r(0,-1,0)],rv=[new r(1,0,0),new r(-1,0,0),new r(0,1,0),new r(0,-1,0),new r(0,0,1),new r(0,0,-1)],sv=[new r(0,-1,0),new r(0,-1,0),new r(0,0,1),new r(0,0,-1),new r(0,-1,0),new r(0,-1,0)],iv=dn(({depthTexture:e,bd3D:t,dp:r})=>Mc(e,t).compare(r)),nv=dn(({depthTexture:e,bd3D:t,dp:r,shadow:s})=>{const i=Lc("radius","float",s).setGroup(Ta),n=Lc("mapSize","vec2",s).setGroup(Ta),a=i.div(n.x),o=Fo(t),u=So(Jo(t,o.x.greaterThan(o.z).select(Sn(0,1,0),Sn(1,0,0)))),l=Jo(t,u),d=mx(Ql.xy).mul(6.28318530718),c=fx(0,5,d),h=fx(1,5,d),p=fx(2,5,d),g=fx(3,5,d),m=fx(4,5,d);return Mc(e,t.add(u.mul(c.x).add(l.mul(c.y)).mul(a))).compare(r).add(Mc(e,t.add(u.mul(h.x).add(l.mul(h.y)).mul(a))).compare(r)).add(Mc(e,t.add(u.mul(p.x).add(l.mul(p.y)).mul(a))).compare(r)).add(Mc(e,t.add(u.mul(g.x).add(l.mul(g.y)).mul(a))).compare(r)).add(Mc(e,t.add(u.mul(m.x).add(l.mul(m.y)).mul(a))).compare(r)).mul(.2)}),av=dn(({filterFn:e,depthTexture:t,shadowCoord:r,shadow:s},i)=>{const n=r.xyz.toConst(),a=n.abs().toConst(),o=a.x.max(a.y).max(a.z),u=Na("float").setGroup(Ta).onRenderUpdate(()=>s.camera.near),l=Na("float").setGroup(Ta).onRenderUpdate(()=>s.camera.far),d=Lc("bias","float",s).setGroup(Ta),c=fn(1).toVar();return pn(o.sub(l).lessThanEqual(0).and(o.sub(u).greaterThanEqual(0)),()=>{let r;i.renderer.reversedDepthBuffer?(r=Qp(o.negate(),u,l),r.subAssign(d)):(r=Kp(o.negate(),u,l),r.addAssign(d));const a=n.normalize();c.assign(e({depthTexture:t,bd3D:a,dp:r,shadow:s}))}),c});class ov extends X_{static get type(){return"PointShadowNode"}constructor(e,t=null){super(e,t)}getShadowFilterFn(e){return e===pt?iv:nv}setupShadowCoord(e,t){return t}setupShadowFilter(e,{filterFn:t,depthTexture:r,shadowCoord:s,shadow:i}){return av({filterFn:t,depthTexture:r,shadowCoord:s,shadow:i})}setupRenderTarget(e,t){const r=new gt(e.mapSize.width);r.name="PointShadowDepthTexture",r.compareFunction=t.renderer.reversedDepthBuffer?M:w;const s=t.createCubeRenderTarget(e.mapSize.width);return s.texture.name="PointShadowMap",s.depthTexture=r,{shadowMap:s,depthTexture:r}}renderShadow(e){const{shadow:t,shadowMap:r,light:s}=this,{renderer:i,scene:n}=e,a=t.camera,o=t.matrix,u=i.coordinateSystem===h,l=u?ev:rv,d=u?tv:sv;r.setSize(t.mapSize.width,t.mapSize.width);const c=i.autoClear,p=i.getClearColor(Q_),g=i.getClearAlpha();i.autoClear=!1,i.setClearColor(t.clearColor,t.clearAlpha);for(let e=0;e<6;e++){i.setRenderTarget(r,e),i.clear();const u=s.distance||a.far;u!==a.far&&(a.far=u,a.updateProjectionMatrix()),Z_.setFromMatrixPosition(s.matrixWorld),a.position.copy(Z_),J_.copy(a.position),J_.add(l[e]),a.up.copy(d[e]),a.lookAt(J_),a.updateMatrixWorld(),o.makeTranslation(-Z_.x,-Z_.y,-Z_.z),Y_.multiplyMatrices(a.projectionMatrix,a.matrixWorldInverse),t._frustum.setFromProjectionMatrix(Y_,a.coordinateSystem,a.reversedDepth);const c=n.name;n.name=`Point Light Shadow [ ${s.name||"ID: "+s.id} ] - Face ${e+1}`,i.render(n,a),n.name=c}i.autoClear=c,i.setClearColor(p,g)}}const uv=(e,t)=>new ov(e,t);class lv extends Fp{static get type(){return"AnalyticLightNode"}constructor(t=null){super(),this.light=t,this.color=new e,this.colorNode=t&&t.colorNode||Na(this.color).setGroup(Ta),this.baseColorNode=null,this.shadowNode=null,this.shadowColorNode=null,this.isAnalyticLightNode=!0,this.updateType=ti.FRAME,t&&t.shadow&&(this._shadowDisposeListener=()=>{this.disposeShadow()},t.addEventListener("dispose",this._shadowDisposeListener))}dispose(){this._shadowDisposeListener&&this.light.removeEventListener("dispose",this._shadowDisposeListener),super.dispose()}disposeShadow(){null!==this.shadowNode&&(this.shadowNode.dispose(),this.shadowNode=null),this.shadowColorNode=null,null!==this.baseColorNode&&(this.colorNode=this.baseColorNode,this.baseColorNode=null)}getHash(){return this.light.uuid}getLightVector(e){return f_(this.light).sub(e.context.positionView||Jd)}setupDirect(){}setupDirectRectArea(){}setupShadowNode(){return K_(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?en(e):this.setupShadowNode(),this.shadowNode=t,this.shadowColorNode=r=this.colorNode.mul(t),this.baseColorNode=this.colorNode}e.context.getShadow&&(r=e.context.getShadow(this,e)),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 dv=dn(({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)}),cv=({color:e,lightVector:t,cutoffDistance:r,decayExponent:s})=>{const i=t.normalize(),n=t.length(),a=dv({lightDistance:n,cutoffDistance:r,decayExponent:s});return{lightDirection:i,lightColor:e.mul(a)}};class hv extends lv{static get type(){return"PointLightNode"}constructor(e=null){super(e),this.cutoffDistanceNode=Na(0).setGroup(Ta),this.decayExponentNode=Na(2).setGroup(Ta)}update(e){const{light:t}=this;super.update(e),this.cutoffDistanceNode.value=t.distance,this.decayExponentNode.value=t.decay}setupShadowNode(){return uv(this.light)}setupDirect(e){return cv({color:this.colorNode,lightVector:this.getLightVector(e),cutoffDistance:this.cutoffDistanceNode,decayExponent:this.decayExponentNode})}}const pv=dn(([e=Al()])=>{const t=e.mul(2),r=t.x.floor(),s=t.y.floor();return r.add(s).mod(2).sign()}),gv=dn(([e=Al()],{renderer:t,material:r})=>{const s=au(e.mul(2).sub(1));let i;if(r.alphaToCoverage&&t.currentSamples>0){const e=fn(s.fwidth()).toVar();i=cu(e.oneMinus(),e.add(1),s).oneMinus()}else i=Tu(s.greaterThan(1),0,1);return i}),mv=dn(([e,t,r])=>{const s=fn(r).toVar(),i=fn(t).toVar(),n=xn(e).toVar();return Tu(n,i,s)}).setLayout({name:"mx_select",type:"float",inputs:[{name:"b",type:"bool"},{name:"t",type:"float"},{name:"f",type:"float"}]}),fv=dn(([e,t])=>{const r=xn(t).toVar(),s=fn(e).toVar();return Tu(r,s.negate(),s)}).setLayout({name:"mx_negate_if",type:"float",inputs:[{name:"val",type:"float"},{name:"b",type:"bool"}]}),yv=dn(([e])=>{const t=fn(e).toVar();return yn(vo(t))}).setLayout({name:"mx_floor",type:"int",inputs:[{name:"x",type:"float"}]}),bv=dn(([e,t])=>{const r=fn(e).toVar();return t.assign(yv(r)),r.sub(fn(t))}),xv=Lb([dn(([e,t,r,s,i,n])=>{const a=fn(n).toVar(),o=fn(i).toVar(),u=fn(s).toVar(),l=fn(r).toVar(),d=fn(t).toVar(),c=fn(e).toVar(),h=fn(La(1,o)).toVar();return La(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"}]}),dn(([e,t,r,s,i,n])=>{const a=fn(n).toVar(),o=fn(i).toVar(),u=Sn(s).toVar(),l=Sn(r).toVar(),d=Sn(t).toVar(),c=Sn(e).toVar(),h=fn(La(1,o)).toVar();return La(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"}]})]),Tv=Lb([dn(([e,t,r,s,i,n,a,o,u,l,d])=>{const c=fn(d).toVar(),h=fn(l).toVar(),p=fn(u).toVar(),g=fn(o).toVar(),m=fn(a).toVar(),f=fn(n).toVar(),y=fn(i).toVar(),b=fn(s).toVar(),x=fn(r).toVar(),T=fn(t).toVar(),_=fn(e).toVar(),v=fn(La(1,p)).toVar(),N=fn(La(1,h)).toVar();return fn(La(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"}]}),dn(([e,t,r,s,i,n,a,o,u,l,d])=>{const c=fn(d).toVar(),h=fn(l).toVar(),p=fn(u).toVar(),g=Sn(o).toVar(),m=Sn(a).toVar(),f=Sn(n).toVar(),y=Sn(i).toVar(),b=Sn(s).toVar(),x=Sn(r).toVar(),T=Sn(t).toVar(),_=Sn(e).toVar(),v=fn(La(1,p)).toVar(),N=fn(La(1,h)).toVar();return fn(La(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"}]})]),_v=dn(([e,t,r])=>{const s=fn(r).toVar(),i=fn(t).toVar(),n=bn(e).toVar(),a=bn(n.bitAnd(bn(7))).toVar(),o=fn(mv(a.lessThan(bn(4)),i,s)).toVar(),u=fn(Pa(2,mv(a.lessThan(bn(4)),s,i))).toVar();return fv(o,xn(a.bitAnd(bn(1)))).add(fv(u,xn(a.bitAnd(bn(2)))))}).setLayout({name:"mx_gradient_float_0",type:"float",inputs:[{name:"hash",type:"uint"},{name:"x",type:"float"},{name:"y",type:"float"}]}),vv=dn(([e,t,r,s])=>{const i=fn(s).toVar(),n=fn(r).toVar(),a=fn(t).toVar(),o=bn(e).toVar(),u=bn(o.bitAnd(bn(15))).toVar(),l=fn(mv(u.lessThan(bn(8)),a,n)).toVar(),d=fn(mv(u.lessThan(bn(4)),n,mv(u.equal(bn(12)).or(u.equal(bn(14))),a,i))).toVar();return fv(l,xn(u.bitAnd(bn(1)))).add(fv(d,xn(u.bitAnd(bn(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"}]}),Nv=Lb([_v,vv]),Sv=dn(([e,t,r])=>{const s=fn(r).toVar(),i=fn(t).toVar(),n=An(e).toVar();return Sn(Nv(n.x,i,s),Nv(n.y,i,s),Nv(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"}]}),Rv=dn(([e,t,r,s])=>{const i=fn(s).toVar(),n=fn(r).toVar(),a=fn(t).toVar(),o=An(e).toVar();return Sn(Nv(o.x,a,n,i),Nv(o.y,a,n,i),Nv(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"}]}),Av=Lb([Sv,Rv]),Ev=dn(([e])=>{const t=fn(e).toVar();return Pa(.6616,t)}).setLayout({name:"mx_gradient_scale2d_0",type:"float",inputs:[{name:"v",type:"float"}]}),wv=dn(([e])=>{const t=fn(e).toVar();return Pa(.982,t)}).setLayout({name:"mx_gradient_scale3d_0",type:"float",inputs:[{name:"v",type:"float"}]}),Cv=Lb([Ev,dn(([e])=>{const t=Sn(e).toVar();return Pa(.6616,t)}).setLayout({name:"mx_gradient_scale2d_1",type:"vec3",inputs:[{name:"v",type:"vec3"}]})]),Mv=Lb([wv,dn(([e])=>{const t=Sn(e).toVar();return Pa(.982,t)}).setLayout({name:"mx_gradient_scale3d_1",type:"vec3",inputs:[{name:"v",type:"vec3"}]})]),Bv=dn(([e,t])=>{const r=yn(t).toVar(),s=bn(e).toVar();return s.shiftLeft(r).bitOr(s.shiftRight(yn(32).sub(r)))}).setLayout({name:"mx_rotl32",type:"uint",inputs:[{name:"x",type:"uint"},{name:"k",type:"int"}]}),Fv=dn(([e,t,r])=>{e.subAssign(r),e.bitXorAssign(Bv(r,yn(4))),r.addAssign(t),t.subAssign(e),t.bitXorAssign(Bv(e,yn(6))),e.addAssign(r),r.subAssign(t),r.bitXorAssign(Bv(t,yn(8))),t.addAssign(e),e.subAssign(r),e.bitXorAssign(Bv(r,yn(16))),r.addAssign(t),t.subAssign(e),t.bitXorAssign(Bv(e,yn(19))),e.addAssign(r),r.subAssign(t),r.bitXorAssign(Bv(t,yn(4))),t.addAssign(e)}),Lv=dn(([e,t,r])=>{const s=bn(r).toVar(),i=bn(t).toVar(),n=bn(e).toVar();return s.bitXorAssign(i),s.subAssign(Bv(i,yn(14))),n.bitXorAssign(s),n.subAssign(Bv(s,yn(11))),i.bitXorAssign(n),i.subAssign(Bv(n,yn(25))),s.bitXorAssign(i),s.subAssign(Bv(i,yn(16))),n.bitXorAssign(s),n.subAssign(Bv(s,yn(4))),i.bitXorAssign(n),i.subAssign(Bv(n,yn(14))),s.bitXorAssign(i),s.subAssign(Bv(i,yn(24))),s}).setLayout({name:"mx_bjfinal",type:"uint",inputs:[{name:"a",type:"uint"},{name:"b",type:"uint"},{name:"c",type:"uint"}]}),Pv=dn(([e])=>{const t=bn(e).toVar();return fn(t).div(fn(bn(yn(4294967295))))}).setLayout({name:"mx_bits_to_01",type:"float",inputs:[{name:"bits",type:"uint"}]}),Dv=dn(([e])=>{const t=fn(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"}]}),Uv=Lb([dn(([e])=>{const t=yn(e).toVar(),r=bn(bn(1)).toVar(),s=bn(bn(yn(3735928559)).add(r.shiftLeft(bn(2))).add(bn(13))).toVar();return Lv(s.add(bn(t)),s,s)}).setLayout({name:"mx_hash_int_0",type:"uint",inputs:[{name:"x",type:"int"}]}),dn(([e,t])=>{const r=yn(t).toVar(),s=yn(e).toVar(),i=bn(bn(2)).toVar(),n=bn().toVar(),a=bn().toVar(),o=bn().toVar();return n.assign(a.assign(o.assign(bn(yn(3735928559)).add(i.shiftLeft(bn(2))).add(bn(13))))),n.addAssign(bn(s)),a.addAssign(bn(r)),Lv(n,a,o)}).setLayout({name:"mx_hash_int_1",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"}]}),dn(([e,t,r])=>{const s=yn(r).toVar(),i=yn(t).toVar(),n=yn(e).toVar(),a=bn(bn(3)).toVar(),o=bn().toVar(),u=bn().toVar(),l=bn().toVar();return o.assign(u.assign(l.assign(bn(yn(3735928559)).add(a.shiftLeft(bn(2))).add(bn(13))))),o.addAssign(bn(n)),u.addAssign(bn(i)),l.addAssign(bn(s)),Lv(o,u,l)}).setLayout({name:"mx_hash_int_2",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"}]}),dn(([e,t,r,s])=>{const i=yn(s).toVar(),n=yn(r).toVar(),a=yn(t).toVar(),o=yn(e).toVar(),u=bn(bn(4)).toVar(),l=bn().toVar(),d=bn().toVar(),c=bn().toVar();return l.assign(d.assign(c.assign(bn(yn(3735928559)).add(u.shiftLeft(bn(2))).add(bn(13))))),l.addAssign(bn(o)),d.addAssign(bn(a)),c.addAssign(bn(n)),Fv(l,d,c),l.addAssign(bn(i)),Lv(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"}]}),dn(([e,t,r,s,i])=>{const n=yn(i).toVar(),a=yn(s).toVar(),o=yn(r).toVar(),u=yn(t).toVar(),l=yn(e).toVar(),d=bn(bn(5)).toVar(),c=bn().toVar(),h=bn().toVar(),p=bn().toVar();return c.assign(h.assign(p.assign(bn(yn(3735928559)).add(d.shiftLeft(bn(2))).add(bn(13))))),c.addAssign(bn(l)),h.addAssign(bn(u)),p.addAssign(bn(o)),Fv(c,h,p),c.addAssign(bn(a)),h.addAssign(bn(n)),Lv(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"}]})]),Iv=Lb([dn(([e,t])=>{const r=yn(t).toVar(),s=yn(e).toVar(),i=bn(Uv(s,r)).toVar(),n=An().toVar();return n.x.assign(i.bitAnd(yn(255))),n.y.assign(i.shiftRight(yn(8)).bitAnd(yn(255))),n.z.assign(i.shiftRight(yn(16)).bitAnd(yn(255))),n}).setLayout({name:"mx_hash_vec3_0",type:"uvec3",inputs:[{name:"x",type:"int"},{name:"y",type:"int"}]}),dn(([e,t,r])=>{const s=yn(r).toVar(),i=yn(t).toVar(),n=yn(e).toVar(),a=bn(Uv(n,i,s)).toVar(),o=An().toVar();return o.x.assign(a.bitAnd(yn(255))),o.y.assign(a.shiftRight(yn(8)).bitAnd(yn(255))),o.z.assign(a.shiftRight(yn(16)).bitAnd(yn(255))),o}).setLayout({name:"mx_hash_vec3_1",type:"uvec3",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"}]})]),Ov=Lb([dn(([e])=>{const t=Tn(e).toVar(),r=yn().toVar(),s=yn().toVar(),i=fn(bv(t.x,r)).toVar(),n=fn(bv(t.y,s)).toVar(),a=fn(Dv(i)).toVar(),o=fn(Dv(n)).toVar(),u=fn(xv(Nv(Uv(r,s),i,n),Nv(Uv(r.add(yn(1)),s),i.sub(1),n),Nv(Uv(r,s.add(yn(1))),i,n.sub(1)),Nv(Uv(r.add(yn(1)),s.add(yn(1))),i.sub(1),n.sub(1)),a,o)).toVar();return Cv(u)}).setLayout({name:"mx_perlin_noise_float_0",type:"float",inputs:[{name:"p",type:"vec2"}]}),dn(([e])=>{const t=Sn(e).toVar(),r=yn().toVar(),s=yn().toVar(),i=yn().toVar(),n=fn(bv(t.x,r)).toVar(),a=fn(bv(t.y,s)).toVar(),o=fn(bv(t.z,i)).toVar(),u=fn(Dv(n)).toVar(),l=fn(Dv(a)).toVar(),d=fn(Dv(o)).toVar(),c=fn(Tv(Nv(Uv(r,s,i),n,a,o),Nv(Uv(r.add(yn(1)),s,i),n.sub(1),a,o),Nv(Uv(r,s.add(yn(1)),i),n,a.sub(1),o),Nv(Uv(r.add(yn(1)),s.add(yn(1)),i),n.sub(1),a.sub(1),o),Nv(Uv(r,s,i.add(yn(1))),n,a,o.sub(1)),Nv(Uv(r.add(yn(1)),s,i.add(yn(1))),n.sub(1),a,o.sub(1)),Nv(Uv(r,s.add(yn(1)),i.add(yn(1))),n,a.sub(1),o.sub(1)),Nv(Uv(r.add(yn(1)),s.add(yn(1)),i.add(yn(1))),n.sub(1),a.sub(1),o.sub(1)),u,l,d)).toVar();return Mv(c)}).setLayout({name:"mx_perlin_noise_float_1",type:"float",inputs:[{name:"p",type:"vec3"}]})]),Vv=Lb([dn(([e])=>{const t=Tn(e).toVar(),r=yn().toVar(),s=yn().toVar(),i=fn(bv(t.x,r)).toVar(),n=fn(bv(t.y,s)).toVar(),a=fn(Dv(i)).toVar(),o=fn(Dv(n)).toVar(),u=Sn(xv(Av(Iv(r,s),i,n),Av(Iv(r.add(yn(1)),s),i.sub(1),n),Av(Iv(r,s.add(yn(1))),i,n.sub(1)),Av(Iv(r.add(yn(1)),s.add(yn(1))),i.sub(1),n.sub(1)),a,o)).toVar();return Cv(u)}).setLayout({name:"mx_perlin_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"vec2"}]}),dn(([e])=>{const t=Sn(e).toVar(),r=yn().toVar(),s=yn().toVar(),i=yn().toVar(),n=fn(bv(t.x,r)).toVar(),a=fn(bv(t.y,s)).toVar(),o=fn(bv(t.z,i)).toVar(),u=fn(Dv(n)).toVar(),l=fn(Dv(a)).toVar(),d=fn(Dv(o)).toVar(),c=Sn(Tv(Av(Iv(r,s,i),n,a,o),Av(Iv(r.add(yn(1)),s,i),n.sub(1),a,o),Av(Iv(r,s.add(yn(1)),i),n,a.sub(1),o),Av(Iv(r.add(yn(1)),s.add(yn(1)),i),n.sub(1),a.sub(1),o),Av(Iv(r,s,i.add(yn(1))),n,a,o.sub(1)),Av(Iv(r.add(yn(1)),s,i.add(yn(1))),n.sub(1),a,o.sub(1)),Av(Iv(r,s.add(yn(1)),i.add(yn(1))),n,a.sub(1),o.sub(1)),Av(Iv(r.add(yn(1)),s.add(yn(1)),i.add(yn(1))),n.sub(1),a.sub(1),o.sub(1)),u,l,d)).toVar();return Mv(c)}).setLayout({name:"mx_perlin_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec3"}]})]),kv=Lb([dn(([e])=>{const t=fn(e).toVar(),r=yn(yv(t)).toVar();return Pv(Uv(r))}).setLayout({name:"mx_cell_noise_float_0",type:"float",inputs:[{name:"p",type:"float"}]}),dn(([e])=>{const t=Tn(e).toVar(),r=yn(yv(t.x)).toVar(),s=yn(yv(t.y)).toVar();return Pv(Uv(r,s))}).setLayout({name:"mx_cell_noise_float_1",type:"float",inputs:[{name:"p",type:"vec2"}]}),dn(([e])=>{const t=Sn(e).toVar(),r=yn(yv(t.x)).toVar(),s=yn(yv(t.y)).toVar(),i=yn(yv(t.z)).toVar();return Pv(Uv(r,s,i))}).setLayout({name:"mx_cell_noise_float_2",type:"float",inputs:[{name:"p",type:"vec3"}]}),dn(([e])=>{const t=wn(e).toVar(),r=yn(yv(t.x)).toVar(),s=yn(yv(t.y)).toVar(),i=yn(yv(t.z)).toVar(),n=yn(yv(t.w)).toVar();return Pv(Uv(r,s,i,n))}).setLayout({name:"mx_cell_noise_float_3",type:"float",inputs:[{name:"p",type:"vec4"}]})]),Gv=Lb([dn(([e])=>{const t=fn(e).toVar(),r=yn(yv(t)).toVar();return Sn(Pv(Uv(r,yn(0))),Pv(Uv(r,yn(1))),Pv(Uv(r,yn(2))))}).setLayout({name:"mx_cell_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"float"}]}),dn(([e])=>{const t=Tn(e).toVar(),r=yn(yv(t.x)).toVar(),s=yn(yv(t.y)).toVar();return Sn(Pv(Uv(r,s,yn(0))),Pv(Uv(r,s,yn(1))),Pv(Uv(r,s,yn(2))))}).setLayout({name:"mx_cell_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec2"}]}),dn(([e])=>{const t=Sn(e).toVar(),r=yn(yv(t.x)).toVar(),s=yn(yv(t.y)).toVar(),i=yn(yv(t.z)).toVar();return Sn(Pv(Uv(r,s,i,yn(0))),Pv(Uv(r,s,i,yn(1))),Pv(Uv(r,s,i,yn(2))))}).setLayout({name:"mx_cell_noise_vec3_2",type:"vec3",inputs:[{name:"p",type:"vec3"}]}),dn(([e])=>{const t=wn(e).toVar(),r=yn(yv(t.x)).toVar(),s=yn(yv(t.y)).toVar(),i=yn(yv(t.z)).toVar(),n=yn(yv(t.w)).toVar();return Sn(Pv(Uv(r,s,i,n,yn(0))),Pv(Uv(r,s,i,n,yn(1))),Pv(Uv(r,s,i,n,yn(2))))}).setLayout({name:"mx_cell_noise_vec3_3",type:"vec3",inputs:[{name:"p",type:"vec4"}]})]),zv=dn(([e,t,r,s])=>{const i=fn(s).toVar(),n=fn(r).toVar(),a=yn(t).toVar(),o=Sn(e).toVar(),u=fn(0).toVar(),l=fn(1).toVar();return Rp(a,()=>{u.addAssign(l.mul(Ov(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"}]}),$v=dn(([e,t,r,s])=>{const i=fn(s).toVar(),n=fn(r).toVar(),a=yn(t).toVar(),o=Sn(e).toVar(),u=Sn(0).toVar(),l=fn(1).toVar();return Rp(a,()=>{u.addAssign(l.mul(Vv(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"}]}),Wv=dn(([e,t,r,s])=>{const i=fn(s).toVar(),n=fn(r).toVar(),a=yn(t).toVar(),o=Sn(e).toVar();return Tn(zv(o,a,n,i),zv(o.add(Sn(yn(19),yn(193),yn(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"}]}),Hv=dn(([e,t,r,s])=>{const i=fn(s).toVar(),n=fn(r).toVar(),a=yn(t).toVar(),o=Sn(e).toVar(),u=Sn($v(o,a,n,i)).toVar(),l=fn(zv(o.add(Sn(yn(19),yn(193),yn(17))),a,n,i)).toVar();return wn(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"}]}),qv=Lb([dn(([e,t,r,s,i,n,a])=>{const o=yn(a).toVar(),u=fn(n).toVar(),l=yn(i).toVar(),d=yn(s).toVar(),c=yn(r).toVar(),h=yn(t).toVar(),p=Tn(e).toVar(),g=Sn(Gv(Tn(h.add(d),c.add(l)))).toVar(),m=Tn(g.x,g.y).toVar();m.subAssign(.5),m.mulAssign(u),m.addAssign(.5);const f=Tn(Tn(fn(h),fn(c)).add(m)).toVar(),y=Tn(f.sub(p)).toVar();return pn(o.equal(yn(2)),()=>Fo(y.x).add(Fo(y.y))),pn(o.equal(yn(3)),()=>jo(Fo(y.x),Fo(y.y))),Zo(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"}]}),dn(([e,t,r,s,i,n,a,o,u])=>{const l=yn(u).toVar(),d=fn(o).toVar(),c=yn(a).toVar(),h=yn(n).toVar(),p=yn(i).toVar(),g=yn(s).toVar(),m=yn(r).toVar(),f=yn(t).toVar(),y=Sn(e).toVar(),b=Sn(Gv(Sn(f.add(p),m.add(h),g.add(c)))).toVar();b.subAssign(.5),b.mulAssign(d),b.addAssign(.5);const x=Sn(Sn(fn(f),fn(m),fn(g)).add(b)).toVar(),T=Sn(x.sub(y)).toVar();return pn(l.equal(yn(2)),()=>Fo(T.x).add(Fo(T.y)).add(Fo(T.z))),pn(l.equal(yn(3)),()=>jo(Fo(T.x),Fo(T.y),Fo(T.z))),Zo(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"}]})]),jv=dn(([e,t,r])=>{const s=yn(r).toVar(),i=fn(t).toVar(),n=Tn(e).toVar(),a=yn().toVar(),o=yn().toVar(),u=Tn(bv(n.x,a),bv(n.y,o)).toVar(),l=fn(1e6).toVar();return Rp({start:-1,end:yn(1),name:"x",condition:"<="},({x:e})=>{Rp({start:-1,end:yn(1),name:"y",condition:"<="},({y:t})=>{const r=fn(qv(u,e,t,a,o,i,s)).toVar();l.assign(qo(l,r))})}),pn(s.equal(yn(0)),()=>{l.assign(To(l))}),l}).setLayout({name:"mx_worley_noise_float_0",type:"float",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),Xv=dn(([e,t,r])=>{const s=yn(r).toVar(),i=fn(t).toVar(),n=Tn(e).toVar(),a=yn().toVar(),o=yn().toVar(),u=Tn(bv(n.x,a),bv(n.y,o)).toVar(),l=Tn(1e6,1e6).toVar();return Rp({start:-1,end:yn(1),name:"x",condition:"<="},({x:e})=>{Rp({start:-1,end:yn(1),name:"y",condition:"<="},({y:t})=>{const r=fn(qv(u,e,t,a,o,i,s)).toVar();pn(r.lessThan(l.x),()=>{l.y.assign(l.x),l.x.assign(r)}).ElseIf(r.lessThan(l.y),()=>{l.y.assign(r)})})}),pn(s.equal(yn(0)),()=>{l.assign(To(l))}),l}).setLayout({name:"mx_worley_noise_vec2_0",type:"vec2",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),Kv=dn(([e,t,r])=>{const s=yn(r).toVar(),i=fn(t).toVar(),n=Tn(e).toVar(),a=yn().toVar(),o=yn().toVar(),u=Tn(bv(n.x,a),bv(n.y,o)).toVar(),l=Sn(1e6,1e6,1e6).toVar();return Rp({start:-1,end:yn(1),name:"x",condition:"<="},({x:e})=>{Rp({start:-1,end:yn(1),name:"y",condition:"<="},({y:t})=>{const r=fn(qv(u,e,t,a,o,i,s)).toVar();pn(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)})})}),pn(s.equal(yn(0)),()=>{l.assign(To(l))}),l}).setLayout({name:"mx_worley_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),Qv=Lb([jv,dn(([e,t,r])=>{const s=yn(r).toVar(),i=fn(t).toVar(),n=Sn(e).toVar(),a=yn().toVar(),o=yn().toVar(),u=yn().toVar(),l=Sn(bv(n.x,a),bv(n.y,o),bv(n.z,u)).toVar(),d=fn(1e6).toVar();return Rp({start:-1,end:yn(1),name:"x",condition:"<="},({x:e})=>{Rp({start:-1,end:yn(1),name:"y",condition:"<="},({y:t})=>{Rp({start:-1,end:yn(1),name:"z",condition:"<="},({z:r})=>{const n=fn(qv(l,e,t,r,a,o,u,i,s)).toVar();d.assign(qo(d,n))})})}),pn(s.equal(yn(0)),()=>{d.assign(To(d))}),d}).setLayout({name:"mx_worley_noise_float_1",type:"float",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),Yv=Lb([Xv,dn(([e,t,r])=>{const s=yn(r).toVar(),i=fn(t).toVar(),n=Sn(e).toVar(),a=yn().toVar(),o=yn().toVar(),u=yn().toVar(),l=Sn(bv(n.x,a),bv(n.y,o),bv(n.z,u)).toVar(),d=Tn(1e6,1e6).toVar();return Rp({start:-1,end:yn(1),name:"x",condition:"<="},({x:e})=>{Rp({start:-1,end:yn(1),name:"y",condition:"<="},({y:t})=>{Rp({start:-1,end:yn(1),name:"z",condition:"<="},({z:r})=>{const n=fn(qv(l,e,t,r,a,o,u,i,s)).toVar();pn(n.lessThan(d.x),()=>{d.y.assign(d.x),d.x.assign(n)}).ElseIf(n.lessThan(d.y),()=>{d.y.assign(n)})})})}),pn(s.equal(yn(0)),()=>{d.assign(To(d))}),d}).setLayout({name:"mx_worley_noise_vec2_1",type:"vec2",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),Zv=Lb([Kv,dn(([e,t,r])=>{const s=yn(r).toVar(),i=fn(t).toVar(),n=Sn(e).toVar(),a=yn().toVar(),o=yn().toVar(),u=yn().toVar(),l=Sn(bv(n.x,a),bv(n.y,o),bv(n.z,u)).toVar(),d=Sn(1e6,1e6,1e6).toVar();return Rp({start:-1,end:yn(1),name:"x",condition:"<="},({x:e})=>{Rp({start:-1,end:yn(1),name:"y",condition:"<="},({y:t})=>{Rp({start:-1,end:yn(1),name:"z",condition:"<="},({z:r})=>{const n=fn(qv(l,e,t,r,a,o,u,i,s)).toVar();pn(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)})})})}),pn(s.equal(yn(0)),()=>{d.assign(To(d))}),d}).setLayout({name:"mx_worley_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),Jv=dn(([e,t,r,s,i,n,a,o,u,l,d])=>{const c=yn(e).toVar(),h=Tn(t).toVar(),p=Tn(r).toVar(),g=Tn(s).toVar(),m=fn(i).toVar(),f=fn(n).toVar(),y=fn(a).toVar(),b=xn(o).toVar(),x=yn(u).toVar(),T=fn(l).toVar(),_=fn(d).toVar(),v=h.mul(p).add(g),N=fn(0).toVar();return pn(c.equal(yn(0)),()=>{N.assign(Vv(v))}),pn(c.equal(yn(1)),()=>{N.assign(Gv(v))}),pn(c.equal(yn(2)),()=>{N.assign(Zv(v,m,yn(0)))}),pn(c.equal(yn(3)),()=>{N.assign($v(Sn(v,0),x,T,_))}),N.assign(N.mul(y.sub(f)).add(f)),pn(b,()=>{N.assign(uu(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"}]}),eN=dn(([e,t,r,s,i,n,a,o,u,l,d])=>{const c=yn(e).toVar(),h=Sn(t).toVar(),p=Sn(r).toVar(),g=Sn(s).toVar(),m=fn(i).toVar(),f=fn(n).toVar(),y=fn(a).toVar(),b=xn(o).toVar(),x=yn(u).toVar(),T=fn(l).toVar(),_=fn(d).toVar(),v=h.mul(p).add(g),N=fn(0).toVar();return pn(c.equal(yn(0)),()=>{N.assign(Vv(v))}),pn(c.equal(yn(1)),()=>{N.assign(Gv(v))}),pn(c.equal(yn(2)),()=>{N.assign(Zv(v,m,yn(0)))}),pn(c.equal(yn(3)),()=>{N.assign($v(v,x,T,_))}),N.assign(N.mul(y.sub(f)).add(f)),pn(b,()=>{N.assign(uu(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"}]}),tN=dn(([e])=>{const t=e.y,r=e.z,s=Sn().toVar();return pn(t.lessThan(1e-4),()=>{s.assign(Sn(r,r,r))}).Else(()=>{let i=e.x;i=i.sub(vo(i)).mul(6).toVar();const n=yn(Go(i)),a=i.sub(fn(n)),o=r.mul(t.oneMinus()),u=r.mul(t.mul(a).oneMinus()),l=r.mul(t.mul(a.oneMinus()).oneMinus());pn(n.equal(yn(0)),()=>{s.assign(Sn(r,l,o))}).ElseIf(n.equal(yn(1)),()=>{s.assign(Sn(u,r,o))}).ElseIf(n.equal(yn(2)),()=>{s.assign(Sn(o,r,l))}).ElseIf(n.equal(yn(3)),()=>{s.assign(Sn(o,u,r))}).ElseIf(n.equal(yn(4)),()=>{s.assign(Sn(l,o,r))}).Else(()=>{s.assign(Sn(r,o,u))})}),s}).setLayout({name:"mx_hsvtorgb",type:"vec3",inputs:[{name:"hsv",type:"vec3"}]}),rN=dn(([e])=>{const t=Sn(e).toVar(),r=fn(t.x).toVar(),s=fn(t.y).toVar(),i=fn(t.z).toVar(),n=fn(qo(r,qo(s,i))).toVar(),a=fn(jo(r,jo(s,i))).toVar(),o=fn(a.sub(n)).toVar(),u=fn().toVar(),l=fn().toVar(),d=fn().toVar();return d.assign(a),pn(a.greaterThan(0),()=>{l.assign(o.div(a))}).Else(()=>{l.assign(0)}),pn(l.lessThanEqual(0),()=>{u.assign(0)}).Else(()=>{pn(r.greaterThanEqual(a),()=>{u.assign(s.sub(i).div(o))}).ElseIf(s.greaterThanEqual(a),()=>{u.assign(Fa(2,i.sub(r).div(o)))}).Else(()=>{u.assign(Fa(4,r.sub(s).div(o)))}),u.mulAssign(1/6),pn(u.lessThan(0),()=>{u.addAssign(1)})}),Sn(u,l,d)}).setLayout({name:"mx_rgbtohsv",type:"vec3",inputs:[{name:"c",type:"vec3"}]}),sN=dn(([e])=>{const t=Sn(e).toVar(),r=En(ka(t,Sn(.04045))).toVar(),s=Sn(t.div(12.92)).toVar(),i=Sn(eu(jo(t.add(Sn(.055)),Sn(0)).div(1.055),Sn(2.4))).toVar();return ou(s,i,r)}).setLayout({name:"mx_srgb_texture_to_lin_rec709",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),iN=(e,t)=>{e=fn(e),t=fn(t);const r=Tn(t.dFdx(),t.dFdy()).length().mul(.7071067811865476);return cu(e.sub(r),e.add(r),t)},nN=(e,t,r,s)=>ou(e,t,r[s].clamp()),aN=(e,t,r,s,i)=>ou(e,t,iN(r,s[i])),oN=dn(([e,t,r])=>{const s=So(e).toVar(),i=La(fn(.5).mul(t.sub(r)),Yd).div(s).toVar(),n=La(fn(-.5).mul(t.sub(r)),Yd).div(s).toVar(),a=Sn().toVar();a.x=s.x.greaterThan(fn(0)).select(i.x,n.x),a.y=s.y.greaterThan(fn(0)).select(i.y,n.y),a.z=s.z.greaterThan(fn(0)).select(i.z,n.z);const o=qo(a.x,a.y,a.z).toVar();return Yd.add(s.mul(o)).toVar().sub(r)}),uN=dn(([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 lN=Object.freeze({__proto__:null,BRDF_GGX:em,BRDF_Lambert:Vg,BasicPointShadowFilter:iv,BasicShadowFilter:P_,Break:Ap,Const:Bu,Continue:()=>ml("continue").toStack(),DFGLUT:sm,D_GGX:Yg,Discard:fl,EPSILON:no,F_Schlick:Og,Fn:dn,HALF_PI:co,INFINITY:ao,If:pn,Loop:Rp,NodeAccess:si,NodeShaderStage:ei,NodeType:ri,NodeUpdateType:ti,OnBeforeMaterialUpdate:e=>xx(bx.BEFORE_MATERIAL,e),OnBeforeObjectUpdate:e=>xx(bx.BEFORE_OBJECT,e),OnMaterialUpdate:e=>xx(bx.MATERIAL,e),OnObjectUpdate:e=>xx(bx.OBJECT,e),PCFShadowFilter:D_,PCFSoftShadowFilter:U_,PI:oo,PI2:uo,PointShadowFilter:nv,Return:()=>ml("return").toStack(),Schlick_to_F0:am,ShaderNode:Ji,Stack:gn,Switch:(...e)=>Ni.Switch(...e),TBNViewMatrix:ah,TWO_PI:lo,VSMShadowFilter:I_,V_GGX_SmithCorrelated:Kg,Var:Mu,VarIntent:Fu,abs:Fo,acesFilmicToneMapping:nT,acos:Mo,add:Fa,addMethodChaining:Ri,addNodeElement:function(e){d("TSL: AddNodeElement has been removed in favor of tree-shaking. Trying add",e)},agxToneMapping:lT,all:ho,alphaT:Zn,and:$a,anisotropy:Jn,anisotropyB:ta,anisotropyT:ea,any:po,append:e=>(d("TSL: append() has been renamed to Stack().",new Us),gn(e)),array:Ra,arrayBuffer:e=>new _i(e,"ArrayBuffer"),asin:Co,assign:Ea,atan:Bo,atomicAdd:(e,t)=>IT(DT.ATOMIC_ADD,e,t),atomicAnd:(e,t)=>IT(DT.ATOMIC_AND,e,t),atomicFunc:IT,atomicLoad:e=>IT(DT.ATOMIC_LOAD,e,null),atomicMax:(e,t)=>IT(DT.ATOMIC_MAX,e,t),atomicMin:(e,t)=>IT(DT.ATOMIC_MIN,e,t),atomicOr:(e,t)=>IT(DT.ATOMIC_OR,e,t),atomicStore:(e,t)=>IT(DT.ATOMIC_STORE,e,t),atomicSub:(e,t)=>IT(DT.ATOMIC_SUB,e,t),atomicXor:(e,t)=>IT(DT.ATOMIC_XOR,e,t),attenuationColor:ga,attenuationDistance:pa,attribute:Rl,attributeArray:(e,t="float")=>{let r,s;!0===t.isStruct?(r=t.layout.getLength(),s=Ws("float")):(r=Hs(t),s=Ws(t));const i=new _x(e,r,s);return op(i,t,e)},backgroundBlurriness:Ax,backgroundIntensity:Ex,backgroundRotation:wx,batch:Tp,bentNormalView:uh,billboarding:Vb,bitAnd:ja,bitNot:Xa,bitOr:Ka,bitXor:Qa,bitangentGeometry:rh,bitangentLocal:sh,bitangentView:ih,bitangentWorld:nh,bitcast:cb,blendBurn:lg,blendColor:pg,blendDodge:dg,blendOverlay:hg,blendScreen:cg,blur:of,bool:xn,buffer:Ol,bufferAttribute:tl,builtin:$l,builtinAOContext:Au,builtinShadowContext:Ru,bumpMap:fh,bvec2:Nn,bvec3:En,bvec4:Bn,bypass:cl,cache:ll,call:Ca,cameraFar:bd,cameraIndex:fd,cameraNear:yd,cameraNormalMatrix:Nd,cameraPosition:Sd,cameraProjectionMatrix:xd,cameraProjectionMatrixInverse:Td,cameraViewMatrix:_d,cameraViewport:Rd,cameraWorldMatrix:vd,cbrt:nu,cdl:Hx,ceil:No,checker:pv,cineonToneMapping:sT,clamp:uu,clearcoat:Hn,clearcoatNormalView:hc,clearcoatRoughness:qn,clipSpace:jd,code:hT,color:mn,colorSpaceToWorking:$u,colorToDirection:e=>en(e).mul(2).sub(1),compute:al,computeKernel:nl,computeSkinning:(e,t=null)=>{const r=new vp(e);return r.positionNode=op(new j(e.geometry.getAttribute("position").array,3),"vec3").setPBO(!0).toReadOnly().element(dp).toVar(),r.skinIndexNode=op(new j(new Uint32Array(e.geometry.getAttribute("skinIndex").array),4),"uvec4").setPBO(!0).toReadOnly().element(dp).toVar(),r.skinWeightNode=op(new j(e.geometry.getAttribute("skinWeight").array,4),"vec4").setPBO(!0).toReadOnly().element(dp).toVar(),r.bindMatrixNode=Na(e.bindMatrix,"mat4"),r.bindMatrixInverseNode=Na(e.bindMatrixInverse,"mat4"),r.boneMatricesNode=Ol(e.skeleton.boneMatrices,"mat4",e.skeleton.bones.length),r.toPositionNode=t,en(r)},context:vu,convert:Un,convertColorSpace:(e,t,r)=>new Gu(en(e),t,r),convertToTexture:(e,...t)=>e.isSampleNode||e.isTextureNode?e:e.isPassNode?e.getTextureNode():cx(e,...t),cos:Eo,countLeadingZeros:fb,countOneBits:yb,countTrailingZeros:mb,cross:Jo,cubeTexture:Mc,cubeTextureBase:Cc,dFdx:Io,dFdy:Oo,dashSize:oa,debug:Tl,decrement:ro,decrementBefore:eo,defaultBuildStages:ni,defaultShaderStages:ii,defined:Yi,degrees:mo,deltaTime:Db,densityFogFactor:yT,depth:eg,depthPass:(e,t,r)=>new Jx(Jx.DEPTH,e,t,r),determinant:Wo,difference:Yo,diffuseColor:kn,diffuseContribution:Gn,directPointLight:cv,directionToColor:lh,directionToFaceDirection:ic,dispersion:ma,disposeShadowMaterial:V_,distance:Qo,div:Da,dot:Zo,drawIndex:gp,dynamicBufferAttribute:(e,t=null,r=0,s=0)=>el(e,t,r,s,x),element:Dn,emissive:zn,equal:Ia,equirectUV:Rg,exp:fo,exp2:yo,exponentialHeightFogFactor:bT,expression:ml,faceDirection:sc,faceForward:hu,faceforward:yu,float:fn,floatBitsToInt:e=>new db(e,"int","float"),floatBitsToUint:hb,floor:vo,fog:xT,fract:Ro,frameGroup:xa,frameId:Ub,frontFacing:rc,fwidth:zo,gain:(e,t)=>e.lessThan(.5)?xb(e.mul(2),t).div(2):La(1,xb(Pa(La(1,e),2),t).div(2)),gapSize:ua,getConstNodeType:Zi,getCurrentStack:hn,getDirection:rf,getDistanceAttenuation:dv,getGeometryRoughness:jg,getNormalFromDepth:gx,getParallaxCorrectNormal:oN,getRoughness:Xg,getScreenPosition:px,getShIrradianceAt:uN,getShadowMaterial:O_,getShadowRenderObjectFunction:z_,getTextureIndex:ob,getViewPosition:hx,ggxConvolution:cf,globalId:wT,glsl:(e,t)=>hT(e,t,"glsl"),glslFn:(e,t)=>gT(e,t,"glsl"),grayscale:kx,greaterThan:ka,greaterThanEqual:za,hash:bb,highpModelNormalViewMatrix:qd,highpModelViewMatrix:Hd,hue:$x,increment:to,incrementBefore:Ja,inspector:Nl,instance:fp,instanceIndex:dp,instancedArray:(e,t="float")=>{let r,s;!0===t.isStruct?(r=t.layout.getLength(),s=Ws("float")):(r=Hs(t),s=Ws(t));const i=new Tx(e,r,s);return op(i,t,i.count)},instancedBufferAttribute:rl,instancedDynamicBufferAttribute:sl,instancedMesh:bp,int:yn,intBitsToFloat:e=>new db(e,"float","int"),interleavedGradientNoise:mx,inverse:Ho,inverseSqrt:_o,inversesqrt:bu,invocationLocalIndex:pp,invocationSubgroupIndex:hp,ior:da,iridescence:Kn,iridescenceIOR:Qn,iridescenceThickness:Yn,isolate:ul,ivec2:_n,ivec3:Rn,ivec4:Cn,js:(e,t)=>hT(e,t,"js"),label:Eu,length:Po,lengthSq:au,lessThan:Va,lessThanEqual:Ga,lightPosition:g_,lightProjectionUV:p_,lightShadowMatrix:h_,lightTargetDirection:y_,lightTargetPosition:m_,lightViewPosition:f_,lightingContext:Dp,lights:(e=[])=>(new __).setLights(e),linearDepth:tg,linearToneMapping:tT,localId:CT,log:bo,log2:xo,logarithmicDepthToViewZ:(e,t,r)=>{const s=e.mul(bo(r.div(t)));return fn(Math.E).pow(s).mul(t).negate()},luminance:Wx,mat2:Fn,mat3:Ln,mat4:Pn,matcapUV:Xf,materialAO:tp,materialAlphaTest:xh,materialAnisotropy:Oh,materialAnisotropyVector:rp,materialAttenuationColor:qh,materialAttenuationDistance:Hh,materialClearcoat:Fh,materialClearcoatNormal:Ph,materialClearcoatRoughness:Lh,materialColor:Th,materialDispersion:Jh,materialEmissive:vh,materialEnvIntensity:_c,materialEnvRotation:vc,materialIOR:Wh,materialIridescence:Vh,materialIridescenceIOR:kh,materialIridescenceThickness:Gh,materialLightMap:ep,materialLineDashOffset:Yh,materialLineDashSize:Xh,materialLineGapSize:Kh,materialLineScale:jh,materialLineWidth:Qh,materialMetalness:Mh,materialNormal:Bh,materialOpacity:Nh,materialPointSize:Zh,materialReference:Uc,materialReflectivity:wh,materialRefractionRatio:Tc,materialRotation:Dh,materialRoughness:Ch,materialSheen:Uh,materialSheenRoughness:Ih,materialShininess:_h,materialSpecular:Sh,materialSpecularColor:Ah,materialSpecularIntensity:Rh,materialSpecularStrength:Eh,materialThickness:$h,materialTransmission:zh,max:jo,maxMipLevel:Ml,mediumpModelViewMatrix:Wd,metalness:Wn,min:qo,mix:ou,mixElement:gu,mod:Ua,modInt:so,modelDirection:Dd,modelNormalMatrix:Gd,modelPosition:Id,modelRadius:kd,modelScale:Od,modelViewMatrix:$d,modelViewPosition:Vd,modelViewProjection:sp,modelWorldMatrix:Ud,modelWorldMatrixInverse:zd,morphReference:Bp,mrt:lb,mul:Pa,mx_aastep:iN,mx_add:(e,t=fn(0))=>Fa(e,t),mx_atan2:(e=fn(0),t=fn(1))=>Bo(e,t),mx_cell_noise_float:(e=Al())=>kv(e.convert("vec2|vec3")),mx_contrast:(e,t=1,r=.5)=>fn(e).sub(r).mul(t).add(r),mx_divide:(e,t=fn(1))=>Da(e,t),mx_fractal_noise_float:(e=Al(),t=3,r=2,s=.5,i=1)=>zv(e,yn(t),r,s).mul(i),mx_fractal_noise_vec2:(e=Al(),t=3,r=2,s=.5,i=1)=>Wv(e,yn(t),r,s).mul(i),mx_fractal_noise_vec3:(e=Al(),t=3,r=2,s=.5,i=1)=>$v(e,yn(t),r,s).mul(i),mx_fractal_noise_vec4:(e=Al(),t=3,r=2,s=.5,i=1)=>Hv(e,yn(t),r,s).mul(i),mx_frame:()=>Ub,mx_heighttonormal:(e,t)=>(e=Sn(e),t=fn(t),fh(e,t)),mx_hsvtorgb:tN,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=fn(1))=>La(t,e),mx_modulo:(e,t=fn(1))=>Ua(e,t),mx_multiply:(e,t=fn(1))=>Pa(e,t),mx_noise_float:(e=Al(),t=1,r=0)=>Ov(e.convert("vec2|vec3")).mul(t).add(r),mx_noise_vec3:(e=Al(),t=1,r=0)=>Vv(e.convert("vec2|vec3")).mul(t).add(r),mx_noise_vec4:(e=Al(),t=1,r=0)=>{e=e.convert("vec2|vec3");return wn(Vv(e),Ov(e.add(Tn(19,73)))).mul(t).add(r)},mx_place2d:(e,t=Tn(.5,.5),r=Tn(1,1),s=fn(0),i=Tn(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=Tn(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=fn(1))=>eu(e,t),mx_ramp4:(e,t,r,s,i=Al())=>{const n=i.x.clamp(),a=i.y.clamp(),o=ou(e,t,n),u=ou(r,s,n);return ou(o,u,a)},mx_ramplr:(e,t,r=Al())=>nN(e,t,r,"x"),mx_ramptb:(e,t,r=Al())=>nN(e,t,r,"y"),mx_rgbtohsv:rN,mx_rotate2d:(e,t)=>{e=Tn(e);const r=(t=fn(t)).mul(Math.PI/180);return Zf(e,r)},mx_rotate3d:(e,t,r)=>{e=Sn(e),t=fn(t),r=Sn(r);const s=t.mul(Math.PI/180),i=r.normalize(),n=s.cos(),a=s.sin(),o=fn(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=fn(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=Al())=>aN(e,t,r,s,"x"),mx_splittb:(e,t,r,s=Al())=>aN(e,t,r,s,"y"),mx_srgb_texture_to_lin_rec709:sN,mx_subtract:(e,t=fn(0))=>La(e,t),mx_timer:()=>Pb,mx_transform_uv:(e=1,t=0,r=Al())=>r.mul(e).add(t),mx_unifiednoise2d:(e,t=Al(),r=Tn(1,1),s=Tn(0,0),i=1,n=0,a=1,o=!1,u=1,l=2,d=.5)=>Jv(e,t.convert("vec2|vec3"),r,s,i,n,a,o,u,l,d),mx_unifiednoise3d:(e,t=Al(),r=Tn(1,1),s=Tn(0,0),i=1,n=0,a=1,o=!1,u=1,l=2,d=.5)=>eN(e,t.convert("vec2|vec3"),r,s,i,n,a,o,u,l,d),mx_worley_noise_float:(e=Al(),t=1)=>Qv(e.convert("vec2|vec3"),t,yn(1)),mx_worley_noise_vec2:(e=Al(),t=1)=>Yv(e.convert("vec2|vec3"),t,yn(1)),mx_worley_noise_vec3:(e=Al(),t=1)=>Zv(e.convert("vec2|vec3"),t,yn(1)),negate:Do,neutralToneMapping:dT,nodeArray:sn,nodeImmutable:an,nodeObject:en,nodeObjectIntent:tn,nodeObjects:rn,nodeProxy:nn,nodeProxyIntent:on,normalFlat:oc,normalGeometry:nc,normalLocal:ac,normalMap:hh,normalView:dc,normalViewGeometry:uc,normalWorld:cc,normalWorldGeometry:lc,normalize:So,not:Ha,notEqual:Oa,numWorkgroups:AT,objectDirection:wd,objectGroup:_a,objectPosition:Md,objectRadius:Ld,objectScale:Bd,objectViewPosition:Fd,objectWorldMatrix:Cd,oneMinus:Uo,or:Wa,orthographicDepthToViewZ:Xp,oscSawtooth:(e=Pb)=>e.fract(),oscSine:(e=Pb)=>e.add(.75).mul(2*Math.PI).sin().mul(.5).add(.5),oscSquare:(e=Pb)=>e.fract().round(),oscTriangle:(e=Pb)=>e.add(.5).fract().mul(2).sub(1).abs(),output:aa,outputStruct:sb,overloadingFn:Lb,packHalf2x16:Nb,packSnorm2x16:_b,packUnorm2x16:vb,parabola:xb,parallaxDirection:oh,parallaxUV:(e,t)=>e.sub(oh.mul(t)),parameter:(e,t)=>new Yy(e,t),pass:(e,t,r)=>new Jx(Jx.COLOR,e,t,r),passTexture:(e,t)=>new Yx(e,t),pcurve:(e,t,r)=>eu(Da(eu(e,t),Fa(eu(e,t),eu(La(1,e),r))),1/t),perspectiveDepthToViewZ:Yp,pmremTexture:Lf,pointShadow:uv,pointUV:Nx,pointWidth:la,positionGeometry:Xd,positionLocal:Kd,positionPrevious:Qd,positionView:Jd,positionViewDirection:ec,positionWorld:Yd,positionWorldDirection:Zd,posterize:qx,pow:eu,pow2:tu,pow3:ru,pow4:su,premultiplyAlpha:gg,property:On,quadBroadcast:l_,quadSwapDiagonal:s_,quadSwapX:t_,quadSwapY:r_,radians:go,rand:pu,range:NT,rangeFogFactor:fT,reciprocal:ko,reference:Lc,referenceBuffer:Pc,reflect:Ko,reflectVector:Rc,reflectView:Nc,reflector:e=>new sx(e),refract:du,refractVector:Ac,refractView:Sc,reinhardToneMapping:rT,remap:hl,remapClamp:pl,renderGroup:Ta,renderOutput:bl,rendererReference:ju,replaceDefaultUV:function(e,t=null){return vu(t,{getUV:"function"==typeof e?e:()=>e})},rotate:Zf,rotateUV:Ib,roughness:$n,round:Vo,rtt:cx,sRGBTransferEOTF:Ou,sRGBTransferOETF:Vu,sample:(e,t=null)=>new yx(e,en(t)),sampler:e=>(!0===e.isNode?e:Dl(e)).convert("sampler"),samplerComparison:e=>(!0===e.isNode?e:Dl(e)).convert("samplerComparison"),saturate:lu,saturation:Gx,screenCoordinate:Ql,screenDPR:jl,screenSize:Kl,screenUV:Xl,select:Tu,setCurrentStack:cn,setName:Su,shaderStages:ai,shadow:K_,shadowPositionWorld:N_,shapeCircle:gv,sharedUniformGroup:ba,sheen:jn,sheenRoughness:Xn,shiftLeft:Ya,shiftRight:Za,shininess:na,sign:Lo,sin:Ao,sinc:(e,t)=>Ao(oo.mul(t.mul(e).sub(1))).div(oo.mul(t.mul(e).sub(1))),skinning:Np,smoothstep:cu,smoothstepElement:mu,specularColor:ra,specularColorBlended:sa,specularF90:ia,spherizeUV:Ob,split:(e,t)=>new fi(en(e),t),spritesheetUV:Gb,sqrt:To,stack:Jy,step:Xo,stepElement:fu,storage:op,storageBarrier:()=>FT("storage").toStack(),storageTexture:Mx,string:(e="")=>new _i(e,"string"),struct:(e,t=null)=>{const r=new eb(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;eLx(e,t).level(r),texture3DLoad:(...e)=>Lx(...e).setSampler(!1),textureBarrier:()=>FT("texture").toStack(),textureBicubic:Am,textureBicubicLevel:Rm,textureCubeUV:sf,textureLevel:(e,t,r)=>Dl(e,t).level(r),textureLoad:Ul,textureSize:wl,textureStore:(e,t,r)=>{let s;return!0===e.isStorageTextureNode?(s=e.clone(),s.uvNode=t,s.storeNode=r):s=Mx(e,t,r),null!==r&&s.toStack(),s},thickness:ha,time:Pb,toneMapping:Ku,toneMappingExposure:Qu,toonOutlinePass:(t,r,s=new e(0,0,0),i=.003,n=1)=>new eT(t,r,en(s),en(i),en(n)),transformDirection:iu,transformNormal:pc,transformNormalToView:gc,transformedClearcoatNormalView:yc,transformedNormalView:mc,transformedNormalWorld:fc,transmission:ca,transpose:$o,triNoise3D:Mb,triplanarTexture:(...e)=>zb(...e),triplanarTextures:zb,trunc:Go,uint:bn,uintBitsToFloat:e=>new db(e,"float","uint"),uniform:Na,uniformArray:Gl,uniformCubeTexture:(e=Ec)=>Cc(e),uniformFlow:Nu,uniformGroup:ya,uniformTexture:(e=Fl)=>Dl(e),unpackHalf2x16:Eb,unpackNormal:dh,unpackSnorm2x16:Rb,unpackUnorm2x16:Ab,unpremultiplyAlpha:mg,userData:(e,t,r)=>new Px(e,t,r),uv:Al,uvec2:vn,uvec3:An,uvec4:Mn,varying:Uu,varyingProperty:Vn,vec2:Tn,vec3:Sn,vec4:wn,vectorComponents:oi,velocity:Vx,vertexColor:ug,vertexIndex:lp,vertexStage:Iu,vibrance:zx,viewZToLogarithmicDepth:Zp,viewZToOrthographicDepth:jp,viewZToPerspectiveDepth:Kp,viewZToReversedOrthographicDepth:(e,t,r)=>e.add(r).div(r.sub(t)),viewZToReversedPerspectiveDepth:Qp,viewport:Yl,viewportCoordinate:Jl,viewportDepthTexture:Hp,viewportLinearDepth:rg,viewportMipTexture:kp,viewportOpaqueMipTexture:zp,viewportResolution:td,viewportSafeUV:kb,viewportSharedTexture:Kx,viewportSize:Zl,viewportTexture:Vp,viewportUV:ed,vogelDiskSample:fx,wgsl:(e,t)=>hT(e,t,"wgsl"),wgslFn:(e,t)=>gT(e,t,"wgsl"),workgroupArray:(e,t)=>new PT("Workgroup",e,t),workgroupBarrier:()=>FT("workgroup").toStack(),workgroupId:ET,workingToColorSpace:zu,xor:qa});const dN=new Qy;class cN extends xy{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(dN),dN.a=s._clearColor.a;else if(!0===i.isColor)i.getRGB(dN),dN.a=1,n=!0;else if(!0===i.isNode){const u=this.get(e),l=i;dN.copy(s._clearColor);let d=u.backgroundMesh;if(void 0===d){const h=wn(l).mul(Ex).context({getUV:()=>wx.mul(lc),getTextureLevel:()=>Ax}),p=xd.element(3).element(3).equal(1),g=Da(1,xd.element(1).element(1)).mul(3),m=p.select(Kd.mul(g),Kd),f=$d.mul(wn(m,0));let y=xd.mul(wn(f.xyz,1));y=y.setZ(y.w);const b=new fg;function x(){i.removeEventListener("dispose",x),d.material.dispose(),d.geometry.dispose()}b.name="Background.material",b.side=L,b.depthTest=!1,b.depthWrite=!1,b.allowOverride=!1,b.fog=!1,b.lights=!1,b.vertexNode=y,b.colorNode=h,u.backgroundMeshNode=h,u.backgroundMesh=d=new ue(new mt(1,32,32),b),d.frustumCulled=!1,d.name="Background.mesh",i.addEventListener("dispose",x)}const c=l.getCacheKey();u.backgroundCacheKey!==c&&(u.backgroundMeshNode.node=wn(l).mul(Ex),u.backgroundMeshNode.needsUpdate=!0,d.material.needsUpdate=!0,u.backgroundCacheKey=c),t.unshift(d,d.geometry,d.material,0,0,null,null)}else o("Renderer: Unsupported background configuration.",i);const a=s.xr.getEnvironmentBlendMode();if("additive"===a?dN.set(0,0,0,1):"alpha-blend"===a&&dN.set(0,0,0,0),!0===s.autoClear||!0===n){const T=r.clearColorValue;T.r=dN.r,T.g=dN.g,T.b=dN.b,T.a=dN.a,!0!==s.backend.isWebGLBackend&&!0!==s.alpha||(T.r*=T.a,T.g*=T.a,T.b*=T.a),r.depthClearValue=s.getClearDepth(),r.stencilClearValue=s.getClearStencil(),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 hN=0;class pN{constructor(e="",t=[]){this.name=e,this.bindings=t,this.id=hN++}}class gN{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 pN(t.name,[]);e.push(r);for(const e of t.bindings)r.bindings.push(e.clone())}else e.push(t)}return e}}class mN{constructor(e,t,r=null){this.isNodeAttribute=!0,this.name=e,this.type=t,this.node=r}}class fN{constructor(e,t,r){this.isNodeUniform=!0,this.name=e,this.type=t,this.node=r}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 yN{constructor(e,t,r=!1,s=null){this.isNodeVar=!0,this.name=e,this.type=t,this.readOnly=r,this.count=s}}class bN extends yN{constructor(e,t,r=null,s=null){super(e,t),this.needsInterpolation=!1,this.isNodeVarying=!0,this.interpolationType=r,this.interpolationSampling=s}}class xN{constructor(e,t,r=""){this.name=e,this.type=t,this.code=r,Object.defineProperty(this,"isNodeCode",{value:!0})}}let TN=0;class _N{constructor(e=null){this.id=TN++,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 vN{constructor(e,t){this.name=e,this.members=t,this.output=!1}}class NN{constructor(e,t){this.name=e,this.value=t,this.boundary=0,this.itemSize=0,this.offset=0,this.index=-1}setValue(e){this.value=e}getValue(){return this.value}}class SN extends NN{constructor(e,t=0){super(e,t),this.isNumberUniform=!0,this.boundary=4,this.itemSize=1}}class RN extends NN{constructor(e,r=new t){super(e,r),this.isVector2Uniform=!0,this.boundary=8,this.itemSize=2}}class AN extends NN{constructor(e,t=new r){super(e,t),this.isVector3Uniform=!0,this.boundary=16,this.itemSize=3}}class EN extends NN{constructor(e,t=new s){super(e,t),this.isVector4Uniform=!0,this.boundary=16,this.itemSize=4}}class wN extends NN{constructor(t,r=new e){super(t,r),this.isColorUniform=!0,this.boundary=16,this.itemSize=3}}class CN extends NN{constructor(e,t=new i){super(e,t),this.isMatrix2Uniform=!0,this.boundary=8,this.itemSize=4}}class MN extends NN{constructor(e,t=new n){super(e,t),this.isMatrix3Uniform=!0,this.boundary=48,this.itemSize=12}}class BN extends NN{constructor(e,t=new a){super(e,t),this.isMatrix4Uniform=!0,this.boundary=64,this.itemSize=16}}class FN extends SN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class LN extends RN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class PN extends AN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class DN extends EN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class UN extends wN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class IN extends CN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class ON extends MN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class VN extends BN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}let kN=0;const GN=new WeakMap,zN=new WeakMap,$N=new Map([[Int8Array,"int"],[Int16Array,"int"],[Int32Array,"int"],[Uint8Array,"uint"],[Uint16Array,"uint"],[Uint32Array,"uint"],[Float32Array,"float"]]),WN=e=>/e/g.test(e)?String(e).replace(/\+/g,""):(e=Number(e))+(e%1?"":".0");class HN{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.types={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=Jy(),this.stacks=[],this.tab="\t",this.currentFunctionNode=null,this.context={material:this.material},this.cache=new _N,this.globalCache=this.cache,this.flowsData=new WeakMap,this.shaderStage=null,this.buildStage=null,this.subBuildLayers=[],this.activeStacks=[],this.subBuildFn=null,this.fnCall=null,Object.defineProperty(this,"id",{value:kN++})}isFlatShading(){return!0===this.material.flatShading||!1===this.geometry.hasAttribute("normal")}isOpaque(){const e=this.material;return!1===e.transparent&&e.blending===et&&!1===e.alphaToCoverage}createRenderTarget(e,t,r){return new ae(e,t,r)}createCubeRenderTarget(e,t){return new Ag(e,t)}includes(e){return this.nodes.includes(e)}getOutputStructName(){}_getBindGroup(e,t){const r=t[0].groupNode;let s,i=r.shared;if(i)for(let e=1;ee.nodeUniform.node.id-t.nodeUniform.node.id);for(const t of e.uniforms)r+=t.nodeUniform.node.id}else r+=e.nodeUniform.id;const i=this.renderer._currentRenderContext||this.renderer;let n=GN.get(i);void 0===n&&(n=new Map,GN.set(i,n));const a=Os(r);s=n.get(a),void 0===s&&(s=new pN(e,t),n.set(a,s))}else s=new pN(e,t);return s}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 ai)for(const s in r[e]){const i=r[e][s],n=t[s]||(t[s]=[]);for(const e of i)!1===n.includes(e)&&n.push(e)}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")}( ${WN(n.r)}, ${WN(n.g)}, ${WN(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 mN(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===R)return"int";if(t===S)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=$s(e);const s="float"===t?"":t[0];return!0===/mat2/.test(t)&&(r=r.replace("vec","mat")),s+r}getTypeFromArray(e){return $N.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 bt||!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")}setActiveStack(e){this.activeStacks.push(e)}removeActiveStack(e){if(this.activeStacks[this.activeStacks.length-1]!==e)throw new Error("NodeBuilder: Invalid active stack removal.");this.activeStacks.pop()}getActiveStack(){return this.activeStacks[this.activeStacks.length-1]}getBaseStack(){return this.activeStacks[0]}addStack(){this.stack=Jy(this.stack);const e=hn();return this.stacks.push(e),cn(this.stack),this.stack}removeStack(){const e=this.stack;for(const t of e.nodes){this.getDataFromNode(t).stack=e}return this.stack=e.parent,cn(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,"vertex");let s=r.bufferAttribute;if(void 0===s){const i=this.uniforms.index++;s=new mN("nodeAttribute"+i,t,e),this.bufferAttributes.push(s),r.bufferAttribute=s}return s}getStructTypeNode(e,t=this.shaderStage){return this.types[t][e]||null}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 a=this.structs.index++;null===r&&(r="StructType"+a),n=new vN(r,t),this.structs[s].push(n),this.types[s][r]=e,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 fN(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 yN(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 bN(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,d(`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 xN("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 pT,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 Yy(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 _N,this.stack=Jy();for(const r of ni)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(){d("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(){d("Abstract function.")}getVaryings(){d("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(){d("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(){d("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&&(o(`NodeMaterial: Material "${t.type}" is not compatible.`),e=new fg),e.build(this)}else this.addFlow("compute",e);for(const e of ni){this.setBuildStage(e),this.context.position&&this.context.position.isNode&&this.flowNodeFromShaderStage("vertex",this.context.position);for(const t of ai){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}async buildAsync(){const{object:e,material:t,renderer:r}=this;if(null!==t){let e=r.library.fromMaterial(t);null===e&&(o(`NodeMaterial: Material "${t.type}" is not compatible.`),e=new fg),e.build(this)}else this.addFlow("compute",e);for(const e of ni){this.setBuildStage(e),this.context.position&&this.context.position.isNode&&this.flowNodeFromShaderStage("vertex",this.context.position);for(const t of ai){this.setShaderStage(t);const r=this.flowNodes[t];for(const t of r)"generate"===e?this.flowNode(t):t.build(this);await xt()}}return this.setBuildStage(null),this.setShaderStage(null),this.buildCode(),this.buildUpdateNodes(),this}getSharedDataFromNode(e){let t=zN.get(e);return void 0===t&&(t={}),t}getNodeUniform(e,t){const r=this.getSharedDataFromNode(e);let s=r.cache;if(void 0===s){if("float"===t||"int"===t||"uint"===t)s=new FN(e);else if("vec2"===t||"ivec2"===t||"uvec2"===t)s=new LN(e);else if("vec3"===t||"ivec3"===t||"uvec3"===t)s=new PN(e);else if("vec4"===t||"ivec4"===t||"uvec4"===t)s=new DN(e);else if("color"===t)s=new UN(e);else if("mat2"===t)s=new IN(e);else if("mat3"===t)s=new ON(e);else{if("mat4"!==t)throw new Error(`Uniform "${t}" not implemented.`);s=new VN(e)}r.cache=s}return s}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${Tt} - Node System\n`}needsPreviousData(){const e=this.renderer.getMRT();return e&&e.has("velocity")||!0===Qs(this.object).useVelocity}}class qN{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={renderId:0,frameId:0},e.set(t,r)),r}updateBeforeNode(e){const t=e.getUpdateBeforeType(),r=e.updateReference(this);if(t===ti.FRAME){const t=this._getMaps(this.updateBeforeMap,r);if(t.frameId!==this.frameId){const r=t.frameId;t.frameId=this.frameId,!1===e.updateBefore(this)&&(t.frameId=r)}}else if(t===ti.RENDER){const t=this._getMaps(this.updateBeforeMap,r);if(t.renderId!==this.renderId){const r=t.renderId;t.renderId=this.renderId,!1===e.updateBefore(this)&&(t.renderId=r)}}else t===ti.OBJECT&&e.updateBefore(this)}updateAfterNode(e){const t=e.getUpdateAfterType(),r=e.updateReference(this);if(t===ti.FRAME){const t=this._getMaps(this.updateAfterMap,r);t.frameId!==this.frameId&&!1!==e.updateAfter(this)&&(t.frameId=this.frameId)}else if(t===ti.RENDER){const t=this._getMaps(this.updateAfterMap,r);t.renderId!==this.renderId&&!1!==e.updateAfter(this)&&(t.renderId=this.renderId)}else t===ti.OBJECT&&e.updateAfter(this)}updateNode(e){const t=e.getUpdateType(),r=e.updateReference(this);if(t===ti.FRAME){const t=this._getMaps(this.updateMap,r);t.frameId!==this.frameId&&!1!==e.update(this)&&(t.frameId=this.frameId)}else if(t===ti.RENDER){const t=this._getMaps(this.updateMap,r);t.renderId!==this.renderId&&!1!==e.update(this)&&(t.renderId=this.renderId)}else t===ti.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 jN{constructor(e,t,r=null,s="",i=!1){this.type=e,this.name=t,this.count=r,this.qualifier=s,this.isConst=i}}jN.isNodeFunctionInput=!0;class XN extends lv{static get type(){return"AmbientLightNode"}constructor(e=null){super(e)}setup({context:e}){e.irradiance.addAssign(this.colorNode)}}class KN extends lv{static get type(){return"DirectionalLightNode"}constructor(e=null){super(e)}setupDirect(){const e=this.colorNode;return{lightDirection:y_(this.light),lightColor:e}}}class QN extends lv{static get type(){return"HemisphereLightNode"}constructor(t=null){super(t),this.lightPositionNode=g_(t),this.lightDirectionNode=this.lightPositionNode.normalize(),this.groundColorNode=Na(new e).setGroup(Ta)}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=cc.dot(s).mul(.5).add(.5),n=ou(r,t,i);e.context.irradiance.addAssign(n)}}class YN extends lv{static get type(){return"SpotLightNode"}constructor(e=null){super(e),this.coneCosNode=Na(0).setGroup(Ta),this.penumbraCosNode=Na(0).setGroup(Ta),this.cutoffDistanceNode=Na(0).setGroup(Ta),this.decayExponentNode=Na(0).setGroup(Ta),this.colorNode=Na(this.color).setGroup(Ta)}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 cu(r,s,t)}getLightCoord(e){const t=e.getNodeProperties(this);let r=t.projectionUV;return void 0===r&&(r=p_(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(y_(i)),u=this.getSpotAttenuation(e,o),l=n.length(),d=dv({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=Dl(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 ZN extends YN{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=Dl(r,Tn(e,0),0).r}else s=super.getSpotAttenuation(t);return s}}class JN extends lv{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=Gl(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=uN(cc,this.lightProbe);e.context.irradiance.addAssign(t)}}const eS=dn(([e,t])=>{const r=e.abs().sub(t);return Po(jo(r,0)).add(qo(jo(r.x,r.y),0))});class tS extends YN{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=fn(0),r=this.penumbraCosNode,s=h_(this.light).mul(e.context.positionWorld||Yd);return pn(s.w.greaterThan(0),()=>{const e=s.xyz.div(s.w),i=eS(e.xy.sub(Tn(.5)),Tn(.5)),n=Da(-1,La(1,Mo(r)).sub(1));t.assign(lu(i.mul(-2).mul(n)))}),t}}const rS=new a,sS=new a;let iS=null;class nS extends lv{static get type(){return"RectAreaLightNode"}constructor(e=null){super(e),this.halfHeight=Na(new r).setGroup(Ta),this.halfWidth=Na(new r).setGroup(Ta),this.updateType=ti.RENDER}update(e){super.update(e);const{light:t}=this,r=e.camera.matrixWorldInverse;sS.identity(),rS.copy(t.matrixWorld),rS.premultiply(r),sS.extractRotation(rS),this.halfWidth.value.set(.5*t.width,0,0),this.halfHeight.value.set(0,.5*t.height,0),this.halfWidth.value.applyMatrix4(sS),this.halfHeight.value.applyMatrix4(sS)}setupDirectRectArea(e){let t,r;e.isAvailable("float32Filterable")?(t=Dl(iS.LTC_FLOAT_1),r=Dl(iS.LTC_FLOAT_2)):(t=Dl(iS.LTC_HALF_1),r=Dl(iS.LTC_HALF_2));const{colorNode:s,light:i}=this;return{lightColor:s,lightPosition:f_(i),halfWidth:this.halfWidth,halfHeight:this.halfHeight,ltc_1:t,ltc_2:r}}static setLTC(e){iS=e}}class aS{parseFunction(){d("Abstract function.")}}class oS{constructor(e,t,r="",s=""){this.type=e,this.inputs=t,this.name=r,this.precision=s}getCode(){d("Abstract function.")}}oS.isNodeFunction=!0;const uS=/^\s*(highp|mediump|lowp)?\s*([a-z_0-9]+)\s*([a-z_0-9]+)?\s*\(([\s\S]*?)\)/i,lS=/[a-z_0-9]+/gi,dS="#pragma main";class cS extends oS{constructor(e){const{type:t,inputs:r,name:s,precision:i,inputsCode:n,blockCode:a,headerCode:o}=(e=>{const t=(e=e.trim()).indexOf(dS),r=-1!==t?e.slice(t+12):e,s=r.match(uS);if(null!==s&&5===s.length){const i=s[4],n=[];let a=null;for(;null!==(a=lS.exec(i));)n.push(a);const o=[];let u=0;for(;u{let r=this._createNodeBuilder(e,e.material);try{t?await r.buildAsync():r.build()}catch(s){r=this._createNodeBuilder(e,new fg),t?await r.buildAsync():r.build(),o("TSL: "+s)}return r})().then(e=>(s=this._createNodeBuilderState(e),i.set(n,s),s.usedTimes++,r.nodeBuilderState=s,s));{let t=this._createNodeBuilder(e,e.material);try{t.build()}catch(r){t=this._createNodeBuilder(e,new fg),t.build();let s=r.stackTrace;!s&&r.stack&&(s=new Us(r.stack)),o("TSL: "+r,s)}s=this._createNodeBuilderState(t),i.set(n,s)}}s.usedTimes++,r.nodeBuilderState=s}return s}getForRenderAsync(e){const t=this.getForRender(e,!0);return t.then?t:Promise.resolve(t)}getForRenderDeferred(e){const t=this.get(e);if(void 0!==t.nodeBuilderState)return t.nodeBuilderState;const r=this.getForRenderCacheKey(e),s=this.nodeBuilderCache.get(r);return void 0!==s?(s.usedTimes++,t.nodeBuilderState=s,s):(!0!==t.pendingBuild&&(t.pendingBuild=!0,this._buildQueue.push(()=>this.getForRenderAsync(e).then(()=>{t.pendingBuild=!1})),this._processBuildQueue()),null)}_processBuildQueue(){if(this._buildInProgress||0===this._buildQueue.length)return;this._buildInProgress=!0;this._buildQueue.shift()().then(()=>{this._buildInProgress=!1,this._processBuildQueue()})}delete(e){if(e.isRenderObject){const t=this.get(e).nodeBuilderState;void 0!==t&&(t.usedTimes--,0===t.usedTimes&&this.nodeBuilderCache.delete(this.getForRenderCacheKey(e)))}return super.delete(e)}getForCompute(e){const t=this.get(e);let r=t.nodeBuilderState;if(void 0===r){const s=this.backend.createNodeBuilder(e,this.renderer);s.build(),r=this._createNodeBuilderState(s),t.nodeBuilderState=r}return r}_createNodeBuilderState(e){return new gN(e.vertexShader,e.fragmentShader,e.computeShader,e.getAttributesArray(),e.getBindings(),e.updateNodes,e.updateBeforeNodes,e.updateAfterNodes,e.observer,e.transforms)}getEnvironmentNode(e){this.updateEnvironment(e);let t=null;if(e.environmentNode&&e.environmentNode.isNode)t=e.environmentNode;else{const r=this.get(e);r.environmentNode&&(t=r.environmentNode)}return t}getBackgroundNode(e){this.updateBackground(e);let t=null;if(e.backgroundNode&&e.backgroundNode.isNode)t=e.backgroundNode;else{const r=this.get(e);r.backgroundNode&&(t=r.backgroundNode)}return t}getFogNode(e){return this.updateFog(e),e.fogNode||this.get(e).fogNode||null}getCacheKey(e,t){gS[0]=e,gS[1]=t;const r=this.renderer.info.calls,s=this.callHashCache.get(gS)||{};if(s.callId!==r){const i=this.getEnvironmentNode(e),n=this.getFogNode(e);t&&mS.push(t.getCacheKey(!0)),i&&mS.push(i.getCacheKey()),n&&mS.push(n.getCacheKey()),mS.push(this.renderer.getOutputRenderTarget()&&this.renderer.getOutputRenderTarget().multiview?1:0),mS.push(this.renderer.shadowMap.enabled?1:0),mS.push(this.renderer.shadowMap.type),s.callId=r,s.cacheKey=Vs(mS),this.callHashCache.set(gS,s),mS.length=0}return gS[0]=null,gS[1]=null,s.cacheKey}get isToneMappingState(){return!this.renderer.getRenderTarget()}updateBackground(e){const t=this.get(e),r=e.background;if(r){const s=0===e.backgroundBlurriness&&t.backgroundBlurriness>0||e.backgroundBlurriness>0&&0===t.backgroundBlurriness;if(t.background!==r||s){const i=this.getCacheNode("background",r,()=>{if(!0===r.isCubeTexture||r.mapping===he||r.mapping===pe||r.mapping===we){if(e.backgroundBlurriness>0||r.mapping===we)return Lf(r);{let e;return e=!0===r.isCubeTexture?Mc(r):Dl(r),Bg(e)}}if(!0===r.isTexture)return Dl(r,Xl.flipY()).setUpdateMatrix(!0);!0!==r.isColor&&o("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=Lc("color","color",r).setGroup(Ta),t=Lc("density","float",r).setGroup(Ta);return xT(e,yT(t))}if(r.isFog){const e=Lc("color","color",r).setGroup(Ta),t=Lc("near","float",r).setGroup(Ta),s=Lc("far","float",r).setGroup(Ta);return xT(e,fT(t,s))}o("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?Mc(r):!0===r.isTexture?Dl(r):void o("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 pS.get(e)!==this.getOutputCacheKey()}getOutputNode(e){const t=this.renderer,r=this.getOutputCacheKey(),s=e.isArrayTexture?Dl(e,Xl).depth($l("gl_ViewID_OVR")).renderOutput(t.toneMapping,t.currentColorSpace):Dl(e,Xl).renderOutput(t.toneMapping,t.currentColorSpace);return pS.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 qN,this.nodeBuilderCache=new Map,this.cacheLib={}}}const yS=new ot;class bS{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;ibl(e,i.toneMapping,i.outputColorSpace)}),CS.set(r,n))}else n=r;i.contextNode=n,i.setRenderTarget(t.renderTarget),t.rendercall(),i.contextNode=r}i.setRenderTarget(o),i._setXRLayerSize(a.x,a.y),this.isPresenting=n}getSession(){return this._session}async setSession(e){const t=this._renderer,r=t.backend;this._gl=t.getContext();const s=this._gl,i=s.getContextAttributes();if(this._session=e,null!==e){if(!0===r.isWebGPUBackend)throw new Error('THREE.XRManager: XR is currently not supported with a WebGPU backend. Use WebGL by passing "{ forceWebGL: true }" to the constructor of the renderer.');if(e.addEventListener("select",this._onSessionEvent),e.addEventListener("selectstart",this._onSessionEvent),e.addEventListener("selectend",this._onSessionEvent),e.addEventListener("squeeze",this._onSessionEvent),e.addEventListener("squeezestart",this._onSessionEvent),e.addEventListener("squeezeend",this._onSessionEvent),e.addEventListener("end",this._onSessionEnd),e.addEventListener("inputsourceschange",this._onInputSourcesChange),await r.makeXRCompatible(),this._currentPixelRatio=t.getPixelRatio(),t.getSize(this._currentSize),this._currentAnimationContext=t._animation.getContext(),this._currentAnimationLoop=t._animation.getAnimationLoop(),t._animation.stop(),!0===this._supportsLayers){let r=null,n=null,a=null;t.depth&&(a=t.stencil?s.DEPTH24_STENCIL8:s.DEPTH_COMPONENT24,r=t.stencil?je:qe,n=t.stencil?Ye:S);const o={colorFormat:s.RGBA8,depthFormat:a,scaleFactor:this._framebufferScaleFactor,clearOnAccess:!1};this._useMultiviewIfPossible&&t.hasFeature("OVR_multiview2")&&(o.textureType="texture-array",this._useMultiview=!0),this._glBinding=this.getBinding();const u=this._glBinding.createProjectionLayer(o),l=[u];this._glProjLayer=u,t.setPixelRatio(1),t._setXRLayerSize(u.textureWidth,u.textureHeight);const d=this._useMultiview?2:1,c=new J(u.textureWidth,u.textureHeight,n,void 0,void 0,void 0,void 0,void 0,void 0,r,d);if(this._xrRenderTarget=new AS(u.textureWidth,u.textureHeight,{format:Ee,type:ke,colorSpace:t.outputColorSpace,depthTexture:c,stencilBuffer:t.stencil,samples:i.antialias?4:0,resolveDepthBuffer:!1===u.ignoreDepthValues,resolveStencilBuffer:!1===u.ignoreDepthValues,depth:this._useMultiview?2:1,multiview:this._useMultiview}),this._xrRenderTarget._hasExternalTextures=!0,this._xrRenderTarget.depth=this._useMultiview?2:1,this._sessionUsesLayers=e.enabledFeatures.includes("layers"),this._referenceSpace=await e.requestReferenceSpace(this.getReferenceSpaceType()),this._sessionUsesLayers)for(const e of this._layers)e.plane.material=new ye({color:16777215,side:"cylinder"===e.type?L:Nt}),e.plane.material.blending=St,e.plane.material.blendEquation=st,e.plane.material.blendSrc=Rt,e.plane.material.blendDst=Rt,e.xrlayer=this._createXRLayer(e),l.unshift(e.xrlayer);e.updateRenderState({layers:l})}else{const r={antialias:t.currentSamples>0,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 AS(i.framebufferWidth,i.framebufferHeight,{format:Ee,type:ke,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=-5&i.layers.mask,a.layers.mask=-3&i.layers.mask;const o=e.parent,u=i.cameras;BS(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 DS(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 US(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(this._renderTarget,this._mrt),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(){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 fS(this,r),this._animation=new py(this,this._nodes,this.info),this._attributes=new Ry(r,this.info),this._background=new cN(this,this._nodes),this._geometries=new Cy(this._attributes,this.info),this._textures=new Ky(this,r,this.info),this._pipelines=new Uy(r,this._nodes,this.info),this._bindings=new Iy(r,this._nodes,this._textures,this._attributes,this._pipelines,this.info),this._objects=new by(this,this._nodes,this._geometries,this._pipelines,this._bindings,this.info),this._renderLists=new $y(this.lighting),this._bundles=new _S,this._renderContexts=new jy(this),this._animation.start(),this._initialized=!0,this._inspector.init(),e(this)})),this._initPromise}get domElement(){return this._canvasTarget.domElement}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._handleObjectFunction,u=this._compilationPromises;null===r&&(r=e);const l=!0===e.isScene?e:!0===r.isScene?r:OS,d=this.needsFrameBufferTarget&&null===this._renderTarget?this._getFrameBufferTarget():this._renderTarget||this._outputRenderTarget,c=this._renderContexts.get(d,this._mrt),h=this._activeMipmapLevel,p=[];this._currentRenderContext=c,this._currentRenderObjectFunction=this.renderObject,this._handleObjectFunction=this._createObjectPipeline,this._compilationPromises=p,s.renderId++,s.update(),c.depth=this.depth,c.stencil=this.stencil,c.clippingContext||(c.clippingContext=new bS),c.clippingContext.updateGlobal(l,t),l.onBeforeRender(this,e,t,d);const g=this._renderLists.get(l,t);if(g.begin(),this._projectObject(e,t,0,g,c.clippingContext),r!==e&&r.traverseVisible(function(e){e.isLight&&e.layers.test(t.layers)&&g.pushLight(e)}),g.finish(),null!==d){this._textures.updateRenderTarget(d,h);const e=this._textures.get(d);c.textures=e.textures,c.depthTexture=e.depthTexture}else c.textures=null,c.depthTexture=null;r!==e?this._background.update(r,g,c):this._background.update(l,g,c);const m=g.opaque,f=g.transparent,y=g.transparentDoublePass,b=g.lightsNode;!0===this.opaque&&m.length>0&&this._renderObjects(m,t,l,b),!0===this.transparent&&f.length>0&&this._renderTransparents(f,y,t,l,b),s.renderId=i,this._currentRenderContext=n,this._currentRenderObjectFunction=a,this._handleObjectFunction=o,this._compilationPromises=u;for(const e of p){const t=this._objects.get(e.object,e.material,e.scene,e.camera,e.lightsNode,e.renderContext,e.clippingContext,e.passId);t.drawRange=e.object.geometry.drawRange,t.group=e.group,this._geometries.updateForRender(t),await this._nodes.getForRenderAsync(t),this._nodes.updateBefore(t),this._nodes.updateForRender(t),this._bindings.updateForRender(t);const r=[];this._pipelines.getForRender(t,r),r.length>0&&await Promise.all(r),this._nodes.updateAfter(t),await xt()}}async renderAsync(e,t){v('Renderer: "renderAsync()" has been deprecated. Use "render()" and "await renderer.init();" when creating the renderer.'),await this.init(),this.render(e,t)}async waitForGPU(){o("Renderer: waitForGPU() has been removed. Read https://github.com/mrdoob/three.js/issues/32012 for more information.")}set inspector(e){null!==this._inspector&&this._inspector.setRenderer(null),this._inspector=e,this._inspector.setRenderer(this)}get inspector(){return this._inspector}set highPrecision(e){const t=this.contextNode.value;!0===e?(t.modelViewMatrix=Hd,t.modelNormalViewMatrix=qd):this.highPrecision&&(delete t.modelViewMatrix,delete t.modelNormalViewMatrix)}get highPrecision(){const e=this.contextNode.value;return e.modelViewMatrix===Hd&&e.modelNormalViewMatrix===qd}setMRT(e){return this._mrt=e,this}getMRT(){return this._mrt}getOutputBufferType(){return this._outputBufferType}getColorBufferType(){return v('Renderer: ".getColorBufferType()" has been renamed to ".getOutputBufferType()".'),this.getOutputBufferType()}_onDeviceLost(e){let t=`THREE.WebGPURenderer: ${e.api} Device Lost:\n\nMessage: ${e.message}`;e.reason&&(t+=`\nReason: ${e.reason}`),o(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{u.removeEventListener("dispose",e),l.dispose(),this._frameBufferTargets.delete(u)};u.addEventListener("dispose",e),this._frameBufferTargets.set(u,l)}const d=this.getOutputRenderTarget();l.depthBuffer=a,l.stencilBuffer=o,null!==d?l.setSize(d.width,d.height,d.depth):l.setSize(i,n,1);const c=this._outputRenderTarget?this._outputRenderTarget.viewport:u._viewport,h=this._outputRenderTarget?this._outputRenderTarget.scissor:u._scissor,g=this._outputRenderTarget?1:u._pixelRatio,f=this._outputRenderTarget?this._outputRenderTarget.scissorTest:u._scissorTest;return l.viewport.copy(c),l.scissor.copy(h),l.viewport.multiplyScalar(g),l.scissor.multiplyScalar(g),l.scissorTest=f,l.multiview=null!==d&&d.multiview,l.resolveDepthBuffer=null===d||d.resolveDepthBuffer,l._autoAllocateDepthBuffer=null!==d&&d._autoAllocateDepthBuffer,l}_renderScene(e,t,r=!0){if(!0===this._isDeviceLost)return;const s=r?this._getFrameBufferTarget():null,i=this._nodes.nodeFrame,n=i.renderId,a=this._currentRenderContext,o=this._currentRenderObjectFunction,u=this._handleObjectFunction;this._callDepth++;const l=!0===e.isScene?e:OS,d=this._renderTarget||this._outputRenderTarget,c=this._activeCubeFace,h=this._activeMipmapLevel;let p;null!==s?(p=s,this.setRenderTarget(p)):p=d;const g=this._renderContexts.get(p,this._mrt,this._callDepth);this._currentRenderContext=g,this._currentRenderObjectFunction=this._renderObjectFunction||this.renderObject,this._handleObjectFunction=this._renderObjectDirect,this.info.calls++,this.info.render.calls++,this.info.render.frameCalls++,i.renderId=this.info.calls,this.backend.updateTimeStampUID(g),this.inspector.beginRender(this.backend.getTimestampUID(g),e,t,p);const m=this.xr;if(!1===m.isPresenting){let e=!1;if(!0===this.reversedDepthBuffer&&!0!==t.reversedDepth){if(t._reversedDepth=!0,t.isArrayCamera)for(const e of t.cameras)e._reversedDepth=!0;e=!0}const r=this.coordinateSystem;if(t.coordinateSystem!==r){if(t.coordinateSystem=r,t.isArrayCamera)for(const e of t.cameras)e.coordinateSystem=r;e=!0}if(!0===e&&(t.updateProjectionMatrix(),t.isArrayCamera))for(const e of t.cameras)e.updateProjectionMatrix()}!0===e.matrixWorldAutoUpdate&&e.updateMatrixWorld(),null===t.parent&&!0===t.matrixWorldAutoUpdate&&t.updateMatrixWorld(),!0===m.enabled&&!0===m.isPresenting&&(!0===m.cameraAutoUpdate&&m.updateCamera(t),t=m.getCamera());const f=this._canvasTarget;let y=f._viewport,b=f._scissor,x=f._pixelRatio;null!==p&&(y=p.viewport,b=p.scissor,x=1),this.getDrawingBufferSize(VS),kS.set(0,0,VS.width,VS.height);const T=void 0===y.minDepth?0:y.minDepth,_=void 0===y.maxDepth?1:y.maxDepth;g.viewportValue.copy(y).multiplyScalar(x).floor(),g.viewportValue.width>>=h,g.viewportValue.height>>=h,g.viewportValue.minDepth=T,g.viewportValue.maxDepth=_,g.viewport=!1===g.viewportValue.equals(kS),g.scissorValue.copy(b).multiplyScalar(x).floor(),g.scissor=f._scissorTest&&!1===g.scissorValue.equals(kS),g.scissorValue.width>>=h,g.scissorValue.height>>=h,g.clippingContext||(g.clippingContext=new bS),g.clippingContext.updateGlobal(l,t),l.onBeforeRender(this,e,t,p);const v=t.isArrayCamera?zS:GS;t.isArrayCamera||($S.multiplyMatrices(t.projectionMatrix,t.matrixWorldInverse),v.setFromProjectionMatrix($S,t.coordinateSystem,t.reversedDepth));const N=this._renderLists.get(e,t);if(N.begin(),this._projectObject(e,t,0,N,g.clippingContext),N.finish(),!0===this.sortObjects&&N.sort(this._opaqueSort,this._transparentSort),null!==p){this._textures.updateRenderTarget(p,h);const e=this._textures.get(p);g.textures=e.textures,g.depthTexture=e.depthTexture,g.width=e.width,g.height=e.height,g.renderTarget=p,g.depth=p.depthBuffer,g.stencil=p.stencilBuffer}else g.textures=null,g.depthTexture=null,g.width=VS.width,g.height=VS.height,g.depth=this.depth,g.stencil=this.stencil;g.width>>=h,g.height>>=h,g.activeCubeFace=c,g.activeMipmapLevel=h,g.occlusionQueryCount=N.occlusionQueryCount,g.scissorValue.max(WS.set(0,0,0,0)),g.scissorValue.x+g.scissorValue.width>g.width&&(g.scissorValue.width=Math.max(g.width-g.scissorValue.x,0)),g.scissorValue.y+g.scissorValue.height>g.height&&(g.scissorValue.height=Math.max(g.height-g.scissorValue.y,0)),this._background.update(l,N,g),g.camera=t,this.backend.beginRender(g);const{bundles:S,lightsNode:R,transparentDoublePass:A,transparent:E,opaque:w}=N;return S.length>0&&this._renderBundles(S,l,R),!0===this.opaque&&w.length>0&&this._renderObjects(w,t,l,R),!0===this.transparent&&E.length>0&&this._renderTransparents(E,A,t,l,R),this.backend.finishRender(g),i.renderId=n,this._currentRenderContext=a,this._currentRenderObjectFunction=o,this._handleObjectFunction=u,this._callDepth--,null!==s&&(this.setRenderTarget(d,c,h),this._renderOutput(p)),l.onAfterRender(this,e,t,p),this.inspector.finishRender(this.backend.getTimestampUID(g)),g}_setXRLayerSize(e,t){this._canvasTarget._width=e,this._canvasTarget._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.capabilities.getMaxAnisotropy()}getActiveCubeFace(){return this._activeCubeFace}getActiveMipmapLevel(){return this._activeMipmapLevel}async setAnimationLoop(e){!1===this._initialized&&await this.init(),this._animation.setAnimationLoop(e)}getAnimationLoop(){return this._animation.getAnimationLoop()}async getArrayBufferAsync(e){return await this.backend.getArrayBufferAsync(e)}getContext(){return this.backend.getContext()}getPixelRatio(){return this._canvasTarget.getPixelRatio()}getDrawingBufferSize(e){return this._canvasTarget.getDrawingBufferSize(e)}getSize(e){return this._canvasTarget.getSize(e)}setPixelRatio(e=1){this._canvasTarget.setPixelRatio(e)}setDrawingBufferSize(e,t,r){this.xr&&this.xr.isPresenting||this._canvasTarget.setDrawingBufferSize(e,t,r)}setSize(e,t,r=!0){this.xr&&this.xr.isPresenting||this._canvasTarget.setSize(e,t,r)}setOpaqueSort(e){this._opaqueSort=e}setTransparentSort(e){this._transparentSort=e}getScissor(e){return this._canvasTarget.getScissor(e)}setScissor(e,t,r,s){this._canvasTarget.setScissor(e,t,r,s)}getScissorTest(){return this._canvasTarget.getScissorTest()}setScissorTest(e){this._canvasTarget.setScissorTest(e),this.backend.setScissorTest(e)}getViewport(e){return this._canvasTarget.getViewport(e)}setViewport(e,t,r,s,i=0,n=1){this._canvasTarget.setViewport(e,t,r,s,i,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!0===this.reversedDepthBuffer?1-this._clearDepth: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)throw new Error('Renderer: .clear() called before the backend is initialized. Use "await renderer.init();" before before using this method.');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.get(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;const t=this.backend.getClearColor();i.clearColorValue.r=t.r,i.clearColorValue.g=t.g,i.clearColorValue.b=t.b,i.clearColorValue.a=t.a,i.clearDepthValue=this.getClearDepth(),i.clearStencilValue=this.getClearStencil(),i.activeCubeFace=this.getActiveCubeFace(),i.activeMipmapLevel=this.getActiveMipmapLevel()}this.backend.clear(e,t,r,i),null!==s&&null===this._renderTarget&&this._renderOutput(s)}clearColor(){this.clear(!0,!1,!1)}clearDepth(){this.clear(!1,!0,!1)}clearStencil(){this.clear(!1,!1,!0)}async clearAsync(e=!0,t=!0,r=!0){v('Renderer: "clearAsync()" has been deprecated. Use "clear()" and "await renderer.init();" when creating the renderer.'),await this.init(),this.clear(e,t,r)}async clearColorAsync(){v('Renderer: "clearColorAsync()" has been deprecated. Use "clearColor()" and "await renderer.init();" when creating the renderer.'),this.clear(!0,!1,!1)}async clearDepthAsync(){v('Renderer: "clearDepthAsync()" has been deprecated. Use "clearDepth()" and "await renderer.init();" when creating the renderer.'),this.clear(!1,!0,!1)}async clearStencilAsync(){v('Renderer: "clearStencilAsync()" has been deprecated. Use "clearStencil()" and "await renderer.init();" when creating the renderer.'),this.clear(!1,!1,!0)}get needsFrameBufferTarget(){const e=this.currentToneMapping!==m,t=this.currentColorSpace!==p.workingColorSpace;return e||t}get samples(){return this._samples}get currentSamples(){let e=this._samples;return null!==this._renderTarget?e=this._renderTarget.samples:this.needsFrameBufferTarget&&(e=0),e}get currentToneMapping(){return this.isOutputTarget?this.toneMapping:m}get currentColorSpace(){return this.isOutputTarget?this.outputColorSpace:p.workingColorSpace}get isOutputTarget(){return this._renderTarget===this._outputRenderTarget||null===this._renderTarget}dispose(){if(!0===this._initialized){this.info.dispose(),this.backend.dispose(),this._animation.dispose(),this._objects.dispose(),this._geometries.dispose(),this._pipelines.dispose(),this._nodes.dispose(),this._bindings.dispose(),this._renderLists.dispose(),this._renderContexts.dispose(),this._textures.dispose();for(const e of this._frameBufferTargets.keys())e.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}setCanvasTarget(e){this._canvasTarget.removeEventListener("resize",this._onCanvasTargetResize),this._canvasTarget=e,this._canvasTarget.addEventListener("resize",this._onCanvasTargetResize)}getCanvasTarget(){return this._canvasTarget}_resetXRState(){this.backend.setXRTarget(null),this.setOutputRenderTarget(null),this.setRenderTarget(null);for(const e of this._frameBufferTargets.keys())e.dispose()}setRenderObjectFunction(e){this._renderObjectFunction=e}getRenderObjectFunction(){return this._renderObjectFunction}compute(e,t=null){if(!0===this._isDeviceLost)return;if(!1===this._initialized)return d("Renderer: .compute() called before the backend is initialized. Try using .computeAsync() instead."),this.computeAsync(e,t);const r=this._nodes.nodeFrame,s=r.renderId;this.info.calls++,this.info.compute.calls++,this.info.compute.frameCalls++,r.renderId=this.info.calls,this.backend.updateTimeStampUID(e),this.inspector.beginCompute(this.backend.getTimestampUID(e),e);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.deleteForCompute(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,this.inspector.finishCompute(this.backend.getTimestampUID(e))}async computeAsync(e,t=null){!1===this._initialized&&await this.init(),this.compute(e,t)}async hasFeatureAsync(e){return v('Renderer: "hasFeatureAsync()" has been deprecated. Use "hasFeature()" and "await renderer.init();" when creating the renderer.'),await this.init(),this.hasFeature(e)}async resolveTimestampsAsync(e="render"){return!1===this._initialized&&await this.init(),this.backend.resolveTimestampsAsync(e)}hasFeature(e){if(!1===this._initialized)throw new Error('Renderer: .hasFeature() called before the backend is initialized. Use "await renderer.init();" before before using this method.');return this.backend.hasFeature(e)}hasInitialized(){return this._initialized}async initTextureAsync(e){v('Renderer: "initTextureAsync()" has been deprecated. Use "initTexture()" and "await renderer.init();" when creating the renderer.'),await this.init(),this.initTexture(e)}initTexture(e){if(!1===this._initialized)throw new Error('Renderer: .initTexture() called before the backend is initialized. Use "await renderer.init();" before before using this method.');this._textures.updateTexture(e)}initRenderTarget(e){if(!1===this._initialized)throw new Error('Renderer: .initRenderTarget() called before the backend is initialized. Use "await renderer.init();" before before using this method.');this._textures.updateRenderTarget(e);const t=this._textures.get(e),r=this._renderContexts.get(e);r.textures=t.textures,r.depthTexture=t.depthTexture,r.width=t.width,r.height=t.height,r.renderTarget=e,r.depth=e.depthBuffer,r.stencil=e.stencilBuffer,this.backend.initRenderTarget(r)}copyFramebufferToTexture(e,t=null){if(null!==t)if(t.isVector2)t=WS.set(t.x,t.y,e.image.width,e.image.height).floor();else{if(!t.isVector4)return void o("Renderer.copyFramebufferToTexture: Invalid rectangle.");t=WS.copy(t).floor()}else t=WS.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),this._inspector.copyFramebufferToTexture(e)}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),this._inspector.copyTextureToTexture(e,t)}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?zS:GS;if(!e.frustumCulled||n.intersectsSprite(e,t)){!0===this.sortObjects&&WS.setFromMatrixPosition(e.matrixWorld).applyMatrix4($S);const{geometry:t,material:n}=e;n.visible&&s.push(e,t,n,r,WS.z,null,i)}}else if(e.isLineLoop)o("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?zS:GS;if(!e.frustumCulled||n.intersectsObject(e,t)){const{geometry:t,material:n}=e;if(!0===this.sortObjects&&(null===t.boundingSphere&&t.computeBoundingSphere(),WS.copy(t.boundingSphere.center).applyMatrix4(e.matrixWorld).applyMatrix4($S)),Array.isArray(n)){const a=t.groups;for(let o=0,u=a.length;o0){for(const{material:e}of t)e.side=L;this._renderObjects(t,r,s,i,"backSide");for(const{material:e}of t)e.side=Nt;this._renderObjects(e,r,s,i);for(const{material:e}of t)e.side=P}else this._renderObjects(e,r,s,i)}_renderObjects(e,t,r,s,i=null){for(let n=0,a=e.length;n(t.not().discard(),e))(u)}}e.depthNode&&e.depthNode.isNode&&(l=e.depthNode),e.castShadowPositionNode&&e.castShadowPositionNode.isNode?o=e.castShadowPositionNode:e.positionNode&&e.positionNode.isNode&&(o=e.positionNode),r={version:t,colorNode:u,depthNode:l,positionNode:o},this._cacheShadowNodes.set(e,r)}return r}renderObject(e,t,r,s,i,n,a,o=null,u=null){let l,d,c,h,p=!1;if(e.onBeforeRender(this,t,r,s,i,n),!0===i.allowOverride&&null!==t.overrideMaterial){const e=t.overrideMaterial;if(p=!0,l=e.isNodeMaterial?e.colorNode:null,d=e.isNodeMaterial?e.depthNode:null,c=e.isNodeMaterial?e.positionNode:null,h=t.overrideMaterial.side,i.positionNode&&i.positionNode.isNode&&(e.positionNode=i.positionNode),e.alphaTest=i.alphaTest,e.alphaMap=i.alphaMap,e.transparent=i.transparent||i.transmission>0||i.transmissionNode&&i.transmissionNode.isNode||i.backdropNode&&i.backdropNode.isNode,e.isShadowPassMaterial){const{colorNode:t,depthNode:r,positionNode:s}=this._getShadowNodes(i);this.shadowMap.type===ht?e.side=null!==i.shadowSide?i.shadowSide:i.side:e.side=null!==i.shadowSide?i.shadowSide:HS[i.side],null!==t&&(e.colorNode=t),null!==r&&(e.depthNode=r),null!==s&&(e.positionNode=s)}i=e}!0===i.transparent&&i.side===P&&!1===i.forceSinglePass?(i.side=L,this._handleObjectFunction(e,i,t,r,a,n,o,"backSide"),i.side=Nt,this._handleObjectFunction(e,i,t,r,a,n,o,u),i.side=P):this._handleObjectFunction(e,i,t,r,a,n,o,u),p&&(t.overrideMaterial.colorNode=l,t.overrideMaterial.depthNode=d,t.overrideMaterial.positionNode=c,t.overrideMaterial.side=h),e.onAfterRender(this,t,r,s,i,n)}hasCompatibility(e){if(!1===this._initialized)throw new Error('Renderer: .hasCompatibility() called before the backend is initialized. Use "await renderer.init();" before using this method.');return this.backend.hasCompatibility(e)}_renderObjectDirect(e,t,r,s,i,n,a,o){const u=this._objects.get(e,t,r,s,i,this._currentRenderContext,a,o);if(u.drawRange=e.geometry.drawRange,u.group=n,null!==this._currentRenderBundle){this.backend.get(this._currentRenderBundle).renderObjects.push(u),u.bundle=this._currentRenderBundle.bundleGroup}const l=this._nodes.needsRefresh(u);l&&(this._nodes.updateBefore(u),this._geometries.updateForRender(u),this._nodes.updateForRender(u),this._bindings.updateForRender(u)),this._pipelines.updateForRender(u),this._pipelines.isReady(u)&&(this.backend.draw(u,this.info),l&&this._nodes.updateAfter(u))}_createObjectPipeline(e,t,r,s,i,n,a,o){if(null!==this._compilationPromises)return void this._compilationPromises.push({object:e,material:t,scene:r,camera:s,lightsNode:i,group:n,clippingContext:a,passId:o,renderContext:this._currentRenderContext});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)}_onCanvasTargetResize(){this._initialized&&this.backend.updateSize()}get compile(){return this.compileAsync}}class jS{constructor(e=""){this.name=e,this.visibility=0}setVisibility(e){this.visibility|=e}getVisibility(){return this.visibility}clone(){return Object.assign(new this.constructor,this)}}class XS extends jS{constructor(e,t=null){super(e),this.isBuffer=!0,this.bytesPerElement=Float32Array.BYTES_PER_ELEMENT,this._buffer=t,this._updateRanges=[]}get updateRanges(){return this._updateRanges}addUpdateRange(e,t){this.updateRanges.push({start:e,count:t})}clearUpdateRanges(){this.updateRanges.length=0}get byteLength(){return(e=this._buffer.byteLength)+(Sy-e%Sy)%Sy;var e}get buffer(){return this._buffer}update(){return!0}}class KS extends XS{constructor(e,t=null){super(e,t),this.isUniformBuffer=!0}}let QS=0;class YS extends KS{constructor(e,t){super("UniformBuffer_"+QS++,e?e.value:null),this.nodeUniform=e,this.groupNode=t,this.isNodeUniformBuffer=!0}set updateRanges(e){this.nodeUniform.updateRanges=e}get updateRanges(){return this.nodeUniform.updateRanges}addUpdateRange(e,t){this.nodeUniform.addUpdateRange(e,t)}clearUpdateRanges(){this.nodeUniform.clearUpdateRanges()}get buffer(){return this.nodeUniform.value}}class ZS extends KS{constructor(e){super(e),this.isUniformsGroup=!0,this._values=null,this.uniforms=[],this._updateRangeCache=new Map}addUniformUpdateRange(e){const t=e.index;if(!0!==this._updateRangeCache.has(t)){const r=this.updateRanges,s={start:e.offset,count:e.itemSize};r.push(s),this._updateRangeCache.set(t,s)}}clearUpdateRanges(){this._updateRangeCache.clear(),super.clearUpdateRanges()}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.generation=null,this.version=-1},this.texture=t,this.version=t?t.version:-1,this.generation=null,this.samplerKey="",this.isSampler=!0}set texture(e){this._texture!==e&&(this._texture&&this._texture.removeEventListener("dispose",this._onTextureDispose),this._texture=e,this.generation=null,this.version=-1,this._texture&&this._texture.addEventListener("dispose",this._onTextureDispose))}get texture(){return this._texture}update(){const{texture:e,version:t}=this;return t!==e.version&&(this.version=e.version,!0)}clone(){const e=super.clone();return e._texture=null,e._onTextureDispose=()=>{e.generation=null,e.version=-1},e.texture=this.texture,e}}let rR=0;class sR extends tR{constructor(e,t){super(e,t),this.id=rR++,this.store=!1,this.mipLevel=0,this.isSampledTexture=!0}}class iR extends sR{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 nR extends iR{constructor(e,t,r,s=null){super(e,t,r,s),this.isSampledCubeTexture=!0}}class aR extends iR{constructor(e,t,r,s=null){super(e,t,r,s),this.isSampledTexture3D=!0}}const oR={bitcast_int_uint:new cT("uint tsl_bitcast_int_to_uint ( int x ) { return floatBitsToUint( intBitsToFloat ( x ) ); }"),bitcast_uint_int:new cT("uint tsl_bitcast_uint_to_int ( uint x ) { return floatBitsToInt( uintBitsToFloat ( x ) ); }")},uR={textureDimensions:"textureSize",equals:"equal",bitcast_float_int:"floatBitsToInt",bitcast_int_float:"intBitsToFloat",bitcast_uint_float:"uintBitsToFloat",bitcast_float_uint:"floatBitsToUint",bitcast_uint_int:"tsl_bitcast_uint_to_int",bitcast_int_uint:"tsl_bitcast_int_to_uint",floatpack_snorm_2x16:"packSnorm2x16",floatpack_unorm_2x16:"packUnorm2x16",floatpack_float16_2x16:"packHalf2x16",floatunpack_snorm_2x16:"unpackSnorm2x16",floatunpack_unorm_2x16:"unpackUnorm2x16",floatunpack_float16_2x16:"unpackHalf2x16"},lR={low:"lowp",medium:"mediump",high:"highp"},dR={swizzleAssign:!0,storageBuffer:!1},cR={perspective:"smooth",linear:"noperspective"},hR={centroid:"centroid"},pR="\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 highp sampler2DShadow;\nprecision highp sampler2DArrayShadow;\nprecision highp samplerCubeShadow;\n";class gR extends HN{constructor(e,t){super(e,t,new hS),this.uniformGroups={},this.transforms=[],this.extensions={},this.builtins={vertex:[],fragment:[],compute:[]}}needsToWorkingColorSpace(e){return!0===e.isVideoTexture&&e.colorSpace!==T}_include(e){const t=oR[e];return t.build(this),this.addInclude(t),t}getMethod(e){return void 0!==oR[e]&&this._include(e),uR[e]||e}getBitcastMethod(e,t){return this.getMethod(`bitcast_${t}_${e}`)}getFloatPackingMethod(e){return this.getMethod(`floatpack_${e}_2x16`)}getFloatUnpackingMethod(e){return this.getMethod(`floatunpack_${e}_2x16`)}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?He:We;2===s?n=i?Ft:W:3===s?n=i?Lt:Xe:4===s&&(n=i?Pt:Ee);const a={Float32Array:Q,Uint8Array:ke,Uint16Array:ze,Uint32Array:S,Int8Array:Ve,Int16Array:Ge,Int32Array:R,Uint8ClampedArray:ke},o=Math.pow(2,Math.ceil(Math.log2(Math.sqrt(r/s))));let u=Math.ceil(r/s/o);o*u*s0?i:"";t=`${r.name} {\n\t${s} ${e.name}[${n}];\n};\n`}else{const t=e.groupNode.name;if(void 0===s[t]){const e=this.uniformGroups[t];if(void 0!==e){const r=[];for(const t of e.uniforms){const e=t.getType(),s=this.getVectorType(e),i=t.nodeUniform.node.precision;let n=`${s} ${t.name};`;null!==i&&(n=lR[i]+" "+n),r.push("\t"+n)}s[t]=r}}i=!0}if(!i){const s=e.node.precision;null!==s&&(t=lR[s]+" "+t),t="uniform "+t,r.push(t)}}let i="";for(const e in s){const t=s[e];i+=this._getGLSLUniformStruct(e,t.join("\n"))+"\n"}return i+=r.join("\n"),i}getTypeFromAttribute(e){let t=super.getTypeFromAttribute(e);if(/^[iu]/.test(t)&&e.gpuType!==R){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+=`${cR[s.interpolationType]||s.interpolationType} ${hR[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+=`${cR[e.interpolationType]||e.interpolationType} ${hR[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`}getSubgroupSize(){o("GLSLNodeBuilder: WebGLBackend does not support the subgroupSize node")}getInvocationSubgroupIndex(){o("GLSLNodeBuilder: WebGLBackend does not support the invocationSubgroupIndex node")}getSubgroupIndex(){o("GLSLNodeBuilder: WebGLBackend does not support the subgroupIndex node")}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=dR[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)}dR[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 iR(i.name,i.node,s),u.push(a);else if("cubeTexture"===t||"cubeDepthTexture"===t)a=new nR(i.name,i.node,s),u.push(a);else if("texture3D"===t)a=new aR(i.name,i.node,s),u.push(a);else if("buffer"===t){i.name=`buffer${e.id}`;const t=this.getSharedDataFromNode(e);let r=t.buffer;void 0===r&&(e.name=`NodeBuffer_${e.id}`,r=new YS(e,s),r.name=e.name,t.buffer=r),u.push(r),a=r}else{let e=this.uniformGroups[o];void 0===e?(e=new eR(o,s),this.uniformGroups[o]=e,u.push(e)):-1===u.indexOf(e)&&u.push(e),a=this.getNodeUniform(i,t);const r=a.name;e.uniforms.some(e=>e.name===r)||e.addUniform(a)}n.uniformGPU=a}return i}}let mR=null,fR=null;class yR{constructor(e={}){this.parameters=Object.assign({},e),this.data=new WeakMap,this.renderer=null,this.domElement=null,this.timestampQueryPool={[Dt.RENDER]:null,[Dt.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(){}updateSampler(){}createDefaultTexture(){}createTexture(){}updateTexture(){}generateMipmaps(){}destroyTexture(){}async copyTextureToBuffer(){}copyTextureToTexture(){}copyFramebufferToTexture(){}createAttribute(){}createIndexAttribute(){}createStorageAttribute(){}updateAttribute(){}destroyAttribute(){}getContext(){}updateSize(){}updateViewport(){}updateTimeStampUID(e){const t=this.get(e),r=this.renderer.info.frame;let s;s=!0===e.isComputeNode?"c:"+this.renderer.info.compute.frameCalls:"r:"+this.renderer.info.render.frameCalls,t.timestampUID=s+":"+e.id+":f"+r}getTimestampUID(e){return this.get(e).timestampUID}getTimestampFrames(e){const t=this.timestampQueryPool[e];return t?t.getTimestampFrames():[]}_getQueryPool(e){const t=e.startsWith("c:")?Dt.COMPUTE:Dt.RENDER;return this.timestampQueryPool[t]}getTimestamp(e){return this._getQueryPool(e).getTimestamp(e)}hasTimestamp(e){return this._getQueryPool(e).hasTimestamp(e)}isOccluded(){}async resolveTimestampsAsync(e="render"){if(!this.trackTimestamp)return void v("WebGPURenderer: Timestamp tracking is disabled.");const t=this.timestampQueryPool[e];if(!t)return;const r=await t.resolveQueriesAsync();return this.renderer.info[e].timestamp=r,r}async getArrayBufferAsync(){}async hasFeatureAsync(){}hasFeature(){}getDrawingBufferSize(){return mR=mR||new t,this.renderer.getDrawingBufferSize(mR)}setScissorTest(){}getClearColor(){const e=this.renderer;return fR=fR||new Qy,e.getClearColor(fR),fR.getRGB(fR),fR}getDomElement(){let e=this.domElement;return null===e&&(e=void 0!==this.parameters.canvas?this.parameters.canvas:Ut(),"setAttribute"in e&&e.setAttribute("data-engine",`three.js r${Tt} webgpu`),this.domElement=e),e}hasCompatibility(){return!1}initRenderTarget(){}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)}deleteBindGroupData(){}dispose(){}}let bR,xR,TR=0;class _R{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 vR{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===R,id:TR++};if(e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute){const e=this._createBuffer(s,t,i,n);d=new _R(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;e0?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 RR,AR,ER,wR=!1;class CR{constructor(e){this.backend=e,this.gl=e.gl,this.extensions=e.extensions,this.defaultTextures={},this._srcFramebuffer=null,this._dstFramebuffer=null,!1===wR&&(this._init(),wR=!0)}_init(){const e=this.gl;RR={[Gr]:e.REPEAT,[ve]:e.CLAMP_TO_EDGE,[kr]:e.MIRRORED_REPEAT},AR={[B]:e.NEAREST,[zr]:e.NEAREST_MIPMAP_NEAREST,[yt]:e.NEAREST_MIPMAP_LINEAR,[de]:e.LINEAR,[ft]:e.LINEAR_MIPMAP_NEAREST,[Z]:e.LINEAR_MIPMAP_LINEAR},ER={[qr]:e.NEVER,[Hr]:e.ALWAYS,[E]:e.LESS,[w]:e.LEQUAL,[Wr]:e.EQUAL,[M]:e.GEQUAL,[C]:e.GREATER,[$r]: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];d("WebGLBackend: 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?jr:p.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===g?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),r===n.UNSIGNED_INT_10F_11F_11F_REV&&(o=n.R11F_G11F_B10F)}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?jr:p.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===g?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=p.getPrimaries(p.workingColorSpace),a=t.colorSpace===T?null:p.getPrimaries(t.colorSpace),o=t.colorSpace===T||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,RR[t.wrapS]),r.texParameteri(e,r.TEXTURE_WRAP_T,RR[t.wrapT]),e!==r.TEXTURE_3D&&e!==r.TEXTURE_2D_ARRAY||t.isArrayTexture||r.texParameteri(e,r.TEXTURE_WRAP_R,RR[t.wrapR]),r.texParameteri(e,r.TEXTURE_MAG_FILTER,AR[t.magFilter]);const u=void 0!==t.mipmaps&&t.mipmaps.length>0,l=t.minFilter===de&&u?Z:t.minFilter;if(r.texParameteri(e,r.TEXTURE_MIN_FILTER,AR[l]),t.compareFunction&&(r.texParameteri(e,r.TEXTURE_COMPARE_MODE,r.COMPARE_REF_TO_TEXTURE),r.texParameteri(e,r.TEXTURE_COMPARE_FUNC,ER[t.compareFunction])),!0===s.has("EXT_texture_filter_anisotropic")){if(t.magFilter===B)return;if(t.minFilter!==yt&&t.minFilter!==Z)return;if(t.type===Q&&!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.capabilities.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})}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){const t=Xr(s.width,s.height,e.format,e.type);for(const i of e.layerUpdates){const e=s.data.subarray(i*t/s.data.BYTES_PER_ELEMENT,(i+1)*t/s.data.BYTES_PER_ELEMENT);r.texSubImage3D(r.TEXTURE_2D_ARRAY,0,0,0,i,s.width,s.height,1,o,u,e)}e.clearLayerUpdates()}else r.texSubImage3D(r.TEXTURE_2D_ARRAY,0,0,0,0,s.width,s.height,s.depth,o,u,s.data)}else if(e.isData3DTexture){const e=t.image;r.texSubImage3D(r.TEXTURE_3D,0,0,0,0,e.width,e.height,e.depth,o,u,e.data)}else if(e.isVideoTexture)e.update(),r.texImage2D(a,0,l,o,u,t.image);else{const n=e.mipmaps;if(n.length>0)for(let e=0,t=n.length;e0,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();a.state.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),a.state.bindFramebuffer(o.READ_FRAMEBUFFER,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}dispose(){const{gl:e}=this;null!==this._srcFramebuffer&&e.deleteFramebuffer(this._srcFramebuffer),null!==this._dstFramebuffer&&e.deleteFramebuffer(this._dstFramebuffer)}}function MR(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 BR{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 FR{constructor(e){this.backend=e,this.maxAnisotropy=null,this.maxUniformBlockSize=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}getUniformBufferLimit(){if(null!==this.maxUniformBlockSize)return this.maxUniformBlockSize;const e=this.backend.gl;return this.maxUniformBlockSize=e.getParameter(e.MAX_UNIFORM_BLOCK_SIZE),this.maxUniformBlockSize}}const LR={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",WEBGL_compressed_texture_s3tc:"texture-compression-s3tc",EXT_texture_compression_bptc:"texture-compression-bc",EXT_disjoint_timer_query_webgl2:"timestamp-query",OVR_multiview2:"OVR_multiview2"};class PR{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 v(`WebGLTimestampQueryPool [${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,t),t}beginQuery(e){if(!this.trackTimestamp||this.isDisposed)return;const t=this.queryOffsets.get(e);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){o("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);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){o("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=new Map;for(const[t,r]of this.queryOffsets){if("ended"===this.queryStates.get(r)){const s=this.queries[r];e.set(t,this.resolveQuery(s))}}if(0===e.size)return this.lastValue;const t={},r=[];for(const[s,i]of e){const e=s.match(/^(.*):f(\d+)$/),n=parseInt(e[2]);!1===r.includes(n)&&r.push(n),void 0===t[n]&&(t[n]=0);const a=await i;this.timestamps.set(s,a),t[n]+=a}const s=t[r[r.length-1]];return this.lastValue=s,this.frames=r,this.currentQueryIndex=0,this.queryOffsets.clear(),this.queryStates.clear(),this.activeQuery=null,s}catch(e){return o("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){o("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 IR extends yR{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.currentSamples>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 BR(this),this.capabilities=new FR(this),this.attributeUtils=new vR(this),this.textureUtils=new CR(this),this.bufferRenderer=new PR(this),this.state=new NR(this),this.utils=new SR(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.extensions.get("EXT_clip_control"),this.disjoint=this.extensions.get("EXT_disjoint_timer_query_webgl2"),this.parallel=this.extensions.get("KHR_parallel_shader_compile"),this.drawBuffersIndexedExt=this.extensions.get("OES_draw_buffers_indexed"),t.reversedDepthBuffer&&(this.extensions.has("EXT_clip_control")?e.reversedDepthBuffer=!0:(d("WebGPURenderer: Unable to use reversed depth buffer due to missing EXT_clip_control extension. Fallback to default depth buffer."),e.reversedDepthBuffer=!1)),e.reversedDepthBuffer&&this.state.setReversedDepth(!0)}get coordinateSystem(){return c}async getArrayBufferAsync(e){return await this.attributeUtils.getArrayBufferAsync(e)}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&&d("WebGLBackend: Render-to-texture extension was disabled because an external texture was provided"),e._autoAllocateDepthBuffer=!1}}initTimestampQuery(e,t){if(!this.disjoint||!this.trackTimestamp)return;this.timestampQueryPool[e]||(this.timestampQueryPool[e]=new UR(this.gl,e,2048));const r=this.timestampQueryPool[e];null!==r.allocateQueriesForContext(t)&&r.beginQuery(t)}prepareTimestampBuffer(e,t){if(!this.disjoint||!this.trackTimestamp)return;this.timestampQueryPool[e].endQuery(t)}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)this.updateScissor(e);else{const{width:e,height:r}=this.getDrawingBufferSize();t.scissor(0,0,e,r)}this.initTimestampQuery(Dt.RENDER,this.getTimestampUID(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;e{let a=0;for(let t=0;t1?t.renderInstances(r,s,i):t.render(r,s)}draw(e){const{object:t,pipeline:r,material:s,context:i,hardwareClippingPlanes:n}=e,{programGPU:a}=this.get(r),{gl:o,state:u}=this,l=this.get(i),d=e.getDrawParameters();if(null===d)return;this._bindUniforms(e.getBindings());const c=t.isMesh&&t.matrixWorld.determinant()<0;u.setMaterial(s,c,n),null!==i.mrt&&null!==i.textures&&u.setMRTBlending(i.textures,i.mrt,s),u.useProgram(a);const h=e.getAttributes(),p=this.get(h);let g=p.vaoGPU;if(void 0===g){const e=this._getVaoKey(h);g=this.vaoCache[e],void 0===g&&(g=this._createVao(h),this.vaoCache[e]=g,p.vaoGPU=g)}const m=e.getIndex(),f=null!==m?this.get(m).bufferGPU:null;u.setVertexState(g,f);const y=l.lastOcclusionObject;if(y!==t&&void 0!==y){if(null!==y&&!0===y.occlusionTest&&(o.endQuery(o.ANY_SAMPLES_PASSED),l.occlusionQueryIndex++),!0===t.occlusionTest){const e=o.createQuery();o.beginQuery(o.ANY_SAMPLES_PASSED,e),l.occlusionQueries[l.occlusionQueryIndex]=e,l.occlusionQueryObjects[l.occlusionQueryIndex]=t}l.lastOcclusionObject=t}const b=this.bufferRenderer;t.isPoints?b.mode=o.POINTS:t.isLineSegments?b.mode=o.LINES:t.isLine?b.mode=o.LINE_STRIP:t.isLineLoop?b.mode=o.LINE_LOOP:!0===s.wireframe?(u.setLineWidth(s.wireframeLinewidth*this.renderer.getPixelRatio()),b.mode=o.LINES):b.mode=o.TRIANGLES;const{vertexCount:x,instanceCount:T}=d;let{firstVertex:_}=d;if(b.object=t,null!==m){_*=m.array.BYTES_PER_ELEMENT;const e=this.get(m);b.index=m.count,b.type=e.type}else b.index=0;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");o("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&&d("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,pipeline: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;eLR[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=qy(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,i=this.renderer._activeMipmapLevel;t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_CUBE_MAP_POSITIVE_X+r,e,i)}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&&!1===this._useMultisampledExtension(s)){const n=i.framebuffers[e.getCacheKey()];let a=t.COLOR_BUFFER_BIT;s.resolveDepthBuffer&&(s.depthBuffer&&(a|=t.DEPTH_BUFFER_BIT),s.stencilBuffer&&s.resolveStencilBuffer&&(a|=t.STENCIL_BUFFER_BIT));const o=i.msaaFrameBuffer,u=i.msaaRenderbuffers,l=e.textures,d=l.length>1;if(r.bindFramebuffer(t.READ_FRAMEBUFFER,o),r.bindFramebuffer(t.DRAW_FRAMEBUFFER,n),d)for(let e=0;e0&&!0===this.extensions.has("WEBGL_multisampled_render_to_texture")&&!1!==e._autoAllocateDepthBuffer}dispose(){null!==this.textureUtils&&this.textureUtils.dispose();const e=this.extensions.get("WEBGL_lose_context");e&&e.loseContext(),this.renderer.domElement.removeEventListener("webglcontextlost",this._onContextLost)}}const OR="point-list",VR="line-list",kR="line-strip",GR="triangle-list",zR="undefined"!=typeof self&&self.GPUShaderStage?self.GPUShaderStage:{VERTEX:1,FRAGMENT:2,COMPUTE:4},$R="never",WR="less",HR="equal",qR="less-equal",jR="greater",XR="not-equal",KR="greater-equal",QR="always",YR="store",ZR="load",JR="clear",eA="ccw",tA="cw",rA="none",sA="back",iA="uint16",nA="uint32",aA="r8unorm",oA="r8snorm",uA="r8uint",lA="r8sint",dA="r16uint",cA="r16sint",hA="r16float",pA="rg8unorm",gA="rg8snorm",mA="rg8uint",fA="rg8sint",yA="r32uint",bA="r32sint",xA="r32float",TA="rg16uint",_A="rg16sint",vA="rg16float",NA="rgba8unorm",SA="rgba8unorm-srgb",RA="rgba8snorm",AA="rgba8uint",EA="rgba8sint",wA="bgra8unorm",CA="bgra8unorm-srgb",MA="rgb9e5ufloat",BA="rgb10a2unorm",FA="rg11b10ufloat",LA="rg32uint",PA="rg32sint",DA="rg32float",UA="rgba16uint",IA="rgba16sint",OA="rgba16float",VA="rgba32uint",kA="rgba32sint",GA="rgba32float",zA="depth16unorm",$A="depth24plus",WA="depth24plus-stencil8",HA="depth32float",qA="depth32float-stencil8",jA="bc1-rgba-unorm",XA="bc1-rgba-unorm-srgb",KA="bc2-rgba-unorm",QA="bc2-rgba-unorm-srgb",YA="bc3-rgba-unorm",ZA="bc3-rgba-unorm-srgb",JA="bc4-r-unorm",eE="bc4-r-snorm",tE="bc5-rg-unorm",rE="bc5-rg-snorm",sE="bc6h-rgb-ufloat",iE="bc6h-rgb-float",nE="bc7-rgba-unorm",aE="bc7-rgba-unorm-srgb",oE="etc2-rgb8unorm",uE="etc2-rgb8unorm-srgb",lE="etc2-rgb8a1unorm",dE="etc2-rgb8a1unorm-srgb",cE="etc2-rgba8unorm",hE="etc2-rgba8unorm-srgb",pE="eac-r11unorm",gE="eac-r11snorm",mE="eac-rg11unorm",fE="eac-rg11snorm",yE="astc-4x4-unorm",bE="astc-4x4-unorm-srgb",xE="astc-5x4-unorm",TE="astc-5x4-unorm-srgb",_E="astc-5x5-unorm",vE="astc-5x5-unorm-srgb",NE="astc-6x5-unorm",SE="astc-6x5-unorm-srgb",RE="astc-6x6-unorm",AE="astc-6x6-unorm-srgb",EE="astc-8x5-unorm",wE="astc-8x5-unorm-srgb",CE="astc-8x6-unorm",ME="astc-8x6-unorm-srgb",BE="astc-8x8-unorm",FE="astc-8x8-unorm-srgb",LE="astc-10x5-unorm",PE="astc-10x5-unorm-srgb",DE="astc-10x6-unorm",UE="astc-10x6-unorm-srgb",IE="astc-10x8-unorm",OE="astc-10x8-unorm-srgb",VE="astc-10x10-unorm",kE="astc-10x10-unorm-srgb",GE="astc-12x10-unorm",zE="astc-12x10-unorm-srgb",$E="astc-12x12-unorm",WE="astc-12x12-unorm-srgb",HE="clamp-to-edge",qE="repeat",jE="mirror-repeat",XE="linear",KE="nearest",QE="zero",YE="one",ZE="src",JE="one-minus-src",ew="src-alpha",tw="one-minus-src-alpha",rw="dst",sw="one-minus-dst",iw="dst-alpha",nw="one-minus-dst-alpha",aw="src-alpha-saturated",ow="constant",uw="one-minus-constant",lw="add",dw="subtract",cw="reverse-subtract",hw="min",pw="max",gw=0,mw=15,fw="keep",yw="zero",bw="replace",xw="invert",Tw="increment-clamp",_w="decrement-clamp",vw="increment-wrap",Nw="decrement-wrap",Sw="storage",Rw="read-only-storage",Aw="write-only",Ew="read-only",ww="read-write",Cw="non-filtering",Mw="comparison",Bw="float",Fw="unfilterable-float",Lw="depth",Pw="sint",Dw="uint",Uw="2d",Iw="3d",Ow="2d",Vw="2d-array",kw="cube",Gw="3d",zw="all",$w="vertex",Ww="instance",Hw={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"},qw={"texture-compression-s3tc":"texture-compression-bc","texture-compression-etc1":"texture-compression-etc2"};class jw extends tR{constructor(e,t,r){super(e,t?t.value:null),this.textureNode=t,this.groupNode=r}update(){const{textureNode:e}=this;return this.texture!==e.value?(this.texture=e.value,!0):super.update()}}class Xw extends XS{constructor(e,t){super(e,t?t.array:null),this._attribute=t,this.isStorageBuffer=!0}get attribute(){return this._attribute}}let Kw=0;class Qw extends Xw{constructor(e,t){super("StorageBuffer_"+Kw++,e?e.value:null),this.nodeUniform=e,this.access=e?e.access:si.READ_WRITE,this.groupNode=t}get attribute(){return this.nodeUniform.value}get buffer(){return this.nodeUniform.value.array}}class Yw extends xy{constructor(e){super(),this.device=e;this.mipmapSampler=e.createSampler({minFilter:XE}),this.flipYSampler=e.createSampler({minFilter:KE}),this.flipUniformBuffer=e.createBuffer({size:4,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST}),e.queue.writeBuffer(this.flipUniformBuffer,0,new Uint32Array([1])),this.noFlipUniformBuffer=e.createBuffer({size:4,usage:GPUBufferUsage.UNIFORM}),this.transferPipelines={},this.mipmapShaderModule=e.createShaderModule({label:"mipmap",code:"\nstruct VarysStruct {\n\t@builtin( position ) Position: vec4f,\n\t@location( 0 ) vTex : vec2f,\n\t@location( 1 ) @interpolate(flat, either) vBaseArrayLayer: u32,\n};\n\n@group( 0 ) @binding ( 2 )\nvar flipY: u32;\n\n@vertex\nfn mainVS(\n\t\t@builtin( vertex_index ) vertexIndex : u32,\n\t\t@builtin( instance_index ) instanceIndex : u32 ) -> VarysStruct {\n\n\tvar Varys : VarysStruct;\n\n\tvar pos = array(\n\t\tvec2f( -1, -1 ),\n\t\tvec2f( -1, 3 ),\n\t\tvec2f( 3, -1 ),\n\t);\n\n\tlet p = pos[ vertexIndex ];\n\tlet mult = select( vec2f( 0.5, -0.5 ), vec2f( 0.5, 0.5 ), flipY != 0 );\n\tVarys.vTex = p * mult + vec2f( 0.5 );\n\tVarys.Position = vec4f( p, 0, 1 );\n\tVarys.vBaseArrayLayer = instanceIndex;\n\n\treturn Varys;\n\n}\n\n@group( 0 ) @binding( 0 )\nvar imgSampler : sampler;\n\n@group( 0 ) @binding( 1 )\nvar img2d : texture_2d;\n\n@fragment\nfn main_2d( Varys: VarysStruct ) -> @location( 0 ) vec4 {\n\n\treturn textureSample( img2d, imgSampler, Varys.vTex );\n\n}\n\n@group( 0 ) @binding( 1 )\nvar img2dArray : texture_2d_array;\n\n@fragment\nfn main_2d_array( Varys: VarysStruct ) -> @location( 0 ) vec4 {\n\n\treturn textureSample( img2dArray, imgSampler, Varys.vTex, Varys.vBaseArrayLayer );\n\n}\n\nconst faceMat = array(\n mat3x3f( 0, 0, -2, 0, -2, 0, 1, 1, 1 ), // pos-x\n mat3x3f( 0, 0, 2, 0, -2, 0, -1, 1, -1 ), // neg-x\n mat3x3f( 2, 0, 0, 0, 0, 2, -1, 1, -1 ), // pos-y\n mat3x3f( 2, 0, 0, 0, 0, -2, -1, -1, 1 ), // neg-y\n mat3x3f( 2, 0, 0, 0, -2, 0, -1, 1, 1 ), // pos-z\n mat3x3f( -2, 0, 0, 0, -2, 0, 1, 1, -1 ), // neg-z\n);\n\n@group( 0 ) @binding( 1 )\nvar imgCube : texture_cube;\n\n@fragment\nfn main_cube( Varys: VarysStruct ) -> @location( 0 ) vec4 {\n\n\treturn textureSample( imgCube, imgSampler, faceMat[ Varys.vBaseArrayLayer ] * vec3f( fract( Varys.vTex ), 1 ) );\n\n}\n"})}getTransferPipeline(e,t){const r=`${e}-${t=t||"2d-array"}`;let s=this.transferPipelines[r];return void 0===s&&(s=this.device.createRenderPipeline({label:`mipmap-${e}-${t}`,vertex:{module:this.mipmapShaderModule},fragment:{module:this.mipmapShaderModule,entryPoint:`main_${t.replace("-","_")}`,targets:[{format:e}]},layout:"auto"}),this.transferPipelines[r]=s),s}flipY(e,t,r=0){const s=t.format,{width:i,height:n}=t.size,a=this.device.createTexture({size:{width:i,height:n},format:s,usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.TEXTURE_BINDING}),o=this.getTransferPipeline(s,e.textureBindingViewDimension),u=this.getTransferPipeline(s,a.textureBindingViewDimension),l=this.device.createCommandEncoder({}),d=(e,t,r,s,i,n)=>{const a=e.getBindGroupLayout(0),o=this.device.createBindGroup({layout:a,entries:[{binding:0,resource:this.flipYSampler},{binding:1,resource:t.createView({dimension:t.textureBindingViewDimension||"2d-array",baseMipLevel:0,mipLevelCount:1})},{binding:2,resource:{buffer:n?this.flipUniformBuffer:this.noFlipUniformBuffer}}]}),u=l.beginRenderPass({colorAttachments:[{view:s.createView({dimension:"2d",baseMipLevel:0,mipLevelCount:1,baseArrayLayer:i,arrayLayerCount:1}),loadOp:JR,storeOp:YR}]});u.setPipeline(e),u.setBindGroup(0,o),u.draw(3,1,0,r),u.end()};d(o,e,r,a,0,!1),d(u,a,0,e,r,!0),this.device.queue.submit([l.finish()]),a.destroy()}generateMipmaps(e,t=null){const r=this.get(e),s=r.layers||this._mipmapCreateBundles(e),i=t||this.device.createCommandEncoder({label:"mipmapEncoder"});this._mipmapRunBundles(i,s),null===t&&this.device.queue.submit([i.finish()]),r.layers=s}_mipmapCreateBundles(e){const t=e.textureBindingViewDimension||"2d-array",r=this.getTransferPipeline(e.format,t),s=r.getBindGroupLayout(0),i=[];for(let n=1;n0)for(let t=0,n=s.length;t0){for(const s of e.layerUpdates)this._copyBufferToTexture(t.image,r.texture,i,s,e.flipY,s);e.clearLayerUpdates()}else for(let s=0;s0)for(let t=0,n=s.length;t0?e.width:r.size.width,l=a>0?e.height:r.size.height;try{o.queue.copyExternalImageToTexture({source:e,flipY:i},{texture:t,mipLevel:a,origin:{x:0,y:0,z:s},premultipliedAlpha:n},{width:u,height:l,depthOrArrayLayers:1})}catch(e){}}_getPassUtils(){let e=this._passUtils;return null===e&&(this._passUtils=e=new Yw(this.backend.device)),e}_generateMipmaps(e,t=null){this._getPassUtils().generateMipmaps(e,t)}_flipY(e,t,r=0){this._getPassUtils().flipY(e,t,r)}_copyBufferToTexture(e,t,r,s,i,n=0,a=0){const o=this.backend.device,u=e.data,l=this._getBytesPerTexel(r.format),d=e.width*l;o.queue.writeTexture({texture:t,mipLevel:a,origin:{x:0,y:0,z:s}},u,{offset:e.width*e.height*l*n,bytesPerRow:d},{width:e.width,height:e.height,depthOrArrayLayers:1}),!0===i&&this._flipY(t,r,s)}_copyCompressedBufferToTexture(e,t,r){const s=this.backend.device,i=this._getBlockData(r.format),n=r.size.depthOrArrayLayers>1;for(let a=0;a]*\s*([a-z_0-9]+(?:<[\s\S]+?>)?)/i,sC=/([a-z_0-9]+)\s*:\s*([a-z_0-9]+(?:<[\s\S]+?>)?)/gi,iC={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 nC extends oS{constructor(e){const{type:t,inputs:r,name:s,inputsCode:i,blockCode:n,outputType:a}=(e=>{const t=(e=e.trim()).match(rC);if(null!==t&&4===t.length){const r=t[2],s=[];let i=null;for(;null!==(i=sC.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 aC extends aS{parseFunction(e){return new nC(e)}}const oC={[si.READ_ONLY]:"read",[si.WRITE_ONLY]:"write",[si.READ_WRITE]:"read_write"},uC={[Gr]:"repeat",[ve]:"clamp",[kr]:"mirror"},lC={vertex:zR.VERTEX,fragment:zR.FRAGMENT,compute:zR.COMPUTE},dC={instance:!0,swizzleAssign:!1,storageBuffer:!0},cC={"^^":"tsl_xor"},hC={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"},pC={},gC={tsl_xor:new cT("fn tsl_xor( a : bool, b : bool ) -> bool { return ( a || b ) && !( a && b ); }"),mod_float:new cT("fn tsl_mod_float( x : f32, y : f32 ) -> f32 { return x - y * floor( x / y ); }"),mod_vec2:new cT("fn tsl_mod_vec2( x : vec2f, y : vec2f ) -> vec2f { return x - y * floor( x / y ); }"),mod_vec3:new cT("fn tsl_mod_vec3( x : vec3f, y : vec3f ) -> vec3f { return x - y * floor( x / y ); }"),mod_vec4:new cT("fn tsl_mod_vec4( x : vec4f, y : vec4f ) -> vec4f { return x - y * floor( x / y ); }"),equals_bool:new cT("fn tsl_equals_bool( a : bool, b : bool ) -> bool { return a == b; }"),equals_bvec2:new cT("fn tsl_equals_bvec2( a : vec2f, b : vec2f ) -> vec2 { return vec2( a.x == b.x, a.y == b.y ); }"),equals_bvec3:new cT("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 cT("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 cT("fn tsl_repeatWrapping_float( coord: f32 ) -> f32 { return fract( coord ); }"),mirrorWrapping_float:new cT("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 cT("fn tsl_clampWrapping_float( coord: f32 ) -> f32 { return clamp( coord, 0.0, 1.0 ); }"),biquadraticTexture:new cT("\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"),biquadraticTextureArray:new cT("\nfn tsl_biquadraticTexture_array( map : texture_2d_array, coord : vec2f, iRes : vec2u, layer : u32, 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, layer, level );\n\tlet rg2 = textureLoad( map, vec2u( iuv + vec2( 1.5, 0.5 ) ) % iRes, layer, level );\n\tlet rg3 = textureLoad( map, vec2u( iuv + vec2( 0.5, 1.5 ) ) % iRes, layer, level );\n\tlet rg4 = textureLoad( map, vec2u( iuv + vec2( 1.5, 1.5 ) ) % iRes, layer, level );\n\n\treturn mix( mix( rg1, rg2, f.x ), mix( rg3, rg4, f.x ), f.y );\n\n}\n")},mC={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",floatpack_snorm_2x16:"pack2x16snorm",floatpack_unorm_2x16:"pack2x16unorm",floatpack_float16_2x16:"pack2x16float",floatunpack_snorm_2x16:"unpack2x16snorm",floatunpack_unorm_2x16:"unpack2x16unorm",floatunpack_float16_2x16:"unpack2x16float"};let fC="";!0!==("undefined"!=typeof navigator&&/Firefox|Deno/g.test(navigator.userAgent))&&(fC+="diagnostic( off, derivative_uniformity );\n");class yC extends HN{constructor(e,t){super(e,t,new aC),this.uniformGroups={},this.uniformGroupsBindings={},this.builtins={},this.directives={},this.scopedArrays=new Map}_generateTextureSample(e,t,r,s,i,n=this.shaderStage){return"fragment"===n?s?i?`textureSample( ${t}, ${t}_sampler, ${r}, ${s}, ${i} )`:`textureSample( ${t}, ${t}_sampler, ${r}, ${s} )`:i?`textureSample( ${t}, ${t}_sampler, ${r}, ${i} )`:`textureSample( ${t}, ${t}_sampler, ${r} )`:this.generateTextureSampleLevel(e,t,r,"0",s)}generateTextureSampleLevel(e,t,r,s,i,n){return!1===this.isUnfilterable(e)?i?n?`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${i}, ${s}, ${n} )`:`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${i}, ${s} )`:n?`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${s}, ${n} )`:`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${s} )`:this.isFilteredTexture(e)?this.generateFilteredTexture(e,t,r,n,s,i):this.generateTextureLod(e,t,r,i,n,s)}generateWrapFunction(e){const t=`tsl_coord_${uC[e.wrapS]}S_${uC[e.wrapT]}_${e.is3DTexture||e.isData3DTexture?"3d":"2d"}T`;let r=pC[t];if(void 0===r){const s=[],i=e.is3DTexture||e.isData3DTexture?"vec3f":"vec2f";let n=`fn ${t}( coord : ${i} ) -> ${i} {\n\n\treturn ${i}(\n`;const a=(e,t)=>{e===Gr?(s.push(gC.repeatWrapping_float),n+=`\t\ttsl_repeatWrapping_float( coord.${t} )`):e===ve?(s.push(gC.clampWrapping_float),n+=`\t\ttsl_clampWrapping_float( coord.${t} )`):e===kr?(s.push(gC.mirrorWrapping_float),n+=`\t\ttsl_mirrorWrapping_float( coord.${t} )`):(n+=`\t\tcoord.${t}`,d(`WebGPURenderer: Unsupported texture wrap type "${e}" for vertex shader.`))};a(e.wrapS,"x"),n+=",\n",a(e.wrapT,"y"),(e.is3DTexture||e.isData3DTexture)&&(n+=",\n",a(e.wrapR,"z")),n+="\n\t);\n\n}\n",pC[t]=r=new cT(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.is3DTexture||e.isData3DTexture?"vec3":"vec2",n=u||e.isStorageTexture?t:`${t}${r?`, u32( ${r} )`:""}`,i=new wu(new gl(`textureDimensions( ${n} )`,a)),s.dimensionsSnippet[r]=i,(e.isArrayTexture||e.isDataArrayTexture||e.is3DTexture||e.isData3DTexture)&&(s.arrayLayerCount=new wu(new gl(`textureNumLayers(${t})`,"u32"))),e.isTextureCube&&(s.cubeFaceCount=new wu(new gl("6u","u32")))}return i.build(this)}generateFilteredTexture(e,t,r,s,i="0u",n){const a=this.generateWrapFunction(e),o=this.generateTextureDimension(e,t,i);return s&&(r=`${r} + vec2(${s}) / ${o}`),n?(this._include("biquadraticTextureArray"),`tsl_biquadraticTexture_array( ${t}, ${a}( ${r} ), ${o}, u32( ${n} ), u32( ${i} ) )`):(this._include("biquadraticTexture"),`tsl_biquadraticTexture( ${t}, ${a}( ${r} ), ${o}, u32( ${i} ) )`)}generateTextureLod(e,t,r,s,i,n="0u"){if(!0===e.isCubeTexture){i&&(r=`${r} + vec3(${i})`);return`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${e.isDepthTexture?"u32":"f32"}( ${n} ) )`}const a=this.generateWrapFunction(e),o=this.generateTextureDimension(e,t,n),u=e.is3DTexture||e.isData3DTexture?"vec3":"vec2";i&&(r=`${r} + ${u}(${i}) / ${u}( ${o} )`);return r=`${u}( clamp( floor( ${a}( ${r} ) * ${u}( ${o} ) ), ${`${u}( 0 )`}, ${`${u}( ${o} - ${"vec3"===u?"vec3( 1, 1, 1 )":"vec2( 1, 1 )"} )`} ) )`,this.generateTextureLoad(e,t,r,n,s,null)}generateStorageTextureLoad(e,t,r,s,i,n){let a;return n&&(r=`${r} + ${n}`),a=i?`textureLoad( ${t}, ${r}, ${i} )`:`textureLoad( ${t}, ${r} )`,a}generateTextureLoad(e,t,r,s,i,n){let a;return null===s&&(s="0u"),n&&(r=`${r} + ${n}`),i?a=`textureLoad( ${t}, ${r}, ${i}, u32( ${s} ) )`:(a=`textureLoad( ${t}, ${r}, u32( ${s} ) )`,this.renderer.backend.compatibilityMode&&e.isDepthTexture&&(a+=".x")),a}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&&this.renderer.hasCompatibility(A.TEXTURE_COMPARE)}isUnfilterable(e){return"float"!==this.getComponentTypeFromTexture(e)||!this.isAvailable("float32Filterable")&&e.type===Q||!1===this.isSampleCompare(e)&&e.minFilter===B&&e.magFilter===B||this.renderer.backend.utils.getTextureSampleData(e).primarySamples>1}generateTexture(e,t,r,s,i,n=this.shaderStage){let a=null;return a=this.isUnfilterable(e)?this.generateTextureLod(e,t,r,s,i,"0",n):this._generateTextureSample(e,t,r,s,i,n),a}generateTextureGrad(e,t,r,s,i,n,a=this.shaderStage){if("fragment"===a)return i?n?`textureSampleGrad( ${t}, ${t}_sampler, ${r}, ${i}, ${s[0]}, ${s[1]}, ${n} )`:`textureSampleGrad( ${t}, ${t}_sampler, ${r}, ${i}, ${s[0]}, ${s[1]} )`:n?`textureSampleGrad( ${t}, ${t}_sampler, ${r}, ${s[0]}, ${s[1]}, ${n} )`:`textureSampleGrad( ${t}, ${t}_sampler, ${r}, ${s[0]}, ${s[1]} )`;o(`WebGPURenderer: THREE.TextureNode.gradient() does not support ${a} shader.`)}generateTextureCompare(e,t,r,s,i,n,a=this.shaderStage){if("fragment"===a)return!0===e.isDepthTexture&&!0===e.isArrayTexture?n?`textureSampleCompare( ${t}, ${t}_sampler, ${r}, ${i}, ${s}, ${n} )`:`textureSampleCompare( ${t}, ${t}_sampler, ${r}, ${i}, ${s} )`:n?`textureSampleCompare( ${t}, ${t}_sampler, ${r}, ${s}, ${n} )`:`textureSampleCompare( ${t}, ${t}_sampler, ${r}, ${s} )`;o(`WebGPURenderer: THREE.DepthTexture.compareFunction() does not support ${a} shader.`)}generateTextureLevel(e,t,r,s,i,n){return!1===this.isUnfilterable(e)?i?n?`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${i}, ${s}, ${n} )`:`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${i}, ${s} )`:n?`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${s}, ${n} )`:`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${s} )`:this.isFilteredTexture(e)?this.generateFilteredTexture(e,t,r,n,s,i):this.generateTextureLod(e,t,r,i,n,s)}generateTextureBias(e,t,r,s,i,n,a=this.shaderStage){if("fragment"===a)return i?n?`textureSampleBias( ${t}, ${t}_sampler, ${r}, ${i}, ${s}, ${n} )`:`textureSampleBias( ${t}, ${t}_sampler, ${r}, ${i}, ${s} )`:n?`textureSampleBias( ${t}, ${t}_sampler, ${r}, ${s}, ${n} )`:`textureSampleBias( ${t}, ${t}_sampler, ${r}, ${s} )`;o(`WebGPURenderer: THREE.TextureNode.biasNode does not support ${a} 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||"cubeDepthTexture"===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=cC[e];return void 0!==t?(this._include(t),t):null}getNodeAccess(e,t){return"compute"!==t?!0===e.isAtomic?(d("WebGPURenderer: Atomic operations are only supported in compute shaders."),si.READ_WRITE):si.READ_ONLY:e.access}getStorageAccess(e,t){return oC[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||"cubeDepthTexture"===t||"storageTexture"===t||"texture3D"===t){let s=null;const n=this.getNodeAccess(e,r);"texture"===t||"storageTexture"===t?s=!0===e.value.is3DTexture?new aR(i.name,i.node,o,n):new iR(i.name,i.node,o,n):"cubeTexture"===t||"cubeDepthTexture"===t?s=new nR(i.name,i.node,o,n):"texture3D"===t&&(s=new aR(i.name,i.node,o,n)),s.store=!0===e.isStorageTextureNode,s.mipLevel=s.store?e.mipLevel:0,s.setVisibility(lC[r]);if(!0===e.value.isCubeTexture||!1===this.isUnfilterable(e.value)&&!1===s.store){const e=new jw(`${i.name}_sampler`,i.node,o);e.setVisibility(lC[r]),l.push(e,s),a=[e,s]}else l.push(s),a=[s]}else if("buffer"===t||"storageBuffer"===t||"indirectStorageBuffer"===t){const n=this.getSharedDataFromNode(e);let u=n.buffer;if(void 0===u){u=new("buffer"===t?YS:Qw)(e,o),n.buffer=u}u.setVisibility(u.getVisibility()|lC[r]),l.push(u),a=u,i.name=s||"NodeBuffer_"+i.id}else{let e=this.uniformGroups[u];void 0===e&&(e=new eR(u,o),e.setVisibility(zR.VERTEX|zR.FRAGMENT|zR.COMPUTE),this.uniformGroups[u]=e),-1===l.indexOf(e)&&l.push(e),a=this.getNodeUniform(i,t);const r=a.name;e.uniforms.some(e=>e.name===r)||e.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","builtinClipSpace","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||"cubeDepthTexture"===i.type||"storageTexture"===i.type||"texture3D"===i.type){const t=i.node.value;let s;(!0===t.isCubeTexture||!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&&!0===t.isDepthTexture)s="texture_depth_cube";else if(!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=tC(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=i.groupNode.name;if(void 0===n[e]){const t=this.uniformGroups[e];if(void 0!==t){const r=[];for(const e of t.uniforms){const t=e.getType(),s=this.getType(this.getVectorType(t));r.push(`\t${e.name} : ${s}`)}let s=this.uniformGroupsBindings[e];void 0===s&&(s={index:a.binding++,id:a.group},this.uniformGroupsBindings[e]=s),n[e]={index:s.index,id:s.id,snippets:r}}}}}for(const e in n){const t=n[e];i.push(this._getWGSLStructBinding(e,t.snippets.join(",\n"),"uniform",t.index,t.id))}return[...r,...s,...i].join("\n")}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.builtinClipSpace = ${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}getBitcastMethod(e){return`bitcast<${this.getType(e)}>`}getFloatPackingMethod(e){return this.getMethod(`floatpack_${e}_2x16`)}getFloatUnpackingMethod(e){return this.getMethod(`floatunpack_${e}_2x16`)}getTernary(e,t,r){return`select( ${r}, ${t}, ${e} )`}getType(e){return hC[e]||e}isAvailable(e){let t=dC[e];return void 0===t&&("float32Filterable"===e?t=this.renderer.hasFeature("float32-filterable"):"clipDistance"===e&&(t=this.renderer.hasFeature("clip-distances")),dC[e]=t),t}_getWGSLMethod(e){return void 0!==gC[e]&&this._include(e),mC[e]}_include(e){const t=gC[e];return t.build(this),this.addInclude(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${fC}\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 bC{constructor(e){this.backend=e}getCurrentDepthStencilFormat(e){let t;return e.depth&&(t=null!==e.depthTexture?this.getTextureFormatGPU(e.depthTexture):e.stencil?WA:$A),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.currentSamples}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}getCurrentColorFormats(e){return null!==e.textures?e.textures.map(e=>this.getTextureFormatGPU(e)):[this.getPreferredCanvasFormat()]}getCurrentColorSpace(e){return null!==e.textures?e.textures[0].colorSpace:this.backend.renderer.outputColorSpace}getPrimitiveTopology(e,t){return e.isPoints?OR:e.isLineSegments||e.isMesh&&!0===t.wireframe?VR:e.isLine?kR:e.isMesh?GR:void 0}getSampleCount(e){return e>=4?4:1}getSampleCountRenderContext(e){return null!==e.textures?this.getSampleCount(e.sampleCount):this.getSampleCount(this.backend.renderer.currentSamples)}getPreferredCanvasFormat(){const e=this.backend.parameters.outputType;if(void 0===e)return navigator.gpu.getPreferredCanvasFormat();if(e===ke)return wA;if(e===_e)return OA;throw new Error("Unsupported output buffer type.")}}const xC=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&&xC.set(Float16Array,["float16"]);const TC=new Map([[bt,["float16"]]]),_C=new Map([[Int32Array,"sint32"],[Int16Array,"sint32"],[Uint32Array,"uint32"],[Uint16Array,"uint32"],[Float32Array,"float32"]]);class vC{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;e0&&(void 0===n.groups&&(n.groups=[],n.versions=[]),n.versions[r]===s&&(o=n.groups[r])),void 0===o&&(o=this.createBindGroup(e,a),r>0&&(n.groups[r]=o,n.versions[r]=s)),n.group=o}updateBinding(e){const t=this.backend,r=t.device,s=e.buffer,i=t.get(e).buffer,n=e.updateRanges;if(0===n.length)r.queue.writeBuffer(i,0,s,0);else{const e=Kr(s),t=e?1:s.BYTES_PER_ELEMENT;for(let a=0,o=n.length;a1&&(i+=`-${e.texture.depthOrArrayLayers}`),i+=`-${r}-${s}`,a=e[i],void 0===a){const n=zw;let o;o=t.isSampledCubeTexture?kw:t.isSampledTexture3D?Gw:t.texture.isArrayTexture||t.texture.isDataArrayTexture||t.texture.isCompressedArrayTexture?Vw:Ow,a=e[i]=e.texture.createView({aspect:n,dimension:o,mipLevelCount:r,baseMipLevel:s})}}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})}_createLayoutEntries(e){const t=[];let r=0;for(const s of e.bindings){const e=this.backend,i={binding:r,visibility:s.visibility};if(s.isUniformBuffer||s.isStorageBuffer){const e={};s.isStorageBuffer&&(s.visibility&zR.COMPUTE&&(s.access===si.READ_WRITE||s.access===si.WRITE_ONLY)?e.type=Sw:e.type=Rw),i.buffer=e}else if(s.isSampledTexture&&s.store){const e={};e.format=this.backend.get(s.texture).texture.format;const t=s.access;e.access=t===si.READ_WRITE?ww:t===si.WRITE_ONLY?Aw:Ew,s.texture.isArrayTexture?e.viewDimension=Vw:s.texture.is3DTexture&&(e.viewDimension=Gw),i.storageTexture=e}else if(s.isSampledTexture){const t={},{primarySamples:r}=e.utils.getTextureSampleData(s.texture);if(r>1&&(t.multisampled=!0,s.texture.isDepthTexture||(t.sampleType=Fw)),s.texture.isDepthTexture)e.compatibilityMode&&null===s.texture.compareFunction?t.sampleType=Fw:t.sampleType=Lw;else if(s.texture.isDataTexture||s.texture.isDataArrayTexture||s.texture.isData3DTexture||s.texture.isStorageTexture){const e=s.texture.type;e===R?t.sampleType=Pw:e===S?t.sampleType=Dw:e===Q&&(this.backend.hasFeature("float32-filterable")?t.sampleType=Bw:t.sampleType=Fw)}s.isSampledCubeTexture?t.viewDimension=kw:s.texture.isArrayTexture||s.texture.isDataArrayTexture||s.texture.isCompressedArrayTexture?t.viewDimension=Vw:s.isSampledTexture3D&&(t.viewDimension=Gw),i.texture=t}else if(s.isSampler){const t={};s.texture.isDepthTexture&&(null!==s.texture.compareFunction&&e.hasCompatibility(A.TEXTURE_COMPARE)?t.type=Mw:t.type=Cw),i.sampler=t}else o(`WebGPUBindingUtils: Unsupported binding "${s}".`);t.push(i),r++}return t}deleteBindGroupData(e){const{backend:t}=this,r=t.get(e);r.layout&&(r.layout.usedTimes--,0===r.layout.usedTimes&&this._bindGroupLayoutCache.delete(r.layoutKey),r.layout=void 0,r.layoutKey=void 0)}dispose(){this._bindGroupLayoutCache.clear()}}class RC{constructor(e){this.backend=e}getMaxAnisotropy(){return 16}getUniformBufferLimit(){return this.backend.device.limits.maxUniformBufferBindingSize}}class AC{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:u}=n,l=this.backend,d=l.device,c=l.utils,h=l.get(n),p=[];for(const t of e.getBindings()){const e=l.get(t),{layoutGPU:r}=e.layout;p.push(r)}const g=l.attributeUtils.createShaderVertexBuffers(e);let m;s.blending===se||s.blending===et&&!1===s.transparent||(m=this._getBlending(s));let f={};!0===s.stencilWrite&&(f={compare:this._getStencilCompare(s),failOp:this._getStencilOperation(s.stencilFail),depthFailOp:this._getStencilOperation(s.stencilZFail),passOp:this._getStencilOperation(s.stencilZPass)});const y=this._getColorWriteMask(s),b=[];if(null!==e.context.textures){const t=e.context.textures,r=e.context.mrt;for(let e=0;e1},layout:d.createPipelineLayout({bindGroupLayouts:p})},E={},w=e.context.depth,C=e.context.stencil;if(!0!==w&&!0!==C||(!0===w&&(E.format=S,E.depthWriteEnabled=s.depthWrite,E.depthCompare=N),!0===C&&(E.stencilFront=f,E.stencilBack=f,E.stencilReadMask=s.stencilFuncMask,E.stencilWriteMask=s.stencilWriteMask),!0===s.polygonOffset&&(E.depthBias=s.polygonOffsetUnits,E.depthBiasSlopeScale=s.polygonOffsetFactor,E.depthBiasClamp=0),A.depthStencil=E),d.pushErrorScope("validation"),null===t)h.pipeline=d.createRenderPipeline(A),d.popErrorScope().then(e=>{null!==e&&(h.error=!0,o(e.message))});else{const e=new Promise(async e=>{try{h.pipeline=await d.createRenderPipelineAsync(A)}catch(e){}const t=await d.popErrorScope();null!==t&&(h.error=!0,o(t.message)),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.getCurrentColorFormats(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),{layoutGPU:s}=t.layout;a.push(s)}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===St){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:lw},r={srcFactor:i,dstFactor:n,operation:lw}};if(e.premultipliedAlpha)switch(s){case et:i(YE,tw,YE,tw);break;case Zt:i(YE,YE,YE,YE);break;case Yt:i(QE,JE,QE,YE);break;case Qt:i(rw,tw,QE,YE)}else switch(s){case et:i(ew,tw,YE,tw);break;case Zt:i(ew,YE,YE,YE);break;case Yt:o(`WebGPURenderer: "SubtractiveBlending" requires "${e.isMaterial?"material":"blendMode"}.premultipliedAlpha = true".`);break;case Qt:o(`WebGPURenderer: "MultiplyBlending" requires "${e.isMaterial?"material":"blendMode"}.premultipliedAlpha = true".`)}}if(void 0!==t&&void 0!==r)return{color:t,alpha:r};o("WebGPURenderer: Invalid blending: ",s)}_getBlendFactor(e){let t;switch(e){case Rt:t=QE;break;case qt:t=YE;break;case Ht:t=ZE;break;case Gt:t=JE;break;case tt:t=ew;break;case rt:t=tw;break;case $t:t=rw;break;case kt:t=sw;break;case zt:t=iw;break;case Vt:t=nw;break;case Wt:t=aw;break;case 211:t=ow;break;case 212:t=uw;break;default:o("WebGPURenderer: Blend factor not supported.",e)}return t}_getStencilCompare(e){let t;const r=e.stencilFunc;switch(r){case ss:t=$R;break;case rs:t=QR;break;case ts:t=WR;break;case es:t=qR;break;case Jr:t=HR;break;case Zr:t=KR;break;case Yr:t=jR;break;case Qr:t=XR;break;default:o("WebGPURenderer: Invalid stencil function.",r)}return t}_getStencilOperation(e){let t;switch(e){case cs:t=fw;break;case ds:t=yw;break;case ls:t=bw;break;case us:t=xw;break;case os:t=Tw;break;case as:t=_w;break;case ns:t=vw;break;case is:t=Nw;break;default:o("WebGPURenderer: Invalid stencil operation.",t)}return t}_getBlendOperation(e){let t;switch(e){case st:t=lw;break;case Ot:t=dw;break;case It:t=cw;break;case ps:t=hw;break;case hs:t=pw;break;default:o("WebGPUPipelineUtils: Blend equation not supported.",e)}return t}_getPrimitiveState(e,t,r){const s={},i=this.backend.utils;s.topology=i.getPrimitiveTopology(e,r),null!==t.index&&!0===e.isLine&&!0!==e.isLineSegments&&(s.stripIndexFormat=t.index.array instanceof Uint16Array?iA:nA);let n=r.side===L;return e.isMesh&&e.matrixWorld.determinant()<0&&(n=!n),s.frontFace=!0===n?tA:eA,s.cullMode=r.side===P?rA:sA,s}_getColorWriteMask(e){return!0===e.colorWrite?mw:gw}_getDepthCompare(e){let t;if(!1===e.depthTest)t=QR;else{const r=this.backend.parameters.reversedDepthBuffer?or[e.depthFunc]:e.depthFunc;switch(r){case ar:t=$R;break;case nr:t=QR;break;case ir:t=WR;break;case sr:t=qR;break;case rr:t=HR;break;case tr:t=KR;break;case er:t=jR;break;case Jt:t=XR;break;default:o("WebGPUPipelineUtils: Invalid depth function.",r)}}return t}}class EC extends DR{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 v(`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,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)),a={},o=[];for(const[t,r]of e){const e=t.match(/^(.*):f(\d+)$/),s=parseInt(e[2]);!1===o.includes(s)&&o.push(s),void 0===a[s]&&(a[s]=0);const i=n[r],u=n[r+1],l=Number(u-i)/1e6;this.timestamps.set(t,l),a[s]+=l}const u=a[o[o.length-1]];return this.resultBuffer.unmap(),this.lastValue=u,this.frames=o,u}catch(e){return o("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){o("Error waiting for pending resolve:",e)}if(this.resultBuffer&&"mapped"===this.resultBuffer.mapState)try{this.resultBuffer.unmap()}catch(e){o("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 wC extends yR{constructor(e={}){super(e),this.isWebGPUBackend=!0,this.parameters.alpha=void 0===e.alpha||e.alpha,this.parameters.requiredLimits=void 0===e.requiredLimits?{}:e.requiredLimits,this.compatibilityMode=null,this.device=null,this.defaultRenderPassdescriptor=null,this.utils=new bC(this),this.attributeUtils=new vC(this),this.bindingUtils=new SC(this),this.capabilities=new RC(this),this.pipelineUtils=new AC(this),this.textureUtils=new eC(this),this.occludedResolveCache=new Map;const t="undefined"==typeof navigator||!1===/Android/.test(navigator.userAgent);this._compatibility={[A.TEXTURE_COMPARE]:t}}async init(e){await super.init(e);const t=this.parameters;let r;if(void 0===t.device){const e={powerPreference:t.powerPreference,featureLevel:"compatibility"},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(Hw),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;this.compatibilityMode=!r.features.has("core-features-and-limits"),this.compatibilityMode&&(e._samples=0),r.lost.then(t=>{if("destroyed"===t.reason)return;const r={api:"WebGPU",message:t.message||"Unknown reason",reason:t.reason||null,originalEvent:t};e.onDeviceLost(r)}),this.device=r,this.trackTimestamp=this.trackTimestamp&&this.hasFeature(Hw.TimestampQuery),this.updateSize()}get context(){const e=this.renderer.getCanvasTarget(),t=this.get(e);let r=t.context;if(void 0===r){const s=this.parameters;r=!0===e.isDefaultCanvasTarget&&void 0!==s.context?s.context:e.domElement.getContext("webgpu"),"setAttribute"in e.domElement&&e.domElement.setAttribute("data-engine",`three.js r${Tt} webgpu`);const i=s.alpha?"premultiplied":"opaque",n=s.outputType===_e?"extended":"standard";r.configure({device:this.device,format:this.utils.getPreferredCanvasFormat(),usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.COPY_SRC,alphaMode:i,toneMapping:{mode:n}}),t.context=r}return r}get coordinateSystem(){return h}async getArrayBufferAsync(e){return await this.attributeUtils.getArrayBufferAsync(e)}getContext(){return this.context}_getDefaultRenderPassDescriptor(){const e=this.renderer,t=e.getCanvasTarget(),r=this.get(t),s=e.currentSamples;let i=r.descriptor;if(void 0===i||r.samples!==s){i={colorAttachments:[{view:null}]},!0!==e.depth&&!0!==e.stencil||(i.depthStencilAttachment={view:this.textureUtils.getDepthBuffer(e.depth,e.stencil).createView()});const t=i.colorAttachments[0];s>0?t.view=this.textureUtils.getColorBuffer().createView():t.resolveTarget=void 0,r.descriptor=i,r.samples=s}const n=i.colorAttachments[0];return s>0?n.resolveTarget=this.context.getCurrentTexture().createView():n.view=this.context.getCurrentTexture().createView(),i}_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;void 0!==i&&s.width===r.width&&s.height===r.height&&s.samples===r.samples||(i={},s.descriptors=i);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:ZR}),this.initTimestampQuery(Dt.RENDER,this.getTimestampUID(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;eo&&(i[0]=Math.min(a,o),i[1]=Math.ceil(a/o)),n.dispatchSize=i}i=n.dispatchSize}a.dispatchWorkgroups(i[0],i[1]||1,i[2]||1)}finishCompute(e){const t=this.get(e);t.passEncoderGPU.end(),this.device.queue.submit([t.cmdEncoderGPU.finish()])}_draw(e,t,r,s,i,n,a,o,u){const{object:l,material:d,context:c}=e,h=e.getIndex(),p=null!==h;this.pipelineUtils.setPipeline(o,s),u.pipeline=s;const g=u.bindingGroups;for(let e=0,t=i.length;e65535?4:2);for(let a=0;a1?0:a;!0===p?o.drawIndexed(r[a],s,e[a]/n,0,u):o.draw(r[a],s,e[a],u),t.update(l,r[a],s)}}else if(!0===p){const{vertexCount:r,instanceCount:s,firstVertex:i}=a,n=e.getIndirect();if(null!==n){const t=this.get(n).buffer,r=e.getIndirectOffset(),s=Array.isArray(r)?r:[r];for(let e=0;e0){const i=this.get(e.camera),a=e.camera.cameras,c=e.getBindingGroup("cameraIndex");if(void 0===i.indexesGPU||i.indexesGPU.length!==a.length){const e=this.get(c),t=[],r=new Uint32Array([0,0,0,0]);for(let s=0,i=a.length;s(d("WebGPURenderer: WebGPU is not available, running under WebGL2 backend."),new IR(e)));super(new t(e),e),this.library=new BC,this.isWebGPURenderer=!0}}class LC extends Es{constructor(){super(),this.isBundleGroup=!0,this.type="BundleGroup",this.static=!0,this.version=0}set needsUpdate(e){!0===e&&this.version++}}class PC{constructor(e,t=wn(0,0,1,1)){this.renderer=e,this.outputNode=t,this.outputColorTransform=!0,this.needsUpdate=!0;const r=new fg;r.name="RenderPipeline",this._quadMesh=new ux(r),this._quadMesh.name="Render Pipeline",this._context=null}render(){const e=this.renderer;this._update(),null!==this._context.onBeforeRenderPipeline&&this._context.onBeforeRenderPipeline();const t=e.toneMapping,r=e.outputColorSpace;e.toneMapping=m,e.outputColorSpace=p.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.onAfterRenderPipeline&&this._context.onAfterRenderPipeline()}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={renderPipeline:this,onBeforeRenderPipeline:null,onAfterRenderPipeline:null};let i=this.outputNode;!0===this.outputColorTransform?(i=i.context(s),i=bl(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(){v('RenderPipeline: "renderAsync()" has been deprecated. Use "render()" and "await renderer.init();" when creating the renderer.'),await this.renderer.init(),this.render()}}class DC extends PC{constructor(e,t){v('PostProcessing: "PostProcessing" has been renamed to "RenderPipeline". Please update your code to use "THREE.RenderPipeline" instead.'),super(e,t)}}class UC extends N{constructor(e=1,t=1){super(),this.image={width:e,height:t},this.magFilter=de,this.minFilter=de,this.isStorageTexture=!0,this.mipmapsAutoUpdate=!0}setSize(e,t){this.image.width===e&&this.image.height===t||(this.image.width=e,this.image.height=t,this.dispose())}}class IC extends _x{constructor(e,t){super(e,t,Uint32Array),this.isIndirectStorageBufferAttribute=!0}}class OC extends ws{constructor(e){super(e),this.textures={},this.nodes={}}load(e,t,r,s){const i=new Cs(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):o(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]?(o("NodeLoader: Node type not found:",e),fn()):new this.nodes[e]}}class VC extends Ms{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 kC extends Bs{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 OC;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 VC;i.setTextures(t),i.setNodes(s),i.setNodeMaterials(this.nodeMaterials);for(let t=0,s=e.length;t Date: Sat, 14 Mar 2026 11:40:47 +0100 Subject: [PATCH 3/5] Examples: Improve `MapControls` demo. (#33171) --- examples/misc_controls_map.html | 2 +- examples/screenshots/misc_controls_map.jpg | Bin 50525 -> 33596 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/misc_controls_map.html b/examples/misc_controls_map.html index 9c78156028b3be..5b79a7b00a47b6 100644 --- a/examples/misc_controls_map.html +++ b/examples/misc_controls_map.html @@ -57,7 +57,7 @@ document.body.appendChild( renderer.domElement ); camera = new THREE.PerspectiveCamera( 60, window.innerWidth / window.innerHeight, 1, 1000 ); - camera.position.set( 0, 200, - 400 ); + camera.position.set( 0, 200, - 200 ); // controls diff --git a/examples/screenshots/misc_controls_map.jpg b/examples/screenshots/misc_controls_map.jpg index 59f54d84daeb8310aed769e86e8522fdb44a55d0..486d1a34b82cdda8d75b9cf563fd671eecf1c663 100644 GIT binary patch literal 33596 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 hygOSk Date: Sat, 14 Mar 2026 04:02:58 -0700 Subject: [PATCH 4/5] Hdr loader header parse fix (#33174) --- examples/jsm/loaders/HDRLoader.js | 2 +- test/unit/addons/loaders/HDRLoader.tests.js | 49 +++++++++++++++++++++ test/unit/three.addons.unit.js | 1 + 3 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 test/unit/addons/loaders/HDRLoader.tests.js diff --git a/examples/jsm/loaders/HDRLoader.js b/examples/jsm/loaders/HDRLoader.js index fa39973c893d82..0da755bc5db1ad 100644 --- a/examples/jsm/loaders/HDRLoader.js +++ b/examples/jsm/loaders/HDRLoader.js @@ -100,7 +100,7 @@ class HDRLoader extends DataTextureLoader { s += chunk; len += chunk.length; p += chunkSize; - chunk += String.fromCharCode.apply( null, new Uint16Array( buffer.subarray( p, p + chunkSize ) ) ); + chunk = String.fromCharCode.apply( null, new Uint16Array( buffer.subarray( p, p + chunkSize ) ) ); } diff --git a/test/unit/addons/loaders/HDRLoader.tests.js b/test/unit/addons/loaders/HDRLoader.tests.js new file mode 100644 index 00000000000000..38983584915c16 --- /dev/null +++ b/test/unit/addons/loaders/HDRLoader.tests.js @@ -0,0 +1,49 @@ +import { HDRLoader } from '../../../../examples/jsm/loaders/HDRLoader.js'; + +export default QUnit.module( 'Addons', () => { + + QUnit.module( 'Loaders', () => { + + QUnit.module( 'HDRLoader', () => { + + QUnit.test( 'Instancing', ( assert ) => { + + const loader = new HDRLoader(); + + assert.ok( loader instanceof HDRLoader, 'Can instantiate an HDRLoader.' ); + + } ); + + QUnit.test( 'parses valid HDR with large header (> chunk size)', ( assert ) => { + + // Regression: fgets uses chunkSize=128. When a line (e.g. pcomb) exceeds + // 128 bytes, chunking can skip the FORMAT line, causing "missing format + // specifier". This minimal synthetic HDR reproduces the bug. + const header = [ + '#?RADIANCE', + 'some large header line' + 'x'.repeat( 128 ), + 'FORMAT=32-bit_rle_rgbe', + '-Y 0 +X 0', + '' + ].join( '\n' ); + const encoder = new TextEncoder(); + const headerBytes = encoder.encode( header ); + + const buffer = new Uint8Array( headerBytes.length ); + buffer.set( headerBytes ); + + const loader = new HDRLoader(); + const result = loader.parse( buffer.buffer ); + + assert.ok( result, 'Parse succeeds' ); + assert.strictEqual( result.width, 0, 'Width' ); + assert.strictEqual( result.height, 0, 'Height' ); + assert.ok( result.data, 'Has texture data' ); + + } ); + + } ); + + } ); + +} ); diff --git a/test/unit/three.addons.unit.js b/test/unit/three.addons.unit.js index 8dffa86d699c05..6c8c23f9966408 100644 --- a/test/unit/three.addons.unit.js +++ b/test/unit/three.addons.unit.js @@ -3,4 +3,5 @@ import './addons/utils/BufferGeometryUtils.tests.js'; import './addons/math/ColorSpaces.tests.js'; import './addons/curves/NURBSCurve.tests.js'; +import './addons/loaders/HDRLoader.tests.js'; import './addons/exporters/USDZExporter.tests.js'; From 740fba97feb7eeb71fcdfe036853c43f888bd78c Mon Sep 17 00:00:00 2001 From: Michael Herzog Date: Sat, 14 Mar 2026 12:03:33 +0100 Subject: [PATCH 5/5] WebGLRenderer: Improve reverse depth buffer logging. (#33176) --- src/renderers/webgl/WebGLCapabilities.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/renderers/webgl/WebGLCapabilities.js b/src/renderers/webgl/WebGLCapabilities.js index 2c309c593be86c..3b906bbeef3c1e 100644 --- a/src/renderers/webgl/WebGLCapabilities.js +++ b/src/renderers/webgl/WebGLCapabilities.js @@ -95,6 +95,12 @@ function WebGLCapabilities( gl, extensions, parameters, utils ) { const logarithmicDepthBuffer = parameters.logarithmicDepthBuffer === true; const reversedDepthBuffer = parameters.reversedDepthBuffer === true && extensions.has( 'EXT_clip_control' ); + if ( parameters.reversedDepthBuffer === true && reversedDepthBuffer === false ) { + + warn( 'WebGLRenderer: Unable to use reversed depth buffer due to missing EXT_clip_control extension. Fallback to default depth buffer.' ); + + } + const maxTextures = gl.getParameter( gl.MAX_TEXTURE_IMAGE_UNITS ); const maxVertexTextures = gl.getParameter( gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS ); const maxTextureSize = gl.getParameter( gl.MAX_TEXTURE_SIZE );