@hology/core 0.0.228 → 0.0.229

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -89,6 +89,11 @@ export declare class ExperimentalWebGpuBackend {
89
89
  readonly y: number;
90
90
  }[], lights?: readonly THREE.DirectionalLight[]): void;
91
91
  setWorldEnvironment(environment: WorldEnvironmentState | null): void;
92
+ /**
93
+ * Invalidates state whose contents belong to the previously presented view.
94
+ * GPU resource and pipeline caches intentionally remain resident.
95
+ */
96
+ resetViewHistory(): void;
92
97
  compile(scene: THREE.Scene, camera: SupportedCamera): Promise<void>;
93
98
  createStaticDrawSet(root: THREE.Object3D, label: string): ExperimentalWebGpuStaticDrawSet | null;
94
99
  render(scene: THREE.Scene, camera: SupportedCamera, timeSeconds: number): void;
@@ -1,4 +1,4 @@
1
- import*as e from"three";import{NodeMaterialWebGpuResolver as t}from"./node-material-webgpu-resolver.js";import{float as n,varyingTransformed as i,vec4 as r}from"three-shader-graph";import{NodeShaderMaterial as o}from"../shader-nodes/index.js";import{sceneMapUniformName as s}from"../shader-nodes/scene-sample.js";export class ExperimentalWebGpuBackend{constructor(e,t,n,i,r,o,s,a,l,d,c,u,h,p,m){this.renderer=e,this.fallbackMaterial=t,this.nodeMaterialResolver=n,this.gBufferFallbackSource=i,this.bloom=r,this.fxaa=o,this.gtao=s,this.ssr=a,this.taa=l,this.volumetricFog=d,this.colorGrading=c,this.depthOfField=u,this.outline=h,this.postProcessEffects=p,this.pmremGenerator=null,this.pmremResults=new WeakMap,this.ownedPmremResults=new Set,this.warnedUnsupportedPostProcessStages=new Set,this.canvas=m}static async create(d={}){const c=await import("@hology/webgpu-renderer"),u=document.createElement("canvas");u.dataset.hologyRenderer="webgpu-experimental";const h=new c.WGSLShaderMaterial({vertexShader:a,fragmentShader:l});h.side=c.DoubleSide;const p=new t(c,(e,t)=>"opaque"===t?[e.outputColor.xyz.rgba(e.alphaTest),r((e.outputNormal??i.normal).multiplyScalar(.5).addScalar(.5),e.outputRoughness??n(1))]:void 0),m=new e.MeshStandardMaterial({color:8688803,roughness:1});if(null==p.resolve(m,"opaque"))throw h.dispose(),m.dispose(),new Error("Failed to compile the WebGPU G-buffer fallback material.");const g=!1===d.gtao?null:new c.GTAOEffect({normalSpace:"view",resolutionScale:.5,...d.gtao??{}}),f=!1===d.ssr||null==d.ssr?null:new c.SSREffect({normalSpace:"view",resolutionScale:.5,...d.ssr??{}}),P=!1===d.bloom?null:new c.BloomEffect({threshold:1,strength:.9,radius:.2,...d.bloom??{}}),S=!1===d.fxaa||null==d.fxaa?null:new c.FXAAEffect(d.fxaa),x=!1===d.taa?null:new c.TemporalAAEffect({renderScale:.9,...d.taa??{}}),b=d.volumetricFog||void 0,w=!1===d.volumetricFog?null:new c.VolumetricFogEffect(void 0,{froxelPixelSize:8,maxDistance:64,depthSlices:64,integrationSubsteps:2,temporalJitter:!0,spatialJitter:!0,scatteringIntensity:Math.PI,...b,blur:!1!==b?.blur&&{depthAwareUpsample:!0,...b?.blur}}),v=!1===d.colorGrading?null:new c.ColorGradingEffect({enabled:!1,...d.colorGrading??{}}),C=!1===d.depthOfField?null:new c.DepthOfFieldEffect({enabled:!1,...d.depthOfField??{}}),L=!1===d.outline?null:new c.OutlineEffect({enabled:!1,...d.outline??{}}),F=[],y=new WeakMap,M=new Set,G=(e,t,n)=>{let i=n;const r=F.filter(e=>e.enabled&&e.stage===t).sort((e,t)=>e.priority-t.priority||e.id-t.id);for(const t of r){if(!(t.material instanceof o)){const e=`${t.id}:material`;M.has(e)||(M.add(e),console.warn(`[Hology WebGPU experiment] Skipping custom post-process effect ${t.id}: only NodeShaderMaterial effects are supported.`));continue}try{let n=y.get(t.material);null!=n&&n.version===t.material.version||(n={version:t.material.version,shader:p.compileFullscreen(t.material)},y.set(t.material,n));const r=e.createColorTarget(`hologyCustomPostProcess${t.id}`);e.addNodeFullscreenPass({name:`HologyCustomPostProcess${t.id}`,shader:n.shader,inputOverrides:{[s]:i},outputs:r}),i=r}catch(e){const n=`${t.id}:compile:${t.material.version}`;M.has(n)||(M.add(n),console.warn(`[Hology WebGPU experiment] Skipping custom post-process effect ${t.id}: ${e instanceof Error?e.message:String(e)}`,e))}}return i},R=new c.WebGpuRenderer({canvas:u,fallbackMaterial:h,materialResolver:(e,t)=>p.resolve(e,t),invokeObjectRenderCallbacks:!1,hiZOcclusionCulling:!0,renderGraphProfiling:!1,sampleCount:4,multiDrawIndirect:!1});R.setRenderScale(x?.renderScale??1),R.setRenderGraphBuilder((e,t)=>{const n=new c.FrameGraphBuilder(t),i=n.createColorTarget("hologyNormalRoughness",{format:"rgba16float"});n.addDirectionalShadowPass(),n.addPointShadowPass(),n.addSpotShadowPass(),n.addDepthPrepass(),n.addHiZPasses(),n.addVisibilityPass(),n.addMaterialPass({name:"OpaqueGBufferPass",outputs:[n.sceneColor,i],drawStage:"opaque",loadDepth:!0}),n.addHiZHistoryPass("OpaqueGBufferPass");let r=n.sceneColor;if(null!=g){const e=g.addPasses(n,{depth:n.mainDepth,normal:i});r=g.addCompositePass(n,r,e)}null!=f&&(r=f.addPasses(n,{sceneColor:r,depth:n.mainDepth,normalRoughness:i})),n.addSceneTextureCopyPass(r),n.addLatePass(r),r=G(n,"beforeFog",r),null!=w&&(r=w.addPasses(n,{sceneColor:r,depth:n.mainDepth})),null!=P&&(r=P.addPass(n,r)),r=G(n,"beforeOutline",r),null!=L&&(r=L.addPass(n,r)),r=G(n,"beforeDepthOfField",r),null!=C&&(r=C.addPass(n,r,n.mainDepth)),r=G(n,"beforeColorAdjustment",r),null!=v&&(r=v.addPass(n,r)),r=G(n,"beforeAntiAliasing",r);let o=x?.addPass(n,r,n.mainDepth)??r;null!=S&&(o=S.addPass(n,o)),o=G(n,"beforeOutput",o),n.present(o)});try{return await R.initialize(),new ExperimentalWebGpuBackend(R,h,p,m,P,S,g,f,x,w,v,C,L,F,u)}catch(e){throw R.destroy(),h.dispose(),p.dispose(),m.dispose(),g?.dispose(),w?.dispose(),L?.dispose(),e}}static supportsCamera(t){return t instanceof e.PerspectiveCamera||t instanceof e.OrthographicCamera}setSize(e,t,n){this.renderer.setSize(e,t,n)}initTexture(e){this.renderer.initTexture(e)}setPostProcessEffects(e){this.postProcessEffects.splice(0,this.postProcessEffects.length,...e);for(const t of e){if("beforeLut"!==t.stage)continue;const e=`${t.id}:${t.stage}`;this.warnedUnsupportedPostProcessStages.has(e)||(this.warnedUnsupportedPostProcessStages.add(e),console.warn(`[Hology WebGPU experiment] Skipping custom post-process effect ${t.id}: stage "${t.stage}" has no native WebGPU anchor.`))}}setEnableOutlines(e){null!=this.outline&&(this.outline.enabled=e)}setDynamicBatchingEnabled(e){this.renderer.setDynamicBatchingEnabled(e)}setSelectedObjects(e){this.outline?.setSelectedObjects(e)}setSelectedObjectInstances(e){this.outline?.setSelectedInstances(e)}setCascadedShadowRanges(e,t=[]){this.renderer.setCascadedShadowRanges(e,t),this.volumetricFog?.setCascadedDirectionalLights(t)}setWorldEnvironment(t){if(null==t)return void this.nodeMaterialResolver.setWorldEnvironment(null);let n=t.source;if(n.mapping!==e.CubeUVReflectionMapping){let e=this.pmremResults.get(n);null==e&&(this.pmremGenerator??(this.pmremGenerator=this.renderer.createPMREMGenerator()),e=this.pmremGenerator.fromEquirectangular(n),this.pmremResults.set(n,e),this.ownedPmremResults.add(e)),n=e.texture}this.nodeMaterialResolver.setWorldEnvironment({texture:n,intensity:t.intensity})}async compile(e,t){await this.renderer.compileAsync(e,t)}createStaticDrawSet(e,t){this.renderer.setHiZOcclusionCullingEnabled(!0);const n=this.renderer.createStaticDrawSet(e,{label:t,onUnsupported:"skip"});return 0===n.drawCount?(n.dispose(),null):n}render(e,t,n){this.volumetricFog?.setScene(e),this.taa?.prepareCamera(t,this.canvas.width,this.canvas.height);try{this.renderer.render(e,t,n)}finally{this.taa?.finishCamera(t)}}getLastFrameProfile(){return this.renderer.getLastFrameProfile()}setPostProcessState(e){null!=this.colorGrading&&(Object.assign(this.colorGrading.options,e??{enabled:!1}),this.colorGrading.options.enabled=!0===e?.enabled),null!=this.depthOfField&&(this.depthOfField.options.enabled=null!=e?.depthFocus||null!=e?.depthAperture||null!=e?.depthMaxBlur,this.depthOfField.options.focus=e?.depthFocus,this.depthOfField.options.aperture=e?.depthAperture,this.depthOfField.options.maxBlur=e?.depthMaxBlur)}setProfilingEnabled(e){this.renderer.setRenderGraphProfilingEnabled(e)}resetTemporalHistory(){this.taa?.reset()}inspect(e,t){return inspectWebGpuScene(e,t,this.nodeMaterialResolver)}destroy(){this.nodeMaterialResolver.dispose(),this.gBufferFallbackSource.dispose(),this.gtao?.dispose(),this.volumetricFog?.dispose();for(const e of this.ownedPmremResults)e.dispose();this.ownedPmremResults.clear(),this.renderer.destroy(),this.fallbackMaterial.dispose()}}export function inspectWebGpuScene(e,t,n){const i={meshes:0,skinnedMeshes:0,instancedMeshes:0,batchedMeshes:0,sprites:0,points:0,lines:0,missingPositionGeometry:0,transparentMaterials:0,shaderMaterialsReplaced:0,materialsReplaced:0,unsupportedCamera:ExperimentalWebGpuBackend.supportsCamera(t)?0:1};return e.traverse(e=>{if(e.isSprite)return void i.sprites++;if(e.isPoints)return void i.points++;if(e.isLine)return void i.lines++;if(!e.isMesh)return;const t=e;t.isBatchedMesh?i.batchedMeshes++:t.isInstancedMesh?i.instancedMeshes++:t.isSkinnedMesh?i.skinnedMeshes++:i.meshes++,null==t.geometry?.getAttribute("position")&&i.missingPositionGeometry++;const r=Array.isArray(t.material)?t.material:[t.material];for(const e of r){if(null==e)continue;e.transparent&&i.transparentMaterials++;const t=!0===e.isWGSLShaderMaterial||!0===e.isLineMaterial,r=!t&&!0===n?.canResolve(e);t||r||(i.materialsReplaced++,e.isShaderMaterial&&i.shaderMaterialsReplaced++)}}),i}export function formatWebGpuSceneCapabilitySummary(e){return`[Hology WebGPU experiment] ${JSON.stringify(e)}`}const a="\nstruct VertexInput {\n @location(0) position: vec3<f32>,\n @location(1) normal: vec3<f32>,\n @location(2) uv: vec2<f32>,\n @location(3) color: vec4<f32>,\n#ifdef USE_SKINNING\n @location(4) skinIndex: vec4<u32>,\n @location(5) skinWeight: vec4<f32>,\n#endif\n @builtin(instance_index) instanceIndex: u32,\n};\n\nstruct VertexOutput {\n @builtin(position) position: vec4<f32>,\n @location(0) worldPosition: vec3<f32>,\n @location(1) worldNormal: vec3<f32>,\n @location(2) color: vec4<f32>,\n};\n\n@vertex\nfn vsMain(input: VertexInput) -> VertexOutput {\n var output: VertexOutput;\n#ifdef USE_SKINNING\n let localPosition = rendererSkinPosition(input.position, input.skinIndex, input.skinWeight);\n let localNormal = rendererSkinNormal(input.normal, input.skinIndex, input.skinWeight);\n#else\n let localPosition = input.position;\n let localNormal = input.normal;\n#endif\n let world = rendererWorldPosition(localPosition, input.instanceIndex);\n output.position = rendererClipPosition(localPosition, input.instanceIndex);\n output.worldPosition = world.xyz;\n output.worldNormal = rendererWorldNormal(localNormal, input.instanceIndex);\n output.color = input.color * rendererObjectColor(input.instanceIndex);\n return output;\n}\n",l="\nstruct VertexOutput {\n @builtin(position) position: vec4<f32>,\n @location(0) worldPosition: vec3<f32>,\n @location(1) worldNormal: vec3<f32>,\n @location(2) color: vec4<f32>,\n};\n\nfn distanceAttenuation(distanceToLight: f32, range: f32) -> f32 {\n let linear = max(0.0, 1.0 - distanceToLight / max(range, 0.001));\n return linear * linear;\n}\n\n@fragment\nfn fsMain(input: VertexOutput) -> @location(0) vec4<f32> {\n let normal = normalize(input.worldNormal);\n let normalTint = normal * 0.5 + vec3<f32>(0.5);\n let base = mix(vec3<f32>(0.52, 0.58, 0.64), normalTint, 0.22) * input.color.rgb;\n var lighting = rendererIndirectDiffuse(normal) + vec3<f32>(0.08);\n var directionalLighting = vec3<f32>(0.0);\n let directionalCount = rendererDirectionalLightCount();\n\n for (var index: u32 = 0u; index < directionalCount; index = index + 1u) {\n let lightDirection = rendererDirectionalLightDirectionForLight(index);\n let shadow = rendererSampleDirectionalShadowForLightWithNormal(index, input.worldPosition, normal);\n directionalLighting += rendererDirectionalLightColorForLight(index) * max(dot(normal, lightDirection), 0.0) * shadow;\n }\n if (directionalCount > 0u) {\n lighting += directionalLighting / f32(directionalCount);\n }\n\n for (var index: u32 = 0u; index < rendererPointLightCount(); index = index + 1u) {\n let lightVector = rendererPointLightPositionForLight(index) - input.worldPosition;\n let distanceToLight = length(lightVector);\n let lightDirection = normalize(lightVector);\n let shadow = rendererSamplePointShadowForLightWithNormal(index, input.worldPosition, normal);\n lighting += rendererPointLightColorForLight(index) * max(dot(normal, lightDirection), 0.0) * distanceAttenuation(distanceToLight, rendererPointLightRangeForLight(index)) * shadow;\n }\n\n for (var index: u32 = 0u; index < rendererSpotLightCount(); index = index + 1u) {\n let lightVector = rendererSpotLightPositionForLight(index) - input.worldPosition;\n let distanceToLight = length(lightVector);\n let lightDirection = normalize(lightVector);\n let angleCos = dot(-lightDirection, rendererSpotLightDirectionForLight(index));\n let cone = smoothstep(rendererSpotLightConeCosForLight(index), rendererSpotLightPenumbraCosForLight(index), angleCos);\n let shadow = rendererSampleSpotShadowForLightWithNormal(index, input.worldPosition, normal);\n lighting += rendererSpotLightColorForLight(index) * max(dot(normal, lightDirection), 0.0) * cone * distanceAttenuation(distanceToLight, rendererSpotLightRangeForLight(index)) * shadow;\n }\n\n return vec4<f32>(base * max(lighting, vec3<f32>(0.08)), input.color.a);\n}\n";/*
1
+ import*as e from"three";import{NodeMaterialWebGpuResolver as t}from"./node-material-webgpu-resolver.js";import{float as n,varyingTransformed as i,vec4 as r}from"three-shader-graph";import{NodeShaderMaterial as o}from"../shader-nodes/index.js";import{sceneMapUniformName as s}from"../shader-nodes/scene-sample.js";export class ExperimentalWebGpuBackend{constructor(e,t,n,i,r,o,s,a,l,d,c,u,h,p,m){this.renderer=e,this.fallbackMaterial=t,this.nodeMaterialResolver=n,this.gBufferFallbackSource=i,this.bloom=r,this.fxaa=o,this.gtao=s,this.ssr=a,this.taa=l,this.volumetricFog=d,this.colorGrading=c,this.depthOfField=u,this.outline=h,this.postProcessEffects=p,this.pmremGenerator=null,this.pmremResults=new WeakMap,this.ownedPmremResults=new Set,this.warnedUnsupportedPostProcessStages=new Set,this.canvas=m}static async create(d={}){const c=await import("@hology/webgpu-renderer"),u=document.createElement("canvas");u.dataset.hologyRenderer="webgpu-experimental";const h=new c.WGSLShaderMaterial({vertexShader:a,fragmentShader:l});h.side=c.DoubleSide;const p=new t(c,(e,t)=>"opaque"===t?[e.outputColor.xyz.rgba(e.alphaTest),r((e.outputNormal??i.normal).multiplyScalar(.5).addScalar(.5),e.outputRoughness??n(1))]:void 0),m=new e.MeshStandardMaterial({color:8688803,roughness:1});if(null==p.resolve(m,"opaque"))throw h.dispose(),m.dispose(),new Error("Failed to compile the WebGPU G-buffer fallback material.");const g=!1===d.gtao?null:new c.GTAOEffect({normalSpace:"view",resolutionScale:.5,...d.gtao??{}}),f=!1===d.ssr||null==d.ssr?null:new c.SSREffect({normalSpace:"view",resolutionScale:.5,...d.ssr??{}}),P=!1===d.bloom?null:new c.BloomEffect({threshold:1,strength:.9,radius:.2,...d.bloom??{}}),S=!1===d.fxaa||null==d.fxaa?null:new c.FXAAEffect(d.fxaa),x=!1===d.taa?null:new c.TemporalAAEffect({renderScale:.9,...d.taa??{}}),w=d.volumetricFog||void 0,b=!1===d.volumetricFog?null:new c.VolumetricFogEffect(void 0,{froxelPixelSize:8,maxDistance:64,depthSlices:64,integrationSubsteps:2,temporalJitter:!0,spatialJitter:!0,scatteringIntensity:Math.PI,...w,blur:!1!==w?.blur&&{depthAwareUpsample:!0,...w?.blur}}),v=!1===d.colorGrading?null:new c.ColorGradingEffect({enabled:!1,...d.colorGrading??{}}),C=!1===d.depthOfField?null:new c.DepthOfFieldEffect({enabled:!1,...d.depthOfField??{}}),L=!1===d.outline?null:new c.OutlineEffect({enabled:!1,...d.outline??{}}),y=[],F=new WeakMap,M=new Set,G=(e,t,n)=>{let i=n;const r=y.filter(e=>e.enabled&&e.stage===t).sort((e,t)=>e.priority-t.priority||e.id-t.id);for(const t of r){if(!(t.material instanceof o)){const e=`${t.id}:material`;M.has(e)||(M.add(e),console.warn(`[Hology WebGPU experiment] Skipping custom post-process effect ${t.id}: only NodeShaderMaterial effects are supported.`));continue}try{let n=F.get(t.material);null!=n&&n.version===t.material.version||(n={version:t.material.version,shader:p.compileFullscreen(t.material)},F.set(t.material,n));const r=e.createColorTarget(`hologyCustomPostProcess${t.id}`);e.addNodeFullscreenPass({name:`HologyCustomPostProcess${t.id}`,shader:n.shader,inputOverrides:{[s]:i},outputs:r}),i=r}catch(e){const n=`${t.id}:compile:${t.material.version}`;M.has(n)||(M.add(n),console.warn(`[Hology WebGPU experiment] Skipping custom post-process effect ${t.id}: ${e instanceof Error?e.message:String(e)}`,e))}}return i},R=new c.WebGpuRenderer({canvas:u,fallbackMaterial:h,materialResolver:(e,t)=>p.resolve(e,t),invokeObjectRenderCallbacks:!1,hiZOcclusionCulling:!0,renderGraphProfiling:!1,sampleCount:1,multiDrawIndirect:!1});R.setRenderScale(x?.renderScale??1),R.setRenderGraphBuilder((e,t)=>{const n=new c.FrameGraphBuilder(t),i=n.createColorTarget("hologyNormalRoughness",{format:"rgba16float"});n.addDirectionalShadowPass(),n.addPointShadowPass(),n.addSpotShadowPass(),n.addDepthPrepass(),n.addHiZPasses(),n.addVisibilityPass(),n.addMaterialPass({name:"OpaqueGBufferPass",outputs:[n.sceneColor,i],drawStage:"opaque",loadDepth:!0}),n.addHiZHistoryPass("OpaqueGBufferPass");let r=n.sceneColor;if(null!=g){const e=g.addPasses(n,{depth:n.mainDepth,normal:i});r=g.addCompositePass(n,r,e)}null!=f&&(r=f.addPasses(n,{sceneColor:r,depth:n.mainDepth,normalRoughness:i})),n.addSceneTextureCopyPass(r),n.addLatePass(r),r=G(n,"beforeFog",r),null!=b&&(r=b.addPasses(n,{sceneColor:r,depth:n.mainDepth})),null!=P&&(r=P.addPass(n,r)),r=G(n,"beforeOutline",r),null!=L&&(r=L.addPass(n,r)),r=G(n,"beforeDepthOfField",r),null!=C&&(r=C.addPass(n,r,n.mainDepth)),r=G(n,"beforeColorAdjustment",r),null!=v&&(r=v.addPass(n,r)),r=G(n,"beforeAntiAliasing",r);let o=x?.addPass(n,r,n.mainDepth)??r;null!=S&&(o=S.addPass(n,o)),o=G(n,"beforeOutput",o),n.present(o)});try{return await R.initialize(),new ExperimentalWebGpuBackend(R,h,p,m,P,S,g,f,x,b,v,C,L,y,u)}catch(e){throw R.destroy(),h.dispose(),p.dispose(),m.dispose(),g?.dispose(),b?.dispose(),L?.dispose(),e}}static supportsCamera(t){return t instanceof e.PerspectiveCamera||t instanceof e.OrthographicCamera}setSize(e,t,n){this.renderer.setSize(e,t,n)}initTexture(e){this.renderer.initTexture(e)}setPostProcessEffects(e){this.postProcessEffects.splice(0,this.postProcessEffects.length,...e);for(const t of e){if("beforeLut"!==t.stage)continue;const e=`${t.id}:${t.stage}`;this.warnedUnsupportedPostProcessStages.has(e)||(this.warnedUnsupportedPostProcessStages.add(e),console.warn(`[Hology WebGPU experiment] Skipping custom post-process effect ${t.id}: stage "${t.stage}" has no native WebGPU anchor.`))}}setEnableOutlines(e){null!=this.outline&&(this.outline.enabled=e)}setDynamicBatchingEnabled(e){this.renderer.setDynamicBatchingEnabled(e)}setSelectedObjects(e){this.outline?.setSelectedObjects(e)}setSelectedObjectInstances(e){this.outline?.setSelectedInstances(e)}setCascadedShadowRanges(e,t=[]){this.renderer.setCascadedShadowRanges(e,t),this.volumetricFog?.setCascadedDirectionalLights(t)}setWorldEnvironment(t){if(null==t)return void this.nodeMaterialResolver.setWorldEnvironment(null);let n=t.source;if(n.mapping!==e.CubeUVReflectionMapping){let e=this.pmremResults.get(n);null==e&&(this.pmremGenerator??(this.pmremGenerator=this.renderer.createPMREMGenerator()),e=this.pmremGenerator.fromEquirectangular(n),this.pmremResults.set(n,e),this.ownedPmremResults.add(e)),n=e.texture}this.nodeMaterialResolver.setWorldEnvironment({texture:n,intensity:t.intensity})}resetViewHistory(){this.renderer.resetViewHistory(),this.taa?.reset()}async compile(e,t){await this.renderer.compileAsync(e,t)}createStaticDrawSet(e,t){this.renderer.setHiZOcclusionCullingEnabled(!0);const n=this.renderer.createStaticDrawSet(e,{label:t,onUnsupported:"skip"});return 0===n.drawCount?(n.dispose(),null):n}render(e,t,n){this.volumetricFog?.setScene(e),this.taa?.prepareCamera(t,this.canvas.width,this.canvas.height);try{this.renderer.render(e,t,n)}finally{this.taa?.finishCamera(t)}}getLastFrameProfile(){return this.renderer.getLastFrameProfile()}setPostProcessState(e){null!=this.colorGrading&&(Object.assign(this.colorGrading.options,e??{enabled:!1}),this.colorGrading.options.enabled=!0===e?.enabled),null!=this.depthOfField&&(this.depthOfField.options.enabled=null!=e?.depthFocus||null!=e?.depthAperture||null!=e?.depthMaxBlur,this.depthOfField.options.focus=e?.depthFocus,this.depthOfField.options.aperture=e?.depthAperture,this.depthOfField.options.maxBlur=e?.depthMaxBlur)}setProfilingEnabled(e){this.renderer.setRenderGraphProfilingEnabled(e)}resetTemporalHistory(){this.taa?.reset()}inspect(e,t){return inspectWebGpuScene(e,t,this.nodeMaterialResolver)}destroy(){this.nodeMaterialResolver.dispose(),this.gBufferFallbackSource.dispose(),this.gtao?.dispose(),this.volumetricFog?.dispose();for(const e of this.ownedPmremResults)e.dispose();this.ownedPmremResults.clear(),this.renderer.destroy(),this.fallbackMaterial.dispose()}}export function inspectWebGpuScene(e,t,n){const i={meshes:0,skinnedMeshes:0,instancedMeshes:0,batchedMeshes:0,sprites:0,points:0,lines:0,missingPositionGeometry:0,transparentMaterials:0,shaderMaterialsReplaced:0,materialsReplaced:0,unsupportedCamera:ExperimentalWebGpuBackend.supportsCamera(t)?0:1};return e.traverse(e=>{if(e.isSprite)return void i.sprites++;if(e.isPoints)return void i.points++;if(e.isLine)return void i.lines++;if(!e.isMesh)return;const t=e;t.isBatchedMesh?i.batchedMeshes++:t.isInstancedMesh?i.instancedMeshes++:t.isSkinnedMesh?i.skinnedMeshes++:i.meshes++,null==t.geometry?.getAttribute("position")&&i.missingPositionGeometry++;const r=Array.isArray(t.material)?t.material:[t.material];for(const e of r){if(null==e)continue;e.transparent&&i.transparentMaterials++;const t=!0===e.isWGSLShaderMaterial||!0===e.isLineMaterial,r=!t&&!0===n?.canResolve(e);t||r||(i.materialsReplaced++,e.isShaderMaterial&&i.shaderMaterialsReplaced++)}}),i}export function formatWebGpuSceneCapabilitySummary(e){return`[Hology WebGPU experiment] ${JSON.stringify(e)}`}const a="\nstruct VertexInput {\n @location(0) position: vec3<f32>,\n @location(1) normal: vec3<f32>,\n @location(2) uv: vec2<f32>,\n @location(3) color: vec4<f32>,\n#ifdef USE_SKINNING\n @location(4) skinIndex: vec4<u32>,\n @location(5) skinWeight: vec4<f32>,\n#endif\n @builtin(instance_index) instanceIndex: u32,\n};\n\nstruct VertexOutput {\n @builtin(position) position: vec4<f32>,\n @location(0) worldPosition: vec3<f32>,\n @location(1) worldNormal: vec3<f32>,\n @location(2) color: vec4<f32>,\n};\n\n@vertex\nfn vsMain(input: VertexInput) -> VertexOutput {\n var output: VertexOutput;\n#ifdef USE_SKINNING\n let localPosition = rendererSkinPosition(input.position, input.skinIndex, input.skinWeight);\n let localNormal = rendererSkinNormal(input.normal, input.skinIndex, input.skinWeight);\n#else\n let localPosition = input.position;\n let localNormal = input.normal;\n#endif\n let world = rendererWorldPosition(localPosition, input.instanceIndex);\n output.position = rendererClipPosition(localPosition, input.instanceIndex);\n output.worldPosition = world.xyz;\n output.worldNormal = rendererWorldNormal(localNormal, input.instanceIndex);\n output.color = input.color * rendererObjectColor(input.instanceIndex);\n return output;\n}\n",l="\nstruct VertexOutput {\n @builtin(position) position: vec4<f32>,\n @location(0) worldPosition: vec3<f32>,\n @location(1) worldNormal: vec3<f32>,\n @location(2) color: vec4<f32>,\n};\n\nfn distanceAttenuation(distanceToLight: f32, range: f32) -> f32 {\n let linear = max(0.0, 1.0 - distanceToLight / max(range, 0.001));\n return linear * linear;\n}\n\n@fragment\nfn fsMain(input: VertexOutput) -> @location(0) vec4<f32> {\n let normal = normalize(input.worldNormal);\n let normalTint = normal * 0.5 + vec3<f32>(0.5);\n let base = mix(vec3<f32>(0.52, 0.58, 0.64), normalTint, 0.22) * input.color.rgb;\n var lighting = rendererIndirectDiffuse(normal) + vec3<f32>(0.08);\n var directionalLighting = vec3<f32>(0.0);\n let directionalCount = rendererDirectionalLightCount();\n\n for (var index: u32 = 0u; index < directionalCount; index = index + 1u) {\n let lightDirection = rendererDirectionalLightDirectionForLight(index);\n let shadow = rendererSampleDirectionalShadowForLightWithNormal(index, input.worldPosition, normal);\n directionalLighting += rendererDirectionalLightColorForLight(index) * max(dot(normal, lightDirection), 0.0) * shadow;\n }\n if (directionalCount > 0u) {\n lighting += directionalLighting / f32(directionalCount);\n }\n\n for (var index: u32 = 0u; index < rendererPointLightCount(); index = index + 1u) {\n let lightVector = rendererPointLightPositionForLight(index) - input.worldPosition;\n let distanceToLight = length(lightVector);\n let lightDirection = normalize(lightVector);\n let shadow = rendererSamplePointShadowForLightWithNormal(index, input.worldPosition, normal);\n lighting += rendererPointLightColorForLight(index) * max(dot(normal, lightDirection), 0.0) * distanceAttenuation(distanceToLight, rendererPointLightRangeForLight(index)) * shadow;\n }\n\n for (var index: u32 = 0u; index < rendererSpotLightCount(); index = index + 1u) {\n let lightVector = rendererSpotLightPositionForLight(index) - input.worldPosition;\n let distanceToLight = length(lightVector);\n let lightDirection = normalize(lightVector);\n let angleCos = dot(-lightDirection, rendererSpotLightDirectionForLight(index));\n let cone = smoothstep(rendererSpotLightConeCosForLight(index), rendererSpotLightPenumbraCosForLight(index), angleCos);\n let shadow = rendererSampleSpotShadowForLightWithNormal(index, input.worldPosition, normal);\n lighting += rendererSpotLightColorForLight(index) * max(dot(normal, lightDirection), 0.0) * cone * distanceAttenuation(distanceToLight, rendererSpotLightRangeForLight(index)) * shadow;\n }\n\n return vec4<f32>(base * max(lighting, vec3<f32>(0.08)), input.color.a);\n}\n";/*
2
2
  * Copyright (©) 2026 Hology Interactive AB. All rights reserved.
3
3
  * See the LICENSE.md file for details.
4
4
  */
