@hology/core 0.0.210 → 0.0.212
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.
- package/dist/effects/sequence/sequence-player.js +1 -1
- package/dist/effects/vfx/initializsers.d.ts +8 -1
- package/dist/effects/vfx/initializsers.js +1 -1
- package/dist/effects/vfx/vfx-collision-behaviour.js +1 -1
- package/dist/effects/vfx/vfx-defs.d.ts +10 -1
- package/dist/effects/vfx/vfx-defs.js +1 -1
- package/dist/effects/vfx/vfx-materializer.js +1 -1
- package/dist/effects/vfx/vfx-renderers.d.ts +1 -0
- package/dist/effects/vfx/vfx-renderers.js +1 -1
- package/dist/gameplay/actors/actor.d.ts +23 -1
- package/dist/gameplay/actors/actor.js +1 -1
- package/dist/gameplay/actors/builtin/components/character/character-animation.js +1 -1
- package/dist/gameplay/actors/builtin/components/character/character-movement-like.d.ts +23 -0
- package/dist/gameplay/actors/builtin/components/character/character-movement-like.js +4 -0
- package/dist/gameplay/actors/builtin/components/character/character-movement-policy.d.ts +26 -0
- package/dist/gameplay/actors/builtin/components/character/character-movement-policy.js +4 -0
- package/dist/gameplay/actors/builtin/components/character/character-movement.d.ts +145 -55
- package/dist/gameplay/actors/builtin/components/character/character-movement.js +1 -1
- package/dist/gameplay/actors/builtin/components/character/net-character-movement-protocol.d.ts +125 -0
- package/dist/gameplay/actors/builtin/components/character/net-character-movement-protocol.js +4 -0
- package/dist/gameplay/actors/builtin/components/character/old-character-movement.d.ts +100 -0
- package/dist/gameplay/actors/builtin/components/character/old-character-movement.js +4 -0
- package/dist/gameplay/actors/builtin/components/index.d.ts +2 -0
- package/dist/gameplay/actors/builtin/components/index.js +1 -1
- package/dist/gameplay/actors/builtin/navmesh-actor.js +1 -1
- package/dist/gameplay/actors/camera/third-person-camera-component.d.ts +3 -0
- package/dist/gameplay/actors/camera/third-person-camera-component.js +1 -1
- package/dist/gameplay/actors/component.js +1 -1
- package/dist/gameplay/actors/controller/actor-controller.d.ts +16 -0
- package/dist/gameplay/actors/controller/actor-controller.js +4 -0
- package/dist/gameplay/actors/factory.d.ts +3 -0
- package/dist/gameplay/actors/factory.js +1 -1
- package/dist/gameplay/actors/index.d.ts +4 -0
- package/dist/gameplay/actors/index.js +1 -1
- package/dist/gameplay/actors/internal/component-init.js +1 -1
- package/dist/gameplay/ai/behavior-tree/move.d.ts +2 -2
- package/dist/gameplay/index.d.ts +3 -1
- package/dist/gameplay/index.js +1 -1
- package/dist/gameplay/initiate.d.ts +4 -0
- package/dist/gameplay/initiate.js +1 -1
- package/dist/gameplay/net/browser/index.d.ts +147 -0
- package/dist/gameplay/net/browser/index.js +4 -0
- package/dist/gameplay/net/index.d.ts +7 -0
- package/dist/gameplay/net/index.js +4 -0
- package/dist/gameplay/net/net-connection.d.ts +25 -0
- package/dist/gameplay/net/net-connection.js +4 -0
- package/dist/gameplay/net/net-session.d.ts +70 -0
- package/dist/gameplay/net/net-session.js +4 -0
- package/dist/gameplay/net/service/net-actor-role.d.ts +12 -0
- package/dist/gameplay/net/service/net-actor-role.js +4 -0
- package/dist/gameplay/net/service/net-decorator.d.ts +29 -0
- package/dist/gameplay/net/service/net-decorator.js +4 -0
- package/dist/gameplay/net/service/net-serializer.d.ts +15 -0
- package/dist/gameplay/net/service/net-serializer.js +4 -0
- package/dist/gameplay/net/service/net-service.d.ts +171 -0
- package/dist/gameplay/net/service/net-service.js +4 -0
- package/dist/gameplay/net/service/net-utils.d.ts +8 -0
- package/dist/gameplay/net/service/net-utils.js +4 -0
- package/dist/gameplay/net/service/replication.d.ts +31 -0
- package/dist/gameplay/net/service/replication.js +4 -0
- package/dist/gameplay/net/service/rpc-decorator.d.ts +21 -0
- package/dist/gameplay/net/service/rpc-decorator.js +4 -0
- package/dist/gameplay/net/service/rpc.d.ts +35 -0
- package/dist/gameplay/net/service/rpc.js +4 -0
- package/dist/gameplay/services/asset-loader.d.ts +3 -2
- package/dist/gameplay/services/asset-loader.js +1 -1
- package/dist/gameplay/services/physics/abstract-physics-system.d.ts +1 -1
- package/dist/gameplay/services/physics/physics-system.d.ts +4 -2
- package/dist/gameplay/services/physics/physics-system.js +1 -1
- package/dist/gameplay/services/world.d.ts +13 -2
- package/dist/gameplay/services/world.js +1 -1
- package/dist/rendering/color-pass.js +1 -1
- package/dist/rendering.d.ts +2 -0
- package/dist/rendering.js +1 -1
- package/dist/scene/asset-resource-loader.js +1 -1
- package/dist/scene/batched-mesh-2.d.ts +9 -0
- package/dist/scene/batched-mesh-2.js +1 -1
- package/dist/scene/bootstrap.d.ts +2 -0
- package/dist/scene/bootstrap.js +1 -1
- package/dist/scene/custom-param-runtime-types.js +1 -1
- package/dist/scene/landscape/landscape-manager.d.ts +2 -1
- package/dist/scene/landscape/landscape-manager.js +1 -1
- package/dist/scene/materializer.d.ts +50 -1
- package/dist/scene/materializer.js +1 -1
- package/dist/scene/model.d.ts +2 -0
- package/dist/scene/scatter/painted-scatter-manager.d.ts +45 -0
- package/dist/scene/scatter/painted-scatter-manager.js +4 -0
- package/dist/scene/scatter/scatter-limits.d.ts +2 -0
- package/dist/scene/scatter/scatter-limits.js +4 -0
- package/dist/scene/scatter/surface-scatter-manager.js +1 -1
- package/dist/scene/storage/storage.d.ts +1 -1
- package/dist/scene/storage/storage.js +1 -1
- package/dist/shader/builtin/standard-shader.js +1 -1
- package/dist/shader/builtin/toon-shader.js +1 -1
- package/dist/shader/builtin/unlit-shader.js +1 -1
- package/dist/shader/color-layer.js +1 -1
- package/dist/shader/graph/compiler.d.ts +7 -4
- package/dist/shader/graph/compiler.js +1 -1
- package/dist/shader/graph/model.d.ts +1 -1
- package/dist/shader/graph/model.js +1 -1
- package/dist/shader/graph/parameters.js +1 -1
- package/dist/shader/parameter.d.ts +1 -1
- package/dist/shader/parameter.js +1 -1
- package/dist/shader/sprite-shader.js +1 -1
- package/dist/shader-nodes/depth.js +1 -1
- package/dist/shader-nodes/scene-sample.js +1 -1
- package/dist/test/batched-mesh-2.test.d.ts +2 -0
- package/dist/test/batched-mesh-2.test.js +4 -0
- package/dist/test/browser-net-session.test.d.ts +2 -0
- package/dist/test/browser-net-session.test.js +4 -0
- package/dist/test/first-person-camera-component.test.js +1 -1
- package/dist/test/net-character-movement.test.d.ts +2 -0
- package/dist/test/net-character-movement.test.js +4 -0
- package/dist/test/net-property-snapshot.test.d.ts +2 -0
- package/dist/test/net-property-snapshot.test.js +4 -0
- package/dist/test/painted-scatter-manager.test.d.ts +2 -0
- package/dist/test/painted-scatter-manager.test.js +4 -0
- package/dist/test/runtime-param-type-inference.test.js +1 -1
- package/dist/test/sequence-animation-retiming.test.js +1 -1
- package/dist/test/sequence-post-process.test.js +1 -1
- package/dist/test/shader-graph.test.js +1 -1
- package/dist/test/vfx-random-color-initializer.test.d.ts +2 -0
- package/dist/test/vfx-random-color-initializer.test.js +4 -0
- package/dist/test/world-prefab-spawn.test.d.ts +2 -0
- package/dist/test/world-prefab-spawn.test.js +4 -0
- package/dist/utils/three/placeholder-texture.d.ts +3 -0
- package/dist/utils/three/placeholder-texture.js +4 -0
- package/package.json +10 -2
- package/tsconfig.tsbuildinfo +1 -1
|
@@ -3,8 +3,9 @@ import { BaseActor } from '../actors/actor.js';
|
|
|
3
3
|
import { Euler, Scene, Vector3 } from 'three';
|
|
4
4
|
import { Observable } from 'rxjs';
|
|
5
5
|
import { RenderingView } from "../../rendering.js";
|
|
6
|
-
import { Prefab
|
|
6
|
+
import { Prefab } from "../../scene/objects/prefab.js";
|
|
7
7
|
import { PrefabInstance } from '../../scene/objects/prefab';
|
|
8
|
+
import { BasePlayerController } from "../actors/controller/actor-controller.js";
|
|
8
9
|
declare class DirectionalLightController {
|
|
9
10
|
private view;
|
|
10
11
|
constructor(view: RenderingView);
|
|
@@ -22,6 +23,9 @@ declare class DirectionalLightController {
|
|
|
22
23
|
*/
|
|
23
24
|
get position(): Vector3;
|
|
24
25
|
}
|
|
26
|
+
export type ActorSpawnOptions = {
|
|
27
|
+
owner: BaseActor;
|
|
28
|
+
};
|
|
25
29
|
export declare class World {
|
|
26
30
|
private actorFactory;
|
|
27
31
|
private view;
|
|
@@ -31,7 +35,14 @@ export declare class World {
|
|
|
31
35
|
readonly actorRemoved: Observable<BaseActor>;
|
|
32
36
|
scene: Scene;
|
|
33
37
|
readonly directionalLight: DirectionalLightController;
|
|
34
|
-
spawnActor<T extends BaseActor>(type: Constructable<T
|
|
38
|
+
spawnActor<T extends BaseActor>(type: Constructable<T>, position?: Vector3, rotation?: Euler, options?: ActorSpawnOptions): Promise<T>;
|
|
39
|
+
/**
|
|
40
|
+
* Spawn the player controller to run locally.
|
|
41
|
+
* This is only called by the server and if it is not a dedicated server in
|
|
42
|
+
* which case it doesn't have its own local player controller.
|
|
43
|
+
* It sets isLocallyControlled to true
|
|
44
|
+
*/
|
|
45
|
+
spawnLocalPlayerController<T extends BasePlayerController>(type: Constructable<T>, position?: Vector3, rotation?: Euler): Promise<T>;
|
|
35
46
|
addActor(actor: BaseActor, position?: Vector3, rotation?: Euler): void;
|
|
36
47
|
removeActor(actor: BaseActor): void;
|
|
37
48
|
findActorByType<T extends BaseActor>(type: Constructable<T>, name?: string): T;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{__decorate as t}from"tslib";import{Service as r}from"typedi";import{BaseActor as o}from"../actors/actor.js";import{ActorFactory as e}from"../actors/factory.js";import{Vector3 as
|
|
1
|
+
import{__decorate as t}from"tslib";import{Service as r}from"typedi";import{BaseActor as o}from"../actors/actor.js";import{ActorFactory as e}from"../actors/factory.js";import{Group as i,Vector3 as n}from"three";import{ActorComponent as s}from"../../gameplay/actors/component.js";import{Subject as c}from"rxjs";import{RenderingView as a}from"../../rendering.js";import{randomUUID as h}from"../../utils/uuid";import{PrefabInstance as l}from"../../scene/objects/prefab";import{PhysicsSystem as m}from"./physics/physics-system.js";import{inject as p}from"../../gameplay/inject.js";import{isComponentEnabledInEnvironment as d}from"../actors/internal/component-init.js";import{NetRole as f}from"../net/service/net-actor-role.js";import{BasePlayerController as y}from"../actors/controller/actor-controller.js";const w=new n;class u{constructor(t){this.view=t}get direction(){return this.view.csm.lightDirection}set intensity(t){this.view.csm.lightIntensity=t,this.view.csm.lights.forEach(t=>t.intensity=this.view.csm.lightIntensity)}get intensity(){return this.view.csm.lightIntensity}get position(){return 0==this.view.csm.lights.length?w:this.view.csm.lights[0].position}}let b=class{constructor(){this.actorFactory=p(e),this.view=p(a),this.physics=p(m),this.actors=[],this.actorAdded=new c,this.actorRemoved=new c,this.directionalLight=new u(this.view)}async spawnActor(t,r,o,e){if(null==t)throw new Error("Cannot spawn actor with null type");if("prefab"in t){const i=t.prefab,n=await this.spawnPrefab(i,r,o),s=n.mainActor;if(null==s)throw new Error(`Prefab has no main actor or there was an error when spwaning it. Prefab: ${JSON.stringify(i)}`);return s.disposed.subscribe(()=>{const t=n.actors.findIndex(t=>t===s);t>=0&&n.actors.splice(t,1),this.removePrefab(n)}),null!=e?.owner&&(s.owner=e.owner),s}const i=await this.actorFactory.create(t,r,o);return null!=e?.owner&&(i.owner=e.owner),this.addActor(i,r,o),i}async spawnActorWithNetInfo(t,r,o,e,i,n){const s=await this.actorFactory.create(t,i,n,!0),c=null!=e&&0!==e?this.actors.find(t=>t.__netid===e):null;return s.__netid=r,s.netRole=o,s.owner=c,s instanceof y&&(s.isLocallyControlled=o===f.autonomousProxy),this.actorFactory.initActor(s),this.addActor(s,i,n),s}async spawnLocalPlayerController(t,r,o){const e=await this.actorFactory.create(t,r,o,!0);return e.isLocallyControlled=!0,this.actorFactory.initActor(e),this.addActor(e,r,o),e}spawnActorSync(t,r,o){if(null==t)throw new Error("Cannot spawn actor with null type");const e=this.actorFactory.createSync(t,r,o);return this.addActor(e,r,o),e}addActor(t,r,o){r&&t.object.position.copy(r),o&&t.object.rotation.copy(o),null==t.object.parent&&this.scene.add(t.object),this.actors.push(t),j(t,t=>t.onBeginPlay(),this.actorFactory.inEditor),this.actorAdded.next(t)}removeActor(t){j(t,t=>t.onEndPlay(),this.actorFactory.inEditor);const r=this.actors.indexOf(t);r>=0&&this.actors.splice(r,1),t.object.removeFromParent(),t.disposed.next(!0),this.actorRemoved.next(t),this.physics.removeActor(t)}findActorByType(t,r){return this.actors.find(o=>o instanceof t&&(null==r||o.object.name==r))}findActorsByType(t,r){return this.actors.filter(o=>o instanceof t&&(null==r||o.object.name==r))}async spawnPrefab(t,r,o){if(null==this.materializer)return console.error("Internal error: Materializer is missing on World"),null;const e=new l,n=new i;null!=r&&n.position.copy(r),null!=o&&n.rotation.copy(o),this.materializer.setScene(this.scene),this.materializer.inEditor=this.actorFactory.inEditor;const{object:s,actors:c,mainActor:a}=await this.materializer.createFromPrefabAsset(t.asset,{sceneObjectChain:["r-"+h()]},n,void 0,!1);return e.object=s,e.actors=c,e.mainActor=a,this.scene.attach(s),c.forEach(t=>{this.addActor(t)}),this.physics.addFromScene(s),e}removePrefab(t){t.actors.forEach(t=>this.removeActor(t)),t.object?.removeFromParent(),this.physics.removeRemoved(t.object)}};b=t([r()],b);export{b as World};function j(t,r,e=!1,i=new WeakSet){if(!i.has(t))return i.add(t),r(t),t instanceof o&&t.attachedComponents.forEach(t=>{d(t,e)&&j(t,r,e,i)}),Object.entries(t).filter(([t,r])=>r instanceof s&&d(r,e)).forEach(([t,o])=>{j(o,r,e,i)})}/*
|
|
2
2
|
* Copyright (©) 2026 Hology Interactive AB. All rights reserved.
|
|
3
3
|
* See the LICENSE.md file for details.
|
|
4
4
|
*/
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{Color as t,NoToneMapping as n,Texture as e,Vector3 as i}from"three";import{ShaderPass as a}from"three-stdlib";export class ColorPass extends a{constructor(){super({uniforms:{tDiffuse:{value:new e},whiteBalanceEnabled:{value:!1},whiteBalanceScale:{value:new i(1,1,1)},vignetteEnabled:{value:!1},vignetteIntensity:{value:.5},colorTintEnabled:{value:!1},colorTint:{value:new i(1,1,1)},colorTintIntensity:{value:0},colorGradingEnabled:{value:!1},toneMappingMode:{value:n},toneMappingEnabled:{value:!1},toneMappingExposure:{value:1},globalSaturation:{value:new i(1,1,1)},globalContrast:{value:new i(1,1,1)},globalGamma:{value:new i(1,1,1)},globalGain:{value:new i(1,1,1)},globalOffset:{value:new i(0,0,0)},shadowsSaturation:{value:new i(1,1,1)},shadowsContrast:{value:new i(1,1,1)},shadowsGamma:{value:new i(1,1,1)},shadowsGain:{value:new i(1,1,1)},shadowsOffset:{value:new i(0,0,0)},shadowsMax:{value:.09},midtonesSaturation:{value:new i(1,1,1)},midtonesContrast:{value:new i(1,1,1)},midtonesGamma:{value:new i(1,1,1)},midtonesGain:{value:new i(1,1,1)},midtonesOffset:{value:new i(0,0,0)},highlightsSaturation:{value:new i(1,1,1)},highlightsContrast:{value:new i(1,1,1)},highlightsGamma:{value:new i(1,1,1)},highlightsGain:{value:new i(1,1,1)},highlightsOffset:{value:new i(0,0,0)},highlightsMin:{value:.5}},vertexShader:"\n varying vec2 vUv;\n\n void main() {\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n }\n ",fragmentShader:"\n uniform sampler2D tDiffuse;\n uniform bool whiteBalanceEnabled;\n uniform vec3 whiteBalanceScale;\n uniform bool vignetteEnabled;\n uniform float vignetteIntensity;\n uniform bool colorTintEnabled;\n uniform vec3 colorTint;\n uniform float colorTintIntensity;\n uniform bool colorGradingEnabled;\n uniform int toneMappingMode;\n uniform bool toneMappingEnabled;\n uniform vec3 globalSaturation;\n uniform vec3 globalContrast;\n uniform vec3 globalGamma;\n uniform vec3 globalGain;\n uniform vec3 globalOffset;\n uniform vec3 shadowsSaturation;\n uniform vec3 shadowsContrast;\n uniform vec3 shadowsGamma;\n uniform vec3 shadowsGain;\n uniform vec3 shadowsOffset;\n uniform float shadowsMax;\n uniform vec3 midtonesSaturation;\n uniform vec3 midtonesContrast;\n uniform vec3 midtonesGamma;\n uniform vec3 midtonesGain;\n uniform vec3 midtonesOffset;\n uniform vec3 highlightsSaturation;\n uniform vec3 highlightsContrast;\n uniform vec3 highlightsGamma;\n uniform vec3 highlightsGain;\n uniform vec3 highlightsOffset;\n uniform float highlightsMin;\n\n varying vec2 vUv;\n\n #include <tonemapping_pars_fragment>\n\n const vec3 LUMA = vec3(0.2126, 0.7152, 0.0722);\n\n vec3 applySaturation(vec3 color, vec3 saturation) {\n vec3 luminanceColor = vec3(dot(color, LUMA));\n return mix(luminanceColor, color, saturation);\n }\n\n vec3 applyContrast(vec3 color, vec3 contrast) {\n return (color - vec3(0.18)) * contrast + vec3(0.18);\n }\n\n vec3 applyGamma(vec3 color, vec3 gammaValue) {\n return pow(max(color, vec3(0.0)), vec3(1.0) / max(gammaValue, vec3(1e-4)));\n }\n\n vec3 applyGain(vec3 color, vec3 gainValue) {\n return color * gainValue;\n }\n\n vec3 applyOffset(vec3 color, vec3 offsetValue) {\n return color + offsetValue;\n }\n\n vec3 applyGrade(vec3 color, vec3 saturation, vec3 contrast, vec3 gammaValue, vec3 gainValue, vec3 offsetValue) {\n color = applySaturation(color, saturation);\n color = applyContrast(color, contrast);\n color = applyGamma(color, gammaValue);\n color = applyGain(color, gainValue);\n color = applyOffset(color, offsetValue);\n return max(color, vec3(0.0));\n }\n\n vec3 applyToneMappingMode(vec3 color) {\n if (toneMappingMode == 1) return LinearToneMapping(color);\n if (toneMappingMode == 2) return ReinhardToneMapping(color);\n if (toneMappingMode == 3) return CineonToneMapping(color);\n if (toneMappingMode == 4) return ACESFilmicToneMapping(color);\n if (toneMappingMode == 6) return AgXToneMapping(color);\n if (toneMappingMode == 7) return NeutralToneMapping(color);\n return color;\n }\n\n void main() {\n vec3 color = texture2D(tDiffuse, vUv).rgb;\n\n if (whiteBalanceEnabled) {\n color *= whiteBalanceScale;\n }\n\n if (colorTintEnabled) {\n color = mix(color, color * colorTint, clamp(colorTintIntensity, 0.0, 1.0));\n }\n\n if (colorGradingEnabled) {\n float shadowLimit = clamp(shadowsMax, 0.0, 0.98);\n float highlightLimit = clamp(max(highlightsMin, shadowLimit + 0.02), 0.02, 1.0);\n float luminance = clamp(dot(color, LUMA), 0.0, 1.0);\n\n float shadowTransition = max(0.02, min(0.25, shadowLimit + 0.05));\n float highlightTransition = max(0.02, min(0.25, (1.0 - highlightLimit) + 0.05));\n\n float shadowWeight = 1.0 - smoothstep(shadowLimit, min(1.0, shadowLimit + shadowTransition), luminance);\n float highlightWeight = smoothstep(max(0.0, highlightLimit - highlightTransition), highlightLimit, luminance);\n float midtoneWeight = clamp(1.0 - shadowWeight - highlightWeight, 0.0, 1.0);\n\n vec3 saturation = globalSaturation;\n vec3 contrast = globalContrast;\n vec3 gammaValue = globalGamma;\n vec3 gainValue = globalGain;\n vec3 offsetValue = globalOffset;\n\n saturation *= mix(vec3(1.0), shadowsSaturation, shadowWeight);\n saturation *= mix(vec3(1.0), midtonesSaturation, midtoneWeight);\n saturation *= mix(vec3(1.0), highlightsSaturation, highlightWeight);\n\n contrast *= mix(vec3(1.0), shadowsContrast, shadowWeight);\n contrast *= mix(vec3(1.0), midtonesContrast, midtoneWeight);\n contrast *= mix(vec3(1.0), highlightsContrast, highlightWeight);\n\n gammaValue *= mix(vec3(1.0), shadowsGamma, shadowWeight);\n gammaValue *= mix(vec3(1.0), midtonesGamma, midtoneWeight);\n gammaValue *= mix(vec3(1.0), highlightsGamma, highlightWeight);\n\n gainValue *= mix(vec3(1.0), shadowsGain, shadowWeight);\n gainValue *= mix(vec3(1.0), midtonesGain, midtoneWeight);\n gainValue *= mix(vec3(1.0), highlightsGain, highlightWeight);\n\n offsetValue += shadowsOffset * shadowWeight;\n offsetValue += midtonesOffset * midtoneWeight;\n offsetValue += highlightsOffset * highlightWeight;\n\n color = applyGrade(color, saturation, contrast, gammaValue, gainValue, offsetValue);\n }\n\n if (toneMappingEnabled) {\n color = applyToneMappingMode(color);\n }\n\n if (vignetteEnabled) {\n float d = distance(vUv, vec2(0.5));\n float offset = 0.2;\n float vignette = smoothstep(0.8, offset * 0.799, d * (vignetteIntensity + offset));\n color *= vignette;\n }\n\n gl_FragColor = vec4(color, 1.0);\n }\n "});const t=this.material;t.toneMapped=!1,t.depthWrite=!1,t.depthTest=!1}set vignetteEnabled(t){this.uniforms.vignetteEnabled.value=t}get vignetteEnabled(){return this.uniforms.vignetteEnabled.value}set whiteBalanceEnabled(t){this.uniforms.whiteBalanceEnabled.value=t}get whiteBalanceEnabled(){return this.uniforms.whiteBalanceEnabled.value}set whiteBalanceScale(t){this.setVec3Uniform("whiteBalanceScale",t)}get whiteBalanceScale(){return this.getVec3Uniform("whiteBalanceScale")}set vignetteIntensity(t){this.uniforms.vignetteIntensity.value=t}get vignetteIntensity(){return this.uniforms.vignetteIntensity.value}set colorTintEnabled(t){this.uniforms.colorTintEnabled.value=t}get colorTintEnabled(){return this.uniforms.colorTintEnabled.value}set colorTint(t){this.setVec3Uniform("colorTint",t)}get colorTint(){return(new t).setFromVector3(this.getVec3Uniform("colorTint"))}set colorTintIntensity(t){this.uniforms.colorTintIntensity.value=t}get colorTintIntensity(){return this.uniforms.colorTintIntensity.value}set colorGradingEnabled(t){this.uniforms.colorGradingEnabled.value=t}get colorGradingEnabled(){return this.uniforms.colorGradingEnabled.value}set toneMapping(t){this.uniforms.toneMappingMode.value=t??n}get toneMapping(){return this.uniforms.toneMappingMode.value}set toneMappingEnabled(t){this.uniforms.toneMappingEnabled.value=t}get toneMappingEnabled(){return this.uniforms.toneMappingEnabled.value}set toneMappingExposure(t){this.uniforms.toneMappingExposure.value=t}get toneMappingExposure(){return this.uniforms.toneMappingExposure.value}set globalSaturation(t){this.setVec3Uniform("globalSaturation",t)}get globalSaturation(){return this.getVec3Uniform("globalSaturation")}set globalContrast(t){this.setVec3Uniform("globalContrast",t)}get globalContrast(){return this.getVec3Uniform("globalContrast")}set globalGamma(t){this.setVec3Uniform("globalGamma",t)}get globalGamma(){return this.getVec3Uniform("globalGamma")}set globalGain(t){this.setVec3Uniform("globalGain",t)}get globalGain(){return this.getVec3Uniform("globalGain")}set globalOffset(t){this.setVec3Uniform("globalOffset",t)}get globalOffset(){return this.getVec3Uniform("globalOffset")}set shadowsSaturation(t){this.setVec3Uniform("shadowsSaturation",t)}get shadowsSaturation(){return this.getVec3Uniform("shadowsSaturation")}set shadowsContrast(t){this.setVec3Uniform("shadowsContrast",t)}get shadowsContrast(){return this.getVec3Uniform("shadowsContrast")}set shadowsGamma(t){this.setVec3Uniform("shadowsGamma",t)}get shadowsGamma(){return this.getVec3Uniform("shadowsGamma")}set shadowsGain(t){this.setVec3Uniform("shadowsGain",t)}get shadowsGain(){return this.getVec3Uniform("shadowsGain")}set shadowsOffset(t){this.setVec3Uniform("shadowsOffset",t)}get shadowsOffset(){return this.getVec3Uniform("shadowsOffset")}set shadowsMax(t){this.uniforms.shadowsMax.value=t}get shadowsMax(){return this.uniforms.shadowsMax.value}set midtonesSaturation(t){this.setVec3Uniform("midtonesSaturation",t)}get midtonesSaturation(){return this.getVec3Uniform("midtonesSaturation")}set midtonesContrast(t){this.setVec3Uniform("midtonesContrast",t)}get midtonesContrast(){return this.getVec3Uniform("midtonesContrast")}set midtonesGamma(t){this.setVec3Uniform("midtonesGamma",t)}get midtonesGamma(){return this.getVec3Uniform("midtonesGamma")}set midtonesGain(t){this.setVec3Uniform("midtonesGain",t)}get midtonesGain(){return this.getVec3Uniform("midtonesGain")}set midtonesOffset(t){this.setVec3Uniform("midtonesOffset",t)}get midtonesOffset(){return this.getVec3Uniform("midtonesOffset")}set highlightsSaturation(t){this.setVec3Uniform("highlightsSaturation",t)}get highlightsSaturation(){return this.getVec3Uniform("highlightsSaturation")}set highlightsContrast(t){this.setVec3Uniform("highlightsContrast",t)}get highlightsContrast(){return this.getVec3Uniform("highlightsContrast")}set highlightsGamma(t){this.setVec3Uniform("highlightsGamma",t)}get highlightsGamma(){return this.getVec3Uniform("highlightsGamma")}set highlightsGain(t){this.setVec3Uniform("highlightsGain",t)}get highlightsGain(){return this.getVec3Uniform("highlightsGain")}set highlightsOffset(t){this.setVec3Uniform("highlightsOffset",t)}get highlightsOffset(){return this.getVec3Uniform("highlightsOffset")}set highlightsMin(t){this.uniforms.highlightsMin.value=t}get highlightsMin(){return this.uniforms.highlightsMin.value}setVec3Uniform(n,e){const i=this.uniforms[n].value;e instanceof t?i.set(e.r,e.g,e.b):i.copy(e)}getVec3Uniform(t){return this.uniforms[t].value}}/*
|
|
1
|
+
import{Color as t,NoToneMapping as n,Vector3 as e}from"three";import{ShaderPass as i}from"three-stdlib";import{createPlaceholderTexture as a}from"../utils/three/placeholder-texture.js";export class ColorPass extends i{constructor(){super({uniforms:{tDiffuse:{value:a()},whiteBalanceEnabled:{value:!1},whiteBalanceScale:{value:new e(1,1,1)},vignetteEnabled:{value:!1},vignetteIntensity:{value:.5},colorTintEnabled:{value:!1},colorTint:{value:new e(1,1,1)},colorTintIntensity:{value:0},colorGradingEnabled:{value:!1},toneMappingMode:{value:n},toneMappingEnabled:{value:!1},toneMappingExposure:{value:1},globalSaturation:{value:new e(1,1,1)},globalContrast:{value:new e(1,1,1)},globalGamma:{value:new e(1,1,1)},globalGain:{value:new e(1,1,1)},globalOffset:{value:new e(0,0,0)},shadowsSaturation:{value:new e(1,1,1)},shadowsContrast:{value:new e(1,1,1)},shadowsGamma:{value:new e(1,1,1)},shadowsGain:{value:new e(1,1,1)},shadowsOffset:{value:new e(0,0,0)},shadowsMax:{value:.09},midtonesSaturation:{value:new e(1,1,1)},midtonesContrast:{value:new e(1,1,1)},midtonesGamma:{value:new e(1,1,1)},midtonesGain:{value:new e(1,1,1)},midtonesOffset:{value:new e(0,0,0)},highlightsSaturation:{value:new e(1,1,1)},highlightsContrast:{value:new e(1,1,1)},highlightsGamma:{value:new e(1,1,1)},highlightsGain:{value:new e(1,1,1)},highlightsOffset:{value:new e(0,0,0)},highlightsMin:{value:.5}},vertexShader:"\n varying vec2 vUv;\n\n void main() {\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n }\n ",fragmentShader:"\n uniform sampler2D tDiffuse;\n uniform bool whiteBalanceEnabled;\n uniform vec3 whiteBalanceScale;\n uniform bool vignetteEnabled;\n uniform float vignetteIntensity;\n uniform bool colorTintEnabled;\n uniform vec3 colorTint;\n uniform float colorTintIntensity;\n uniform bool colorGradingEnabled;\n uniform int toneMappingMode;\n uniform bool toneMappingEnabled;\n uniform vec3 globalSaturation;\n uniform vec3 globalContrast;\n uniform vec3 globalGamma;\n uniform vec3 globalGain;\n uniform vec3 globalOffset;\n uniform vec3 shadowsSaturation;\n uniform vec3 shadowsContrast;\n uniform vec3 shadowsGamma;\n uniform vec3 shadowsGain;\n uniform vec3 shadowsOffset;\n uniform float shadowsMax;\n uniform vec3 midtonesSaturation;\n uniform vec3 midtonesContrast;\n uniform vec3 midtonesGamma;\n uniform vec3 midtonesGain;\n uniform vec3 midtonesOffset;\n uniform vec3 highlightsSaturation;\n uniform vec3 highlightsContrast;\n uniform vec3 highlightsGamma;\n uniform vec3 highlightsGain;\n uniform vec3 highlightsOffset;\n uniform float highlightsMin;\n\n varying vec2 vUv;\n\n #include <tonemapping_pars_fragment>\n\n const vec3 LUMA = vec3(0.2126, 0.7152, 0.0722);\n\n vec3 applySaturation(vec3 color, vec3 saturation) {\n vec3 luminanceColor = vec3(dot(color, LUMA));\n return mix(luminanceColor, color, saturation);\n }\n\n vec3 applyContrast(vec3 color, vec3 contrast) {\n return (color - vec3(0.18)) * contrast + vec3(0.18);\n }\n\n vec3 applyGamma(vec3 color, vec3 gammaValue) {\n return pow(max(color, vec3(0.0)), vec3(1.0) / max(gammaValue, vec3(1e-4)));\n }\n\n vec3 applyGain(vec3 color, vec3 gainValue) {\n return color * gainValue;\n }\n\n vec3 applyOffset(vec3 color, vec3 offsetValue) {\n return color + offsetValue;\n }\n\n vec3 applyGrade(vec3 color, vec3 saturation, vec3 contrast, vec3 gammaValue, vec3 gainValue, vec3 offsetValue) {\n color = applySaturation(color, saturation);\n color = applyContrast(color, contrast);\n color = applyGamma(color, gammaValue);\n color = applyGain(color, gainValue);\n color = applyOffset(color, offsetValue);\n return max(color, vec3(0.0));\n }\n\n vec3 applyToneMappingMode(vec3 color) {\n if (toneMappingMode == 1) return LinearToneMapping(color);\n if (toneMappingMode == 2) return ReinhardToneMapping(color);\n if (toneMappingMode == 3) return CineonToneMapping(color);\n if (toneMappingMode == 4) return ACESFilmicToneMapping(color);\n if (toneMappingMode == 6) return AgXToneMapping(color);\n if (toneMappingMode == 7) return NeutralToneMapping(color);\n return color;\n }\n\n void main() {\n vec3 color = texture2D(tDiffuse, vUv).rgb;\n\n if (whiteBalanceEnabled) {\n color *= whiteBalanceScale;\n }\n\n if (colorTintEnabled) {\n color = mix(color, color * colorTint, clamp(colorTintIntensity, 0.0, 1.0));\n }\n\n if (colorGradingEnabled) {\n float shadowLimit = clamp(shadowsMax, 0.0, 0.98);\n float highlightLimit = clamp(max(highlightsMin, shadowLimit + 0.02), 0.02, 1.0);\n float luminance = clamp(dot(color, LUMA), 0.0, 1.0);\n\n float shadowTransition = max(0.02, min(0.25, shadowLimit + 0.05));\n float highlightTransition = max(0.02, min(0.25, (1.0 - highlightLimit) + 0.05));\n\n float shadowWeight = 1.0 - smoothstep(shadowLimit, min(1.0, shadowLimit + shadowTransition), luminance);\n float highlightWeight = smoothstep(max(0.0, highlightLimit - highlightTransition), highlightLimit, luminance);\n float midtoneWeight = clamp(1.0 - shadowWeight - highlightWeight, 0.0, 1.0);\n\n vec3 saturation = globalSaturation;\n vec3 contrast = globalContrast;\n vec3 gammaValue = globalGamma;\n vec3 gainValue = globalGain;\n vec3 offsetValue = globalOffset;\n\n saturation *= mix(vec3(1.0), shadowsSaturation, shadowWeight);\n saturation *= mix(vec3(1.0), midtonesSaturation, midtoneWeight);\n saturation *= mix(vec3(1.0), highlightsSaturation, highlightWeight);\n\n contrast *= mix(vec3(1.0), shadowsContrast, shadowWeight);\n contrast *= mix(vec3(1.0), midtonesContrast, midtoneWeight);\n contrast *= mix(vec3(1.0), highlightsContrast, highlightWeight);\n\n gammaValue *= mix(vec3(1.0), shadowsGamma, shadowWeight);\n gammaValue *= mix(vec3(1.0), midtonesGamma, midtoneWeight);\n gammaValue *= mix(vec3(1.0), highlightsGamma, highlightWeight);\n\n gainValue *= mix(vec3(1.0), shadowsGain, shadowWeight);\n gainValue *= mix(vec3(1.0), midtonesGain, midtoneWeight);\n gainValue *= mix(vec3(1.0), highlightsGain, highlightWeight);\n\n offsetValue += shadowsOffset * shadowWeight;\n offsetValue += midtonesOffset * midtoneWeight;\n offsetValue += highlightsOffset * highlightWeight;\n\n color = applyGrade(color, saturation, contrast, gammaValue, gainValue, offsetValue);\n }\n\n if (toneMappingEnabled) {\n color = applyToneMappingMode(color);\n }\n\n if (vignetteEnabled) {\n float d = distance(vUv, vec2(0.5));\n float offset = 0.2;\n float vignette = smoothstep(0.8, offset * 0.799, d * (vignetteIntensity + offset));\n color *= vignette;\n }\n\n gl_FragColor = vec4(color, 1.0);\n }\n "});const t=this.material;t.toneMapped=!1,t.depthWrite=!1,t.depthTest=!1}set vignetteEnabled(t){this.uniforms.vignetteEnabled.value=t}get vignetteEnabled(){return this.uniforms.vignetteEnabled.value}set whiteBalanceEnabled(t){this.uniforms.whiteBalanceEnabled.value=t}get whiteBalanceEnabled(){return this.uniforms.whiteBalanceEnabled.value}set whiteBalanceScale(t){this.setVec3Uniform("whiteBalanceScale",t)}get whiteBalanceScale(){return this.getVec3Uniform("whiteBalanceScale")}set vignetteIntensity(t){this.uniforms.vignetteIntensity.value=t}get vignetteIntensity(){return this.uniforms.vignetteIntensity.value}set colorTintEnabled(t){this.uniforms.colorTintEnabled.value=t}get colorTintEnabled(){return this.uniforms.colorTintEnabled.value}set colorTint(t){this.setVec3Uniform("colorTint",t)}get colorTint(){return(new t).setFromVector3(this.getVec3Uniform("colorTint"))}set colorTintIntensity(t){this.uniforms.colorTintIntensity.value=t}get colorTintIntensity(){return this.uniforms.colorTintIntensity.value}set colorGradingEnabled(t){this.uniforms.colorGradingEnabled.value=t}get colorGradingEnabled(){return this.uniforms.colorGradingEnabled.value}set toneMapping(t){this.uniforms.toneMappingMode.value=t??n}get toneMapping(){return this.uniforms.toneMappingMode.value}set toneMappingEnabled(t){this.uniforms.toneMappingEnabled.value=t}get toneMappingEnabled(){return this.uniforms.toneMappingEnabled.value}set toneMappingExposure(t){this.uniforms.toneMappingExposure.value=t}get toneMappingExposure(){return this.uniforms.toneMappingExposure.value}set globalSaturation(t){this.setVec3Uniform("globalSaturation",t)}get globalSaturation(){return this.getVec3Uniform("globalSaturation")}set globalContrast(t){this.setVec3Uniform("globalContrast",t)}get globalContrast(){return this.getVec3Uniform("globalContrast")}set globalGamma(t){this.setVec3Uniform("globalGamma",t)}get globalGamma(){return this.getVec3Uniform("globalGamma")}set globalGain(t){this.setVec3Uniform("globalGain",t)}get globalGain(){return this.getVec3Uniform("globalGain")}set globalOffset(t){this.setVec3Uniform("globalOffset",t)}get globalOffset(){return this.getVec3Uniform("globalOffset")}set shadowsSaturation(t){this.setVec3Uniform("shadowsSaturation",t)}get shadowsSaturation(){return this.getVec3Uniform("shadowsSaturation")}set shadowsContrast(t){this.setVec3Uniform("shadowsContrast",t)}get shadowsContrast(){return this.getVec3Uniform("shadowsContrast")}set shadowsGamma(t){this.setVec3Uniform("shadowsGamma",t)}get shadowsGamma(){return this.getVec3Uniform("shadowsGamma")}set shadowsGain(t){this.setVec3Uniform("shadowsGain",t)}get shadowsGain(){return this.getVec3Uniform("shadowsGain")}set shadowsOffset(t){this.setVec3Uniform("shadowsOffset",t)}get shadowsOffset(){return this.getVec3Uniform("shadowsOffset")}set shadowsMax(t){this.uniforms.shadowsMax.value=t}get shadowsMax(){return this.uniforms.shadowsMax.value}set midtonesSaturation(t){this.setVec3Uniform("midtonesSaturation",t)}get midtonesSaturation(){return this.getVec3Uniform("midtonesSaturation")}set midtonesContrast(t){this.setVec3Uniform("midtonesContrast",t)}get midtonesContrast(){return this.getVec3Uniform("midtonesContrast")}set midtonesGamma(t){this.setVec3Uniform("midtonesGamma",t)}get midtonesGamma(){return this.getVec3Uniform("midtonesGamma")}set midtonesGain(t){this.setVec3Uniform("midtonesGain",t)}get midtonesGain(){return this.getVec3Uniform("midtonesGain")}set midtonesOffset(t){this.setVec3Uniform("midtonesOffset",t)}get midtonesOffset(){return this.getVec3Uniform("midtonesOffset")}set highlightsSaturation(t){this.setVec3Uniform("highlightsSaturation",t)}get highlightsSaturation(){return this.getVec3Uniform("highlightsSaturation")}set highlightsContrast(t){this.setVec3Uniform("highlightsContrast",t)}get highlightsContrast(){return this.getVec3Uniform("highlightsContrast")}set highlightsGamma(t){this.setVec3Uniform("highlightsGamma",t)}get highlightsGamma(){return this.getVec3Uniform("highlightsGamma")}set highlightsGain(t){this.setVec3Uniform("highlightsGain",t)}get highlightsGain(){return this.getVec3Uniform("highlightsGain")}set highlightsOffset(t){this.setVec3Uniform("highlightsOffset",t)}get highlightsOffset(){return this.getVec3Uniform("highlightsOffset")}set highlightsMin(t){this.uniforms.highlightsMin.value=t}get highlightsMin(){return this.uniforms.highlightsMin.value}setVec3Uniform(n,e){const i=this.uniforms[n].value;e instanceof t?i.set(e.r,e.g,e.b):i.copy(e)}getVec3Uniform(t){return this.uniforms[t].value}}/*
|
|
2
2
|
* Copyright (©) 2026 Hology Interactive AB. All rights reserved.
|
|
3
3
|
* See the LICENSE.md file for details.
|
|
4
4
|
*/
|
package/dist/rendering.d.ts
CHANGED
|
@@ -256,8 +256,10 @@ export declare class RenderingView {
|
|
|
256
256
|
loop(onFrame: (deltaTime: number) => any, showStats?: boolean): void;
|
|
257
257
|
private gBufferCachedMaterials;
|
|
258
258
|
private gBufferCachedVisibility;
|
|
259
|
+
private gBufferCachedOnBeforeRender;
|
|
259
260
|
private applyGBufferMaterials;
|
|
260
261
|
private unapplyGBufferMaterials;
|
|
262
|
+
private applyGBufferShadowUniformUpdater;
|
|
261
263
|
initTextures(scene?: THREE.Scene): void;
|
|
262
264
|
private _initiatedMaterialTextures;
|
|
263
265
|
private _initiatedTextures;
|
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 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 v,LUTPass as P,RenderPass as y,ShaderPass as b,VRButton as w}from"three-stdlib";import{CSMShader as x,CSMUtil as T}from"./csm.js";import{colorToNormal as S,float as R,NodeShaderMaterial as C,standardMaterial as U,uniformFloat as E,uniformVec3 as A,toonMaterial as O,lambertMaterial as F,normalize as G,rgb as D,rgba as B,transformed as j,varying as I,varyingAttributes as V,varyingTransformed as L,vec4 as _,BooleanExpression as W,select as N,ifDefApply as H,uniformSampler2d as q,RgbaNode as k,mix as z,attributes as $,uniformVec2 as J}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 Q}from"three/examples/jsm/csm/CSM.js";import{RectAreaLightUniformsLib as Z}from"three/examples/jsm/lights/RectAreaLightUniformsLib.js";import ee from"three/examples/jsm/libs/stats.module.js";import{GTAOPass as te}from"three/examples/jsm/postprocessing/GTAOPass.js";import{Service as se}from"typedi";import{depthUniformName as ie,farUniformName as ae,nearUniformName as ne,resolutionUniformName as re,sceneNormalUniformName as oe,screenUV as le,supportsDepthTextureExtension as he}from"./shader-nodes/depth.js";import{elapsedTimeUniformName as pe}from"./shader-nodes/time.js";import{aoMapUniformName as ce,sceneMapUniformName as ue}from"./shader-nodes/scene-sample.js";import{DepthPass as de}from"./utils/three/depth-pass.js";import{GPUStatsPanel as me}from"./utils/three/gpu-stats-panel.js";import{OutlinePass as fe}from"./utils/three/outline-pass.js";import{findFirstVisibleObject as ge,traverseVisibleStop as Me}from"./utils/three/traverse.js";import{clamp as ve}from"./utils/math.js";import{ColorPass as Pe}from"./rendering/color-pass.js";import{PostProcessEffectPass as ye,PostProcessEffectRegistration as be,postProcessEffectStages as we,sanitizePostProcessEffectPriority as xe,sanitizePostProcessEffectStage as Te}from"./rendering/post-process-effect.js";import{SSRPass as Se}from"./rendering/ssr/SSRPass.js";import{SSRShader as Re}from"./rendering/ssr/SSRShader.js";import{VolumetricFogPass as Ce}from"./rendering/fog/volumetric-fog-pass.js";import{OutlineEffect as Ue}from"./rendering/outline-effect.js";import{UnrealBloomPass as Ee}from"./rendering/bloom/UnrealBloomPass.js";import{highPrecisionEyeDepth as Ae}from"./shader-nodes/depth.js";import{packDepthToRGBA as Oe}from"three-shader-graph";import{FogVolumeObject as Fe}from"./rendering/fog/fog-volume-object";import{ParallaxStandardMaterial as Ge}from"./shader/builtin/standard-shader.js";import{parallaxOcclusionMapping as De}from"./shader-nodes/pom.js";import{FullScreenQuad as Be}from"three-stdlib";import{edgeDepthEffect as je}from"./shader-nodes/effects";import{decalDiscard as Ie}from"./shader-nodes/decal.js";import{Pass as Ve}from"three/examples/jsm/Addons.js";import{BatchedMesh2 as Le}from"./scene/batched-mesh-2.js";import{applyUvTiling as _e}from"./shader/uv-nodes.js";import{getTemporalUpscalingJitter as We,getUpscalingMethod as Ne,UpscaleOutputPass as He}from"./rendering/upscaling-pass.js";T.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 ke=new i.MeshBasicMaterial({color:"black"}),ze=new i.MeshDepthMaterial;var $e;ze.depthPacking=i.RGBADepthPacking,ze.blending=i.NoBlending,ze.side=i.DoubleSide,function(e){e[e.opaque=0]="opaque",e[e.transparent=1]="transparent"}($e||($e={}));const Je=(()=>{const e=new Uint8Array([255,255,255,255]),t=new i.DataTexture(e,1,1,i.RGBAFormat);return t.needsUpdate=!0,t})(),Xe=(()=>{const e=new Uint8Array([0,0,0,255]),t=new i.DataTexture(e,1,1,i.RGBAFormat);return t.needsUpdate=!0,t})(),Ye=(()=>{const e=new Uint8Array([128,128,255,255]),t=new i.DataTexture(e,1,1,i.RGBAFormat);return t.needsUpdate=!0,t})(),Ke=new C({color:R(0),position:_(R(0))});Ke.visible=!1;const Qe=/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);let Ze=0,et=null;const tt=new Map;function st(){return null==et&&(et=new IntersectionObserver(e=>{for(const t of e){const e=tt.get(t.target);e&&e(t.isIntersecting)}},{threshold:0})),et}let it=e=class{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}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"===Ne(this.options.upscaling)}resetUpscalingHistory(){this.hasPreviousTemporalViewProjection=!1,this.upscaleOutputPass?.resetHistory()}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=mt(this.options.upscaling?.temporal?.jitterScale,1);We(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=mt(this.maxPixelRatio,1),t=mt(window.devicePixelRatio,1);return Math.min(e,t)}getBaseResolutionScale(){return mt(this.resolutionScale,1)}getDynamicResolutionMinScale(){const e=this.getBaseResolutionScale(),t=mt(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);dt(n,this.dynamicResolutionScale)||(this.dynamicResolutionScale=n);const r=mt(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(mt(s.sampleFrames,20)));if(this.dynamicResolutionFrameSamples<h)return;const p=mt(s.decreaseCooldown,500),c=mt(s.increaseCooldown,2e3),u=mt(s.decreaseStep,.05),d=mt(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)),dt(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.sceneColorRenderTarget.dispose(),this.sceneColorRenderTarget=this.createSceneColorRenderTarget(this.renderer,this.container),this.copyPass.material.uniforms.tDiffuse.value=this.gRenderTarget.textures[0],this.copyPass.material.uniformsNeedUpdate=!0,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={id:++this.postProcessEffectId,pass:new ye(e),priority:xe(t.priority),stage:Te(t.stage)};return s.pass.enabled=t.enabled??!0,this.postProcessEffects.push(s),this.refreshPostProcessEffectPassOrder(),new be(this,s)}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())}refreshPostProcessEffectPassOrder(){for(const e of this.postProcessEffects)this.composer.removePass(e.pass);for(const e of we){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(rt);for(let e=0;e<i.length;e++)this.composer.insertPass(i[e].pass,s+e)}}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.isIntersecting=!1,this.windowVisible=!0,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=Ze++,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:new u,normalTexture:new u,resolution:this.postProcessEffectResolution,simulationTime:0},this.fquadCopy=new Be(new p(f)),this.fquadCopyOpaque=new Be(new C({outputs:[q("tSceneColor",new u).sample(V.uv),_(q("tDepthTexture",new i.DepthTexture(1,1)).sample(V.uv).r)]})),this.simulationTime=0,this.simulationTimeScale=1,this.lightProbeIntensity=2,this.fquadBlendAO=(()=>{const e=_(1),t=new C({outputs:[q("tAO",new u).sample(le),e,e],transparent:!0});t.depthWrite=!1,t.depthTest=!1,t.blending=i.MultiplyBlending;return new Be(t)})(),this.resolutionScale=1,this.maxPixelRatio=Qe?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)try{this.render()}catch(e){}},this.onVisiblityChane=()=>{this.windowVisible=!document.hidden},this.isDepthTextureExtensionSupported=!0,this.onLoopCallbacks=[],this.stats=new ee,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.gBufferCachedMaterials=new Map,this.gBufferCachedVisibility=[],this._initiatedMaterialTextures=new Set,this._initiatedTextures=new Set,this.compileInProgress=!1,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,e.activeView=this,Z.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 Ue(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 o=(t.clientWidth||1)/(t.clientHeight||1);const l=new i.PerspectiveCamera(45,o,.5,800);l.layers.enable(19),this.setCamera(l),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,T.renderingView=this,this.isDepthTextureExtensionSupported=he(this.renderer),this.attachRendererDomElement(),this.setupEventListeners(),this.aoMaskDepthRenderTarget=e.createAOMaskDepthRenderTarget(this.renderer,this.container,this.getRenderPixelRatio()),this.sceneColorRenderTarget=this.createSceneColorRenderTarget(this.renderer,this.container);const h=new i.Vector2(t.clientWidth,t.clientHeight),c=(new y(this.scene,this.camera),new b(f,"prevtexture"));c.enabled=!0,c.needsSwap=!0,c.material.uniforms.tDiffuse.value=this.gRenderTarget.textures[0],this.copyPass=c;const d=new Ee(h,1.5,.4,.85);d.threshold=1,d.strength=.9,d.radius=.2,this.bloomPass=d;const m=new te(this.scene,this.camera,this.gRenderTarget.width,this.gRenderTarget.height,{});m.normalRenderTarget?.dispose(),m.setGBuffer(this.gRenderTarget.depthTexture,this.gRenderTarget.textures[2]),m.output=te.OUTPUT.Off,m.enabled=!1,this.aoPass=m,this.fquadBlendAO.material.uniforms.tAO.value=m.pdRenderTarget.texture,Re.fragmentShader=Re.fragmentShader.replace("if(metalness==0.) return;","if(metalness<0.1) return;");const x=new Se({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});x.output=Se.OUTPUT.Default,x.blur=!0,x.fresnel=!1,x.distanceAttenuation=!0,x.maxDistance=50,x.selective=!0,x.bouncing=!1,x.opacity=.4,x.enabled=!1!==this.options?.reflection?.enabled,this.ssrPass=x,!1!==this.options.ao?.enabled&&this.composer.addPass(m);const S=new Ct((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(S);const R=new Ct((e,t,s,i,a)=>{this.renderer.setRenderTarget(this.gRenderTarget),this.renderScene($e.transparent),this.renderer.setRenderTarget(null)});this.composer.addPass(R),this.composer.addPass(c),this.composer.addPass(x),this.phasedRenderPass=new Rt(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(h),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 U=new Pe;this.composer.addPass(U),this.colorPass=U,U.vignetteEnabled=!1,this.outlinePass=new fe(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 b(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 b(v).clear=!1,this.fixStatsStyle(),this.lutPass=new P({}),this.lutPass.enabled=!1,this.composer.addPass(this.lutPass);const A=new b(f,"prevtexture");A.enabled=!0,A.needsSwap=!1,A.material.uniforms.tDiffuse.value=this.gRenderTarget.textures[1],A.renderToScreen=!0;const O=this.isUpscalingEnabled()?new He(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)}(O),this.outputPass=O,this.upscaleOutputPass=O instanceof He?O:null,this.composer.addPass(O)}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}setCamera(e){if(this.camera=e,this.resetUpscalingHistory(),this.composer.passes.forEach(t=>{t instanceof y?t.camera=e:t instanceof fe?t.renderCamera=e:(t instanceof de||t instanceof te)&&(t.camera=e)}),this.ssrPass&&(this.ssrPass.camera=e),this.aoPass&&(this.aoPass.camera=e),this.phasedRenderPass&&(this.phasedRenderPass.camera=e),null==this.csm){if(this.csm=new Q({maxFar:80,lightFar:250,lightMargin:20,cascades:Qe?2:3,shadowMapSize:1024*(Qe?.5:1),lightDirection:new i.Vector3(.5,-1,-.6).normalize(),lightIntensity:.5*Math.PI,camera:this.camera,parent:this.scene,mode:"practical"}),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=x.lights_fragment_begin}else this.csm.camera=this.camera,this.camera;this.csm.updateFrustums()}setSelectedObjects(e){if(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())}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(e,t){const s=this.gRenderTarget.width,a=this.gRenderTarget.height,n=new i.WebGLRenderTarget(s,a,{count:2,type:i.FloatType,format:i.RGBAFormat,colorSpace:i.SRGBColorSpace,depthBuffer:!1,stencilBuffer:!1});return n.texture.minFilter=i.LinearFilter,n.texture.magFilter=i.LinearFilter,n.texture.generateMipmaps=!1,n.textures[1].minFilter=i.NearestFilter,n.textures[1].magFilter=i.NearestFilter,n}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??(Qe?void 0:2),minFilter:i.NearestFilter,magFilter:i.NearestFilter,type:i.HalfFloatType,format:i.RGBAFormat,depthTexture:n}),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.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.csm.dispose();for(const e of this.postProcessEffects)this.composer.removePass(e.pass),e.pass.dispose();this.postProcessEffects.length=0,this.detachOwnedDomElements();st().unobserve(this.container),tt.delete(this.container),this.volumetricFogPass.dispose(),T.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._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)}get showStats(){return this._showStats}attachRendererDomElement(){const e=this.renderer.domElement;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)}detachOwnedDomElements(){this.renderer.domElement.parentElement===this.container&&this.container.removeChild(this.renderer.domElement),this.stats.dom.parentElement===this.container&&this.container.removeChild(this.stats.dom)}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:bt(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)}}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 Ge&&(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===Ut.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||Ut.includes(e)||Et.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 Ut){const t=i[e],a=s[e];null!=a&&null!=t&&(t.value=a.value)}}createGBufferMaterial(e,t,s=!1){const a=t===$e.opaque?this.gbufferMaterialCache:this.tbufferMaterialCache;let n=a.get(e);if(!0===e.userData.isGBufferMaterial)return e;if(null==n){let s=V.uv;if(e instanceof Ge&&null!=e.heightMap){const t=E("heightScale",e.heightScale??1);s=De(s,q("heightMap",e.heightMap),t)}let o=L.normal;if(e instanceof i.MeshStandardMaterial||e instanceof i.MeshLambertMaterial||e instanceof i.MeshToonMaterial||e instanceof i.MeshPhongMaterial){const t=e.normalMap??Ye,i=E("useNormalMap",null!=e.normalMap?1:0),a=E("normalScale",e.normalScale?.x??1),n=S(q("normalMap",t).sample(_e(s,e.normalMap)),a);o=z(L.normal,n,i)}else e instanceof C&&null!=e.outputNormal&&(o=e.outputNormal);!0!==e.userData.disableAO&&(o=H("DOUBLE_SIDED",o,e=>N(new W("gl_FrontFacing"),e,e.multiplyScalar(-1))));let l=e.userData?.reflective?R(0):R(1);if(e instanceof i.MeshStandardMaterial){const t=E("roughness",e.roughness??1),i=e.roughnessMap??Je,a=E("useRoughnessMap",null!=e.roughnessMap?1:0),n=q("roughnessMap",i).sample(_e(s,e.roughnessMap)).g.multiply(t);l=z(t,n,a)}else e instanceof C&&null!=e.outputRoughness&&(l=e.outputRoughness);let h=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,i=E("useLightMap",null!=e.lightMap?1:0),a=E("lightMapIntensity",e.lightMapIntensity??1),n=q("lightMap",t).sample(s).rgb.multiplyScalar(a);h=z(D(0),n,i)}let c=R(0);if(e instanceof i.MeshStandardMaterial){const t=E("metalness",e.metalness??0),i=e.metalnessMap??Xe,a=E("useMetalnessMap",null!=e.metalnessMap?1:0),n=q("metalnessMap",i).sample(_e(s,e.metalnessMap)).b.multiply(t);c=z(t,n,a)}else e instanceof C&&e.outputRoughness;let u=null,d=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??Je,i=E("useAoMap",null!=e.aoMap?1:0);d=E("aoMapIntensity",e.aoMapIntensity??1);const a=q("aoMap",t).sample(_e(s,e.aoMap)).r;u=z(R(1),a,i)}else e instanceof C&&e.outputRoughness;const f=E("opacity",e.opacity??1);let g=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;g=q("alphaMap",t).sample(_e(s,e.alphaMap)).r}g=g.multiply(f)}else e instanceof C&&null!=e.outputOpacity&&(g=e.outputOpacity);let M=B(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=A("color",(new i.Vector3).setFromColor(e.color));const a=e.map??Je,n=E("useAlbedoMap",null!=e.map?1:0),r=q("map",a).sample(_e(s,e.map)),o=r.multiply(B(t,1)),l=B(t,1);M=z(l,o,n),e.vertexColors&&(M=M.multiply(_(I($.color.rgb),1)));const h=z(R(1),r.w,n);g=g.multiply(h)}const v=!0===e.userData.hasBloom;let P=D(0);if(e instanceof i.MeshStandardMaterial||e instanceof i.MeshLambertMaterial||e instanceof i.MeshToonMaterial||e instanceof i.MeshPhongMaterial){const t=A("emissive",(new i.Vector3).setFromColor(e.emissive)),a=E("emissiveIntensity",e.emissiveIntensity),n=e.emissiveMap??Xe,r=E("useEmissiveMap",null!=e.emissiveMap?1:0),o=q("emissiveMap",n).sample(_e(s,e.emissiveMap)).rgb.multiply(t);P=z(t,o,r),P=P.multiplyScalar(a)}else e instanceof C&&null!=e.outputEmissive&&(P=e.outputEmissive);let y=null;if(e instanceof i.MeshPhysicalMaterial&&e.sheen>0&&(y=A("sheenColor",(new i.Vector3).setFromColor(e.sheenColor).multiplyScalar(e.sheen)),e.sheen>0&&null!=e.sheenColorMap)){const t=q("sheenColorMap",e.sheenColorMap).sample(s).rgb;y=y.multiply(t)}let b=null;if(e instanceof i.MeshPhysicalMaterial&&e.sheen>0&&(b=E("sheenRoughness",e.sheenRoughness),e.sheen>0&&null!=e.sheenRoughnessMap)){const t=q("sheenRoughnessMap",e.sheenRoughnessMap).sample(s).r;b=b.multiply(t)}let w=null;if(e instanceof i.MeshPhysicalMaterial&&e.anisotropy>0&&(w=E("anisotropy",e.anisotropy),e.anisotropy>0&&null!=e.anisotropyMap)){const t=q("anisotropyMap",e.anisotropyMap).sample(s).r;w=w.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 T=this.usesShaderUniform(e,ie),j=this.usesShaderUniform(e,ue),k=this.usesShaderUniform(e,ce),X=e.transparent&&e.alphaTest<=.01||e.blending===i.AdditiveBlending,Y=E("alphaTest",e.alphaTest);let K,Q=e.alphaTest>0?g.lt(Y):X&&t===$e.opaque?g.lt(.8):null;!0===e.userData.isDecal&&(Q=Q?Q.or(Ie):Ie),K=X?_(0,0,0,0):(r=o,G(r).multiplyScalar(.5).addScalar(.5)).rgba(e.userData?.reflective?l:1);const Z=e instanceof C?e.outputPosition:void 0,ee=e instanceof C?e.outputTransform:void 0;let te,se=B("black",1);if(e instanceof C&&null!=e.outputColor)se=e.outputColor;else if(e instanceof i.MeshStandardMaterial)se=U({color:M,metalness:c,roughness:l,emissive:P.rgb,normal:o,ambientOcclusion:u,ambientOcclusionIntensity:d,bakedLight:h,sheenColor:y,sheenRoughness:b,anisotropy:w,anisotropyDirection:x});else if(e instanceof i.MeshLambertMaterial||e instanceof i.MeshPhongMaterial)se=F({color:M.rgb,ambientOcclusion:u,ambientOcclusionIntensity:d});else if(e instanceof i.MeshBasicMaterial){let e=M.rgb,t=h??D("black");null!=u&&(t=t.multiplyScalar(u.subtract(1).multiply(d).add(1))),e=e.add(t),se=e.rgba(g)}else e instanceof i.MeshToonMaterial&&(se=O({color:M,emissive:P.rgb,normal:o,ambientOcclusion:u,ambientOcclusionIntensity:d,bakedLight:h}));(e instanceof C||e instanceof i.MeshStandardMaterial)&&(te=e.envMap);let ae=!0;(e instanceof m||e instanceof i.MeshBasicMaterial||e instanceof i.ShaderMaterial)&&(ae=e.fog);let ne=B(se.rgb,g);ae&&(ne=new FogNode(ne));let re=!0;if(t===$e.opaque?(re&&(re=!T&&!j&&!k),re&&(re=!X)):t===$e.transparent&&re&&(re=X||T||j||k),!re)return n=Ke,a.set(e,n),n;n=new C({transform:ee,position:null==ee?Z:void 0,outputs:[ne,P.rgba(t===$e.opaque?Y:v?1:0),K],opacity:g,outputEncoding:!1,fog:ae,transparent:e.transparent,lights:!0,envMap:te,alphaTest:e.alphaTest,uniformNodes:e.uniformNodes??{},discard:Q}),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[ce]&&(n.uniforms[ce].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,X?(n.depthWrite=!e.transparent,n.depthTest=e.depthTest,n.colorWrite=t===$e.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=re,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,ue)&&this.initSceneColorUniform(n),this.initLightVolumeUniform(n),n}isDepthPrepassEnabled(){return!0===this.options.depthPrepass?.enabled}usesSceneFeedbackUniforms(e){return e instanceof p&&(this.usesShaderUniform(e,ie)||this.usesShaderUniform(e,ue)||this.usesShaderUniform(e,ce))}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 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(q("map",e.map).sample(V.uv).a)),null!=e.alphaMap&&(a=a.multiply(q("alphaMap",e.alphaMap).sample(V.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:[B(0,0),B(0,0),B(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 Ut)delete t.uniforms[e];for(const e of Et)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,Me(this.scene,s=>{if(Tt(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()}loop(t,s=!1){const a=this.stats,n=a.addPanel(new ee.Panel("Calls","#83f","#002")),l=a.addPanel(new ee.Panel("Triangles","#c32","#002"));let h;navigator.userAgent.includes("Chrome")&&navigator.userAgent.includes("HologyEngine")&&(h=new me(this.renderer.getContext()),a.addPanel(h)),this.showStats=s;let p=10,c=1e3;const u=()=>{const e=this.renderer.info.render.calls;e>p&&(p=e,setTimeout(()=>p=10,5e3)),n.update(e,p);const t=this.renderer.info.render.triangles;t>c&&(c=t,setTimeout(()=>c=1e3,5e3)),l.update(t,c)};performance.now();i.Ray.prototype.intersectTriangle;this.resizeRender();const d=[],m=[],f=[];let g=0;const M=new r,v=new r;let P=0;let y=this.paused,b=!1,w=0,x=null,T=this.fpsCapRevision;const S=()=>{this.running&&!0!==this.options.enableXR&&requestAnimationFrame(E)},R=()=>{e.activeView=this,b&&(b=!1,requestAnimationFrame(()=>E(w)))},U=st();tt.set(this.container,e=>{this.isIntersecting=e,e&&R()}),U.observe(this.container),this.container.addEventListener("pointerdown",()=>{R()},{capture:!0});const E=s=>{b=!1;const n=this.renderer.getContext();if(!this.running||null===this.container.offsetParent||this.paused&&n.drawingBufferHeight>1)return b=!0,w=s,setTimeout(()=>{b&&E(s)},500),void(this.paused&&(y=!0));if(this.renderer.domElement.parentElement!==this.container){if(e.activeView!==this&&null!==e.activeView)return b=!0,void(w=s);this.attachRendererDomElement(),this.resizeRender()}if(!0!==this.options.enableXR){T!==this.fpsCapRevision&&(T=this.fpsCapRevision,x=null);const e=this.fpsCap;if(null!=e){const t=1e3/e;if(null!=x){const e=s-x;if(e<t)return void S();x=s-e%t}else x=s}else x=s}let r=(s*=.001)-g;if(g=s,y?(r=.016,y=!1,this.resetUpscalingHistory()):r>.25&&this.resetUpscalingHistory(),this.updateDynamicResolution(r,1e3*s),this.applyPostProcessSettings(),this.renderer.autoClear=!1,this.renderer.setViewport(0,0,this.container.clientWidth,this.container.clientHeight),a.begin(),this.showStats&&h?.startQuery(),this.ssrPass.gpuPanel=h,M.copy(this.camera.matrixWorld),r>1){let e=r;for(;e>.05;)t(at),e-=at;t(e)}else t(r);this.onLoopCallbacks.forEach(e=>e(r)),this.paused||(this.simulationTime+=r*this.simulationTimeScale);const l=this.simulationTime;this.camera?.updateMatrixWorld(),v.copy(this.camera.matrixWorld),s-P>.08&&!v.equals(M)&&(this.renderer.shadowMap.needsUpdate=!0,P=s),this.updateCsm();let p=!1;d.length=0,m.length=0,f.length=0;const c=lt;pt.multiplyMatrices(this.camera.projectionMatrix,this.camera.matrixWorldInverse),c.setFromProjectionMatrix(pt);let R=!1,U=!1,A=!1;this.scene.traverseVisible(e=>{if(this.setupCsm(e),this.outlineEffect.apply(e),e instanceof Fe&&(R=!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&&ot(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[ie])&&isObjectInFrustum(e,c)?(this.initDepthUniform(e.material),U=!0):e instanceof X&&(e.visible=!1,m.push(e)),(e instanceof o||e instanceof i.Sprite)&&e.material?.uniforms&&null!=e.material?.uniforms[ce]&&isObjectInFrustum(e,c)&&e.material instanceof C&&this.initAoUniform(e.material),e instanceof o||e instanceof i.Sprite){let t=!1;ot(e,e=>{this.usesShaderUniform(e,ue)&&(this.initSceneColorUniform(e),t=!0)}),t&&(f.push(e),A=!0)}if(e instanceof o&&e.material?.uniforms&&null!=e.material?.uniforms[pe])e.material.uniforms[pe].value=l;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=l)}),this.bloomPass.enabled=p,this.prepareUpscalingFrame(),this.renderer.setRenderTarget(this.gRenderTarget),this.renderer.clear(),this.renderDepthPrepass(),this.renderScene($e.opaque),this.aoPass.output=te.OUTPUT.Off,(U||A)&&(this.fquadCopyOpaque.material.uniforms.tSceneColor.value=this.gRenderTarget.textures[0],this.fquadCopyOpaque.material.uniforms.tDepthTexture.value=this.gRenderTarget.depthTexture,this.initResolutionUniform(this.fquadCopyOpaque.material),this.renderer.setRenderTarget(this.sceneColorRenderTarget),this.renderer.clear(),this.fquadCopyOpaque.render(this.renderer),this.renderer.setRenderTarget(this.gRenderTarget)),f.length,d.forEach(e=>e.visible=!0),m.forEach(e=>e.visible=!0),f.forEach(e=>e.visible=!0),this.aoPass.enabled,this.ssrPass&&(this.ssrPass.elapsedTime=s),this.volumetricFogPass&&R?(this.volumetricFogPass.update(this.camera,this.gRenderTarget,this.csm,this.scene),this.volumetricFogPass.enabled=!0):this.volumetricFogPass&&(this.volumetricFogPass.enabled=!1),this.updatePostProcessEffectUniforms(l);try{!this.paused&&this.running&&(this.render(r),this.finishUpscalingFrame(),this.showStats&&h?.endQuery(),this.showStats&&u(),this.renderer.info.reset(),this.renderOverlay())}catch(e){console.warn(e)}finally{this.finishUpscalingFrame()}a.end(),this.csm?.update(),S()};!0===this.options.enableXR?this.renderer.setAnimationLoop(E):requestAnimationFrame(E)}applyGBufferMaterials(e){const t=this.gBufferCachedMaterials,s=this.gBufferCachedVisibility;t.clear(),s.length=0;Me(this.scene,i=>{if(Tt(i))return s.push(i),i.visible=!1,!1;if(i instanceof o){t.set(i,i.material);let a=!1;if(Array.isArray(i.material)){i.material=i.material.slice();for(let t=0;t<i.material.length;t++)i.material[t]=this.createGBufferMaterial(i.material[t],e,e===$e.opaque&&this.isDepthPrepassEligibleMesh(i)),a||(a=i.material[t].visible),this.initShadowUniform(i,i.material[t])}else i.material=this.createGBufferMaterial(i.material,e,e===$e.opaque&&this.isDepthPrepassEligibleMesh(i)),a||(a=i.material.visible),this.initShadowUniform(i,i.material);a?i.visible=!0:null!=i.children&&0!=i.children.length||(s.push(i),i.visible=!1)}})}unapplyGBufferMaterials(){this.gBufferCachedMaterials.forEach((e,t)=>{t.material=e}),this.gBufferCachedVisibility.forEach((e,t)=>{e.visible=!0,e.updateMatrixWorld(!0)})}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.renderer.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.renderer.initTexture(s),this._initiatedTextures.add(s)}}async compileAsync(e=this.scene){if(this.compileInProgress)return;this.renderer.setRenderTarget(this.gRenderTarget),this.compileInProgress=!0,this.applyGBufferMaterials($e.opaque),await this.renderer.compileAsync(e,this.camera),this.unapplyGBufferMaterials(),this.applyGBufferMaterials($e.transparent),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.fquadCopyOpaque.mesh,this.fquadCopyOpaque.camera));const t=this.csm.lights[0]?.shadow.camera;null!=t&&(this.applyDepthMaterial(),await this.renderer.compileAsync(e,t),this.unapplyDepthMaterial()),this.compileInProgress=!1,this.renderer.setRenderTarget(null)}applyDepthMaterial(){const e=this.gBufferCachedMaterials;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=Ot:t.material=null)})}unapplyDepthMaterial(){this.gBufferCachedMaterials.forEach((e,t)=>{t.material=e})}renderScene(e){if(!this.running||this.paused)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!==$e.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)}e===$e.opaque&&this.gBufferCachedMaterials.forEach((e,t)=>{!Array.isArray(e)&&!Array.isArray(t.material)&&e instanceof p&&this.updateLightUniformValues(t.material,e)}),this.unapplyGBufferMaterials(),this.renderer.shadowMap.autoUpdate=i,this.scene.matrixWorldAutoUpdate=t,this.scene.matrixAutoUpdate=s}getEnvTexture(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.colorSpace=i.SRGBColorSpace,t}applyPostProcessSettings(){if(0==this.postProcessVolumes.length)return 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=ct(e.globalSaturation,1,1,1),e.globalContrast=ct(e.globalContrast,1,1,1),e.globalGamma=ct(e.globalGamma,1,1,1),e.globalGain=ct(e.globalGain,1,1,1),e.globalOffset=ct(e.globalOffset,0,0,0),e.shadowsSaturation=ct(e.shadowsSaturation,1,1,1),e.shadowsContrast=ct(e.shadowsContrast,1,1,1),e.shadowsGamma=ct(e.shadowsGamma,1,1,1),e.shadowsGain=ct(e.shadowsGain,1,1,1),e.shadowsOffset=ct(e.shadowsOffset,0,0,0),e.shadowsMax=.09,e.midtonesSaturation=ct(e.midtonesSaturation,1,1,1),e.midtonesContrast=ct(e.midtonesContrast,1,1,1),e.midtonesGamma=ct(e.midtonesGamma,1,1,1),e.midtonesGain=ct(e.midtonesGain,1,1,1),e.midtonesOffset=ct(e.midtonesOffset,0,0,0),e.highlightsSaturation=ct(e.highlightsSaturation,1,1,1),e.highlightsContrast=ct(e.highlightsContrast,1,1,1),e.highlightsGamma=ct(e.highlightsGamma,1,1,1),e.highlightsGain=ct(e.highlightsGain,1,1,1),e.highlightsOffset=ct(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;let t,s=!1;if(null==this.camera)return;const a=this.camera.getWorldPosition(gt);let n=[];for(const r of this.postProcessVolumes){if(!nt(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.lutPass.enabled=!1,this.colorPass.enabled=!1,this.dofPass.enabled=!1,this.renderer.toneMapping=this.baseToneMapping,void(this.renderer.toneMappingExposure=this.baseToneMappingExposure);const r=e.vignetteIntensity>ft,o=(h=e.temperature,p=e.temperatureTint,!dt(h,6500)||!dt(p,0));var h,p;const c=(u=e.colorTint,e.colorTintIntensity>ft&&(!dt(u.r,1)||!dt(u.g,1)||!dt(u.b,1)));var u;const d=!(ut((m=e).globalSaturation,1,1,1)&&ut(m.globalContrast,1,1,1)&&ut(m.globalGamma,1,1,1)&&ut(m.globalGain,1,1,1)&&ut(m.globalOffset,0,0,0)&&ut(m.shadowsSaturation,1,1,1)&&ut(m.shadowsContrast,1,1,1)&&ut(m.shadowsGamma,1,1,1)&&ut(m.shadowsGain,1,1,1)&&ut(m.shadowsOffset,0,0,0)&&ut(m.midtonesSaturation,1,1,1)&&ut(m.midtonesContrast,1,1,1)&&ut(m.midtonesGamma,1,1,1)&&ut(m.midtonesGain,1,1,1)&&ut(m.midtonesOffset,0,0,0)&&ut(m.highlightsSaturation,1,1,1)&&ut(m.highlightsContrast,1,1,1)&&ut(m.highlightsGamma,1,1,1)&&ut(m.highlightsGain,1,1,1)&&ut(m.highlightsOffset,0,0,0));var m;const f=o||c||d||r,g=f&&e.tonemapMapping!==i.NoToneMapping,M=null!=t&&e.lutIntensity>ft;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?function(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 vt.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}(Mt,e.temperature,e.temperatureTint):Mt.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.sceneColorRenderTarget.textures[1],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(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,lt)&&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!=ge(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===ke.id)return;this.bloomStoredMaterials[e.uuid]=e.material,!0!==e.material.transparent?e.material=ke:(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[ue]?(e.uniforms[ue]={value:this.sceneColorRenderTarget.texture},void(e.uniformsNeedUpdate=!0)):void(e.uniforms[ue].value!==this.sceneColorRenderTarget.texture&&(e.uniforms[ue].value=this.sceneColorRenderTarget.texture,e.uniformsNeedUpdate=!0))}initDepthUniform(e){e instanceof p&&(e.uniforms[ie].value=this.sceneColorRenderTarget.textures[1],this.camera instanceof l&&(null!=e.uniforms[ne]&&(e.uniforms[ne].value=this.camera.near),null!=e.uniforms[ae]&&(e.uniforms[ae].value=this.camera.far)))}initNormalUniform(e){e instanceof p&&null!=e.uniforms[oe]&&(e.uniforms[oe].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 p&&null!=e.uniforms[re]&&e.uniforms[re].value.set(this.gRenderTarget.width,this.gRenderTarget.height)}initAoUniform(e){if(this.aoPass.enabled){e.uniforms[ce].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=Oe(Ae);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}};it.activeView=null,it=e=t([se(),s("design:paramtypes",[HTMLElement,Object])],it);export{it as RenderingView};export function setRenderingPaused(e){null!=window.editor?.viewer?.renderingView&&(window.editor.viewer.renderingView.paused=e)}const at=.05;function nt(e){let t=e;for(;t;){if(!1===t.visible)return!1;t=t.parent}return!0}function rt(e,t){return e.priority!==t.priority?e.priority-t.priority:e.id-t.id}function ot(e,t){if(Array.isArray(e.material))for(const s of e.material)t(s);else null!=e.material&&t(e.material)}te.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)}})};const lt=new i.Frustum,ht=new i.Box3,pt=new i.Matrix4;export function isObjectInFrustum(e,t){const s=ht.setFromObject(e);return t.intersectsBox(s)}function ct(e,t,s,a){return null==e?new i.Vector3(t,s,a):e.set(t,s,a)}function ut(e,t,s,i){return null!=e&&dt(e.x,t)&&dt(e.y,s)&&dt(e.z,i)}function dt(e,t,s=ft){return Math.abs(e-t)<=s}function mt(e,t){return null!=e&&Number.isFinite(e)&&e>0?e:t}const ft=1e-4,gt=new i.Vector3,Mt=new i.Vector3(1,1,1),vt=new i.Vector3(1,1,1);const Pt=new r,yt=new d;function bt(e,t,s=new i.Matrix3){return yt.copy(e),yt.x*=-1,yt.y*=-1,yt.z*=-1,t.isCubeTexture&&!1===t.isRenderTargetTexture&&(yt.y*=-1,yt.z*=-1),s.setFromMatrix4(Pt.makeRotationFromEuler(yt))}const wt=new C({outputs:[_(0,0,0,0),_(0,0,0,0),B(D("white"),je(4))],transparent:!0}),xt=new i.MeshBasicMaterial({color:"blue",transparent:!0,opacity:.5});wt.depthWrite=!1;new o(new i.BoxGeometry(4,4,4),xt);function Tt(e){return e instanceof i.Sprite||e.isPoints||e.isLine||e.isLineSegments2||e.isTransformControls||e.isTransformControlsGizmo||e instanceof o&&St(e,e.material)}function St(e,t){return null==t||(Array.isArray(t)?t.some(t=>St(e,t)):t instanceof i.RawShaderMaterial||t instanceof i.ShaderMaterial&&!(t instanceof C))}class Rt extends Ve{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=Tt(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 Ct extends Ve{constructor(e){super(),this.fn=e}render(e,t,s,i,a){this.fn(e,t,s,i,a)}}const Ut=["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"],Et=["directionalShadowMap","directionalShadowMatrix","pointLightShadows","pointShadowMap","pointShadowMatrix","spotLightShadows","spotShadowMap"],At=A("fogColor");export class FogNode extends k{constructor(e,t=At){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(j.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 Ot=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 r,Matrix4 as n,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 v,LUTPass as P,RenderPass as y,ShaderPass as b,VRButton as w}from"three-stdlib";import{CSMShader as x,CSMUtil as T}from"./csm.js";import{colorToNormal as R,float as S,NodeShaderMaterial as C,standardMaterial as U,uniformFloat as O,uniformVec3 as E,toonMaterial as A,lambertMaterial as F,normalize as B,rgb as G,rgba as D,transformed as j,varying as I,varyingAttributes as V,varyingTransformed as L,vec4 as _,BooleanExpression as W,select as N,ifDefApply as H,uniformSampler2d as q,RgbaNode as k,mix as z,attributes as $,uniformVec2 as J}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 Q}from"three/examples/jsm/csm/CSM.js";import{RectAreaLightUniformsLib as Z}from"three/examples/jsm/lights/RectAreaLightUniformsLib.js";import ee from"three/examples/jsm/libs/stats.module.js";import{GTAOPass as te}from"three/examples/jsm/postprocessing/GTAOPass.js";import{Service as se}from"typedi";import{depthUniformName as ie,farUniformName as ae,nearUniformName as re,resolutionUniformName as ne,sceneNormalUniformName as oe,screenUV as le,supportsDepthTextureExtension as he}from"./shader-nodes/depth.js";import{elapsedTimeUniformName as pe}from"./shader-nodes/time.js";import{aoMapUniformName as ce,sceneMapUniformName as ue}from"./shader-nodes/scene-sample.js";import{DepthPass as de}from"./utils/three/depth-pass.js";import{GPUStatsPanel as me}from"./utils/three/gpu-stats-panel.js";import{OutlinePass as fe}from"./utils/three/outline-pass.js";import{findFirstVisibleObject as ge,traverseVisibleStop as Me}from"./utils/three/traverse.js";import{clamp as ve}from"./utils/math.js";import{ColorPass as Pe}from"./rendering/color-pass.js";import{PostProcessEffectPass as ye,PostProcessEffectRegistration as be,postProcessEffectStages as we,sanitizePostProcessEffectPriority as xe,sanitizePostProcessEffectStage as Te}from"./rendering/post-process-effect.js";import{SSRPass as Re}from"./rendering/ssr/SSRPass.js";import{SSRShader as Se}from"./rendering/ssr/SSRShader.js";import{VolumetricFogPass as Ce}from"./rendering/fog/volumetric-fog-pass.js";import{OutlineEffect as Ue}from"./rendering/outline-effect.js";import{UnrealBloomPass as Oe}from"./rendering/bloom/UnrealBloomPass.js";import{highPrecisionEyeDepth as Ee}from"./shader-nodes/depth.js";import{packDepthToRGBA as Ae}from"three-shader-graph";import{FogVolumeObject as Fe}from"./rendering/fog/fog-volume-object";import{ParallaxStandardMaterial as Be}from"./shader/builtin/standard-shader.js";import{parallaxOcclusionMapping as Ge}from"./shader-nodes/pom.js";import{FullScreenQuad as De}from"three-stdlib";import{edgeDepthEffect as je}from"./shader-nodes/effects";import{decalDiscard as Ie}from"./shader-nodes/decal.js";import{Pass as Ve}from"three/examples/jsm/Addons.js";import{BatchedMesh2 as Le}from"./scene/batched-mesh-2.js";import{applyUvTiling as _e}from"./shader/uv-nodes.js";import{createPlaceholderTexture as We}from"./utils/three/placeholder-texture.js";import{getTemporalUpscalingJitter as Ne,getUpscalingMethod as He,UpscaleOutputPass as qe}from"./rendering/upscaling-pass.js";T.patchSetupMaterial();const ke=document.createElement("div");ke.style.position="absolute",ke.style.left="50%",ke.style.top="50%",ke.style.color="black",ke.style.zIndex="999";(new i.Layers).set(9);const ze=new i.MeshBasicMaterial({color:"black"}),$e=new i.MeshDepthMaterial;var Je;$e.depthPacking=i.RGBADepthPacking,$e.blending=i.NoBlending,$e.side=i.DoubleSide,function(e){e[e.opaque=0]="opaque",e[e.transparent=1]="transparent"}(Je||(Je={}));const Xe=(()=>{const e=new Uint8Array([255,255,255,255]),t=new i.DataTexture(e,1,1,i.RGBAFormat);return t.needsUpdate=!0,t})(),Ye=(()=>{const e=new Uint8Array([0,0,0,255]),t=new i.DataTexture(e,1,1,i.RGBAFormat);return t.needsUpdate=!0,t})(),Ke=(()=>{const e=new Uint8Array([128,128,255,255]),t=new i.DataTexture(e,1,1,i.RGBAFormat);return t.needsUpdate=!0,t})(),Qe=new C({color:S(0),position:_(S(0))});Qe.visible=!1;const Ze=/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);let et=0,tt=null;const st=new Map;function it(){return null==tt&&(tt=new IntersectionObserver(e=>{for(const t of e){const e=st.get(t.target);e&&e(t.isIntersecting)}},{threshold:0})),tt}let at=e=class{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}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"===He(this.options.upscaling)}resetUpscalingHistory(){this.hasPreviousTemporalViewProjection=!1,this.upscaleOutputPass?.resetHistory()}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=ft(this.options.upscaling?.temporal?.jitterScale,1);Ne(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=ft(this.maxPixelRatio,1),t=ft(window.devicePixelRatio,1);return Math.min(e,t)}getBaseResolutionScale(){return ft(this.resolutionScale,1)}getDynamicResolutionMinScale(){const e=this.getBaseResolutionScale(),t=ft(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(),r=ve(this.dynamicResolutionScale,a,i);mt(r,this.dynamicResolutionScale)||(this.dynamicResolutionScale=r);const n=ft(s.targetFps,60),o=1e3/(null!=this.fpsCap?Math.min(n,this.fpsCap):n),l=1e3*e;this.dynamicResolutionFrameTimeAverage=null==this.dynamicResolutionFrameTimeAverage?l:.9*this.dynamicResolutionFrameTimeAverage+.1*l,this.dynamicResolutionFrameSamples++;const h=Math.max(1,Math.floor(ft(s.sampleFrames,20)));if(this.dynamicResolutionFrameSamples<h)return;const p=ft(s.decreaseCooldown,500),c=ft(s.increaseCooldown,2e3),u=ft(s.decreaseStep,.05),d=ft(s.increaseStep,.025),m=this.dynamicResolutionFrameTimeAverage;let f=r;m>1.12*o&&r>a&&t-this.dynamicResolutionLastAdjustmentAt>=p?f=Math.max(a,r-u):m<.85*o&&r<i&&t-this.dynamicResolutionLastAdjustmentAt>=c&&(f=Math.min(i,r+d)),mt(f,r)||(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 r=t*i,n=s*i;this.dofPass.setSize(r,n),this.fxaaPass.setSize(r,n),this.fxaaPass.uniforms.resolution.value.set(1/r,1/n),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.sceneColorRenderTarget.dispose(),this.sceneColorRenderTarget=this.createSceneColorRenderTarget(this.renderer,this.container),this.copyPass.material.uniforms.tDiffuse.value=this.gRenderTarget.textures[0],this.copyPass.material.uniformsNeedUpdate=!0,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={id:++this.postProcessEffectId,pass:new ye(e),priority:xe(t.priority),stage:Te(t.stage)};return s.pass.enabled=t.enabled??!0,this.postProcessEffects.push(s),this.refreshPostProcessEffectPassOrder(),new be(this,s)}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())}refreshPostProcessEffectPassOrder(){for(const e of this.postProcessEffects)this.composer.removePass(e.pass);for(const e of we){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(ot);for(let e=0;e<i.length;e++)this.composer.insertPass(i[e].pass,s+e)}}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.isIntersecting=!1,this.windowVisible=!0,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=et++,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:We(),normalTexture:We(128,128,255),resolution:this.postProcessEffectResolution,simulationTime:0},this.fquadCopy=new De(new p(f)),this.fquadCopyOpaque=new De(new C({outputs:[q("tSceneColor",We()).sample(V.uv),_(q("tDepthTexture",new i.DepthTexture(1,1)).sample(V.uv).r)]})),this.simulationTime=0,this.simulationTimeScale=1,this.lightProbeIntensity=2,this.fquadBlendAO=(()=>{const e=_(1),t=new C({outputs:[q("tAO",We()).sample(le),e,e],transparent:!0});t.depthWrite=!1,t.depthTest=!1,t.blending=i.MultiplyBlending;return new De(t)})(),this.resolutionScale=1,this.maxPixelRatio=Ze?1:window.devicePixelRatio,this.dynamicResolutionScale=1,this.dynamicResolutionFrameTimeAverage=null,this.dynamicResolutionFrameSamples=0,this.dynamicResolutionLastAdjustmentAt=0,this.upscaleOutputPass=null,this.unjitteredProjectionMatrix=new n,this.temporalJitter=new i.Vector2,this.temporalJitterUv=new i.Vector2,this.currentUnjitteredViewProjectionMatrix=new n,this.currentViewProjectionMatrix=new n,this.currentViewProjectionMatrixInverse=new n,this.previousViewProjectionMatrix=new n,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)try{this.render()}catch(e){}},this.onVisiblityChane=()=>{this.windowVisible=!document.hidden},this.isDepthTextureExtensionSupported=!0,this.onLoopCallbacks=[],this.stats=new ee,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.gBufferCachedMaterials=new Map,this.gBufferCachedVisibility=[],this.gBufferCachedOnBeforeRender=new Map,this._initiatedMaterialTextures=new Set,this._initiatedTextures=new Set,this.compileInProgress=!1,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,e.activeView=this,Z.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 r=new Ue(this.renderer,{defaultThickness:.005,defaultColor:[0,0,0],defaultAlpha:1,defaultKeepAlive:!0});this.outlineEffect=r,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 o=(t.clientWidth||1)/(t.clientHeight||1);const l=new i.PerspectiveCamera(45,o,.5,800);l.layers.enable(19),this.setCamera(l),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,T.renderingView=this,this.isDepthTextureExtensionSupported=he(this.renderer),this.attachRendererDomElement(),this.setupEventListeners(),this.aoMaskDepthRenderTarget=e.createAOMaskDepthRenderTarget(this.renderer,this.container,this.getRenderPixelRatio()),this.sceneColorRenderTarget=this.createSceneColorRenderTarget(this.renderer,this.container);const h=new i.Vector2(t.clientWidth,t.clientHeight),c=(new y(this.scene,this.camera),new b(f,"prevtexture"));c.enabled=!0,c.needsSwap=!0,c.material.uniforms.tDiffuse.value=this.gRenderTarget.textures[0],this.copyPass=c;const u=new Oe(h,1.5,.4,.85);u.threshold=1,u.strength=.9,u.radius=.2,this.bloomPass=u;const d=new te(this.scene,this.camera,this.gRenderTarget.width,this.gRenderTarget.height,{});d.normalRenderTarget?.dispose(),d.setGBuffer(this.gRenderTarget.depthTexture,this.gRenderTarget.textures[2]),d.output=te.OUTPUT.Off,d.enabled=!1,this.aoPass=d,this.fquadBlendAO.material.uniforms.tAO.value=d.pdRenderTarget.texture,Se.fragmentShader=Se.fragmentShader.replace("if(metalness==0.) return;","if(metalness<0.1) return;");const m=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});m.output=Re.OUTPUT.Default,m.blur=!0,m.fresnel=!1,m.distanceAttenuation=!0,m.maxDistance=50,m.selective=!0,m.bouncing=!1,m.opacity=.4,m.enabled=!1!==this.options?.reflection?.enabled,this.ssrPass=m,!1!==this.options.ao?.enabled&&this.composer.addPass(d);const x=new Ut((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(x);const R=new Ut((e,t,s,i,a)=>{this.renderer.setRenderTarget(this.gRenderTarget),this.renderScene(Je.transparent),this.renderer.setRenderTarget(null)});this.composer.addPass(R),this.composer.addPass(c),this.composer.addPass(m),this.phasedRenderPass=new Ct(this.scene,this.camera,this.gRenderTarget),this.composer.addPass(this.phasedRenderPass),this.composer.addPass(u),u.emissiveTexture=this.gRenderTarget.textures[1],this.renderer.info.autoReset=!1,this.volumetricFogPass=new Ce(h),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 S=new Pe;this.composer.addPass(S),this.colorPass=S,S.vignetteEnabled=!1,this.outlinePass=new fe(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 U=new b(M);U.uniforms.resolution.value.set(1/t.clientWidth,1/t.clientHeight),this.composer.addPass(U),this.fxaaPass=U,this.fxaaPass.enabled=!1,!0===s.enableOutlines&&this.setEnableOutlines(!0),new b(v).clear=!1,this.fixStatsStyle(),this.lutPass=new P({}),this.lutPass.enabled=!1,this.composer.addPass(this.lutPass);const O=new b(f,"prevtexture");O.enabled=!0,O.needsSwap=!1,O.material.uniforms.tDiffuse.value=this.gRenderTarget.textures[1],O.renderToScreen=!0;const E=this.isUpscalingEnabled()?new qe(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)}(E),this.outputPass=E,this.upscaleOutputPass=E instanceof qe?E:null,this.composer.addPass(E)}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}setCamera(e){if(this.camera=e,this.resetUpscalingHistory(),this.composer.passes.forEach(t=>{t instanceof y?t.camera=e:t instanceof fe?t.renderCamera=e:(t instanceof de||t instanceof te)&&(t.camera=e)}),this.ssrPass&&(this.ssrPass.camera=e),this.aoPass&&(this.aoPass.camera=e),this.phasedRenderPass&&(this.phasedRenderPass.camera=e),null==this.csm){if(this.csm=new Q({maxFar:80,lightFar:250,lightMargin:20,cascades:Ze?2:3,shadowMapSize:1024*(Ze?.5:1),lightDirection:new i.Vector3(.5,-1,-.6).normalize(),lightIntensity:.5*Math.PI,camera:this.camera,parent:this.scene,mode:"practical"}),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=x.lights_fragment_begin}else this.csm.camera=this.camera,this.camera;this.csm.updateFrustums()}setSelectedObjects(e){if(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())}static createDepthRenderTarget(e,t,s){const a=Math.max(1,Math.floor(t.clientWidth*s)),r=Math.max(1,Math.floor(t.clientHeight*s)),n=new i.WebGLRenderTarget(a,r);return n.texture.minFilter=i.NearestFilter,n.texture.magFilter=i.NearestFilter,n.texture.generateMipmaps=!1,n.stencilBuffer=!1,n.depthTexture=new i.DepthTexture(a,r),n.depthTexture.type=i.UnsignedShortType,n.depthTexture.minFilter=i.NearestFilter,n.depthTexture.magFilter=i.NearestFilter,n}static createAOMaskDepthRenderTarget(e,t,s=e.getPixelRatio()){const a=Math.max(1,t.clientWidth*s),r=Math.max(1,t.clientHeight*s),n=new i.DepthTexture(a,r);n.type=i.UnsignedInt248Type,n.minFilter=i.NearestFilter,n.magFilter=i.NearestFilter;const o=new i.WebGLRenderTarget(a,r,{type:i.HalfFloatType,depthTexture:n});return o.texture.minFilter=i.NearestFilter,o.texture.magFilter=i.NearestFilter,o.texture.generateMipmaps=!1,o.stencilBuffer=!1,o}createSceneColorRenderTarget(e,t){const s=this.gRenderTarget.width,a=this.gRenderTarget.height,r=new i.WebGLRenderTarget(s,a,{count:2,type:i.FloatType,format:i.RGBAFormat,colorSpace:i.SRGBColorSpace,depthBuffer:!1,stencilBuffer:!1});return r.texture.minFilter=i.LinearFilter,r.texture.magFilter=i.LinearFilter,r.texture.generateMipmaps=!1,r.textures[1].minFilter=i.NearestFilter,r.textures[1].magFilter=i.NearestFilter,r}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),r=new i.DepthTexture(s,a);r.type=i.UnsignedIntType,r.minFilter=i.NearestFilter,r.magFilter=i.NearestFilter,this.gRenderTarget=new c(s,a,{count:3,samples:this.options?.msaa??(Ze?void 0:2),minFilter:i.NearestFilter,magFilter:i.NearestFilter,type:i.HalfFloatType,format:i.RGBAFormat,depthTexture:r}),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.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.csm.dispose();for(const e of this.postProcessEffects)this.composer.removePass(e.pass),e.pass.dispose();this.postProcessEffects.length=0,this.detachOwnedDomElements();it().unobserve(this.container),st.delete(this.container),this.volumetricFogPass.dispose(),T.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._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)}get showStats(){return this._showStats}attachRendererDomElement(){const e=this.renderer.domElement;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)}detachOwnedDomElements(){this.renderer.domElement.parentElement===this.container&&this.container.removeChild(this.renderer.domElement),this.stats.dom.parentElement===this.container&&this.container.removeChild(this.stats.dom)}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:wt(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)}}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 Be&&(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===Ot.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||Ot.includes(e)||Et.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 Ot){const t=i[e],a=s[e];null!=a&&null!=t&&(t.value=a.value)}}createGBufferMaterial(e,t,s=!1){const a=t===Je.opaque?this.gbufferMaterialCache:this.tbufferMaterialCache;let r=a.get(e);if(!0===e.userData.isGBufferMaterial)return e;if(null==r){let s=V.uv;if(e instanceof Be&&null!=e.heightMap){const t=O("heightScale",e.heightScale??1);s=Ge(s,q("heightMap",e.heightMap),t)}let o=L.normal;if(e instanceof i.MeshStandardMaterial||e instanceof i.MeshLambertMaterial||e instanceof i.MeshToonMaterial||e instanceof i.MeshPhongMaterial){const t=e.normalMap??Ke,i=O("useNormalMap",null!=e.normalMap?1:0),a=O("normalScale",e.normalScale?.x??1),r=R(q("normalMap",t).sample(_e(s,e.normalMap)),a);o=z(L.normal,r,i)}else e instanceof C&&null!=e.outputNormal&&(o=e.outputNormal);!0!==e.userData.disableAO&&(o=H("DOUBLE_SIDED",o,e=>N(new W("gl_FrontFacing"),e,e.multiplyScalar(-1))));let l=e.userData?.reflective?S(0):S(1);if(e instanceof i.MeshStandardMaterial){const t=O("roughness",e.roughness??1),i=e.roughnessMap??Xe,a=O("useRoughnessMap",null!=e.roughnessMap?1:0),r=q("roughnessMap",i).sample(_e(s,e.roughnessMap)).g.multiply(t);l=z(t,r,a)}else e instanceof C&&null!=e.outputRoughness&&(l=e.outputRoughness);let h=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,i=O("useLightMap",null!=e.lightMap?1:0),a=O("lightMapIntensity",e.lightMapIntensity??1),r=q("lightMap",t).sample(s).rgb.multiplyScalar(a);h=z(G(0),r,i)}let c=S(0);if(e instanceof i.MeshStandardMaterial){const t=O("metalness",e.metalness??0),i=e.metalnessMap??Ye,a=O("useMetalnessMap",null!=e.metalnessMap?1:0),r=q("metalnessMap",i).sample(_e(s,e.metalnessMap)).b.multiply(t);c=z(t,r,a)}else e instanceof C&&e.outputRoughness;let u=null,d=S(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??Xe,i=O("useAoMap",null!=e.aoMap?1:0);d=O("aoMapIntensity",e.aoMapIntensity??1);const a=q("aoMap",t).sample(_e(s,e.aoMap)).r;u=z(S(1),a,i)}else e instanceof C&&e.outputRoughness;const f=O("opacity",e.opacity??1);let g=S(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;g=q("alphaMap",t).sample(_e(s,e.alphaMap)).r}g=g.multiply(f)}else e instanceof C&&null!=e.outputOpacity&&(g=e.outputOpacity);let M=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=E("color",(new i.Vector3).setFromColor(e.color));const a=e.map??Xe,r=O("useAlbedoMap",null!=e.map?1:0),n=q("map",a).sample(_e(s,e.map)),o=n.multiply(D(t,1)),l=D(t,1);M=z(l,o,r),e.vertexColors&&(M=M.multiply(_(I($.color.rgb),1)));const h=z(S(1),n.w,r);g=g.multiply(h)}const v=!0===e.userData.hasBloom;let P=G(0);if(e instanceof i.MeshStandardMaterial||e instanceof i.MeshLambertMaterial||e instanceof i.MeshToonMaterial||e instanceof i.MeshPhongMaterial){const t=E("emissive",(new i.Vector3).setFromColor(e.emissive)),a=O("emissiveIntensity",e.emissiveIntensity),r=e.emissiveMap??Ye,n=O("useEmissiveMap",null!=e.emissiveMap?1:0),o=q("emissiveMap",r).sample(_e(s,e.emissiveMap)).rgb.multiply(t);P=z(t,o,n),P=P.multiplyScalar(a)}else e instanceof C&&null!=e.outputEmissive&&(P=e.outputEmissive);let y=null;if(e instanceof i.MeshPhysicalMaterial&&e.sheen>0&&(y=E("sheenColor",(new i.Vector3).setFromColor(e.sheenColor).multiplyScalar(e.sheen)),e.sheen>0&&null!=e.sheenColorMap)){const t=q("sheenColorMap",e.sheenColorMap).sample(s).rgb;y=y.multiply(t)}let b=null;if(e instanceof i.MeshPhysicalMaterial&&e.sheen>0&&(b=O("sheenRoughness",e.sheenRoughness),e.sheen>0&&null!=e.sheenRoughnessMap)){const t=q("sheenRoughnessMap",e.sheenRoughnessMap).sample(s).r;b=b.multiply(t)}let w=null;if(e instanceof i.MeshPhysicalMaterial&&e.anisotropy>0&&(w=O("anisotropy",e.anisotropy),e.anisotropy>0&&null!=e.anisotropyMap)){const t=q("anisotropyMap",e.anisotropyMap).sample(s).r;w=w.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 T=this.usesShaderUniform(e,ie),j=this.usesShaderUniform(e,ue),k=this.usesShaderUniform(e,ce),X=e.transparent&&e.alphaTest<=.01||e.blending===i.AdditiveBlending,Y=O("alphaTest",e.alphaTest);let K,Q=e.alphaTest>0?g.lt(Y):X&&t===Je.opaque?g.lt(.8):null;!0===e.userData.isDecal&&(Q=Q?Q.or(Ie):Ie),K=X?_(0,0,0,0):(n=o,B(n).multiplyScalar(.5).addScalar(.5)).rgba(e.userData?.reflective?l:1);const Z=e instanceof C?e.outputPosition:void 0,ee=e instanceof C?e.outputTransform:void 0;let te,se=D("black",1);if(e instanceof C&&null!=e.outputColor)se=e.outputColor;else if(e instanceof i.MeshStandardMaterial)se=U({color:M,metalness:c,roughness:l,emissive:P.rgb,normal:o,ambientOcclusion:u,ambientOcclusionIntensity:d,bakedLight:h,sheenColor:y,sheenRoughness:b,anisotropy:w,anisotropyDirection:x});else if(e instanceof i.MeshLambertMaterial||e instanceof i.MeshPhongMaterial)se=F({color:M.rgb,ambientOcclusion:u,ambientOcclusionIntensity:d});else if(e instanceof i.MeshBasicMaterial){let e=M.rgb,t=h??G("black");null!=u&&(t=t.multiplyScalar(u.subtract(1).multiply(d).add(1))),e=e.add(t),se=e.rgba(g)}else e instanceof i.MeshToonMaterial&&(se=A({color:M,emissive:P.rgb,normal:o,ambientOcclusion:u,ambientOcclusionIntensity:d,bakedLight:h}));(e instanceof C||e instanceof i.MeshStandardMaterial)&&(te=e.envMap);let ae=!0;(e instanceof m||e instanceof i.MeshBasicMaterial||e instanceof i.ShaderMaterial)&&(ae=e.fog);let re=D(se.rgb,g);ae&&(re=new FogNode(re));let ne=!0;if(t===Je.opaque?(ne&&(ne=!T&&!j&&!k),ne&&(ne=!X)):t===Je.transparent&&ne&&(ne=X||T||j||k),!ne)return r=Qe,a.set(e,r),r;r=new C({transform:ee,position:null==ee?Z:void 0,outputs:[re,P.rgba(t===Je.opaque?Y:v?1:0),K],opacity:g,outputEncoding:!1,fog:ae,transparent:e.transparent,lights:!0,envMap:te,alphaTest:e.alphaTest,uniformNodes:e.uniformNodes??{},discard:Q}),e instanceof i.MeshStandardMaterial&&null!=e.envMap&&null!=r.uniforms.envMapIntensity&&(r.uniforms.envMapIntensity.value=e.envMapIntensity),"alphaMap"in e&&null!=e.alphaMap&&(r.alphaMap=e.alphaMap),(e instanceof C||e instanceof i.MeshStandardMaterial)&&this.applyEnvMap(r),e instanceof C&&(Object.assign(r.defines,e.defines),null!=r.uniforms[ce]&&(r.uniforms[ce].value=this.aoPass.pdRenderTarget.texture,r.defines.USE_SSAO_MAP="")),r.userData.mrtOutputs=3,r.forceSinglePass=e.forceSinglePass,r.side=e.side,r.blending=e.blending,X?(r.depthWrite=!e.transparent,r.depthTest=e.depthTest,r.colorWrite=t===Je.transparent):(r.depthWrite=e.depthWrite,r.depthTest=e.depthTest),r.visible=e.visible,r.alphaTest=e.alphaTest,r.alphaHash=e.alphaHash,r.vertexColors=e.vertexColors,r.premultipliedAlpha=e.premultipliedAlpha,r.toneMapped=e.toneMapped,r.blendAlpha=e.blendAlpha,r.blendColor=e.blendColor,r.polygonOffset=e.polygonOffset,r.polygonOffsetFactor=e.polygonOffsetFactor,r.polygonOffsetUnits=e.polygonOffsetUnits,r.blending=e.blending,r.wireframe=e.wireframe??!1,r.userData.isGBufferMaterial=!0,r.visible=ne,Object.assign(r.userData,e.userData),r.visible&&(this.csm.setupMaterial(r),e instanceof p&&this.inheritCustomUniformBindings(e,r)),a.set(e,r)}var n;return r.visible&&(e instanceof p?this.updateUniformValues(e,r):this.updateMaterialProperties(e,r)),this.usesShaderUniform(r,ue)&&this.initSceneColorUniform(r),this.initLightVolumeUniform(r),r}isDepthPrepassEnabled(){return!0===this.options.depthPrepass?.enabled}usesSceneFeedbackUniforms(e){return e instanceof p&&(this.usesShaderUniform(e,ie)||this.usesShaderUniform(e,ue)||this.usesShaderUniform(e,ce))}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 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=S(1);e instanceof i.MeshStandardMaterial||e instanceof i.MeshLambertMaterial||e instanceof i.MeshBasicMaterial||e instanceof i.MeshToonMaterial||e instanceof i.MeshPhongMaterial?(a=O("opacity",e.opacity??1),null!=e.map&&(a=a.multiply(q("map",e.map).sample(V.uv).a)),null!=e.alphaMap&&(a=a.multiply(q("alphaMap",e.alphaMap).sample(V.uv).r))):e instanceof C&&(a=e.outputOpacity??S(1)),null!=e.alphaTest&&e.alphaTest>0&&(s=a.lt(e.alphaTest));const r=e instanceof C?e.outputPosition:void 0,n=e instanceof C?e.outputTransform:void 0;t=new C({outputs:[D(0,0),D(0,0),D(0,0)],opacity:a,transform:n,position:null==n?r: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 Ot)delete t.uniforms[e];for(const e of Et)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,Me(this.scene,s=>{if(Rt(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()}loop(t,s=!1){const a=this.stats,r=a.addPanel(new ee.Panel("Calls","#83f","#002")),l=a.addPanel(new ee.Panel("Triangles","#c32","#002"));let h;navigator.userAgent.includes("Chrome")&&navigator.userAgent.includes("HologyEngine")&&(h=new me(this.renderer.getContext()),a.addPanel(h)),this.showStats=s;let p=10,c=1e3;const u=()=>{const e=this.renderer.info.render.calls;e>p&&(p=e,setTimeout(()=>p=10,5e3)),r.update(e,p);const t=this.renderer.info.render.triangles;t>c&&(c=t,setTimeout(()=>c=1e3,5e3)),l.update(t,c)};performance.now();i.Ray.prototype.intersectTriangle;this.resizeRender();const d=[],m=[],f=[];let g=0;const M=new n,v=new n;let P=0;let y=this.paused,b=!1,w=0,x=null,T=this.fpsCapRevision;const R=()=>{this.running&&!0!==this.options.enableXR&&requestAnimationFrame(O)},S=()=>{e.activeView=this,b&&(b=!1,requestAnimationFrame(()=>O(w)))},U=it();st.set(this.container,e=>{this.isIntersecting=e,e&&S()}),U.observe(this.container),this.container.addEventListener("pointerdown",()=>{S()},{capture:!0});const O=s=>{b=!1;const r=this.renderer.getContext();if(!this.running||null===this.container.offsetParent||this.paused&&r.drawingBufferHeight>1)return b=!0,w=s,setTimeout(()=>{b&&O(s)},500),void(this.paused&&(y=!0));if(this.renderer.domElement.parentElement!==this.container){if(e.activeView!==this&&null!==e.activeView)return b=!0,void(w=s);this.attachRendererDomElement(),this.resizeRender()}if(!0!==this.options.enableXR){T!==this.fpsCapRevision&&(T=this.fpsCapRevision,x=null);const e=this.fpsCap;if(null!=e){const t=1e3/e;if(null!=x){const e=s-x;if(e<t)return void R();x=s-e%t}else x=s}else x=s}let n=(s*=.001)-g;if(g=s,y?(n=.016,y=!1,this.resetUpscalingHistory()):n>.25&&this.resetUpscalingHistory(),this.updateDynamicResolution(n,1e3*s),this.applyPostProcessSettings(),this.renderer.autoClear=!1,this.renderer.setViewport(0,0,this.container.clientWidth,this.container.clientHeight),a.begin(),this.showStats&&h?.startQuery(),this.ssrPass.gpuPanel=h,M.copy(this.camera.matrixWorld),n>1){let e=n;for(;e>.05;)t(rt),e-=rt;t(e)}else t(n);this.onLoopCallbacks.forEach(e=>e(n)),this.paused||(this.simulationTime+=n*this.simulationTimeScale);const l=this.simulationTime;this.camera?.updateMatrixWorld(),v.copy(this.camera.matrixWorld),s-P>.08&&!v.equals(M)&&(this.renderer.shadowMap.needsUpdate=!0,P=s),this.updateCsm();let p=!1;d.length=0,m.length=0,f.length=0;const c=ht;ct.multiplyMatrices(this.camera.projectionMatrix,this.camera.matrixWorldInverse),c.setFromProjectionMatrix(ct);let S=!1,U=!1,E=!1;this.scene.traverseVisible(e=>{if(this.setupCsm(e),this.outlineEffect.apply(e),e instanceof Fe&&(S=!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&<(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[ie])&&isObjectInFrustum(e,c)?(this.initDepthUniform(e.material),U=!0):e instanceof X&&(e.visible=!1,m.push(e)),(e instanceof o||e instanceof i.Sprite)&&e.material?.uniforms&&null!=e.material?.uniforms[ce]&&isObjectInFrustum(e,c)&&e.material instanceof C&&this.initAoUniform(e.material),e instanceof o||e instanceof i.Sprite){let t=!1;lt(e,e=>{this.usesShaderUniform(e,ue)&&(this.initSceneColorUniform(e),t=!0)}),t&&(f.push(e),E=!0)}if(e instanceof o&&e.material?.uniforms&&null!=e.material?.uniforms[pe])e.material.uniforms[pe].value=l;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=l)}),this.bloomPass.enabled=p,this.prepareUpscalingFrame(),this.renderer.setRenderTarget(this.gRenderTarget),this.renderer.clear(),this.renderDepthPrepass(),this.renderScene(Je.opaque),this.aoPass.output=te.OUTPUT.Off,(U||E)&&(this.fquadCopyOpaque.material.uniforms.tSceneColor.value=this.gRenderTarget.textures[0],this.fquadCopyOpaque.material.uniforms.tDepthTexture.value=this.gRenderTarget.depthTexture,this.initResolutionUniform(this.fquadCopyOpaque.material),this.renderer.setRenderTarget(this.sceneColorRenderTarget),this.renderer.clear(),this.fquadCopyOpaque.render(this.renderer),this.renderer.setRenderTarget(this.gRenderTarget)),f.length,d.forEach(e=>e.visible=!0),m.forEach(e=>e.visible=!0),f.forEach(e=>e.visible=!0),this.aoPass.enabled,this.ssrPass&&(this.ssrPass.elapsedTime=s),this.volumetricFogPass&&S?(this.volumetricFogPass.update(this.camera,this.gRenderTarget,this.csm,this.scene),this.volumetricFogPass.enabled=!0):this.volumetricFogPass&&(this.volumetricFogPass.enabled=!1),this.updatePostProcessEffectUniforms(l);try{!this.paused&&this.running&&(this.render(n),this.finishUpscalingFrame(),this.showStats&&h?.endQuery(),this.showStats&&u(),this.renderer.info.reset(),this.renderOverlay())}catch(e){console.warn(e)}finally{this.finishUpscalingFrame()}a.end(),this.csm?.update(),R()};!0===this.options.enableXR?this.renderer.setAnimationLoop(O):requestAnimationFrame(O)}applyGBufferMaterials(e){const t=this.gBufferCachedMaterials,s=this.gBufferCachedVisibility,i=this.gBufferCachedOnBeforeRender;t.clear(),s.length=0,i.clear();Me(this.scene,i=>{if(Rt(i))return s.push(i),i.visible=!1,!1;if(i instanceof o){t.set(i,i.material);let a=!1;if(Array.isArray(i.material)){i.material=i.material.slice();for(let t=0;t<i.material.length;t++)i.material[t]=this.createGBufferMaterial(i.material[t],e,e===Je.opaque&&this.isDepthPrepassEligibleMesh(i)),a||(a=i.material[t].visible),this.initShadowUniform(i,i.material[t])}else i.material=this.createGBufferMaterial(i.material,e,e===Je.opaque&&this.isDepthPrepassEligibleMesh(i)),a||(a=i.material.visible),this.initShadowUniform(i,i.material);this.applyGBufferShadowUniformUpdater(i),a?i.visible=!0:null!=i.children&&0!=i.children.length||(s.push(i),i.visible=!1)}})}unapplyGBufferMaterials(){this.gBufferCachedMaterials.forEach((e,t)=>{t.material=e}),this.gBufferCachedOnBeforeRender.forEach((e,t)=>{t.onBeforeRender=e}),this.gBufferCachedOnBeforeRender.clear(),this.gBufferCachedVisibility.forEach((e,t)=>{e.visible=!0,e.updateMatrixWorld(!0)})}applyGBufferShadowUniformUpdater(e){const t=e.onBeforeRender;this.gBufferCachedOnBeforeRender.set(e,t),e.onBeforeRender=(s,i,a,r,n,o)=>{t.call(e,s,i,a,r,n,o),this.initShadowUniform(e,n)}}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.renderer.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.renderer.initTexture(s),this._initiatedTextures.add(s)}}async compileAsync(e=this.scene){if(this.compileInProgress)return;this.renderer.setRenderTarget(this.gRenderTarget),this.compileInProgress=!0,this.applyGBufferMaterials(Je.opaque),await this.renderer.compileAsync(e,this.camera),this.unapplyGBufferMaterials(),this.applyGBufferMaterials(Je.transparent),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.fquadCopyOpaque.mesh,this.fquadCopyOpaque.camera));const t=this.csm.lights[0]?.shadow.camera;null!=t&&(this.applyDepthMaterial(),await this.renderer.compileAsync(e,t),this.unapplyDepthMaterial()),this.compileInProgress=!1,this.renderer.setRenderTarget(null)}applyDepthMaterial(){const e=this.gBufferCachedMaterials;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=Ft:t.material=null)})}unapplyDepthMaterial(){this.gBufferCachedMaterials.forEach((e,t)=>{t.material=e})}renderScene(e){if(!this.running||this.paused)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!==Je.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)}e===Je.opaque&&this.gBufferCachedMaterials.forEach((e,t)=>{!Array.isArray(e)&&!Array.isArray(t.material)&&e instanceof p&&this.updateLightUniformValues(t.material,e)}),this.unapplyGBufferMaterials(),this.renderer.shadowMap.autoUpdate=i,this.scene.matrixWorldAutoUpdate=t,this.scene.matrixAutoUpdate=s}getEnvTexture(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.colorSpace=i.SRGBColorSpace,t}applyPostProcessSettings(){if(0==this.postProcessVolumes.length)return 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=ut(e.globalSaturation,1,1,1),e.globalContrast=ut(e.globalContrast,1,1,1),e.globalGamma=ut(e.globalGamma,1,1,1),e.globalGain=ut(e.globalGain,1,1,1),e.globalOffset=ut(e.globalOffset,0,0,0),e.shadowsSaturation=ut(e.shadowsSaturation,1,1,1),e.shadowsContrast=ut(e.shadowsContrast,1,1,1),e.shadowsGamma=ut(e.shadowsGamma,1,1,1),e.shadowsGain=ut(e.shadowsGain,1,1,1),e.shadowsOffset=ut(e.shadowsOffset,0,0,0),e.shadowsMax=.09,e.midtonesSaturation=ut(e.midtonesSaturation,1,1,1),e.midtonesContrast=ut(e.midtonesContrast,1,1,1),e.midtonesGamma=ut(e.midtonesGamma,1,1,1),e.midtonesGain=ut(e.midtonesGain,1,1,1),e.midtonesOffset=ut(e.midtonesOffset,0,0,0),e.highlightsSaturation=ut(e.highlightsSaturation,1,1,1),e.highlightsContrast=ut(e.highlightsContrast,1,1,1),e.highlightsGamma=ut(e.highlightsGamma,1,1,1),e.highlightsGain=ut(e.highlightsGain,1,1,1),e.highlightsOffset=ut(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;let t,s=!1;if(null==this.camera)return;const a=this.camera.getWorldPosition(Mt);let r=[];for(const n of this.postProcessVolumes){if(!nt(n.object))continue;let o=n.blendWeight??1;const l=n.distanceToPoint(a);l>n.blendRadius||(n.blendRadius>0&&(o*=ve(1-l/n.blendRadius,0,1)),o>1&&(o=1),o>0&&(r.push(n),void 0!==n.settings.tonemapMapping&&(e.tonemapMapping=n.settings.tonemapMapping),void 0!==n.settings.tonemapExposure&&(e.tonemapExposure=i.MathUtils.lerp(e.tonemapExposure,n.settings.tonemapExposure,o)),void 0!==n.settings.envTexture&&(e.envTexture=n.settings.envTexture),void 0!==n.settings.envIntensity&&(e.envIntensity=i.MathUtils.lerp(e.envIntensity,n.settings.envIntensity,o)),void 0!==n.settings.vignetteIntensity&&(e.vignetteIntensity=i.MathUtils.lerp(e.vignetteIntensity,n.settings.vignetteIntensity,o)),void 0!==n.settings.colorTint&&void 0!==n.settings.colorTintIntensity&&n.settings.colorTintIntensity>0&&(e.colorTint=e.colorTint.lerp(n.settings.colorTint,o)),void 0!==n.settings.colorTintIntensity&&(e.colorTintIntensity=i.MathUtils.lerp(e.colorTintIntensity,n.settings.colorTintIntensity,o)),void 0!==n.settings.depthFocus&&(s=!0,e.depthFocus=void 0!==e.depthFocus?i.MathUtils.lerp(e.depthFocus,n.settings.depthFocus,o):n.settings.depthFocus),void 0!==n.settings.depthAperture&&(s=!0,e.depthAperture=void 0!==e.depthAperture?i.MathUtils.lerp(e.depthAperture,n.settings.depthAperture,o):n.settings.depthAperture),void 0!==n.settings.depthMaxBlur&&(s=!0,e.depthMaxBlur=void 0!==e.depthMaxBlur?i.MathUtils.lerp(e.depthMaxBlur,n.settings.depthMaxBlur,o):n.settings.depthMaxBlur),void 0!==n.settings.temperature&&(e.temperature=i.MathUtils.lerp(e.temperature,n.settings.temperature,o)),void 0!==n.settings.temperatureTint&&(e.temperatureTint=i.MathUtils.lerp(e.temperatureTint,n.settings.temperatureTint,o)),void 0!==n.settings.globalSaturation&&e.globalSaturation.lerp(n.settings.globalSaturation,o),void 0!==n.settings.globalContrast&&e.globalContrast.lerp(n.settings.globalContrast,o),void 0!==n.settings.globalGamma&&e.globalGamma.lerp(n.settings.globalGamma,o),void 0!==n.settings.globalGain&&e.globalGain.lerp(n.settings.globalGain,o),void 0!==n.settings.globalOffset&&e.globalOffset.lerp(n.settings.globalOffset,o),void 0!==n.settings.shadowsSaturation&&e.shadowsSaturation.lerp(n.settings.shadowsSaturation,o),void 0!==n.settings.shadowsContrast&&e.shadowsContrast.lerp(n.settings.shadowsContrast,o),void 0!==n.settings.shadowsGamma&&e.shadowsGamma.lerp(n.settings.shadowsGamma,o),void 0!==n.settings.shadowsGain&&e.shadowsGain.lerp(n.settings.shadowsGain,o),void 0!==n.settings.shadowsOffset&&e.shadowsOffset.lerp(n.settings.shadowsOffset,o),void 0!==n.settings.shadowsMax&&(e.shadowsMax=i.MathUtils.lerp(e.shadowsMax,n.settings.shadowsMax,o)),void 0!==n.settings.midtonesSaturation&&e.midtonesSaturation.lerp(n.settings.midtonesSaturation,o),void 0!==n.settings.midtonesContrast&&e.midtonesContrast.lerp(n.settings.midtonesContrast,o),void 0!==n.settings.midtonesGamma&&e.midtonesGamma.lerp(n.settings.midtonesGamma,o),void 0!==n.settings.midtonesGain&&e.midtonesGain.lerp(n.settings.midtonesGain,o),void 0!==n.settings.midtonesOffset&&e.midtonesOffset.lerp(n.settings.midtonesOffset,o),void 0!==n.settings.highlightsSaturation&&e.highlightsSaturation.lerp(n.settings.highlightsSaturation,o),void 0!==n.settings.highlightsContrast&&e.highlightsContrast.lerp(n.settings.highlightsContrast,o),void 0!==n.settings.highlightsGamma&&e.highlightsGamma.lerp(n.settings.highlightsGamma,o),void 0!==n.settings.highlightsGain&&e.highlightsGain.lerp(n.settings.highlightsGain,o),void 0!==n.settings.highlightsOffset&&e.highlightsOffset.lerp(n.settings.highlightsOffset,o),void 0!==n.settings.highlightsMin&&(e.highlightsMin=i.MathUtils.lerp(e.highlightsMin,n.settings.highlightsMin,o)),void 0!==n.settings.lut&&(t=n.settings.lut),void 0!==n.settings.lutIntensity&&(e.lutIntensity=i.MathUtils.lerp(e.lutIntensity,n.settings.lutIntensity,o))))}if(0===r.length)return this.lutPass.enabled=!1,this.colorPass.enabled=!1,this.dofPass.enabled=!1,this.renderer.toneMapping=this.baseToneMapping,void(this.renderer.toneMappingExposure=this.baseToneMappingExposure);const n=e.vignetteIntensity>gt,o=(h=e.temperature,p=e.temperatureTint,!mt(h,6500)||!mt(p,0));var h,p;const c=(u=e.colorTint,e.colorTintIntensity>gt&&(!mt(u.r,1)||!mt(u.g,1)||!mt(u.b,1)));var u;const d=!(dt((m=e).globalSaturation,1,1,1)&&dt(m.globalContrast,1,1,1)&&dt(m.globalGamma,1,1,1)&&dt(m.globalGain,1,1,1)&&dt(m.globalOffset,0,0,0)&&dt(m.shadowsSaturation,1,1,1)&&dt(m.shadowsContrast,1,1,1)&&dt(m.shadowsGamma,1,1,1)&&dt(m.shadowsGain,1,1,1)&&dt(m.shadowsOffset,0,0,0)&&dt(m.midtonesSaturation,1,1,1)&&dt(m.midtonesContrast,1,1,1)&&dt(m.midtonesGamma,1,1,1)&&dt(m.midtonesGain,1,1,1)&&dt(m.midtonesOffset,0,0,0)&&dt(m.highlightsSaturation,1,1,1)&&dt(m.highlightsContrast,1,1,1)&&dt(m.highlightsGamma,1,1,1)&&dt(m.highlightsGain,1,1,1)&&dt(m.highlightsOffset,0,0,0));var m;const f=o||c||d||n,g=f&&e.tonemapMapping!==i.NoToneMapping,M=null!=t&&e.lutIntensity>gt;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?function(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 Pt.set(s,i,a)}(t),a=1+.2*ve(s,-1,1),r=i.x,n=i.y*a,o=i.z,l=Math.max(n,1e-4);return e.set(1/Math.max(r/l,1e-4),1/Math.max(n/l,1e-4),1/Math.max(o/l,1e-4)),e}(vt,e.temperature,e.temperatureTint):vt.set(1,1,1),this.colorPass.vignetteIntensity=e.vignetteIntensity,this.colorPass.vignetteEnabled=n,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.sceneColorRenderTarget.textures[1],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(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,ht)&&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!=ge(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===ze.id)return;this.bloomStoredMaterials[e.uuid]=e.material,!0!==e.material.transparent?e.material=ze:(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[ue]?(e.uniforms[ue]={value:this.sceneColorRenderTarget.texture},void(e.uniformsNeedUpdate=!0)):void(e.uniforms[ue].value!==this.sceneColorRenderTarget.texture&&(e.uniforms[ue].value=this.sceneColorRenderTarget.texture,e.uniformsNeedUpdate=!0))}initDepthUniform(e){e instanceof p&&(e.uniforms[ie].value=this.sceneColorRenderTarget.textures[1],this.camera instanceof l&&(null!=e.uniforms[re]&&(e.uniforms[re].value=this.camera.near),null!=e.uniforms[ae]&&(e.uniforms[ae].value=this.camera.far)))}initNormalUniform(e){e instanceof p&&null!=e.uniforms[oe]&&(e.uniforms[oe].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 p&&null!=e.uniforms[ne]&&e.uniforms[ne].value.set(this.gRenderTarget.width,this.gRenderTarget.height)}initAoUniform(e){if(this.aoPass.enabled){e.uniforms[ce].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(Ee);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}};at.activeView=null,at=e=t([se(),s("design:paramtypes",[HTMLElement,Object])],at);export{at as RenderingView};export function setRenderingPaused(e){null!=window.editor?.viewer?.renderingView&&(window.editor.viewer.renderingView.paused=e)}const rt=.05;function nt(e){let t=e;for(;t;){if(!1===t.visible)return!1;t=t.parent}return!0}function ot(e,t){return e.priority!==t.priority?e.priority-t.priority:e.id-t.id}function lt(e,t){if(Array.isArray(e.material))for(const s of e.material)t(s);else null!=e.material&&t(e.material)}te.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)}})};const ht=new i.Frustum,pt=new i.Box3,ct=new i.Matrix4;export function isObjectInFrustum(e,t){const s=pt.setFromObject(e);return t.intersectsBox(s)}function ut(e,t,s,a){return null==e?new i.Vector3(t,s,a):e.set(t,s,a)}function dt(e,t,s,i){return null!=e&&mt(e.x,t)&&mt(e.y,s)&&mt(e.z,i)}function mt(e,t,s=gt){return Math.abs(e-t)<=s}function ft(e,t){return null!=e&&Number.isFinite(e)&&e>0?e:t}const gt=1e-4,Mt=new i.Vector3,vt=new i.Vector3(1,1,1),Pt=new i.Vector3(1,1,1);const yt=new n,bt=new d;function wt(e,t,s=new i.Matrix3){return bt.copy(e),bt.x*=-1,bt.y*=-1,bt.z*=-1,t.isCubeTexture&&!1===t.isRenderTargetTexture&&(bt.y*=-1,bt.z*=-1),s.setFromMatrix4(yt.makeRotationFromEuler(bt))}const xt=new C({outputs:[_(0,0,0,0),_(0,0,0,0),D(G("white"),je(4))],transparent:!0}),Tt=new i.MeshBasicMaterial({color:"blue",transparent:!0,opacity:.5});xt.depthWrite=!1;new o(new i.BoxGeometry(4,4,4),Tt);function Rt(e){return e instanceof i.Sprite||e.isPoints||e.isLine||e.isLineSegments2||e.isTransformControls||e.isTransformControlsGizmo||e instanceof o&&St(e,e.material)}function St(e,t){return null==t||(Array.isArray(t)?t.some(t=>St(e,t)):t instanceof i.RawShaderMaterial||t instanceof i.ShaderMaterial&&!(t instanceof C))}class Ct extends Ve{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 r=e.autoClear;e.autoClear=!1;const n=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=Rt(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=r,s.depthTexture=p,this.scene.matrixWorldAutoUpdate=n,this.scene.matrixAutoUpdate=l,e.shadowMap.autoUpdate=h}}class Ut extends Ve{constructor(e){super(),this.fn=e}render(e,t,s,i,a){this.fn(e,t,s,i,a)}}const Ot=["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"],Et=["directionalShadowMap","directionalShadowMatrix","pointLightShadows","pointShadowMap","pointShadowMatrix","spotLightShadows","spotShadowMap"],At=E("fogColor");export class FogNode extends k{constructor(e,t=At){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),r=e.get(O("fogFar")),n=e.get(O("fogNear")),o=e.get(O("fogDensity")),l=e.get(I(j.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( ${n}, ${r}, ${l} );\n #endif\n vec4 color_vec4_${t} = vec4(mix(${s}, ${a}, fogFactor_${t}), ${i});\n `,out:`color_vec4_${t}`}}}const Ft=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
|
*/
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{AudioLoader as e,BufferGeometry as t,Euler as r,Group as s,LoadingManager as a,Mesh as i,Object3D as n,Texture as o,TextureLoader as l,Vector3 as c}from"three";import{MTLLoader as h,OBJLoader as u,LUTCubeLoader as m}from"three-stdlib";import{cloneMesh as p}from"../utils/mesh.js";import{pathJoin as d}from"../utils/files.js";import{Subject as f,firstValueFrom as y}from"rxjs";import{BoxCollisionShape as g,CapsuleCollisionShape as w,CollisionShapeSource as x,CylinderCollisionShape as M,SphereCollisionShape as A}from"./collision/collision-shape.js";import{importCollisionShapes as b,isCollisionMesh as _}from"./collision/collision-shape-import.js";import*as S from"three";import{iterateMaterials as L}from"../utils/materials.js";import{applyMaterial as T,getConvertedFbxToGlbAssignedMaterialTextureFlipY as v}from"./materializer.js";import{BufferGeometryUtils as C,DRACOLoader as K,EXRLoader as P,FBXLoader as R,GLTFLoader as k,KTX2Loader as B,TGALoader as F,UltraHDRLoader as I}from"three/examples/jsm/Addons.js";import{disposeScene as W}from"../utils/three/cleanup.js";(()=>{const e=new Uint8Array([255,0,0,255]),t=new S.DataTexture(e,1,1,S.RGBAFormat);t.needsUpdate=!0})();const j=new K;j.setDecoderConfig({type:"js"}),j.setDecoderPath("/assets/draco/");const D=["glb","gltf","fbx","obj"];export class AssetResourceLoader{onError(e){console.error(e)}constructor(){this.cache=new Map,this.textureCache=new Map,this.loadingManager=new a,this.glbLoader=new k(this.loadingManager).setDRACOLoader(j),this.fbxLoader=new R(this.loadingManager),this.objLoader=new u(this.loadingManager),this.textureLoader=new l(this.loadingManager),this.tgaLoader=new F(this.loadingManager),this.exrLoader=new P(this.loadingManager),this.cubeLoader=new m(this.loadingManager),this.hdrLoader=new I(this.loadingManager),this.ktx2Loader=new B(this.loadingManager),this._textureLoader=new S.ImageBitmapLoader(this.loadingManager),this.audioLoader=new e(this.loadingManager),this.initialisedKtx2=!1,this._retrievedMeshes=[],this._retrievedTextures=[],this.makeReady=new f,this.ready=y(this.makeReady),this._texturePromises=new Map,this._arrayTexturesByFileKey=new Map,this._arrayTextureSettingsByFileKey=new Map,this._animationPromises=new Map,this._animationCache=new Map,this.asyncMeshResults=new Map,this.asyncAudioResults=new Map,this.collisionShapeCache=new Map,this.optimizedMeshes=new Set}initKtx2(e){this.initialisedKtx2=!0;null!=getElectronArg("windowId")||import.meta.url.includes(".vite")||import.meta.url.includes("hology/packages/core")?this.ktx2Loader.setTranscoderPath("/assets/basis/"):this.ktx2Loader.setTranscoderPath(new URL("../assets/basis/",import.meta.url).href),this.ktx2Loader.detectSupport(e),this.ktx2Loader.setWorkerLimit(6)}setDataDir(e){this.basePath=d(e,"asset-resources"),this.makeReady.next(!0)}getUri(e){const t=function(e){return U.get(e)}(e),r=getElectronArg("windowId");return null!=r||import.meta.url.includes(".vite")||import.meta.url.includes("hology/packages/core")?d(this.basePath,e)+(null!=r?`?windowId=${r}${null!=t?`&v=${t}`:""}`:""):new URL(d("..",this.basePath,e),import.meta.url).href}async getTexture(e){if(!e||!e.fileKey)return null;if("png"===e.fileFormat||e.fileFormat,this._texturePromises.has(e.id))return this._texturePromises.get(e.id);const t=this._getTexture(e).finally(()=>{this._texturePromises.delete(e.id)});return this._texturePromises.set(e.id,t),t}async _getTexture(e){if(null==e||null==e.fileKey)return null;if(await this.ready,this.textureCache.has(e.id)){const t=this.textureCache.get(e.id);if(null!=e.texture){const r=$(t,e);t.flipY!==r?(t.needsUpdate=!0,t.flipY=r):t.wrapS!==z(e.texture?.wrapS)?(t.needsUpdate=!0,t.wrapS=z(e.texture?.wrapS)):t.wrapT!==z(e.texture?.wrapT)&&(t.wrapT=z(e.texture?.wrapT),t.needsUpdate=!0)}const r=O(Y(e));t.colorSpace!==r&&(t.colorSpace=r,t.needsUpdate=!0)}else try{await this._getTextureLoader(e.fileKey).loadAsync(this.getUri(e.fileKey)).then(t=>(t.texture3D?t=t.texture3D:(t.wrapS=z(e.texture?.wrapS),t.wrapT=z(e.texture?.wrapT),t.flipY=$(t,e),t.colorSpace=O(Y(e))),this.textureCache.set(e.id,t),this._retrievedTextures.push(t),t))}catch(t){return console.warn("Failed to load texture "+e.name,t),null}const t=this.textureCache.get(e.id);return null!=t&&(t.userData.assetId=e.id),t}async getTextureArray(e){const t=e.texture?.textureArrayFileKey,r=e.texture?.textureArrayLayer;if(!t||null==r)return{texture:null,layerIndex:null};if(this._arrayTexturesByFileKey.has(t))this.applyTextureArraySettings(t,this._arrayTexturesByFileKey.get(t),e);else{const r=this._getTextureLoader(t);let s=await r.loadAsync(this.getUri(t));s instanceof o||(s=s.texture3D),this.applyTextureArraySettings(t,s,e),this._arrayTexturesByFileKey.set(t,s),this._retrievedTextures.push(s)}return{texture:this._arrayTexturesByFileKey.get(t),layerIndex:r}}applyTextureArraySettings(e,t,r){const s=function(e){return{wrapS:z(e.texture?.wrapS),wrapT:z(e.texture?.wrapT)}}(r),a=this._arrayTextureSettingsByFileKey.get(e);if(null!=a&&(n=s,(i=a).wrapS!==n.wrapS||i.wrapT!==n.wrapT))return void console.warn(`Texture array ${e} is used with incompatible texture settings. Texture arrays share wrapping; rebuild arrays so incompatible textures are grouped separately.`);var i,n;null==a&&this._arrayTextureSettingsByFileKey.set(e,s);let o=!1;t.wrapS!==s.wrapS&&(t.wrapS=s.wrapS,o=!0),t.wrapT!==s.wrapT&&(t.wrapT=s.wrapT,o=!0),!1!==t.flipY&&(t.flipY=!1,o=!0),o&&(t.needsUpdate=!0)}_getTextureLoader(e){return e?.toLowerCase().endsWith(".tga")?this.tgaLoader:e?.toLowerCase().endsWith(".ktx2")?this.ktx2Loader:e?.toLowerCase().endsWith(".exr")?this.exrLoader:e?.toLowerCase().endsWith(".cube")?this.cubeLoader:this.textureLoader}clearCache(e){this.clearCacheByAsset(e)}clearCacheByAsset(e){null!=e&&(this.clearCacheById(e.id),null!=e.fileKey&&(Array.from(this.cache.keys()).forEach(t=>{t.startsWith(e.fileKey)&&this.cache.delete(t)}),Array.from(this.asyncMeshResults.keys()).forEach(t=>{t.startsWith(e.fileKey)&&this.asyncMeshResults.delete(t)}),Array.from(this._animationCache.keys()).forEach(t=>{t.startsWith(e.fileKey+"|")&&this._animationCache.delete(t)}),Array.from(this._animationPromises.keys()).forEach(t=>{t.startsWith(e.fileKey+"|")&&this._animationPromises.delete(t)}),E(e.fileKey)),null!=e.materialLib&&E(e.materialLib))}clearCacheById(e){const t=Array.from(this.cache.values()).find(t=>t.scene.userData.assetId===e);t&&Array.from(this.cache.keys()).forEach(e=>{this.cache.get(e)===t&&this.cache.delete(e)}),this.textureCache.delete(e),this._texturePromises.delete(e),Array.from(this.collisionShapeCache.keys()).forEach(t=>{t.startsWith(e+"|")&&this.collisionShapeCache.delete(t)})}async getMesh(e,t){if(await this.ready,null==e)return console.error("No asset was provided"),{scene:new s,animations:[]};if(!D.includes(e.fileFormat?.toLowerCase()))return console.error("Unsupported mesh file format "+e.fileFormat,e),{scene:new s,animations:[]};const r=e.fileKey+(!0===t?.mergeGeomtries?"1":"0");if(!this.cache.has(r))try{this.asyncMeshResults.has(r)||this.asyncMeshResults.set(r,this.loadMesh(e).finally(()=>this.asyncMeshResults.delete(r))),this.cache.set(r,await this.asyncMeshResults.get(r))}catch(e){return this.onError(e),{scene:new s,animations:[]}}const a=this.cache.get(r).scene,n=this.computeCollisionShapes(e,a);!0===t?.mergeGeomtries&&this.optimizeDrawGroups(a);const o=p(a),l=this.cache.get(r).animations;o.traverse(e=>{e instanceof i&&e.material instanceof Array&&(e.material=e.material.slice())});const c=new AssetMeshInstance;c.add(o),c.collisionShapes=n,c.animations=l;const h=e.receiveShadow??!0,u=e.castShadow??!1;if(o.traverse(e=>{e.castShadow=u,e.receiveShadow=h}),!0===t?.rescale&&"number"==typeof e.mesh?.rescale&&c.scale.setScalar(e.mesh?.rescale),!0===t?.applyMaterials){const r=t?.materialResolver??this.materialProvider;if(null!=r)for(const t of e.materialAssignments??[])await T(c,t,r,void 0,{textureFlipY:v(e)});else console.warn(`applyMaterials was set to true for ${e.name} but no material resolver was provided.`)}return{scene:c,animations:l}}async getAudio(e){await this.ready;const t=e.fileKey;if(this.asyncAudioResults.has(t))return await this.asyncAudioResults.get(t);const r=this.audioLoader.loadAsync(this.getUri(e.fileKey)).finally(()=>{setTimeout(()=>{this.asyncAudioResults.delete(t)},1e3)});return this.asyncAudioResults.set(t,r),r}async getAnimationClip(e){if(null==e||null==e.fileKey||null==e.anim?.clip)return console.warn("Asset or animation clip name is not defined",e),null;const t=e.anim.clip,r=e.fileKey+"|"+t;if(this._animationCache.has(r))return this._animationCache.get(r);if(this._animationPromises.has(r))return this._animationPromises.get(r);const s=(async()=>{try{const s=await this.getMesh(e),a=s.animations.find(e=>e.name===t);return null!=a&&this._animationCache.set(r,a),a}catch(e){return this.onError(e),null}finally{setTimeout(()=>this._animationPromises.delete(r),1e3)}})();return this._animationPromises.set(r,s),s}computeCollisionShapes(e,t){if(!0!==e.collisionDetection)return[];const r=e.id+"|"+(e.mesh?.collisions?.shapeType??"")+"|"+(e.mesh?.rescale??1)+"|"+JSON.stringify(e.mesh?.colliders??[]);if(!this.collisionShapeCache.has(r)){const s=e.mesh?.colliders??[],a=s.length>0?createAuthoredCollisionShapes(s,e.mesh?.rescale):b(t,e);this.collisionShapeCache.set(r,a)}return this.collisionShapeCache.get(r)}async loadMesh(e){return await this.ready,await this.loadByAsset(e).then(r=>(r.scene.traverse(e=>{e instanceof i&&e.material&&function(e){let t=e.material;if(null==t)return;Array.isArray(t)?e.material=t.map(J):e.material=J(t)}(e),_(e)?e.visible=!1:e instanceof i&&e.geometry instanceof t&&(e.geometry.hasAttribute("normal")||e.geometry.computeVertexNormals())}),this._retrievedMeshes.push(r.scene),r.scene=function(e,t){let r=!1;if(t.traverseVisible(e=>{X.test(e.name)&&(r=!0)}),!r)return t;const s=[],a=[t];for(;a.length>0;){const e=a.shift(),t=e.name.match(X);if(null!=t){const r=parseInt(t[1]);if(0!==r){console.warn(`Skipping LOD level ${r} for now as LOD is not fully supported`),s.push(e);continue}}a.push(...e.children)}for(const e of s)e.removeFromParent();return t}(0,r.scene),function(e){const t=V;V.length=0,e.traverse(e=>{(e instanceof S.Camera||e instanceof S.Light)&&t.push(e)}),t.forEach(e=>e.removeFromParent())}(r.scene),r.scene.userData.assetId=e.id,r))}optimizeDrawGroups(e){if(this.optimizedMeshes.has(e.uuid))return;this.optimizedMeshes.add(e.uuid),e.updateWorldMatrix(!0,!0);const r=[];e.traverse(e=>{e instanceof i&&!(e instanceof S.SkinnedMesh)&&e.geometry instanceof t&&Array.isArray(e.material)&&!_(e)&&r.push({mesh:e,geometry:e.geometry,materialArray:e.material,parent:e.parent})});for(const{mesh:t,geometry:s,materialArray:a,parent:n}of r){t.removeFromParent();for(let r=0;r<a.length;r++){const o=a[r],l=s.groups.filter(e=>e.materialIndex===r);if(0===l.length)continue;const c=this.extractGeometryGroups(s,l);c.groups.length>1&&C.mergeGroups(c);const h=new i(c,o);h.copy(t,!1),h.geometry=c,h.material=o,n?n.add(h):e.add(h)}s.dispose()}let s=!0,a=0,n=0;if(e.traverse(e=>{if(e instanceof i&&e.geometry instanceof t&&!_(e)){a++;const t=Object.keys(e.geometry.attributes).length;t!==n&&0!==n&&(s=!1),n=t}else(e instanceof S.SkinnedMesh||e instanceof S.Bone)&&(s=!1)}),a>1&&s){const r=new Map;e.traverse(s=>{if(s instanceof i&&s.geometry instanceof t&&!_(s)){if(Array.isArray(s.material))return;s.updateWorldMatrix(!0,!0);const t=s.material?.uuid||"default";r.has(t)||r.set(t,{material:s.material,geometries:[],objects:[]});const a=r.get(t),i=e.matrixWorld.clone().invert().multiply(s.matrixWorld);a.geometries.push(s.geometry.clone().applyMatrix4(i)),a.objects.push(s)}});for(const e of r.values())for(const t of e.objects)t.removeFromParent();for(const t of r.values()){let r;r=1===t.geometries.length?t.geometries[0]:C.mergeGeometries(t.geometries,!0),r.groups.length>1&&C.mergeGroups(r),e.add(new i(r,t.material))}}e.traverse(e=>{if(e instanceof i&&e.geometry instanceof t&&!_(e)){const t=e.geometry;!Array.isArray(e.material)&&t.groups.length>1&&C.mergeGroups(t)}})}extractGeometryGroups(e,r){const s=e.index;if(!s){const s=new t;let a=0;for(const e of r)a+=e.count;if(0===a)return s;for(const t in e.attributes){const i=e.attributes[t],n=i.itemSize,o=i.array,l=new(0,o.constructor)(a*n);let c=0;for(const e of r){const t=e.start*n,r=e.count*n;for(let e=0;e<r;e++)l[c+e]=o[t+e];c+=r}const h=new S.BufferAttribute(l,n,i.normalized);s.setAttribute(t,h)}return s.groups=[{start:0,count:a,materialIndex:0}],s}const a=[];for(const e of r)for(let t=0;t<e.count;t++){const r=s.getX(e.start+t);a.push(r)}if(0===a.length)return new t;const i=new Map,n=[];let o=0;for(const e of a)i.has(e)||(i.set(e,o),o++),n.push(i.get(e));if(0===n.length||0===i.size)return new t;const l=new t;for(const t in e.attributes){const r=e.attributes[t],s=r.itemSize,a=r.array,n=new(0,a.constructor)(i.size*s);for(const[e,t]of i)for(let r=0;r<s;r++)n[t*s+r]=a[e*s+r];const o=new S.BufferAttribute(n,s,r.normalized);l.setAttribute(t,o)}const c=new((n.length>0?Math.max(...n):0)>65535?Uint32Array:Uint16Array)(n.length);for(let e=0;e<n.length;e++)c[e]=n[e];return l.setIndex(new S.BufferAttribute(c,1)),l.groups=[{start:0,count:n.length,materialIndex:0}],l}async loadByAsset(e){this.fbxLoader;const t=this.getUri(e.fileKey);switch(e.fileFormat){case"glb":case"gltf":return this.glbLoader.loadAsync(t).then(e=>({scene:e.scene,animations:e.animations}));case"fbx":return this.fbxLoader.loadAsync(t).then(e=>({scene:e,animations:e.animations}));case"obj":if(null!=e.materialLib){const t=new h;t.materialOptions={normalizeRGB:!1};const r=await t.loadAsync(this.getUri(e.materialLib));this.objLoader.setMaterials(r)}return this.objLoader.loadAsync(t).then(e=>(G(e),e)).then(e=>({scene:e,animations:e.animations}))}}disposeAll(){this.cache.clear(),this._retrievedMeshes.forEach(e=>W(e)),this._retrievedTextures.forEach(e=>e.dispose()),this._retrievedMeshes.length=0,this._retrievedTextures.length=0}}const U=new Map;function E(e){U.set(e,(U.get(e)??0)+1)}function G(e){if(e instanceof i)for(const t of L(e.material))t instanceof S.MeshPhongMaterial&&!t.color.isLinear&&(t.color.isLinear=!0);e.children?.forEach(G)}export class AssetMeshInstance extends n{}export function createAuthoredCollisionShapes(e,t=1){const s=null!=t&&0!==t?1/t:1;return e.map(e=>{let t;switch(e.type){case"box":t=new g((new c).fromArray(e.size).multiplyScalar(s));break;case"sphere":t=new A(e.radius*s);break;case"capsule":t=new w(e.length*s,e.radius*s);break;case"cylinder":t=new M(e.radius*s,e.radius*s,e.height*s,16,new r)}return t.source=x.custom,t.offset.fromArray(e.position??[0,0,0]).multiplyScalar(s),t.rotation.fromArray(e.rotation??[0,0,0,"XYZ"]),t})}export function getElectronArg(e){const t=`--${e}=`,r=window.process?.argv.find(e=>e.startsWith(t));return r?.substring(t.length)}function z(e){switch(e){case"clamp":return S.ClampToEdgeWrapping;case"repeat":return S.RepeatWrapping;case"mirror":return S.MirroredRepeatWrapping}return S.RepeatWrapping}function $(e,t){const r=e;return!0!==r.isCompressedTexture&&!0!==r.isCompressedArrayTexture&&(t.texture?.flipY??!0)}function Y(e){return e.texture?.colorSpace??function(e){if("exr"===e.fileFormat||e.fileKey?.toLowerCase().endsWith(".exr"))return"linear";const t=`${e.name} ${e.fileKey??""}`.toLowerCase();if(N.some(e=>t.includes(e)))return"linear";return"srgb"}(e)}function O(e){return"linear"===e?S.LinearSRGBColorSpace:S.SRGBColorSpace}const N=["_normal","_nrm","_nor","_norm","_roughness","_rough","_metalness","_metallic","_metal","_ao","_ambient","_occlusion","_mask","_height","_disp","_displacement","_bump","_opacity"];new S.Matrix4;const V=[];const X=/_LOD(\d+)/;function J(e){let t=e instanceof S.MeshPhysicalMaterial&&0===e.sheen&&0===e.anisotropy;if("MeshLambertMaterial"===e.type||"MeshPhongMaterial"===e.type||t){let t={};(e instanceof S.MeshLambertMaterial||e instanceof S.MeshPhongMaterial||e instanceof S.MeshPhysicalMaterial)&&(t.color=e.color,t.map=e.map,t.bumpMap=e.bumpMap,t.bumpScale=e.bumpScale,t.lightMap=e.lightMap,t.lightMapIntensity=e.lightMapIntensity,t.aoMap=e.aoMap,t.aoMapIntensity=e.aoMapIntensity,t.emissiveMap=e.emissiveMap,t.alphaMap=e.alphaMap,t.envMap=e.envMap,t.envMapRotation=e.envMapRotation,t.wireframe=e.wireframe,t.wireframeLinewidth=e.wireframeLinewidth,t.fog=e.fog,t.opacity=e.opacity,t.transparent=e.transparent,t.side=e.side,t.depthTest=e.depthTest,t.depthWrite=e.depthWrite,t.alphaTest=e.alphaTest,t.displacementMap=e.displacementMap,t.displacementScale=e.displacementScale,t.displacementBias=e.displacementBias);const r=new S.MeshStandardMaterial(t);return r.userData={...e.userData??{}},r.name=e.name,r}return e}/*
|
|
1
|
+
import{AudioLoader as e,BufferGeometry as t,Euler as r,Group as s,LoadingManager as a,Mesh as i,Object3D as n,Texture as o,TextureLoader as l,Vector3 as c}from"three";import{MTLLoader as h,OBJLoader as u,LUTCubeLoader as m}from"three-stdlib";import{cloneMesh as p}from"../utils/mesh.js";import{pathJoin as d}from"../utils/files.js";import{Subject as f,firstValueFrom as y}from"rxjs";import{BoxCollisionShape as g,CapsuleCollisionShape as w,CollisionShapeSource as x,CylinderCollisionShape as M,SphereCollisionShape as A}from"./collision/collision-shape.js";import{importCollisionShapes as b,isCollisionMesh as _}from"./collision/collision-shape-import.js";import*as S from"three";import{iterateMaterials as L}from"../utils/materials.js";import{applyMaterial as T,getConvertedFbxToGlbAssignedMaterialTextureFlipY as v}from"./materializer.js";import{BufferGeometryUtils as C,DRACOLoader as K,EXRLoader as P,FBXLoader as R,GLTFLoader as k,KTX2Loader as B,TGALoader as F,UltraHDRLoader as I}from"three/examples/jsm/Addons.js";import{disposeScene as W}from"../utils/three/cleanup.js";(()=>{const e=new Uint8Array([255,0,0,255]),t=new S.DataTexture(e,1,1,S.RGBAFormat);t.needsUpdate=!0})();const j=new K;j.setDecoderConfig({type:"js"}),j.setDecoderPath("/assets/draco/");const D=["glb","gltf","fbx","obj"];export class AssetResourceLoader{onError(e){console.error(e)}constructor(){this.cache=new Map,this.textureCache=new Map,this.loadingManager=new a,this.glbLoader=new k(this.loadingManager).setDRACOLoader(j),this.fbxLoader=new R(this.loadingManager),this.objLoader=new u(this.loadingManager),this.textureLoader=new l(this.loadingManager),this.tgaLoader=new F(this.loadingManager),this.exrLoader=new P(this.loadingManager),this.cubeLoader=new m(this.loadingManager),this.hdrLoader=new I(this.loadingManager),this.ktx2Loader=new B(this.loadingManager),this._textureLoader=new S.ImageBitmapLoader(this.loadingManager),this.audioLoader=new e(this.loadingManager),this.initialisedKtx2=!1,this._retrievedMeshes=[],this._retrievedTextures=[],this.makeReady=new f,this.ready=y(this.makeReady),this._texturePromises=new Map,this._arrayTexturesByFileKey=new Map,this._arrayTextureSettingsByFileKey=new Map,this._animationPromises=new Map,this._animationCache=new Map,this.asyncMeshResults=new Map,this.asyncAudioResults=new Map,this.collisionShapeCache=new Map,this.optimizedMeshes=new Set}initKtx2(e){this.initialisedKtx2=!0;null!=getElectronArg("windowId")||import.meta.url.includes(".vite")||import.meta.url.includes("hology/packages/core")?this.ktx2Loader.setTranscoderPath("/assets/basis/"):this.ktx2Loader.setTranscoderPath(new URL("../assets/basis/",import.meta.url).href),this.ktx2Loader.detectSupport(e),this.ktx2Loader.setWorkerLimit(6)}setDataDir(e){this.basePath=d(e,"asset-resources"),this.makeReady.next(!0)}getUri(e){const t=function(e){return U.get(e)}(e),r=getElectronArg("windowId");return null!=r||import.meta.url.includes(".vite")||import.meta.url.includes("hology/packages/core")?d(this.basePath,e)+(null!=r?`?windowId=${r}${null!=t?`&v=${t}`:""}`:""):new URL(d("..",this.basePath,e),import.meta.url).href}async getTexture(e){if(!e||!e.fileKey)return null;if("png"===e.fileFormat||e.fileFormat,this._texturePromises.has(e.id))return this._texturePromises.get(e.id);const t=this._getTexture(e).finally(()=>{this._texturePromises.delete(e.id)});return this._texturePromises.set(e.id,t),t}async _getTexture(e){if(null==e||null==e.fileKey)return null;if(await this.ready,this.textureCache.has(e.id)){const t=this.textureCache.get(e.id);if(null!=e.texture){const r=$(t,e);t.flipY!==r?(t.needsUpdate=!0,t.flipY=r):t.wrapS!==z(e.texture?.wrapS)?(t.needsUpdate=!0,t.wrapS=z(e.texture?.wrapS)):t.wrapT!==z(e.texture?.wrapT)&&(t.wrapT=z(e.texture?.wrapT),t.needsUpdate=!0)}const r=O(Y(e));t.colorSpace!==r&&(t.colorSpace=r,t.needsUpdate=!0)}else try{await this._getTextureLoader(e.fileKey).loadAsync(this.getUri(e.fileKey)).then(t=>(t.texture3D?t=t.texture3D:(t.wrapS=z(e.texture?.wrapS),t.wrapT=z(e.texture?.wrapT),t.flipY=$(t,e),t.colorSpace=O(Y(e))),this.textureCache.set(e.id,t),this._retrievedTextures.push(t),t))}catch(t){return console.warn("Failed to load texture "+e.name,t),null}const t=this.textureCache.get(e.id);return null!=t&&(t.userData.assetId=e.id),t}async getTextureArray(e){const t=e.texture?.textureArrayFileKey,r=e.texture?.textureArrayLayer;if(!t||null==r)return{texture:null,layerIndex:null};if(this._arrayTexturesByFileKey.has(t))this.applyTextureArraySettings(t,this._arrayTexturesByFileKey.get(t),e);else{const r=this._getTextureLoader(t);let s=await r.loadAsync(this.getUri(t));s instanceof o||(s=s.texture3D),this.applyTextureArraySettings(t,s,e),this._arrayTexturesByFileKey.set(t,s),this._retrievedTextures.push(s)}return{texture:this._arrayTexturesByFileKey.get(t),layerIndex:r}}applyTextureArraySettings(e,t,r){const s=function(e){return{wrapS:z(e.texture?.wrapS),wrapT:z(e.texture?.wrapT)}}(r),a=this._arrayTextureSettingsByFileKey.get(e);if(null!=a&&(n=s,(i=a).wrapS!==n.wrapS||i.wrapT!==n.wrapT))return void console.warn(`Texture array ${e} is used with incompatible texture settings. Texture arrays share wrapping; rebuild arrays so incompatible textures are grouped separately.`);var i,n;null==a&&this._arrayTextureSettingsByFileKey.set(e,s);let o=!1;t.wrapS!==s.wrapS&&(t.wrapS=s.wrapS,o=!0),t.wrapT!==s.wrapT&&(t.wrapT=s.wrapT,o=!0),!1!==t.flipY&&(t.flipY=!1,o=!0),o&&(t.needsUpdate=!0)}_getTextureLoader(e){return e?.toLowerCase().endsWith(".tga")?this.tgaLoader:e?.toLowerCase().endsWith(".ktx2")?this.ktx2Loader:e?.toLowerCase().endsWith(".exr")?this.exrLoader:e?.toLowerCase().endsWith(".cube")?this.cubeLoader:this.textureLoader}clearCache(e){this.clearCacheByAsset(e)}clearCacheByAsset(e){null!=e&&(this.clearCacheById(e.id),null!=e.fileKey&&(Array.from(this.cache.keys()).forEach(t=>{t.startsWith(e.fileKey)&&this.cache.delete(t)}),Array.from(this.asyncMeshResults.keys()).forEach(t=>{t.startsWith(e.fileKey)&&this.asyncMeshResults.delete(t)}),Array.from(this._animationCache.keys()).forEach(t=>{t.startsWith(e.fileKey+"|")&&this._animationCache.delete(t)}),Array.from(this._animationPromises.keys()).forEach(t=>{t.startsWith(e.fileKey+"|")&&this._animationPromises.delete(t)}),E(e.fileKey)),null!=e.materialLib&&E(e.materialLib))}clearCacheById(e){const t=Array.from(this.cache.values()).find(t=>t.scene.userData.assetId===e);t&&Array.from(this.cache.keys()).forEach(e=>{this.cache.get(e)===t&&this.cache.delete(e)}),this.textureCache.delete(e),this._texturePromises.delete(e),Array.from(this.collisionShapeCache.keys()).forEach(t=>{t.startsWith(e+"|")&&this.collisionShapeCache.delete(t)})}async getMesh(e,t){if(await this.ready,null==e)return console.error("No asset was provided"),{scene:new s,animations:[]};if(!D.includes(e.fileFormat?.toLowerCase()))return console.error("Unsupported mesh file format "+e.fileFormat,e),{scene:new s,animations:[]};const r=e.fileKey+(!0===t?.mergeGeomtries?"1":"0");if(!this.cache.has(r))try{this.asyncMeshResults.has(r)||this.asyncMeshResults.set(r,this.loadMesh(e).finally(()=>this.asyncMeshResults.delete(r))),this.cache.set(r,await this.asyncMeshResults.get(r))}catch(e){return this.onError(e),{scene:new s,animations:[]}}const a=this.cache.get(r).scene,n=this.computeCollisionShapes(e,a);!0===t?.mergeGeomtries&&this.optimizeDrawGroups(a);const o=p(a),l=this.cache.get(r).animations;o.traverse(e=>{e instanceof i&&e.material instanceof Array&&(e.material=e.material.slice())});const c=new AssetMeshInstance;c.add(o),c.collisionShapes=n,c.animations=l;const h=e.receiveShadow??!1,u=e.castShadow??!1;if(o.traverse(e=>{e.castShadow=u,e.receiveShadow=h}),!0===t?.rescale&&"number"==typeof e.mesh?.rescale&&c.scale.setScalar(e.mesh?.rescale),!0===t?.applyMaterials){const r=t?.materialResolver??this.materialProvider;if(null!=r)for(const t of e.materialAssignments??[])await T(c,t,r,void 0,{textureFlipY:v(e)});else console.warn(`applyMaterials was set to true for ${e.name} but no material resolver was provided.`)}return{scene:c,animations:l}}async getAudio(e){await this.ready;const t=e.fileKey;if(this.asyncAudioResults.has(t))return await this.asyncAudioResults.get(t);const r=this.audioLoader.loadAsync(this.getUri(e.fileKey)).finally(()=>{setTimeout(()=>{this.asyncAudioResults.delete(t)},1e3)});return this.asyncAudioResults.set(t,r),r}async getAnimationClip(e){if(null==e||null==e.fileKey||null==e.anim?.clip)return console.warn("Asset or animation clip name is not defined",e),null;const t=e.anim.clip,r=e.fileKey+"|"+t;if(this._animationCache.has(r))return this._animationCache.get(r);if(this._animationPromises.has(r))return this._animationPromises.get(r);const s=(async()=>{try{const s=await this.getMesh(e),a=s.animations.find(e=>e.name===t);return null!=a&&this._animationCache.set(r,a),a}catch(e){return this.onError(e),null}finally{setTimeout(()=>this._animationPromises.delete(r),1e3)}})();return this._animationPromises.set(r,s),s}computeCollisionShapes(e,t){if(!0!==e.collisionDetection)return[];const r=e.id+"|"+(e.mesh?.collisions?.shapeType??"")+"|"+(e.mesh?.rescale??1)+"|"+JSON.stringify(e.mesh?.colliders??[]);if(!this.collisionShapeCache.has(r)){const s=e.mesh?.colliders??[],a=s.length>0?createAuthoredCollisionShapes(s,e.mesh?.rescale):b(t,e);this.collisionShapeCache.set(r,a)}return this.collisionShapeCache.get(r)}async loadMesh(e){return await this.ready,await this.loadByAsset(e).then(r=>(r.scene.traverse(e=>{e instanceof i&&e.material&&function(e){let t=e.material;if(null==t)return;Array.isArray(t)?e.material=t.map(J):e.material=J(t)}(e),_(e)?e.visible=!1:e instanceof i&&e.geometry instanceof t&&(e.geometry.hasAttribute("normal")||e.geometry.computeVertexNormals())}),this._retrievedMeshes.push(r.scene),r.scene=function(e,t){let r=!1;if(t.traverseVisible(e=>{X.test(e.name)&&(r=!0)}),!r)return t;const s=[],a=[t];for(;a.length>0;){const e=a.shift(),t=e.name.match(X);if(null!=t){const r=parseInt(t[1]);if(0!==r){console.warn(`Skipping LOD level ${r} for now as LOD is not fully supported`),s.push(e);continue}}a.push(...e.children)}for(const e of s)e.removeFromParent();return t}(0,r.scene),function(e){const t=V;V.length=0,e.traverse(e=>{(e instanceof S.Camera||e instanceof S.Light)&&t.push(e)}),t.forEach(e=>e.removeFromParent())}(r.scene),r.scene.userData.assetId=e.id,r))}optimizeDrawGroups(e){if(this.optimizedMeshes.has(e.uuid))return;this.optimizedMeshes.add(e.uuid),e.updateWorldMatrix(!0,!0);const r=[];e.traverse(e=>{e instanceof i&&!(e instanceof S.SkinnedMesh)&&e.geometry instanceof t&&Array.isArray(e.material)&&!_(e)&&r.push({mesh:e,geometry:e.geometry,materialArray:e.material,parent:e.parent})});for(const{mesh:t,geometry:s,materialArray:a,parent:n}of r){t.removeFromParent();for(let r=0;r<a.length;r++){const o=a[r],l=s.groups.filter(e=>e.materialIndex===r);if(0===l.length)continue;const c=this.extractGeometryGroups(s,l);c.groups.length>1&&C.mergeGroups(c);const h=new i(c,o);h.copy(t,!1),h.geometry=c,h.material=o,n?n.add(h):e.add(h)}s.dispose()}let s=!0,a=0,n=0;if(e.traverse(e=>{if(e instanceof i&&e.geometry instanceof t&&!_(e)){a++;const t=Object.keys(e.geometry.attributes).length;t!==n&&0!==n&&(s=!1),n=t}else(e instanceof S.SkinnedMesh||e instanceof S.Bone)&&(s=!1)}),a>1&&s){const r=new Map;e.traverse(s=>{if(s instanceof i&&s.geometry instanceof t&&!_(s)){if(Array.isArray(s.material))return;s.updateWorldMatrix(!0,!0);const t=s.material?.uuid||"default";r.has(t)||r.set(t,{material:s.material,geometries:[],objects:[]});const a=r.get(t),i=e.matrixWorld.clone().invert().multiply(s.matrixWorld);a.geometries.push(s.geometry.clone().applyMatrix4(i)),a.objects.push(s)}});for(const e of r.values())for(const t of e.objects)t.removeFromParent();for(const t of r.values()){let r;r=1===t.geometries.length?t.geometries[0]:C.mergeGeometries(t.geometries,!0),r.groups.length>1&&C.mergeGroups(r),e.add(new i(r,t.material))}}e.traverse(e=>{if(e instanceof i&&e.geometry instanceof t&&!_(e)){const t=e.geometry;!Array.isArray(e.material)&&t.groups.length>1&&C.mergeGroups(t)}})}extractGeometryGroups(e,r){const s=e.index;if(!s){const s=new t;let a=0;for(const e of r)a+=e.count;if(0===a)return s;for(const t in e.attributes){const i=e.attributes[t],n=i.itemSize,o=i.array,l=new(0,o.constructor)(a*n);let c=0;for(const e of r){const t=e.start*n,r=e.count*n;for(let e=0;e<r;e++)l[c+e]=o[t+e];c+=r}const h=new S.BufferAttribute(l,n,i.normalized);s.setAttribute(t,h)}return s.groups=[{start:0,count:a,materialIndex:0}],s}const a=[];for(const e of r)for(let t=0;t<e.count;t++){const r=s.getX(e.start+t);a.push(r)}if(0===a.length)return new t;const i=new Map,n=[];let o=0;for(const e of a)i.has(e)||(i.set(e,o),o++),n.push(i.get(e));if(0===n.length||0===i.size)return new t;const l=new t;for(const t in e.attributes){const r=e.attributes[t],s=r.itemSize,a=r.array,n=new(0,a.constructor)(i.size*s);for(const[e,t]of i)for(let r=0;r<s;r++)n[t*s+r]=a[e*s+r];const o=new S.BufferAttribute(n,s,r.normalized);l.setAttribute(t,o)}const c=new((n.length>0?Math.max(...n):0)>65535?Uint32Array:Uint16Array)(n.length);for(let e=0;e<n.length;e++)c[e]=n[e];return l.setIndex(new S.BufferAttribute(c,1)),l.groups=[{start:0,count:n.length,materialIndex:0}],l}async loadByAsset(e){this.fbxLoader;const t=this.getUri(e.fileKey);switch(e.fileFormat){case"glb":case"gltf":return this.glbLoader.loadAsync(t).then(e=>({scene:e.scene,animations:e.animations}));case"fbx":return this.fbxLoader.loadAsync(t).then(e=>({scene:e,animations:e.animations}));case"obj":if(null!=e.materialLib){const t=new h;t.materialOptions={normalizeRGB:!1};const r=await t.loadAsync(this.getUri(e.materialLib));this.objLoader.setMaterials(r)}return this.objLoader.loadAsync(t).then(e=>(G(e),e)).then(e=>({scene:e,animations:e.animations}))}}disposeAll(){this.cache.clear(),this._retrievedMeshes.forEach(e=>W(e)),this._retrievedTextures.forEach(e=>e.dispose()),this._retrievedMeshes.length=0,this._retrievedTextures.length=0}}const U=new Map;function E(e){U.set(e,(U.get(e)??0)+1)}function G(e){if(e instanceof i)for(const t of L(e.material))t instanceof S.MeshPhongMaterial&&!t.color.isLinear&&(t.color.isLinear=!0);e.children?.forEach(G)}export class AssetMeshInstance extends n{}export function createAuthoredCollisionShapes(e,t=1){const s=null!=t&&0!==t?1/t:1;return e.map(e=>{let t;switch(e.type){case"box":t=new g((new c).fromArray(e.size).multiplyScalar(s));break;case"sphere":t=new A(e.radius*s);break;case"capsule":t=new w(e.length*s,e.radius*s);break;case"cylinder":t=new M(e.radius*s,e.radius*s,e.height*s,16,new r)}return t.source=x.custom,t.offset.fromArray(e.position??[0,0,0]).multiplyScalar(s),t.rotation.fromArray(e.rotation??[0,0,0,"XYZ"]),t})}export function getElectronArg(e){const t=`--${e}=`,r=window.process?.argv.find(e=>e.startsWith(t));return r?.substring(t.length)}function z(e){switch(e){case"clamp":return S.ClampToEdgeWrapping;case"repeat":return S.RepeatWrapping;case"mirror":return S.MirroredRepeatWrapping}return S.RepeatWrapping}function $(e,t){const r=e;return!0!==r.isCompressedTexture&&!0!==r.isCompressedArrayTexture&&(t.texture?.flipY??!0)}function Y(e){return e.texture?.colorSpace??function(e){if("exr"===e.fileFormat||e.fileKey?.toLowerCase().endsWith(".exr"))return"linear";const t=`${e.name} ${e.fileKey??""}`.toLowerCase();if(N.some(e=>t.includes(e)))return"linear";return"srgb"}(e)}function O(e){return"linear"===e?S.LinearSRGBColorSpace:S.SRGBColorSpace}const N=["_normal","_nrm","_nor","_norm","_roughness","_rough","_metalness","_metallic","_metal","_ao","_ambient","_occlusion","_mask","_height","_disp","_displacement","_bump","_opacity"];new S.Matrix4;const V=[];const X=/_LOD(\d+)/;function J(e){let t=e instanceof S.MeshPhysicalMaterial&&0===e.sheen&&0===e.anisotropy;if("MeshLambertMaterial"===e.type||"MeshPhongMaterial"===e.type||t){let t={};(e instanceof S.MeshLambertMaterial||e instanceof S.MeshPhongMaterial||e instanceof S.MeshPhysicalMaterial)&&(t.color=e.color,t.map=e.map,t.bumpMap=e.bumpMap,t.bumpScale=e.bumpScale,t.lightMap=e.lightMap,t.lightMapIntensity=e.lightMapIntensity,t.aoMap=e.aoMap,t.aoMapIntensity=e.aoMapIntensity,t.emissiveMap=e.emissiveMap,t.alphaMap=e.alphaMap,t.envMap=e.envMap,t.envMapRotation=e.envMapRotation,t.wireframe=e.wireframe,t.wireframeLinewidth=e.wireframeLinewidth,t.fog=e.fog,t.opacity=e.opacity,t.transparent=e.transparent,t.side=e.side,t.depthTest=e.depthTest,t.depthWrite=e.depthWrite,t.alphaTest=e.alphaTest,t.displacementMap=e.displacementMap,t.displacementScale=e.displacementScale,t.displacementBias=e.displacementBias);const r=new S.MeshStandardMaterial(t);return r.userData={...e.userData??{}},r.name=e.name,r}return e}/*
|
|
2
2
|
* Copyright (©) 2026 Hology Interactive AB. All rights reserved.
|
|
3
3
|
* See the LICENSE.md file for details.
|
|
4
4
|
*/
|