@@ -94,11 +94,15 @@ export declare class RenderingView {
94
94
  container: HTMLElement;
95
95
  readonly options: RenderingViewOptions;
96
96
  private static activeView;
97
+ private static sharedExperimentalWebGpuBackend;
98
+ private static sharedExperimentalWebGpuBackendPromise;
99
+ private static experimentalWebGpuPresentationView;
97
100
  private _activeBackend;
98
101
  private experimentalWebGpuBackend;
99
102
  private experimentalWebGpuFailed;
100
103
  private experimentalWebGpuCapabilityReported;
101
104
  private experimentalWebGpuDynamicBatchingEnabled;
105
+ private experimentalWebGpuSelectedObjectInstances;
102
106
  private experimentalStaticDrawSetRegistrations;
103
107
  private worldEnvironment;
104
108
  get activeBackend(): RenderingBackend;
@@ -349,6 +353,8 @@ export declare class RenderingView {
349
353
  private compileInProgress;
350
354
  compileAsync(scene?: Object3D): Promise<void>;
351
355
  private compileExperimentalWebGpu;
356
+ private static acquireSharedExperimentalWebGpuBackend;
357
+ private applyExperimentalWebGpuViewState;
352
358
  private depthMaterialCachedMaterials;
353
359
  private applyDepthMaterial;
354
360
  private unapplyDepthMaterial;
package/dist/rendering.js CHANGED
@@ -1,4 +1,4 @@
1
- var e;import{__decorate as t,__metadata as s}from"tslib";import*as i from"three";import{Color as a,Material as n,Matrix4 as r,Mesh as o,PerspectiveCamera as l,ShaderChunk as h,ShaderMaterial as c,WebGLRenderTarget as p,Texture as u,Euler as d,MeshStandardMaterial as m}from"three";import{CopyShader as f,EffectComposer as g,FXAAShader as M,GammaCorrectionShader as b,LUTPass as v,RenderPass as x,ShaderPass as P,VRButton as w}from"three-stdlib";import{CSMShader as y,CSMUtil as S}from"./csm.js";import{colorToNormal as T,float as R,NodeShaderMaterial as C,standardMaterial as G,uniformFloat as E,uniformVec3 as B,toonMaterial as U,lambertMaterial as A,normalize as O,rgb as D,rgba as W,transformed as F,varying as I,varyingAttributes as j,varyingTransformed as k,vec4 as L,BooleanExpression as V,select as _,ifDefApply as N,uniformSampler2d as H,RgbaNode as q,mix as $,attributes as z,uniformVec2 as J,min as Q}from"three-shader-graph";import{Reflector as X}from"three-stdlib";import{BokehPass as Y,OutputPass as K}from"three/examples/jsm/Addons.js";import{CSM as Z}from"three/examples/jsm/csm/CSM.js";import{RectAreaLightUniformsLib as ee}from"three/examples/jsm/lights/RectAreaLightUniformsLib.js";import te from"three/examples/jsm/libs/stats.module.js";import{GTAOPass as se}from"three/examples/jsm/postprocessing/GTAOPass.js";import{Service as ie}from"typedi";import{depthUniformName as ae,farUniformName as ne,nearUniformName as re,resolutionUniformName as oe,sceneNormalUniformName as le,screenUV as he,supportsDepthTextureExtension as ce}from"./shader-nodes/depth.js";import{elapsedTimeUniformName as pe}from"./shader-nodes/time.js";import{aoMapUniformName as ue,sceneMapUniformName as de}from"./shader-nodes/scene-sample.js";import{DepthPass as me}from"./utils/three/depth-pass.js";import{GPUStatsPanel as fe}from"./utils/three/gpu-stats-panel.js";import{OutlinePass as ge}from"./utils/three/outline-pass.js";import{findFirstVisibleObject as Me,traverseVisibleStop as be}from"./utils/three/traverse.js";import{clamp as ve}from"./utils/math.js";import{ColorPass as xe}from"./rendering/color-pass.js";import{PostProcessEffectPass as Pe,PostProcessEffectRegistration as we,postProcessEffectStages as ye,sanitizePostProcessEffectPriority as Se,sanitizePostProcessEffectStage as Te}from"./rendering/post-process-effect.js";import{SSRPass as Re}from"./rendering/ssr/SSRPass.js";import{SSRShader as Ce}from"./rendering/ssr/SSRShader.js";import{VolumetricFogPass as Ge}from"./rendering/fog/volumetric-fog-pass.js";import{OutlineEffect as Ee}from"./rendering/outline-effect.js";import{UnrealBloomPass as Be}from"./rendering/bloom/UnrealBloomPass.js";import{highPrecisionEyeDepth as Ue}from"./shader-nodes/depth.js";import{packDepthToRGBA as Ae}from"three-shader-graph";import{FogVolumeObject as Oe}from"./rendering/fog/fog-volume-object";import{ParallaxStandardMaterial as De}from"./shader/builtin/standard-shader.js";import{parallaxOcclusionMapping as We}from"./shader-nodes/pom.js";import{FullScreenQuad as Fe}from"three-stdlib";import{edgeDepthEffect as Ie}from"./shader-nodes/effects";import{decalDiscard as je}from"./shader-nodes/decal.js";import{Pass as ke}from"three/examples/jsm/Addons.js";import{BatchedMesh2 as Le}from"./scene/batched-mesh-2.js";import{resolvePostProcessMaterial as Ve}from"./shader/post-process-shader.js";import{applyUvTiling as _e}from"./shader/uv-nodes.js";import{createPlaceholderTexture as Ne}from"./utils/three/placeholder-texture.js";import{getTemporalUpscalingJitter as He,getUpscalingMethod as qe,UpscaleOutputPass as $e}from"./rendering/upscaling-pass.js";import{ExperimentalWebGpuBackend as ze,formatWebGpuSceneCapabilitySummary as Je}from"./rendering/webgpu-experimental-backend.js";S.patchSetupMaterial();const Qe=document.createElement("div");Qe.style.position="absolute",Qe.style.left="50%",Qe.style.top="50%",Qe.style.color="black",Qe.style.zIndex="999";(new i.Layers).set(9);const Xe=new i.MeshBasicMaterial({color:"black"}),Ye=new i.MeshDepthMaterial;var Ke;Ye.depthPacking=i.RGBADepthPacking,Ye.blending=i.NoBlending,Ye.side=i.DoubleSide,function(e){e[e.opaque=0]="opaque",e[e.transparent=1]="transparent"}(Ke||(Ke={}));const Ze=(()=>{const e=new Uint8Array([255,255,255,255]),t=new i.DataTexture(e,1,1,i.RGBAFormat);return t.needsUpdate=!0,t})(),et=(()=>{const e=new Uint8Array([0,0,0,255]),t=new i.DataTexture(e,1,1,i.RGBAFormat);return t.needsUpdate=!0,t})(),tt=(()=>{const e=new Uint8Array([128,128,255,255]),t=new i.DataTexture(e,1,1,i.RGBAFormat);return t.needsUpdate=!0,t})(),st=new C({color:R(0),position:L(R(0))});st.visible=!1;const it=/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);let at=0,nt=null;const rt=new Map;function ot(){return null==nt&&(nt=new IntersectionObserver(e=>{for(const t of e){const e=rt.get(t.target);e&&e(t.isIntersecting)}},{threshold:0})),nt}let lt=e=class{get activeBackend(){return this._activeBackend}registerExperimentalStaticDrawSet(e,t){if("webgpu-experimental"!==this.options.backend)return()=>{};const s={root:e,label:t,sourceWasVisible:e.visible,staticDrawSet:null};return this.experimentalStaticDrawSetRegistrations.add(s),this.activateExperimentalStaticDrawSets(),()=>{this.experimentalStaticDrawSetRegistrations.delete(s)&&(s.staticDrawSet?.dispose(),null!=s.staticDrawSet&&(s.root.visible=s.sourceWasVisible),s.staticDrawSet=null)}}get fpsCap(){return this._fpsCap}set fpsCap(e){const t=null!=e&&Number.isFinite(e)&&e>0?e:null;t!==this._fpsCap&&(this._fpsCap=t,this.fpsCapRevision++)}setPaused(e){this.paused=e}setResolutionScale(e){const t=Pt(e,1);xt(t,this.resolutionScale)||(this.resolutionScale=t,this.dynamicResolutionScale=t,this.dynamicResolutionLastAdjustmentAt=0,this.resetDynamicResolutionAverage(),this.resizeRender(!0))}get currentResolutionScale(){return this.getEffectiveResolutionScale()}get currentRenderPixelRatio(){return this.getRenderPixelRatio()}get currentPresentationPixelRatio(){return this.getPresentationPixelRatio()}getRenderSize(e=new i.Vector2){return e.set(Math.max(1,this.container.clientWidth*this.getRenderPixelRatio()),Math.max(1,this.container.clientHeight*this.getRenderPixelRatio()))}isUpscalingEnabled(){return!0===this.options.upscaling?.enabled&&!0!==this.options.enableXR}isTemporalUpscalingEnabled(){return this.isUpscalingEnabled()&&"temporal"===qe(this.options.upscaling)}resetUpscalingHistory(){this.hasPreviousTemporalViewProjection=!1,this.upscaleOutputPass?.resetHistory(),this.experimentalWebGpuBackend?.resetTemporalHistory()}prepareUpscalingFrame(){if(!this.isTemporalUpscalingEnabled()||null==this.upscaleOutputPass)return void this.upscaleOutputPass?.setFrameState(null);this.unjitteredProjectionMatrix.copy(this.camera.projectionMatrix),this.currentUnjitteredViewProjectionMatrix.multiplyMatrices(this.unjitteredProjectionMatrix,this.camera.matrixWorldInverse),this.hasPreviousTemporalViewProjection||(this.previousViewProjectionMatrix.copy(this.currentUnjitteredViewProjectionMatrix),this.upscaleOutputPass.resetHistory());const e=Pt(this.options.upscaling?.temporal?.jitterScale,1);He(this.temporalUpscalingFrameIndex++,this.temporalJitter,e),this.temporalJitterUv.set(this.temporalJitter.x/Math.max(1,this.gRenderTarget.width),this.temporalJitter.y/Math.max(1,this.gRenderTarget.height));const t=2*this.temporalJitter.x/Math.max(1,this.gRenderTarget.width),s=2*this.temporalJitter.y/Math.max(1,this.gRenderTarget.height);this.camera instanceof l?(this.camera.projectionMatrix.elements[8]+=t,this.camera.projectionMatrix.elements[9]+=s):(this.camera.projectionMatrix.elements[12]+=t,this.camera.projectionMatrix.elements[13]+=s),this.camera.projectionMatrixInverse.copy(this.camera.projectionMatrix).invert(),this.projectionJitterApplied=!0,this.currentViewProjectionMatrix.multiplyMatrices(this.camera.projectionMatrix,this.camera.matrixWorldInverse),this.currentViewProjectionMatrixInverse.copy(this.currentViewProjectionMatrix).invert(),this.temporalUpscalingFrameState.depthTexture=this.gRenderTarget.depthTexture,this.upscaleOutputPass.setFrameState(this.temporalUpscalingFrameState)}finishUpscalingFrame(){this.projectionJitterApplied&&(this.camera.projectionMatrix.copy(this.unjitteredProjectionMatrix),this.camera.projectionMatrixInverse.copy(this.camera.projectionMatrix).invert(),this.previousViewProjectionMatrix.copy(this.currentUnjitteredViewProjectionMatrix),this.hasPreviousTemporalViewProjection=!0,this.projectionJitterApplied=!1)}getBasePixelRatio(){const e=Pt(this.maxPixelRatio,1),t=Pt(window.devicePixelRatio,1);return Math.min(e,t)}getBaseResolutionScale(){return Pt(this.resolutionScale,1)}getDynamicResolutionMinScale(){const e=this.getBaseResolutionScale(),t=Pt(this.options.dynamicResolution?.minScale,.7);return Math.min(e,t)}getEffectiveResolutionScale(){const e=this.getBaseResolutionScale();return!0!==this.options.dynamicResolution?.enabled?e:ve(this.dynamicResolutionScale,this.getDynamicResolutionMinScale(),e)}getRenderPixelRatio(){return this.getBasePixelRatio()*this.getEffectiveResolutionScale()}getPresentationPixelRatio(){const e=this.getBasePixelRatio();return this.isUpscalingEnabled()?e:e*this.getEffectiveResolutionScale()}resetDynamicResolutionAverage(){this.dynamicResolutionFrameTimeAverage=null,this.dynamicResolutionFrameSamples=0}updateDynamicResolution(e,t){const s=this.options.dynamicResolution;if(!0!==s?.enabled)return;if(!Number.isFinite(e)||e<=0||e>.25)return void this.resetDynamicResolutionAverage();const i=this.getBaseResolutionScale(),a=this.getDynamicResolutionMinScale(),n=ve(this.dynamicResolutionScale,a,i);xt(n,this.dynamicResolutionScale)||(this.dynamicResolutionScale=n);const r=Pt(s.targetFps,60),o=1e3/(null!=this.fpsCap?Math.min(r,this.fpsCap):r),l=1e3*e;this.dynamicResolutionFrameTimeAverage=null==this.dynamicResolutionFrameTimeAverage?l:.9*this.dynamicResolutionFrameTimeAverage+.1*l,this.dynamicResolutionFrameSamples++;const h=Math.max(1,Math.floor(Pt(s.sampleFrames,20)));if(this.dynamicResolutionFrameSamples<h)return;const c=Pt(s.decreaseCooldown,500),p=Pt(s.increaseCooldown,2e3),u=Pt(s.decreaseStep,.05),d=Pt(s.increaseStep,.025),m=this.dynamicResolutionFrameTimeAverage;let f=n;m>1.12*o&&n>a&&t-this.dynamicResolutionLastAdjustmentAt>=c?f=Math.max(a,n-u):m<.85*o&&n<i&&t-this.dynamicResolutionLastAdjustmentAt>=p&&(f=Math.min(i,n+d)),xt(f,n)||(this.dynamicResolutionScale=f,this.dynamicResolutionLastAdjustmentAt=t,this.resetDynamicResolutionAverage(),this.resizeRender(!0))}resizeRender(e=!1){if(!this.running)return;const t=this.container.clientWidth,s=this.container.clientHeight,i=this.getRenderPixelRatio(),a=this.getPresentationPixelRatio();if(!e&&this.previousClientWith===t&&this.previousClientHeight===s&&this.previousRenderPixelRatio===i&&this.previousPresentationPixelRatio===a)return;if(0===t||0===s)return;this.previousClientWith=t,this.previousClientHeight=s,this.previousRenderPixelRatio=i,this.previousPresentationPixelRatio=a,this.camera instanceof l&&(this.camera.aspect=t/s,this.camera.updateProjectionMatrix()),this.renderer.setPixelRatio(a),this.renderer.setSize(t,s),this.composer.setPixelRatio(i),this.composer.setSize(t,s);const n=t*i,r=s*i;this.dofPass.setSize(n,r),this.fxaaPass.setSize(n,r),this.fxaaPass.uniforms.resolution.value.set(1/n,1/r),this.createGRenderTarget(),this.phasedRenderPass.gRenderTarget=this.gRenderTarget,this.bloomPass.emissiveTexture=this.gRenderTarget.textures[1],this.ssrPass.setSize(this.gRenderTarget.width,this.gRenderTarget.height),this.ssrPass.setGBuffer(this.gRenderTarget.depthTexture,this.gRenderTarget.textures[2]),this.aoPass.setSize(this.gRenderTarget.width,this.gRenderTarget.height),this.aoPass.setGBuffer(this.gRenderTarget.depthTexture,this.gRenderTarget.textures[2]),this.fquadBlendAO.material.uniforms.tAlphaTest.value=this.gRenderTarget.textures[1],this.sceneColorRenderTarget.dispose(),this.sceneDepthRenderTarget.dispose(),this.sceneColorRenderTarget=this.createSceneColorRenderTarget(),this.sceneDepthRenderTarget=this.createSceneDepthRenderTarget(),this.copyPass.material.uniforms.tDiffuse.value=this.gRenderTarget.textures[0],this.copyPass.material.uniformsNeedUpdate=!0,this.experimentalWebGpuBackend?.setSize(t,s,i),this.resetDynamicResolutionAverage(),this.resetUpscalingHistory()}addPostProcessVolume(e){if(0===this.postProcessVolumes.length)this.postProcessVolumes.push(e);else{let t=!1;for(let s=0;s<this.postProcessVolumes.length;s++)if(e.priority<this.postProcessVolumes[s].priority){this.postProcessVolumes.splice(s,0,e),t=!0;break}t||this.postProcessVolumes.push(e)}}removePostProcessVolume(e){const t=this.postProcessVolumes.indexOf(e);t>-1&&this.postProcessVolumes.splice(t,1)}addPostProcessEffect(e,t={}){const s=Ve(e),i={id:++this.postProcessEffectId,material:s,pass:new Pe(s),enabled:t.enabled??!0,priority:Se(t.priority),stage:Te(t.stage)};return i.pass.enabled=i.enabled,this.postProcessEffects.push(i),this.refreshPostProcessEffectPassOrder(),new we(this,i)}removePostProcessEffectEntry(e){const t=e,s=this.postProcessEffects.indexOf(t);-1!==s&&(this.postProcessEffects.splice(s,1),this.composer.removePass(t.pass),t.pass.dispose(),this.syncExperimentalWebGpuPostProcessEffects())}refreshPostProcessEffectPassOrder(){for(const e of this.postProcessEffects)this.composer.removePass(e.pass);for(const e of ye){const t=this.getPostProcessEffectStageAnchorPass(e),s=null!=t?this.composer.passes.indexOf(t):this.composer.passes.length,i=this.postProcessEffects.filter(t=>t.stage===e).sort(pt);for(let e=0;e<i.length;e++)this.composer.insertPass(i[e].pass,s+e)}this.syncExperimentalWebGpuPostProcessEffects()}syncExperimentalWebGpuPostProcessEffects(){this.experimentalWebGpuBackend?.setPostProcessEffects(this.postProcessEffects)}getPostProcessEffectStageAnchorPass(e){switch(e){case"beforeFog":return this.volumetricFogPass;case"beforeDepthOfField":return this.dofPass;case"beforeColorAdjustment":return this.colorPass;case"beforeOutline":return this.outlinePass;case"beforeAntiAliasing":return this.fxaaPass;case"beforeLut":return this.lutPass;case"beforeOutput":return this.outputPass}}constructor(t,s={}){this.container=t,this.options=s,this._activeBackend="webgl",this.experimentalWebGpuBackend=null,this.experimentalWebGpuFailed=!1,this.experimentalWebGpuCapabilityReported=!1,this.experimentalWebGpuDynamicBatchingEnabled=!0,this.experimentalStaticDrawSetRegistrations=new Set,this.worldEnvironment=null,this.isIntersecting=!1,this.needsPausedRender=!1,this.wakePausedRenderer=null,this.windowVisible=!0,this.queryScene=new i.Scene,this.running=!0,this.paused=!1,this._fpsCap=null,this.fpsCapRevision=0,this.postProcessVolumes=[],this.postProcessSettings={},this.baseToneMapping=i.NoToneMapping,this.baseToneMappingExposure=1,this.csmUpdateInvervals=this.options.shadows?.cascadeUpdateIntervals,this._id=at++,this.postProcessEffectId=0,this.postProcessEffects=[],this.postProcessEffectResolution=new i.Vector2(1,1),this.postProcessEffectUniformState={aoEnabled:!1,aoTexture:null,cameraFar:void 0,cameraNear:void 0,depthTexture:Ne(),normalTexture:Ne(128,128,255),resolution:this.postProcessEffectResolution,simulationTime:0},this.fquadCopySceneColor=new Fe(new c(f)),this.fquadCopySceneDepth=new Fe(new C({color:L(H("tDepthTexture",Ne()).sample(j.uv).r)})),this.occlusionClusters=[],this.simulationTime=0,this.simulationTimeScale=1,this.lightProbeIntensity=2,this.fquadBlendAO=(()=>{const e=L(1),t=Ne(),s=H("tAlphaTest",t).sample(he).a,a=H("tAO",t).sample(he),n=_(s.lt(.05),a,Q(L(1,1,1,1),a.addScalar(.4))),r=new C({outputs:[n,e,e],transparent:!0});r.depthWrite=!1,r.depthTest=!1,r.blending=i.MultiplyBlending;return new Fe(r)})(),this.resolutionScale=1,this.maxPixelRatio=it?1:window.devicePixelRatio,this.dynamicResolutionScale=1,this.dynamicResolutionFrameTimeAverage=null,this.dynamicResolutionFrameSamples=0,this.dynamicResolutionLastAdjustmentAt=0,this.upscaleOutputPass=null,this.unjitteredProjectionMatrix=new r,this.temporalJitter=new i.Vector2,this.temporalJitterUv=new i.Vector2,this.currentUnjitteredViewProjectionMatrix=new r,this.currentViewProjectionMatrix=new r,this.currentViewProjectionMatrixInverse=new r,this.previousViewProjectionMatrix=new r,this.temporalUpscalingFrameState={depthTexture:null,currentJitterUv:this.temporalJitterUv,currentViewProjectionInverse:this.currentViewProjectionMatrixInverse,previousViewProjection:this.previousViewProjectionMatrix},this.temporalUpscalingFrameIndex=0,this.hasPreviousTemporalViewProjection=!1,this.projectionJitterApplied=!1,this.onResize=()=>{if(this.resizeRender(),this.paused)this.needsPausedRender=!0,this.wakePausedRenderer?.();else try{this.render()}catch(e){}},this.onVisiblityChane=()=>{this.windowVisible=!document.hidden},this.isDepthTextureExtensionSupported=!0,this.onLoopCallbacks=[],this.stats=new te,this.webGpuPassStatsDom=function(){const e=document.createElement("div");return e.dataset.hologyWebGpuPassStats="",e.setAttribute("aria-hidden","true"),e.style.cssText=["position:absolute","top:52px","left:12px","z-index:10000","width:min(520px,calc(100% - 24px))","pointer-events:none","color:white","font:12px/1.2 Arial,Helvetica,sans-serif","text-shadow:0 1px 2px black,0 0 3px black"].join(";"),e}(),this.webGpuVisibilityStatsDom=function(){const e=document.createElement("div");return e.style.cssText=["margin-bottom:10px","padding-bottom:6px","border-bottom:1px solid rgba(255,255,255,.4)"].join(";"),e.textContent="GPU visibility: awaiting readback",e}(),this.webGpuPassStatsRows=[],this._showStats=!1,this.gbufferMaterialCache=new Map,this.gbufferDepthPrepassMaterialCache=new Map,this.tbufferMaterialCache=new Map,this.depthPrepassMaterialCache=new WeakMap,this.depthPrepassCachedMaterials=new Map,this.depthPrepassCachedVisibility=[],this.frameGBufferMeshes=[],this.frameGBufferPhaseMasks=[],this.frameUnsupportedGBufferObjects=[],this.frameGBufferExcludedObjects=new Set,this.appliedGBufferMeshes=[],this.originalGBufferMaterials=[],this.originalGBufferOnBeforeRender=[],this.hiddenGBufferObjects=[],this.gBufferPhaseMaskCache=new WeakMap,this.gBufferMaterialArrayCache=new WeakMap,this.gBufferShadowUpdaterCache=new WeakMap,this._initiatedMaterialTextures=new Set,this._initiatedTextures=new Set,this.compileInProgress=!1,this.depthMaterialCachedMaterials=new Map,this.pmremGeneratorResults=new WeakMap,this.insetHeight=200,this.insetWidth=this.insetHeight*(16/9),this.insetOffsetY=250,this.insetMargin=10,this.maxInsetCameras=4,this.overlayCameras=new Set,this.prevClearColor=new a,this.hadBloom=!1,this.bloomStoredMaterials={},this.bloomHidden=[],this._customDepthMaterialCache=new WeakMap,null!=s.maxPixelRatio&&(this.maxPixelRatio=s.maxPixelRatio),this.resolutionScale=s.resolutionScale??1,this.dynamicResolutionScale=this.getBaseResolutionScale(),this.fpsCap=s.fpsCap,this.experimentalWebGpuDynamicBatchingEnabled=s.webgpuDynamicBatching??!0,"webgpu-experimental"===s.backend&&!0===s.enableXR&&(console.warn("[Hology WebGPU experiment] XR is not supported; using WebGL."),this.experimentalWebGpuFailed=!0),e.activeView=this,ee.init(),window.renderer=this.renderer=window.renderer??new i.WebGLRenderer({antialias:!1,powerPreference:"high-performance"});new i.MeshStandardMaterial({color:"#ccc"});this.scene=new i.Scene,this.scene.matrixWorldAutoUpdate=!0,this.scene.updateMatrixWorld=function(e){const t=this.children;for(let s=0,i=t.length;s<i;s++){t[s].updateMatrixWorld(e)}}.bind(this.scene),this.renderer.setPixelRatio(this.getPresentationPixelRatio()),this.renderer.setSize(t.clientWidth,t.clientHeight),this.renderer.xr.enabled=this.options.enableXR??!1,!0===this.options.enableXR&&document.body.appendChild(w.createButton(this.renderer));const n=new Ee(this.renderer,{defaultThickness:.005,defaultColor:[0,0,0],defaultAlpha:1,defaultKeepAlive:!0});this.outlineEffect=n,this.createGRenderTarget(),this.composer=new g(this.renderer,function(e,t){const s=new i.WebGLRenderTarget(Math.max(1,e),Math.max(1,t),{minFilter:i.LinearFilter,magFilter:i.LinearFilter,format:i.RGBAFormat,type:i.HalfFloatType});return s.texture.name="EffectComposer.rt1",s.texture.generateMipmaps=!1,s}(t.clientWidth,t.clientHeight)),this.composer.setPixelRatio(this.getRenderPixelRatio()),this.composer.setSize(t.clientWidth,t.clientHeight);var l=(t.clientWidth||1)/(t.clientHeight||1);const h=new i.PerspectiveCamera(45,l,.5,800);h.layers.enable(19),this.setCamera(h),this.renderer.shadowMap.enabled=!0,this.renderer.shadowMap.type=i.PCFSoftShadowMap,this.renderer.shadowMap.autoUpdate=s.shadows?.autoUpdate??!1,this.renderer.outputColorSpace=i.SRGBColorSpace,this.renderer.toneMapping=i.NoToneMapping,this.renderer.toneMappingExposure=1,this.baseToneMapping=this.renderer.toneMapping,this.baseToneMappingExposure=this.renderer.toneMappingExposure,this.renderer.gammaFactor=1.4,S.renderingView=this,this.isDepthTextureExtensionSupported=ce(this.renderer),this.attachRendererDomElement(),this.setupEventListeners(),this.aoMaskDepthRenderTarget=e.createAOMaskDepthRenderTarget(this.renderer,this.container,this.getRenderPixelRatio()),this.sceneColorRenderTarget=this.createSceneColorRenderTarget(),this.sceneDepthRenderTarget=this.createSceneDepthRenderTarget();const p=new i.Vector2(t.clientWidth,t.clientHeight),u=(new x(this.scene,this.camera),new P(f,"prevtexture"));u.enabled=!0,u.needsSwap=!0,u.material.uniforms.tDiffuse.value=this.gRenderTarget.textures[0],this.copyPass=u;const d=new Be(p,1.5,.4,.85);d.threshold=1,d.strength=.9,d.radius=.2,this.bloomPass=d;const m=new se(this.scene,this.camera,this.gRenderTarget.width,this.gRenderTarget.height,{});m.normalRenderTarget?.dispose(),m.setGBuffer(this.gRenderTarget.depthTexture,this.gRenderTarget.textures[2]),m.output=se.OUTPUT.Off,m.enabled=!1,this.aoPass=m,this.fquadBlendAO.material.uniforms.tAO.value=m.pdRenderTarget.texture,this.fquadBlendAO.material.uniforms.tAlphaTest.value=this.gRenderTarget.textures[1],Ce.fragmentShader=Ce.fragmentShader.replace("if(metalness==0.) return;","if(metalness<0.1) return;");const y=new Re({renderer:this.renderer,scene:this.scene,camera:this.camera,width:this.gRenderTarget.width,height:this.gRenderTarget.height,groundReflector:null,selects:[],normalTexture:this.gRenderTarget.textures[2],depthTexture:this.gRenderTarget.depthTexture});y.output=Re.OUTPUT.Default,y.blur=!0,y.fresnel=!1,y.distanceAttenuation=!0,y.maxDistance=50,y.selective=!0,y.bouncing=!1,y.opacity=.4,y.enabled=!1!==this.options?.reflection?.enabled,this.ssrPass=y,!1!==this.options.ao?.enabled&&this.composer.addPass(m);const T=new Dt((e,t,s,i,a)=>{this.aoPass.enabled&&(this.initResolutionUniform(this.fquadBlendAO.material),this.renderer.setRenderTarget(this.gRenderTarget),this.fquadBlendAO.render(this.renderer),this.renderer.setRenderTarget(null))});this.composer.addPass(T);const R=new Dt((e,t,s,i,a)=>{this.renderer.setRenderTarget(this.gRenderTarget),this.renderScene(Ke.transparent),this.renderer.setRenderTarget(null)});this.composer.addPass(R),this.composer.addPass(u),this.composer.addPass(y),this.phasedRenderPass=new Ot(this.scene,this.camera,this.gRenderTarget),this.composer.addPass(this.phasedRenderPass),this.composer.addPass(d),d.emissiveTexture=this.gRenderTarget.textures[1],this.renderer.info.autoReset=!1,this.volumetricFogPass=new Ge(p),this.composer.addPass(this.volumetricFogPass),this.volumetricFogPass.enabled=!0,this.dofPass=new Y(this.scene,this.camera,{focus:1,aperture:.025,maxblur:.01}),this.dofPass.enabled=!1,this.composer.addPass(this.dofPass);const G=new xe;this.composer.addPass(G),this.colorPass=G,G.vignetteEnabled=!1,this.outlinePass=new ge(new i.Vector2(t.clientWidth,t.clientHeight),this.scene,this.camera),this.outlinePass.edgeGlow=0,this.outlinePass.edgeThickness=1.5,this.outlinePass.edgeStrength=5,this.outlinePass.clear=!1,this.outlinePass.enabled=!1,this.composer.addPass(this.outlinePass);const E=new P(M);E.uniforms.resolution.value.set(1/t.clientWidth,1/t.clientHeight),this.composer.addPass(E),this.fxaaPass=E,this.fxaaPass.enabled=!1,!0===s.enableOutlines&&this.setEnableOutlines(!0),new P(b).clear=!1,this.fixStatsStyle(),this.lutPass=new v({}),this.lutPass.enabled=!1,this.composer.addPass(this.lutPass);const B=new P(f,"prevtexture");B.enabled=!0,B.needsSwap=!1,B.material.uniforms.tDiffuse.value=this.gRenderTarget.textures[1],B.renderToScreen=!0;const U=this.isUpscalingEnabled()?new $e(this.options.upscaling):new K;!function(e){const t=e.material;if(t.dithering=!0,t.fragmentShader.includes("<dithering_fragment>"))return;const s="#include <colorspace_pars_fragment>";if(!t.fragmentShader.includes(s))return;t.fragmentShader=t.fragmentShader.replace(s,`${s}\n #include <common>\n #include <dithering_pars_fragment>`);const i=t.fragmentShader.lastIndexOf("}");i<0||(t.fragmentShader=`${t.fragmentShader.slice(0,i)}\n #include <dithering_fragment>\n${t.fragmentShader.slice(i)}`,t.needsUpdate=!0)}(U),this.outputPass=U,this.upscaleOutputPass=U instanceof $e?U:null,this.composer.addPass(U);const A=new i.MeshBasicMaterial({colorWrite:!1,depthWrite:!1,depthTest:!0,transparent:!1}),O=new o(new i.BoxGeometry(1,1,1),A);O.renderOrder=1/0,O.name="CLUSTER_BOUNDS_VOLUME"}addCluster(e){if(!1===this.options.occlusionCulling?.enabled)return;if(!this.renderer.capabilities.isWebGL2)return;const t=this.renderer.getContext(),s=t.createQuery();if(null==s)return;const i={query:s,visible:!0,awaitingResult:!1,cluster:e,lastTested:-1/0,distance:0,update:()=>{if(i.awaitingResult&&t.getQueryParameter(s,t.QUERY_RESULT_AVAILABLE)){const e=t.getQueryParameter(s,t.QUERY_RESULT);i.visible=!!e,i.awaitingResult=!1}}};e.boundsMesh.onBeforeRender=()=>{i.awaitingResult||t.beginQuery(t.ANY_SAMPLES_PASSED,s)},e.boundsMesh.onAfterRender=()=>{i.awaitingResult||(t.endQuery(t.ANY_SAMPLES_PASSED),i.awaitingResult=!0)},this.occlusionClusters.push(i)}updateRenderedOcclusionClusters(){this.queryScene.clear();const e=performance.now(),t=[];for(const s of this.occlusionClusters){if(s.awaitingResult)continue;const i=s.cluster.bounds.distanceToPoint(this.camera.position);if(s.distance=i,i<10){s.visible=!0,s.lastTested=e;continue}if(i>1e3)continue;const a=e-s.lastTested;if(!(s.visible&&a<4e3)&&((s.visible||!(a<100))&&dt.intersectsBox(s.cluster.bounds)))if(s.visible)t.push(s);else{let e=0;for(;e<t.length&&t[e].distance<s.distance;)e++;t.splice(e,0,s)}}if(t.length<50)for(const s of t)s.lastTested=e,this.queryScene.add(s.cluster.boundsMesh);else{const s=Math.max(Math.floor(Math.random()*t.length-50),0);for(let i=0;i<50;i++){const a=t[s+i];if(null==a)break;a.lastTested=e,this.queryScene.add(a.cluster.boundsMesh)}if(t.length>0){const s=t[0];s.lastTested=e,this.queryScene.add(s.cluster.boundsMesh)}}}fixStatsStyle(){const e=this.stats.dom;e.style.position="absolute";const t=e.getElementsByTagName("canvas");for(let e=0;e<t.length;e++)t.item(e).style.display="inline-block"}setEnableOutlines(e){this.outlinePass.enabled=e,this.fxaaPass.enabled=e,this.experimentalWebGpuBackend?.setEnableOutlines(e)}setCamera(e){if(this.camera=e,this.resetUpscalingHistory(),this.composer.passes.forEach(t=>{t instanceof x?t.camera=e:t instanceof ge?t.renderCamera=e:(t instanceof me||t instanceof se)&&(t.camera=e)}),this.ssrPass&&(this.ssrPass.camera=e),this.aoPass&&(this.aoPass.camera=e),this.phasedRenderPass&&(this.phasedRenderPass.camera=e),null==this.csm){this.csm=new Z({maxFar:80,lightFar:250,lightMargin:20,shadowBias:-1e-4,cascades:it?2:3,shadowMapSize:1024*(it?.5:1),lightDirection:new i.Vector3(.5,-1,-.6).normalize(),lightIntensity:.5*Math.PI,camera:this.camera,parent:this.scene,mode:"practical"});for(const e of this.csm.lights)e.shadow.normalBias=.01;if(null!=this.csmUpdateInvervals){this.csmCascadeLastUpdate=new Array(this.csm.lights.length).fill(0);for(const e of this.csm.lights)e.shadow.autoUpdate=!1}this.csm&&Array.isArray(this.csm.lights),this.csm.fade=!0,h.lights_fragment_begin=y.lights_fragment_begin}else this.csm.camera=this.camera,this.camera;this.csm.updateFrustums()}setSelectedObjects(e){if(this.experimentalWebGpuBackend?.setSelectedObjects(e),this.experimentalWebGpuBackend?.setSelectedObjectInstances([]),null==this.outlinePass)return;const t=new Map;for(const s of e)t.set(s.uuid,s);for(const s of e)s.traverse(e=>{e.uuid!==s.uuid&&t.has(e.uuid)&&t.delete(e.uuid)});this.outlinePass.selectedObjects=Array.from(t.values())}setExperimentalWebGpuDynamicBatchingEnabled(e){this.experimentalWebGpuDynamicBatchingEnabled=e,this.experimentalWebGpuBackend?.setDynamicBatchingEnabled(e)}setSelectedObjectInstances(e){this.experimentalWebGpuBackend?.setSelectedObjectInstances(e)}static createDepthRenderTarget(e,t,s){const a=Math.max(1,Math.floor(t.clientWidth*s)),n=Math.max(1,Math.floor(t.clientHeight*s)),r=new i.WebGLRenderTarget(a,n);return r.texture.minFilter=i.NearestFilter,r.texture.magFilter=i.NearestFilter,r.texture.generateMipmaps=!1,r.stencilBuffer=!1,r.depthTexture=new i.DepthTexture(a,n),r.depthTexture.type=i.UnsignedShortType,r.depthTexture.minFilter=i.NearestFilter,r.depthTexture.magFilter=i.NearestFilter,r}static createAOMaskDepthRenderTarget(e,t,s=e.getPixelRatio()){const a=Math.max(1,t.clientWidth*s),n=Math.max(1,t.clientHeight*s),r=new i.DepthTexture(a,n);r.type=i.UnsignedInt248Type,r.minFilter=i.NearestFilter,r.magFilter=i.NearestFilter;const o=new i.WebGLRenderTarget(a,n,{type:i.HalfFloatType,depthTexture:r});return o.texture.minFilter=i.NearestFilter,o.texture.magFilter=i.NearestFilter,o.texture.generateMipmaps=!1,o.stencilBuffer=!1,o}createSceneColorRenderTarget(){const e=this.gRenderTarget.width,t=this.gRenderTarget.height,s=new i.WebGLRenderTarget(e,t,{type:i.HalfFloatType,format:i.RGBAFormat,colorSpace:i.SRGBColorSpace,depthBuffer:!1,stencilBuffer:!1});return s.texture.minFilter=i.LinearFilter,s.texture.magFilter=i.LinearFilter,s.texture.generateMipmaps=!1,s}createSceneDepthRenderTarget(){const e=new i.WebGLRenderTarget(this.gRenderTarget.width,this.gRenderTarget.height,{type:i.FloatType,format:i.RedFormat,minFilter:i.NearestFilter,magFilter:i.NearestFilter,depthBuffer:!1,stencilBuffer:!1});return e.texture.generateMipmaps=!1,e}createGRenderTarget(){const e=this.container;null!=this.gRenderTarget&&this.gRenderTarget.dispose();const t=this.getRenderPixelRatio(),s=Math.max(1,e.clientWidth*t),a=Math.max(1,e.clientHeight*t),n=new i.DepthTexture(s,a);n.type=i.UnsignedIntType,n.minFilter=i.NearestFilter,n.magFilter=i.NearestFilter,this.gRenderTarget=new p(s,a,{count:3,samples:this.options?.msaa??0,minFilter:i.NearestFilter,magFilter:i.NearestFilter,type:i.HalfFloatType,format:i.RGBAFormat,depthTexture:n}),this.gRenderTarget.textures[2].type=i.UnsignedByteType,this.gRenderTarget.texture.generateMipmaps=!1,this.gRenderTarget.stencilBuffer=!1}setupEventListeners(){window.addEventListener("resize",this.onResize),window.addEventListener("orientationchange",this.onResize),document.addEventListener("visibilitychange",this.onVisiblityChane)}stop(e=!0){this.running=!1,this.disposeExperimentalStaticDrawSets(),this.experimentalWebGpuBackend?.destroy(),this.wakePausedRenderer=null,this.lightVolume?.shTexture.dispose(),window.removeEventListener("resize",this.onResize),window.removeEventListener("orientationchange",this.onResize),document.removeEventListener("visibilitychange",this.onVisiblityChane),this.onLoopCallbacks=[],e&&this.renderer.dispose(),this.gRenderTarget.dispose(),this.aoMaskDepthRenderTarget.dispose(),this.sceneColorRenderTarget.dispose(),this.sceneDepthRenderTarget.dispose(),this.csm.dispose();for(const e of this.postProcessEffects)this.composer.removePass(e.pass),e.pass.dispose();this.postProcessEffects.length=0,this.detachOwnedDomElements(),this.experimentalWebGpuBackend=null,this._activeBackend="webgl";if(ot().unobserve(this.container),rt.delete(this.container),this.occlusionClusters.length>0){const e=this.renderer.getContext();this.occlusionClusters.forEach(t=>{e.deleteQuery(t.query)})}this.volumetricFogPass.dispose(),S.clearSceneCache(this.scene)}onLoop(e){this.onLoopCallbacks.push(e)}removeOnLoop(e){const t=this.onLoopCallbacks.findIndex(t=>t===e);t>=0&&this.onLoopCallbacks.splice(t,1)}set showStats(e){this._showStats=e,this.experimentalWebGpuBackend?.setProfilingEnabled(e),this._showStats&&this.stats.dom.parentElement!==this.container?this.container.appendChild(this.stats.dom):this._showStats||this.stats.dom.parentElement!==this.container||this.container.removeChild(this.stats.dom),this.syncWebGpuPassStatsDom()}get showStats(){return this._showStats}attachRendererDomElement(){const e=this.getActiveRendererCanvas(),t=e===this.renderer.domElement?this.experimentalWebGpuBackend?.canvas:this.renderer.domElement;t?.parentElement===this.container&&this.container.removeChild(t),e.parentElement===this.container&&e===this.container.firstChild||this.container.insertBefore(e,this.container.firstChild),this._showStats&&this.stats.dom.parentElement!==this.container&&this.container.appendChild(this.stats.dom),this.syncWebGpuPassStatsDom()}detachOwnedDomElements(){this.renderer.domElement.parentElement===this.container&&this.container.removeChild(this.renderer.domElement);const e=this.experimentalWebGpuBackend?.canvas;e?.parentElement===this.container&&this.container.removeChild(e),this.stats.dom.parentElement===this.container&&this.container.removeChild(this.stats.dom),this.webGpuPassStatsDom.parentElement===this.container&&this.container.removeChild(this.webGpuPassStatsDom)}syncWebGpuPassStatsDom(){const e=this._showStats&&"webgpu-experimental"===this.options.backend;e&&this.webGpuPassStatsDom.parentElement!==this.container?this.container.appendChild(this.webGpuPassStatsDom):e||this.webGpuPassStatsDom.parentElement!==this.container||this.container.removeChild(this.webGpuPassStatsDom)}updateWebGpuPassStats(e){let t=this.webGpuPassStatsRows.length!==e.passes.length;for(let s=0;!t&&s<e.passes.length;s++)t=this.webGpuPassStatsRows[s].name!==e.passes[s].name;t&&(this.webGpuPassStatsDom.replaceChildren(this.webGpuVisibilityStatsDom),this.webGpuPassStatsRows=e.passes.map(e=>{const t=function(e){const t=document.createElement("div");t.style.cssText=["display:grid","grid-template-columns:minmax(0,1fr) 92px 92px","column-gap:12px","margin-bottom:7px"].join(";");const s=document.createElement("span");s.textContent=e,s.style.cssText="overflow:hidden;text-overflow:ellipsis;white-space:nowrap";const i=document.createElement("span"),a=document.createElement("span"),n=document.createElement("div");return n.style.cssText=["grid-column:1","height:4px","margin-top:4px","background:rgba(255,255,255,.78)","box-shadow:0 1px 2px rgba(0,0,0,.9)"].join(";"),t.append(s,i,a,n),{name:e,dom:t,gpu:i,cpu:a,bar:n}}(e.name);return this.webGpuPassStatsDom.appendChild(t.dom),t}));const s=e.visibility;if(null==s)this.webGpuVisibilityStatsDom.textContent=e.hiZOcclusionCullingActive?"GPU visibility: awaiting readback":"GPU visibility: inactive";else{const e=s.totalInstances>0?s.visibleInstances/s.totalInstances*100:100;this.webGpuVisibilityStatsDom.textContent=`GPU visibility: ${s.visibleInstances.toLocaleString()} / ${s.totalInstances.toLocaleString()} visible (${e.toFixed(1)}%), ${s.culledInstances.toLocaleString()} culled | dynamic ${s.dynamicVisibleInstances.toLocaleString()} / ${s.dynamicTotalInstances.toLocaleString()}, static ${s.staticVisibleInstances.toLocaleString()} / ${s.staticTotalInstances.toLocaleString()}`}let i=.01;for(const t of e.passes)i=Math.max(i,t.gpuTimeMs??t.cpuTimeMs);for(let t=0;t<e.passes.length;t++){const s=e.passes[t],a=this.webGpuPassStatsRows[t];a.gpu.textContent=null==s.gpuTimeMs?"GPU --":`GPU ${s.gpuTimeMs.toFixed(2)} ms`,a.cpu.textContent=`CPU ${s.cpuTimeMs.toFixed(2)} ms`;const n=s.gpuTimeMs??s.cpuTimeMs;a.bar.style.width=`${Math.max(n>0?2:0,n/i*100)}%`}}getActiveRendererCanvas(){return"webgpu-experimental"===this._activeBackend&&null!=this.experimentalWebGpuBackend?this.experimentalWebGpuBackend.canvas:this.renderer.domElement}disableExperimentalWebGpu(e){const t=this.experimentalWebGpuBackend;t?.canvas.parentElement===this.container&&this.container.removeChild(t.canvas),this.disposeExperimentalStaticDrawSets(),t?.destroy(),this.experimentalWebGpuBackend=null,this.experimentalWebGpuFailed=!0,this._activeBackend="webgl",this.webGpuPassStatsDom.remove(),this.applyWorldEnvironmentToWebGl(),this.attachRendererDomElement(),this.resizeRender(!0),console.warn("[Hology WebGPU experiment] Falling back to WebGL.",e)}activateExperimentalStaticDrawSets(){if("webgpu-experimental"!==this._activeBackend||null==this.experimentalWebGpuBackend)return;let e=0,t=0,s=0,i=0;for(const a of this.experimentalStaticDrawSetRegistrations)if(null==a.staticDrawSet)try{const i=this.experimentalWebGpuBackend.createStaticDrawSet(a.root,a.label);if(null==i)continue;a.staticDrawSet=i,a.root.visible=!1,e++,t+=i.drawCount,s+=i.instanceCount}catch(e){i++,console.warn(`[Hology WebGPU experiment] Keeping static root "${a.label}" dynamic:`,e)}e>0&&console.info(`[Hology WebGPU experiment] Activated ${e} static draw set${1===e?"":"s"} (${t} draws, ${s} instances).`),i>0&&console.warn(`[Hology WebGPU experiment] ${i} static draw set${1===i?"":"s"} remain dynamic.`)}disposeExperimentalStaticDrawSets(){for(const e of this.experimentalStaticDrawSetRegistrations)e.staticDrawSet?.dispose(),null!=e.staticDrawSet&&(e.root.visible=e.sourceWasVisible),e.staticDrawSet=null}applyEnvMap(e){if(null!=this.scene.environment&&(e instanceof C&&(null==e.envMap||e.userData.useSceneEnv)&&(e.userData.useSceneEnv=!0,null==e.uniforms.envMap&&(e.uniforms.envMap={value:this.scene.environment},e.uniformsNeedUpdate=!0,e.uniforms.envMapRotation={value:Gt(this.scene.environmentRotation,this.scene.environment,new i.Matrix3)}),null==e.uniforms.envMapIntensity&&(e.uniforms.envMapIntensity={value:1},e.uniformsNeedUpdate=!0),e.uniforms.envMap.value=this.scene.environment,e.uniforms.envMapIntensity.value=this.scene.environmentIntensity,e.envMap=this.scene.environment),e instanceof C||e instanceof i.MeshStandardMaterial)){const t=this.gbufferMaterialCache.get(e);null==t||this.gbufferMaterialCache.has(t)||this.applyEnvMap(t)}}setWorldEnvironment(e){const t=this.worldEnvironment?.source!==e?.source;this.worldEnvironment=e,null==e?(this.scene.environment=null,this.scene.environmentIntensity=1):("webgpu-experimental"!==this.options.backend||this.experimentalWebGpuFailed)&&this.applyWorldEnvironmentToWebGl();const s=this.experimentalWebGpuBackend;if(null==s)return;const i=t&&"webgpu-experimental"===this._activeBackend;i&&this.disposeExperimentalStaticDrawSets(),s.setWorldEnvironment(e),i&&this.activateExperimentalStaticDrawSets()}applyWorldEnvironmentToWebGl(){const e=this.worldEnvironment;if(null==e)return this.scene.environment=null,void(this.scene.environmentIntensity=1);this.scene.environment=this.getEnvTexture(e.source),this.scene.environmentIntensity=e.intensity}hideOccluded(e){e.length=0;for(const t of this.occlusionClusters)if(!t.visible){let s=t.cluster.objects.length;for(;s--;){const i=t.cluster.objects[s];i.visible&&(i.visible=!1,e.push(i))}}}setupCsm(e){if(e instanceof i.Mesh||e instanceof i.SkinnedMesh)if(e.material instanceof Array)for(const t of e.material)this.csm.setupMaterial(t);else this.csm.setupMaterial(e.material)}updateMaterialProperties(e,t){(e instanceof i.MeshBasicMaterial||e instanceof m||e instanceof i.MeshLambertMaterial||e instanceof i.MeshPhongMaterial)&&(null!=t.uniforms.color&&t.uniforms.color.value.setFromColor(e.color),null!=t.uniforms.opacity&&(t.uniforms.opacity.value=e.opacity),null!=t.uniforms.map&&(t.uniforms.map.value=e.map),null!=t.uniforms.alphaMap&&(t.uniforms.alphaMap.value=e.alphaMap),null!=t.uniforms.lightMap&&(t.uniforms.lightMap.value=e.lightMap,t.uniforms.lightMapIntensity.value=e.lightMapIntensity),null!=t.uniforms.aoMap&&(t.uniforms.aoMap.value=e.aoMap,t.uniforms.aoMapIntensity.value=e.aoMapIntensity),null!=t.uniforms.alphaTest&&(t.uniforms.alphaTest.value=e.alphaTest)),(e instanceof m||e instanceof i.MeshLambertMaterial||e instanceof i.MeshPhongMaterial)&&(t.uniforms.normalMap&&(t.uniforms.normalMap.value=e.normalMap,t.uniforms.normalScale.value=e.normalScale.x),t.uniforms.emissiveMap&&(t.uniforms.emissiveMap.value=e.emissiveMap,t.uniforms.emissive.value.setFromColor(e.emissive),t.uniforms.emissiveIntensity.value=e.emissiveIntensity)),e instanceof m&&(null!=t.uniforms.roughnessMap&&(t.uniforms.roughnessMap.value=e.roughnessMap),null!=t.uniforms.metalnessMap&&(t.uniforms.metalnessMap.value=e.metalnessMap),null!=t.uniforms.roughness&&(t.uniforms.roughness.value=e.roughness),null!=t.uniforms.metalness&&(t.uniforms.metalness.value=e.metalness)),e instanceof i.MeshPhysicalMaterial&&(t.uniforms.sheenColor&&t.uniforms.sheenColor.value.setFromColor(e.sheenColor).multiplyScalar(e.sheen),t.uniforms.sheenColorMap&&(t.uniforms.sheenColorMap.value=e.sheenColorMap),t.uniforms.sheenRoughness&&(t.uniforms.sheenRoughness.value=e.sheenRoughness),t.uniforms.sheenRoughnessMap&&(t.uniforms.sheenRoughnessMap.value=e.sheenRoughnessMap)),e instanceof De&&(t.uniforms.heightMap.value=e.heightMap,t.uniforms.heightScale.value=e.heightScale),this.updateMaterialCommonProperties(e,t)}updateUniformValues(e,t){const s=e.uniforms,i=t.uniforms;for(const e in s){const t=i[e],a=s[e].value;null!=t&&t.value!==a&&"receiveShadow"!==e&&!1===Wt.includes(e)&&(t.value=a)}this.updateMaterialCommonProperties(e,t)}inheritCustomUniformBindings(e,t){const s=e.uniforms,i=t.uniforms;for(const e in s)null==i[e]&&("receiveShadow"===e||Wt.includes(e)||Ft.includes(e)||(i[e]={value:s[e].value}))}updateMaterialCommonProperties(e,t){t.alphaTest=e.alphaTest,t.side=e.side,t.depthTest=e.depthTest,t.blending=e.blending,t.colorWrite=e.colorWrite,t.premultipliedAlpha=e.premultipliedAlpha,t.polygonOffset=e.polygonOffset,t.polygonOffsetFactor=e.polygonOffsetFactor,t.polygonOffsetUnits=e.polygonOffsetUnits,t.visible=e.visible}updateLightUniformValues(e,t){const s=e.uniforms,i=t.uniforms;for(const e of Wt){const t=i[e],a=s[e];null!=a&&null!=t&&(t.value=a.value)}}createGBufferMaterial(e,t,s=!1){const a=t===Ke.opaque?this.gbufferMaterialCache:this.tbufferMaterialCache;let n=a.get(e);if(!0===e.userData.isGBufferMaterial)return e;if(null==n){const s=this.usesShaderUniform(e,ae),o=this.usesShaderUniform(e,de),l=this.usesShaderUniform(e,ue),h=e.transparent&&e.alphaTest<=.01||e.blending===i.AdditiveBlending,p=t===Ke.opaque?!(s||o||l||h):h||s||o||l;if(!p)return a.set(e,st),st;let u=j.uv;if(e instanceof De&&null!=e.heightMap){const t=E("heightScale",e.heightScale??1);u=We(u,H("heightMap",e.heightMap),t)}let d=k.normal;if(e instanceof i.MeshStandardMaterial||e instanceof i.MeshLambertMaterial||e instanceof i.MeshToonMaterial||e instanceof i.MeshPhongMaterial){const t=e.normalMap??tt,s=E("useNormalMap",null!=e.normalMap?1:0),i=E("normalScale",e.normalScale?.x??1),a=T(H("normalMap",t).sample(_e(u,e.normalMap)),i);d=$(k.normal,a,s)}else e instanceof C&&null!=e.outputNormal&&(d=e.outputNormal);!0!==e.userData.disableAO&&(d=N("DOUBLE_SIDED",d,e=>_(new V("gl_FrontFacing"),e,e.multiplyScalar(-1))));let f=e.userData?.reflective?R(0):R(1);if(e instanceof i.MeshStandardMaterial){const t=E("roughness",e.roughness??1),s=e.roughnessMap??Ze,i=E("useRoughnessMap",null!=e.roughnessMap?1:0),a=H("roughnessMap",s).sample(_e(u,e.roughnessMap)).g.multiply(t);f=$(t,a,i)}else e instanceof C&&null!=e.outputRoughness&&(f=e.outputRoughness);let g=null;if((e instanceof i.MeshStandardMaterial||e instanceof i.MeshLambertMaterial||e instanceof i.MeshToonMaterial||e instanceof i.MeshPhongMaterial||e instanceof i.MeshBasicMaterial)&&null!=e.lightMap){const t=e.lightMap,s=E("useLightMap",null!=e.lightMap?1:0),i=E("lightMapIntensity",e.lightMapIntensity??1),a=H("lightMap",t).sample(u).rgb.multiplyScalar(i);g=$(D(0),a,s)}let M=R(0);if(e instanceof i.MeshStandardMaterial){const t=E("metalness",e.metalness??0),s=e.metalnessMap??et,i=E("useMetalnessMap",null!=e.metalnessMap?1:0),a=H("metalnessMap",s).sample(_e(u,e.metalnessMap)).b.multiply(t);M=$(t,a,i)}else e instanceof C&&e.outputRoughness;let b=null,v=R(1);if(e instanceof i.MeshStandardMaterial||e instanceof i.MeshLambertMaterial||e instanceof i.MeshToonMaterial||e instanceof i.MeshPhongMaterial||e instanceof i.MeshBasicMaterial){const t=e.aoMap??Ze,s=E("useAoMap",null!=e.aoMap?1:0);v=E("aoMapIntensity",e.aoMapIntensity??1);const i=H("aoMap",t).sample(_e(u,e.aoMap)).r;b=$(R(1),i,s)}else e instanceof C&&e.outputRoughness;const x=E("opacity",e.opacity??1);let P=R(1);if(e instanceof i.MeshStandardMaterial||e instanceof i.MeshLambertMaterial||e instanceof i.MeshBasicMaterial||e instanceof i.MeshToonMaterial||e instanceof i.MeshPhongMaterial){if(null!=e.alphaMap){const t=e.alphaMap;P=H("alphaMap",t).sample(_e(u,e.alphaMap)).r}P=P.multiply(x)}else e instanceof C&&null!=e.outputOpacity&&(P=e.outputOpacity);let w=W(0,1);if(e instanceof i.MeshStandardMaterial||e instanceof i.MeshLambertMaterial||e instanceof i.MeshToonMaterial||e instanceof i.MeshPhongMaterial||e instanceof i.MeshBasicMaterial){let t=B("color",(new i.Vector3).setFromColor(e.color));const s=e.map??Ze,a=E("useAlbedoMap",null!=e.map?1:0),n=H("map",s).sample(_e(u,e.map)),r=n.multiply(W(t,1)),o=W(t,1);w=$(o,r,a),e.vertexColors&&(w=w.multiply(L(I(z.color.rgb),1)));const l=$(R(1),n.w,a);P=P.multiply(l)}const y=!0===e.userData.hasBloom;let S=D(0);if(e instanceof i.MeshStandardMaterial||e instanceof i.MeshLambertMaterial||e instanceof i.MeshToonMaterial||e instanceof i.MeshPhongMaterial){const t=B("emissive",(new i.Vector3).setFromColor(e.emissive)),s=E("emissiveIntensity",e.emissiveIntensity),a=e.emissiveMap??et,n=E("useEmissiveMap",null!=e.emissiveMap?1:0),r=H("emissiveMap",a).sample(_e(u,e.emissiveMap)).rgb.multiply(t);S=$(t,r,n),S=S.multiplyScalar(s)}else e instanceof C&&null!=e.outputEmissive&&(S=e.outputEmissive);let F=null;if(e instanceof i.MeshPhysicalMaterial&&e.sheen>0&&(F=B("sheenColor",(new i.Vector3).setFromColor(e.sheenColor).multiplyScalar(e.sheen)),e.sheen>0&&null!=e.sheenColorMap)){const t=H("sheenColorMap",e.sheenColorMap).sample(u).rgb;F=F.multiply(t)}let q=null;if(e instanceof i.MeshPhysicalMaterial&&e.sheen>0&&(q=E("sheenRoughness",e.sheenRoughness),e.sheen>0&&null!=e.sheenRoughnessMap)){const t=H("sheenRoughnessMap",e.sheenRoughnessMap).sample(u).r;q=q.multiply(t)}let Q=null;if(e instanceof i.MeshPhysicalMaterial&&e.anisotropy>0&&(Q=E("anisotropy",e.anisotropy),e.anisotropy>0&&null!=e.anisotropyMap)){const t=H("anisotropyMap",e.anisotropyMap).sample(u).r;Q=Q.multiply(t)}let X=null;if(e instanceof i.MeshPhysicalMaterial&&e.anisotropy>0){const t=e.anisotropyRotation??0;X=J("anisotropyDirection",new i.Vector2(Math.cos(t),Math.sin(t)))}const Y=E("alphaTest",e.alphaTest);let K,Z=e.alphaTest>0?P.lt(Y):h&&t===Ke.opaque?P.lt(.8):null;!0===e.userData.isDecal&&(Z=Z?Z.or(je):je),K=h?L(0,0,0,0):(r=d,O(r).multiplyScalar(.5).addScalar(.5)).rgba(e.userData?.reflective?f:1);const ee=e instanceof C?e.outputPosition:void 0,te=e instanceof C?e.outputTransform:void 0;let se,ie=W("black",1);if(e instanceof C&&null!=e.outputColor)ie=e.outputColor;else if(e instanceof i.MeshStandardMaterial)ie=G({color:w,metalness:M,roughness:f,emissive:S.rgb,normal:d,ambientOcclusion:b,ambientOcclusionIntensity:v,bakedLight:g,sheenColor:F,sheenRoughness:q,anisotropy:Q,anisotropyDirection:X});else if(e instanceof i.MeshLambertMaterial||e instanceof i.MeshPhongMaterial)ie=A({color:w.rgb,ambientOcclusion:b,ambientOcclusionIntensity:v});else if(e instanceof i.MeshBasicMaterial){let e=w.rgb,t=g??D("black");null!=b&&(t=t.multiplyScalar(b.subtract(1).multiply(v).add(1))),e=e.add(t),ie=e.rgba(P)}else e instanceof i.MeshToonMaterial&&(ie=U({color:w,emissive:S.rgb,normal:d,ambientOcclusion:b,ambientOcclusionIntensity:v,bakedLight:g}));(e instanceof C||e instanceof i.MeshStandardMaterial)&&(se=e.envMap);let ne=!0;(e instanceof m||e instanceof i.MeshBasicMaterial||e instanceof i.ShaderMaterial)&&(ne=e.fog);let re=W(ie.rgb,P);ne&&(re=new FogNode(re)),n=new C({transform:te,position:null==te?ee:void 0,outputs:[re,S.rgba(t===Ke.opaque?Y:y?1:0),K],opacity:P,outputEncoding:!1,fog:ne,transparent:e.transparent,lights:!0,envMap:se,alphaTest:e.alphaTest,uniformNodes:e.uniformNodes??{},discard:Z}),e instanceof i.MeshStandardMaterial&&null!=e.envMap&&null!=n.uniforms.envMapIntensity&&(n.uniforms.envMapIntensity.value=e.envMapIntensity),"alphaMap"in e&&null!=e.alphaMap&&(n.alphaMap=e.alphaMap),(e instanceof C||e instanceof i.MeshStandardMaterial)&&this.applyEnvMap(n),e instanceof C&&(Object.assign(n.defines,e.defines),null!=n.uniforms[ue]&&(n.uniforms[ue].value=this.aoPass.pdRenderTarget.texture,n.defines.USE_SSAO_MAP="")),n.userData.mrtOutputs=3,n.forceSinglePass=e.forceSinglePass,n.side=e.side,n.blending=e.blending,h?(n.depthWrite=!e.transparent,n.depthTest=e.depthTest,n.colorWrite=t===Ke.transparent):(n.depthWrite=e.depthWrite,n.depthTest=e.depthTest),n.visible=e.visible,n.alphaTest=e.alphaTest,n.alphaHash=e.alphaHash,n.vertexColors=e.vertexColors,n.premultipliedAlpha=e.premultipliedAlpha,n.toneMapped=e.toneMapped,n.blendAlpha=e.blendAlpha,n.blendColor=e.blendColor,n.polygonOffset=e.polygonOffset,n.polygonOffsetFactor=e.polygonOffsetFactor,n.polygonOffsetUnits=e.polygonOffsetUnits,n.blending=e.blending,n.wireframe=e.wireframe??!1,n.userData.isGBufferMaterial=!0,n.visible=p,Object.assign(n.userData,e.userData),n.visible&&(this.csm.setupMaterial(n),e instanceof c&&this.inheritCustomUniformBindings(e,n)),a.set(e,n)}var r;return n.visible&&(e instanceof c?this.updateUniformValues(e,n):this.updateMaterialProperties(e,n)),this.usesShaderUniform(n,de)&&this.initSceneColorUniform(n),this.initLightVolumeUniform(n),n}isDepthPrepassEnabled(){return!0===this.options.depthPrepass?.enabled}usesSceneFeedbackUniforms(e){return e instanceof c&&(this.usesShaderUniform(e,ae)||this.usesShaderUniform(e,de)||this.usesShaderUniform(e,ue))}usesShaderUniform(e,t){return e instanceof c&&null!=e.uniforms[t]}isDepthPrepassEligibleMaterial(e){return null!=e&&(!1!==e.visible&&!1!==e.depthTest&&!1!==e.depthWrite&&(!e.transparent&&e.blending!==i.AdditiveBlending&&(!this.usesSceneFeedbackUniforms(e)&&(e instanceof C||e instanceof i.MeshStandardMaterial||e instanceof i.MeshLambertMaterial||e instanceof i.MeshPhongMaterial||e instanceof i.MeshToonMaterial||e instanceof i.MeshBasicMaterial))))}isDepthPrepassEligibleMesh(e){return!!this.isDepthPrepassEnabled()&&((e instanceof i.InstancedMesh||e instanceof Le)&&(!Array.isArray(e.material)&&this.isDepthPrepassEligibleMaterial(e.material)))}createDepthPrepassMaterial(e){if(!this.isDepthPrepassEligibleMaterial(e))return null;let t=this.depthPrepassMaterialCache.get(e);if(null==t){let s,a=R(1);e instanceof i.MeshStandardMaterial||e instanceof i.MeshLambertMaterial||e instanceof i.MeshBasicMaterial||e instanceof i.MeshToonMaterial||e instanceof i.MeshPhongMaterial?(a=E("opacity",e.opacity??1),null!=e.map&&(a=a.multiply(H("map",e.map).sample(j.uv).a)),null!=e.alphaMap&&(a=a.multiply(H("alphaMap",e.alphaMap).sample(j.uv).r))):e instanceof C&&(a=e.outputOpacity??R(1)),null!=e.alphaTest&&e.alphaTest>0&&(s=a.lt(e.alphaTest));const n=e instanceof C?e.outputPosition:void 0,r=e instanceof C?e.outputTransform:void 0;t=new C({outputs:[W(0,0),W(0,0),W(0,0)],opacity:a,transform:r,position:null==r?n:void 0,discard:s,lights:!1,fog:!1,outputEncoding:!1,transparent:!1,alphaTest:e.alphaTest}),t.depthWrite=!0,t.depthTest=e.depthTest,t.colorWrite=!1,t.transparent=!1,t.blending=i.NoBlending,t.lights=!1,t.fog=!1,t.toneMapped=!1,t.side=e.side,t.alphaTest=e.alphaTest,t.visible=e.visible,t.polygonOffset=e.polygonOffset,t.polygonOffsetFactor=e.polygonOffsetFactor,t.polygonOffsetUnits=e.polygonOffsetUnits,t.onBeforeCompile=()=>{},t.customProgramCacheKey=()=>`depth-prepass:${e.id}:${e.version}:${e.alphaTest}:${e.side}`;for(const e of Wt)delete t.uniforms[e];for(const e of Ft)delete t.uniforms[e];delete t.uniforms.receiveShadow,this.depthPrepassMaterialCache.set(e,t)}return e instanceof C?this.updateUniformValues(e,t):this.updateMaterialProperties(e,t),t.depthWrite=!0,t.depthTest=e.depthTest,t.colorWrite=!1,t.transparent=!1,t.blending=i.NoBlending,t.visible=e.visible,t.alphaTest=e.alphaTest,t.side=e.side,t.polygonOffset=e.polygonOffset,t.polygonOffsetFactor=e.polygonOffsetFactor,t.polygonOffsetUnits=e.polygonOffsetUnits,t}applyDepthPrepassMaterials(){const e=this.depthPrepassCachedMaterials,t=this.depthPrepassCachedVisibility;e.clear(),t.length=0,be(this.scene,s=>{if(Ut(s))return t.push(s),s.visible=!1,!1;if(!(s instanceof o))return;if(e.set(s,s.material),!this.isDepthPrepassEligibleMesh(s))return t.push(s),void(s.visible=!1);const i=this.createDepthPrepassMaterial(s.material);if(null==i)return t.push(s),void(s.visible=!1);s.material=i,s.visible=!0})}unapplyDepthPrepassMaterials(){this.depthPrepassCachedMaterials.forEach((e,t)=>{t.material=e}),this.depthPrepassCachedVisibility.forEach(e=>{e.visible=!0})}renderDepthPrepass(){if(!this.isDepthPrepassEnabled())return;this.applyDepthPrepassMaterials();const e=this.scene.matrixWorldAutoUpdate,t=this.scene.matrixAutoUpdate,s=this.renderer.shadowMap.autoUpdate;this.renderer.shadowMap.autoUpdate=!1,this.scene.matrixWorldAutoUpdate=!1,this.scene.matrixAutoUpdate=!1,this.renderer.setRenderTarget(this.gRenderTarget),this.renderer.clearDepth();try{this.renderer.render(this.scene,this.camera)}catch(e){console.warn("Depth prepass render failed",e)}this.unapplyDepthPrepassMaterials(),this.renderer.shadowMap.autoUpdate=s,this.scene.matrixWorldAutoUpdate=e,this.scene.matrixAutoUpdate=t}updateCsm(){const e=this.csmUpdateInvervals;if(this.renderer.shadowMap.autoUpdate&&null!=this.csmCascadeLastUpdate&&Array.isArray(e)){const t=performance.now();for(let s=0;s<this.csm.lights.length;++s){const i=e[s]??e[e.length-1]??16;(t-this.csmCascadeLastUpdate[s]>=i||0===s)&&this.csm.lights[s].shadow&&(this.csm.lights[s].shadow.needsUpdate=!0,this.csmCascadeLastUpdate[s]=t)}}this.csm.update()}syncExperimentalWebGpuCascades(){const e=this.experimentalWebGpuBackend,t=this.camera,s=this.csm;if(null==e||!(t instanceof l)||null==s)return void e?.setCascadedShadowRanges([]);const i=[];s.getExtendedBreaks(i);const a=Math.max(t.far-t.near,1e-4),n=Math.max(Math.min(t.far,s.maxFar),0)/a;e.setCascadedShadowRanges(i.map(({x:e,y:t})=>({x:e*n,y:t*n})),s.lights)}loop(t,s=!1){const a=this.stats,n=a.addPanel(new te.Panel("Calls","#83f","#002")),l=a.addPanel(new te.Panel("Triangles","#c32","#002")),h="webgpu-experimental"===this.options.backend,c=h?a.addPanel(new te.Panel("WGPU CPU","#2cf","#013")):null,p=h?a.addPanel(new te.Panel("WGPU GPU","#fc2","#310")):null,u=h?a.addPanel(new te.Panel("Extract","#4f8","#021")):null,d=h?a.addPanel(new te.Panel("Upload","#f8c","#301")):null,m=h?a.addPanel(new te.Panel("Graph","#c8f","#201")):null;let f;navigator.userAgent.includes("Chrome")&&navigator.userAgent.includes("HologyEngine")&&"webgpu-experimental"!==this.options.backend&&(f=new fe(this.renderer.getContext()),a.addPanel(f)),this.showStats=s;let g=10,M=1e3,b=16,v=16,x=4,P=4,w=16;let y=-1/0;const S=e=>!(e-y<.25)&&(y=e,!0),T=()=>{const e=this.renderer.info.render.calls;e>g&&(g=e,setTimeout(()=>g=10,5e3)),n.update(e,g);const t=this.renderer.info.render.triangles;t>M&&(M=t,setTimeout(()=>M=1e3,5e3)),l.update(t,M)},R=()=>{const e=this.experimentalWebGpuBackend?.getLastFrameProfile();null!=e&&(g=Math.max(g,e.drawCallCount),M=Math.max(M,e.triangleCount),b=Math.max(b,e.cpuTimeMs),x=Math.max(x,e.cpuPhases.extractSceneMs),P=Math.max(P,e.cpuPhases.uploadMs),w=Math.max(w,e.cpuPhases.renderGraphMs),n.update(e.drawCallCount,g),l.update(e.triangleCount,M),c?.update(e.cpuTimeMs,b),u?.update(e.cpuPhases.extractSceneMs,x),d?.update(e.cpuPhases.uploadMs,P),m?.update(e.cpuPhases.renderGraphMs,w),null!=e.gpuTimeMs&&(v=Math.max(v,e.gpuTimeMs),p?.update(e.gpuTimeMs,v)),this.updateWebGpuPassStats(e))};performance.now();i.Ray.prototype.intersectTriangle;this.resizeRender();const G=[],E=[],B=[],U=[];let A=0;const O=new r,D=new r;let W=0;let F=this.paused,I=!1,j=0,k=null,L=this.fpsCapRevision;const V=()=>{this.running&&!0!==this.options.enableXR&&requestAnimationFrame(H)},_=()=>{this.running&&(e.activeView=this,I&&(I=!1,requestAnimationFrame(()=>H(j))))};this.wakePausedRenderer=_;const N=ot();rt.set(this.container,e=>{this.isIntersecting=e,e&&_()}),N.observe(this.container),this.container.addEventListener("pointerdown",()=>{_()},{capture:!0});const H=s=>{if(I=!1,!this.running)return;const n=this.getActiveRendererCanvas(),r=this.needsPausedRender;if(null===this.container.offsetParent||this.paused&&!r&&n.height>1)return I=!0,j=s,setTimeout(()=>{this.running&&I&&H(s)},500),void(this.paused&&(F=!0));if(n.parentElement!==this.container){if(e.activeView!==this&&null!==e.activeView)return I=!0,void(j=s);this.attachRendererDomElement(),this.resizeRender()}if(!0!==this.options.enableXR){L!==this.fpsCapRevision&&(L=this.fpsCapRevision,k=null);const e=this.fpsCap;if(null!=e){const t=1e3/e;if(null!=k){const e=s-k;if(e<t)return void V();k=s-e%t}else k=s}else k=s}let l=(s*=.001)-A;A=s,F?(l=.016,F=!1,this.resetUpscalingHistory()):l>.25&&this.resetUpscalingHistory(),this.updateDynamicResolution(l,1e3*s);const h="webgpu-experimental"===this._activeBackend;if(this.applyPostProcessSettings(),h||(this.renderer.autoClear=!1,this.renderer.setViewport(0,0,this.container.clientWidth,this.container.clientHeight)),a.begin(),!h&&this.showStats&&f?.startQuery(),h||(this.ssrPass.gpuPanel=f),O.copy(this.camera.matrixWorld),!this.paused){if(l>1){let e=l;for(;e>.05;)t(ht),e-=ht;t(e)}else t(l);this.onLoopCallbacks.forEach(e=>e(l))}this.paused||(this.simulationTime+=l*this.simulationTimeScale);const c=this.simulationTime;if(this.camera?.updateMatrixWorld(),D.copy(this.camera.matrixWorld),s-W>.08&&!D.equals(O)&&(this.renderer.shadowMap.needsUpdate=!0,W=s),this.updateCsm(),h){try{const e=this.experimentalWebGpuBackend;if(null==e||!ze.supportsCamera(this.camera))throw new Error(`Unsupported camera type: ${this.camera?.type??"unknown"}`);this.syncExperimentalWebGpuCascades(),e.render(this.scene,this.camera,c),this.showStats&&S(s)&&R()}catch(e){this.disableExperimentalWebGpu(e),this.render(l)}return a.end(),void V()}let p=!1;G.length=0,E.length=0,B.length=0;for(const e of U)e.visible=!0;U.length=0;const u=dt;ft.multiplyMatrices(this.camera.projectionMatrix,this.camera.matrixWorldInverse),u.setFromProjectionMatrix(ft);let d=!1,m=!1,g=!1;const M=this.frameGBufferMeshes,b=this.frameGBufferPhaseMasks,v=this.frameUnsupportedGBufferObjects,x=this.frameGBufferExcludedObjects;if(M.length=0,b.length=0,v.length=0,x.clear(),this.scene.traverseVisible(e=>{if(this.setupCsm(e),this.outlineEffect.apply(e),e instanceof Oe&&(d=!0),e instanceof o&&this.initCustomDepthMaterial(e),(e instanceof o||e instanceof i.Sprite)&&(this.initResolutionUniform(e.material),this.initNormalUniform(e.material),this.initShadowUniform(e,e.material),this.initLightVolumeUniform(e.material),null!=this.scene.environment&&ut(e,e=>this.applyEnvMap(e)),!0===e.material?.userData?.hasBloom&&(p=!0)),(e instanceof o||e instanceof i.Sprite)&&e.visible&&(e.material?.userData?.water||e.material?.uniforms&&null!=e.material?.uniforms[ae])&&isObjectInFrustum(e,u)?(this.initDepthUniform(e.material),m=!0):e instanceof X&&(e.visible=!1,E.push(e)),(e instanceof o||e instanceof i.Sprite)&&e.material?.uniforms&&null!=e.material?.uniforms[ue]&&isObjectInFrustum(e,u)&&e.material instanceof C&&this.initAoUniform(e.material),e instanceof o||e instanceof i.Sprite){let t=!1;ut(e,e=>{this.usesShaderUniform(e,de)&&(this.initSceneColorUniform(e),t=!0)}),t&&(B.push(e),g=!0)}if(e instanceof o&&e.material?.uniforms&&null!=e.material?.uniforms[pe])e.material.uniforms[pe].value=c;else if(e instanceof o&&Array.isArray(e.material))for(const t of e.material)t.uniforms&&null!=t.uniforms[pe]&&(t.uniforms[pe].value=c);if(x.has(e))for(let t=0;t<e.children.length;t++)x.add(e.children[t]);else if(Ut(e)){v.push(e);for(let t=0;t<e.children.length;t++)x.add(e.children[t])}else e instanceof o&&(M.push(e),b.push(this.getGBufferPhaseMask(e.material)))}),x.clear(),this.phasedRenderPass.enabled=v.length>0,this.bloomPass.enabled=p,!0===this.options.occlusionCulling?.enabled){for(const e of this.occlusionClusters)e.update();this.hideOccluded(U)}this.prepareUpscalingFrame(),this.renderer.setRenderTarget(this.gRenderTarget),this.renderer.clear(),this.renderDepthPrepass(),this.renderScene(Ke.opaque),this.updateRenderedOcclusionClusters(),this.renderer.render(this.queryScene,this.camera),this.aoPass.output=se.OUTPUT.Off;for(const e of this.postProcessEffects)if(e.pass.enabled&&this.usesShaderUniform(e.pass.material,ae)){m=!0;break}g&&(this.fquadCopySceneColor.material.uniforms.tDiffuse.value=this.gRenderTarget.textures[0],this.renderer.setRenderTarget(this.sceneColorRenderTarget),this.fquadCopySceneColor.render(this.renderer)),m&&(this.fquadCopySceneDepth.material.uniforms.tDepthTexture.value=this.gRenderTarget.depthTexture,this.renderer.setRenderTarget(this.sceneDepthRenderTarget),this.fquadCopySceneDepth.render(this.renderer)),(m||g)&&this.renderer.setRenderTarget(this.gRenderTarget),B.length,G.forEach(e=>e.visible=!0),E.forEach(e=>e.visible=!0),B.forEach(e=>e.visible=!0),this.aoPass.enabled,this.ssrPass&&(this.ssrPass.elapsedTime=s),this.volumetricFogPass&&d?(this.volumetricFogPass.update(this.camera,this.gRenderTarget,this.csm,this.scene),this.volumetricFogPass.enabled=!0):this.volumetricFogPass&&(this.volumetricFogPass.enabled=!1),this.updatePostProcessEffectUniforms(c);try{this.paused&&!r||!this.running||(this.render(l),this.finishUpscalingFrame(),this.showStats&&f?.endQuery(),this.showStats&&S(s)&&T(),this.renderer.info.reset(),this.renderOverlay())}catch(e){console.warn(e)}finally{this.finishUpscalingFrame(),r&&(this.needsPausedRender=!1)}a.end(),this.csm?.update(),V()};!0===this.options.enableXR?this.renderer.setAnimationLoop(H):requestAnimationFrame(H)}collectGBufferRenderables(e,t=this.frameGBufferMeshes,s=this.frameGBufferPhaseMasks,i=this.frameUnsupportedGBufferObjects){t.length=0,s.length=0,i.length=0,be(e,e=>{if(Ut(e))return i.push(e),!1;e instanceof o&&(t.push(e),s.push(this.getGBufferPhaseMask(e.material)))})}getGBufferPhaseMask(e){if(Array.isArray(e)){let t=0;for(let s=0;s<e.length;s++)t|=this.getGBufferPhaseMask(e[s]);return t}if(null==e||!1===e.visible)return 0;let t=this.gBufferPhaseMaskCache.get(e);if(null!=t)return t;if(!0===e.userData.isGBufferMaterial)return t=1<<Ke.opaque|1<<Ke.transparent,this.gBufferPhaseMaskCache.set(e,t),t;const s=this.usesShaderUniform(e,ae),a=this.usesShaderUniform(e,de),n=this.usesShaderUniform(e,ue),r=e.transparent&&e.alphaTest<=.01||e.blending===i.AdditiveBlending,o=s||a||n;return t=0,o||r||(t|=1<<Ke.opaque),(o||r)&&(t|=1<<Ke.transparent),this.gBufferPhaseMaskCache.set(e,t),t}getGBufferMaterialArray(e,t){let s=this.gBufferMaterialArrayCache.get(e);null==s&&(s={opaque:[],transparent:[]},this.gBufferMaterialArrayCache.set(e,s));const i=t===Ke.opaque?s.opaque:s.transparent;i.length=e.length;for(let s=0;s<e.length;s++)i[s]=this.createGBufferMaterial(e[s],t,!1);return i}applyGBufferMaterials(e,t=this.frameGBufferMeshes,s=this.frameGBufferPhaseMasks,i=this.frameUnsupportedGBufferObjects){const a=this.appliedGBufferMeshes,n=this.originalGBufferMaterials,r=this.originalGBufferOnBeforeRender,o=this.hiddenGBufferObjects;a.length=0,n.length=0,r.length=0,o.length=0;for(let e=0;e<i.length;e++){const t=i[e];t.visible&&(o.push(t),t.visible=!1)}const l=1<<e;for(let i=0;i<t.length;i++){const h=t[i];if(!h.visible)continue;const c=h.material;if(0!==(s[i]&l)||0!==h.children.length)if(a.push(h),n.push(c),r.push(h.onBeforeRender),0!==(s[i]&l)){if(Array.isArray(c)){const t=this.getGBufferMaterialArray(c,e);h.material=t;for(let e=0;e<t.length;e++)this.initShadowUniform(h,t[e])}else{const t=this.createGBufferMaterial(c,e,e===Ke.opaque&&this.isDepthPrepassEligibleMesh(h));h.material=t,this.initShadowUniform(h,t)}this.applyGBufferShadowUniformUpdater(h)}else h.material=st;else o.push(h),h.visible=!1}}unapplyGBufferMaterials(){const e=this.appliedGBufferMeshes;for(let t=0;t<e.length;t++){const s=e[t];s.material=this.originalGBufferMaterials[t],s.onBeforeRender=this.originalGBufferOnBeforeRender[t]}const t=this.hiddenGBufferObjects;for(let e=0;e<t.length;e++)t[e].visible=!0;e.length=0,this.originalGBufferMaterials.length=0,this.originalGBufferOnBeforeRender.length=0,t.length=0}applyGBufferShadowUniformUpdater(e){const t=e.onBeforeRender;let s=this.gBufferShadowUpdaterCache.get(e);if(null==s){const i=this,a={original:t,wrapper:null};a.wrapper=(t,s,n,r,o,l)=>{a.original.call(e,t,s,n,r,o,l),i.initShadowUniform(e,o)},s=a,this.gBufferShadowUpdaterCache.set(e,s)}s.original=t,e.onBeforeRender=s.wrapper}initTextures(e=this.scene){e.traverse(e=>{if(e instanceof o)if(Array.isArray(e.material))for(let t=0;t<e.material.length;t++)this._initMaterialTextures(e.material[t]);else this._initMaterialTextures(e.material)})}_initMaterialTextures(e){if(!this._initiatedMaterialTextures.has(e))if(this._initiatedMaterialTextures.add(e),e instanceof c){for(const[t,s]of Object.entries(e.uniforms))if(s.value instanceof u){if(this._initiatedTextures.has(s.value))continue;this._initTexture(s.value),this._initiatedTextures.add(s.value)}}else for(const[t,s]of Object.entries(e))if(s instanceof u){if(this._initiatedTextures.has(s))continue;this._initTexture(s),this._initiatedTextures.add(s)}}_initTexture(e){"webgpu-experimental"!==this._activeBackend?this.renderer.initTexture(e):this.experimentalWebGpuBackend?.initTexture(e)}async compileAsync(e=this.scene){if(this.compileInProgress)return;if("webgpu-experimental"===this.options.backend&&!this.experimentalWebGpuFailed&&e instanceof i.Scene){this.compileInProgress=!0;const t=await this.compileExperimentalWebGpu(e);if(this.compileInProgress=!1,t)return}this.renderer.setRenderTarget(this.gRenderTarget),this.compileInProgress=!0;const t=[],s=[],a=[];this.collectGBufferRenderables(e,t,s,a),this.applyGBufferMaterials(Ke.opaque,t,s,a),await this.renderer.compileAsync(e,this.camera),this.unapplyGBufferMaterials(),this.applyGBufferMaterials(Ke.transparent,t,s,a),await this.renderer.compileAsync(e,this.camera),this.unapplyGBufferMaterials(),this.isDepthPrepassEnabled()&&(this.renderer.setRenderTarget(this.gRenderTarget),this.applyDepthPrepassMaterials(),await this.renderer.compileAsync(e,this.camera),this.unapplyDepthPrepassMaterials()),e===this.scene&&(this.renderer.setRenderTarget(this.gRenderTarget),this.renderer.compileAsync(this.fquadBlendAO.mesh,this.fquadBlendAO.camera),this.renderer.setRenderTarget(this.sceneColorRenderTarget),this.renderer.compileAsync(this.fquadCopySceneColor.mesh,this.fquadCopySceneColor.camera),this.renderer.setRenderTarget(this.sceneDepthRenderTarget),this.renderer.compileAsync(this.fquadCopySceneDepth.mesh,this.fquadCopySceneDepth.camera));const n=this.csm.lights[0]?.shadow.camera;null!=n&&(this.applyDepthMaterial(),await this.renderer.compileAsync(e,n),this.unapplyDepthMaterial()),this.compileInProgress=!1,this.renderer.setRenderTarget(null)}async compileExperimentalWebGpu(e){try{if(!(e instanceof i.Scene))throw new Error("Only THREE.Scene roots are supported by the experimental renderer.");if(!ze.supportsCamera(this.camera))throw new Error(`Unsupported camera type: ${this.camera?.type??"unknown"}`);const t=this.experimentalWebGpuBackend??await ze.create({fxaa:{contrastThreshold:.0312,relativeThreshold:.063,subpixelBlending:.75},taa:!1,...this.options.webgpuPostProcessing});return this.experimentalWebGpuBackend=t,t.setDynamicBatchingEnabled(this.experimentalWebGpuDynamicBatchingEnabled),t.setEnableOutlines(!0===this.outlinePass?.enabled),t.setSelectedObjects(this.outlinePass?.selectedObjects??[]),this.syncExperimentalWebGpuPostProcessEffects(),t.setProfilingEnabled(this._showStats),t.setWorldEnvironment(this.worldEnvironment),t.setSize(this.container.clientWidth,this.container.clientHeight,this.getRenderPixelRatio()),this._activeBackend="webgpu-experimental",e===this.scene&&this.activateExperimentalStaticDrawSets(),await t.compile(e,this.camera),this.attachRendererDomElement(),e!==this.scene||this.experimentalWebGpuCapabilityReported||(console.info(Je(t.inspect(e,this.camera))),this.experimentalWebGpuCapabilityReported=!0),!0}catch(e){return this.disableExperimentalWebGpu(e),!1}}applyDepthMaterial(){const e=this.depthMaterialCachedMaterials;e.clear(),this.scene.traverse(t=>{(t.isMesh||t.isPoints||t.isLine||t.isSprite)&&(this.initCustomDepthMaterial(t),e.set(t,t.material),t.castShadow?null!=t.customDepthMaterial?t.material=t.customDepthMaterial:t.material=jt:t.material=null)})}unapplyDepthMaterial(){this.depthMaterialCachedMaterials.forEach((e,t)=>{t.material=e})}renderScene(e){if(!this.running||this.paused&&!this.needsPausedRender)return;if(this.compileInProgress)return void console.error("Compile in progress, skipping render");this.applyGBufferMaterials(e);const t=this.scene.matrixWorldAutoUpdate,s=this.scene.matrixAutoUpdate,i=this.renderer.shadowMap.autoUpdate;e!==Ke.opaque&&(this.renderer.shadowMap.autoUpdate=!1,this.scene.matrixWorldAutoUpdate=!1,this.scene.matrixAutoUpdate=!1);try{this.renderer.render(this.scene,this.camera)}catch(e){console.warn("Render failed",e)}if(e===Ke.opaque){const e=this.appliedGBufferMeshes;for(let t=0;t<e.length;t++){const s=e[t],i=this.originalGBufferMaterials[t];!Array.isArray(i)&&!Array.isArray(s.material)&&i instanceof c&&this.updateLightUniformValues(s.material,i)}}this.unapplyGBufferMaterials(),this.renderer.shadowMap.autoUpdate=i,this.scene.matrixWorldAutoUpdate=t,this.scene.matrixAutoUpdate=s}getEnvTexture(e){if(e.mapping===i.CubeUVReflectionMapping)return e;null==this.pmremGenerator&&(this.pmremGenerator=new i.PMREMGenerator(this.renderer),this.pmremGenerator.compileEquirectangularShader());let t=this.pmremGeneratorResults.get(e);return null==t&&(t=this.pmremGenerator.fromEquirectangular(e).texture,this.pmremGeneratorResults.set(e,t)),t}applyPostProcessSettings(){if(0==this.postProcessVolumes.length)return this.experimentalWebGpuBackend?.setPostProcessState(null),"webgpu-experimental"===this._activeBackend?this.experimentalWebGpuBackend?.setWorldEnvironment(this.worldEnvironment):this.applyWorldEnvironmentToWebGl(),this.lutPass.enabled=!1,this.colorPass.enabled=!1,this.dofPass.enabled=!1,this.renderer.toneMapping=this.baseToneMapping,void(this.renderer.toneMappingExposure=this.baseToneMappingExposure);!function(e,t=i.NoToneMapping,s=1){e.tonemapMapping=t,e.tonemapExposure=s,e.envIntensity=1,e.envTexture=void 0,e.vignetteIntensity=0,e.colorTint=e.colorTint??new i.Color("white"),e.colorTint.set("white"),e.colorTintIntensity=0,e.depthFocus=void 0,e.depthAperture=void 0,e.depthMaxBlur=void 0,e.temperature=6500,e.temperatureTint=0,e.globalSaturation=gt(e.globalSaturation,1,1,1),e.globalContrast=gt(e.globalContrast,1,1,1),e.globalGamma=gt(e.globalGamma,1,1,1),e.globalGain=gt(e.globalGain,1,1,1),e.globalOffset=gt(e.globalOffset,0,0,0),e.shadowsSaturation=gt(e.shadowsSaturation,1,1,1),e.shadowsContrast=gt(e.shadowsContrast,1,1,1),e.shadowsGamma=gt(e.shadowsGamma,1,1,1),e.shadowsGain=gt(e.shadowsGain,1,1,1),e.shadowsOffset=gt(e.shadowsOffset,0,0,0),e.shadowsMax=.09,e.midtonesSaturation=gt(e.midtonesSaturation,1,1,1),e.midtonesContrast=gt(e.midtonesContrast,1,1,1),e.midtonesGamma=gt(e.midtonesGamma,1,1,1),e.midtonesGain=gt(e.midtonesGain,1,1,1),e.midtonesOffset=gt(e.midtonesOffset,0,0,0),e.highlightsSaturation=gt(e.highlightsSaturation,1,1,1),e.highlightsContrast=gt(e.highlightsContrast,1,1,1),e.highlightsGamma=gt(e.highlightsGamma,1,1,1),e.highlightsGain=gt(e.highlightsGain,1,1,1),e.highlightsOffset=gt(e.highlightsOffset,0,0,0),e.highlightsMin=.5,e.lut=void 0,e.lutIntensity=0}(this.postProcessSettings,this.baseToneMapping,this.baseToneMappingExposure);const e=this.postProcessSettings;null!=this.worldEnvironment&&(e.envTexture=this.worldEnvironment.source,e.envIntensity=this.worldEnvironment.intensity);let t,s=!1;if(null==this.camera)return;const a=this.camera.getWorldPosition(yt);let n=[];for(const r of this.postProcessVolumes){if(!ct(r.object))continue;let o=r.blendWeight??1;const l=r.distanceToPoint(a);l>r.blendRadius||(r.blendRadius>0&&(o*=ve(1-l/r.blendRadius,0,1)),o>1&&(o=1),o>0&&(n.push(r),void 0!==r.settings.tonemapMapping&&(e.tonemapMapping=r.settings.tonemapMapping),void 0!==r.settings.tonemapExposure&&(e.tonemapExposure=i.MathUtils.lerp(e.tonemapExposure,r.settings.tonemapExposure,o)),void 0!==r.settings.envTexture&&(e.envTexture=r.settings.envTexture),void 0!==r.settings.envIntensity&&(e.envIntensity=i.MathUtils.lerp(e.envIntensity,r.settings.envIntensity,o)),void 0!==r.settings.vignetteIntensity&&(e.vignetteIntensity=i.MathUtils.lerp(e.vignetteIntensity,r.settings.vignetteIntensity,o)),void 0!==r.settings.colorTint&&void 0!==r.settings.colorTintIntensity&&r.settings.colorTintIntensity>0&&(e.colorTint=e.colorTint.lerp(r.settings.colorTint,o)),void 0!==r.settings.colorTintIntensity&&(e.colorTintIntensity=i.MathUtils.lerp(e.colorTintIntensity,r.settings.colorTintIntensity,o)),void 0!==r.settings.depthFocus&&(s=!0,e.depthFocus=void 0!==e.depthFocus?i.MathUtils.lerp(e.depthFocus,r.settings.depthFocus,o):r.settings.depthFocus),void 0!==r.settings.depthAperture&&(s=!0,e.depthAperture=void 0!==e.depthAperture?i.MathUtils.lerp(e.depthAperture,r.settings.depthAperture,o):r.settings.depthAperture),void 0!==r.settings.depthMaxBlur&&(s=!0,e.depthMaxBlur=void 0!==e.depthMaxBlur?i.MathUtils.lerp(e.depthMaxBlur,r.settings.depthMaxBlur,o):r.settings.depthMaxBlur),void 0!==r.settings.temperature&&(e.temperature=i.MathUtils.lerp(e.temperature,r.settings.temperature,o)),void 0!==r.settings.temperatureTint&&(e.temperatureTint=i.MathUtils.lerp(e.temperatureTint,r.settings.temperatureTint,o)),void 0!==r.settings.globalSaturation&&e.globalSaturation.lerp(r.settings.globalSaturation,o),void 0!==r.settings.globalContrast&&e.globalContrast.lerp(r.settings.globalContrast,o),void 0!==r.settings.globalGamma&&e.globalGamma.lerp(r.settings.globalGamma,o),void 0!==r.settings.globalGain&&e.globalGain.lerp(r.settings.globalGain,o),void 0!==r.settings.globalOffset&&e.globalOffset.lerp(r.settings.globalOffset,o),void 0!==r.settings.shadowsSaturation&&e.shadowsSaturation.lerp(r.settings.shadowsSaturation,o),void 0!==r.settings.shadowsContrast&&e.shadowsContrast.lerp(r.settings.shadowsContrast,o),void 0!==r.settings.shadowsGamma&&e.shadowsGamma.lerp(r.settings.shadowsGamma,o),void 0!==r.settings.shadowsGain&&e.shadowsGain.lerp(r.settings.shadowsGain,o),void 0!==r.settings.shadowsOffset&&e.shadowsOffset.lerp(r.settings.shadowsOffset,o),void 0!==r.settings.shadowsMax&&(e.shadowsMax=i.MathUtils.lerp(e.shadowsMax,r.settings.shadowsMax,o)),void 0!==r.settings.midtonesSaturation&&e.midtonesSaturation.lerp(r.settings.midtonesSaturation,o),void 0!==r.settings.midtonesContrast&&e.midtonesContrast.lerp(r.settings.midtonesContrast,o),void 0!==r.settings.midtonesGamma&&e.midtonesGamma.lerp(r.settings.midtonesGamma,o),void 0!==r.settings.midtonesGain&&e.midtonesGain.lerp(r.settings.midtonesGain,o),void 0!==r.settings.midtonesOffset&&e.midtonesOffset.lerp(r.settings.midtonesOffset,o),void 0!==r.settings.highlightsSaturation&&e.highlightsSaturation.lerp(r.settings.highlightsSaturation,o),void 0!==r.settings.highlightsContrast&&e.highlightsContrast.lerp(r.settings.highlightsContrast,o),void 0!==r.settings.highlightsGamma&&e.highlightsGamma.lerp(r.settings.highlightsGamma,o),void 0!==r.settings.highlightsGain&&e.highlightsGain.lerp(r.settings.highlightsGain,o),void 0!==r.settings.highlightsOffset&&e.highlightsOffset.lerp(r.settings.highlightsOffset,o),void 0!==r.settings.highlightsMin&&(e.highlightsMin=i.MathUtils.lerp(e.highlightsMin,r.settings.highlightsMin,o)),void 0!==r.settings.lut&&(t=r.settings.lut),void 0!==r.settings.lutIntensity&&(e.lutIntensity=i.MathUtils.lerp(e.lutIntensity,r.settings.lutIntensity,o))))}if(0===n.length)return this.experimentalWebGpuBackend?.setPostProcessState(null),"webgpu-experimental"===this._activeBackend?this.experimentalWebGpuBackend?.setWorldEnvironment(this.worldEnvironment):this.applyWorldEnvironmentToWebGl(),this.lutPass.enabled=!1,this.colorPass.enabled=!1,this.dofPass.enabled=!1,this.renderer.toneMapping=this.baseToneMapping,void(this.renderer.toneMappingExposure=this.baseToneMappingExposure);if("webgpu-experimental"===this._activeBackend){const t=vt(St,e.temperature,e.temperatureTint),i=e=>[e.x,e.y,e.z],a=n.some(e=>{return void 0!==(t=e.settings).tonemapMapping||void 0!==t.tonemapExposure||void 0!==t.vignetteIntensity||void 0!==t.colorTintIntensity||void 0!==t.temperature||void 0!==t.temperatureTint||void 0!==t.globalSaturation||void 0!==t.globalContrast||void 0!==t.globalGamma||void 0!==t.globalGain||void 0!==t.globalOffset||void 0!==t.shadowsSaturation||void 0!==t.shadowsContrast||void 0!==t.shadowsGamma||void 0!==t.shadowsGain||void 0!==t.shadowsOffset||void 0!==t.shadowsMax||void 0!==t.midtonesSaturation||void 0!==t.midtonesContrast||void 0!==t.midtonesGamma||void 0!==t.midtonesGain||void 0!==t.midtonesOffset||void 0!==t.highlightsSaturation||void 0!==t.highlightsContrast||void 0!==t.highlightsGamma||void 0!==t.highlightsGain||void 0!==t.highlightsOffset||void 0!==t.highlightsMin;var t}),r=n.some(e=>void 0!==e.settings.tonemapMapping||void 0!==e.settings.tonemapExposure);return this.experimentalWebGpuBackend?.setPostProcessState({enabled:a,exposure:r?e.tonemapExposure:1,toneMapping:r?Mt(e.tonemapMapping):"none",vignetteIntensity:e.vignetteIntensity,whiteBalance:i(t),tint:[e.colorTint.r,e.colorTint.g,e.colorTint.b],tintIntensity:e.colorTintIntensity,saturation:i(e.globalSaturation),contrast:i(e.globalContrast),gamma:i(e.globalGamma),gain:i(e.globalGain),offset:i(e.globalOffset),shadows:{saturation:i(e.shadowsSaturation),contrast:i(e.shadowsContrast),gamma:i(e.shadowsGamma),gain:i(e.shadowsGain),offset:i(e.shadowsOffset)},midtones:{saturation:i(e.midtonesSaturation),contrast:i(e.midtonesContrast),gamma:i(e.midtonesGamma),gain:i(e.midtonesGain),offset:i(e.midtonesOffset)},highlights:{saturation:i(e.highlightsSaturation),contrast:i(e.highlightsContrast),gamma:i(e.highlightsGamma),gain:i(e.highlightsGain),offset:i(e.highlightsOffset)},shadowsMax:e.shadowsMax,highlightsMin:e.highlightsMin,depthFocus:s?e.depthFocus:void 0,depthAperture:s?e.depthAperture:void 0,depthMaxBlur:s?e.depthMaxBlur:void 0}),void this.experimentalWebGpuBackend?.setWorldEnvironment(null!=e.envTexture?{source:e.envTexture,intensity:e.envIntensity}:this.worldEnvironment)}const r=e.vignetteIntensity>wt,o=(h=e.temperature,c=e.temperatureTint,!xt(h,6500)||!xt(c,0));var h,c;const p=(u=e.colorTint,e.colorTintIntensity>wt&&(!xt(u.r,1)||!xt(u.g,1)||!xt(u.b,1)));var u;const d=!(bt((m=e).globalSaturation,1,1,1)&&bt(m.globalContrast,1,1,1)&&bt(m.globalGamma,1,1,1)&&bt(m.globalGain,1,1,1)&&bt(m.globalOffset,0,0,0)&&bt(m.shadowsSaturation,1,1,1)&&bt(m.shadowsContrast,1,1,1)&&bt(m.shadowsGamma,1,1,1)&&bt(m.shadowsGain,1,1,1)&&bt(m.shadowsOffset,0,0,0)&&bt(m.midtonesSaturation,1,1,1)&&bt(m.midtonesContrast,1,1,1)&&bt(m.midtonesGamma,1,1,1)&&bt(m.midtonesGain,1,1,1)&&bt(m.midtonesOffset,0,0,0)&&bt(m.highlightsSaturation,1,1,1)&&bt(m.highlightsContrast,1,1,1)&&bt(m.highlightsGamma,1,1,1)&&bt(m.highlightsGain,1,1,1)&&bt(m.highlightsOffset,0,0,0));var m;const f=o||p||d||r,g=f&&e.tonemapMapping!==i.NoToneMapping,M=null!=t&&e.lutIntensity>wt;f?(this.renderer.toneMapping=i.NoToneMapping,this.renderer.toneMappingExposure=1):(this.renderer.toneMapping=e.tonemapMapping,this.renderer.toneMappingExposure=e.tonemapExposure),null!=e.envTexture&&(this.scene.environment=this.getEnvTexture(e.envTexture)),this.scene.environmentIntensity=e.envIntensity,f?(this.colorPass.whiteBalanceEnabled=o,this.colorPass.whiteBalanceScale=o?vt(St,e.temperature,e.temperatureTint):St.set(1,1,1),this.colorPass.vignetteIntensity=e.vignetteIntensity,this.colorPass.vignetteEnabled=r,this.colorPass.colorTintEnabled=p,this.colorPass.colorTint=e.colorTint,this.colorPass.colorTintIntensity=e.colorTintIntensity,this.colorPass.colorGradingEnabled=d,this.colorPass.toneMapping=e.tonemapMapping,this.colorPass.toneMappingEnabled=g,this.colorPass.toneMappingExposure=e.tonemapExposure,this.colorPass.globalSaturation=e.globalSaturation,this.colorPass.globalContrast=e.globalContrast,this.colorPass.globalGamma=e.globalGamma,this.colorPass.globalGain=e.globalGain,this.colorPass.globalOffset=e.globalOffset,this.colorPass.shadowsSaturation=e.shadowsSaturation,this.colorPass.shadowsContrast=e.shadowsContrast,this.colorPass.shadowsGamma=e.shadowsGamma,this.colorPass.shadowsGain=e.shadowsGain,this.colorPass.shadowsOffset=e.shadowsOffset,this.colorPass.shadowsMax=e.shadowsMax,this.colorPass.midtonesSaturation=e.midtonesSaturation,this.colorPass.midtonesContrast=e.midtonesContrast,this.colorPass.midtonesGamma=e.midtonesGamma,this.colorPass.midtonesGain=e.midtonesGain,this.colorPass.midtonesOffset=e.midtonesOffset,this.colorPass.highlightsSaturation=e.highlightsSaturation,this.colorPass.highlightsContrast=e.highlightsContrast,this.colorPass.highlightsGamma=e.highlightsGamma,this.colorPass.highlightsGain=e.highlightsGain,this.colorPass.highlightsOffset=e.highlightsOffset,this.colorPass.highlightsMin=e.highlightsMin,this.colorPass.enabled=!0):this.colorPass.enabled=!1,s&&this.camera instanceof l?(this.dofPass.enabled=!0,void 0!==e.depthFocus&&(this.dofPass.uniforms.focus.value=e.depthFocus),void 0!==e.depthAperture&&(this.dofPass.uniforms.aperture.value=e.depthAperture),void 0!==e.depthMaxBlur&&(this.dofPass.uniforms.maxblur.value=e.depthMaxBlur)):this.dofPass.enabled=!1,this.lutPass.enabled=M,M&&(null!=t&&(t.flipY=!0,t.generateMipmaps=!1),this.lutPass.lut=t,this.lutPass.intensity=e.lutIntensity)}updatePostProcessEffectUniforms(e){if(0===this.postProcessEffects.length)return;const t=this.postProcessEffectUniformState;t.aoEnabled=this.aoPass.enabled,t.aoTexture=this.aoPass.enabled?this.aoPass.pdRenderTarget.texture:null,this.camera instanceof l?(t.cameraNear=this.camera.near,t.cameraFar=this.camera.far):(t.cameraNear=void 0,t.cameraFar=void 0),t.depthTexture=this.sceneDepthRenderTarget.texture,t.normalTexture=this.gRenderTarget.textures[2],t.resolution.set(this.gRenderTarget.width,this.gRenderTarget.height),t.simulationTime=e;for(const e of this.postProcessEffects)e.pass.updateUniformState(t)}renderOverlay(){if(!this.running)return;if(0===this.overlayCameras.size)return;const e=Array.from(this.overlayCameras.values()).slice(0,this.maxInsetCameras),t=this.previousClientWith/2,s=e.length*this.insetWidth+(e.length-1)*this.insetMargin;for(let i=0;i<e.length;i++)this.renderer.clearDepth(),this.renderer.setViewport(t-s/2+this.insetWidth*i+this.insetMargin*i,this.insetOffsetY,this.insetWidth,this.insetHeight),this.renderer.render(this.scene,e[i])}addOverlayCamera(e){this.overlayCameras.add(e)}clearOverlayCameras(){this.overlayCameras.clear()}removeOverlayCamera(e){this.overlayCameras.delete(e)}render(e){if("webgpu-experimental"===this._activeBackend){const e=this.experimentalWebGpuBackend;return void(null!=e&&ze.supportsCamera(this.camera)&&(this.syncExperimentalWebGpuCascades(),e.render(this.scene,this.camera,this.simulationTime)))}if(0===this.composer.renderTarget1.width||0===this.composer.renderTarget1.height)return;if(0===this.composer.renderTarget2.width||0===this.composer.renderTarget2.height)return;let t=!1;if(this.ssrPass.enabled&&!1!==this.options?.reflection?.enabled){const e=this.ssrPass.selects??[];e.length=0,this.scene.traverseVisible(t=>{t instanceof o&&!0===t.material.userData?.reflective&&isObjectInFrustum(t,dt)&&e.push(t)}),this.ssrPass.selects=e,0==e.length&&(this.ssrPass.enabled=!1),t=!0}this.options.bloom,this.composer.render(e),this.scene.matrixWorldAutoUpdate=!0,this.scene.matrixAutoUpdate=!0,t&&(this.ssrPass.enabled=!0)}hasBloom(){return null!=Me(this.scene,e=>e instanceof o&&!0===e.material?.userData?.hasBloom)}darkenNonBloomed(e){if((e instanceof o||e instanceof i.Sprite||e instanceof i.Line)&&e.visible&&(null==e.material.userData||!0!==e.material.userData.hasBloom)){if(e.material?.id===Xe.id)return;this.bloomStoredMaterials[e.uuid]=e.material,!0!==e.material.transparent?e.material=Xe:(e.visible=!1,this.bloomHidden.push(e))}else"TransformControlsPlane"!==e.type&&"TransformControlsGizmo"!==e.type||(e.visible=!1,this.bloomHidden.push(e))}restoreMaterial(e){this.bloomStoredMaterials[e.uuid]&&(e.material=this.bloomStoredMaterials[e.uuid],delete this.bloomStoredMaterials[e.uuid],e.visible=!0)}initSceneColorUniform(e){if(e instanceof c)return null==e.uniforms[de]?(e.uniforms[de]={value:this.sceneColorRenderTarget.texture},void(e.uniformsNeedUpdate=!0)):void(e.uniforms[de].value!==this.sceneColorRenderTarget.texture&&(e.uniforms[de].value=this.sceneColorRenderTarget.texture,e.uniformsNeedUpdate=!0))}initDepthUniform(e){e instanceof c&&(e.uniforms[ae].value=this.sceneDepthRenderTarget.texture,this.camera instanceof l&&(null!=e.uniforms[re]&&(e.uniforms[re].value=this.camera.near),null!=e.uniforms[ne]&&(e.uniforms[ne].value=this.camera.far)))}initNormalUniform(e){e instanceof c&&null!=e.uniforms[le]&&(e.uniforms[le].value=this.gRenderTarget.textures[2])}initShadowUniform(e,t){t instanceof C&&(t.uniforms.receiveShadow?t.uniforms.receiveShadow.value=e.receiveShadow:t.uniforms.receiveShadow={value:e.receiveShadow})}initLightVolumeUniform(e){e instanceof C&&(null!=this.lightVolume?null==e.uniforms.uSH?(e.defines.USE_LIGHT_PROBE_VOLUME="",e.uniforms.gridOrigin={value:this.lightVolume.gridOrigin},e.uniforms.gridSize={value:this.lightVolume.gridSize},e.uniforms.gridRes={value:this.lightVolume.gridResolution},e.uniforms.giIntensity={value:this.lightProbeIntensity},e.uniforms.uSH={value:this.lightVolume.shTexture},e.uniformsNeedUpdate=!0,e.needsUpdate=!0):e.uniforms.giIntensity.value=this.lightProbeIntensity:null!=e.uniforms.uSH&&(delete e.defines.USE_LIGHT_PROBE_VOLUME,delete e.uniforms.gridOrigin,delete e.uniforms.gridSize,delete e.uniforms.gridRes,delete e.uniforms.giIntensity,delete e.uniforms.uSH,e.uniformsNeedUpdate=!0,e.needsUpdate=!0))}initResolutionUniform(e){e instanceof c&&null!=e.uniforms[oe]&&e.uniforms[oe].value.set(this.gRenderTarget.width,this.gRenderTarget.height)}initAoUniform(e){if(this.aoPass.enabled){e.uniforms[ue].value=this.aoPass.pdRenderTarget.texture,null==e.defines.USE_SSAO_MAP&&(e.defines.USE_SSAO_MAP="",e.needsUpdate=!0),e.defines.USE_SSAO_MAP="";const t=this.tbufferMaterialCache.get(e);null!=t&&this.initAoUniform(t)}else if(null!=e.defines.USE_SSAO_MAP){delete e.defines.USE_SSAO_MAP,e.needsUpdate=!0;const t=this.tbufferMaterialCache.get(e);null!=t&&this.initAoUniform(t)}}initCustomDepthMaterial(e){if(null!=e.customDepthMaterial||!e.castShadow)return;const t=e.material;if(!(t instanceof C&&t.depthWrite&&t.alphaTest>0))return;let s=this._customDepthMaterialCache.get(t);if(null==s){const e=Ae(Ue);let i;null!=t.alphaTest&&t.alphaTest>0&&null!=t.outputOpacity&&(i=t.outputOpacity.lt(t.alphaTest)),s=new C({color:e,discard:i}),this._customDepthMaterialCache.set(t,s)}e.customDepthMaterial=s}};lt.activeView=null,lt=e=t([ie(),s("design:paramtypes",[HTMLElement,Object])],lt);export{lt as RenderingView};export function setRenderingPaused(e){null!=window.editor?.viewer?.renderingView&&(window.editor.viewer.renderingView.paused=e)}const ht=.05;function ct(e){let t=e;for(;t;){if(!1===t.visible)return!1;t=t.parent}return!0}function pt(e,t){return e.priority!==t.priority?e.priority-t.priority:e.id-t.id}function ut(e,t){if(Array.isArray(e.material))for(const s of e.material)t(s);else null!=e.material&&t(e.material)}se.prototype.overrideVisibility=function(){const e=this.scene,t=this._visibilityCache;e.traverse(function(e){if(t.set(e,e.visible),(e.isPoints||e.isLine||e.isTransformControls||e.isSprite)&&(e.visible=!1),null!=e.material){let t=!1,s=!1;if(Array.isArray(e.material)){for(const s of e.material)if(null!=s.alphaTest&&s.alphaTest>0){t=!0;break}}else null!=e.material.alphaTest&&e.material.alphaTest>0?t=!0:!0===e.material.userData.isDecal&&(s=!0);s&&(e.visible=!1)}})};new i.Box3;const dt=new i.Frustum,mt=new i.Box3,ft=new i.Matrix4;export function isObjectInFrustum(e,t){const s=mt.setFromObject(e);return t.intersectsBox(s)}function gt(e,t,s,a){return null==e?new i.Vector3(t,s,a):e.set(t,s,a)}function Mt(e){switch(e){case i.LinearToneMapping:return"linear";case i.ReinhardToneMapping:return"reinhard";case i.CineonToneMapping:return"cineon";case i.ACESFilmicToneMapping:return"aces";case i.AgXToneMapping:return"agx";case i.NeutralToneMapping:return"neutral";default:return"none"}}function bt(e,t,s,i){return null!=e&&xt(e.x,t)&&xt(e.y,s)&&xt(e.z,i)}function vt(e,t,s){const i=function(e){const t=ve(e,1e3,4e4)/100,s=t<=66?1:ve(1.292936186062745*Math.pow(t-60,-.1332047592),0,1),i=ve(t<=66?.3900815787690196*Math.log(t)-.6318414437886275:1.129890860895294*Math.pow(t-60,-.0755148492),0,1),a=t>=66?1:t<=19?0:ve(.5432067891101962*Math.log(t-10)-1.19625408914,0,1);return Tt.set(s,i,a)}(t),a=1+.2*ve(s,-1,1),n=i.x,r=i.y*a,o=i.z,l=Math.max(r,1e-4);return e.set(1/Math.max(n/l,1e-4),1/Math.max(r/l,1e-4),1/Math.max(o/l,1e-4)),e}function xt(e,t,s=wt){return Math.abs(e-t)<=s}function Pt(e,t){return null!=e&&Number.isFinite(e)&&e>0?e:t}const wt=1e-4,yt=new i.Vector3,St=new i.Vector3(1,1,1),Tt=new i.Vector3(1,1,1);const Rt=new r,Ct=new d;function Gt(e,t,s=new i.Matrix3){return Ct.copy(e),Ct.x*=-1,Ct.y*=-1,Ct.z*=-1,t.isCubeTexture&&!1===t.isRenderTargetTexture&&(Ct.y*=-1,Ct.z*=-1),s.setFromMatrix4(Rt.makeRotationFromEuler(Ct))}const Et=new C({outputs:[L(0,0,0,0),L(0,0,0,0),W(D("white"),Ie(4))],transparent:!0}),Bt=new i.MeshBasicMaterial({color:"blue",transparent:!0,opacity:.5});Et.depthWrite=!1;new o(new i.BoxGeometry(4,4,4),Bt);function Ut(e){return e instanceof i.Sprite||e.isPoints||e.isTransformControls||e.isTransformControlsGizmo||e instanceof o&&At(e,e.material)}function At(e,t){return null==t||(Array.isArray(t)?t.some(t=>At(e,t)):t instanceof i.RawShaderMaterial||t instanceof i.ShaderMaterial&&!(t instanceof C))}class Ot extends ke{constructor(e,t,s){super(),this.scene=e,this.camera=t,this.gRenderTarget=s,this.cachedVisibility=[],this.toRender=[],this.needsSwap=!1}render(e,t,s,i,a){const n=e.autoClear;e.autoClear=!1;const r=this.scene.matrixWorldAutoUpdate,l=this.scene.matrixAutoUpdate,h=e.shadowMap.autoUpdate;this.scene.matrixAutoUpdate=!1,e.shadowMap.autoUpdate=!1;const c=s.depthTexture;s.depthTexture=this.gRenderTarget.depthTexture,e.setRenderTarget(s),this.cachedVisibility.length=0;let p=0,u=this.toRender;if(u.length=0,this.scene.traverseVisible(e=>{const t=Ut(e);e instanceof o&&!t?(this.cachedVisibility.push(e),e.visible=!1):t&&(p++,u.push(e))}),p>0)for(const t of u)e.render(t,this.camera);this.cachedVisibility.forEach((e,t)=>{e.visible=!0}),e.setRenderTarget(null),e.autoClear=n,s.depthTexture=c,this.scene.matrixWorldAutoUpdate=r,this.scene.matrixAutoUpdate=l,e.shadowMap.autoUpdate=h}}class Dt extends ke{constructor(e){super(),this.fn=e}render(e,t,s,i,a){this.fn(e,t,s,i,a)}}const Wt=["ambientLightColor","cameraNear","directionalLightShadows","directionalLights","directionalShadowMap","directionalShadowMatrix","fogColor","fogDensity","fogFar","fogNear","hemisphereLights","lightProbe","ltc_1","ltc_2","pointLightShadows","pointLights","pointShadowMap","pointShadowMatrix","rectAreaLights","shadowFar","spotLightMap","spotLightMatrix","spotLightShadows","spotLights","spotShadowMap"],Ft=["directionalShadowMap","directionalShadowMatrix","pointLightShadows","pointShadowMap","pointShadowMatrix","spotLightShadows","spotShadowMap"],It=B("fogColor");export class FogNode extends q{constructor(e,t=It){super(),this.source=e,this.fogColor=t}compile(e){const t=e.variable(),s=e.get(this.source.rgb),i=e.get(this.source.a),a=e.get(this.fogColor),n=e.get(E("fogFar")),r=e.get(E("fogNear")),o=e.get(E("fogDensity")),l=e.get(I(F.mvPosition.z));return{pars:"\n ",chunk:`\n #ifdef FOG_EXP2\n float fogFactor_${t} = 1.0 - exp( - ${o} * ${o} * ${l} * ${l} );\n #else\n float fogFactor_${t} = smoothstep( ${r}, ${n}, ${l} );\n #endif\n vec4 color_vec4_${t} = vec4(mix(${s}, ${a}, fogFactor_${t}), ${i});\n `,out:`color_vec4_${t}`}}}const jt=new i.MeshDepthMaterial({depthPacking:i.RGBADepthPacking});/*
1
+ var e;import{__decorate as t,__metadata as s}from"tslib";import*as i from"three";import{Color as a,Material as n,Matrix4 as r,Mesh as o,PerspectiveCamera as l,ShaderChunk as h,ShaderMaterial as p,WebGLRenderTarget as c,Texture as u,Euler as d,MeshStandardMaterial as m}from"three";import{CopyShader as f,EffectComposer as g,FXAAShader as M,GammaCorrectionShader as b,LUTPass as v,RenderPass as x,ShaderPass as w,VRButton as P}from"three-stdlib";import{CSMShader as y,CSMUtil as S}from"./csm.js";import{colorToNormal as T,float as R,NodeShaderMaterial as G,standardMaterial as C,uniformFloat as E,uniformVec3 as B,toonMaterial as U,lambertMaterial as W,normalize as A,rgb as O,rgba as D,transformed as F,varying as k,varyingAttributes as I,varyingTransformed as j,vec4 as V,BooleanExpression as L,select as _,ifDefApply as N,uniformSampler2d as H,RgbaNode as q,mix as $,attributes as z,uniformVec2 as J,min as Q}from"three-shader-graph";import{Reflector as X}from"three-stdlib";import{BokehPass as Y,OutputPass as K}from"three/examples/jsm/Addons.js";import{CSM as Z}from"three/examples/jsm/csm/CSM.js";import{RectAreaLightUniformsLib as ee}from"three/examples/jsm/lights/RectAreaLightUniformsLib.js";import te from"three/examples/jsm/libs/stats.module.js";import{GTAOPass as se}from"three/examples/jsm/postprocessing/GTAOPass.js";import{Service as ie}from"typedi";import{depthUniformName as ae,farUniformName as ne,nearUniformName as re,resolutionUniformName as oe,sceneNormalUniformName as le,screenUV as he,supportsDepthTextureExtension as pe}from"./shader-nodes/depth.js";import{elapsedTimeUniformName as ce}from"./shader-nodes/time.js";import{aoMapUniformName as ue,sceneMapUniformName as de}from"./shader-nodes/scene-sample.js";import{DepthPass as me}from"./utils/three/depth-pass.js";import{GPUStatsPanel as fe}from"./utils/three/gpu-stats-panel.js";import{OutlinePass as ge}from"./utils/three/outline-pass.js";import{findFirstVisibleObject as Me,traverseVisibleStop as be}from"./utils/three/traverse.js";import{clamp as ve}from"./utils/math.js";import{ColorPass as xe}from"./rendering/color-pass.js";import{PostProcessEffectPass as we,PostProcessEffectRegistration as Pe,postProcessEffectStages as ye,sanitizePostProcessEffectPriority as Se,sanitizePostProcessEffectStage as Te}from"./rendering/post-process-effect.js";import{SSRPass as Re}from"./rendering/ssr/SSRPass.js";import{SSRShader as Ge}from"./rendering/ssr/SSRShader.js";import{VolumetricFogPass as Ce}from"./rendering/fog/volumetric-fog-pass.js";import{OutlineEffect as Ee}from"./rendering/outline-effect.js";import{UnrealBloomPass as Be}from"./rendering/bloom/UnrealBloomPass.js";import{highPrecisionEyeDepth as Ue}from"./shader-nodes/depth.js";import{packDepthToRGBA as We}from"three-shader-graph";import{FogVolumeObject as Ae}from"./rendering/fog/fog-volume-object";import{ParallaxStandardMaterial as Oe}from"./shader/builtin/standard-shader.js";import{parallaxOcclusionMapping as De}from"./shader-nodes/pom.js";import{FullScreenQuad as Fe}from"three-stdlib";import{edgeDepthEffect as ke}from"./shader-nodes/effects";import{decalDiscard as Ie}from"./shader-nodes/decal.js";import{Pass as je}from"three/examples/jsm/Addons.js";import{BatchedMesh2 as Ve}from"./scene/batched-mesh-2.js";import{resolvePostProcessMaterial as Le}from"./shader/post-process-shader.js";import{applyUvTiling as _e}from"./shader/uv-nodes.js";import{createPlaceholderTexture as Ne}from"./utils/three/placeholder-texture.js";import{getTemporalUpscalingJitter as He,getUpscalingMethod as qe,UpscaleOutputPass as $e}from"./rendering/upscaling-pass.js";import{ExperimentalWebGpuBackend as ze,formatWebGpuSceneCapabilitySummary as Je}from"./rendering/webgpu-experimental-backend.js";S.patchSetupMaterial();const Qe=document.createElement("div");Qe.style.position="absolute",Qe.style.left="50%",Qe.style.top="50%",Qe.style.color="black",Qe.style.zIndex="999";(new i.Layers).set(9);const Xe=new i.MeshBasicMaterial({color:"black"}),Ye=new i.MeshDepthMaterial;var Ke;Ye.depthPacking=i.RGBADepthPacking,Ye.blending=i.NoBlending,Ye.side=i.DoubleSide,function(e){e[e.opaque=0]="opaque",e[e.transparent=1]="transparent"}(Ke||(Ke={}));const Ze=(()=>{const e=new Uint8Array([255,255,255,255]),t=new i.DataTexture(e,1,1,i.RGBAFormat);return t.needsUpdate=!0,t})(),et=(()=>{const e=new Uint8Array([0,0,0,255]),t=new i.DataTexture(e,1,1,i.RGBAFormat);return t.needsUpdate=!0,t})(),tt=(()=>{const e=new Uint8Array([128,128,255,255]),t=new i.DataTexture(e,1,1,i.RGBAFormat);return t.needsUpdate=!0,t})(),st=new G({color:R(0),position:V(R(0))});st.visible=!1;const it=/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);let at=0,nt=null;const rt=new Map;function ot(){return null==nt&&(nt=new IntersectionObserver(e=>{for(const t of e){const e=rt.get(t.target);e&&e(t.isIntersecting)}},{threshold:0})),nt}let lt=e=class{get activeBackend(){return this._activeBackend}registerExperimentalStaticDrawSet(e,t){if("webgpu-experimental"!==this.options.backend)return()=>{};const s={root:e,label:t,sourceWasVisible:e.visible,staticDrawSet:null};return this.experimentalStaticDrawSetRegistrations.add(s),this.activateExperimentalStaticDrawSets(),()=>{this.experimentalStaticDrawSetRegistrations.delete(s)&&(s.staticDrawSet?.dispose(),null!=s.staticDrawSet&&(s.root.visible=s.sourceWasVisible),s.staticDrawSet=null)}}get fpsCap(){return this._fpsCap}set fpsCap(e){const t=null!=e&&Number.isFinite(e)&&e>0?e:null;t!==this._fpsCap&&(this._fpsCap=t,this.fpsCapRevision++)}setPaused(e){this.paused=e}setResolutionScale(e){const t=wt(e,1);xt(t,this.resolutionScale)||(this.resolutionScale=t,this.dynamicResolutionScale=t,this.dynamicResolutionLastAdjustmentAt=0,this.resetDynamicResolutionAverage(),this.resizeRender(!0))}get currentResolutionScale(){return this.getEffectiveResolutionScale()}get currentRenderPixelRatio(){return this.getRenderPixelRatio()}get currentPresentationPixelRatio(){return this.getPresentationPixelRatio()}getRenderSize(e=new i.Vector2){return e.set(Math.max(1,this.container.clientWidth*this.getRenderPixelRatio()),Math.max(1,this.container.clientHeight*this.getRenderPixelRatio()))}isUpscalingEnabled(){return!0===this.options.upscaling?.enabled&&!0!==this.options.enableXR}isTemporalUpscalingEnabled(){return this.isUpscalingEnabled()&&"temporal"===qe(this.options.upscaling)}resetUpscalingHistory(){this.hasPreviousTemporalViewProjection=!1,this.upscaleOutputPass?.resetHistory(),this.experimentalWebGpuBackend?.resetTemporalHistory()}prepareUpscalingFrame(){if(!this.isTemporalUpscalingEnabled()||null==this.upscaleOutputPass)return void this.upscaleOutputPass?.setFrameState(null);this.unjitteredProjectionMatrix.copy(this.camera.projectionMatrix),this.currentUnjitteredViewProjectionMatrix.multiplyMatrices(this.unjitteredProjectionMatrix,this.camera.matrixWorldInverse),this.hasPreviousTemporalViewProjection||(this.previousViewProjectionMatrix.copy(this.currentUnjitteredViewProjectionMatrix),this.upscaleOutputPass.resetHistory());const e=wt(this.options.upscaling?.temporal?.jitterScale,1);He(this.temporalUpscalingFrameIndex++,this.temporalJitter,e),this.temporalJitterUv.set(this.temporalJitter.x/Math.max(1,this.gRenderTarget.width),this.temporalJitter.y/Math.max(1,this.gRenderTarget.height));const t=2*this.temporalJitter.x/Math.max(1,this.gRenderTarget.width),s=2*this.temporalJitter.y/Math.max(1,this.gRenderTarget.height);this.camera instanceof l?(this.camera.projectionMatrix.elements[8]+=t,this.camera.projectionMatrix.elements[9]+=s):(this.camera.projectionMatrix.elements[12]+=t,this.camera.projectionMatrix.elements[13]+=s),this.camera.projectionMatrixInverse.copy(this.camera.projectionMatrix).invert(),this.projectionJitterApplied=!0,this.currentViewProjectionMatrix.multiplyMatrices(this.camera.projectionMatrix,this.camera.matrixWorldInverse),this.currentViewProjectionMatrixInverse.copy(this.currentViewProjectionMatrix).invert(),this.temporalUpscalingFrameState.depthTexture=this.gRenderTarget.depthTexture,this.upscaleOutputPass.setFrameState(this.temporalUpscalingFrameState)}finishUpscalingFrame(){this.projectionJitterApplied&&(this.camera.projectionMatrix.copy(this.unjitteredProjectionMatrix),this.camera.projectionMatrixInverse.copy(this.camera.projectionMatrix).invert(),this.previousViewProjectionMatrix.copy(this.currentUnjitteredViewProjectionMatrix),this.hasPreviousTemporalViewProjection=!0,this.projectionJitterApplied=!1)}getBasePixelRatio(){const e=wt(this.maxPixelRatio,1),t=wt(window.devicePixelRatio,1);return Math.min(e,t)}getBaseResolutionScale(){return wt(this.resolutionScale,1)}getDynamicResolutionMinScale(){const e=this.getBaseResolutionScale(),t=wt(this.options.dynamicResolution?.minScale,.7);return Math.min(e,t)}getEffectiveResolutionScale(){const e=this.getBaseResolutionScale();return!0!==this.options.dynamicResolution?.enabled?e:ve(this.dynamicResolutionScale,this.getDynamicResolutionMinScale(),e)}getRenderPixelRatio(){return this.getBasePixelRatio()*this.getEffectiveResolutionScale()}getPresentationPixelRatio(){const e=this.getBasePixelRatio();return this.isUpscalingEnabled()?e:e*this.getEffectiveResolutionScale()}resetDynamicResolutionAverage(){this.dynamicResolutionFrameTimeAverage=null,this.dynamicResolutionFrameSamples=0}updateDynamicResolution(e,t){const s=this.options.dynamicResolution;if(!0!==s?.enabled)return;if(!Number.isFinite(e)||e<=0||e>.25)return void this.resetDynamicResolutionAverage();const i=this.getBaseResolutionScale(),a=this.getDynamicResolutionMinScale(),n=ve(this.dynamicResolutionScale,a,i);xt(n,this.dynamicResolutionScale)||(this.dynamicResolutionScale=n);const r=wt(s.targetFps,60),o=1e3/(null!=this.fpsCap?Math.min(r,this.fpsCap):r),l=1e3*e;this.dynamicResolutionFrameTimeAverage=null==this.dynamicResolutionFrameTimeAverage?l:.9*this.dynamicResolutionFrameTimeAverage+.1*l,this.dynamicResolutionFrameSamples++;const h=Math.max(1,Math.floor(wt(s.sampleFrames,20)));if(this.dynamicResolutionFrameSamples<h)return;const p=wt(s.decreaseCooldown,500),c=wt(s.increaseCooldown,2e3),u=wt(s.decreaseStep,.05),d=wt(s.increaseStep,.025),m=this.dynamicResolutionFrameTimeAverage;let f=n;m>1.12*o&&n>a&&t-this.dynamicResolutionLastAdjustmentAt>=p?f=Math.max(a,n-u):m<.85*o&&n<i&&t-this.dynamicResolutionLastAdjustmentAt>=c&&(f=Math.min(i,n+d)),xt(f,n)||(this.dynamicResolutionScale=f,this.dynamicResolutionLastAdjustmentAt=t,this.resetDynamicResolutionAverage(),this.resizeRender(!0))}resizeRender(e=!1){if(!this.running)return;const t=this.container.clientWidth,s=this.container.clientHeight,i=this.getRenderPixelRatio(),a=this.getPresentationPixelRatio();if(!e&&this.previousClientWith===t&&this.previousClientHeight===s&&this.previousRenderPixelRatio===i&&this.previousPresentationPixelRatio===a)return;if(0===t||0===s)return;this.previousClientWith=t,this.previousClientHeight=s,this.previousRenderPixelRatio=i,this.previousPresentationPixelRatio=a,this.camera instanceof l&&(this.camera.aspect=t/s,this.camera.updateProjectionMatrix()),this.renderer.setPixelRatio(a),this.renderer.setSize(t,s),this.composer.setPixelRatio(i),this.composer.setSize(t,s);const n=t*i,r=s*i;this.dofPass.setSize(n,r),this.fxaaPass.setSize(n,r),this.fxaaPass.uniforms.resolution.value.set(1/n,1/r),this.createGRenderTarget(),this.phasedRenderPass.gRenderTarget=this.gRenderTarget,this.bloomPass.emissiveTexture=this.gRenderTarget.textures[1],this.ssrPass.setSize(this.gRenderTarget.width,this.gRenderTarget.height),this.ssrPass.setGBuffer(this.gRenderTarget.depthTexture,this.gRenderTarget.textures[2]),this.aoPass.setSize(this.gRenderTarget.width,this.gRenderTarget.height),this.aoPass.setGBuffer(this.gRenderTarget.depthTexture,this.gRenderTarget.textures[2]),this.fquadBlendAO.material.uniforms.tAlphaTest.value=this.gRenderTarget.textures[1],this.sceneColorRenderTarget.dispose(),this.sceneDepthRenderTarget.dispose(),this.sceneColorRenderTarget=this.createSceneColorRenderTarget(),this.sceneDepthRenderTarget=this.createSceneDepthRenderTarget(),this.copyPass.material.uniforms.tDiffuse.value=this.gRenderTarget.textures[0],this.copyPass.material.uniformsNeedUpdate=!0,this.experimentalWebGpuBackend?.setSize(t,s,i),this.resetDynamicResolutionAverage(),this.resetUpscalingHistory()}addPostProcessVolume(e){if(0===this.postProcessVolumes.length)this.postProcessVolumes.push(e);else{let t=!1;for(let s=0;s<this.postProcessVolumes.length;s++)if(e.priority<this.postProcessVolumes[s].priority){this.postProcessVolumes.splice(s,0,e),t=!0;break}t||this.postProcessVolumes.push(e)}}removePostProcessVolume(e){const t=this.postProcessVolumes.indexOf(e);t>-1&&this.postProcessVolumes.splice(t,1)}addPostProcessEffect(e,t={}){const s=Le(e),i={id:++this.postProcessEffectId,material:s,pass:new we(s),enabled:t.enabled??!0,priority:Se(t.priority),stage:Te(t.stage)};return i.pass.enabled=i.enabled,this.postProcessEffects.push(i),this.refreshPostProcessEffectPassOrder(),new Pe(this,i)}removePostProcessEffectEntry(e){const t=e,s=this.postProcessEffects.indexOf(t);-1!==s&&(this.postProcessEffects.splice(s,1),this.composer.removePass(t.pass),t.pass.dispose(),this.syncExperimentalWebGpuPostProcessEffects())}refreshPostProcessEffectPassOrder(){for(const e of this.postProcessEffects)this.composer.removePass(e.pass);for(const e of ye){const t=this.getPostProcessEffectStageAnchorPass(e),s=null!=t?this.composer.passes.indexOf(t):this.composer.passes.length,i=this.postProcessEffects.filter(t=>t.stage===e).sort(ct);for(let e=0;e<i.length;e++)this.composer.insertPass(i[e].pass,s+e)}this.syncExperimentalWebGpuPostProcessEffects()}syncExperimentalWebGpuPostProcessEffects(){this.experimentalWebGpuBackend?.setPostProcessEffects(this.postProcessEffects)}getPostProcessEffectStageAnchorPass(e){switch(e){case"beforeFog":return this.volumetricFogPass;case"beforeDepthOfField":return this.dofPass;case"beforeColorAdjustment":return this.colorPass;case"beforeOutline":return this.outlinePass;case"beforeAntiAliasing":return this.fxaaPass;case"beforeLut":return this.lutPass;case"beforeOutput":return this.outputPass}}constructor(t,s={}){this.container=t,this.options=s,this._activeBackend="webgl",this.experimentalWebGpuBackend=null,this.experimentalWebGpuFailed=!1,this.experimentalWebGpuCapabilityReported=!1,this.experimentalWebGpuDynamicBatchingEnabled=!0,this.experimentalWebGpuSelectedObjectInstances=[],this.experimentalStaticDrawSetRegistrations=new Set,this.worldEnvironment=null,this.isIntersecting=!1,this.needsPausedRender=!1,this.wakePausedRenderer=null,this.windowVisible=!0,this.queryScene=new i.Scene,this.running=!0,this.paused=!1,this._fpsCap=null,this.fpsCapRevision=0,this.postProcessVolumes=[],this.postProcessSettings={},this.baseToneMapping=i.NoToneMapping,this.baseToneMappingExposure=1,this.csmUpdateInvervals=this.options.shadows?.cascadeUpdateIntervals,this._id=at++,this.postProcessEffectId=0,this.postProcessEffects=[],this.postProcessEffectResolution=new i.Vector2(1,1),this.postProcessEffectUniformState={aoEnabled:!1,aoTexture:null,cameraFar:void 0,cameraNear:void 0,depthTexture:Ne(),normalTexture:Ne(128,128,255),resolution:this.postProcessEffectResolution,simulationTime:0},this.fquadCopySceneColor=new Fe(new p(f)),this.fquadCopySceneDepth=new Fe(new G({color:V(H("tDepthTexture",Ne()).sample(I.uv).r)})),this.occlusionClusters=[],this.simulationTime=0,this.simulationTimeScale=1,this.lightProbeIntensity=2,this.fquadBlendAO=(()=>{const e=V(1),t=Ne(),s=H("tAlphaTest",t).sample(he).a,a=H("tAO",t).sample(he),n=_(s.lt(.05),a,Q(V(1,1,1,1),a.addScalar(.4))),r=new G({outputs:[n,e,e],transparent:!0});r.depthWrite=!1,r.depthTest=!1,r.blending=i.MultiplyBlending;return new Fe(r)})(),this.resolutionScale=1,this.maxPixelRatio=it?1:window.devicePixelRatio,this.dynamicResolutionScale=1,this.dynamicResolutionFrameTimeAverage=null,this.dynamicResolutionFrameSamples=0,this.dynamicResolutionLastAdjustmentAt=0,this.upscaleOutputPass=null,this.unjitteredProjectionMatrix=new r,this.temporalJitter=new i.Vector2,this.temporalJitterUv=new i.Vector2,this.currentUnjitteredViewProjectionMatrix=new r,this.currentViewProjectionMatrix=new r,this.currentViewProjectionMatrixInverse=new r,this.previousViewProjectionMatrix=new r,this.temporalUpscalingFrameState={depthTexture:null,currentJitterUv:this.temporalJitterUv,currentViewProjectionInverse:this.currentViewProjectionMatrixInverse,previousViewProjection:this.previousViewProjectionMatrix},this.temporalUpscalingFrameIndex=0,this.hasPreviousTemporalViewProjection=!1,this.projectionJitterApplied=!1,this.onResize=()=>{if(this.resizeRender(),this.paused)this.needsPausedRender=!0,this.wakePausedRenderer?.();else try{this.render()}catch(e){}},this.onVisiblityChane=()=>{this.windowVisible=!document.hidden},this.isDepthTextureExtensionSupported=!0,this.onLoopCallbacks=[],this.stats=new te,this.webGpuPassStatsDom=function(){const e=document.createElement("div");return e.dataset.hologyWebGpuPassStats="",e.setAttribute("aria-hidden","true"),e.style.cssText=["position:absolute","top:52px","left:12px","z-index:10000","width:min(520px,calc(100% - 24px))","pointer-events:none","color:white","font:12px/1.2 Arial,Helvetica,sans-serif","text-shadow:0 1px 2px black,0 0 3px black"].join(";"),e}(),this.webGpuVisibilityStatsDom=function(){const e=document.createElement("div");return e.style.cssText=["margin-bottom:10px","padding-bottom:6px","border-bottom:1px solid rgba(255,255,255,.4)"].join(";"),e.textContent="GPU visibility: awaiting readback",e}(),this.webGpuPassStatsRows=[],this._showStats=!1,this.gbufferMaterialCache=new Map,this.gbufferDepthPrepassMaterialCache=new Map,this.tbufferMaterialCache=new Map,this.depthPrepassMaterialCache=new WeakMap,this.depthPrepassCachedMaterials=new Map,this.depthPrepassCachedVisibility=[],this.frameGBufferMeshes=[],this.frameGBufferPhaseMasks=[],this.frameUnsupportedGBufferObjects=[],this.frameGBufferExcludedObjects=new Set,this.appliedGBufferMeshes=[],this.originalGBufferMaterials=[],this.originalGBufferOnBeforeRender=[],this.hiddenGBufferObjects=[],this.gBufferPhaseMaskCache=new WeakMap,this.gBufferMaterialArrayCache=new WeakMap,this.gBufferShadowUpdaterCache=new WeakMap,this._initiatedMaterialTextures=new Set,this._initiatedTextures=new Set,this.compileInProgress=!1,this.depthMaterialCachedMaterials=new Map,this.pmremGeneratorResults=new WeakMap,this.insetHeight=200,this.insetWidth=this.insetHeight*(16/9),this.insetOffsetY=250,this.insetMargin=10,this.maxInsetCameras=4,this.overlayCameras=new Set,this.prevClearColor=new a,this.hadBloom=!1,this.bloomStoredMaterials={},this.bloomHidden=[],this._customDepthMaterialCache=new WeakMap,null!=s.maxPixelRatio&&(this.maxPixelRatio=s.maxPixelRatio),this.resolutionScale=s.resolutionScale??1,this.dynamicResolutionScale=this.getBaseResolutionScale(),this.fpsCap=s.fpsCap,this.experimentalWebGpuDynamicBatchingEnabled=s.webgpuDynamicBatching??!0,"webgpu-experimental"===s.backend&&!0===s.enableXR&&(console.warn("[Hology WebGPU experiment] XR is not supported; using WebGL."),this.experimentalWebGpuFailed=!0),e.activeView=this,ee.init(),window.renderer=this.renderer=window.renderer??new i.WebGLRenderer({antialias:!1,powerPreference:"high-performance"});new i.MeshStandardMaterial({color:"#ccc"});this.scene=new i.Scene,this.scene.matrixWorldAutoUpdate=!0,this.scene.updateMatrixWorld=function(e){const t=this.children;for(let s=0,i=t.length;s<i;s++){t[s].updateMatrixWorld(e)}}.bind(this.scene),this.renderer.setPixelRatio(this.getPresentationPixelRatio()),this.renderer.setSize(t.clientWidth,t.clientHeight),this.renderer.xr.enabled=this.options.enableXR??!1,!0===this.options.enableXR&&document.body.appendChild(P.createButton(this.renderer));const n=new Ee(this.renderer,{defaultThickness:.005,defaultColor:[0,0,0],defaultAlpha:1,defaultKeepAlive:!0});this.outlineEffect=n,this.createGRenderTarget(),this.composer=new g(this.renderer,function(e,t){const s=new i.WebGLRenderTarget(Math.max(1,e),Math.max(1,t),{minFilter:i.LinearFilter,magFilter:i.LinearFilter,format:i.RGBAFormat,type:i.HalfFloatType});return s.texture.name="EffectComposer.rt1",s.texture.generateMipmaps=!1,s}(t.clientWidth,t.clientHeight)),this.composer.setPixelRatio(this.getRenderPixelRatio()),this.composer.setSize(t.clientWidth,t.clientHeight);var l=(t.clientWidth||1)/(t.clientHeight||1);const h=new i.PerspectiveCamera(45,l,.5,800);h.layers.enable(19),this.setCamera(h),this.renderer.shadowMap.enabled=!0,this.renderer.shadowMap.type=i.PCFSoftShadowMap,this.renderer.shadowMap.autoUpdate=s.shadows?.autoUpdate??!1,this.renderer.outputColorSpace=i.SRGBColorSpace,this.renderer.toneMapping=i.NoToneMapping,this.renderer.toneMappingExposure=1,this.baseToneMapping=this.renderer.toneMapping,this.baseToneMappingExposure=this.renderer.toneMappingExposure,this.renderer.gammaFactor=1.4,S.renderingView=this,this.isDepthTextureExtensionSupported=pe(this.renderer),this.attachRendererDomElement(),this.setupEventListeners(),this.aoMaskDepthRenderTarget=e.createAOMaskDepthRenderTarget(this.renderer,this.container,this.getRenderPixelRatio()),this.sceneColorRenderTarget=this.createSceneColorRenderTarget(),this.sceneDepthRenderTarget=this.createSceneDepthRenderTarget();const c=new i.Vector2(t.clientWidth,t.clientHeight),u=(new x(this.scene,this.camera),new w(f,"prevtexture"));u.enabled=!0,u.needsSwap=!0,u.material.uniforms.tDiffuse.value=this.gRenderTarget.textures[0],this.copyPass=u;const d=new Be(c,1.5,.4,.85);d.threshold=1,d.strength=.9,d.radius=.2,this.bloomPass=d;const m=new se(this.scene,this.camera,this.gRenderTarget.width,this.gRenderTarget.height,{});m.normalRenderTarget?.dispose(),m.setGBuffer(this.gRenderTarget.depthTexture,this.gRenderTarget.textures[2]),m.output=se.OUTPUT.Off,m.enabled=!1,this.aoPass=m,this.fquadBlendAO.material.uniforms.tAO.value=m.pdRenderTarget.texture,this.fquadBlendAO.material.uniforms.tAlphaTest.value=this.gRenderTarget.textures[1],Ge.fragmentShader=Ge.fragmentShader.replace("if(metalness==0.) return;","if(metalness<0.1) return;");const y=new Re({renderer:this.renderer,scene:this.scene,camera:this.camera,width:this.gRenderTarget.width,height:this.gRenderTarget.height,groundReflector:null,selects:[],normalTexture:this.gRenderTarget.textures[2],depthTexture:this.gRenderTarget.depthTexture});y.output=Re.OUTPUT.Default,y.blur=!0,y.fresnel=!1,y.distanceAttenuation=!0,y.maxDistance=50,y.selective=!0,y.bouncing=!1,y.opacity=.4,y.enabled=!1!==this.options?.reflection?.enabled,this.ssrPass=y,!1!==this.options.ao?.enabled&&this.composer.addPass(m);const T=new Ot((e,t,s,i,a)=>{this.aoPass.enabled&&(this.initResolutionUniform(this.fquadBlendAO.material),this.renderer.setRenderTarget(this.gRenderTarget),this.fquadBlendAO.render(this.renderer),this.renderer.setRenderTarget(null))});this.composer.addPass(T);const R=new Ot((e,t,s,i,a)=>{this.renderer.setRenderTarget(this.gRenderTarget),this.renderScene(Ke.transparent),this.renderer.setRenderTarget(null)});this.composer.addPass(R),this.composer.addPass(u),this.composer.addPass(y),this.phasedRenderPass=new At(this.scene,this.camera,this.gRenderTarget),this.composer.addPass(this.phasedRenderPass),this.composer.addPass(d),d.emissiveTexture=this.gRenderTarget.textures[1],this.renderer.info.autoReset=!1,this.volumetricFogPass=new Ce(c),this.composer.addPass(this.volumetricFogPass),this.volumetricFogPass.enabled=!0,this.dofPass=new Y(this.scene,this.camera,{focus:1,aperture:.025,maxblur:.01}),this.dofPass.enabled=!1,this.composer.addPass(this.dofPass);const C=new xe;this.composer.addPass(C),this.colorPass=C,C.vignetteEnabled=!1,this.outlinePass=new ge(new i.Vector2(t.clientWidth,t.clientHeight),this.scene,this.camera),this.outlinePass.edgeGlow=0,this.outlinePass.edgeThickness=1.5,this.outlinePass.edgeStrength=5,this.outlinePass.clear=!1,this.outlinePass.enabled=!1,this.composer.addPass(this.outlinePass);const E=new w(M);E.uniforms.resolution.value.set(1/t.clientWidth,1/t.clientHeight),this.composer.addPass(E),this.fxaaPass=E,this.fxaaPass.enabled=!1,!0===s.enableOutlines&&this.setEnableOutlines(!0),new w(b).clear=!1,this.fixStatsStyle(),this.lutPass=new v({}),this.lutPass.enabled=!1,this.composer.addPass(this.lutPass);const B=new w(f,"prevtexture");B.enabled=!0,B.needsSwap=!1,B.material.uniforms.tDiffuse.value=this.gRenderTarget.textures[1],B.renderToScreen=!0;const U=this.isUpscalingEnabled()?new $e(this.options.upscaling):new K;!function(e){const t=e.material;if(t.dithering=!0,t.fragmentShader.includes("<dithering_fragment>"))return;const s="#include <colorspace_pars_fragment>";if(!t.fragmentShader.includes(s))return;t.fragmentShader=t.fragmentShader.replace(s,`${s}\n #include <common>\n #include <dithering_pars_fragment>`);const i=t.fragmentShader.lastIndexOf("}");i<0||(t.fragmentShader=`${t.fragmentShader.slice(0,i)}\n #include <dithering_fragment>\n${t.fragmentShader.slice(i)}`,t.needsUpdate=!0)}(U),this.outputPass=U,this.upscaleOutputPass=U instanceof $e?U:null,this.composer.addPass(U);const W=new i.MeshBasicMaterial({colorWrite:!1,depthWrite:!1,depthTest:!0,transparent:!1}),A=new o(new i.BoxGeometry(1,1,1),W);A.renderOrder=1/0,A.name="CLUSTER_BOUNDS_VOLUME"}addCluster(e){if(!1===this.options.occlusionCulling?.enabled)return;if(!this.renderer.capabilities.isWebGL2)return;const t=this.renderer.getContext(),s=t.createQuery();if(null==s)return;const i={query:s,visible:!0,awaitingResult:!1,cluster:e,lastTested:-1/0,distance:0,update:()=>{if(i.awaitingResult&&t.getQueryParameter(s,t.QUERY_RESULT_AVAILABLE)){const e=t.getQueryParameter(s,t.QUERY_RESULT);i.visible=!!e,i.awaitingResult=!1}}};e.boundsMesh.onBeforeRender=()=>{i.awaitingResult||t.beginQuery(t.ANY_SAMPLES_PASSED,s)},e.boundsMesh.onAfterRender=()=>{i.awaitingResult||(t.endQuery(t.ANY_SAMPLES_PASSED),i.awaitingResult=!0)},this.occlusionClusters.push(i)}updateRenderedOcclusionClusters(){this.queryScene.clear();const e=performance.now(),t=[];for(const s of this.occlusionClusters){if(s.awaitingResult)continue;const i=s.cluster.bounds.distanceToPoint(this.camera.position);if(s.distance=i,i<10){s.visible=!0,s.lastTested=e;continue}if(i>1e3)continue;const a=e-s.lastTested;if(!(s.visible&&a<4e3)&&((s.visible||!(a<100))&&dt.intersectsBox(s.cluster.bounds)))if(s.visible)t.push(s);else{let e=0;for(;e<t.length&&t[e].distance<s.distance;)e++;t.splice(e,0,s)}}if(t.length<50)for(const s of t)s.lastTested=e,this.queryScene.add(s.cluster.boundsMesh);else{const s=Math.max(Math.floor(Math.random()*t.length-50),0);for(let i=0;i<50;i++){const a=t[s+i];if(null==a)break;a.lastTested=e,this.queryScene.add(a.cluster.boundsMesh)}if(t.length>0){const s=t[0];s.lastTested=e,this.queryScene.add(s.cluster.boundsMesh)}}}fixStatsStyle(){const e=this.stats.dom;e.style.position="absolute";const t=e.getElementsByTagName("canvas");for(let e=0;e<t.length;e++)t.item(e).style.display="inline-block"}setEnableOutlines(e){this.outlinePass.enabled=e,this.fxaaPass.enabled=e,this.experimentalWebGpuBackend?.setEnableOutlines(e)}setCamera(e){if(this.camera=e,this.resetUpscalingHistory(),this.composer.passes.forEach(t=>{t instanceof x?t.camera=e:t instanceof ge?t.renderCamera=e:(t instanceof me||t instanceof se)&&(t.camera=e)}),this.ssrPass&&(this.ssrPass.camera=e),this.aoPass&&(this.aoPass.camera=e),this.phasedRenderPass&&(this.phasedRenderPass.camera=e),null==this.csm){this.csm=new Z({maxFar:80,lightFar:250,lightMargin:20,shadowBias:-1e-4,cascades:it?2:3,shadowMapSize:1024*(it?.5:1),lightDirection:new i.Vector3(.5,-1,-.6).normalize(),lightIntensity:.5*Math.PI,camera:this.camera,parent:this.scene,mode:"practical"});for(const e of this.csm.lights)e.shadow.normalBias=.01;if(null!=this.csmUpdateInvervals){this.csmCascadeLastUpdate=new Array(this.csm.lights.length).fill(0);for(const e of this.csm.lights)e.shadow.autoUpdate=!1}this.csm&&Array.isArray(this.csm.lights),this.csm.fade=!0,h.lights_fragment_begin=y.lights_fragment_begin}else this.csm.camera=this.camera,this.camera;this.csm.updateFrustums()}setSelectedObjects(e){if(this.experimentalWebGpuBackend?.setSelectedObjects(e),this.experimentalWebGpuBackend?.setSelectedObjectInstances([]),this.experimentalWebGpuSelectedObjectInstances=[],null==this.outlinePass)return;const t=new Map;for(const s of e)t.set(s.uuid,s);for(const s of e)s.traverse(e=>{e.uuid!==s.uuid&&t.has(e.uuid)&&t.delete(e.uuid)});this.outlinePass.selectedObjects=Array.from(t.values())}setExperimentalWebGpuDynamicBatchingEnabled(e){this.experimentalWebGpuDynamicBatchingEnabled=e,this.experimentalWebGpuBackend?.setDynamicBatchingEnabled(e)}setSelectedObjectInstances(e){this.experimentalWebGpuSelectedObjectInstances=[...e],this.experimentalWebGpuBackend?.setSelectedObjectInstances(this.experimentalWebGpuSelectedObjectInstances)}static createDepthRenderTarget(e,t,s){const a=Math.max(1,Math.floor(t.clientWidth*s)),n=Math.max(1,Math.floor(t.clientHeight*s)),r=new i.WebGLRenderTarget(a,n);return r.texture.minFilter=i.NearestFilter,r.texture.magFilter=i.NearestFilter,r.texture.generateMipmaps=!1,r.stencilBuffer=!1,r.depthTexture=new i.DepthTexture(a,n),r.depthTexture.type=i.UnsignedShortType,r.depthTexture.minFilter=i.NearestFilter,r.depthTexture.magFilter=i.NearestFilter,r}static createAOMaskDepthRenderTarget(e,t,s=e.getPixelRatio()){const a=Math.max(1,t.clientWidth*s),n=Math.max(1,t.clientHeight*s),r=new i.DepthTexture(a,n);r.type=i.UnsignedInt248Type,r.minFilter=i.NearestFilter,r.magFilter=i.NearestFilter;const o=new i.WebGLRenderTarget(a,n,{type:i.HalfFloatType,depthTexture:r});return o.texture.minFilter=i.NearestFilter,o.texture.magFilter=i.NearestFilter,o.texture.generateMipmaps=!1,o.stencilBuffer=!1,o}createSceneColorRenderTarget(){const e=this.gRenderTarget.width,t=this.gRenderTarget.height,s=new i.WebGLRenderTarget(e,t,{type:i.HalfFloatType,format:i.RGBAFormat,colorSpace:i.SRGBColorSpace,depthBuffer:!1,stencilBuffer:!1});return s.texture.minFilter=i.LinearFilter,s.texture.magFilter=i.LinearFilter,s.texture.generateMipmaps=!1,s}createSceneDepthRenderTarget(){const e=new i.WebGLRenderTarget(this.gRenderTarget.width,this.gRenderTarget.height,{type:i.FloatType,format:i.RedFormat,minFilter:i.NearestFilter,magFilter:i.NearestFilter,depthBuffer:!1,stencilBuffer:!1});return e.texture.generateMipmaps=!1,e}createGRenderTarget(){const e=this.container;null!=this.gRenderTarget&&this.gRenderTarget.dispose();const t=this.getRenderPixelRatio(),s=Math.max(1,e.clientWidth*t),a=Math.max(1,e.clientHeight*t),n=new i.DepthTexture(s,a);n.type=i.UnsignedIntType,n.minFilter=i.NearestFilter,n.magFilter=i.NearestFilter,this.gRenderTarget=new c(s,a,{count:3,samples:this.options?.msaa??0,minFilter:i.NearestFilter,magFilter:i.NearestFilter,type:i.HalfFloatType,format:i.RGBAFormat,depthTexture:n}),this.gRenderTarget.textures[2].type=i.UnsignedByteType,this.gRenderTarget.texture.generateMipmaps=!1,this.gRenderTarget.stencilBuffer=!1}setupEventListeners(){window.addEventListener("resize",this.onResize),window.addEventListener("orientationchange",this.onResize),document.addEventListener("visibilitychange",this.onVisiblityChane)}stop(t=!0){this.running=!1,this.disposeExperimentalStaticDrawSets(),e.experimentalWebGpuPresentationView===this&&(e.experimentalWebGpuPresentationView=null),this.wakePausedRenderer=null,this.lightVolume?.shTexture.dispose(),window.removeEventListener("resize",this.onResize),window.removeEventListener("orientationchange",this.onResize),document.removeEventListener("visibilitychange",this.onVisiblityChane),this.onLoopCallbacks=[],t&&this.renderer.dispose(),this.gRenderTarget.dispose(),this.aoMaskDepthRenderTarget.dispose(),this.sceneColorRenderTarget.dispose(),this.sceneDepthRenderTarget.dispose(),this.csm.dispose();for(const e of this.postProcessEffects)this.composer.removePass(e.pass),e.pass.dispose();this.postProcessEffects.length=0,this.detachOwnedDomElements(),this.experimentalWebGpuBackend=null,this._activeBackend="webgl";if(ot().unobserve(this.container),rt.delete(this.container),this.occlusionClusters.length>0){const e=this.renderer.getContext();this.occlusionClusters.forEach(t=>{e.deleteQuery(t.query)})}this.volumetricFogPass.dispose(),S.clearSceneCache(this.scene)}onLoop(e){this.onLoopCallbacks.push(e)}removeOnLoop(e){const t=this.onLoopCallbacks.findIndex(t=>t===e);t>=0&&this.onLoopCallbacks.splice(t,1)}set showStats(e){this._showStats=e,this.experimentalWebGpuBackend?.setProfilingEnabled(e),this._showStats&&this.stats.dom.parentElement!==this.container?this.container.appendChild(this.stats.dom):this._showStats||this.stats.dom.parentElement!==this.container||this.container.removeChild(this.stats.dom),this.syncWebGpuPassStatsDom()}get showStats(){return this._showStats}attachRendererDomElement(){const t=this.getActiveRendererCanvas();if("webgpu-experimental"===this._activeBackend&&null!=this.experimentalWebGpuBackend&&e.experimentalWebGpuPresentationView!==this){const t=e.experimentalWebGpuPresentationView;t?.disposeExperimentalStaticDrawSets(),e.experimentalWebGpuPresentationView=this,this.applyExperimentalWebGpuViewState(!0),this.activateExperimentalStaticDrawSets()}const s=t===this.renderer.domElement?this.experimentalWebGpuBackend?.canvas:this.renderer.domElement;s?.parentElement===this.container&&this.container.removeChild(s),t.parentElement===this.container&&t===this.container.firstChild||this.container.insertBefore(t,this.container.firstChild),this._showStats&&this.stats.dom.parentElement!==this.container&&this.container.appendChild(this.stats.dom),this.syncWebGpuPassStatsDom()}detachOwnedDomElements(){this.renderer.domElement.parentElement===this.container&&this.container.removeChild(this.renderer.domElement);const e=this.experimentalWebGpuBackend?.canvas;e?.parentElement===this.container&&this.container.removeChild(e),this.stats.dom.parentElement===this.container&&this.container.removeChild(this.stats.dom),this.webGpuPassStatsDom.parentElement===this.container&&this.container.removeChild(this.webGpuPassStatsDom)}syncWebGpuPassStatsDom(){const e=this._showStats&&"webgpu-experimental"===this.options.backend;e&&this.webGpuPassStatsDom.parentElement!==this.container?this.container.appendChild(this.webGpuPassStatsDom):e||this.webGpuPassStatsDom.parentElement!==this.container||this.container.removeChild(this.webGpuPassStatsDom)}updateWebGpuPassStats(e){let t=this.webGpuPassStatsRows.length!==e.passes.length;for(let s=0;!t&&s<e.passes.length;s++)t=this.webGpuPassStatsRows[s].name!==e.passes[s].name;t&&(this.webGpuPassStatsDom.replaceChildren(this.webGpuVisibilityStatsDom),this.webGpuPassStatsRows=e.passes.map(e=>{const t=function(e){const t=document.createElement("div");t.style.cssText=["display:grid","grid-template-columns:minmax(0,1fr) 92px 92px","column-gap:12px","margin-bottom:7px"].join(";");const s=document.createElement("span");s.textContent=e,s.style.cssText="overflow:hidden;text-overflow:ellipsis;white-space:nowrap";const i=document.createElement("span"),a=document.createElement("span"),n=document.createElement("div");return n.style.cssText=["grid-column:1","height:4px","margin-top:4px","background:rgba(255,255,255,.78)","box-shadow:0 1px 2px rgba(0,0,0,.9)"].join(";"),t.append(s,i,a,n),{name:e,dom:t,gpu:i,cpu:a,bar:n}}(e.name);return this.webGpuPassStatsDom.appendChild(t.dom),t}));const s=e.visibility;if(null==s)this.webGpuVisibilityStatsDom.textContent=e.hiZOcclusionCullingActive?"GPU visibility: awaiting readback":"GPU visibility: inactive";else{const e=s.totalInstances>0?s.visibleInstances/s.totalInstances*100:100;this.webGpuVisibilityStatsDom.textContent=`GPU visibility: ${s.visibleInstances.toLocaleString()} / ${s.totalInstances.toLocaleString()} visible (${e.toFixed(1)}%), ${s.culledInstances.toLocaleString()} culled | dynamic ${s.dynamicVisibleInstances.toLocaleString()} / ${s.dynamicTotalInstances.toLocaleString()}, static ${s.staticVisibleInstances.toLocaleString()} / ${s.staticTotalInstances.toLocaleString()}`}let i=.01;for(const t of e.passes)i=Math.max(i,t.gpuTimeMs??t.cpuTimeMs);for(let t=0;t<e.passes.length;t++){const s=e.passes[t],a=this.webGpuPassStatsRows[t];a.gpu.textContent=null==s.gpuTimeMs?"GPU --":`GPU ${s.gpuTimeMs.toFixed(2)} ms`,a.cpu.textContent=`CPU ${s.cpuTimeMs.toFixed(2)} ms`;const n=s.gpuTimeMs??s.cpuTimeMs;a.bar.style.width=`${Math.max(n>0?2:0,n/i*100)}%`}}getActiveRendererCanvas(){return"webgpu-experimental"===this._activeBackend&&null!=this.experimentalWebGpuBackend?this.experimentalWebGpuBackend.canvas:this.renderer.domElement}disableExperimentalWebGpu(t){const s=this.experimentalWebGpuBackend;s?.canvas.parentElement===this.container&&this.container.removeChild(s.canvas),this.disposeExperimentalStaticDrawSets(),null!=s&&s===e.sharedExperimentalWebGpuBackend?(e.sharedExperimentalWebGpuBackend=null,s.destroy()):s?.destroy(),e.experimentalWebGpuPresentationView===this&&(e.experimentalWebGpuPresentationView=null),this.experimentalWebGpuBackend=null,this.experimentalWebGpuFailed=!0,this._activeBackend="webgl",this.webGpuPassStatsDom.remove(),this.applyWorldEnvironmentToWebGl(),this.attachRendererDomElement(),this.resizeRender(!0),console.warn("[Hology WebGPU experiment] Falling back to WebGL.",t)}activateExperimentalStaticDrawSets(){if("webgpu-experimental"!==this._activeBackend||null==this.experimentalWebGpuBackend)return;let e=0,t=0,s=0,i=0;for(const a of this.experimentalStaticDrawSetRegistrations)if(null==a.staticDrawSet)try{const i=this.experimentalWebGpuBackend.createStaticDrawSet(a.root,a.label);if(null==i)continue;a.staticDrawSet=i,a.root.visible=!1,e++,t+=i.drawCount,s+=i.instanceCount}catch(e){i++,console.warn(`[Hology WebGPU experiment] Keeping static root "${a.label}" dynamic:`,e)}e>0&&console.info(`[Hology WebGPU experiment] Activated ${e} static draw set${1===e?"":"s"} (${t} draws, ${s} instances).`),i>0&&console.warn(`[Hology WebGPU experiment] ${i} static draw set${1===i?"":"s"} remain dynamic.`)}disposeExperimentalStaticDrawSets(){for(const e of this.experimentalStaticDrawSetRegistrations)e.staticDrawSet?.dispose(),null!=e.staticDrawSet&&(e.root.visible=e.sourceWasVisible),e.staticDrawSet=null}applyEnvMap(e){if(null!=this.scene.environment&&(e instanceof G&&(null==e.envMap||e.userData.useSceneEnv)&&(e.userData.useSceneEnv=!0,null==e.uniforms.envMap&&(e.uniforms.envMap={value:this.scene.environment},e.uniformsNeedUpdate=!0,e.uniforms.envMapRotation={value:Ct(this.scene.environmentRotation,this.scene.environment,new i.Matrix3)}),null==e.uniforms.envMapIntensity&&(e.uniforms.envMapIntensity={value:1},e.uniformsNeedUpdate=!0),e.uniforms.envMap.value=this.scene.environment,e.uniforms.envMapIntensity.value=this.scene.environmentIntensity,e.envMap=this.scene.environment),e instanceof G||e instanceof i.MeshStandardMaterial)){const t=this.gbufferMaterialCache.get(e);null==t||this.gbufferMaterialCache.has(t)||this.applyEnvMap(t)}}setWorldEnvironment(e){const t=this.worldEnvironment?.source!==e?.source;this.worldEnvironment=e,null==e?(this.scene.environment=null,this.scene.environmentIntensity=1):("webgpu-experimental"!==this.options.backend||this.experimentalWebGpuFailed)&&this.applyWorldEnvironmentToWebGl();const s=this.experimentalWebGpuBackend;if(null==s)return;const i=t&&"webgpu-experimental"===this._activeBackend;i&&this.disposeExperimentalStaticDrawSets(),s.setWorldEnvironment(e),i&&this.activateExperimentalStaticDrawSets()}applyWorldEnvironmentToWebGl(){const e=this.worldEnvironment;if(null==e)return this.scene.environment=null,void(this.scene.environmentIntensity=1);this.scene.environment=this.getEnvTexture(e.source),this.scene.environmentIntensity=e.intensity}hideOccluded(e){e.length=0;for(const t of this.occlusionClusters)if(!t.visible){let s=t.cluster.objects.length;for(;s--;){const i=t.cluster.objects[s];i.visible&&(i.visible=!1,e.push(i))}}}setupCsm(e){if(e instanceof i.Mesh||e instanceof i.SkinnedMesh)if(e.material instanceof Array)for(const t of e.material)this.csm.setupMaterial(t);else this.csm.setupMaterial(e.material)}updateMaterialProperties(e,t){(e instanceof i.MeshBasicMaterial||e instanceof m||e instanceof i.MeshLambertMaterial||e instanceof i.MeshPhongMaterial)&&(null!=t.uniforms.color&&t.uniforms.color.value.setFromColor(e.color),null!=t.uniforms.opacity&&(t.uniforms.opacity.value=e.opacity),null!=t.uniforms.map&&(t.uniforms.map.value=e.map),null!=t.uniforms.alphaMap&&(t.uniforms.alphaMap.value=e.alphaMap),null!=t.uniforms.lightMap&&(t.uniforms.lightMap.value=e.lightMap,t.uniforms.lightMapIntensity.value=e.lightMapIntensity),null!=t.uniforms.aoMap&&(t.uniforms.aoMap.value=e.aoMap,t.uniforms.aoMapIntensity.value=e.aoMapIntensity),null!=t.uniforms.alphaTest&&(t.uniforms.alphaTest.value=e.alphaTest)),(e instanceof m||e instanceof i.MeshLambertMaterial||e instanceof i.MeshPhongMaterial)&&(t.uniforms.normalMap&&(t.uniforms.normalMap.value=e.normalMap,t.uniforms.normalScale.value=e.normalScale.x),t.uniforms.emissiveMap&&(t.uniforms.emissiveMap.value=e.emissiveMap,t.uniforms.emissive.value.setFromColor(e.emissive),t.uniforms.emissiveIntensity.value=e.emissiveIntensity)),e instanceof m&&(null!=t.uniforms.roughnessMap&&(t.uniforms.roughnessMap.value=e.roughnessMap),null!=t.uniforms.metalnessMap&&(t.uniforms.metalnessMap.value=e.metalnessMap),null!=t.uniforms.roughness&&(t.uniforms.roughness.value=e.roughness),null!=t.uniforms.metalness&&(t.uniforms.metalness.value=e.metalness)),e instanceof i.MeshPhysicalMaterial&&(t.uniforms.sheenColor&&t.uniforms.sheenColor.value.setFromColor(e.sheenColor).multiplyScalar(e.sheen),t.uniforms.sheenColorMap&&(t.uniforms.sheenColorMap.value=e.sheenColorMap),t.uniforms.sheenRoughness&&(t.uniforms.sheenRoughness.value=e.sheenRoughness),t.uniforms.sheenRoughnessMap&&(t.uniforms.sheenRoughnessMap.value=e.sheenRoughnessMap)),e instanceof Oe&&(t.uniforms.heightMap.value=e.heightMap,t.uniforms.heightScale.value=e.heightScale),this.updateMaterialCommonProperties(e,t)}updateUniformValues(e,t){const s=e.uniforms,i=t.uniforms;for(const e in s){const t=i[e],a=s[e].value;null!=t&&t.value!==a&&"receiveShadow"!==e&&!1===Dt.includes(e)&&(t.value=a)}this.updateMaterialCommonProperties(e,t)}inheritCustomUniformBindings(e,t){const s=e.uniforms,i=t.uniforms;for(const e in s)null==i[e]&&("receiveShadow"===e||Dt.includes(e)||Ft.includes(e)||(i[e]={value:s[e].value}))}updateMaterialCommonProperties(e,t){t.alphaTest=e.alphaTest,t.side=e.side,t.depthTest=e.depthTest,t.blending=e.blending,t.colorWrite=e.colorWrite,t.premultipliedAlpha=e.premultipliedAlpha,t.polygonOffset=e.polygonOffset,t.polygonOffsetFactor=e.polygonOffsetFactor,t.polygonOffsetUnits=e.polygonOffsetUnits,t.visible=e.visible}updateLightUniformValues(e,t){const s=e.uniforms,i=t.uniforms;for(const e of Dt){const t=i[e],a=s[e];null!=a&&null!=t&&(t.value=a.value)}}createGBufferMaterial(e,t,s=!1){const a=t===Ke.opaque?this.gbufferMaterialCache:this.tbufferMaterialCache;let n=a.get(e);if(!0===e.userData.isGBufferMaterial)return e;if(null==n){const s=this.usesShaderUniform(e,ae),o=this.usesShaderUniform(e,de),l=this.usesShaderUniform(e,ue),h=e.transparent&&e.alphaTest<=.01||e.blending===i.AdditiveBlending,c=t===Ke.opaque?!(s||o||l||h):h||s||o||l;if(!c)return a.set(e,st),st;let u=I.uv;if(e instanceof Oe&&null!=e.heightMap){const t=E("heightScale",e.heightScale??1);u=De(u,H("heightMap",e.heightMap),t)}let d=j.normal;if(e instanceof i.MeshStandardMaterial||e instanceof i.MeshLambertMaterial||e instanceof i.MeshToonMaterial||e instanceof i.MeshPhongMaterial){const t=e.normalMap??tt,s=E("useNormalMap",null!=e.normalMap?1:0),i=E("normalScale",e.normalScale?.x??1),a=T(H("normalMap",t).sample(_e(u,e.normalMap)),i);d=$(j.normal,a,s)}else e instanceof G&&null!=e.outputNormal&&(d=e.outputNormal);!0!==e.userData.disableAO&&(d=N("DOUBLE_SIDED",d,e=>_(new L("gl_FrontFacing"),e,e.multiplyScalar(-1))));let f=e.userData?.reflective?R(0):R(1);if(e instanceof i.MeshStandardMaterial){const t=E("roughness",e.roughness??1),s=e.roughnessMap??Ze,i=E("useRoughnessMap",null!=e.roughnessMap?1:0),a=H("roughnessMap",s).sample(_e(u,e.roughnessMap)).g.multiply(t);f=$(t,a,i)}else e instanceof G&&null!=e.outputRoughness&&(f=e.outputRoughness);let g=null;if((e instanceof i.MeshStandardMaterial||e instanceof i.MeshLambertMaterial||e instanceof i.MeshToonMaterial||e instanceof i.MeshPhongMaterial||e instanceof i.MeshBasicMaterial)&&null!=e.lightMap){const t=e.lightMap,s=E("useLightMap",null!=e.lightMap?1:0),i=E("lightMapIntensity",e.lightMapIntensity??1),a=H("lightMap",t).sample(u).rgb.multiplyScalar(i);g=$(O(0),a,s)}let M=R(0);if(e instanceof i.MeshStandardMaterial){const t=E("metalness",e.metalness??0),s=e.metalnessMap??et,i=E("useMetalnessMap",null!=e.metalnessMap?1:0),a=H("metalnessMap",s).sample(_e(u,e.metalnessMap)).b.multiply(t);M=$(t,a,i)}else e instanceof G&&e.outputRoughness;let b=null,v=R(1);if(e instanceof i.MeshStandardMaterial||e instanceof i.MeshLambertMaterial||e instanceof i.MeshToonMaterial||e instanceof i.MeshPhongMaterial||e instanceof i.MeshBasicMaterial){const t=e.aoMap??Ze,s=E("useAoMap",null!=e.aoMap?1:0);v=E("aoMapIntensity",e.aoMapIntensity??1);const i=H("aoMap",t).sample(_e(u,e.aoMap)).r;b=$(R(1),i,s)}else e instanceof G&&e.outputRoughness;const x=E("opacity",e.opacity??1);let w=R(1);if(e instanceof i.MeshStandardMaterial||e instanceof i.MeshLambertMaterial||e instanceof i.MeshBasicMaterial||e instanceof i.MeshToonMaterial||e instanceof i.MeshPhongMaterial){if(null!=e.alphaMap){const t=e.alphaMap;w=H("alphaMap",t).sample(_e(u,e.alphaMap)).r}w=w.multiply(x)}else e instanceof G&&null!=e.outputOpacity&&(w=e.outputOpacity);let P=D(0,1);if(e instanceof i.MeshStandardMaterial||e instanceof i.MeshLambertMaterial||e instanceof i.MeshToonMaterial||e instanceof i.MeshPhongMaterial||e instanceof i.MeshBasicMaterial){let t=B("color",(new i.Vector3).setFromColor(e.color));const s=e.map??Ze,a=E("useAlbedoMap",null!=e.map?1:0),n=H("map",s).sample(_e(u,e.map)),r=n.multiply(D(t,1)),o=D(t,1);P=$(o,r,a),e.vertexColors&&(P=P.multiply(V(k(z.color.rgb),1)));const l=$(R(1),n.w,a);w=w.multiply(l)}const y=!0===e.userData.hasBloom;let S=O(0);if(e instanceof i.MeshStandardMaterial||e instanceof i.MeshLambertMaterial||e instanceof i.MeshToonMaterial||e instanceof i.MeshPhongMaterial){const t=B("emissive",(new i.Vector3).setFromColor(e.emissive)),s=E("emissiveIntensity",e.emissiveIntensity),a=e.emissiveMap??et,n=E("useEmissiveMap",null!=e.emissiveMap?1:0),r=H("emissiveMap",a).sample(_e(u,e.emissiveMap)).rgb.multiply(t);S=$(t,r,n),S=S.multiplyScalar(s)}else e instanceof G&&null!=e.outputEmissive&&(S=e.outputEmissive);let F=null;if(e instanceof i.MeshPhysicalMaterial&&e.sheen>0&&(F=B("sheenColor",(new i.Vector3).setFromColor(e.sheenColor).multiplyScalar(e.sheen)),e.sheen>0&&null!=e.sheenColorMap)){const t=H("sheenColorMap",e.sheenColorMap).sample(u).rgb;F=F.multiply(t)}let q=null;if(e instanceof i.MeshPhysicalMaterial&&e.sheen>0&&(q=E("sheenRoughness",e.sheenRoughness),e.sheen>0&&null!=e.sheenRoughnessMap)){const t=H("sheenRoughnessMap",e.sheenRoughnessMap).sample(u).r;q=q.multiply(t)}let Q=null;if(e instanceof i.MeshPhysicalMaterial&&e.anisotropy>0&&(Q=E("anisotropy",e.anisotropy),e.anisotropy>0&&null!=e.anisotropyMap)){const t=H("anisotropyMap",e.anisotropyMap).sample(u).r;Q=Q.multiply(t)}let X=null;if(e instanceof i.MeshPhysicalMaterial&&e.anisotropy>0){const t=e.anisotropyRotation??0;X=J("anisotropyDirection",new i.Vector2(Math.cos(t),Math.sin(t)))}const Y=E("alphaTest",e.alphaTest);let K,Z=e.alphaTest>0?w.lt(Y):h&&t===Ke.opaque?w.lt(.8):null;!0===e.userData.isDecal&&(Z=Z?Z.or(Ie):Ie),K=h?V(0,0,0,0):(r=d,A(r).multiplyScalar(.5).addScalar(.5)).rgba(e.userData?.reflective?f:1);const ee=e instanceof G?e.outputPosition:void 0,te=e instanceof G?e.outputTransform:void 0;let se,ie=D("black",1);if(e instanceof G&&null!=e.outputColor)ie=e.outputColor;else if(e instanceof i.MeshStandardMaterial)ie=C({color:P,metalness:M,roughness:f,emissive:S.rgb,normal:d,ambientOcclusion:b,ambientOcclusionIntensity:v,bakedLight:g,sheenColor:F,sheenRoughness:q,anisotropy:Q,anisotropyDirection:X});else if(e instanceof i.MeshLambertMaterial||e instanceof i.MeshPhongMaterial)ie=W({color:P.rgb,ambientOcclusion:b,ambientOcclusionIntensity:v});else if(e instanceof i.MeshBasicMaterial){let e=P.rgb,t=g??O("black");null!=b&&(t=t.multiplyScalar(b.subtract(1).multiply(v).add(1))),e=e.add(t),ie=e.rgba(w)}else e instanceof i.MeshToonMaterial&&(ie=U({color:P,emissive:S.rgb,normal:d,ambientOcclusion:b,ambientOcclusionIntensity:v,bakedLight:g}));(e instanceof G||e instanceof i.MeshStandardMaterial)&&(se=e.envMap);let ne=!0;(e instanceof m||e instanceof i.MeshBasicMaterial||e instanceof i.ShaderMaterial)&&(ne=e.fog);let re=D(ie.rgb,w);ne&&(re=new FogNode(re)),n=new G({transform:te,position:null==te?ee:void 0,outputs:[re,S.rgba(t===Ke.opaque?Y:y?1:0),K],opacity:w,outputEncoding:!1,fog:ne,transparent:e.transparent,lights:!0,envMap:se,alphaTest:e.alphaTest,uniformNodes:e.uniformNodes??{},discard:Z}),e instanceof i.MeshStandardMaterial&&null!=e.envMap&&null!=n.uniforms.envMapIntensity&&(n.uniforms.envMapIntensity.value=e.envMapIntensity),"alphaMap"in e&&null!=e.alphaMap&&(n.alphaMap=e.alphaMap),(e instanceof G||e instanceof i.MeshStandardMaterial)&&this.applyEnvMap(n),e instanceof G&&(Object.assign(n.defines,e.defines),null!=n.uniforms[ue]&&(n.uniforms[ue].value=this.aoPass.pdRenderTarget.texture,n.defines.USE_SSAO_MAP="")),n.userData.mrtOutputs=3,n.forceSinglePass=e.forceSinglePass,n.side=e.side,n.blending=e.blending,h?(n.depthWrite=!e.transparent,n.depthTest=e.depthTest,n.colorWrite=t===Ke.transparent):(n.depthWrite=e.depthWrite,n.depthTest=e.depthTest),n.visible=e.visible,n.alphaTest=e.alphaTest,n.alphaHash=e.alphaHash,n.vertexColors=e.vertexColors,n.premultipliedAlpha=e.premultipliedAlpha,n.toneMapped=e.toneMapped,n.blendAlpha=e.blendAlpha,n.blendColor=e.blendColor,n.polygonOffset=e.polygonOffset,n.polygonOffsetFactor=e.polygonOffsetFactor,n.polygonOffsetUnits=e.polygonOffsetUnits,n.blending=e.blending,n.wireframe=e.wireframe??!1,n.userData.isGBufferMaterial=!0,n.visible=c,Object.assign(n.userData,e.userData),n.visible&&(this.csm.setupMaterial(n),e instanceof p&&this.inheritCustomUniformBindings(e,n)),a.set(e,n)}var r;return n.visible&&(e instanceof p?this.updateUniformValues(e,n):this.updateMaterialProperties(e,n)),this.usesShaderUniform(n,de)&&this.initSceneColorUniform(n),this.initLightVolumeUniform(n),n}isDepthPrepassEnabled(){return!0===this.options.depthPrepass?.enabled}usesSceneFeedbackUniforms(e){return e instanceof p&&(this.usesShaderUniform(e,ae)||this.usesShaderUniform(e,de)||this.usesShaderUniform(e,ue))}usesShaderUniform(e,t){return e instanceof p&&null!=e.uniforms[t]}isDepthPrepassEligibleMaterial(e){return null!=e&&(!1!==e.visible&&!1!==e.depthTest&&!1!==e.depthWrite&&(!e.transparent&&e.blending!==i.AdditiveBlending&&(!this.usesSceneFeedbackUniforms(e)&&(e instanceof G||e instanceof i.MeshStandardMaterial||e instanceof i.MeshLambertMaterial||e instanceof i.MeshPhongMaterial||e instanceof i.MeshToonMaterial||e instanceof i.MeshBasicMaterial))))}isDepthPrepassEligibleMesh(e){return!!this.isDepthPrepassEnabled()&&((e instanceof i.InstancedMesh||e instanceof Ve)&&(!Array.isArray(e.material)&&this.isDepthPrepassEligibleMaterial(e.material)))}createDepthPrepassMaterial(e){if(!this.isDepthPrepassEligibleMaterial(e))return null;let t=this.depthPrepassMaterialCache.get(e);if(null==t){let s,a=R(1);e instanceof i.MeshStandardMaterial||e instanceof i.MeshLambertMaterial||e instanceof i.MeshBasicMaterial||e instanceof i.MeshToonMaterial||e instanceof i.MeshPhongMaterial?(a=E("opacity",e.opacity??1),null!=e.map&&(a=a.multiply(H("map",e.map).sample(I.uv).a)),null!=e.alphaMap&&(a=a.multiply(H("alphaMap",e.alphaMap).sample(I.uv).r))):e instanceof G&&(a=e.outputOpacity??R(1)),null!=e.alphaTest&&e.alphaTest>0&&(s=a.lt(e.alphaTest));const n=e instanceof G?e.outputPosition:void 0,r=e instanceof G?e.outputTransform:void 0;t=new G({outputs:[D(0,0),D(0,0),D(0,0)],opacity:a,transform:r,position:null==r?n:void 0,discard:s,lights:!1,fog:!1,outputEncoding:!1,transparent:!1,alphaTest:e.alphaTest}),t.depthWrite=!0,t.depthTest=e.depthTest,t.colorWrite=!1,t.transparent=!1,t.blending=i.NoBlending,t.lights=!1,t.fog=!1,t.toneMapped=!1,t.side=e.side,t.alphaTest=e.alphaTest,t.visible=e.visible,t.polygonOffset=e.polygonOffset,t.polygonOffsetFactor=e.polygonOffsetFactor,t.polygonOffsetUnits=e.polygonOffsetUnits,t.onBeforeCompile=()=>{},t.customProgramCacheKey=()=>`depth-prepass:${e.id}:${e.version}:${e.alphaTest}:${e.side}`;for(const e of Dt)delete t.uniforms[e];for(const e of Ft)delete t.uniforms[e];delete t.uniforms.receiveShadow,this.depthPrepassMaterialCache.set(e,t)}return e instanceof G?this.updateUniformValues(e,t):this.updateMaterialProperties(e,t),t.depthWrite=!0,t.depthTest=e.depthTest,t.colorWrite=!1,t.transparent=!1,t.blending=i.NoBlending,t.visible=e.visible,t.alphaTest=e.alphaTest,t.side=e.side,t.polygonOffset=e.polygonOffset,t.polygonOffsetFactor=e.polygonOffsetFactor,t.polygonOffsetUnits=e.polygonOffsetUnits,t}applyDepthPrepassMaterials(){const e=this.depthPrepassCachedMaterials,t=this.depthPrepassCachedVisibility;e.clear(),t.length=0,be(this.scene,s=>{if(Ut(s))return t.push(s),s.visible=!1,!1;if(!(s instanceof o))return;if(e.set(s,s.material),!this.isDepthPrepassEligibleMesh(s))return t.push(s),void(s.visible=!1);const i=this.createDepthPrepassMaterial(s.material);if(null==i)return t.push(s),void(s.visible=!1);s.material=i,s.visible=!0})}unapplyDepthPrepassMaterials(){this.depthPrepassCachedMaterials.forEach((e,t)=>{t.material=e}),this.depthPrepassCachedVisibility.forEach(e=>{e.visible=!0})}renderDepthPrepass(){if(!this.isDepthPrepassEnabled())return;this.applyDepthPrepassMaterials();const e=this.scene.matrixWorldAutoUpdate,t=this.scene.matrixAutoUpdate,s=this.renderer.shadowMap.autoUpdate;this.renderer.shadowMap.autoUpdate=!1,this.scene.matrixWorldAutoUpdate=!1,this.scene.matrixAutoUpdate=!1,this.renderer.setRenderTarget(this.gRenderTarget),this.renderer.clearDepth();try{this.renderer.render(this.scene,this.camera)}catch(e){console.warn("Depth prepass render failed",e)}this.unapplyDepthPrepassMaterials(),this.renderer.shadowMap.autoUpdate=s,this.scene.matrixWorldAutoUpdate=e,this.scene.matrixAutoUpdate=t}updateCsm(){const e=this.csmUpdateInvervals;if(this.renderer.shadowMap.autoUpdate&&null!=this.csmCascadeLastUpdate&&Array.isArray(e)){const t=performance.now();for(let s=0;s<this.csm.lights.length;++s){const i=e[s]??e[e.length-1]??16;(t-this.csmCascadeLastUpdate[s]>=i||0===s)&&this.csm.lights[s].shadow&&(this.csm.lights[s].shadow.needsUpdate=!0,this.csmCascadeLastUpdate[s]=t)}}this.csm.update()}syncExperimentalWebGpuCascades(){const e=this.experimentalWebGpuBackend,t=this.camera,s=this.csm;if(null==e||!(t instanceof l)||null==s)return void e?.setCascadedShadowRanges([]);const i=[];s.getExtendedBreaks(i);const a=Math.max(t.far-t.near,1e-4),n=Math.max(Math.min(t.far,s.maxFar),0)/a;e.setCascadedShadowRanges(i.map(({x:e,y:t})=>({x:e*n,y:t*n})),s.lights)}loop(t,s=!1){const a=this.stats,n=a.addPanel(new te.Panel("Calls","#83f","#002")),l=a.addPanel(new te.Panel("Triangles","#c32","#002")),h="webgpu-experimental"===this.options.backend,p=h?a.addPanel(new te.Panel("WGPU CPU","#2cf","#013")):null,c=h?a.addPanel(new te.Panel("WGPU GPU","#fc2","#310")):null,u=h?a.addPanel(new te.Panel("Extract","#4f8","#021")):null,d=h?a.addPanel(new te.Panel("Upload","#f8c","#301")):null,m=h?a.addPanel(new te.Panel("Graph","#c8f","#201")):null;let f;navigator.userAgent.includes("Chrome")&&navigator.userAgent.includes("HologyEngine")&&"webgpu-experimental"!==this.options.backend&&(f=new fe(this.renderer.getContext()),a.addPanel(f)),this.showStats=s;let g=10,M=1e3,b=16,v=16,x=4,w=4,P=16;let y=-1/0;const S=e=>!(e-y<.25)&&(y=e,!0),T=()=>{const e=this.renderer.info.render.calls;e>g&&(g=e,setTimeout(()=>g=10,5e3)),n.update(e,g);const t=this.renderer.info.render.triangles;t>M&&(M=t,setTimeout(()=>M=1e3,5e3)),l.update(t,M)},R=()=>{const e=this.experimentalWebGpuBackend?.getLastFrameProfile();null!=e&&(g=Math.max(g,e.drawCallCount),M=Math.max(M,e.triangleCount),b=Math.max(b,e.cpuTimeMs),x=Math.max(x,e.cpuPhases.extractSceneMs),w=Math.max(w,e.cpuPhases.uploadMs),P=Math.max(P,e.cpuPhases.renderGraphMs),n.update(e.drawCallCount,g),l.update(e.triangleCount,M),p?.update(e.cpuTimeMs,b),u?.update(e.cpuPhases.extractSceneMs,x),d?.update(e.cpuPhases.uploadMs,w),m?.update(e.cpuPhases.renderGraphMs,P),null!=e.gpuTimeMs&&(v=Math.max(v,e.gpuTimeMs),c?.update(e.gpuTimeMs,v)),this.updateWebGpuPassStats(e))};performance.now();i.Ray.prototype.intersectTriangle;this.resizeRender();const C=[],E=[],B=[],U=[];let W=0;const A=new r,O=new r;let D=0;let F=this.paused,k=!1,I=0,j=null,V=this.fpsCapRevision;const L=()=>{this.running&&!0!==this.options.enableXR&&requestAnimationFrame(H)},_=()=>{this.running&&(e.activeView=this,k&&(k=!1,requestAnimationFrame(()=>H(I))))};this.wakePausedRenderer=_;const N=ot();rt.set(this.container,e=>{this.isIntersecting=e,e&&_()}),N.observe(this.container),this.container.addEventListener("pointerdown",()=>{_()},{capture:!0});const H=s=>{if(k=!1,!this.running)return;const n=this.getActiveRendererCanvas(),r=this.needsPausedRender;if(null===this.container.offsetParent||this.paused&&!r&&n.height>1)return k=!0,I=s,setTimeout(()=>{this.running&&k&&H(s)},500),void(this.paused&&(F=!0));if(n.parentElement!==this.container){if(e.activeView!==this&&null!==e.activeView)return k=!0,void(I=s);this.attachRendererDomElement(),this.resizeRender()}if(!0!==this.options.enableXR){V!==this.fpsCapRevision&&(V=this.fpsCapRevision,j=null);const e=this.fpsCap;if(null!=e){const t=1e3/e;if(null!=j){const e=s-j;if(e<t)return void L();j=s-e%t}else j=s}else j=s}let l=(s*=.001)-W;W=s,F?(l=.016,F=!1,this.resetUpscalingHistory()):l>.25&&this.resetUpscalingHistory(),this.updateDynamicResolution(l,1e3*s);const h="webgpu-experimental"===this._activeBackend;if(this.applyPostProcessSettings(),h||(this.renderer.autoClear=!1,this.renderer.setViewport(0,0,this.container.clientWidth,this.container.clientHeight)),a.begin(),!h&&this.showStats&&f?.startQuery(),h||(this.ssrPass.gpuPanel=f),A.copy(this.camera.matrixWorld),!this.paused){if(l>1){let e=l;for(;e>.05;)t(ht),e-=ht;t(e)}else t(l);this.onLoopCallbacks.forEach(e=>e(l))}this.paused||(this.simulationTime+=l*this.simulationTimeScale);const p=this.simulationTime;if(this.camera?.updateMatrixWorld(),O.copy(this.camera.matrixWorld),s-D>.08&&!O.equals(A)&&(this.renderer.shadowMap.needsUpdate=!0,D=s),this.updateCsm(),h){try{const e=this.experimentalWebGpuBackend;if(null==e||!ze.supportsCamera(this.camera))throw new Error(`Unsupported camera type: ${this.camera?.type??"unknown"}`);this.syncExperimentalWebGpuCascades(),e.render(this.scene,this.camera,p),this.showStats&&S(s)&&R()}catch(e){this.disableExperimentalWebGpu(e),this.render(l)}return a.end(),void L()}let c=!1;C.length=0,E.length=0,B.length=0;for(const e of U)e.visible=!0;U.length=0;const u=dt;ft.multiplyMatrices(this.camera.projectionMatrix,this.camera.matrixWorldInverse),u.setFromProjectionMatrix(ft);let d=!1,m=!1,g=!1;const M=this.frameGBufferMeshes,b=this.frameGBufferPhaseMasks,v=this.frameUnsupportedGBufferObjects,x=this.frameGBufferExcludedObjects;if(M.length=0,b.length=0,v.length=0,x.clear(),this.scene.traverseVisible(e=>{if(this.setupCsm(e),this.outlineEffect.apply(e),e instanceof Ae&&(d=!0),e instanceof o&&this.initCustomDepthMaterial(e),(e instanceof o||e instanceof i.Sprite)&&(this.initResolutionUniform(e.material),this.initNormalUniform(e.material),this.initShadowUniform(e,e.material),this.initLightVolumeUniform(e.material),null!=this.scene.environment&&ut(e,e=>this.applyEnvMap(e)),!0===e.material?.userData?.hasBloom&&(c=!0)),(e instanceof o||e instanceof i.Sprite)&&e.visible&&(e.material?.userData?.water||e.material?.uniforms&&null!=e.material?.uniforms[ae])&&isObjectInFrustum(e,u)?(this.initDepthUniform(e.material),m=!0):e instanceof X&&(e.visible=!1,E.push(e)),(e instanceof o||e instanceof i.Sprite)&&e.material?.uniforms&&null!=e.material?.uniforms[ue]&&isObjectInFrustum(e,u)&&e.material instanceof G&&this.initAoUniform(e.material),e instanceof o||e instanceof i.Sprite){let t=!1;ut(e,e=>{this.usesShaderUniform(e,de)&&(this.initSceneColorUniform(e),t=!0)}),t&&(B.push(e),g=!0)}if(e instanceof o&&e.material?.uniforms&&null!=e.material?.uniforms[ce])e.material.uniforms[ce].value=p;else if(e instanceof o&&Array.isArray(e.material))for(const t of e.material)t.uniforms&&null!=t.uniforms[ce]&&(t.uniforms[ce].value=p);if(x.has(e))for(let t=0;t<e.children.length;t++)x.add(e.children[t]);else if(Ut(e)){v.push(e);for(let t=0;t<e.children.length;t++)x.add(e.children[t])}else e instanceof o&&(M.push(e),b.push(this.getGBufferPhaseMask(e.material)))}),x.clear(),this.phasedRenderPass.enabled=v.length>0,this.bloomPass.enabled=c,!0===this.options.occlusionCulling?.enabled){for(const e of this.occlusionClusters)e.update();this.hideOccluded(U)}this.prepareUpscalingFrame(),this.renderer.setRenderTarget(this.gRenderTarget),this.renderer.clear(),this.renderDepthPrepass(),this.renderScene(Ke.opaque),this.updateRenderedOcclusionClusters(),this.renderer.render(this.queryScene,this.camera),this.aoPass.output=se.OUTPUT.Off;for(const e of this.postProcessEffects)if(e.pass.enabled&&this.usesShaderUniform(e.pass.material,ae)){m=!0;break}g&&(this.fquadCopySceneColor.material.uniforms.tDiffuse.value=this.gRenderTarget.textures[0],this.renderer.setRenderTarget(this.sceneColorRenderTarget),this.fquadCopySceneColor.render(this.renderer)),m&&(this.fquadCopySceneDepth.material.uniforms.tDepthTexture.value=this.gRenderTarget.depthTexture,this.renderer.setRenderTarget(this.sceneDepthRenderTarget),this.fquadCopySceneDepth.render(this.renderer)),(m||g)&&this.renderer.setRenderTarget(this.gRenderTarget),B.length,C.forEach(e=>e.visible=!0),E.forEach(e=>e.visible=!0),B.forEach(e=>e.visible=!0),this.aoPass.enabled,this.ssrPass&&(this.ssrPass.elapsedTime=s),this.volumetricFogPass&&d?(this.volumetricFogPass.update(this.camera,this.gRenderTarget,this.csm,this.scene),this.volumetricFogPass.enabled=!0):this.volumetricFogPass&&(this.volumetricFogPass.enabled=!1),this.updatePostProcessEffectUniforms(p);try{this.paused&&!r||!this.running||(this.render(l),this.finishUpscalingFrame(),this.showStats&&f?.endQuery(),this.showStats&&S(s)&&T(),this.renderer.info.reset(),this.renderOverlay())}catch(e){console.warn(e)}finally{this.finishUpscalingFrame(),r&&(this.needsPausedRender=!1)}a.end(),this.csm?.update(),L()};!0===this.options.enableXR?this.renderer.setAnimationLoop(H):requestAnimationFrame(H)}collectGBufferRenderables(e,t=this.frameGBufferMeshes,s=this.frameGBufferPhaseMasks,i=this.frameUnsupportedGBufferObjects){t.length=0,s.length=0,i.length=0,be(e,e=>{if(Ut(e))return i.push(e),!1;e instanceof o&&(t.push(e),s.push(this.getGBufferPhaseMask(e.material)))})}getGBufferPhaseMask(e){if(Array.isArray(e)){let t=0;for(let s=0;s<e.length;s++)t|=this.getGBufferPhaseMask(e[s]);return t}if(null==e||!1===e.visible)return 0;let t=this.gBufferPhaseMaskCache.get(e);if(null!=t)return t;if(!0===e.userData.isGBufferMaterial)return t=1<<Ke.opaque|1<<Ke.transparent,this.gBufferPhaseMaskCache.set(e,t),t;const s=this.usesShaderUniform(e,ae),a=this.usesShaderUniform(e,de),n=this.usesShaderUniform(e,ue),r=e.transparent&&e.alphaTest<=.01||e.blending===i.AdditiveBlending,o=s||a||n;return t=0,o||r||(t|=1<<Ke.opaque),(o||r)&&(t|=1<<Ke.transparent),this.gBufferPhaseMaskCache.set(e,t),t}getGBufferMaterialArray(e,t){let s=this.gBufferMaterialArrayCache.get(e);null==s&&(s={opaque:[],transparent:[]},this.gBufferMaterialArrayCache.set(e,s));const i=t===Ke.opaque?s.opaque:s.transparent;i.length=e.length;for(let s=0;s<e.length;s++)i[s]=this.createGBufferMaterial(e[s],t,!1);return i}applyGBufferMaterials(e,t=this.frameGBufferMeshes,s=this.frameGBufferPhaseMasks,i=this.frameUnsupportedGBufferObjects){const a=this.appliedGBufferMeshes,n=this.originalGBufferMaterials,r=this.originalGBufferOnBeforeRender,o=this.hiddenGBufferObjects;a.length=0,n.length=0,r.length=0,o.length=0;for(let e=0;e<i.length;e++){const t=i[e];t.visible&&(o.push(t),t.visible=!1)}const l=1<<e;for(let i=0;i<t.length;i++){const h=t[i];if(!h.visible)continue;const p=h.material;if(0!==(s[i]&l)||0!==h.children.length)if(a.push(h),n.push(p),r.push(h.onBeforeRender),0!==(s[i]&l)){if(Array.isArray(p)){const t=this.getGBufferMaterialArray(p,e);h.material=t;for(let e=0;e<t.length;e++)this.initShadowUniform(h,t[e])}else{const t=this.createGBufferMaterial(p,e,e===Ke.opaque&&this.isDepthPrepassEligibleMesh(h));h.material=t,this.initShadowUniform(h,t)}this.applyGBufferShadowUniformUpdater(h)}else h.material=st;else o.push(h),h.visible=!1}}unapplyGBufferMaterials(){const e=this.appliedGBufferMeshes;for(let t=0;t<e.length;t++){const s=e[t];s.material=this.originalGBufferMaterials[t],s.onBeforeRender=this.originalGBufferOnBeforeRender[t]}const t=this.hiddenGBufferObjects;for(let e=0;e<t.length;e++)t[e].visible=!0;e.length=0,this.originalGBufferMaterials.length=0,this.originalGBufferOnBeforeRender.length=0,t.length=0}applyGBufferShadowUniformUpdater(e){const t=e.onBeforeRender;let s=this.gBufferShadowUpdaterCache.get(e);if(null==s){const i=this,a={original:t,wrapper:null};a.wrapper=(t,s,n,r,o,l)=>{a.original.call(e,t,s,n,r,o,l),i.initShadowUniform(e,o)},s=a,this.gBufferShadowUpdaterCache.set(e,s)}s.original=t,e.onBeforeRender=s.wrapper}initTextures(e=this.scene){e.traverse(e=>{if(e instanceof o)if(Array.isArray(e.material))for(let t=0;t<e.material.length;t++)this._initMaterialTextures(e.material[t]);else this._initMaterialTextures(e.material)})}_initMaterialTextures(e){if(!this._initiatedMaterialTextures.has(e))if(this._initiatedMaterialTextures.add(e),e instanceof p){for(const[t,s]of Object.entries(e.uniforms))if(s.value instanceof u){if(this._initiatedTextures.has(s.value))continue;this._initTexture(s.value),this._initiatedTextures.add(s.value)}}else for(const[t,s]of Object.entries(e))if(s instanceof u){if(this._initiatedTextures.has(s))continue;this._initTexture(s),this._initiatedTextures.add(s)}}_initTexture(e){"webgpu-experimental"!==this._activeBackend?this.renderer.initTexture(e):this.experimentalWebGpuBackend?.initTexture(e)}async compileAsync(e=this.scene){if(this.compileInProgress)return;if("webgpu-experimental"===this.options.backend&&!this.experimentalWebGpuFailed&&e instanceof i.Scene){this.compileInProgress=!0;const t=await this.compileExperimentalWebGpu(e);if(this.compileInProgress=!1,t)return}this.renderer.setRenderTarget(this.gRenderTarget),this.compileInProgress=!0;const t=[],s=[],a=[];this.collectGBufferRenderables(e,t,s,a),this.applyGBufferMaterials(Ke.opaque,t,s,a),await this.renderer.compileAsync(e,this.camera),this.unapplyGBufferMaterials(),this.applyGBufferMaterials(Ke.transparent,t,s,a),await this.renderer.compileAsync(e,this.camera),this.unapplyGBufferMaterials(),this.isDepthPrepassEnabled()&&(this.renderer.setRenderTarget(this.gRenderTarget),this.applyDepthPrepassMaterials(),await this.renderer.compileAsync(e,this.camera),this.unapplyDepthPrepassMaterials()),e===this.scene&&(this.renderer.setRenderTarget(this.gRenderTarget),this.renderer.compileAsync(this.fquadBlendAO.mesh,this.fquadBlendAO.camera),this.renderer.setRenderTarget(this.sceneColorRenderTarget),this.renderer.compileAsync(this.fquadCopySceneColor.mesh,this.fquadCopySceneColor.camera),this.renderer.setRenderTarget(this.sceneDepthRenderTarget),this.renderer.compileAsync(this.fquadCopySceneDepth.mesh,this.fquadCopySceneDepth.camera));const n=this.csm.lights[0]?.shadow.camera;null!=n&&(this.applyDepthMaterial(),await this.renderer.compileAsync(e,n),this.unapplyDepthMaterial()),this.compileInProgress=!1,this.renderer.setRenderTarget(null)}async compileExperimentalWebGpu(t){try{if(!(t instanceof i.Scene))throw new Error("Only THREE.Scene roots are supported by the experimental renderer.");if(!ze.supportsCamera(this.camera))throw new Error(`Unsupported camera type: ${this.camera?.type??"unknown"}`);const s=this.experimentalWebGpuBackend??await e.acquireSharedExperimentalWebGpuBackend({fxaa:{contrastThreshold:.0312,relativeThreshold:.063,subpixelBlending:.75},taa:!1,...this.options.webgpuPostProcessing});this.experimentalWebGpuBackend=s,this._activeBackend="webgpu-experimental";const a=e.experimentalWebGpuPresentationView,n=a!==this;return n&&a?.disposeExperimentalStaticDrawSets(),this.applyExperimentalWebGpuViewState(n),e.experimentalWebGpuPresentationView=this,t===this.scene&&this.activateExperimentalStaticDrawSets(),await s.compile(t,this.camera),this.attachRendererDomElement(),t!==this.scene||this.experimentalWebGpuCapabilityReported||(console.info(Je(s.inspect(t,this.camera))),this.experimentalWebGpuCapabilityReported=!0),!0}catch(e){return this.disableExperimentalWebGpu(e),!1}}static async acquireSharedExperimentalWebGpuBackend(e){return null!=this.sharedExperimentalWebGpuBackend?this.sharedExperimentalWebGpuBackend:(null==this.sharedExperimentalWebGpuBackendPromise&&(this.sharedExperimentalWebGpuBackendPromise=ze.create(e).then(e=>(this.sharedExperimentalWebGpuBackend=e,e)).finally(()=>{this.sharedExperimentalWebGpuBackendPromise=null})),this.sharedExperimentalWebGpuBackendPromise)}applyExperimentalWebGpuViewState(e){const t=this.experimentalWebGpuBackend;null!=t&&(e&&t.resetViewHistory(),t.setDynamicBatchingEnabled(this.experimentalWebGpuDynamicBatchingEnabled),t.setEnableOutlines(!0===this.outlinePass?.enabled),t.setSelectedObjects(this.outlinePass?.selectedObjects??[]),t.setSelectedObjectInstances(this.experimentalWebGpuSelectedObjectInstances),this.syncExperimentalWebGpuPostProcessEffects(),t.setProfilingEnabled(this._showStats),t.setWorldEnvironment(this.worldEnvironment),t.setSize(this.container.clientWidth,this.container.clientHeight,this.getRenderPixelRatio()))}applyDepthMaterial(){const e=this.depthMaterialCachedMaterials;e.clear(),this.scene.traverse(t=>{(t.isMesh||t.isPoints||t.isLine||t.isSprite)&&(this.initCustomDepthMaterial(t),e.set(t,t.material),t.castShadow?null!=t.customDepthMaterial?t.material=t.customDepthMaterial:t.material=It:t.material=null)})}unapplyDepthMaterial(){this.depthMaterialCachedMaterials.forEach((e,t)=>{t.material=e})}renderScene(e){if(!this.running||this.paused&&!this.needsPausedRender)return;if(this.compileInProgress)return void console.error("Compile in progress, skipping render");this.applyGBufferMaterials(e);const t=this.scene.matrixWorldAutoUpdate,s=this.scene.matrixAutoUpdate,i=this.renderer.shadowMap.autoUpdate;e!==Ke.opaque&&(this.renderer.shadowMap.autoUpdate=!1,this.scene.matrixWorldAutoUpdate=!1,this.scene.matrixAutoUpdate=!1);try{this.renderer.render(this.scene,this.camera)}catch(e){console.warn("Render failed",e)}if(e===Ke.opaque){const e=this.appliedGBufferMeshes;for(let t=0;t<e.length;t++){const s=e[t],i=this.originalGBufferMaterials[t];!Array.isArray(i)&&!Array.isArray(s.material)&&i instanceof p&&this.updateLightUniformValues(s.material,i)}}this.unapplyGBufferMaterials(),this.renderer.shadowMap.autoUpdate=i,this.scene.matrixWorldAutoUpdate=t,this.scene.matrixAutoUpdate=s}getEnvTexture(e){if(e.mapping===i.CubeUVReflectionMapping)return e;null==this.pmremGenerator&&(this.pmremGenerator=new i.PMREMGenerator(this.renderer),this.pmremGenerator.compileEquirectangularShader());let t=this.pmremGeneratorResults.get(e);return null==t&&(t=this.pmremGenerator.fromEquirectangular(e).texture,this.pmremGeneratorResults.set(e,t)),t}applyPostProcessSettings(){if(0==this.postProcessVolumes.length)return this.experimentalWebGpuBackend?.setPostProcessState(null),"webgpu-experimental"===this._activeBackend?this.experimentalWebGpuBackend?.setWorldEnvironment(this.worldEnvironment):this.applyWorldEnvironmentToWebGl(),this.lutPass.enabled=!1,this.colorPass.enabled=!1,this.dofPass.enabled=!1,this.renderer.toneMapping=this.baseToneMapping,void(this.renderer.toneMappingExposure=this.baseToneMappingExposure);!function(e,t=i.NoToneMapping,s=1){e.tonemapMapping=t,e.tonemapExposure=s,e.envIntensity=1,e.envTexture=void 0,e.vignetteIntensity=0,e.colorTint=e.colorTint??new i.Color("white"),e.colorTint.set("white"),e.colorTintIntensity=0,e.depthFocus=void 0,e.depthAperture=void 0,e.depthMaxBlur=void 0,e.temperature=6500,e.temperatureTint=0,e.globalSaturation=gt(e.globalSaturation,1,1,1),e.globalContrast=gt(e.globalContrast,1,1,1),e.globalGamma=gt(e.globalGamma,1,1,1),e.globalGain=gt(e.globalGain,1,1,1),e.globalOffset=gt(e.globalOffset,0,0,0),e.shadowsSaturation=gt(e.shadowsSaturation,1,1,1),e.shadowsContrast=gt(e.shadowsContrast,1,1,1),e.shadowsGamma=gt(e.shadowsGamma,1,1,1),e.shadowsGain=gt(e.shadowsGain,1,1,1),e.shadowsOffset=gt(e.shadowsOffset,0,0,0),e.shadowsMax=.09,e.midtonesSaturation=gt(e.midtonesSaturation,1,1,1),e.midtonesContrast=gt(e.midtonesContrast,1,1,1),e.midtonesGamma=gt(e.midtonesGamma,1,1,1),e.midtonesGain=gt(e.midtonesGain,1,1,1),e.midtonesOffset=gt(e.midtonesOffset,0,0,0),e.highlightsSaturation=gt(e.highlightsSaturation,1,1,1),e.highlightsContrast=gt(e.highlightsContrast,1,1,1),e.highlightsGamma=gt(e.highlightsGamma,1,1,1),e.highlightsGain=gt(e.highlightsGain,1,1,1),e.highlightsOffset=gt(e.highlightsOffset,0,0,0),e.highlightsMin=.5,e.lut=void 0,e.lutIntensity=0}(this.postProcessSettings,this.baseToneMapping,this.baseToneMappingExposure);const e=this.postProcessSettings;null!=this.worldEnvironment&&(e.envTexture=this.worldEnvironment.source,e.envIntensity=this.worldEnvironment.intensity);let t,s=!1;if(null==this.camera)return;const a=this.camera.getWorldPosition(yt);let n=[];for(const r of this.postProcessVolumes){if(!pt(r.object))continue;let o=r.blendWeight??1;const l=r.distanceToPoint(a);l>r.blendRadius||(r.blendRadius>0&&(o*=ve(1-l/r.blendRadius,0,1)),o>1&&(o=1),o>0&&(n.push(r),void 0!==r.settings.tonemapMapping&&(e.tonemapMapping=r.settings.tonemapMapping),void 0!==r.settings.tonemapExposure&&(e.tonemapExposure=i.MathUtils.lerp(e.tonemapExposure,r.settings.tonemapExposure,o)),void 0!==r.settings.envTexture&&(e.envTexture=r.settings.envTexture),void 0!==r.settings.envIntensity&&(e.envIntensity=i.MathUtils.lerp(e.envIntensity,r.settings.envIntensity,o)),void 0!==r.settings.vignetteIntensity&&(e.vignetteIntensity=i.MathUtils.lerp(e.vignetteIntensity,r.settings.vignetteIntensity,o)),void 0!==r.settings.colorTint&&void 0!==r.settings.colorTintIntensity&&r.settings.colorTintIntensity>0&&(e.colorTint=e.colorTint.lerp(r.settings.colorTint,o)),void 0!==r.settings.colorTintIntensity&&(e.colorTintIntensity=i.MathUtils.lerp(e.colorTintIntensity,r.settings.colorTintIntensity,o)),void 0!==r.settings.depthFocus&&(s=!0,e.depthFocus=void 0!==e.depthFocus?i.MathUtils.lerp(e.depthFocus,r.settings.depthFocus,o):r.settings.depthFocus),void 0!==r.settings.depthAperture&&(s=!0,e.depthAperture=void 0!==e.depthAperture?i.MathUtils.lerp(e.depthAperture,r.settings.depthAperture,o):r.settings.depthAperture),void 0!==r.settings.depthMaxBlur&&(s=!0,e.depthMaxBlur=void 0!==e.depthMaxBlur?i.MathUtils.lerp(e.depthMaxBlur,r.settings.depthMaxBlur,o):r.settings.depthMaxBlur),void 0!==r.settings.temperature&&(e.temperature=i.MathUtils.lerp(e.temperature,r.settings.temperature,o)),void 0!==r.settings.temperatureTint&&(e.temperatureTint=i.MathUtils.lerp(e.temperatureTint,r.settings.temperatureTint,o)),void 0!==r.settings.globalSaturation&&e.globalSaturation.lerp(r.settings.globalSaturation,o),void 0!==r.settings.globalContrast&&e.globalContrast.lerp(r.settings.globalContrast,o),void 0!==r.settings.globalGamma&&e.globalGamma.lerp(r.settings.globalGamma,o),void 0!==r.settings.globalGain&&e.globalGain.lerp(r.settings.globalGain,o),void 0!==r.settings.globalOffset&&e.globalOffset.lerp(r.settings.globalOffset,o),void 0!==r.settings.shadowsSaturation&&e.shadowsSaturation.lerp(r.settings.shadowsSaturation,o),void 0!==r.settings.shadowsContrast&&e.shadowsContrast.lerp(r.settings.shadowsContrast,o),void 0!==r.settings.shadowsGamma&&e.shadowsGamma.lerp(r.settings.shadowsGamma,o),void 0!==r.settings.shadowsGain&&e.shadowsGain.lerp(r.settings.shadowsGain,o),void 0!==r.settings.shadowsOffset&&e.shadowsOffset.lerp(r.settings.shadowsOffset,o),void 0!==r.settings.shadowsMax&&(e.shadowsMax=i.MathUtils.lerp(e.shadowsMax,r.settings.shadowsMax,o)),void 0!==r.settings.midtonesSaturation&&e.midtonesSaturation.lerp(r.settings.midtonesSaturation,o),void 0!==r.settings.midtonesContrast&&e.midtonesContrast.lerp(r.settings.midtonesContrast,o),void 0!==r.settings.midtonesGamma&&e.midtonesGamma.lerp(r.settings.midtonesGamma,o),void 0!==r.settings.midtonesGain&&e.midtonesGain.lerp(r.settings.midtonesGain,o),void 0!==r.settings.midtonesOffset&&e.midtonesOffset.lerp(r.settings.midtonesOffset,o),void 0!==r.settings.highlightsSaturation&&e.highlightsSaturation.lerp(r.settings.highlightsSaturation,o),void 0!==r.settings.highlightsContrast&&e.highlightsContrast.lerp(r.settings.highlightsContrast,o),void 0!==r.settings.highlightsGamma&&e.highlightsGamma.lerp(r.settings.highlightsGamma,o),void 0!==r.settings.highlightsGain&&e.highlightsGain.lerp(r.settings.highlightsGain,o),void 0!==r.settings.highlightsOffset&&e.highlightsOffset.lerp(r.settings.highlightsOffset,o),void 0!==r.settings.highlightsMin&&(e.highlightsMin=i.MathUtils.lerp(e.highlightsMin,r.settings.highlightsMin,o)),void 0!==r.settings.lut&&(t=r.settings.lut),void 0!==r.settings.lutIntensity&&(e.lutIntensity=i.MathUtils.lerp(e.lutIntensity,r.settings.lutIntensity,o))))}if(0===n.length)return this.experimentalWebGpuBackend?.setPostProcessState(null),"webgpu-experimental"===this._activeBackend?this.experimentalWebGpuBackend?.setWorldEnvironment(this.worldEnvironment):this.applyWorldEnvironmentToWebGl(),this.lutPass.enabled=!1,this.colorPass.enabled=!1,this.dofPass.enabled=!1,this.renderer.toneMapping=this.baseToneMapping,void(this.renderer.toneMappingExposure=this.baseToneMappingExposure);if("webgpu-experimental"===this._activeBackend){const t=vt(St,e.temperature,e.temperatureTint),i=e=>[e.x,e.y,e.z],a=n.some(e=>{return void 0!==(t=e.settings).tonemapMapping||void 0!==t.tonemapExposure||void 0!==t.vignetteIntensity||void 0!==t.colorTintIntensity||void 0!==t.temperature||void 0!==t.temperatureTint||void 0!==t.globalSaturation||void 0!==t.globalContrast||void 0!==t.globalGamma||void 0!==t.globalGain||void 0!==t.globalOffset||void 0!==t.shadowsSaturation||void 0!==t.shadowsContrast||void 0!==t.shadowsGamma||void 0!==t.shadowsGain||void 0!==t.shadowsOffset||void 0!==t.shadowsMax||void 0!==t.midtonesSaturation||void 0!==t.midtonesContrast||void 0!==t.midtonesGamma||void 0!==t.midtonesGain||void 0!==t.midtonesOffset||void 0!==t.highlightsSaturation||void 0!==t.highlightsContrast||void 0!==t.highlightsGamma||void 0!==t.highlightsGain||void 0!==t.highlightsOffset||void 0!==t.highlightsMin;var t}),r=n.some(e=>void 0!==e.settings.tonemapMapping||void 0!==e.settings.tonemapExposure);return this.experimentalWebGpuBackend?.setPostProcessState({enabled:a,exposure:r?e.tonemapExposure:1,toneMapping:r?Mt(e.tonemapMapping):"none",vignetteIntensity:e.vignetteIntensity,whiteBalance:i(t),tint:[e.colorTint.r,e.colorTint.g,e.colorTint.b],tintIntensity:e.colorTintIntensity,saturation:i(e.globalSaturation),contrast:i(e.globalContrast),gamma:i(e.globalGamma),gain:i(e.globalGain),offset:i(e.globalOffset),shadows:{saturation:i(e.shadowsSaturation),contrast:i(e.shadowsContrast),gamma:i(e.shadowsGamma),gain:i(e.shadowsGain),offset:i(e.shadowsOffset)},midtones:{saturation:i(e.midtonesSaturation),contrast:i(e.midtonesContrast),gamma:i(e.midtonesGamma),gain:i(e.midtonesGain),offset:i(e.midtonesOffset)},highlights:{saturation:i(e.highlightsSaturation),contrast:i(e.highlightsContrast),gamma:i(e.highlightsGamma),gain:i(e.highlightsGain),offset:i(e.highlightsOffset)},shadowsMax:e.shadowsMax,highlightsMin:e.highlightsMin,depthFocus:s?e.depthFocus:void 0,depthAperture:s?e.depthAperture:void 0,depthMaxBlur:s?e.depthMaxBlur:void 0}),void this.experimentalWebGpuBackend?.setWorldEnvironment(null!=e.envTexture?{source:e.envTexture,intensity:e.envIntensity}:this.worldEnvironment)}const r=e.vignetteIntensity>Pt,o=(h=e.temperature,p=e.temperatureTint,!xt(h,6500)||!xt(p,0));var h,p;const c=(u=e.colorTint,e.colorTintIntensity>Pt&&(!xt(u.r,1)||!xt(u.g,1)||!xt(u.b,1)));var u;const d=!(bt((m=e).globalSaturation,1,1,1)&&bt(m.globalContrast,1,1,1)&&bt(m.globalGamma,1,1,1)&&bt(m.globalGain,1,1,1)&&bt(m.globalOffset,0,0,0)&&bt(m.shadowsSaturation,1,1,1)&&bt(m.shadowsContrast,1,1,1)&&bt(m.shadowsGamma,1,1,1)&&bt(m.shadowsGain,1,1,1)&&bt(m.shadowsOffset,0,0,0)&&bt(m.midtonesSaturation,1,1,1)&&bt(m.midtonesContrast,1,1,1)&&bt(m.midtonesGamma,1,1,1)&&bt(m.midtonesGain,1,1,1)&&bt(m.midtonesOffset,0,0,0)&&bt(m.highlightsSaturation,1,1,1)&&bt(m.highlightsContrast,1,1,1)&&bt(m.highlightsGamma,1,1,1)&&bt(m.highlightsGain,1,1,1)&&bt(m.highlightsOffset,0,0,0));var m;const f=o||c||d||r,g=f&&e.tonemapMapping!==i.NoToneMapping,M=null!=t&&e.lutIntensity>Pt;f?(this.renderer.toneMapping=i.NoToneMapping,this.renderer.toneMappingExposure=1):(this.renderer.toneMapping=e.tonemapMapping,this.renderer.toneMappingExposure=e.tonemapExposure),null!=e.envTexture&&(this.scene.environment=this.getEnvTexture(e.envTexture)),this.scene.environmentIntensity=e.envIntensity,f?(this.colorPass.whiteBalanceEnabled=o,this.colorPass.whiteBalanceScale=o?vt(St,e.temperature,e.temperatureTint):St.set(1,1,1),this.colorPass.vignetteIntensity=e.vignetteIntensity,this.colorPass.vignetteEnabled=r,this.colorPass.colorTintEnabled=c,this.colorPass.colorTint=e.colorTint,this.colorPass.colorTintIntensity=e.colorTintIntensity,this.colorPass.colorGradingEnabled=d,this.colorPass.toneMapping=e.tonemapMapping,this.colorPass.toneMappingEnabled=g,this.colorPass.toneMappingExposure=e.tonemapExposure,this.colorPass.globalSaturation=e.globalSaturation,this.colorPass.globalContrast=e.globalContrast,this.colorPass.globalGamma=e.globalGamma,this.colorPass.globalGain=e.globalGain,this.colorPass.globalOffset=e.globalOffset,this.colorPass.shadowsSaturation=e.shadowsSaturation,this.colorPass.shadowsContrast=e.shadowsContrast,this.colorPass.shadowsGamma=e.shadowsGamma,this.colorPass.shadowsGain=e.shadowsGain,this.colorPass.shadowsOffset=e.shadowsOffset,this.colorPass.shadowsMax=e.shadowsMax,this.colorPass.midtonesSaturation=e.midtonesSaturation,this.colorPass.midtonesContrast=e.midtonesContrast,this.colorPass.midtonesGamma=e.midtonesGamma,this.colorPass.midtonesGain=e.midtonesGain,this.colorPass.midtonesOffset=e.midtonesOffset,this.colorPass.highlightsSaturation=e.highlightsSaturation,this.colorPass.highlightsContrast=e.highlightsContrast,this.colorPass.highlightsGamma=e.highlightsGamma,this.colorPass.highlightsGain=e.highlightsGain,this.colorPass.highlightsOffset=e.highlightsOffset,this.colorPass.highlightsMin=e.highlightsMin,this.colorPass.enabled=!0):this.colorPass.enabled=!1,s&&this.camera instanceof l?(this.dofPass.enabled=!0,void 0!==e.depthFocus&&(this.dofPass.uniforms.focus.value=e.depthFocus),void 0!==e.depthAperture&&(this.dofPass.uniforms.aperture.value=e.depthAperture),void 0!==e.depthMaxBlur&&(this.dofPass.uniforms.maxblur.value=e.depthMaxBlur)):this.dofPass.enabled=!1,this.lutPass.enabled=M,M&&(null!=t&&(t.flipY=!0,t.generateMipmaps=!1),this.lutPass.lut=t,this.lutPass.intensity=e.lutIntensity)}updatePostProcessEffectUniforms(e){if(0===this.postProcessEffects.length)return;const t=this.postProcessEffectUniformState;t.aoEnabled=this.aoPass.enabled,t.aoTexture=this.aoPass.enabled?this.aoPass.pdRenderTarget.texture:null,this.camera instanceof l?(t.cameraNear=this.camera.near,t.cameraFar=this.camera.far):(t.cameraNear=void 0,t.cameraFar=void 0),t.depthTexture=this.sceneDepthRenderTarget.texture,t.normalTexture=this.gRenderTarget.textures[2],t.resolution.set(this.gRenderTarget.width,this.gRenderTarget.height),t.simulationTime=e;for(const e of this.postProcessEffects)e.pass.updateUniformState(t)}renderOverlay(){if(!this.running)return;if(0===this.overlayCameras.size)return;const e=Array.from(this.overlayCameras.values()).slice(0,this.maxInsetCameras),t=this.previousClientWith/2,s=e.length*this.insetWidth+(e.length-1)*this.insetMargin;for(let i=0;i<e.length;i++)this.renderer.clearDepth(),this.renderer.setViewport(t-s/2+this.insetWidth*i+this.insetMargin*i,this.insetOffsetY,this.insetWidth,this.insetHeight),this.renderer.render(this.scene,e[i])}addOverlayCamera(e){this.overlayCameras.add(e)}clearOverlayCameras(){this.overlayCameras.clear()}removeOverlayCamera(e){this.overlayCameras.delete(e)}render(e){if("webgpu-experimental"===this._activeBackend){const e=this.experimentalWebGpuBackend;return void(null!=e&&ze.supportsCamera(this.camera)&&(this.syncExperimentalWebGpuCascades(),e.render(this.scene,this.camera,this.simulationTime)))}if(0===this.composer.renderTarget1.width||0===this.composer.renderTarget1.height)return;if(0===this.composer.renderTarget2.width||0===this.composer.renderTarget2.height)return;let t=!1;if(this.ssrPass.enabled&&!1!==this.options?.reflection?.enabled){const e=this.ssrPass.selects??[];e.length=0,this.scene.traverseVisible(t=>{t instanceof o&&!0===t.material.userData?.reflective&&isObjectInFrustum(t,dt)&&e.push(t)}),this.ssrPass.selects=e,0==e.length&&(this.ssrPass.enabled=!1),t=!0}this.options.bloom,this.composer.render(e),this.scene.matrixWorldAutoUpdate=!0,this.scene.matrixAutoUpdate=!0,t&&(this.ssrPass.enabled=!0)}hasBloom(){return null!=Me(this.scene,e=>e instanceof o&&!0===e.material?.userData?.hasBloom)}darkenNonBloomed(e){if((e instanceof o||e instanceof i.Sprite||e instanceof i.Line)&&e.visible&&(null==e.material.userData||!0!==e.material.userData.hasBloom)){if(e.material?.id===Xe.id)return;this.bloomStoredMaterials[e.uuid]=e.material,!0!==e.material.transparent?e.material=Xe:(e.visible=!1,this.bloomHidden.push(e))}else"TransformControlsPlane"!==e.type&&"TransformControlsGizmo"!==e.type||(e.visible=!1,this.bloomHidden.push(e))}restoreMaterial(e){this.bloomStoredMaterials[e.uuid]&&(e.material=this.bloomStoredMaterials[e.uuid],delete this.bloomStoredMaterials[e.uuid],e.visible=!0)}initSceneColorUniform(e){if(e instanceof p)return null==e.uniforms[de]?(e.uniforms[de]={value:this.sceneColorRenderTarget.texture},void(e.uniformsNeedUpdate=!0)):void(e.uniforms[de].value!==this.sceneColorRenderTarget.texture&&(e.uniforms[de].value=this.sceneColorRenderTarget.texture,e.uniformsNeedUpdate=!0))}initDepthUniform(e){e instanceof p&&(e.uniforms[ae].value=this.sceneDepthRenderTarget.texture,this.camera instanceof l&&(null!=e.uniforms[re]&&(e.uniforms[re].value=this.camera.near),null!=e.uniforms[ne]&&(e.uniforms[ne].value=this.camera.far)))}initNormalUniform(e){e instanceof p&&null!=e.uniforms[le]&&(e.uniforms[le].value=this.gRenderTarget.textures[2])}initShadowUniform(e,t){t instanceof G&&(t.uniforms.receiveShadow?t.uniforms.receiveShadow.value=e.receiveShadow:t.uniforms.receiveShadow={value:e.receiveShadow})}initLightVolumeUniform(e){e instanceof G&&(null!=this.lightVolume?null==e.uniforms.uSH?(e.defines.USE_LIGHT_PROBE_VOLUME="",e.uniforms.gridOrigin={value:this.lightVolume.gridOrigin},e.uniforms.gridSize={value:this.lightVolume.gridSize},e.uniforms.gridRes={value:this.lightVolume.gridResolution},e.uniforms.giIntensity={value:this.lightProbeIntensity},e.uniforms.uSH={value:this.lightVolume.shTexture},e.uniformsNeedUpdate=!0,e.needsUpdate=!0):e.uniforms.giIntensity.value=this.lightProbeIntensity:null!=e.uniforms.uSH&&(delete e.defines.USE_LIGHT_PROBE_VOLUME,delete e.uniforms.gridOrigin,delete e.uniforms.gridSize,delete e.uniforms.gridRes,delete e.uniforms.giIntensity,delete e.uniforms.uSH,e.uniformsNeedUpdate=!0,e.needsUpdate=!0))}initResolutionUniform(e){e instanceof p&&null!=e.uniforms[oe]&&e.uniforms[oe].value.set(this.gRenderTarget.width,this.gRenderTarget.height)}initAoUniform(e){if(this.aoPass.enabled){e.uniforms[ue].value=this.aoPass.pdRenderTarget.texture,null==e.defines.USE_SSAO_MAP&&(e.defines.USE_SSAO_MAP="",e.needsUpdate=!0),e.defines.USE_SSAO_MAP="";const t=this.tbufferMaterialCache.get(e);null!=t&&this.initAoUniform(t)}else if(null!=e.defines.USE_SSAO_MAP){delete e.defines.USE_SSAO_MAP,e.needsUpdate=!0;const t=this.tbufferMaterialCache.get(e);null!=t&&this.initAoUniform(t)}}initCustomDepthMaterial(e){if(null!=e.customDepthMaterial||!e.castShadow)return;const t=e.material;if(!(t instanceof G&&t.depthWrite&&t.alphaTest>0))return;let s=this._customDepthMaterialCache.get(t);if(null==s){const e=We(Ue);let i;null!=t.alphaTest&&t.alphaTest>0&&null!=t.outputOpacity&&(i=t.outputOpacity.lt(t.alphaTest)),s=new G({color:e,discard:i}),this._customDepthMaterialCache.set(t,s)}e.customDepthMaterial=s}};lt.activeView=null,lt.sharedExperimentalWebGpuBackend=null,lt.sharedExperimentalWebGpuBackendPromise=null,lt.experimentalWebGpuPresentationView=null,lt=e=t([ie(),s("design:paramtypes",[HTMLElement,Object])],lt);export{lt as RenderingView};export function setRenderingPaused(e){null!=window.editor?.viewer?.renderingView&&(window.editor.viewer.renderingView.paused=e)}const ht=.05;function pt(e){let t=e;for(;t;){if(!1===t.visible)return!1;t=t.parent}return!0}function ct(e,t){return e.priority!==t.priority?e.priority-t.priority:e.id-t.id}function ut(e,t){if(Array.isArray(e.material))for(const s of e.material)t(s);else null!=e.material&&t(e.material)}se.prototype.overrideVisibility=function(){const e=this.scene,t=this._visibilityCache;e.traverse(function(e){if(t.set(e,e.visible),(e.isPoints||e.isLine||e.isTransformControls||e.isSprite)&&(e.visible=!1),null!=e.material){let t=!1,s=!1;if(Array.isArray(e.material)){for(const s of e.material)if(null!=s.alphaTest&&s.alphaTest>0){t=!0;break}}else null!=e.material.alphaTest&&e.material.alphaTest>0?t=!0:!0===e.material.userData.isDecal&&(s=!0);s&&(e.visible=!1)}})};new i.Box3;const dt=new i.Frustum,mt=new i.Box3,ft=new i.Matrix4;export function isObjectInFrustum(e,t){const s=mt.setFromObject(e);return t.intersectsBox(s)}function gt(e,t,s,a){return null==e?new i.Vector3(t,s,a):e.set(t,s,a)}function Mt(e){switch(e){case i.LinearToneMapping:return"linear";case i.ReinhardToneMapping:return"reinhard";case i.CineonToneMapping:return"cineon";case i.ACESFilmicToneMapping:return"aces";case i.AgXToneMapping:return"agx";case i.NeutralToneMapping:return"neutral";default:return"none"}}function bt(e,t,s,i){return null!=e&&xt(e.x,t)&&xt(e.y,s)&&xt(e.z,i)}function vt(e,t,s){const i=function(e){const t=ve(e,1e3,4e4)/100,s=t<=66?1:ve(1.292936186062745*Math.pow(t-60,-.1332047592),0,1),i=ve(t<=66?.3900815787690196*Math.log(t)-.6318414437886275:1.129890860895294*Math.pow(t-60,-.0755148492),0,1),a=t>=66?1:t<=19?0:ve(.5432067891101962*Math.log(t-10)-1.19625408914,0,1);return Tt.set(s,i,a)}(t),a=1+.2*ve(s,-1,1),n=i.x,r=i.y*a,o=i.z,l=Math.max(r,1e-4);return e.set(1/Math.max(n/l,1e-4),1/Math.max(r/l,1e-4),1/Math.max(o/l,1e-4)),e}function xt(e,t,s=Pt){return Math.abs(e-t)<=s}function wt(e,t){return null!=e&&Number.isFinite(e)&&e>0?e:t}const Pt=1e-4,yt=new i.Vector3,St=new i.Vector3(1,1,1),Tt=new i.Vector3(1,1,1);const Rt=new r,Gt=new d;function Ct(e,t,s=new i.Matrix3){return Gt.copy(e),Gt.x*=-1,Gt.y*=-1,Gt.z*=-1,t.isCubeTexture&&!1===t.isRenderTargetTexture&&(Gt.y*=-1,Gt.z*=-1),s.setFromMatrix4(Rt.makeRotationFromEuler(Gt))}const Et=new G({outputs:[V(0,0,0,0),V(0,0,0,0),D(O("white"),ke(4))],transparent:!0}),Bt=new i.MeshBasicMaterial({color:"blue",transparent:!0,opacity:.5});Et.depthWrite=!1;new o(new i.BoxGeometry(4,4,4),Bt);function Ut(e){return e instanceof i.Sprite||e.isPoints||e.isTransformControls||e.isTransformControlsGizmo||e instanceof o&&Wt(e,e.material)}function Wt(e,t){return null==t||(Array.isArray(t)?t.some(t=>Wt(e,t)):t instanceof i.RawShaderMaterial||t instanceof i.ShaderMaterial&&!(t instanceof G))}class At extends je{constructor(e,t,s){super(),this.scene=e,this.camera=t,this.gRenderTarget=s,this.cachedVisibility=[],this.toRender=[],this.needsSwap=!1}render(e,t,s,i,a){const n=e.autoClear;e.autoClear=!1;const r=this.scene.matrixWorldAutoUpdate,l=this.scene.matrixAutoUpdate,h=e.shadowMap.autoUpdate;this.scene.matrixAutoUpdate=!1,e.shadowMap.autoUpdate=!1;const p=s.depthTexture;s.depthTexture=this.gRenderTarget.depthTexture,e.setRenderTarget(s),this.cachedVisibility.length=0;let c=0,u=this.toRender;if(u.length=0,this.scene.traverseVisible(e=>{const t=Ut(e);e instanceof o&&!t?(this.cachedVisibility.push(e),e.visible=!1):t&&(c++,u.push(e))}),c>0)for(const t of u)e.render(t,this.camera);this.cachedVisibility.forEach((e,t)=>{e.visible=!0}),e.setRenderTarget(null),e.autoClear=n,s.depthTexture=p,this.scene.matrixWorldAutoUpdate=r,this.scene.matrixAutoUpdate=l,e.shadowMap.autoUpdate=h}}class Ot extends je{constructor(e){super(),this.fn=e}render(e,t,s,i,a){this.fn(e,t,s,i,a)}}const Dt=["ambientLightColor","cameraNear","directionalLightShadows","directionalLights","directionalShadowMap","directionalShadowMatrix","fogColor","fogDensity","fogFar","fogNear","hemisphereLights","lightProbe","ltc_1","ltc_2","pointLightShadows","pointLights","pointShadowMap","pointShadowMatrix","rectAreaLights","shadowFar","spotLightMap","spotLightMatrix","spotLightShadows","spotLights","spotShadowMap"],Ft=["directionalShadowMap","directionalShadowMatrix","pointLightShadows","pointShadowMap","pointShadowMatrix","spotLightShadows","spotShadowMap"],kt=B("fogColor");export class FogNode extends q{constructor(e,t=kt){super(),this.source=e,this.fogColor=t}compile(e){const t=e.variable(),s=e.get(this.source.rgb),i=e.get(this.source.a),a=e.get(this.fogColor),n=e.get(E("fogFar")),r=e.get(E("fogNear")),o=e.get(E("fogDensity")),l=e.get(k(F.mvPosition.z));return{pars:"\n ",chunk:`\n #ifdef FOG_EXP2\n float fogFactor_${t} = 1.0 - exp( - ${o} * ${o} * ${l} * ${l} );\n #else\n float fogFactor_${t} = smoothstep( ${r}, ${n}, ${l} );\n #endif\n vec4 color_vec4_${t} = vec4(mix(${s}, ${a}, fogFactor_${t}), ${i});\n `,out:`color_vec4_${t}`}}}const It=new i.MeshDepthMaterial({depthPacking:i.RGBADepthPacking});/*
2
2
  * Copyright (©) 2026 Hology Interactive AB. All rights reserved.
3
3
  * See the LICENSE.md file for details.
4
4
  */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hology/core",
3
- "version": "0.0.228",
3
+ "version": "0.0.229",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",