@hology/core 0.0.245 → 0.0.246
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/vfx/gpu-sprite-compiler.js +1 -1
- package/dist/effects/vfx/gpu-sprite-runtime.d.ts +18 -1
- package/dist/effects/vfx/gpu-sprite-runtime.js +1 -1
- package/dist/effects/vfx/gpu-sprite-template.d.ts +1 -0
- package/dist/effects/vfx/gpu-sprite-template.js +1 -1
- package/dist/effects/vfx/gpu-sprite-world-runtime.d.ts +2 -1
- package/dist/effects/vfx/gpu-sprite-world-runtime.js +1 -1
- package/dist/effects/vfx/gpu-vfx-world-service.d.ts +7 -1
- package/dist/effects/vfx/gpu-vfx-world-service.js +1 -1
- package/dist/effects/vfx/initializsers.d.ts +15 -0
- package/dist/effects/vfx/initializsers.js +1 -1
- package/dist/effects/vfx/vfx-actor.d.ts +2 -0
- package/dist/effects/vfx/vfx-actor.js +1 -1
- package/dist/effects/vfx/vfx-asset.d.ts +7 -3
- package/dist/effects/vfx/vfx-asset.js +1 -1
- package/dist/effects/vfx/vfx-binding-runtime.d.ts +1 -1
- package/dist/effects/vfx/vfx-binding-runtime.js +1 -1
- package/dist/effects/vfx/vfx-defs.d.ts +53 -3
- package/dist/effects/vfx/vfx-defs.js +1 -1
- package/dist/effects/vfx/vfx-input-runtime.d.ts +2 -2
- package/dist/effects/vfx/vfx-input-runtime.js +1 -1
- package/dist/effects/vfx/vfx-materializer.js +1 -1
- package/dist/effects/vfx/vfx-mesh-sampler.d.ts +25 -0
- package/dist/effects/vfx/vfx-mesh-sampler.js +4 -0
- package/dist/scene/materializer.d.ts +3 -0
- package/dist/scene/materializer.js +1 -1
- package/dist/test/gpu-sprite-compiler.test.js +1 -1
- package/dist/test/vfx-mesh-sampler.test.d.ts +2 -0
- package/dist/test/vfx-mesh-sampler.test.js +4 -0
- package/package.json +2 -2
- package/tsconfig.tsbuildinfo +1 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{__decorate as e,__metadata as t}from"tslib";import{ConvexPolyhedronCollisionShape as a,SpriteShader as s}from"@hology/core";import{Subject as r}from"rxjs";import*as i from"three";import{BoxGeometry as n,BufferGeometry as o,Color as l,Euler as c,Fog as u,FogExp2 as d,Group as p,Material as h,Matrix4 as f,Mesh as m,MeshLambertMaterial as g,MeshPhongMaterial as y,MeshStandardMaterial as w,Matrix3 as S,Object3D as b,PointLight as v,Quaternion as M,Scene as A,Texture as x,Vector2 as j,Vector3 as P,Vector4 as D}from"three";import{attributes as I,batchingUniformFloat as O,batchingUniformVec2 as E,batchingUniformVec3 as C,batchingUniformVec4 as k,bool as T,BooleanExpression as V,BooleanNode as z,colorToNormal as N,float as U,deriveNodeShaderMaterial as B,FloatNode as $,ifDefApply as F,mix as W,NodeShaderMaterial as R,rgb as _,rgba as G,RgbNode as L,select as J,standardMaterial as q,Texture2dLookupNode as Y,textureSampler2d as Q,textureSampler2dArray as H,UniformBoolNode as Z,UniformFloatNode as X,UniformSampler2dArraySlice as K,UniformVec2Node as ee,UniformVec3Node as te,UniformVec4Node as ae,varying as se,varyingAttributes as re,varyingTransformed as ie,vec2 as ne,Vec2Node as oe,vec3 as le,Vec3Node as ce,vec4 as ue,Vec4Node as de}from"three-shader-graph";import{Service as pe}from"typedi";import{VfxActor as he}from"../effects/vfx/vfx-actor.js";import{VisualEffect as fe}from"../effects/vfx/vfx-param.js";import{Prefab as me,PrefabOf as ge}from"./objects/prefab.js";import{DataAssetRef as ye}from"./objects/data-asset.js";import{$actorOptions as we,BaseActor as Se}from"../gameplay/actors/actor.js";import be from"../gameplay/actors/builtin/index.js";import{ActorComponent as ve}from"../gameplay/actors/component.js";import{PhysicsBodyType as Me}from"../gameplay/services/physics/physics-system.js";import{NetMode as Ae}from"../gameplay/net/net-session.js";import{NetRole as xe}from"../gameplay/net/service/net-actor-role.js";import{ThreeBlendingMode as je}from"../effects/vfx/vfx-asset.js";import{withInjectionContext as Pe}from"../gameplay/inject.js";import{RenderingView as De}from"../rendering.js";import{markMaterialUniformValuesNeedUpdate as Ie,setMaterialUniformValuesAutoUpdate as Oe}from"../rendering/node-material-webgpu-resolver.js";import{curveSampler as Ee,oneMinus as Ce,particleUniforms as ke,Sampler2DNode as Te}from"../shader-nodes/index.js";import{LambertShader as Ve}from"../shader/builtin/lambert-shader.js";import{LandscapeCompositeShader as ze}from"../shader/builtin/landscape-composite-shader.js";import{LandscapeShader as Ne}from"../shader/builtin/landscape-shader.js";import{StandardShader as Ue}from"../shader/builtin/standard-shader.js";import{UnlitShader as Be}from"../shader/builtin/unlit-shader.js";import{extractShaderParameters as $e,getDataAssetDefinitionType as Fe,getParameterDefinitionId as We,getParameterDefinitionType as Re,isDataAssetDefinitionAbstract as _e,isParameterDefinitionAbstract as Ge,isParameterDefinitionAssignableTo as Le,isParameterDefinitionStructAssignableTo as Je,shaderParameterUniformName as qe}from"../shader/parameter.js";import{ArrayMap as Ye,DefaultMap as Qe,groupBy as He}from"../utils/collections.js";import{iterateMaterials as Ze}from"../utils/materials.js";import{filterChildrenShallow as Xe,filterSceneShallow as Ke,findFirstVisibleMesh as et,findFirstVisibleObject as tt,traverseAsync as at}from"../utils/three/traverse.js";import{AssetMeshInstance as st,AssetResourceLoader as rt}from"./asset-resource-loader.js";import{AssetsProvider as it}from"./assets-provider.js";import{isCollisionMesh as nt}from"./collision/collision-shape-import.js";import{BoxCollisionShape as ot,PhysicalShapeMesh as lt}from"./collision/collision-shape.js";import{LandscapeManager as ct}from"./landscape/landscape-manager.js";import{initLandscape as ut}from"./landscape/landscape.js";import{SectionGrid as dt,smoothNormalsCrossMeshes as pt}from"./landscape/utils.js";import{createGrassFoliageMaterial as ht}from"./materials/grass-foliage.js";import{createGrassMaterial as ft}from"./materials/grass.js";import{getMaterialAttribute as mt}from"./materials/utils/material-painting.js";import{PaintedScatterManager as gt}from"./scatter/painted-scatter-manager.js";import{SurfaceScatterManager as yt}from"./scatter/surface-scatter-manager.js";import{createWaterMaterial as wt}from"./materials/water.js";import{SerializedParamType as St}from"./model.js";import{applyRuntimeParamTypeInference as bt,convertConfiguredParamsToRuntimeTypes as vt,convertConfiguredParamValueToRuntimeType as Mt,inferRuntimeSerializedParamTypeHint as At}from"./custom-param-runtime-types.js";import{ShapeLibrary as xt,ShapeLibraryKeys as jt}from"./objects/shapes.js";import{ambientLightName as Pt,createSky as Dt,defaultSkyMaterial as It}from"./sky.js";import{Curve2 as Ot}from"../utils/curve.js";import{DecalUnlitShader as Et}from"../shader/builtin/decal-unlit-shader.js";import{DecalStandardShader as Ct}from"../shader/builtin/decal-standard-shader.js";import{ClusterGenerator as kt}from"../rendering/cluster-generator.js";import{ColorLayer as Tt,defaultValueColorLayer as Vt,defaultValueMaskLayer as zt,MaskLayer as Nt}from"../shader/color-layer.js";import{LayeredShader as Ut}from"../shader/builtin/layered-shader.js";import{isColorLayerSerialized as Bt}from"../shader/color-layer.js";import{FogVolume as $t}from"../rendering/fog/fog-volume-actor.js";import{UnscaledSprite as Ft}from"../utils/three/unscaled-sprite.js";import{ToonShader as Wt}from"../shader/builtin/toon-shader.js";import{BatchedMesh2 as Rt}from"./batched-mesh-2.js";import{ParallaxStandardMaterial as _t}from"../shader/builtin/standard-shader.js";import{parallaxOcclusionMapping as Gt}from"../shader-nodes/pom.js";import{traverseVisibleEvery as Lt}from"../utils/three/traverse.js";import{BufferGeometryUtils as Jt,RectAreaLightHelper as qt}from"three/examples/jsm/Addons.js";import{createSequenceData as Yt,isSequenceData as Qt,Sequence as Ht}from"../effects/sequence/sequence-data.js";import{applyUvTiling as Zt}from"./../shader/uv-nodes.js";import{buildShaderGraphMaterial as Xt,shaderGraphMaterialSideToThree as Kt}from"../shader/graph/index.js";import{hasExecutableEventGraphDocument as ea}from"../gameplay/event-graph/model.js";import{depthUniformName as ta}from"../shader-nodes/depth.js";export{bt as applyRuntimeParamTypeInference,vt as convertConfiguredParamsToRuntimeTypes,Mt as convertConfiguredParamValueToRuntimeType,At as inferRuntimeSerializedParamTypeHint};const aa={},sa=/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent),ra=/^((?!chrome|android).)*safari/i.test(navigator.userAgent)||(navigator.userAgent.includes("iPhone")||navigator.userAgent.includes("iPad"))&&!!navigator.userAgent.match(/AppleWebKit/)&&!navigator.userAgent.match(/CriOS/);export const shapeDefaultColor="#aaaaaa";export class SceneMaterializerLoader{constructor(e,t,a){this.dataProvider=e,this.assetsService=t,this.assetManagerService=a}get(e,t){return new ia(e,this.dataProvider,this.assetsService,this.assetManagerService,t,[],[],{create:()=>null,initActor:async()=>{}})}}let ia=class{get prefabEventGraphInstances(){return[...this.materializedPrefabEventGraphs.values()]}resolveSceneActor(e){const t=this.prefabInstanceExposedActorMap.get(e)??e;return this.materializedActors.get(t)}constructor(e,t,a,s,n,o,l,c,u=[]){this.scene=e,this.dataProvider=t,this.assetsService=a,this.assetManagerService=s,this.renderingView=n,this.shaders=o,this.actorTypes=l,this.actorProvider=c,this.componentTypes=u,this.objectMap=new Map,this.sceneObjectMap=new Map,this.components=[],this.landscapeManagers=[],this.materializedActors=new Map,this.idToSceneObject=new Map,this.inEditor=!0,this.netMode=Ae.none,this.updated$=new r,this.removed$=new r,this.prefabEventGraphAdded$=new r,this.prefabEventGraphRemoved$=new r,this.error$=new r,this.materializedPrefabEventGraphs=new Map,this.announcedPrefabEventGraphs=new Set,this.editorActorParamSnapshot=new Map,this.editorAttachedActorComponents=new WeakMap,this.livePrefabInstances=new Map,this.assets=new Map,this._canBeInstancedCache=new Map,this.editorStaticDrawChunks=[],this.editorStaticChunkBySource=new WeakMap,this.editorStaticSnapshotBySource=new WeakMap,this.dirtyEditorStaticDrawChunks=new Set,this.editorStaticEditingObjects=new Set,this.editorMatrixWorldEditingObjects=new Set,this.editorStaticSelectedObjects=new Set,this.editorStaticDrawSetSuspended=!1,this.editorStaticDrawSetRebuildQueued=!1,this.editorStaticFullRebuildQueued=!1,this._editorStaticDrawSetsEnabled=!0,this.editorStaticInitialized=!1,this.editorStaticDisposed=!1,this.editorStaticObjectsToRebuild=new Map,this.editorStaticDrawSetUpdated$=new r,this._originalMaterials=new Map,this.worldEnvironmentRequest=0,this.prefabInstanceChain=[],this.prefabInstanceExposedActorMap=new Map,this.geometryCache=new Map,this.collisionShapeCache=new Map,this.assetManagerService.materialProvider=async e=>materialFromAsset(this.assets.get(e)??await this.assetsService.getAsset(e),this.renderingView,this.assetsService,this.assetManagerService,this.shaders),this.originalFog=null,t.onCreate(e=>{this.update(e).finally(()=>this.scheduleEditorStaticDrawSetRebuild()),this.handlePaintedScatterSceneMutation(e),this.handleSurfaceScatterSceneMutation(e)}),t.onUpdate(e=>{this.prepareEditorStaticObjectForMutation(e),this.update(e).finally(()=>this.scheduleEditorStaticDrawSetRebuild(e)),this.handlePaintedScatterSceneMutation(e),this.handleSurfaceScatterSceneMutation(e)}),t.onRemove(e=>{this.prepareEditorStaticObjectForMutation(e),this.remove(e),this.scheduleEditorStaticDrawSetRebuild(),this.handlePaintedScatterSceneMutation(e),this.handleSurfaceScatterSceneMutation(e)}),this.createAssetSubscription=a.onCreate.subscribe(e=>{this.assets.set(e.id,e)}),this.updateSubscription=a.onUpdate.subscribe(async t=>{const a=this.assets.get(t.id);if(this.assets.set(t.id,t),"material"==t.type){const a=[];e.traverse(e=>{if(e instanceof i.Mesh)if(Array.isArray(e.material))for(let s=0;s<e.material.length;s++)a.push(this.refreshMaterial(e,e.material[s],t,s));else a.push(this.refreshMaterial(e,e.material,t))}),await Promise.all(a)}else if("mesh"==t.type){this.findByAssetId(t.id).forEach(async e=>{this.remove(e.userData.src);const t=await this.materializeAndInitActor(e.userData.src);this.updated$.next({object:t,source:e.userData.src}),this.scheduleEditorStaticDrawSetRebuild()});for(const e of this.assets.values())if("prefab"==e.type){if(!e.prefab.objects.some(e=>Cs(e,e=>e.assetId==t.id,this.assets)))continue;this.findByAssetId(e.id).forEach(e=>{this.remove(e.userData.src),this.materializeAndInitActor(e.userData.src).finally(()=>this.scheduleEditorStaticDrawSetRebuild())})}this.landscapeManagers.forEach(e=>{const a=e.source?.grass?.layers?.some(e=>e.meshes.some(e=>e.assetId===t.id));a&&e.queueRefreshScatter(this.renderingView?.camera.position??new P,!0)}),null!=this.surfaceScatterManager&&(this.surfaceScatterManager.usesSourceAsset(t.id)||this.surfaceScatterManager.usesScatterAsset(t.id))&&this.surfaceScatterManager.queueRefresh(!0),this.paintedScatterManager?.usesScatterAsset(t.id)&&this.paintedScatterManager.queueRefresh(!0)}else if("prefab"===t.type){if("prefab"===a?.type&&await this.applyLivePrefabParameterUpdate(a,t))return;if(!this.inEditor)return void console.warn(`Prefab ${t.name??t.id} changed in a way that cannot be applied to its running instances. Respawn or restart to use the saved data.`);this.findByAssetId(t.id).forEach(e=>{const t=e.userData.src;this.remove(t),this.materializeAndInitActor(t).finally(()=>this.scheduleEditorStaticDrawSetRebuild())}),(this.surfaceScatterManager?.usesPrefabAsset(t.id)||this.sceneReferencesPrefabAsset(t.id)&&await this.prefabAssetContainsSurfaceScatter(t))&&await this.refreshSurfaceScatterPresence(!0),(this.paintedScatterManager?.usesPrefabAsset(t.id)||this.sceneReferencesPrefabAsset(t.id)&&await this.prefabAssetContainsPaintedScatter(t))&&await this.refreshPaintedScatterPresence(!0)}else if("vfx"===t.type)for(const e of this.dataProvider.getObjects())await Pa(e,async e=>{"vfx"===e.type&&e.assetId===t.id&&(this.remove(e),await this.materializeAndInitActor(e))});else if("texture"===t.type)await this.refreshMaterialTextures(t);else if("shaderGraph"===t.type){this.scene.traverse(e=>{if(e instanceof m)if(Array.isArray(e.material))for(let a=0;a<e.material.length;a++)this.refreshMaterial(e,e.material[a],t,a);else this.refreshMaterial(e,e.material,t)});for(const e of this.dataProvider.getObjects())await Pa(e,async e=>{if("vfx"===e.type&&null!=e.assetId){const a=this.assets.get(e.assetId);null!=a&&this.vfxAssetUsesShaderGraph(a,t.id)&&(this.remove(e),await this.materializeAndInitActor(e))}})}this.scheduleEditorStaticDrawSetRebuild()})}async refreshMaterialTextures(e){if("texture"!==e.type)return void console.error("Can not refresh material textures. Asset is not a texture",e);const t=new Set,a=new Set,s=s=>{t.has(s)||(t.add(s),this.materialUsesTexture(s,e.id)&&a.add(s))};if(this.scene.traverse(e=>{e instanceof m&&(Array.isArray(e.material)?e.material.forEach(s):s(e.material))}),0===a.size)return;const r=await this.assetManagerService.getTexture(e);if(null!=r)for(const t of a)this.replaceMaterialTextureReferences(t,e.id,r);else console.error("Can not refresh material textures. Texture not found",e)}materialUsesTexture(e,t){if(e instanceof i.ShaderMaterial){for(const a of Object.values(e.uniforms))if(a.value instanceof i.Texture&&a.value.userData.assetId===t)return!0}else for(const a of Object.values(e))if(a instanceof i.Texture&&a.userData.assetId===t)return!0;return!1}replaceMaterialTextureReferences(e,t,a){let s=!1;if(e instanceof i.ShaderMaterial)for(const[r,n]of Object.entries(e.uniforms))n.value instanceof i.Texture&&n.value.userData.assetId===t&&(e.uniforms[r].value=a,s=!0);else for(const[r,n]of Object.entries(e))n instanceof i.Texture&&n.userData.assetId===t&&(e[r]=a,s=!0);s&&(e.needsUpdate=!0,Ie(e))}async getAsset(e){let t=this.assets.get(e);return null==t&&(t=await this.assetsService.getAsset(e),null!=t&&this.assets.set(e,t)),t}async refreshMaterial(e,t,a,s){const r=t?.userData?.assetId;if(r!==a.id){const e=this.assets.get(r);let t=!1;if(null!=e&&("shaderGraph"===a.type&&"asset"===e.material?.shaderGraph?.source&&e.material.shaderGraph.assetId===a.id&&(t=!0),!t&&null!=e.material?.shaderParams))for(const s of Object.values(e.material.shaderParams)){if(s.type===St.Material&&s.value===a.id){t=!0;break}if(s.type===St.Array&&"element"in s&&s.element===St.Material&&s.value.includes(a.id)){t=!0;break}}if(!t)return}const i=await materialFromAsset(this.assets.get(r),this.renderingView,this.assetsService,this.assetManagerService,this.shaders,!1),n=i.userData,o=t.userData.receiveDecals!==n.receiveDecals;i.userData=t.userData,i.userData.hasBloom=n.hasBloom,i.userData.reflective=n.reflective,i.userData.outlineParameters=n.outlineParameters,i.userData.receiveDecals=n.receiveDecals,o&&(t.needsUpdate=!0),null!=s?Ya(e.material[s],i)||(e.material[s]=i):Ya(e.material,i)||(e.material=i,e===this.sky&&this.applySkySettings(e.material))}vfxAssetUsesShaderGraph(e,t){return null!=e.vfx&&e.vfx.emitters.some(e=>this.emitterUsesShaderGraph(e,t))}emitterUsesShaderGraph(e,t){const a=e.output;return"shaderGraph"===a.materialSource&&"asset"===a.shaderGraph?.source&&a.shaderGraph.assetId===t||!!e.children&&e.children.some(e=>this.emitterUsesShaderGraph(e,t))}getTopLevelActors(){return Array.from(this.materializedActors.entries()).filter(([e,t])=>!e.includes("/")).map(([,e])=>e)}get actorInstances(){return Array.from(this.materializedActors.values())}async initTextures(){const e=new Set,t=[];if(await Promise.all(this.collectMaterialAssignments(this.dataProvider.getObjects()).map(async a=>{const s=this.assets.get(a.materialId);if(null!=s?.material)for(const a of Object.values(s.material.shaderParams??{}))if(a.type===St.Texture&&"string"==typeof a.value){const s=this.assets.get(a.value);if(null==s)continue;if(null!=s.texture?.textureArrayFileKey){if(!e.has(s.texture?.textureArrayFileKey)){const a=await this.assetManagerService.getTextureArray(s);null!=a?.texture&&(t.push(a.texture),e.add(s.texture.textureArrayFileKey))}}else{const e=await this.assetManagerService.getTexture(s);null!=e&&t.push(e)}}})),0!==t.length&&this.renderingView&&"webgpu-experimental"!==this.renderingView.options.backend){console.log(`Initializing ${t.length} textures`),console.time("Init textures");for(const e of t)this.renderingView.renderer.initTexture(e);console.timeEnd("Init textures")}}async prefetchAssets(){const e=this.collectAssetMeshIds(this.dataProvider.getObjects());await Promise.all(Array.from(e).map(async e=>{const t=this.assets.get(e);if("mesh"===t?.type)return this.assetManagerService.getMesh(t,{mergeGeomtries:!0})})),this.initTextures()}collectAssetMeshIds(e,t=[],a=new Set){for(const s of e??[])this.collectObjectAssetMeshIds(s,t,a);return a}collectObjectAssetMeshIds(e,t,a){if(this.shouldBeMaterialized(e)&&("asset_mesh"===e.type&&null!=e.assetId&&a.add(e.assetId),null!=e.children&&this.collectAssetMeshIds(e.children,t,a),"prefab"===e.type&&null!=e.assetId&&!t.includes(e.assetId))){const s=this.assets.get(e.assetId);null!=s?.prefab?.objects&&this.collectAssetMeshIds(s.prefab.objects,[...t,e.assetId],a)}}collectMaterialAssignments(e,t=[],a=[]){for(const s of e??[])this.collectObjectMaterialAssignments(s,t,a);return a}collectObjectMaterialAssignments(e,t,a){if(this.shouldBeMaterialized(e)&&("shape_mesh"!==e.type&&"asset_mesh"!==e.type||null==e.materialAssignments||a.push(...e.materialAssignments),null!=e.children&&this.collectMaterialAssignments(e.children,t,a),"prefab"===e.type&&null!=e.assetId&&!t.includes(e.assetId))){const s=this.assets.get(e.assetId);null!=s?.prefab?.objects&&this.collectMaterialAssignments(s.prefab.objects,[...t,e.assetId],a)}}async init(){await this.preInit(),oa.clear(),la.clear(),await this.prefetchAssets(),await Promise.all(this.dataProvider.getObjects().map(e=>this.materialize(e))),await this.initActorsPostInit(),this.generateOcclusionClusters(),this.announcePrefabEventGraphs(),await this.refreshPaintedScatterPresence(!0),await this.refreshSurfaceScatterPresence(!0),this.editorStaticInitialized=!0,this.rebuildEditorStaticDrawSet()}get editorStaticDrawSetsEnabled(){return this._editorStaticDrawSetsEnabled}set editorStaticDrawSetsEnabled(e){this._editorStaticDrawSetsEnabled!==e&&(this._editorStaticDrawSetsEnabled=e,this.editorStaticInitialized&&!this.editorStaticDisposed&&(e?this.rebuildEditorStaticDrawSet():(this.editorStaticDrawSetSuspended=!1,this.editorStaticEditingObjects.clear(),this.editorStaticFullRebuildQueued=!1,this.editorStaticObjectsToRebuild.clear(),this.disposeEditorStaticDrawSet(),this.editorStaticDrawSetUpdated$.next())))}beginEditorStaticSceneEdit(e=[]){for(const e of this.editorMatrixWorldEditingObjects)wa(e,!1);this.editorMatrixWorldEditingObjects.clear();for(const t of e)this.editorMatrixWorldEditingObjects.add(t),wa(t,!0);if(!this._editorStaticDrawSetsEnabled||!this.inEditor||this.editorStaticDrawSetSuspended)return;this.editorStaticDrawSetSuspended=!0,this.editorStaticEditingObjects.clear();const t=new Set;for(const a of e){this.editorStaticEditingObjects.add(a);const e=this.editorStaticChunkBySource.get(a);null!=e&&t.add(e)}for(const e of t)this.disposeEditorStaticDrawChunk(e),this.dirtyEditorStaticDrawChunks.add(e),this.buildEditorStaticDrawChunk(e);this.editorStaticDrawSetUpdated$.next()}setEditorStaticSelectedObjects(e){if(!this.inEditor)return;const t=new Set(e),a=new Set;for(const e of this.editorStaticSelectedObjects)if(!t.has(e)){const t=this.editorStaticChunkBySource.get(e);null!=t&&a.add(t)}for(const e of t)if(!this.editorStaticSelectedObjects.has(e)){const t=this.editorStaticChunkBySource.get(e);null!=t&&a.add(t)}this.editorStaticSelectedObjects.clear();for(const e of t)this.editorStaticSelectedObjects.add(e);if(!this.editorStaticDrawSetSuspended&&"webgpu-experimental"===this.renderingView?.options.backend){for(const e of a)this.disposeEditorStaticDrawChunk(e),this.buildEditorStaticDrawChunk(e);a.size>0&&this.editorStaticDrawSetUpdated$.next()}}endEditorStaticSceneEdit(){for(const e of this.editorMatrixWorldEditingObjects)wa(e,!1);if(this.editorMatrixWorldEditingObjects.clear(),this.editorStaticDrawSetSuspended){this.editorStaticDrawSetSuspended=!1,this.editorStaticEditingObjects.clear();for(const e of this.dirtyEditorStaticDrawChunks)this.disposeEditorStaticDrawChunk(e),this.buildEditorStaticDrawChunk(e);this.dirtyEditorStaticDrawChunks.clear(),this.editorStaticDrawSetUpdated$.next()}}getEditorRenderObject(e){const t=e.userData?.src,a=null!=t?.id?this.sceneObjectMap.get(t.id)??e:e;if(this.editorStaticEditingObjects.has(a)||this.editorStaticSelectedObjects.has(a))return a;const s=this.editorStaticSnapshotBySource.get(a);return!0===s?.chunk.active?s.object:e}scheduleEditorStaticDrawSetRebuild(e){!this.editorStaticDisposed&&this._editorStaticDrawSetsEnabled&&this.inEditor&&!this.editorStaticDrawSetSuspended&&"webgpu-experimental"===this.renderingView?.options.backend&&(null==e?(this.editorStaticFullRebuildQueued=!0,this.editorStaticObjectsToRebuild.clear()):this.editorStaticFullRebuildQueued||this.editorStaticObjectsToRebuild.set(e.id,e),this.editorStaticDrawSetRebuildQueued||(this.editorStaticDrawSetRebuildQueued=!0,queueMicrotask(()=>{if(this.editorStaticDrawSetRebuildQueued=!1,this.editorStaticDisposed||this.editorStaticDrawSetSuspended)return;if(this.editorStaticFullRebuildQueued)return this.editorStaticFullRebuildQueued=!1,void this.rebuildEditorStaticDrawSet();const e=new Set;for(const t of this.editorStaticObjectsToRebuild.values()){const a=this.sceneObjectMap.get(t.id),s=null==a?null:this.editorStaticChunkBySource.get(a);if(null==s){this.editorStaticFullRebuildQueued=!0;break}e.add(s)}if(this.editorStaticObjectsToRebuild.clear(),this.editorStaticFullRebuildQueued)return this.editorStaticFullRebuildQueued=!1,void this.rebuildEditorStaticDrawSet();for(const t of e)this.disposeEditorStaticDrawChunk(t),this.buildEditorStaticDrawChunk(t);this.editorStaticDrawSetUpdated$.next()})))}prepareEditorStaticObjectForMutation(e){const t=this.sceneObjectMap.get(e.id);if(null==t)return;const a=this.editorStaticChunkBySource.get(t);!0===a?.active&&this.disposeEditorStaticDrawChunk(a)}rebuildEditorStaticDrawSet(){if(this.disposeEditorStaticDrawSet(),!this._editorStaticDrawSetsEnabled||!this.inEditor||this.editorStaticDrawSetSuspended||"webgpu-experimental"!==this.renderingView?.options.backend)return;const e=[];for(const t of this.idToSceneObject.values()){if("asset_mesh"!==t.type||!0===t.hidden||t.physics?.type===Me.dynamic)continue;const a=this.sceneObjectMap.get(t.id);null!=a&&this.canUseEditorStaticDrawSet(a)&&e.push(a)}const t=new p;t.name="Hology WebGPU editor static authored objects",t.visible=!1,t.userData.hologyEditorStaticAuthoredRoot=!0,this.scene.add(t),this.editorStaticAuthoredRoot=t,e.sort((e,t)=>{const a=e.userData?.src,s=t.userData?.src,r="asset_mesh"===a?.type?`${a.assetId}:${JSON.stringify(a.materialAssignments??[])}`:"",i="asset_mesh"===s?.type?`${s.assetId}:${JSON.stringify(s.materialAssignments??[])}`:"";return r.localeCompare(i)});for(let t=0;t<e.length;t+=32){const a={sources:e.slice(t,t+32),sourceVisibility:new Map,sourceUpdateMatrixWorld:new Map,sourceParents:new Map,active:!1};this.editorStaticDrawChunks.push(a);for(const e of a.sources)this.editorStaticChunkBySource.set(e,a);this.buildEditorStaticDrawChunk(a)}this.editorStaticDrawSetUpdated$.next()}buildEditorStaticDrawChunk(e){const t=new p;t.name="Hology WebGPU editor static asset mesh chunk",t.userData.hologyEditorStaticSnapshotRoot=!0,e.sourceVisibility.clear(),e.sourceUpdateMatrixWorld.clear(),e.sourceParents.clear();for(const a of e.sources){if(this.editorStaticEditingObjects.has(a)||this.editorStaticSelectedObjects.has(a)){this.editorStaticSnapshotBySource.delete(a);continue}a.updateWorldMatrix(!0,!0);const s=new p;s.name=a.name;const r=a.userData?.src;for(const e of a.children){const t=e.clone(!0),a=[];t.traverse(e=>{const t=e.userData?.src;(nt(e)||null!=t?.id&&null!=r?.id&&t.id!==r.id)&&a.push(e)});for(const e of a)e.removeFromParent();a.includes(t)||s.add(t)}s.matrix.copy(a.matrixWorld),s.matrix.decompose(s.position,s.quaternion,s.scale),s.matrixAutoUpdate=!1,t.add(s),this.editorStaticSnapshotBySource.set(a,{object:s,chunk:e}),e.sourceVisibility.set(a,a.visible),e.sourceParents.set(a,a.parent),a.visible=!1,this.editorStaticAuthoredRoot?.attach(a),e.sourceUpdateMatrixWorld.set(a,a.updateMatrixWorld),a.updateMatrixWorld=ga}0!==t.children.length&&(ma(t),this.scene.add(t),e.root=t,e.disposer=this.renderingView.registerExperimentalStaticDrawSet(t,`hology-editor-static-asset-meshes-${this.editorStaticDrawChunks.indexOf(e)}`),e.active=!0)}canUseEditorStaticDrawSet(e){let t=!1,a=!0;return e.traverseVisible(e=>{e instanceof m&&!nt(e)&&(t=!0,null!=e.geometry?.index&&null==e.customDepthMaterial&&ba(e.material)||(a=!1))}),t&&a}disposeEditorStaticDrawSet(){for(const e of this.editorStaticDrawChunks)this.disposeEditorStaticDrawChunk(e);this.editorStaticDrawChunks.length=0,this.dirtyEditorStaticDrawChunks.clear(),this.editorStaticChunkBySource=new WeakMap,this.editorStaticSnapshotBySource=new WeakMap,this.editorStaticAuthoredRoot?.removeFromParent(),this.editorStaticAuthoredRoot=void 0}disposeEditorStaticDrawChunk(e){e.disposer?.(),e.disposer=void 0,e.root?.removeFromParent(),e.root=void 0,e.active=!1;for(const[t,a]of e.sourceParents){const e=t.userData?.src,s=null==e?.id||this.sceneObjectMap.get(e.id)===t;(null!=a&&null==t.parent&&s||null!=a&&t.parent===this.editorStaticAuthoredRoot&&s)&&a.attach(t)}e.sourceParents.clear();for(const[t,a]of e.sourceVisibility)t.visible=a;e.sourceVisibility.clear();for(const[t,a]of e.sourceUpdateMatrixWorld)t.updateMatrixWorld=a;e.sourceUpdateMatrixWorld.clear()}async preloadVisualEffects(e){const t=new Set,a=new Set,s=[],r=new A;for(const i of e){const e=i.asset;if(t.has(e.id))continue;t.add(e.id),xs(e,a);const n=await i.create(r);r.add(n.object);const o=n.particleSystemContainer;null!=o&&r.add(o),n.play(),n.onUpdate(.5),n.stop(),n.pause(),s.push(n)}await this.initVfxTextures(a);const i=this.renderingView.compileAsync(r);this.renderingView.initTextures(r),await i;for(const e of s)e.onEndPlay(),e.disposed.next(!0),e.object.removeFromParent()}async initVfxTextures(e){const t=await Promise.all(Array.from(e,async e=>{const t=await this.assetsService.getAsset(e);return null==t?null:this.assetManagerService.getTexture(t)}));for(const e of t)null!=e&&this.renderingView.renderer.initTexture(e)}async initVfx(){await this.preloadVisualEffects(this.actorInstances.flatMap(e=>As(e)))}async initActorsPostInit(e=Array.from(this.materializedActors.entries())){const t=e.map(async([e,t])=>{const a=t.object.userData.src??t.object.userData._src;if("vfx"===a.type)return Promise.resolve();const s="prefab"===a.type?await this.assetsService.getAsset(a.assetId):null,r=e.split("/"),i=r.slice(0,-1),n=i.join("/"),o=(r[r.length-1],new Map);for(const[e,t]of this.materializedActors)if(o.set(e,t),0===n.length)e.includes("/")||o.set(e,t);else if(e.startsWith(n+"/")){const a=e.slice(n.length+1);a.includes("/")||o.set(a,t)}const l={...s?.actor?.params??{},...a.actor?.params??{}},c=[...a.actor?.innerParams??[]];for(let t=i.length-1;t>=0;t--){const a=i.slice(0,t+1).join("/"),s=this.idToSceneObject.get(a);if("prefab"===s?.type&&null!=s.prefab){const i=await this.assetsService.getAsset(s.assetId);if(null!=i){let n=!1,o=a+"/"+i.prefab?.mainActorId;for(;null!=o;){if(o===e){n=!0;break}o=this.prefabInstanceExposedActorMap.get(o)}if(n&&null!=s.prefab.params&&Object.assign(l,Va(s.prefab.params)),null!=s.prefab.innerParams){const e=r.slice(t+1);for(const t of s.prefab.innerParams){const a=Va(t.params);0!==Object.keys(a).length&&(n?c.push({path:za(t.path,e)?t.path.slice(e.length):t.path,params:a}):za(t.path,e)&&c.push({path:t.path.slice(e.length),params:a}))}}}}}this.rememberLivePrefabActorSettings(e,{...a.actor,params:l,innerParams:c});for(const e of c)await this.applyActorComponentParams(t,e.path.slice(),e.params,o);await this.attachEditorComponents(t,a,o);const u=await prepareClassParameters(l,t.constructor,this.assetsService,this.assetManagerService,o,this.renderingView,this.shaders,this.actorProvider,e=>{const t=n.length>0?n+"/"+e:e;return this.prefabInstanceExposedActorMap.get(t)??null},t);Object.assign(t,u);try{return await this.actorProvider.initActor(t)}catch(e){console.error(`Failed to initiate actor (name="${a.name}", id=${a.id})`,e)}});return Promise.all(t)}async attachEditorComponents(e,t,a){const s=t.actor?.components??[],r=new Array(s.length).fill(null);this.editorAttachedActorComponents.set(e,r);for(const[i,n]of s.entries()){const s=this.componentTypes.find(e=>e.name===n.type);if(null==s){console.warn(`Component type '${n.type}' not found for actor ${t.id}`);continue}const o=e.attach(s.type);if(r[i]=o,null!=n.params){const e=await prepareClassParameters(n.params,null,this.assetsService,this.assetManagerService,a,this.renderingView,this.shaders,this.actorProvider,e=>this.prefabInstanceExposedActorMap.get(e)??null,o);Object.assign(o,e)}for(const e of n.innerParams??[])await this.applyActorComponentParams(o,e.path.slice(),e.params,a)}}addVfxChildActors(e,t=e){}async applyActorComponentParams(e,t,a,s){const r=t.length,i=t.shift();if(0==r){const t=await prepareClassParameters(a,null,this.assetsService,this.assetManagerService,s,this.renderingView,this.shaders,this.actorProvider,e=>this.prefabInstanceExposedActorMap.get(e)??null,e);for(const[a,s]of Object.entries(t))null!=s&&(e[a]=s)}else null!=e[i]&&await this.applyActorComponentParams(e[i],t,a,s)}canObjectBeInstanced(e){return e.physics?.type!==Me.dynamic&&"sky"!==e.type&&"global_fog"!==e.type&&"world_env"!==e.type}async canAssetBeInstanced(e){let t=this._canBeInstancedCache.get(e.assetId);if(null==t){const a=await this.createFromAsset(e);if(null==a)return!1;const s=[];a.traverse(e=>{!nt(e)&&e.isMesh&&s.push(e)});const r=1==s.length&&0==s[0].children.length,i=!ra,n=s.every(e=>!Array.isArray(e.material)||1===e.material.length),o=s.some(e=>e instanceof m&&null!=e.geometry.morphAttributes&&Object.keys(e.geometry.morphAttributes).length>0),l=!0;t=s.length>0&&(r||n&&i)&&l&&!o,this._canBeInstancedCache.set(e.assetId,t)}return t}async preInit(){this.renderingView?.onLoop(()=>{null!=this.sky&&this.renderingView.camera.getWorldPosition(this.sky.position)}),await this.preloadAssets()}async preloadAssets(){const e=await this.assetsService.getAssets();for(const t of e)this.assets.set(t.id,t)}shouldBeMaterialized(e){if(!1===e.enabled)return!1;if(null!=this.detailTier&&"asset_mesh"===e.type&&null!=e.assetId){const t=this.assets.get(e.assetId);if(null!=t){const e=t.mesh?.detailTier;if(null!=e)return e<=this.detailTier}}return!0}async initWithInstancing(){await this.preInit(),await this.prefetchAssets(),this.experimentalStaticDrawSetDisposer?.(),this.experimentalStaticDrawSetDisposer=void 0,oa.clear(),la.clear();const e=[],t=new Ye,a=new Ye,s=new Ye;let r=0,n=0,o=0;const u=new Map,d=new Qe(()=>new Map),h="webgpu-experimental"===this.renderingView?.options.backend?new p:null,g=null!=h?new p:null;null!=h&&(h.name="Hology WebGPU static scene objects",g.name="Hology WebGPU unsorted late static scene objects");const y=(e,t)=>{if(null!=h&&function(e){return e.visible&&null!=e.geometry.index&&null==e.customDepthMaterial&&ba(e.material,!0)}(t)){((Array.isArray(t.material)?t.material:[t.material]).some(e=>e.transparent||va(e))?g:h).add(e)}else this.scene.add(e)};for(const i of this.dataProvider.getObjects())await Pa(i,async(i,c,p)=>{if(!this.shouldBeMaterialized(i))return;const h="asset_mesh"==i.type&&this.canObjectBeInstanced(i)&&await this.canAssetBeInstanced(i),f="shape_mesh"===i.type&&"landscape"!==i.shape&&i.physics?.type!==Me.dynamic;if(h||f){if(c&&c.children?.length>0){const e=c.children.findIndex(e=>e.id===i.id);e>=0&&c.children.splice(e,1)}if(f){let e=i.shape+JSON.stringify(i.shapeParams??{})+i.castShadow+i.receiveShadow;const t=i.materialAssignments?.at(0)?.materialId,a=null!=t?this.assets.get(t):null;let r=null;if(!1&&null!=a&&"shader"!==a.material.type){if(e+=a.material.type+a.material.shader,null!=a.material.shaderParams){if(e+=Object.entries(a.material.shaderParams).filter(([e,t])=>"color"!=e).map(e=>JSON.stringify(e)).join(),null!=a.material.shaderParams.color){const e=a.material.shaderParams.color;e.type===St.Color&&null!=e.value&&(r=new l(e.value))}}e+=a.material.outlines,null!=a.material.outlineParams&&(e+=JSON.stringify(a.material.outlineParams)),e+=a.material.reflective,e+=a.material.bloom,e+=a.material.side,e+=a.material.side,e+=a.material.transparent,e+=a.material.alphaTest}else e+=t;s.push(e,{object:{...i,parentTransform:p},color:r}),o++}else{const e=this.assets.get(i.assetId);null==e&&console.log("Can't find asset with id "+i.assetId);let s=u.get(i.assetId);if(null==s){const e=await this.createFromAsset(i,{assignMaterials:!1});if(null==e)return;if(s=u.get(i.assetId),null==s){s={useBatchedMesh:null!=et(e)&&Lt(e,e=>!(e instanceof m)||this.testCanBatch(e.material,e.geometry)),assetMesh:e},u.set(i.assetId,s)}}const o=Ba(i.materialAssignments,e.materialAssignments);if(s.useBatchedMesh)await at(s.assetMesh,async t=>{if(!(t instanceof m))return;const s=Array.isArray(t.material)?t.material[0]:t.material,n=await this.resolveMaterialForAssignments(s,o,e);if(null!=n){Oe(n,!1),d.get(i.id).set(t.uuid,n);let s=Ha(t,n);if(s+=rs(n),"webgpu-experimental"===this.renderingView?.options.backend){s+=`|castShadow:${i.castShadow??e.castShadow??!1?1:0}|receiveShadow:${i.receiveShadow??e.receiveShadow??!1?1:0}`}a.push(s,{...i,parentTransform:p,meshUUID:t.uuid}),r++}else console.warn("Can not materialize mesh because missing material",i)});else{const e=i.assetId+JSON.stringify(i.materialAssignments??[]);t.push(e,{...i,parentTransform:p}),n++}}}else null==c&&e.push({...i,parentTransform:p})});console.log(`Scene init stats: \n Batched Assets: ${a.size} groups containing in total ${r} objects.\n Instanced Assets: ${t.size} groups containing in total ${n} objects.\n Shapes: ${s.size} batch groups containing in total ${o} objects. \n ${e.length} objects can not be batched. \n `),console.time("materialize batches");for(const[e,t]of a.entries()){if(0==t.length)continue;let e;u.get(t[0].assetId).assetMesh;e=this.createBatchedMesh(t,d,u);const a=this.assets.get(t[0].assetId);"webgl"===this.renderingView?.activeBackend?(e instanceof Rt&&e.perInstanceCastShadow||(e.castShadow=_s(t,a?.castShadow??!1)),e.receiveShadow=Gs(t,a?.receiveShadow??!1)):(console.log("SETTING CAST SHADOW TO TRUE"),e.castShadow=!0,e.receiveShadow=!0);const s=new st;s.add(e),s.userData.src=t[0],s.castShadow=!1,s.receiveShadow=!1,y(s,e)}for(const e of t.values()){if(0==e.length)continue;let t;const a=u.get(e[0].assetId).assetMesh;t=await this.createInstancedMesh(e,a);const s=this.assets.get(e[0].assetId);t.castShadow=_s(e,s?.castShadow??!1),t.receiveShadow=Gs(e,s?.receiveShadow??!1);const r=new st;r.add(t),r.userData.src=e[0],a instanceof st&&(r.collisionShapes=a.collisionShapes),this.prepareCollisionShapesForInstanced(r),r.castShadow=!1,r.receiveShadow=!1,y(r,t)}console.timeEnd("materialize batches");for(const e of s.values()){if(0==e.length)continue;const t=e[0].object,a=await this.createFromShape(t),s=tt(a,e=>!nt(e)&&null!=e.geometry),r=La(s.material);null!=e[0].color&&null!=r.color&&(r.color=new l(16777215));const n=null==s.geometry.index?Jt.mergeVertices(s.geometry):s.geometry;let o,u;!(ra||r instanceof R)?(o=new i.BatchedMesh(e.length,n.getAttribute("position").count,n.index.count,r),o.perObjectFrustumCulled=!0,u=o.addGeometry(n)):o=new i.InstancedMesh(n,r,e.length),o.castShadow=a.castShadow??!0,o.receiveShadow=s.receiveShadow??!1;for(let t=0;t<e.length;t++){const a=e[t],s=(new i.Matrix4).compose((new P).fromArray(a.object.position),(new M).setFromEuler((new c).fromArray(a.object.rotation)),(new P).fromArray(a.object.scale)),r=(new f).copy(a.object.parentTransform).multiply(s);let n;n=o instanceof i.BatchedMesh?o.addInstance(u):t,o.setMatrixAt(n,r),a.color}for(let t=0;t<e.length;t++){const s=e[t],r=new st;r.userData.src=e[0],a instanceof lt&&(r.collisionShapes=[a.collisionShape]),r.castShadow=!0,r.receiveShadow=!0,y(r,o),r.add(o),null==o.userData.hasCollision&&(o.userData.hasCollision=[]),o.userData.hasCollision[t]=!1!==s.object.collisionDetection}}if(null!=h&&h.children.length>0&&(ma(h),this.scene.add(h),this.experimentalStaticDrawSetDisposer=this.renderingView.registerExperimentalStaticDrawSet(h,"hology-materialized-static-scene")),null!=g&&g.children.length>0){ma(g),this.scene.add(g);const e=this.experimentalStaticDrawSetDisposer,t=this.renderingView.registerExperimentalStaticDrawSet(g,"hology-materialized-unsorted-late-static-scene",!0);this.experimentalStaticDrawSetDisposer=()=>{e?.(),t()}}await Promise.all(e.map(e=>this.materialize(e))),await this.initActorsPostInit(),this.announcePrefabEventGraphs(),await this.initVfx(),this.generateOcclusionClusters(),await this.refreshPaintedScatterPresence(!0),await this.refreshSurfaceScatterPresence(!0)}generateOcclusionClusters(){const e=new kt;e.initScene(this.scene),e.clusters.forEach(e=>{this.renderingView.addCluster(e)})}prepareCollisionShapesForInstanced(e){e instanceof st&&e.collisionShapes.forEach(e=>{e instanceof a&&e.mesh instanceof m&&(e.mesh=e.mesh.geometry)})}setScene(e){this.scene=e}testCanBatch(e,t){return!ra&&(!Array.isArray(e)||1==e.length)&&this.testCanBatchMaterial(e)}testCanBatchMaterial(e){return null!=(Array.isArray(e)?e[0]:e)}createBatchedMesh(e,t,a){const s=new Ye;for(const t of e)null!=t.meshUUID?s.push(t.meshUUID??t.assetId,t):console.warn("Missing mesh uuid for batching");let r=0,n=0,o=0;const c=new Map;for(const[e,t]of s.entries()){const s=t[0].assetId,i=a.get(s);if(null==i){console.warn("Missing batching info for asset id "+s);continue}const l=tt(i.assetMesh,t=>t instanceof m&&t.uuid===e);if(null==l){console.warn("Missing mesh in batched asset");continue}c.set(e,l);const u=l.geometry.getAttribute("position");null==u&&console.warn("Missing position attribute for batched mesh"),r+=l.geometry.index.count*t.length,n+=u.count*t.length,o+=t.length}const u=["color","map","roughness","roughnessMap","metalness","metalnessMap","opacity","alphaMap","aoMap","aoMapIntensity","normalMap","normalScale","emissive","emissiveIntensity","emissiveMap"],d=new Map,p=new Map,h=[];let f=new i.MeshStandardMaterial({color:"white"});const g=t.get(e[0].id).get(e[0].meshUUID);if(null==g)throw"missing source material";if(g instanceof w&&!(g instanceof i.MeshPhysicalMaterial)){const a=new Set,s=new Map;for(const r of e){const e=t.get(r.id).get(r.meshUUID);if(null==e)throw"missing mat";for(const t of u){let r=e[t];r instanceof i.CompressedArrayTexture&&null!=r.userData.index&&(r=r.userData.index);const n=s.get(t);void 0===n||Ms(r,n)?s.set(t,r):a.add(t)}}for(const e of a){let t;const a=g[e];let s=e;if("number"==typeof a){let a=h.find(e=>e.params.length<4);if(null==a){const t="vp"+h.length;a={name:t,params:[e],node:k(t)},h.push(a)}else a.params.push(e);s=a.name,t=bs(a.node,a.params.length-1)}else if(a instanceof D)t=k(s);else if(a instanceof P||a instanceof l)t=C(s);else if(a instanceof j)t=E(s);else if(a instanceof i.CompressedArrayTexture)s=e+"_i",t=O(s);else if(a instanceof x)continue;d.set(e,t),p.set(e,s)}let r=re.uv;g instanceof _t&&null!=g.heightMap&&(r=Gt(r,Q(g.heightMap),U(g.heightScale)));let n=gs(d.get("opacity"),$)??U(g.opacity??1);if(null!=g.alphaMap){let e;if(g.alphaMap instanceof i.CompressedArrayTexture){const t=H(g.alphaMap),a=gs(d.get("alphaMap"),$)??U(g.alphaMap.userData.index??0);e=t.sample(le(r.x,r.y,a))}else e=Q(g.alphaMap).sample(r);n=n.multiply(e.r)}let o=G(gs(d.get("color"),ce)??g.color,n);if(null!=g.map){let e;if(g.map instanceof i.CompressedArrayTexture){const t=H(g.map),a=gs(d.get("map"),$)??U(g.map.userData.index??0);e=t.sample(le(r.x,r.y,a))}else e=Q(g.map).sample(Zt(r,g.map));o=o.multiply(e),n=n.multiply(e.a)}g.vertexColors&&(o=o.multiply(ue(se(I.color.rgb),1)));let c=G(gs(d.get("emissive"),ce)??g.emissive,n);if(null!=g.emissiveMap){let e;if(g.emissiveMap instanceof i.CompressedArrayTexture){const t=H(g.emissiveMap),a=gs(d.get("emissiveMap"),$)??U(g.emissiveMap.userData.index??0);e=t.sample(le(r.x,r.y,a))}else e=Q(g.emissiveMap).sample(Zt(r,g.emissiveMap));c=c.multiply(e)}const m=gs(d.get("emissiveIntensity"),$)??U(g.emissiveIntensity??1),y=gs(d.get("normalScale"),oe)??ne(g.normalScale??new j(1,1));let w=ie.normal;if(null!=g.normalMap){let e;if(g.normalMap instanceof i.CompressedArrayTexture){const t=H(g.normalMap),a=gs(d.get("normalMap"),$)??U(g.normalMap.userData.index??0);e=t.sample(le(r.x,r.y,a))}else e=Q(g.normalMap).sample(Zt(r,g.normalMap));w=N(e.rgb,y.x)}let S=gs(d.get("roughness"),$)??U(g.roughness??1);if(null!=g.roughnessMap){let e;if(g.roughnessMap instanceof i.CompressedArrayTexture){const t=H(g.roughnessMap),a=gs(d.get("roughnessMap"),$)??U(g.roughnessMap.userData.index??0);e=t.sample(le(r.x,r.y,a))}else e=Q(g.roughnessMap).sample(Zt(r,g.roughnessMap));S=S.multiply(e.g)}let b=gs(d.get("metalness"),$)??U(g.metalness??0);if(null!=g.metalnessMap){let e;if(g.metalnessMap instanceof i.CompressedArrayTexture){const t=H(g.metalnessMap),a=gs(d.get("metalnessMap"),$)??U(g.metalnessMap.userData.index??0);e=t.sample(le(r.x,r.y,a))}else e=Q(g.metalnessMap).sample(Zt(r,g.metalnessMap));b=b.multiply(e.b)}let v=U(1);if(null!=g.aoMap){let e;if(g.aoMap instanceof i.CompressedArrayTexture){const t=H(g.aoMap),a=gs(d.get("aoMap"),$)??U(g.aoMap.userData.index??0);e=t.sample(le(r.x,r.y,a))}else e=Q(g.aoMap).sample(Zt(r,g.aoMap));v=v.multiply(e.r)}const M=gs(d.get("aoMapIntensity"),$)??U(g.aoMapIntensity??0);let A=w;!0!==g.userData.disableAO&&(A=F("DOUBLE_SIDED",A,e=>J(new V("gl_FrontFacing"),e,e.multiplyScalar(-1))));const T=new R({color:q({color:o,roughness:S,metalness:b,ambientOcclusion:v,ambientOcclusionIntensity:M,emissive:c,emissiveIntensity:m,normal:A}),normal:w,roughness:S,emissive:c.rgb,transparent:g.transparent,alphaTest:g.alphaTest,envMap:g.envMap,opacity:n});null!=g.envMap&&(T.uniforms.envMapIntensity={value:g.envMapIntensity},T.uniforms.envMapRotation={value:Ss(g.envMapRotation,g.envMap)}),T.envMap=g.envMap,T.side=g.side,f=T}else if(g instanceof R){const a=new Set,s=new Map,r=Object.keys(g.uniforms).filter(e=>!os(e));for(const i of e){const e=t.get(i.id).get(i.meshUUID);if(!(e instanceof R))throw new Error("Expected NodeShaderMaterial in node material batch");for(const t of r){const r=e.uniforms[t]?.value,i=s.get(t);void 0===i||Ms(r,i)?s.set(t,r):cs(r)&&cs(i)&&us(r)===us(i)&&a.add(t)}}const i=new Set(Object.keys(g.uniforms)),n={};for(const e of a){let t,a;const s=g.uniforms[e]?.value;if("number"==typeof s){let s=h.find(e=>e.params.length<4);if(null==s){const t=ds("vp"+h.length,i);s={name:t,params:[e],node:k(t)},h.push(s)}else s.params.push(e);a=s.name,t=bs(s.node,s.params.length-1)}else if(s instanceof D)a=ds(e,i),t=k(a);else if(s instanceof P||s instanceof l)a=ds(e,i),t=C(a);else{if(!(s instanceof j))continue;a=ds(e,i),t=E(a)}d.set(e,t),p.set(e,a),n[e]=t}if(0===d.size)f=g;else{const e=B(g,{color:g.outputColor,transform:g.outputTransform??null,position:null==g.outputTransform?g.outputPosition:void 0,normal:g.outputNormal??null,roughness:g.outputRoughness??null,opacity:g.outputOpacity??null,emissive:g.outputEmissive??null,uniforms:ps(g,new Set(d.keys())),uniformNodes:n});e.uniformNodes=n,y=g,(S=e).name=y.name,S.side=y.side,S.blending=y.blending,S.depthWrite=y.depthWrite,S.depthTest=y.depthTest,S.colorWrite=y.colorWrite,S.toneMapped=y.toneMapped,S.visible=y.visible,S.opacity=y.opacity,S.forceSinglePass=y.forceSinglePass,S.premultipliedAlpha=y.premultipliedAlpha,S.polygonOffset=y.polygonOffset,S.polygonOffsetFactor=y.polygonOffsetFactor,S.polygonOffsetUnits=y.polygonOffsetUnits,S.shadowSide=y.shadowSide,Object.assign(S.defines,y.defines),Object.assign(S.userData,y.userData),S.needsUpdate=!0,f=e}}else{f=g;for(const a of e){const e=t.get(a.id).get(a.meshUUID);if(e!=f){console.error(`Different materials in group for object ${a.id} and mesh uuid ${a.meshUUID}`,{objectMaterial:e,sourceMaterial:g});break}}}var y,S;const b=new Rt(o,n,r,f);for(const e of h)b.initUniform(e.name,4);for(const[e,t]of d.entries()){if(h.some(t=>t.params.includes(e)))continue;let a=1;t instanceof de||t instanceof ce?a=4:t instanceof oe&&(a=2),b.initUniform(p.get(e)??e,a,0)}for(const[e,r]of s.entries()){const s=r[0].assetId,n=c.get(e);if(null==n){console.error(`Missing single asset mesh for mesh uuid ${e} and asset id ${s}`);continue}if(null==n.geometry){console.error("Missing geometry on mesh mesh");continue}const o=b.addGeometry(Za(n.geometry,g)),u=this.assets.get(s),f=a.get(s);if(null==f){console.warn("Missing batching info when configuring for asset id "+s);continue}const m=et(f.assetMesh)?.uuid===e,y=f.assetMesh instanceof st&&m?f.assetMesh.collisionShapes:void 0,w=this.configureBatchedInstancedMesh(r,b,n,o,y);for(let e=0;e<w.length;e++){const a=r[e],s=w[e];"webgpu-experimental"!==this.renderingView?.options.backend&&b.setCastShadowAt(s,a.castShadow??u?.castShadow??!1);const n=t.get(a.id).get(a.meshUUID),o=n.userData.surface;null!=o&&(b.surfaceByInstance[s]=o);for(const e of h){let t=vs.set(0,0,0,0);for(let a=0;a<e.params.length;a++){const s=ls(n,e.params[a]);"number"==typeof s&&t.setComponent(a,s)}b.setUniformAt(e.name,s,t)}for(let e of d.keys()){if(h.some(t=>t.params.includes(e)))continue;const t=p.get(e)??e;let a=ls(n,e);if(a instanceof l&&(a=new P(a.r,a.g,a.b)),a instanceof i.CompressedArrayTexture)a=a.userData.index??0;else if(a instanceof x||null==a)continue;b.setUniformAt(t,s,a)}}}return b}async createInstancedMesh(e,t){const a=tt(t,e=>!nt(e)&&null!=e.geometry),s=await this.assetsService.getAsset(e[0].assetId);await this.applyMaterials(t,Ba(e[0].materialAssignments,s.materialAssignments),s),a.updateMatrix();const r=a.geometry.clone(),n=a.material;let o;if(o=new i.InstancedMesh(r,n,e.length),this.configureBatchedInstancedMesh(e,o,a),a.material instanceof h&&o.castShadow&&o.receiveShadow&&Array.isArray(n))for(const e of n);return o}configureBatchedInstancedMesh(e,t,a,s,r){const n=[];a.updateWorldMatrix(!0,!0);for(let o=0;o<e.length;o++){let l=o;t instanceof i.BatchedMesh&&(l=t.addInstance(s)),n.push(l);const u=(new i.Matrix4).compose((new P).fromArray(e[o].position),(new M).setFromEuler((new c).fromArray(e[o].rotation)),(new P).fromArray(e[o].scale)),d=(new f).copy(e[o].parentTransform).multiply(u),p=(new f).copy(d).multiply(a.matrixWorld);t.setMatrixAt(l,p),null==t.userData.hasCollision&&(t.userData.hasCollision=[]);const h=this.assets.get(e[o].assetId);t.userData.hasCollision[l]=!1!==e[o].collisionDetection||!1!==h?.collisionDetection,null!=r&&(null==t.userData.collisionShapes&&(t.userData.collisionShapes=[]),t.userData.collisionShapes[l]=r,null==t.userData.collisionMatrices&&(t.userData.collisionMatrices=[]),t.userData.collisionMatrices[l]=d)}return n}remove(e){if(console.log("Remove scene object",e),"global_fog"==e.type)return void(this.scene.fog=this.originalFog);if("world_env"===e.type)this.resetWorldEnv(),this.worldEnvObj=null;else if("actor"==e.type||"vfx"===e.type){const t=this.materializedActors.get(e.id);null!=t?(t.disposed.next(!0),t.onEndPlay()):console.warn("Failed to remove actor",e)}else if("prefab"===e.type){this.unregisterLivePrefabInstance(e.id);const t=new Set(this.removePrefabEventGraphs(e.id).flatMap(e=>e.actors));this.materializedActors.forEach((a,s)=>{(s===e.id||s.startsWith(e.id+"/"))&&(t.has(a)||(a.disposed.next(!0),a.onEndPlay()),this.materializedActors.delete(s))})}const t=this.sceneObjectMap.get(e.id);t?.parent.remove(t),this.sceneObjectMap.delete(e.id),this.components.filter(t=>t.object.userData.src?.id===e.id).forEach(e=>this.components.splice(this.components.indexOf(e,1))),this.landscapeManagers.filter(t=>t.source.id===e.id).forEach(e=>{e.clear(),e.stop(),this.landscapeManagers.splice(this.landscapeManagers.indexOf(e,1))}),this.removed$.next({object:t,source:e})}deleteSceneObject(e){const t=this.sceneObjectMap.get(e.id);if(this.scene.remove(t),"landscape"==e.type){const t=this.landscapeManagers.findIndex(t=>t.source.id===e.id);if(t>-1){const e=this.landscapeManagers.splice(t,1)[0];e.clear(),e.stop()}}}findByAssetId(e){return Ke(this.scene,t=>t.userData.src?.assetId==e,e=>null!=e.userData.src)}applyMaterials(e,t,a){return null==t?Promise.resolve([]):Promise.all(t.filter(e=>"null"!==e.materialId).map(t=>this.applyMaterial(e,t,a)))}async applyMaterial(e,t,a){await applyMaterial(e,t,async e=>{const t=await this.getAsset(e);if(null!=t)try{return materialFromAsset(t,this.renderingView,this.assetsService,this.assetManagerService,this.shaders)}catch(e){console.error("Failed to apply material",e)}else console.warn("Missing material with id "+e)},this._originalMaterials,{textureFlipY:getConvertedFbxToGlbAssignedMaterialTextureFlipY(a)})}async resolveMaterialForAssignments(e,t,a){let s=e,r=null,i=null;const n=getConvertedFbxToGlbAssignedMaterialTextureFlipY(a);for(const e of t??[]){if(!Ra(s,e,r,i))continue;const t=await this.getAsset(e.materialId);if(null==t){console.warn("Missing material with id "+e.materialId);continue}let a=await materialFromAsset(t,this.renderingView,this.assetsService,this.assetManagerService,this.shaders,!0);null!=a&&(a=Ga(a,n)),null!=a&&s.id!==a.id&&(r=r??Wa(s),i=i??s.name,s=a);break}return s}unapplyMaterials(e){e.traverse(async e=>{if(e instanceof m)if(e.material instanceof Array)for(let t=0;t<e.material.length;t++)e.material[t]=this._originalMaterials.get(e.id+"#"+t)??e.material[t];else e.material=this._originalMaterials.get(e.id)??e.material})}updateActors(e){console.log("update actors"),this.actorTypes=e;const t=new Set(Object.values(be));Ke(this.scene,e=>e.userData.src?.id&&"actor"===e.userData.src.type&&this.materializedActors.has(e.userData.src?.id)&&!t.has(e.userData.src.actor.type)).forEach(async e=>{this.remove(e.userData.src),await this.materializeAndInitActor(e.userData.src)})}updateComponents(e){this.componentTypes=e,Ke(this.scene,e=>e.userData.src?.id&&"actor"===e.userData.src.type&&this.materializedActors.has(e.userData.src?.id)&&(e.userData.src.actor?.components?.length??0)>0).forEach(async e=>{this.remove(e.userData.src),await this.materializeAndInitActor(e.userData.src)})}updateShaders(e){this.shaders=e;for(const[e,t]of oa.entries())t.userData.customShaderName&&oa.delete(e);this.landscapeManagers.forEach(t=>t.updateShaders(e)),Ke(this.scene,e=>!0).forEach(e=>{e.traverse(async e=>{if(e instanceof m)if(Array.isArray(e.material))for(let t=0;t<e.material.length;t++){const a=e.material[t].userData?.customShaderName;if(null!=a){const a=e.material[t].userData.assetId,s=await this.getAsset(a);null!=s&&this.refreshMaterial(e,e.material[t],s,t)}}else{const t=e.material.userData?.customShaderName;if(null!=t){const t=e.material.userData.assetId,a=await this.getAsset(t);null!=a&&this.refreshMaterial(e,e.material,a)}}})})}async update(e){if("sky"===e.type&&null!=this.sky&&null!=this.sky.parent)return void this.updateSky(e);if("world_env"===e.type&&null!=this.worldEnvObj)return void this.updateWorldEnv(e);const t=this.sceneObjectMap.get(e.id);if(t){let i=!1;if(t.traverseAncestors(e=>{"_hology_transform_group"===e.name&&(i=!0)}),!i){const a=this.findParent(e);null!=a&&a.uuid!=t.uuid?a.attach(t):console.error("Parent is wrong")}if(!("shape_mesh"!==e.type&&"asset_mesh"!==e.type||null==e.renderOrder&&0===t.renderOrder||e.renderOrder===t.renderOrder))return void(t.renderOrder=e.renderOrder??0);if("prefab"!==e.type&&"group"!==e.type){this.unapplyMaterials(t);this.inEditor&&e.hidden&&!1?t.traverse(e=>{e instanceof m&&(e.material.wireframe=!0)}):t.traverse(e=>{e instanceof m&&(e.material.wireframe=!1)})}if("asset_mesh"===e.type&&t.userData.assetId!==e.assetId){this.remove(e);const t=await this.materializeAndInitActor(e);return void this.updated$.next({object:t,source:e})}if("asset_mesh"===e.type){const a=this.assets.get(e.assetId);Ba(e.materialAssignments,a.materialAssignments).forEach(e=>this.applyMaterial(t,e,a))}else"shape_mesh"===e.type&&this.applyMaterials(t,e.materialAssignments);if(i||(null!=e.position&&t.position.fromArray(e.position),null!=e.scale&&t.scale.fromArray(e.scale),null!=e.rotation&&t.rotation.fromArray(e.rotation),this.inEditor&&("asset_mesh"===e.type||"shape_mesh"===e.type&&"landscape"!==e.shape)&&e.physics?.type!==Me.dynamic?wa(t,!1):this.inEditor&&function(e){let t=!1;if(e.traverse(e=>{ya.has(e)&&(t=!0)}),!t)return;e.updateWorldMatrix(!0,!0),e.traverse(e=>{ya.has(e)&&(e.matrixWorldNeedsUpdate=!1)})}(t)),this.applyVertexMaterials(e,t),"light"==e.type){if("point"==e.light.type){const a=t;a.color=new l(e.light.point.color),a.intensity=e.light.point.intensity,a.decay=e.light.point.decay,a.castShadow=e.light.point.castShadow,a.distance=Math.max(e.light.point.distance,0),a.userData.volumetricIntensity=e.light.point.volumetricIntensity}else if("spot"==e.light.type){const a=t;a.color=new l(e.light.spot.color),a.intensity=e.light.spot.intensity,a.decay=e.light.spot.decay,a.angle=e.light.spot.angle,a.penumbra=e.light.spot.penumbra,a.castShadow=e.light.spot.castShadow,a.distance=Math.max(e.light.spot.distance,0),a.userData.volumetricIntensity=e.light.spot.volumetricIntensity}else if("directional"===e.light.type)this.applyDirectionalLight(e.light.directional,e);else if("ambient"===e.light.type)this.applyDirectionalAmbientLight(t,e.light.ambient,e);else if("rectArea"===e.light.type){const a=t;a.color=new l(e.light.rectArea.color),a.intensity=e.light.rectArea.intensity,null!=e.scale&&(a.width=e.scale[0],a.height=e.scale[1]),a.children.forEach(e=>{e instanceof qt&&e.update()})}}else if("landscape"===e.shape){const a=this.landscapeManagers.find(t=>t.source.id===e.id),i=null==a||(s=a.source.landscape.options,r=e.landscape.options,s.density!==r.density||s.sections.x!==r.sections.x||s.sections.y!==r.sections.y);if(this.inEditor&&i){this.remove(e);const t=await this.materializeAndInitActor(e);return void this.updated$.next({object:t,source:e})}this.applyHeightMaps(t,e.landscape.heightMaps),this.inEditor&&this.landscapeManagers.filter(t=>t.source.id===e.id).forEach(t=>{t.updateSource(e),t.queueRefreshScatter(this.renderingView.camera.position,!0,e=>!0)})}else if("global_fog"===e.type){const t=(this.scene.fog instanceof d?"density":"linear")!==e.fog.type;this.scene.fog=Ma(e.fog),t&&(a=this.scene).traverse(e=>{if(e instanceof m){const t=e.material;t instanceof R&&(a.fog instanceof u?(t.uniforms.fogFar.value=a.fog.far,t.uniforms.fogNear.value=a.fog.near):a.fog instanceof d&&(t.uniforms.density={value:a.fog.density}),t.needsUpdate=!0,t.uniformsNeedUpdate=!0)}}),this.fixFogColor()}else if("actor"===e.type){if(this.materializedActors.has(e.id)){const t=this.materializedActors.get(e.id);if(t instanceof $t){const a=await prepareClassParameters(e.actor.params,null,this.assetsService,this.assetManagerService,this.materializedActors,this.renderingView,[],this.actorProvider,e=>this.prefabInstanceExposedActorMap.get(e)??null,t);return void Object.assign(t,a)}const a=this.editorActorParamSnapshot.get(e.id);if((null==a||a!==JSON.stringify(e.actor))&&!i){if(null!=t&&null!=a&&await this.tryApplyLiveActorParameterUpdate(t,e,a))return void this.updated$.next({object:t.object,source:e});this.remove(e),await this.materializeAndInitActor(e)}}}else if("shape_mesh"===e.type){const a=await this.createMeshByShape(e.shape,t.material,e.shapeParams);t instanceof lt&&(t.geometry=a.geometry,t.collisionShape=a.collisionShape)}if("shape_mesh"===e.type&&"landscape"!==e.shape)na(t,e.castShadow,e.receiveShadow);else if("asset_mesh"===e.type){const a=this.assets.get(e.assetId);if(null==a)return void console.error("Asset not found",e.assetId);const s=e.receiveShadow??!!a.receiveShadow,r=e.castShadow??!!a.castShadow;na(t,r,s)}e.name&&e.name.length>0&&(t.name=e.name),this.updated$.next({object:t,source:e})}else{const t=await this.materializeAndInitActor(e);this.updated$.next({object:t,source:e})}var a,s,r;this.renderingView.renderer.shadowMap.needsUpdate=!0}async materializeAndInitActor(e,t=this.findParent(e)){const a=await this.materialize(e,t),s=Array.from(this.materializedActors.entries()).filter(([t])=>t===e.id||t.startsWith(e.id+"/"));return await this.initActorsPostInit(s),this.announcePrefabEventGraphs(e.id),a}async tryApplyLiveActorParameterUpdate(e,t,a){let s;try{s=JSON.parse(a)}catch{return!1}const r=await this.tryApplyLiveActorSettingsUpdate(e,s,t.actor);return r&&this.editorActorParamSnapshot.set(t.id,JSON.stringify(t.actor)),r}async tryApplyLiveActorSettingsUpdate(e,t,a){const s=await this.applyLiveActorSettingsUpdate(e,t,a);return s.hasChanges&&!s.rejected}async applyLiveActorSettingsUpdate(e,t,a){const s=t?.components??[],r=a?.components??[];if(t?.type!==a?.type||s.length!==r.length||s.some((e,t)=>e.type!==r[t]?.type))return{applied:t,hasChanges:!0,rejected:!0};let i=!1,n=!1;const o=await this.tryApplyLiveParameterUpdate(e,t?.params??{},a?.params??{});!1===o&&(n=!0),i||(i=!0===o);const l=await this.applyLiveInnerParameterUpdates(e,t?.innerParams??[],a?.innerParams??[]);n||(n=l.rejected),i||(i=l.hasChanges);const c=this.editorAttachedActorComponents.get(e),u=[];for(let e=0;e<r.length;e++){const t=s[e],a=r[e];if(JSON.stringify(t)===JSON.stringify(a)){u.push(a);continue}const o=c?.[e];if(null==o){n=!0,u.push(t);continue}const l=await this.tryApplyLiveParameterUpdate(o,t?.params??{},a?.params??{});!1===l&&(n=!0),i||(i=!0===l);const d=await this.applyLiveInnerParameterUpdates(o,t?.innerParams??[],a?.innerParams??[]);n||(n=d.rejected),i||(i=d.hasChanges),u.push({...a,params:!1===l?t?.params:a?.params,innerParams:d.applied})}return{applied:{...a,params:!1===o?t?.params:a?.params,innerParams:l.applied,components:u},hasChanges:i,rejected:n}}async applyLivePrefabParameterUpdate(e,t){if(!this.assetsService.supportsLivePrefabParameters)return!1;const a=this.livePrefabInstances.get(t.id);if(null==a||0===a.size)return!0;const s=Oa(e.prefab?.objects??[]),r=Oa(t.prefab?.objects??[]);if(s.size!==r.size||[...s.keys()].some(e=>!r.has(e)))return!1;const i=[];await this.applyLiveNestedPrefabOverrideUpdates(e,t,a,i);for(const n of a.values())for(const[a,o]of s){const s=r.get(a),l=n.actorsById.get(a);if(null==s||null==l){i.push(`${n.prefix}/${a}`);continue}const c=n.actorSettingsById.get(a)??Ca(o,n.source,e.prefab?.mainActorId===a),u=Ca(o,n.source,e.prefab?.mainActorId===a),d=ka(u,Ca(s,n.source,t.prefab?.mainActorId===a),n.desiredActorSettingsById.get(a)??u);if(n.desiredActorSettingsById.set(a,d),JSON.stringify(c)===JSON.stringify(d))continue;const p=await this.applyLiveActorSettingsUpdate(l,c,d);n.actorSettingsById.set(a,p.applied),p.rejected&&i.push(`${n.prefix}/${a}`)}return i.length>0&&console.warn(`Some live parameters for prefab ${t.name??t.id} were not applied. The running instances were preserved: ${i.join(", ")}`),!0}async applyLiveNestedPrefabOverrideUpdates(e,t,a,s){const r=Ea(e.prefab?.objects??[]),i=Ea(t.prefab?.objects??[]);for(const[e,t]of r){const r=i.get(e);if(null==r||t.assetId!==r.assetId||JSON.stringify(t.prefab)===JSON.stringify(r.prefab))continue;const n=this.assets.get(r.assetId),o=this.livePrefabInstances.get(r.assetId);if("prefab"!==n?.type||null==n.prefab||null==o)continue;const l=Oa(n.prefab.objects);for(const i of a.values()){const a=`${i.prefix}/${e}`,c=o.get(a);if(null!=c){for(const[e,i]of l){const o=c.actorsById.get(e);if(null==o){s.push(`${a}/${e}`);continue}const l=Ca(i,t,n.prefab.mainActorId===e),u=Ca(i,r,n.prefab.mainActorId===e),d=c.desiredActorSettingsById.get(e)??l,p=ka(l,u,d);c.desiredActorSettingsById.set(e,p);const h=c.actorSettingsById.get(e)??d;if(JSON.stringify(h)!==JSON.stringify(p)){const t=await this.applyLiveActorSettingsUpdate(o,h,p);c.actorSettingsById.set(e,t.applied),t.rejected&&s.push(`${a}/${e}`)}}c.source=r}}}}unregisterLivePrefabInstance(e){if(0!==e.length)for(const[t,a]of this.livePrefabInstances){for(const t of[...a.keys()])(t===e||t.startsWith(e+"/"))&&a.delete(t);0===a.size&&this.livePrefabInstances.delete(t)}}rememberLivePrefabActorSettings(e,t){if(this.assetsService.supportsLivePrefabParameters)for(const a of this.livePrefabInstances.values())for(const s of a.values()){if(!e.startsWith(s.prefix+"/"))continue;const a=e.slice(s.prefix.length+1);s.actorsById.has(a)&&(s.actorSettingsById.set(a,t),s.desiredActorSettingsById.set(a,t))}}async tryApplyLiveParameterUpdate(e,t,a){const s=new Set([...new Set([...Object.keys(t),...Object.keys(a)])].filter(e=>JSON.stringify(t[e])!==JSON.stringify(a[e])));if(0===s.size)return null;const r=await prepareClassParameters(a,null,this.assetsService,this.assetManagerService,this.materializedActors,this.renderingView,[],this.actorProvider,e=>this.prefabInstanceExposedActorMap.get(e)??null,e);return await e.applySceneParameters(r,s)}async applyLiveInnerParameterUpdates(e,t,a){const s=new Map(t.map(e=>[JSON.stringify(e.path),e])),r=new Map(a.map(e=>[JSON.stringify(e.path),e]));if(s.size!==t.length||r.size!==a.length)return{applied:t,hasChanges:!0,rejected:!0};let i=!1,n=!1;const o=[];for(const t of new Set([...s.keys(),...r.keys()])){const a=s.get(t),l=r.get(t);if(JSON.stringify(a?.params??{})===JSON.stringify(l?.params??{})){null!=l&&o.push(l);continue}const c=l?.path??a?.path,u=this.resolveActorComponent(e,c);if(null==u){n=!0,null!=a&&o.push(a);continue}!0===await this.tryApplyLiveParameterUpdate(u,a?.params??{},l?.params??{})?(null!=l&&o.push(l),i=!0):(n=!0,null!=a&&o.push(a))}return{applied:o,hasChanges:i,rejected:n}}resolveActorComponent(e,t){if(null==t||0===t.length)return null;let a=e;for(const e of t){const t=a[e];if(!(t instanceof ve))return null;a=t}return a instanceof ve?a:null}findParent(e){const t=this.dataProvider.getObjects().flatMap(t=>t.id===e.id?null:Xe(t,t=>t.children?.some(t=>t.id===e.id),()=>!0))[0];return null==t?this.scene:null!=t?Ke(this.scene,e=>e.userData?.src?.id===t.id,e=>null!=e.userData?.src)[0]:void 0}fixFogColor(){!0===this.renderingView.options.enableOutlines&&(this.scene.fog.color=new l(this.scene.fog.color))}findMeshWithGeometry(e){let t;return e.traverse(e=>{e instanceof m&&e.geometry&&(t=e)}),t}applyVertexMaterials(e,t){if(null==e.vertexMaterials||0===e.vertexMaterials.length)return;let a=1;for(const t of e.vertexMaterials)a=Math.max(t.w.length,a);const s=He(e.vertexMaterials,e=>e.m);t.traverse(e=>{if(e instanceof m){if(null==e.geometry)return;if(Qa(mt(e,0,!1)),a>0){Qa(mt(e,0,!1))}}});const r=new Set;for(const[e,i]of s.entries()){const s=null!=e?t.getObjectByName(e):this.findMeshWithGeometry(t);let n=!1;if(null==s||null==s.geometry)return void console.warn(`Failed to apply vertex materials on mesh with name "${e}"`);const o=mt(s,0,!0);Qa(o);for(const e of i)o.setX(e.i,e.w[0]??0),o.setY(e.i,e.w[1]??0),o.setZ(e.i,e.w[2]??0),o.setW(e.i,e.w[3]??0),n=!0;if(a>0){const e=mt(s,4,!0);Qa(e);for(const t of i)e.setX(t.i,t.w[4]??0),e.setY(t.i,t.w[5]??0),e.setZ(t.i,t.w[6]??0),e.setW(t.i,t.w[7]??0),e.needsUpdate=!0,n=!0}n&&r.add(e)}this.inEditor&&this.landscapeManagers.filter(t=>t.source.id===e.id).forEach(e=>e.queueRefreshScatter(this.renderingView.camera.position,!0,e=>r.has(e.name)))}async materialize(e,t,a=!1,s){const r=this.getNestedActorId(e.id,s);if(this.idToSceneObject.set(r,e),!this.shouldBeMaterialized(e))return;let i,n;switch(e.type){case"asset_mesh":i=await this.createFromAsset(e),i=function(e){if(null==e)return e;e.updateWorldMatrix(!0,!0);const t=[];e.traverse(e=>{e.isSkinnedMesh&&t.push(e)});let a=e;for(const e of t){const t=Fs(e),s=e.parent;if(null==s){a=t;continue}const r=s.children.indexOf(e);e.removeFromParent(),s.add(t);const i=s.children.indexOf(t);r>=0&&i>=0&&i!==r&&(s.children.splice(i,1),s.children.splice(r,0,t))}return function(e){const t=[];e.traverse(e=>{e.isBone&&t.push(e)});for(const e of t)null!=e.parent&&!e.parent.isBone&&Rs(e)&&e.removeFromParent()}(a),a}(i);break;case"shape_mesh":i=await this.createFromShape(e);break;case"light":i=await this.createLight(e);break;case"particles":i=await this.createParticleSystem(e),e.collisionDetection=!1;break;case"global_fog":this.scene.fog=Ma(e.fog),this.fixFogColor(),i=new p;break;case"sky":this.sky=Dt(),this.updateSky(e),i=this.sky;break;case"world_env":this.updateWorldEnv(e),i=new p,this.worldEnvObj=i;break;case"actor":({object:i,actor:n}=await this.createFromActor(e,s));break;case"group":case"scatter":i=new p;break;case"prefab":i=await this.createFromPrefab(e,s,t);break;case"vfx":i=await this.createFromVfx(e,s);break;default:console.warn(`Failed to materialize object. Unknown type '${e.type}'. This might be because the hology/core library is not compatible with the editor version or because of an error in the scene data. Scene object: id=${e.id}, name=${e.name}`)}if(null==i)return;e.name&&e.name.length>0&&(i.name=e.name),this.applyTransform(e,i),a?i.userData._src=e:i.userData.src=e,null!=n&&(i.userData.actor=n),this.inEditor,this.inEditor,this.objectMap.set(i.uuid,e),this.sceneObjectMap.set(e.id,i),e.physics?.type!==Me.dynamic||null==t||this.inEditor?null==t?this.scene.add(i):null==t||"actor"!==e.type||this.inEditor?t?.add(i):(t.add(i),this.scene?.attach(i),console.log(i)):(t.add(i),i.getWorldPosition(Aa),i.getWorldQuaternion(xa),i.getWorldScale(ja),this.scene.add(i),i.position.copy(Aa),i.quaternion.copy(xa),i.scale.copy(ja)),null!=e.children&&await Promise.all(e.children?.map(e=>this.materialize(e,i,a)));const o=("asset_mesh"===e.type||"shape_mesh"===e.type&&"landscape"!==e.shape)&&e.physics?.type!==Me.dynamic;if(this.inEditor&&o&&!function(e){for(let t=e;null!=t;t=t.parent)if(!0===t.userData.hologyEditorMatrixWorldAutoUpdate)return!0;return!1}(t)?wa(i,!1):this.inEditor||null!=t||"asset_mesh"!=e.type&&"shape_mesh"!==e.type&&"prefab"!==e.type&&"group"!==e.type||"landscape"===e.shape||null!=e.physics?.type&&e.physics.type==Me.dynamic||ma(i),null!=this.renderingView)return this.renderingView.renderer.shadowMap.needsUpdate=!0,i;console.warn("RenderingView not found in materializer")}async handlePaintedScatterSceneMutation(e){const t=this.paintedScatterManager?.referencesSceneObject(e.id)??!1,a=await this.sceneObjectContainsPaintedScatter(e);(t||a)&&await this.refreshPaintedScatterPresence(!1)}async refreshPaintedScatterPresence(e=!1){return await this.sceneContainsPaintedScatter()?(null==this.paintedScatterManager&&(this.paintedScatterManager=new gt(this.scene,this.dataProvider,this.renderingView,this.assetManagerService,this.assetsService)),this.paintedScatterManager.queueRefresh(e),!0):(this.disposePaintedScatterManager(),!1)}disposePaintedScatterManager(){null!=this.paintedScatterManager&&(this.paintedScatterManager.clear(),this.paintedScatterManager.stop(),this.paintedScatterManager=void 0)}async sceneContainsPaintedScatter(){return this.sceneObjectsContainPaintedScatter(this.dataProvider.getObjects())}async sceneObjectsContainPaintedScatter(e,t=[]){for(const a of e??[])if(await this.sceneObjectContainsPaintedScatter(a,t))return!0;return!1}async sceneObjectContainsPaintedScatter(e,t=[]){if("scatter"===e.type&&(e.paintedScatter?.cells?.some(e=>(e.instances?.length??0)>0)||(e.paintedScatter?.palette?.length??0)>0))return!0;if(null!=e.children&&await this.sceneObjectsContainPaintedScatter(e.children,t))return!0;if("prefab"===e.type&&null!=e.assetId){if(t.includes(e.assetId))return!1;const a=this.assets.get(e.assetId)??await this.assetsService.getAsset(e.assetId),s=a?.prefab?.objects;if(null!=s)return this.sceneObjectsContainPaintedScatter(s,[...t,e.assetId])}return!1}async handleSurfaceScatterSceneMutation(e){const t=this.surfaceScatterManager?.referencesSceneObject(e.id)??!1,a=await this.sceneObjectContainsSurfaceScatter(e);(t||a)&&await this.refreshSurfaceScatterPresence(!0)}async refreshSurfaceScatterPresence(e=!1){return await this.sceneContainsSurfaceScatter()?(null==this.surfaceScatterManager&&(this.surfaceScatterManager=new yt(this.scene,this.dataProvider,this.renderingView,this.assetManagerService,this.assetsService)),this.surfaceScatterManager.queueRefresh(e),!0):(this.disposeSurfaceScatterManager(),!1)}disposeSurfaceScatterManager(){null!=this.surfaceScatterManager&&(this.surfaceScatterManager.clear(),this.surfaceScatterManager.stop(),this.surfaceScatterManager=void 0)}async sceneContainsSurfaceScatter(){return this.sceneObjectsContainSurfaceScatter(this.dataProvider.getObjects())}async sceneObjectsContainSurfaceScatter(e,t=[]){for(const a of e??[])if(await this.sceneObjectContainsSurfaceScatter(a,t))return!0;return!1}async sceneObjectContainsSurfaceScatter(e,t=[]){if("asset_mesh"===e.type&&(e.surfaceScatter?.meshes?.length??0)>0)return!0;if(null!=e.children&&await this.sceneObjectsContainSurfaceScatter(e.children,t))return!0;if("prefab"===e.type&&null!=e.assetId){if(t.includes(e.assetId))return!1;const a=this.assets.get(e.assetId)??await this.assetsService.getAsset(e.assetId),s=a?.prefab?.objects;if(null!=s)return this.sceneObjectsContainSurfaceScatter(s,[...t,e.assetId])}return!1}sceneReferencesPrefabAsset(e){const t=(a=[])=>{for(const s of a??[]){if("prefab"===s.type&&s.assetId===e)return!0;if(t(s.children))return!0}return!1};return t(this.dataProvider.getObjects())}async prefabAssetContainsSurfaceScatter(e){return"prefab"===e.type&&null!=e.prefab?.objects&&this.sceneObjectsContainSurfaceScatter(e.prefab.objects,[e.id])}async prefabAssetContainsPaintedScatter(e){return"prefab"===e.type&&null!=e.prefab?.objects&&this.sceneObjectsContainPaintedScatter(e.prefab.objects,[e.id])}applyTransform(e,t){null!=e.position&&t.position.fromArray(e.position),null!=e.scale&&t.scale.fromArray(e.scale),null!=e.rotation&&t.rotation.fromArray(e.rotation)}updateWorldEnv(e){this.renderingView.aoPass.enabled=e.worldEnv.ao.enabled,this.renderingView.aoPass.blendIntensity=e.worldEnv.ao.blendIntensity,this.renderingView.aoPass.updateGtaoMaterial(e.worldEnv.ao);const t=e.worldEnv.toneMapping;null!=t&&(this.renderingView.baseToneMapping=t.mapping??0,this.renderingView.baseToneMappingExposure=t.exposure??1,this.renderingView.renderer.toneMapping=this.renderingView.baseToneMapping,this.renderingView.renderer.toneMappingExposure=this.renderingView.baseToneMappingExposure);const a=e.worldEnv.environment,s=++this.worldEnvironmentRequest;null!=a&&null!=a.textureId?this.assetManagerService.getTexture(this.assets.get(a.textureId)).then(e=>{s===this.worldEnvironmentRequest&&(null!=e?this.renderingView.setWorldEnvironment({source:e,intensity:a.intensity??1}):console.error("Failed to load environment texture with id "+a.textureId))}):this.renderingView.setWorldEnvironment(null)}resetWorldEnv(){this.worldEnvironmentRequest++,this.renderingView.setWorldEnvironment(null),this.renderingView.aoPass.enabled=!1,this.renderingView.aoPass.blendIntensity=1,this.renderingView.aoPass.output=0,this.renderingView.baseToneMapping=0,this.renderingView.baseToneMappingExposure=1,this.renderingView.renderer.toneMapping=this.renderingView.baseToneMapping,this.renderingView.renderer.toneMappingExposure=this.renderingView.baseToneMappingExposure}async updateSky(e){null!=this.sky&&(null==e?.sky?.materialId&&this.sky.material!==It?(this.sky.material=It,this.applySkySettings(this.sky.material)):this.sky.material.userData?.assetId!==e.sky.materialId&&this.updateSkyMaterial(e),null!=e.rotation&&this.sky.rotation.fromArray(e.rotation))}async updateSkyMaterial(e){const t=await this.assetsService.getAsset(e.sky.materialId);if(null==t)return void console.warn(`No material asset found for sky with id ${e.sky.materialId}`);const a=await materialFromAsset(t,this.renderingView,this.assetsService,this.assetManagerService,this.shaders,!1);this.applySkySettings(a),null!=this.sky?this.sky.material=a:console.warn("No sky has been created")}applySkySettings(e){e.side=i.BackSide,(e instanceof w||e instanceof i.MeshBasicMaterial||e instanceof i.ShaderMaterial)&&(e.fog=!1),e.depthTest=!0,e.depthWrite=!1,e.transparent=!0}async createComponent(e,t,a,s){const r=new aa[a.path+"/"+a.className],i=t.id+s;r.id=i,r.object=e;for(const e of a.params)null!=e.value&&(r[e.name]=e.value);return this.components.push(r),i}async createFromActor(e,t){const a=this.actorTypes.find(t=>t.name===e.actor?.type)?.type??be[e.actor?.type];if(null==a)return console.warn(`Failed to materialize actor. No actor class found for type '${e.actor?.type}'.`),{object:null,actor:null};this.inEditor&&this.editorActorParamSnapshot.set(e.id,JSON.stringify(e.actor));const s=await this.actorProvider.create(a,(new P).fromArray(e.position),(new c).fromArray(e.rotation),!0),r=this.getNestedActorId(e.id,t);return s.__netSceneId=r,this.applyInitialMaterializedNetRole(s),this.materializedActors.set(r,s),{object:s?.object,actor:s}}applyInitialMaterializedNetRole(e){if(this.inEditor||this.netMode===Ae.none)return;const t=e.constructor[we];!0!==t?.replicate?this.netMode===Ae.client&&(e.netRole=xe.none):e.netRole=this.netMode===Ae.client?xe.simulatedProxy:xe.authority}getNestedActorId(e,t){return null!=t?t.sceneObjectChain.join("/")+"/"+e:e}async createFromVfx(e,t){const a=await this.assetsService.getAsset(e.assetId);null==a&&console.error("Could not find asset",e);const s=await this.actorProvider.create(he,(new P).fromArray(e.position),(new c).fromArray(e.rotation),!1);try{await s.fromAsset(a)}catch(e){return console.error("Failed to create VFX asset",e),null}return s.play(),this.materializedActors.set(this.getNestedActorId(e.id,t),s),null!=s&&(s.object.userData.actor=s),s?.object}async createFromShape(e){const t=this.inEditor&&e.hidden;let a;if("landscape"==e.shape)a=this.createLandscape(e),a.traverse(e=>{e instanceof m&&this._originalMaterials.set(e.id,e.material)});else{let s=new w({name:"Default",color:new l("#aaaaaa"),visible:this.inEditor||!e.hidden,wireframe:!!t});!0===e.collider&&(s.opacity=.3,s.color.set(2517460),s.transparent=!0);const r=await this.createMeshByShape(e.shape,s,e.shapeParams);r.castShadow=e.castShadow??!0,r.receiveShadow=e.receiveShadow??!1,!1===e.collisionDetection&&(r.collisionShape=null),r.physics=e.physics,a=r,this._originalMaterials.set(a.id,r.material),a.traverse(e=>{})}return t||(await Promise.all((e.materialAssignments??[]).filter(e=>null!=e.materialId).map(e=>this.applyMaterial(a,e))),this.applyVertexMaterials(e,a)),a}createLandscape(e){const t=e.landscape?.options;if(null==t)return console.error(`No landscape options exist on scene object ${e.id} ${e.name}`),new p;const a=ut(e.landscape.options);this.applyHeightMaps(a,e.landscape.heightMaps,!0);const s=new ct(e,this.renderingView,a,this.assetManagerService,this.assetsService,this.shaders,t=>{(e.materialAssignments??[]).filter(e=>null!=e.materialId).forEach(e=>this.applyMaterial(t,e))});return this.landscapeManagers.push(s),s.refreshGeometry(),a}applyHeightMaps(e,t,a=!1){const s=new dt(e.sections);for(const e of t??[]){const t=s.find(e.x,e.y);if(!t)return;const a=t.geometry.getAttribute("position");for(const t of e.points)a.setY(t.i,t.y);a.needsUpdate=!0}const r=e.sections;r.forEach(e=>{e.geometry.computeBoundsTree(),e.geometry.computeVertexNormals()}),this.inEditor&&!a||setTimeout(()=>pt(r),50)}async createMeshByShape(e,t,a={}){if("landscape"!==e&&jt.includes(e)){const s=await prepareShapeParameters(a??{}),r=e+JSON.stringify(a);if(!this.geometryCache.has(r)){const t=xt[e].geometry(s);(function(e){return null!=e.index&&e.hasAttribute("position")&&e.hasAttribute("normal")&&e.hasAttribute("uv")})(t)&&t.computeTangents(),this.geometryCache.set(r,t)}this.collisionShapeCache.has(r)||this.collisionShapeCache.set(r,xt[e].collision(s));return new lt(this.geometryCache.get(r),t,this.collisionShapeCache.get(r))}if(this.inEditor)throw new Error(`Unsupported shape '${e}'`);console.warn(`Failed to create shape. Unsupported shape '${e}'. This might be because the hology/core library is not compatible with the editor version.`)}async createFromAsset(e,t){const a=this.assets.get(e.assetId)??await this.assetsService.getAsset(e.assetId);if(null==a)return void console.warn(`Can not find asset with id ${e.assetId} and name ${e.name}`);let{scene:s}=await this.assetManagerService.getMesh(a,{mergeGeomtries:!0});if(!1!==t?.assignMaterials)try{await Promise.all(Ba(e.materialAssignments,a.materialAssignments).map(e=>this.applyMaterial(s,e,a)))}catch(t){console.error("Failed to apply material"+t,e)}const r=e.receiveShadow??!!a.receiveShadow,i=e.castShadow??!!a.castShadow;return s.receiveShadow=r,na(s,i,r),!1!==e.collisionDetection&&!1!==a.collisionDetection||(s.collisionShapes=[]),null!=e.physics&&!0!==this.inEditor&&(s.physics=e.physics),this.applyVertexMaterials(e,s),s.traverse(e=>{e instanceof m&&"computeBoundsTree"in e.geometry&&null==e.geometry.boundsTree&&e.geometry.computeBoundsTree()}),s.userData.assetId=e.assetId,s.traverse(e=>{if(e instanceof m)for(const t of Ze(e.material))Oe(t,!1)}),s}async createFromPrefab(e,t,a){const s=await this.assetsService.getAsset(e.assetId);if(null==s)return void console.warn(`Can not find asset with id ${e.assetId} and name ${e.name}`);null==t&&(t={sceneObjectChain:[]}),t.sceneObjectChain.push(e.id);const{object:r}=await this.createFromPrefabAsset(s,t,a,e);return t.sceneObjectChain.pop(),r}async createFromPrefabAsset(e,t,a,s,r=!0){this.assets.set(e.id,e);const i=new p;null!=s&&this.applyTransform(s,i),null!=a&&a.add(i),await Promise.all(e.prefab.objects.filter(e=>"global_fog"!==e.type&&"world_env"!==e.type).map(e=>this.materialize(e,i,!0,structuredClone(t))));const n=t.sceneObjectChain.join("/"),o=Array.from(this.materializedActors.entries()).filter(([e,a])=>e.startsWith(n)&&e.split("/").length-1===t.sceneObjectChain.length);o.forEach(e=>{});let l=null;if(null!=e.prefab?.mainActorId){const a=t.sceneObjectChain.join("/")+"/"+e.prefab.mainActorId;l=this.materializedActors.get(a)}r||await this.initActorsPostInit(o);const c=Array.from(this.materializedActors.entries()).filter(([e])=>e.startsWith(n+"/")),u=c.map(([,e])=>e),d=new Map(c.map(([e,t])=>[e.slice(n.length+1),t]));if(this.assetsService.supportsLivePrefabParameters){let t=this.livePrefabInstances.get(e.id);null==t&&(t=new Map,this.livePrefabInstances.set(e.id,t));const a=new Map([...Oa(e.prefab?.objects??[])].map(([t,a])=>[t,Ca(a,s,e.prefab?.mainActorId===t)]));t.set(n,{prefix:n,source:s,actorsById:d,actorSettingsById:a,desiredActorSettingsById:new Map(a)})}if(!this.inEditor&&!0!==t.runtimeSpawn&&ea(e.prefab?.eventGraph)&&this.materializedPrefabEventGraphs.set(n,{id:n,graph:e.prefab.eventGraph,object:i,actors:u,actorsById:d,mainActor:l}),null!=e.prefab?.mainActorId&&null!=s){const a=t.sceneObjectChain.join("/"),s=a+"/"+e.prefab.mainActorId;this.prefabInstanceExposedActorMap.set(a,s)}return{object:i,actors:u,actorsById:d,mainActor:l,instanceId:n}}async createParticleSystem(e){await this.assetsService.getAsset(e.assetId);return new b}async createLight(e){if("point"===e.light.type){const t=new v(e.light.point.color,e.light.point.intensity,e.light.point.distance,e.light.point.decay);if(t.castShadow=e.light.point.castShadow??!0,this.inEditor){const e=(new i.TextureLoader).load("assets/light-bulb-icon.webp"),a=new i.SpriteMaterial({map:e,alphaTest:.5}),s=new Ft(a);s.scale.multiplyScalar(.6),t.add(s)}return t}if("spot"===e.light.type){const t=new i.SpotLight(e.light.spot.color,e.light.spot.intensity,e.light.spot.distance,e.light.spot.angle,e.light.spot.penumbra,e.light.spot.decay);if(t.castShadow=e.light.spot.castShadow??!0,t.target=new b,t.target.position.set(0,-1,0),t.add(t.target),this.inEditor){const e=(new i.TextureLoader).load("assets/light-bulb-icon.webp"),a=new i.SpriteMaterial({map:e,alphaTest:.5}),s=new Ft(a);s.scale.multiplyScalar(.6),t.add(s),t.add(new i.SpotLightHelper(t))}return t}if("rectArea"===e.light.type){const t=new i.RectAreaLight(e.light.rectArea.color,e.light.rectArea.intensity,e.scale?e.scale[0]:1,e.scale?e.scale[1]:1);if(this.inEditor){const e=(new i.TextureLoader).load("assets/light-bulb-icon.webp"),a=new i.SpriteMaterial({map:e,alphaTest:.5}),s=new Ft(a);s.scale.multiplyScalar(.6),t.add(s);const r=new qt(t);t.add(r)}return t}return"directional"===e.light.type?(this.applyDirectionalLight(e.light.directional,e),new p):"ambient"===e.light.type?(this.applyDirectionalAmbientLight(null,e.light.ambient,e),new p):void 0}applyDirectionalAmbientLight(e,t,a){const s=this.scene.children.find(e=>e.name===Pt);null!=s?(s.intensity=t.intensity,s.color.set(t.color),s.groundColor.set(t.color),s.userData.src=a,s.userData.volumetricIntensity=t.volumetricIntensity):console.warn("Couldn't find ambient light")}applyDirectionalLight(e,t){for(const a of this.renderingView.csm.lights)a.intensity=e.intensity,a.color.set(e.color),a.castShadow=e.castShadow,a.userData.src=t,a.userData.volumetricIntensity=e.volumetricIntensity;this.renderingView.csm.lightDirection.fromArray(e.direction).normalize()}dispose(){this.editorStaticDisposed=!0,this.disposeEditorStaticDrawSet(),this.editorStaticEditingObjects.clear(),this.editorStaticSelectedObjects.clear(),this.editorStaticObjectsToRebuild.clear(),this.editorStaticDrawSetUpdated$.complete(),this.experimentalStaticDrawSetDisposer?.(),this.experimentalStaticDrawSetDisposer=void 0,this.removePrefabEventGraphs(),this.livePrefabInstances.clear(),this.updateSubscription.unsubscribe(),this.createAssetSubscription.unsubscribe(),this.disposePaintedScatterManager(),this.disposeSurfaceScatterManager(),this.materializedActors.forEach(e=>e.disposed.next(!0)),this.materializedActors.clear()}announcePrefabEventGraphs(e){for(const[t,a]of this.materializedPrefabEventGraphs)(null==e||t===e||t.startsWith(e+"/"))&&(this.announcedPrefabEventGraphs.has(t)||(this.announcedPrefabEventGraphs.add(t),this.prefabEventGraphAdded$.next(a)))}removePrefabEventGraphs(e){const t=[];for(const[a,s]of[...this.materializedPrefabEventGraphs])(null==e||a===e||a.startsWith(e+"/"))&&(t.push(s),this.prefabEventGraphRemoved$.next(s),this.materializedPrefabEventGraphs.delete(a),this.announcedPrefabEventGraphs.delete(a));return t}};ia=e([pe(),t("design:paramtypes",[A,Object,it,rt,De,Array,Array,Object,Array])],ia);export{ia as SceneMaterializer};function na(e,t,a){e.castShadow=t,e.receiveShadow=a,e.traverse(e=>{e.castShadow=t,e.receiveShadow=a})}const oa=new Map,la=new Map,ca=new g({color:16711935}),ua=new Map;export async function materialFromAsset(e,t,a,s,r,i=!0){if(null==e||null==e.material)return console.error("Asset or asset material is null",e),ca;const n=JSON.stringify(e.material)+t?._id,o=i&&!("shaderGraph"===e.material.type&&"asset"===e.material.shaderGraph?.source);if(o&&oa.has(n))return oa.get(n);if(o&&la.has(n))return await la.get(n);const l=_materialFromAsset(n,e,t,a,s,r,o);return o?la.set(n,l).get(n):l}export async function _materialFromAsset(e,t,a,r,n,o,c=!0){const u={opacity:t.material.params?.opacity??1,map:null,emissive:t.material.params?.emissive??null,metalness:t.material.params?.metalness??0,flatShading:t.material.params?.flatShading??!1,color:new l(t.material.params?.color),transparent:null!=t.material.params?.opacity&&t.material.params?.opacity<1},d={};if(null!=t.material.params?.map){const e=t.material.params.map,a=await r.getAsset(e);null!=a&&(u.map=await n.getTexture(a))}let p,h,f;switch(t.material.type){case"phong":p=new y({...u,...d});break;case"water":p=wt(u,a);break;case"grassFoliage":p=ht({color:u.color,map:u.map},a);break;case"grass":p=ft({...u,colorTwo:new l(t.material.params.colorTwo),colorThree:new l(t.material.params.colorThree)},a);break;case"shaderGraph":{const e=await async function(e,t){const a=e.material?.shaderGraph;if("local"===a?.source)return a.graph;if("asset"===a?.source){const e=await t.getAsset(a.assetId);return e?.shaderGraph??null}return e.shaderGraph??null}(t,r);if(null==e){console.warn("Missing shader graph for material "+t.name),p=ca;break}"surface"===e.target&&null!=e.materialOptions?.side&&(h=Kt(e.materialOptions.side)),"decal"===e.target?f=!1:null!=e.materialOptions?.transparent&&(f=e.materialOptions.transparent);try{const s=await prepareShaderGraphParameters(t.material?.shaderParams??{},e,r,n,a,o),i=t.shaderGraphPreviewNodeId,l=t.trailBillboard;p=Xt(e,{parameters:s,previewNodeId:i,trailBillboard:l,alphaTest:t.material.alphaTest}),p.userData.customShaderName="asset"===t.material.shaderGraph?.source?`shaderGraph:${t.material.shaderGraph.assetId}`:`shaderGraph:${t.id}`}catch(e){console.warn("Shader graph runtime error: "+e,e),p=ca}break}case"standard":case"unlit":case"toon":case"layered":case"lambert":case"shader":case"landscape":case"landscape-composite":case"decal-unlit":case"decal-standard":case"sprite":const e={standard:sa?Ve:Ue,lambert:Ve,unlit:Be,toon:Wt,layered:Ut,landscape:Ne,"landscape-composite":ze,"decal-unlit":Et,"decal-standard":Ct,sprite:s}[t.material.type]??o.find(e=>e.name==t.material.shader)?.type;if(e){try{let s=new e;const i=await prepareClassParameters(t.material?.shaderParams??{},e,r,n,null,a,o,void 0,void 0,s);Object.assign(s,i),s.alphaTest=t.material.alphaTest??s.alphaTest,p=s.build()}catch(e){console.log("Shader runtime error: "+e,e),ua.has(t.material.shader)||ua.set(t.material.shader,ca.clone()),p=ua.get(t.material.shader)}p.userData.customShaderName=t.material.shader}else console.warn("Missing shader implementation with name "+t.material.shader),p=ca;break;default:throw new Error("Unsupported material type "+t.material.type)}if(a?.csm.setupMaterial(p),p.side=h??t.material.side??p.side??i.FrontSide,p.transparent=(f??t.material.transparent??u.transparent??!1)||p.transparent,p.alphaTest=t.material.alphaTest??p.alphaTest??0,p.userData.receiveDecals=t.material.receiveDecals??!0,null!=t.material.blending&&(p.blending=je[t.material.blending]??i.NormalBlending),!0===t.material.transparent&&(p.depthWrite=!1),t.material.bloom&&(p.userData.hasBloom=!0),t.material.reflective&&(p.userData.reflective=!0),!0===t.material.outlines&&(p.userData.outlineParameters={},null!=t.material.outlineParams&&(null!=t.material.outlineParams.color&&(p.userData.outlineParameters.color=new l(t.material.outlineParams.color).toArray()),null!=t.material.outlineParams.thickness&&(p.userData.outlineParameters.thickness=t.material.outlineParams.thickness),null!=t.material.outlineParams.opacity&&(p.userData.outlineParameters.alpha=t.material.outlineParams.opacity),null!=t.material.outlineParams.colorMode&&(p.userData.outlineParameters.colorMode=t.material.outlineParams.colorMode),null!=t.material.outlineParams.darkening&&(p.userData.outlineParameters.darkening=t.material.outlineParams.darkening))),null!=t.material.surfaceAssetId&&""!==t.material.surfaceAssetId){const e=await materializeDataAssetRef(t.material.surfaceAssetId,r,n,void 0,a,o);null!=e&&(p.userData.surface=e.value)}return p.userData.assetId=t.id,c&&null!=a&&oa.set(e,p),c&&la.delete(e),p}export function prepareCustomParamsFromShaderGraph(e,t={}){return Object.fromEntries((e.parameters??[]).map(e=>{const a=function(e){switch(e){case"float":return St.FloatNode;case"boolean":return St.BooleanNode;case"texture":return St.Sampler2DNode;case"vec2":return St.Vec2Node;case"vec3":return St.Vec3Node;case"vec4":return St.Vec4Node;case"color":return St.RgbNode}}(e.type),s=t[e.name],r=s?.override??null!=s,i=void 0!==e.defaultValue?e.defaultValue:customParameterDefaultValueByType.get(a),n=!1===r?Ua(i):s?.value??Ua(i);return[e.name,{type:a,value:n,override:r}]}))}export async function prepareShaderGraphParameters(e,t,a,s,r,i){const n={},o=prepareCustomParamsFromShaderGraph(t,e);for(const[e,t]of Object.entries(o)){const o=await pa(e,t,a,s,null,r,i);null!=o&&(n[e]=o)}return n}export async function prepareClassParameters(e,t,a,s,r,i,n,o,l,c){const u={},{params:d,skipped:p}=vt(e,{parameterType:t,parameterTarget:c,extractPropertyParameters:$e,toSerializedParamType:toSerializedParamType});for(const e of p)console.warn(`Skipping stored parameter "${e.key}" because it could not be converted from ${St[e.sourceType]} to ${St[e.targetType]}`);for(const[e,t]of Object.entries(d)){if(!1===t.override)continue;const c=await pa(e,t,a,s,r,i,n,o,void 0,void 0,l);null!=c&&(u[e]=c)}return u}export async function prepareShapeParameters(e,t,a){const s={};for(const[r,i]of Object.entries(e)){const e=await pa(r,i,t,a,null,void 0,void 0,void 0,void 0,void 0);null!=e&&(s[r]=e)}return s}const da=new Map;async function pa(e,t,a,s,r,i,n,o,u=t.value,d=t.type,p,h=(t.type===St.Struct?t.struct:void 0)){if(null==t||null==u||""===u)return null;switch(d){case St.Array:if(Array.isArray(u)&&"element"in t)return await Promise.all(u.map(l=>pa(e,t,a,s,r,i,n,o,l,t.element,p,t.elementStruct)));break;case St.Number:case St.FloatNode:let f;if("string"==typeof u?f=parseFloat(u):"number"==typeof u&&(f=u),d===St.FloatNode){if("object"==typeof u&&"a"in u&&"b"in u){const e=u;if(null==e.a)return null;const t="string"==typeof e.a?parseFloat(e.a):e.a;if(null==e.b)return t;const a="string"==typeof e.b?parseFloat(e.b):e.b,s=function(e){let t=da.get(e);return null==t&&(t=Ee(Ot.decode(e)),da.set(e,t)),t}(e.easing),r=s.sample(Ce(ke.energy));return W(U(t),U(a),r)}return new X(qe(e),f,void 0,!1)}return f;case St.Texture:let m=await s.getTexture(await a.getAsset(u));return"envmap"===e.toLowerCase()&&null!=i&&(m=i.getEnvTexture(m)),m;case St.Sampler2DNode:const g=await a.getAsset(u);if(null!=g?.texture?.textureArrayFileKey){const{texture:t,layerIndex:a}=await s.getTextureArray(g);if(t&&null!=a)return new K(null,t,new X(qe(e)+"_i",a,void 0,!1))}const y=await s.getTexture(g);return y?Q(y):null;case St.Boolean:return u;case St.BooleanNode:return new Z(qe(e),u,void 0,!1);case St.Vector2:case St.Vec2Node:if("object"==typeof u){const t=u instanceof Array?(new j).fromArray(u):new j(u.x,u.y);return d===St.Vec2Node?new ee(qe(e),t,void 0,!1):t}return null;case St.Vector3:case St.Vec3Node:if("object"==typeof u){const t=u instanceof Array?(new P).fromArray(u):new P(u.x,u.y,u.z);return d===St.Vec3Node?new te(qe(e),t,void 0,!1):t}return null;case St.Vector4:case St.Vec4Node:if("object"==typeof u){const t=u instanceof Array?(new D).fromArray(u):new D(u.x,u.y,u.z,u.w);return d===St.Vec4Node?new ae(qe(e),t,void 0,!1):t}return null;case St.Color:case St.RgbNode:const w=new l(u);return d===St.RgbNode?new te(qe(e),new P(w.r,w.g,w.b),void 0,!1).rgb:w;case St.String:return u;case St.BaseActor:const S=u;if(null==r&&console.warn("Class parameters can not be prepared as actors are not passed in"),null==S)return null;if("object"==typeof S&&null!=S.type&&null!=S.id){if("actor"===S.type)return r?.get(S.id)??null;if("prefab"===S.type){const e=p?p(S.id):null;if(null!=e)return r?.get(e)??null;const t=[];for(const[e,a]of r?.entries()??[])e.startsWith(S.id+"/")&&t.push(a);return 1===t.length?t[0]:null}}if("string"==typeof S){const e=r?.get(S);if(null!=e)return e;const t=p?p(S):null;if(null!=t)return r?.get(t)??null;const a=[];for(const[e,t]of r?.entries()??[])e.startsWith(S+"/")&&a.push(t);return 1===a.length?a[0]:null}return null;case St.Euler:const b=u;return(new c).fromArray(b);case St.Object3D:{const e=await a.getAsset(u);return(await s.getMesh(e,{applyMaterials:!0,rescale:!0,mergeGeomtries:!0})).scene}case St.Material:{if(null==u)return null;const e=await a.getAsset(u);return null==e?(console.warn("Material asset not found for material parameter",u),null):null==e.material?(console.warn("Using a non-material asset for material parameter"),null):await materialFromAsset(e,i,a,s,n)}case St.AudioBuffer:return await s.getAudio(await a.getAsset(u));case St.VisualEffect:const v=await a.getAsset(u);if(null==o){console.error("Can not create instance of visual effect because missing actor provider");break}if("vfx"in v)return new fe(o,v);console.error("Using a non-vfx asset for visual effect parameter");break;case St.Prefab:{const e=await a.getAsset(u);return null==e?(console.error("Using a non-prefab asset for prefab parameter",u),null):new me(e)}case St.PrefabActor:{const e=await a.getAsset(u);return null==e?(console.error("Using a non-prefab asset for prefab parameter",u),null):new ge(new me(e))}case St.DataAsset:return materializeDataAssetRef(u,a,s,r,i,n,o,p);case St.Sequence:{if("string"!=typeof u)return console.warn("Invalid sequence parameter value",u),null;const e=await a.getAsset(u);if("sequence"===e?.type&&"sequence"in e)return new Ht(e.sequence);console.error("Using a non-sequence asset for sequence parameter");break}case St.SequenceData:return Qt(u)?u:(console.warn("Invalid inline sequence data parameter value",u),null);case St.Struct:return async function(e,t,a,s,r,i,n,o,l){const c=ha(e),u=c?.struct??t;if(null==u)return console.warn("Missing parameter definition id for struct parameter"),null;const d=Re(u);if(null==d)return console.warn(`Unknown parameter definition "${u}"`),null;if(Ge(u))return console.warn(`Can not instantiate abstract parameter definition "${u}"`),null;if(null!=t&&u!==t&&!Je(u,t))return console.warn(`Parameter definition "${u}" is not assignable to "${t}"`),null;let p;try{p=new d}catch(e){return console.warn(`Failed to instantiate parameter definition "${u}"`,e),null}const h=function(e){const t=ha(e);if(null!=t)return t.value;if(fa(e))return e;if(null!=e&&"object"==typeof e&&fa(e.params))return e.params;return{}}(c?.value??e),f=await prepareClassParameters(h,null,a,s,r,i,n,o,l,p);return Object.assign(p,f),p}(u,h,a,s,r,i,n,o,p);case St.Curve:return Ot.decode(u);case St.ColorLayer:case St.MaskLayer:if(Bt(u)){const e=await Tt.decode(u,async e=>await s.getTexture(await a.getAsset(e))),t=await prepareClassParameters(u.params,null,a,s,void 0,void 0,void 0,void 0,void 0,e);return Object.assign(e,t),e}return console.warn("Expecting color layer but got",u),null;case St.AnimationClip:{const e="string"==typeof u?u:"object"==typeof u&&null!=u?u.assetId:null;if(null==e)return console.warn("Invalid animation clip asset id value",u),null;return await s.getAnimationClip(await a.getAsset(e))}}return null}export async function materializeDataAssetRef(e,t,a,s,r,i,n,o){const l="string"==typeof e?e:null!=e&&"object"==typeof e?e.assetId??e.id:null;if(null==l||""===l)return null;const c=await t.getAsset(l);if(null==c)return console.warn(`Data asset "${l}" was not found`),null;if("data"!==c.type||null==c.dataAsset)return console.warn("Using a non-data asset for data asset parameter",l),null;const u=c.dataAsset.definition;if(null==u||""===u)return console.warn(`Missing data asset definition id for asset "${c.id}"`),null;if(_e(u))return console.warn(`Can not instantiate abstract data asset definition "${u}"`),null;const d=Fe(u);if(null==d)return console.warn(`Unknown data asset definition "${u}"`),null;let p;try{p=new d}catch(e){return console.warn(`Failed to instantiate data asset definition "${u}"`,e),null}const h=c.dataAsset.params??{};if("object"!=typeof h||Array.isArray(h))return console.warn(`Invalid data asset params for asset "${c.id}"`),null;try{const e=await prepareClassParameters(h,null,t,a,s,r,i,n,o,p);Object.assign(p,e)}catch(e){return console.warn(`Failed to materialize data asset "${c.id}"`,e),null}return new ye(c,p)}function ha(e){return null!=e&&"object"==typeof e&&!Array.isArray(e)&&"string"==typeof e.struct&&fa(e.value)?e:null}function fa(e){return null!=e&&"object"==typeof e&&!Array.isArray(e)&&Object.values(e).every(e=>null!=e&&"object"==typeof e&&"type"in e)}function ma(e){e.updateWorldMatrix(!0,!0),e.updateMatrix(),e.traverse(e=>{e.matrixAutoUpdate=!1,e.matrixWorldNeedsUpdate=!1});const t=e.updateMatrixWorld;e.updateMatrixWorld=function(){t.apply(e),e.updateMatrixWorld=function(){}}}function ga(){}const ya=new WeakMap;function wa(e,t){if(t)return e.userData.hologyEditorMatrixWorldAutoUpdate=!0,void e.traverse(e=>{const t=ya.get(e);if(null!=t){e.updateMatrixWorld=t.updateMatrixWorld;for(const[e,a]of t.matrixAutoUpdate)e.matrixAutoUpdate=a}});const a=[];e.traverse(e=>{ya.has(e)&&a.push(e)}),0===a.length&&a.push(e);for(const e of a)Sa(e);delete e.userData.hologyEditorMatrixWorldAutoUpdate}function Sa(e){const t=ya.get(e);if(e.updateMatrix(),e.updateWorldMatrix(!0,!0),null==t){const t=new Map;e.traverse(e=>{t.set(e,e.matrixAutoUpdate)}),ya.set(e,{updateMatrixWorld:e.updateMatrixWorld,matrixAutoUpdate:t})}e.traverse(e=>{e.matrixAutoUpdate=!1,e.matrixWorldNeedsUpdate=!1}),e.updateMatrixWorld=ga}function ba(e,t=!1){return Array.isArray(e)?e.every(e=>ba(e,t)):t||!e.transparent&&!va(e)}function va(e){return e instanceof R&&(null!=e.uniforms[ta]||null!=e.uniforms.hology_scene_map)}function Ma(e){return"linear"===e.type?new u(new l(e.color),e.near??100,e.far??1e3):"density"===e.type?new d(e.color,e.density):void console.warn("Invalid fog type",e)}const Aa=new P,xa=new M,ja=new P;new w({color:4229780});async function Pa(e,t,a,s){null==s&&(s=(new f).identity());const r=s.clone().multiply(Da(e,new i.Matrix4));if(null!=e.children&&e.children.length>0)for(let a=e.children.length-1;a>=0;a--)await Pa(e.children[a],t,e,r);await t(e,a,s)}function Da(e,t){return null==e.position||null==e.rotation||null==e.scale?t.identity():t.compose((new P).fromArray(e.position),(new M).setFromEuler((new c).fromArray(e.rotation)),(new P).fromArray(e.scale))}export function toSerializedParamType(e){if(null==e)return;const t=e.constructor.prototype;return t instanceof Number||e===Number?St.Number:t instanceof $||"function"==typeof e.prototype.isFloat?St.FloatNode:t instanceof x||e===x||e.isTexture?St.Texture:t instanceof Te||e===Te||e===Y||"function"==typeof e.prototype?.isSampler2D||!0===e.prototype?.isSampler2D?St.Sampler2DNode:t instanceof Boolean||e===Boolean?St.Boolean:t instanceof z?St.BooleanNode:t instanceof l||e==l?St.Color:t instanceof L||"function"==typeof e.prototype.isRgb?St.RgbNode:t instanceof j||e==j?St.Vector2:t instanceof oe||"function"==typeof e.prototype.isVec2?St.Vec2Node:t instanceof P||e==P?St.Vector3:t instanceof ce||"function"==typeof e.prototype.isVec3?St.Vec3Node:t instanceof D||e==D?St.Vector4:t instanceof de||"function"==typeof e.prototype.isVec4?St.Vec4Node:t instanceof String||e===String?St.String:t instanceof Se||e==Se||e.prototype instanceof Se||e.prototype==Se?St.BaseActor:t instanceof c||e==c?St.Euler:t instanceof b||e==b?St.Object3D:t instanceof h||e==h?St.Material:t instanceof AudioBuffer||e==AudioBuffer?St.AudioBuffer:t instanceof fe||e==fe?St.VisualEffect:t instanceof me||e==me?St.Prefab:t instanceof ge||e==ge?St.PrefabActor:t instanceof ye||e==ye?St.DataAsset:t instanceof Ot||e==Ot?St.Curve:t instanceof Tt||e==Tt?St.ColorLayer:t instanceof Nt||e==Nt?St.MaskLayer:t instanceof i.AnimationClip||e==i.AnimationClip?St.AnimationClip:t instanceof Ht||e==Ht?St.Sequence:"SequenceData"===e.name||e.prototype&&"tracks"in e.prototype?St.SequenceData:null!=We(e)?St.Struct:void console.warn("Failed to map parameter type to serialized version",{type:e})}export function getCustomParamTypeInfo(e){const t=e.type===Object?void 0:toSerializedParamType(e.type),a=t===St.Struct?We(e.type):void 0;return!0===e.options.array?{type:St.Array,element:t,...null!=a?{elementStruct:a}:{}}:{type:t,...null!=a?{struct:a}:{}}}export function prepareCustomParams(e,t,a={},s={}){return Object.fromEntries(e.map(e=>{const r=getCustomParamTypeInfo(e);let i=r;const n=t[e.name],o=Ia(n)?n:void 0,l=!0===s.treatAllAsOptional||!0===e.options.optional,c=s.missingOverrideDefaultsToOverride??!0;let u=o?.override;void 0===u&&null!=n&&l&&c&&(u=!0),void 0===u&&l&&(u=!1);const d=void 0!==a[e.name]||void 0!==e.options.defaultValue,p=function(e,t){if(null==e.type){const a=function(e){return Qt(e)?{type:St.SequenceData}:void 0}(t);null!=a&&(e=a)}if(e.type!==St.Struct)return{typeInfo:e,value:t};const a=ha(t);if(null==a)return{typeInfo:e,value:t};return{typeInfo:{...e,struct:a.struct},value:a.value}}(i,function(e,t){if(void 0!==t[e.name])return t[e.name];if(void 0!==e.options.defaultValue){const t=serializeCustomParameter(e.type,e.options.defaultValue);return void 0!==t?t:e.options.defaultValue}const a=toSerializedParamType(e.type);if(a===St.Struct)return Ge(e.type)?{}:prepareCustomParamsFromType(e.type,{});return customParameterDefaultValueByType.get(a)}(e,a)),h=function(e,t){if(Ia(e))return e;if(t.type!==St.SequenceData||!Qt(e))return;return{type:St.SequenceData,value:e}}(n,p.typeInfo);i=function(e,t,a){if(e.type!==St.Struct||a?.type!==St.Struct||null==a.struct)return e;const s=t.struct??e.struct;if(null==s||a.struct===s||Je(a.struct,s)||null==Re(a.struct))return{...e,struct:a.struct};return e}(p.typeInfo,r,h);const f=!1!==u||e.options.array?h?.value??function(e,t,a){if(!0===e.options.array)return a?Ua(t):[];return Ua(t)}(e,p.value,d):Ua(p.value),m=function(e,t,a){if(t.type===St.Struct){if(null!=t.struct&&Ge(t.struct))return a;const s=null!=t.struct?Re(t.struct):e.type;return null!=s&&fa(a)?prepareCustomParamsFromType(s,a):a}if(t.type!==St.Array||t.element!==St.Struct||!Array.isArray(a))return a;const s=null!=t.elementStruct?Re(t.elementStruct):e.type;return a.map(e=>{const a=ha(e),r=a?.struct??t.elementStruct;if(null!=r&&Ge(r))return e;const i=null!=a?Re(a.struct):s,n=a?.value??(fa(e)?e:null);if(null==i||null==n)return e;const o=prepareCustomParamsFromType(i,n);return null!=a?{struct:a.struct,value:o}:o})}(e,i,f);return[e.name,{...i,value:m,override:u}]}))}function Ia(e){return null!=e&&"object"==typeof e&&!Array.isArray(e)&&"number"==typeof e.type&&"value"in e}function Oa(e){const t=new Map,a=e=>{for(const s of e)"actor"===s.type&&null!=s.actor&&t.set(s.id,s.actor),null!=s.children&&a(s.children)};return a(e),t}function Ea(e){const t=new Map,a=e=>{for(const s of e)"prefab"===s.type&&t.set(s.id,s),null!=s.children&&a(s.children)};return a(e),t}function Ca(e,t,a){if(!a||"prefab"!==t?.type||null==t.prefab)return e;const s=new Map((e.innerParams??[]).map(e=>[JSON.stringify(e.path),{path:e.path,params:{...e.params}}]));for(const e of t.prefab.innerParams??[]){const t=JSON.stringify(e.path),a=s.get(t);s.set(t,{path:e.path,params:{...a?.params??{},...Va(e.params)}})}return{...e,params:{...e.params??{},...Va(t.prefab.params)},innerParams:[...s.values()]}}function ka(e,t,a){const s=new Map((e.innerParams??[]).map(e=>[JSON.stringify(e.path),e])),r=new Map((t.innerParams??[]).map(e=>[JSON.stringify(e.path),e])),i=new Map((a.innerParams??[]).map(e=>[JSON.stringify(e.path),e])),n=[];for(const e of new Set([...s.keys(),...r.keys(),...i.keys()])){const t=s.get(e),a=r.get(e),o=i.get(e),l=Ta(t?.params??{},a?.params??{},o?.params??{});Object.keys(l).length>0&&n.push({path:a?.path??o?.path??t.path,params:l})}return{...t,params:Ta(e.params??{},t.params??{},a.params??{}),innerParams:n}}function Ta(e,t,a){const s={};for(const r of new Set([...Object.keys(e),...Object.keys(t),...Object.keys(a)]))JSON.stringify(a[r])!==JSON.stringify(e[r])?null!=a[r]&&(s[r]=a[r]):null!=t[r]&&(s[r]=t[r]);return s}function Va(e){return null==e?{}:Object.fromEntries(Object.entries(e).filter(([,e])=>function(e){return!0===e?.override}(e)))}function za(e,t){return e.length>=t.length&&t.every((t,a)=>e[a]===t)}export function prepareCustomParamsFromType(e,t,a=null,s={}){const r=$e(e);if(0===r.length)return{};let i;null!=a?Pe(a,()=>{i=a.get(e)}):i=new e;const n={};for(const e of r){const t=i[e.name];if(null!=t){const a=Na(e,t);void 0!==a&&(n[e.name]=a)}}return prepareCustomParams(r,t,n,s)}function Na(e,t){return!0===e.options.array?Array.isArray(t)?t.map(t=>serializeCustomParameter(e.type,t)??t):[]:serializeCustomParameter(e.type,t)}function Ua(e){return null==e?e:Array.isArray(e)?e.map(e=>Ua(e)):"object"==typeof e?"function"==typeof structuredClone?structuredClone(e):JSON.parse(JSON.stringify(e)):e}export function serializeCustomParameter(e,t){function a(){console.error("Failed to serialize value",{type:e,value:t})}switch(e){case Number:case Boolean:return t;case j:return t instanceof j?t.toArray():void a();case P:return t instanceof P?t.toArray():void a();case D:return t instanceof D?t.toArray():void a();case l:return t instanceof l?"#"+t.getHexString():"string"==typeof t?t:"number"==typeof t?"#"+new l(t).getHexString():void a();case String:return t;case c:return t instanceof c?t.toArray():void a();case me:return t instanceof me?t.asset?.id??null:void a();case ye:return t instanceof ye?t.id:"string"==typeof t?t:void a()}const s=We(e);if(null!=s){const r=ha(t);if(null!=r)return r.struct===s?r.value:r;const i=function(e,t){if(null==t||"object"!=typeof t)return e;const a=t.constructor;return null!=We(a)&&Le(a,e)?a:e}(e,t),n=We(i),o=function(e,t){if(null==t)return null;if(fa(t))return t;if(null!=t&&"object"==typeof t&&fa(t.params))return t.params;if("object"!=typeof t)return;const a=$e(e),s={};for(const e of a){const a=t[e.name];if(void 0===a)continue;const r=Na(e,a);void 0!==r&&(s[e.name]=r)}return prepareCustomParams(a,{},s)}(i,t);return void 0!==o?null!=o&&null!=n&&n!==s?{struct:n,value:o}:o:void a()}if(Qt(t))return t}function Ba(e,t){return function(e,t,a){const s=[],r=new Set;for(const i of[...e??[],...t??[]]){const e=a(i);r.has(e)||(r.add(e),s.push(i))}return s}((e??[]).filter(e=>$a(e.materialId)),(t??[]).filter(e=>$a(e.materialId)),e=>e.color+e.name)}function $a(e){return"null"!=e&&null!=e}export const customParameterDefaultValueByType=new Map([[St.RgbNode,"#000000"],[St.Color,"#000000"],[St.String,""],[St.Vector4,[0,0,0,0]],[St.Vec4Node,[0,0,0,0]],[St.Vector3,[0,0,0]],[St.Vec3Node,[0,0,0]],[St.Vector2,[0,0]],[St.Vec2Node,[0,0]],[St.Euler,[0,0,0,"XYZ"]],[St.Array,[]],[St.DataAsset,null],[St.SequenceData,Yt()],[St.ColorLayer,Vt],[St.MaskLayer,zt]]);let Fa=new l;new l;function Wa(e){return null==e?.color?null:(Fa.set(e.color),"#"+Fa.getHexString())}function Ra(e,t,a,s){const r="string"==typeof t.name&&""!==t.name?t.name:null;if(null!=r)return e.name===r||s===r;const i=Wa(e);return null!=i&&(i===t.color||a===t.color)}export function applyMaterial(e,t,a,s,r={}){const n=[];return e.traverse(async e=>{if(e instanceof m||e.isMesh||e instanceof i.SkinnedMesh||e.isSkinnedMesh)for(const t of Ze(e.material))t.hasOwnProperty("color")&&n.push(e)}),Promise.all(n.map(async e=>{if(e.material instanceof Array)for(let i=0;i<e.material.length;i++){const n=e.material[i];if(null==n.color||!(n.color instanceof l))continue;const o=Wa(n),c=n.name;if(Ra(n,t,e.userData["originalColor_"+i],e.userData["originalMaterialName_"+i])){const n=Ga(await a(t.materialId),r.textureFlipY),l=e.material[i];null!=n&&l.id!=n.id&&(e.material[i]=n,e.userData["originalColor_"+i]=e.userData["originalColor_"+i]??o,e.userData["originalMaterialName_"+i]=e.userData["originalMaterialName_"+i]??c,null!=s&&s.set(e.id+"#"+i,l))}}else if("color"in e.material){const i=e.material,n=Wa(i),o=i.name;if(Ra(i,t,e.userData.originalColor,e.userData.originalMaterialName)){const i=Ga(await a(t.materialId),r.textureFlipY),l=e.material;null!=i&&(e.material=i,e.userData.originalColor=e.userData.originalColor??n,e.userData.originalMaterialName=e.userData.originalMaterialName??o,null!=s&&(s.has(e.id)||s.set(e.id,l)))}}}))}const _a=new WeakMap;export function getConvertedFbxToGlbAssignedMaterialTextureFlipY(e){const t=e?.mesh?.uvConversion;return"fbx2gltf"===t?.source?!0!==t.flipV&&void 0:!function(e){return"glb"===e?.fileFormat&&!0===e.originalFileKey?.toLowerCase().endsWith(".fbx")}(e)&&void 0}function Ga(e,t){if(null==e||null==t||!function(e,t){return function(e){const t=[];for(const[a,s]of Object.entries(e))Ja(a,s)&&t.push(s);if(e instanceof i.ShaderMaterial)for(const[a,s]of Object.entries(e.uniforms))Ja(a,s.value)&&t.push(s.value);return t}(e).some(e=>e.flipY!==t)}(e,t))return e;let a=_a.get(e);null==a&&(a=new Map,_a.set(e,a));const s=a.get(t);if(null!=s)return s;const r=La(e);if(function(e,t){for(const a of Object.keys(e)){const s=e[a];Ja(a,s)&&(e[a]=qa(s,t))}}(r,t),r instanceof i.ShaderMaterial){for(const[e,a]of Object.entries(r.uniforms))Ja(e,a.value)&&(a.value=qa(a.value,t));r.uniformsNeedUpdate=!0}return r.needsUpdate=!0,a.set(t,r),r}function La(e){const t=e.clone();return t.userData={...e.userData??{}},t}function Ja(e,t){const a=t;return(t instanceof x||!0===a?.isTexture)&&!e.toLowerCase().includes("envmap")&&!0!==a.isCompressedTexture&&!0!==a.isCompressedArrayTexture}function qa(e,t){if(e.flipY===t)return e;const a=e.clone();return a.flipY=t,a.userData={...e.userData??{}},a.needsUpdate=!0,a}function Ya(e,t){if(e instanceof i.ShaderMaterial&&t instanceof i.ShaderMaterial){return e.fragmentShader+e.vertexShader==t.fragmentShader+t.vertexShader&&function(e,t){if(e instanceof i.ShaderMaterial&&t instanceof i.ShaderMaterial){for(const a in e.uniforms){if(null==t.uniforms[a])return!1;if(t.uniforms[a].value!==e.uniforms[a].value)return!1}return!0}return!1}(e,t)}return!1}function Qa(e){if(null!=e){for(let t=0;t<e.array.length;t++)e.setX(t,0);e.needsUpdate=!0}}function Ha(e,t){const a=et(e);return null==a?"":function(e,t){const a=Ps(e,t),s=a.sort().map(t=>{const a=e.getAttribute(t);if(null!=a){const e=a.array??a.data?.array,s=e?.constructor?.name??"";return`${t}:${a.itemSize}:${a.normalized?1:0}:${s}`}const s=function(e,t){if("uv"===t&&es(e))return{itemSize:2,normalized:!1,arrayType:"Float32Array"};throw new Error(`Unsupported synthetic batching geometry attribute: ${t}`)}(e,t);return`${t}:${s.itemSize}:${s.normalized?1:0}:${s.arrayType}`}).join(",");return`${null!=e.index?"indexed":"nonindexed"}|${s}`}(a.geometry,t)}function Za(e,t){const a=Ps(e,t);if(a.length===Object.keys(e.attributes).length)return e;const s=new o;s.name=e.name;const r=e.getIndex();null!=r&&s.setIndex(r);for(const t of a)s.setAttribute(t,Ka(e,t));for(const t of e.groups)s.addGroup(t.start,t.count,t.materialIndex);return s.setDrawRange(e.drawRange.start,e.drawRange.count),null!=e.boundingBox&&(s.boundingBox=e.boundingBox.clone()),null!=e.boundingSphere&&(s.boundingSphere=e.boundingSphere.clone()),s.userData=e.userData,s}const Xa=new WeakMap;function Ka(e,t){return e.getAttribute(t)??function(e,t){if("uv"===t)return function(e){let t=Xa.get(e);const a=e.getAttribute("position");if(null==a)throw new Error("Can not create synthetic batching UVs without a position attribute");null!=t&&t.count===a.count||(t=new i.Float32BufferAttribute(new Float32Array(2*a.count),2),Xa.set(e,t));return t}(e);throw new Error(`Unsupported synthetic batching geometry attribute: ${t}`)}(e,t)}function es(e){return null!=e.getAttribute("position")}const ts=new WeakMap,as="hbat_",ss=new Set(["ambientLightColor","cameraNear","directionalLightShadows","directionalLights","directionalShadowMap","directionalShadowMatrix","fogColor","fogDensity","fogFar","fogNear","hemisphereLights","lightProbe","ltc_1","ltc_2","pointLightShadows","pointLights","pointShadowMap","pointShadowMatrix","receiveShadow","rectAreaLights","shadowFar","spotLightMap","spotLightMatrix","spotLightShadows","spotLights","spotShadowMap"]);function rs(e){let t=ts.get(e);return null==t&&(t=function(e){let t=e.type;if(e instanceof R)t+=function(e){let t="nodeShader";t+=function(e){if(null==e)return"";let t="";for(const a of Object.keys(e).sort())t+=`${a}:${String(e[a])};`;return t}(e.defines),t+=e.lights?"lights":"",t+=e.fog?"fog":"";for(const a of Object.keys(e.uniforms).sort()){if(os(a))continue;const s=e.uniforms[a]?.value;cs(s)||(t+=`u:${a}:${ms(s)};`)}return t+=ns(e.vertexShader),t+=ns(e.fragmentShader),t}(e);else if(e instanceof i.MeshStandardMaterial&&!(e instanceof i.MeshPhysicalMaterial)||(t+=e.id+""),(e instanceof i.MeshBasicMaterial||e instanceof i.MeshLambertMaterial||e instanceof w||e instanceof y)&&(null!=e.map&&(t+="c"+e.map?.id),null!=e.aoMap&&(t+="o"+e.aoMap?.id),null!=e.lightMap&&(t+="l"+e.lightMap?.id),null!=e.envMap&&(t+="v"+e.envMap?.id),null!=e.alphaMap&&(t+="a"+e.alphaMap?.id)),e instanceof w&&(null!=e.normalMap&&(t+="n"+e.normalMap?.id),null!=e.roughnessMap&&(t+="r"+e.roughnessMap?.id),null!=e.metalnessMap&&(t+="m"+e.metalnessMap?.id),null!=e.emissiveMap&&(t+="e"+e.emissiveMap?.id)),e instanceof i.MeshPhysicalMaterial&&(null!=e.sheenColorMap&&(t+="sc"+e.sheenColorMap?.id),null!=e.sheenRoughnessMap&&(t+="sr"+e.sheenRoughnessMap?.id)),(e instanceof g||e instanceof y)&&null!=e.specularMap&&(t+="s"+e.specularMap?.id),e instanceof i.MeshToonMaterial&&(null!=e.map&&(t+="c"+e.map?.id),null!=e.aoMap&&(t+="o"+e.aoMap?.id),null!=e.lightMap&&(t+="l"+e.lightMap?.id),null!=e.alphaMap&&(t+="a"+e.alphaMap?.id)),e instanceof _t&&null!=e.heightMap&&(t+="h"+e.heightMap?.id),e instanceof i.ShaderMaterial){t+=e.vertexShader,t+=e.fragmentShader;for(const a in e.uniforms){const s=e.uniforms[a];s&&s.value&&s.value.isTexture&&null!=s.value.id&&(t+="t:"+a+":"+s.value.id)}}null!=e.userData.outlineParameters&&(t+=e.userData.outlineParameters.color,t+=e.userData.outlineParameters.thickness,t+=e.userData.outlineParameters.alpha,t+=e.userData.outlineParameters.colorMode,t+=e.userData.outlineParameters.darkening);return t+=`side:${e.side};shadowSide:${e.shadowSide??"auto"};`,t+=e.transparent?"t":"",t+=e.vertexColors?"vc":"",t+=e.depthWrite?"dw":"",t+=e.depthTest?"dt":"",t+=`alphaTest:${e.alphaTest>0};`,t}(e),ts.set(e,t)),t}const is=new Map;function ns(e){return is.has(e)||is.set(e,`shader_${is.size}`),is.get(e)}function os(e){return ss.has(e)||e.startsWith("hology_")}function ls(e,t){return e instanceof R?e.uniforms[t]?.value:e[t]}function cs(e){return"number"==typeof e||e instanceof j||e instanceof P||e instanceof D||e instanceof l}function us(e){return"number"==typeof e?1:e instanceof j?2:4}function ds(e,t){const a=e.replace(/[^A-Za-z0-9_]/g,"_");let s=as+a;for(;t.has(s);)s=as+s;return t.add(s),s}function ps(e,t){const a={};for(const[s,r]of Object.entries(e.uniforms))t.has(s)||(a[s]={value:r.value});return a}const hs=new WeakMap;let fs=1;function ms(e){if(null==e)return"null";if(e instanceof x||!0===e?.isTexture)return`texture:${e.id}`;if(e instanceof i.Matrix3||e instanceof i.Matrix4)return e.toArray().join(",");if("boolean"==typeof e||"number"==typeof e||"string"==typeof e)return String(e);if(Array.isArray(e)&&e.every(e=>null==e||["boolean","number","string"].includes(typeof e)))return JSON.stringify(e);if("object"==typeof e){let t=hs.get(e);return null==t&&(t=fs++,hs.set(e,t)),`object:${t}`}return String(e)}function gs(e,t){if(null==e)return null;if(!(e instanceof t))throw new Error(`Value is not an instance of ${t.name}`);return e}const ys=new f,ws=new c;function Ss(e,t){return ws.copy(e),ws.x*=-1,ws.y*=-1,ws.z*=-1,t.isCubeTexture&&!1===t.isRenderTargetTexture&&(ws.y*=-1,ws.z*=-1),(new i.Matrix3).setFromMatrix4(ys.makeRotationFromEuler(ws))}function bs(e,t){switch(t){case 0:return e.x;case 1:return e.y;case 2:return e.z;case 3:return e.w}}const vs=new D;function Ms(e,t){return e===t||null==e==(null==t)&&("number"==typeof e&&"number"==typeof t?e===t||isNaN(e)&&isNaN(t):e instanceof i.Color&&t instanceof i.Color?e.r===t.r&&e.g===t.g&&e.b===t.b:e instanceof j&&t instanceof j?e.x===t.x&&e.y===t.y:e instanceof P&&t instanceof P?e.x===t.x&&e.y===t.y&&e.z===t.z:e instanceof D&&t instanceof D&&(e.x===t.x&&e.y===t.y&&e.z===t.z&&e.w===t.w))}function As(e){const t=[];for(const[a,s]of Object.entries(e))s instanceof fe?t.push(s):s instanceof ve&&t.push(...As(s));return t}function xs(e,t){const a=e=>{const s=e.output;switch(s.type){case"sprite":case"stretchedSprite":t.add(s.texture);break;case"trail":null!=s.texture&&t.add(s.texture);break;case"decal":t.add(s.colorMap),t.add(s.alphaMap)}e.children?.forEach(a)};e.vfx.emitters.forEach(a)}const js=new WeakMap;function Ps(e,t){const a=Object.keys(e.attributes).filter(a=>Ds(e,t,a));return!e.hasAttribute("uv")&&es(e)&&Ds(e,t,"uv")&&a.push("uv"),a}function Ds(e,t,a){return"position"===a||("uv"===a?function(e){if(e instanceof R)return Os(e,"uv");if(e instanceof i.ShaderMaterial)return Es(e.vertexShader,"uv");if(e instanceof _t&&null!=e.heightMap)return!0;return Is.some(t=>e[t]?.isTexture)}(t):t instanceof R?Os(t,a):t instanceof i.ShaderMaterial?function(e,t){if("uv1"===t||"uv2"===t||"uv3"===t)return Es(e.vertexShader,t);return!0}(t,a):"uv1"!==a&&(("color"!==a||!function(e){let t=js.get(e);if(null!=t)return t;const a=e.getAttribute("color");if(null==a)t=!1;else{t=!0;for(let e=0;e<a.count;e++){for(let s=0;s<3;s++)if(1!==a.getComponent(e,s)){t=!1;break}if(!t)break}}return js.set(e,t),t}(e))&&("uv2"!==a||(null!=t.lightMap||null!=t.aoMap))))}const Is=["map","alphaMap","emissiveMap","normalMap","bumpMap","displacementMap","roughnessMap","metalnessMap","aoMap","specularMap","gradientMap","clearcoatMap","clearcoatNormalMap","clearcoatRoughnessMap","iridescenceMap","iridescenceThicknessMap","sheenColorMap","sheenRoughnessMap","transmissionMap","thicknessMap","anisotropyMap"];function Os(e,t){return Es(e.vertexShader,t)}function Es(e,t){return new RegExp(`(^|[^A-Za-z0-9_])${a=t,a.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}([^A-Za-z0-9_]|$)`).test(e);var a}function Cs(e,t,a){if(t(e))return e;for(const s of e.children??[]){const e=Cs(s,t,a);if(null!=e)return e}if(null!=a&&"prefab"===e.type){const s=a.get(e.assetId);if(null!=s){const e=s.prefab.objects.find(e=>Cs(e,t,a));if(null!=e)return e}}return null}const ks=new P,Ts=new P,Vs=new P,zs=new D,Ns=new D,Us=new f,Bs=new f,$s=new S;function Fs(e){e.updateWorldMatrix(!0,!1);const t=e.geometry.clone(),a=t.getAttribute("position"),s=t.getAttribute("normal"),r=t.getAttribute("tangent");if(null!=a){for(let t=0;t<a.count;t++)ks.fromBufferAttribute(a,t),e.applyBoneTransform(t,ks),a.setXYZ(t,ks.x,ks.y,ks.z);a.needsUpdate=!0}if(null!=s||null!=r){const a=t.getAttribute("skinIndex"),i=t.getAttribute("skinWeight");if(null!=a&&null!=i){for(let t=0;t<a.count;t++)Ws(e,t,Bs),null!=s&&(Ts.fromBufferAttribute(s,t),$s.getNormalMatrix(Bs),Ts.applyMatrix3($s).normalize(),s.setXYZ(t,Ts.x,Ts.y,Ts.z)),null!=r&&(Vs.fromBufferAttribute(r,t),Vs.transformDirection(Bs),r.setXYZ(t,Vs.x,Vs.y,Vs.z));null!=s&&(s.needsUpdate=!0),null!=r&&(r.needsUpdate=!0)}}t.deleteAttribute("skinIndex"),t.deleteAttribute("skinWeight"),t.computeBoundingBox(),t.computeBoundingSphere();const i=new m(t,e.material);return i.copy(e,!1),i.geometry=t,i.material=e.material,i.userData={...e.userData},i}function Ws(e,t,a){const s=e.geometry,r=s.getAttribute("skinIndex"),i=s.getAttribute("skinWeight"),n=e.skeleton;zs.fromBufferAttribute(r,t),Ns.fromBufferAttribute(i,t),a.identity().multiplyScalar(0);for(let e=0;e<4;e++){const t=Ns.getComponent(e);if(0===t)continue;const s=zs.getComponent(e);Us.multiplyMatrices(n.bones[s].matrixWorld,n.boneInverses[s]);for(let e=0;e<16;e++)a.elements[e]+=Us.elements[e]*t}return a.premultiply(e.bindMatrixInverse).multiply(e.bindMatrix),a}function Rs(e){let t=!0;return e.traverse(a=>{a===e||a.isBone||(t=!1)}),t}function _s(e,t){let a=t??!1,s=!0;for(const t of e)if(!1!==t.castShadow){s=!1;break}for(const t of e)if(!0===t.castShadow)return!0;return a&&!s}function Gs(e,t){let a=t??!1,s=!0;for(const t of e)if(!1!==t.receiveShadow){s=!1;break}if(s)return!1;for(const t of e)if(!0===t.receiveShadow)return!0;return a&&!s}/*
|
|
1
|
+
import{__decorate as e,__metadata as t}from"tslib";import{ConvexPolyhedronCollisionShape as a,SpriteShader as s}from"@hology/core";import{Subject as r}from"rxjs";import*as i from"three";import{BoxGeometry as n,BufferGeometry as o,Color as l,Euler as c,Fog as u,FogExp2 as d,Group as p,Material as h,Matrix4 as f,Mesh as m,MeshLambertMaterial as g,MeshPhongMaterial as y,MeshStandardMaterial as w,Matrix3 as S,Object3D as b,PointLight as v,Quaternion as M,Scene as A,Texture as x,Vector2 as j,Vector3 as D,Vector4 as P}from"three";import{attributes as I,batchingUniformFloat as O,batchingUniformVec2 as E,batchingUniformVec3 as C,batchingUniformVec4 as k,bool as T,BooleanExpression as V,BooleanNode as z,colorToNormal as N,float as U,deriveNodeShaderMaterial as B,FloatNode as $,ifDefApply as F,mix as W,NodeShaderMaterial as R,rgb as _,rgba as L,RgbNode as G,select as J,standardMaterial as q,Texture2dLookupNode as Y,textureSampler2d as Q,textureSampler2dArray as H,UniformBoolNode as Z,UniformFloatNode as X,UniformSampler2dArraySlice as K,UniformVec2Node as ee,UniformVec3Node as te,UniformVec4Node as ae,varying as se,varyingAttributes as re,varyingTransformed as ie,vec2 as ne,Vec2Node as oe,vec3 as le,Vec3Node as ce,vec4 as ue,Vec4Node as de}from"three-shader-graph";import{Service as pe}from"typedi";import{VfxActor as he}from"../effects/vfx/vfx-actor.js";import{VisualEffect as fe}from"../effects/vfx/vfx-param.js";import{Prefab as me,PrefabOf as ge}from"./objects/prefab.js";import{DataAssetRef as ye}from"./objects/data-asset.js";import{$actorOptions as we,BaseActor as Se}from"../gameplay/actors/actor.js";import be from"../gameplay/actors/builtin/index.js";import{ActorComponent as ve}from"../gameplay/actors/component.js";import{PhysicsBodyType as Me}from"../gameplay/services/physics/physics-system.js";import{NetMode as Ae}from"../gameplay/net/net-session.js";import{NetRole as xe}from"../gameplay/net/service/net-actor-role.js";import{ThreeBlendingMode as je}from"../effects/vfx/vfx-asset.js";import{withInjectionContext as De}from"../gameplay/inject.js";import{RenderingView as Pe}from"../rendering.js";import{markMaterialUniformValuesNeedUpdate as Ie,setMaterialUniformValuesAutoUpdate as Oe}from"../rendering/node-material-webgpu-resolver.js";import{curveSampler as Ee,oneMinus as Ce,particleUniforms as ke,Sampler2DNode as Te}from"../shader-nodes/index.js";import{LambertShader as Ve}from"../shader/builtin/lambert-shader.js";import{LandscapeCompositeShader as ze}from"../shader/builtin/landscape-composite-shader.js";import{LandscapeShader as Ne}from"../shader/builtin/landscape-shader.js";import{StandardShader as Ue}from"../shader/builtin/standard-shader.js";import{UnlitShader as Be}from"../shader/builtin/unlit-shader.js";import{extractShaderParameters as $e,getDataAssetDefinitionType as Fe,getParameterDefinitionId as We,getParameterDefinitionType as Re,isDataAssetDefinitionAbstract as _e,isParameterDefinitionAbstract as Le,isParameterDefinitionAssignableTo as Ge,isParameterDefinitionStructAssignableTo as Je,shaderParameterUniformName as qe}from"../shader/parameter.js";import{ArrayMap as Ye,DefaultMap as Qe,groupBy as He}from"../utils/collections.js";import{iterateMaterials as Ze}from"../utils/materials.js";import{filterChildrenShallow as Xe,filterSceneShallow as Ke,findFirstVisibleMesh as et,findFirstVisibleObject as tt,traverseAsync as at}from"../utils/three/traverse.js";import{AssetMeshInstance as st,AssetResourceLoader as rt}from"./asset-resource-loader.js";import{AssetsProvider as it}from"./assets-provider.js";import{isCollisionMesh as nt}from"./collision/collision-shape-import.js";import{BoxCollisionShape as ot,PhysicalShapeMesh as lt}from"./collision/collision-shape.js";import{LandscapeManager as ct}from"./landscape/landscape-manager.js";import{initLandscape as ut}from"./landscape/landscape.js";import{SectionGrid as dt,smoothNormalsCrossMeshes as pt}from"./landscape/utils.js";import{createGrassFoliageMaterial as ht}from"./materials/grass-foliage.js";import{createGrassMaterial as ft}from"./materials/grass.js";import{getMaterialAttribute as mt}from"./materials/utils/material-painting.js";import{PaintedScatterManager as gt}from"./scatter/painted-scatter-manager.js";import{SurfaceScatterManager as yt}from"./scatter/surface-scatter-manager.js";import{createWaterMaterial as wt}from"./materials/water.js";import{SerializedParamType as St}from"./model.js";import{applyRuntimeParamTypeInference as bt,convertConfiguredParamsToRuntimeTypes as vt,convertConfiguredParamValueToRuntimeType as Mt,inferRuntimeSerializedParamTypeHint as At}from"./custom-param-runtime-types.js";import{ShapeLibrary as xt,ShapeLibraryKeys as jt}from"./objects/shapes.js";import{ambientLightName as Dt,createSky as Pt,defaultSkyMaterial as It}from"./sky.js";import{Curve2 as Ot}from"../utils/curve.js";import{DecalUnlitShader as Et}from"../shader/builtin/decal-unlit-shader.js";import{DecalStandardShader as Ct}from"../shader/builtin/decal-standard-shader.js";import{ClusterGenerator as kt}from"../rendering/cluster-generator.js";import{ColorLayer as Tt,defaultValueColorLayer as Vt,defaultValueMaskLayer as zt,MaskLayer as Nt}from"../shader/color-layer.js";import{LayeredShader as Ut}from"../shader/builtin/layered-shader.js";import{isColorLayerSerialized as Bt}from"../shader/color-layer.js";import{FogVolume as $t}from"../rendering/fog/fog-volume-actor.js";import{UnscaledSprite as Ft}from"../utils/three/unscaled-sprite.js";import{ToonShader as Wt}from"../shader/builtin/toon-shader.js";import{BatchedMesh2 as Rt}from"./batched-mesh-2.js";import{ParallaxStandardMaterial as _t}from"../shader/builtin/standard-shader.js";import{parallaxOcclusionMapping as Lt}from"../shader-nodes/pom.js";import{traverseVisibleEvery as Gt}from"../utils/three/traverse.js";import{BufferGeometryUtils as Jt,RectAreaLightHelper as qt}from"three/examples/jsm/Addons.js";import{createSequenceData as Yt,isSequenceData as Qt,Sequence as Ht}from"../effects/sequence/sequence-data.js";import{applyUvTiling as Zt}from"./../shader/uv-nodes.js";import{buildShaderGraphMaterial as Xt,shaderGraphMaterialSideToThree as Kt}from"../shader/graph/index.js";import{hasExecutableEventGraphDocument as ea}from"../gameplay/event-graph/model.js";import{depthUniformName as ta}from"../shader-nodes/depth.js";export{bt as applyRuntimeParamTypeInference,vt as convertConfiguredParamsToRuntimeTypes,Mt as convertConfiguredParamValueToRuntimeType,At as inferRuntimeSerializedParamTypeHint};const aa={},sa=/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent),ra=/^((?!chrome|android).)*safari/i.test(navigator.userAgent)||(navigator.userAgent.includes("iPhone")||navigator.userAgent.includes("iPad"))&&!!navigator.userAgent.match(/AppleWebKit/)&&!navigator.userAgent.match(/CriOS/);export const shapeDefaultColor="#aaaaaa";export class SceneMaterializerLoader{constructor(e,t,a){this.dataProvider=e,this.assetsService=t,this.assetManagerService=a}get(e,t){return new ia(e,this.dataProvider,this.assetsService,this.assetManagerService,t,[],[],{create:()=>null,initActor:async()=>{}})}}let ia=class{get prefabEventGraphInstances(){return[...this.materializedPrefabEventGraphs.values()]}resolveSceneActor(e){const t=this.prefabInstanceExposedActorMap.get(e)??e;return this.materializedActors.get(t)}constructor(e,t,a,s,n,o,l,c,u=[]){this.scene=e,this.dataProvider=t,this.assetsService=a,this.assetManagerService=s,this.renderingView=n,this.shaders=o,this.actorTypes=l,this.actorProvider=c,this.componentTypes=u,this.objectMap=new Map,this.sceneObjectMap=new Map,this.components=[],this.landscapeManagers=[],this.materializedActors=new Map,this.idToSceneObject=new Map,this.inEditor=!0,this.netMode=Ae.none,this.updated$=new r,this.removed$=new r,this.prefabEventGraphAdded$=new r,this.prefabEventGraphRemoved$=new r,this.error$=new r,this.materializedPrefabEventGraphs=new Map,this.announcedPrefabEventGraphs=new Set,this.editorActorParamSnapshot=new Map,this.editorAttachedActorComponents=new WeakMap,this.livePrefabInstances=new Map,this.assets=new Map,this._canBeInstancedCache=new Map,this.editorStaticDrawChunks=[],this.editorStaticChunkBySource=new WeakMap,this.editorStaticSnapshotBySource=new WeakMap,this.dirtyEditorStaticDrawChunks=new Set,this.editorStaticEditingObjects=new Set,this.editorMatrixWorldEditingObjects=new Set,this.editorStaticSelectedObjects=new Set,this.editorStaticDrawSetSuspended=!1,this.editorStaticDrawSetRebuildQueued=!1,this.editorStaticFullRebuildQueued=!1,this._editorStaticDrawSetsEnabled=!0,this.editorStaticInitialized=!1,this.editorStaticDisposed=!1,this.editorStaticObjectsToRebuild=new Map,this.editorStaticDrawSetUpdated$=new r,this._originalMaterials=new Map,this.worldEnvironmentRequest=0,this.prefabInstanceChain=[],this.prefabInstanceExposedActorMap=new Map,this.geometryCache=new Map,this.collisionShapeCache=new Map,this.assetManagerService.materialProvider=async e=>materialFromAsset(this.assets.get(e)??await this.assetsService.getAsset(e),this.renderingView,this.assetsService,this.assetManagerService,this.shaders),this.originalFog=null,t.onCreate(e=>{this.update(e).finally(()=>this.scheduleEditorStaticDrawSetRebuild()),this.handlePaintedScatterSceneMutation(e),this.handleSurfaceScatterSceneMutation(e)}),t.onUpdate(e=>{this.prepareEditorStaticObjectForMutation(e),this.update(e).finally(()=>this.scheduleEditorStaticDrawSetRebuild(e)),this.handlePaintedScatterSceneMutation(e),this.handleSurfaceScatterSceneMutation(e)}),t.onRemove(e=>{this.prepareEditorStaticObjectForMutation(e),this.remove(e),this.scheduleEditorStaticDrawSetRebuild(),this.handlePaintedScatterSceneMutation(e),this.handleSurfaceScatterSceneMutation(e)}),this.createAssetSubscription=a.onCreate.subscribe(e=>{this.assets.set(e.id,e)}),this.updateSubscription=a.onUpdate.subscribe(async t=>{const a=this.assets.get(t.id);if(this.assets.set(t.id,t),"material"==t.type){const a=[];e.traverse(e=>{if(e instanceof i.Mesh)if(Array.isArray(e.material))for(let s=0;s<e.material.length;s++)a.push(this.refreshMaterial(e,e.material[s],t,s));else a.push(this.refreshMaterial(e,e.material,t))}),await Promise.all(a)}else if("mesh"==t.type){this.findByAssetId(t.id).forEach(async e=>{this.remove(e.userData.src);const t=await this.materializeAndInitActor(e.userData.src);this.updated$.next({object:t,source:e.userData.src}),this.scheduleEditorStaticDrawSetRebuild()});for(const e of this.assets.values())if("prefab"==e.type){if(!e.prefab.objects.some(e=>Cs(e,e=>e.assetId==t.id,this.assets)))continue;this.findByAssetId(e.id).forEach(e=>{this.remove(e.userData.src),this.materializeAndInitActor(e.userData.src).finally(()=>this.scheduleEditorStaticDrawSetRebuild())})}this.landscapeManagers.forEach(e=>{const a=e.source?.grass?.layers?.some(e=>e.meshes.some(e=>e.assetId===t.id));a&&e.queueRefreshScatter(this.renderingView?.camera.position??new D,!0)}),null!=this.surfaceScatterManager&&(this.surfaceScatterManager.usesSourceAsset(t.id)||this.surfaceScatterManager.usesScatterAsset(t.id))&&this.surfaceScatterManager.queueRefresh(!0),this.paintedScatterManager?.usesScatterAsset(t.id)&&this.paintedScatterManager.queueRefresh(!0)}else if("prefab"===t.type){if("prefab"===a?.type&&await this.applyLivePrefabParameterUpdate(a,t))return;if(!this.inEditor)return void console.warn(`Prefab ${t.name??t.id} changed in a way that cannot be applied to its running instances. Respawn or restart to use the saved data.`);this.findByAssetId(t.id).forEach(e=>{const t=e.userData.src;this.remove(t),this.materializeAndInitActor(t).finally(()=>this.scheduleEditorStaticDrawSetRebuild())}),(this.surfaceScatterManager?.usesPrefabAsset(t.id)||this.sceneReferencesPrefabAsset(t.id)&&await this.prefabAssetContainsSurfaceScatter(t))&&await this.refreshSurfaceScatterPresence(!0),(this.paintedScatterManager?.usesPrefabAsset(t.id)||this.sceneReferencesPrefabAsset(t.id)&&await this.prefabAssetContainsPaintedScatter(t))&&await this.refreshPaintedScatterPresence(!0)}else if("vfx"===t.type)for(const e of this.dataProvider.getObjects())await Da(e,async e=>{"vfx"===e.type&&e.assetId===t.id&&(this.remove(e),await this.materializeAndInitActor(e))});else if("texture"===t.type)await this.refreshMaterialTextures(t);else if("shaderGraph"===t.type){this.scene.traverse(e=>{if(e instanceof m)if(Array.isArray(e.material))for(let a=0;a<e.material.length;a++)this.refreshMaterial(e,e.material[a],t,a);else this.refreshMaterial(e,e.material,t)});for(const e of this.dataProvider.getObjects())await Da(e,async e=>{if("vfx"===e.type&&null!=e.assetId){const a=this.assets.get(e.assetId);null!=a&&this.vfxAssetUsesShaderGraph(a,t.id)&&(this.remove(e),await this.materializeAndInitActor(e))}})}this.scheduleEditorStaticDrawSetRebuild()})}async refreshMaterialTextures(e){if("texture"!==e.type)return void console.error("Can not refresh material textures. Asset is not a texture",e);const t=new Set,a=new Set,s=[],r=s=>{t.has(s)||(t.add(s),this.materialUsesTexture(s,e.id)&&a.add(s))};if(this.scene.traverse(t=>{t instanceof i.SpotLight&&"spot"===t.userData?.src?.light?.type&&t.userData.src.light.spot.mapTextureId===e.id&&s.push(t),t instanceof m&&(Array.isArray(t.material)?t.material.forEach(r):r(t.material))}),0===a.size&&0===s.length)return;const n=await this.assetManagerService.getTexture(e);if(null!=n){for(const t of a)this.replaceMaterialTextureReferences(t,e.id,n);for(const e of s)e.map=n}else console.error("Can not refresh material textures. Texture not found",e)}materialUsesTexture(e,t){if(e instanceof i.ShaderMaterial){for(const a of Object.values(e.uniforms))if(a.value instanceof i.Texture&&a.value.userData.assetId===t)return!0}else for(const a of Object.values(e))if(a instanceof i.Texture&&a.userData.assetId===t)return!0;return!1}replaceMaterialTextureReferences(e,t,a){let s=!1;if(e instanceof i.ShaderMaterial)for(const[r,n]of Object.entries(e.uniforms))n.value instanceof i.Texture&&n.value.userData.assetId===t&&(e.uniforms[r].value=a,s=!0);else for(const[r,n]of Object.entries(e))n instanceof i.Texture&&n.userData.assetId===t&&(e[r]=a,s=!0);s&&(e.needsUpdate=!0,Ie(e))}async getAsset(e){let t=this.assets.get(e);return null==t&&(t=await this.assetsService.getAsset(e),null!=t&&this.assets.set(e,t)),t}async refreshMaterial(e,t,a,s){const r=t?.userData?.assetId;if(r!==a.id){const e=this.assets.get(r);let t=!1;if(null!=e&&("shaderGraph"===a.type&&"asset"===e.material?.shaderGraph?.source&&e.material.shaderGraph.assetId===a.id&&(t=!0),!t&&null!=e.material?.shaderParams))for(const s of Object.values(e.material.shaderParams)){if(s.type===St.Material&&s.value===a.id){t=!0;break}if(s.type===St.Array&&"element"in s&&s.element===St.Material&&s.value.includes(a.id)){t=!0;break}}if(!t)return}const i=await materialFromAsset(this.assets.get(r),this.renderingView,this.assetsService,this.assetManagerService,this.shaders,!1),n=i.userData,o=t.userData.receiveDecals!==n.receiveDecals;i.userData=t.userData,i.userData.hasBloom=n.hasBloom,i.userData.reflective=n.reflective,i.userData.outlineParameters=n.outlineParameters,i.userData.receiveDecals=n.receiveDecals,o&&(t.needsUpdate=!0),null!=s?Ya(e.material[s],i)||(e.material[s]=i):Ya(e.material,i)||(e.material=i,e===this.sky&&this.applySkySettings(e.material))}vfxAssetUsesShaderGraph(e,t){return null!=e.vfx&&e.vfx.emitters.some(e=>this.emitterUsesShaderGraph(e,t))}emitterUsesShaderGraph(e,t){const a=e.output;return"shaderGraph"===a.materialSource&&"asset"===a.shaderGraph?.source&&a.shaderGraph.assetId===t||!!e.children&&e.children.some(e=>this.emitterUsesShaderGraph(e,t))}getTopLevelActors(){return Array.from(this.materializedActors.entries()).filter(([e,t])=>!e.includes("/")).map(([,e])=>e)}get actorInstances(){return Array.from(this.materializedActors.values())}async initTextures(){const e=new Set,t=[];if(await Promise.all(this.collectMaterialAssignments(this.dataProvider.getObjects()).map(async a=>{const s=this.assets.get(a.materialId);if(null!=s?.material)for(const a of Object.values(s.material.shaderParams??{}))if(a.type===St.Texture&&"string"==typeof a.value){const s=this.assets.get(a.value);if(null==s)continue;if(null!=s.texture?.textureArrayFileKey){if(!e.has(s.texture?.textureArrayFileKey)){const a=await this.assetManagerService.getTextureArray(s);null!=a?.texture&&(t.push(a.texture),e.add(s.texture.textureArrayFileKey))}}else{const e=await this.assetManagerService.getTexture(s);null!=e&&t.push(e)}}})),0!==t.length&&this.renderingView&&"webgpu-experimental"!==this.renderingView.options.backend){console.log(`Initializing ${t.length} textures`),console.time("Init textures");for(const e of t)this.renderingView.renderer.initTexture(e);console.timeEnd("Init textures")}}async prefetchAssets(){const e=this.collectAssetMeshIds(this.dataProvider.getObjects());await Promise.all(Array.from(e).map(async e=>{const t=this.assets.get(e);if("mesh"===t?.type)return this.assetManagerService.getMesh(t,{mergeGeomtries:!0})})),this.initTextures()}collectAssetMeshIds(e,t=[],a=new Set){for(const s of e??[])this.collectObjectAssetMeshIds(s,t,a);return a}collectObjectAssetMeshIds(e,t,a){if(this.shouldBeMaterialized(e)&&("asset_mesh"===e.type&&null!=e.assetId&&a.add(e.assetId),null!=e.children&&this.collectAssetMeshIds(e.children,t,a),"prefab"===e.type&&null!=e.assetId&&!t.includes(e.assetId))){const s=this.assets.get(e.assetId);null!=s?.prefab?.objects&&this.collectAssetMeshIds(s.prefab.objects,[...t,e.assetId],a)}}collectMaterialAssignments(e,t=[],a=[]){for(const s of e??[])this.collectObjectMaterialAssignments(s,t,a);return a}collectObjectMaterialAssignments(e,t,a){if(this.shouldBeMaterialized(e)&&("shape_mesh"!==e.type&&"asset_mesh"!==e.type||null==e.materialAssignments||a.push(...e.materialAssignments),null!=e.children&&this.collectMaterialAssignments(e.children,t,a),"prefab"===e.type&&null!=e.assetId&&!t.includes(e.assetId))){const s=this.assets.get(e.assetId);null!=s?.prefab?.objects&&this.collectMaterialAssignments(s.prefab.objects,[...t,e.assetId],a)}}async init(){await this.preInit(),oa.clear(),la.clear(),await this.prefetchAssets(),await Promise.all(this.dataProvider.getObjects().map(e=>this.materialize(e))),await this.initActorsPostInit(),this.generateOcclusionClusters(),this.announcePrefabEventGraphs(),await this.refreshPaintedScatterPresence(!0),await this.refreshSurfaceScatterPresence(!0),this.editorStaticInitialized=!0,this.rebuildEditorStaticDrawSet()}get editorStaticDrawSetsEnabled(){return this._editorStaticDrawSetsEnabled}set editorStaticDrawSetsEnabled(e){this._editorStaticDrawSetsEnabled!==e&&(this._editorStaticDrawSetsEnabled=e,this.editorStaticInitialized&&!this.editorStaticDisposed&&(e?this.rebuildEditorStaticDrawSet():(this.editorStaticDrawSetSuspended=!1,this.editorStaticEditingObjects.clear(),this.editorStaticFullRebuildQueued=!1,this.editorStaticObjectsToRebuild.clear(),this.disposeEditorStaticDrawSet(),this.editorStaticDrawSetUpdated$.next())))}beginEditorStaticSceneEdit(e=[]){for(const e of this.editorMatrixWorldEditingObjects)wa(e,!1);this.editorMatrixWorldEditingObjects.clear();for(const t of e)this.editorMatrixWorldEditingObjects.add(t),wa(t,!0);if(!this._editorStaticDrawSetsEnabled||!this.inEditor||this.editorStaticDrawSetSuspended)return;this.editorStaticDrawSetSuspended=!0,this.editorStaticEditingObjects.clear();const t=new Set;for(const a of e){this.editorStaticEditingObjects.add(a);const e=this.editorStaticChunkBySource.get(a);null!=e&&t.add(e)}for(const e of t)this.disposeEditorStaticDrawChunk(e),this.dirtyEditorStaticDrawChunks.add(e),this.buildEditorStaticDrawChunk(e);this.editorStaticDrawSetUpdated$.next()}setEditorStaticSelectedObjects(e){if(!this.inEditor)return;const t=new Set(e),a=new Set;for(const e of this.editorStaticSelectedObjects)if(!t.has(e)){const t=this.editorStaticChunkBySource.get(e);null!=t&&a.add(t)}for(const e of t)if(!this.editorStaticSelectedObjects.has(e)){const t=this.editorStaticChunkBySource.get(e);null!=t&&a.add(t)}this.editorStaticSelectedObjects.clear();for(const e of t)this.editorStaticSelectedObjects.add(e);if(!this.editorStaticDrawSetSuspended&&"webgpu-experimental"===this.renderingView?.options.backend){for(const e of a)this.disposeEditorStaticDrawChunk(e),this.buildEditorStaticDrawChunk(e);a.size>0&&this.editorStaticDrawSetUpdated$.next()}}endEditorStaticSceneEdit(){for(const e of this.editorMatrixWorldEditingObjects)wa(e,!1);if(this.editorMatrixWorldEditingObjects.clear(),this.editorStaticDrawSetSuspended){this.editorStaticDrawSetSuspended=!1,this.editorStaticEditingObjects.clear();for(const e of this.dirtyEditorStaticDrawChunks)this.disposeEditorStaticDrawChunk(e),this.buildEditorStaticDrawChunk(e);this.dirtyEditorStaticDrawChunks.clear(),this.editorStaticDrawSetUpdated$.next()}}getEditorRenderObject(e){const t=e.userData?.src,a=null!=t?.id?this.sceneObjectMap.get(t.id)??e:e;if(this.editorStaticEditingObjects.has(a)||this.editorStaticSelectedObjects.has(a))return a;const s=this.editorStaticSnapshotBySource.get(a);return!0===s?.chunk.active?s.object:e}scheduleEditorStaticDrawSetRebuild(e){!this.editorStaticDisposed&&this._editorStaticDrawSetsEnabled&&this.inEditor&&!this.editorStaticDrawSetSuspended&&"webgpu-experimental"===this.renderingView?.options.backend&&(null==e?(this.editorStaticFullRebuildQueued=!0,this.editorStaticObjectsToRebuild.clear()):this.editorStaticFullRebuildQueued||this.editorStaticObjectsToRebuild.set(e.id,e),this.editorStaticDrawSetRebuildQueued||(this.editorStaticDrawSetRebuildQueued=!0,queueMicrotask(()=>{if(this.editorStaticDrawSetRebuildQueued=!1,this.editorStaticDisposed||this.editorStaticDrawSetSuspended)return;if(this.editorStaticFullRebuildQueued)return this.editorStaticFullRebuildQueued=!1,void this.rebuildEditorStaticDrawSet();const e=new Set;for(const t of this.editorStaticObjectsToRebuild.values()){const a=this.sceneObjectMap.get(t.id),s=null==a?null:this.editorStaticChunkBySource.get(a);if(null==s){this.editorStaticFullRebuildQueued=!0;break}e.add(s)}if(this.editorStaticObjectsToRebuild.clear(),this.editorStaticFullRebuildQueued)return this.editorStaticFullRebuildQueued=!1,void this.rebuildEditorStaticDrawSet();for(const t of e)this.disposeEditorStaticDrawChunk(t),this.buildEditorStaticDrawChunk(t);this.editorStaticDrawSetUpdated$.next()})))}prepareEditorStaticObjectForMutation(e){const t=this.sceneObjectMap.get(e.id);if(null==t)return;const a=this.editorStaticChunkBySource.get(t);!0===a?.active&&this.disposeEditorStaticDrawChunk(a)}rebuildEditorStaticDrawSet(){if(this.disposeEditorStaticDrawSet(),!this._editorStaticDrawSetsEnabled||!this.inEditor||this.editorStaticDrawSetSuspended||"webgpu-experimental"!==this.renderingView?.options.backend)return;const e=[];for(const t of this.idToSceneObject.values()){if("asset_mesh"!==t.type||!0===t.hidden||t.physics?.type===Me.dynamic)continue;const a=this.sceneObjectMap.get(t.id);null!=a&&this.canUseEditorStaticDrawSet(a)&&e.push(a)}const t=new p;t.name="Hology WebGPU editor static authored objects",t.visible=!1,t.userData.hologyEditorStaticAuthoredRoot=!0,this.scene.add(t),this.editorStaticAuthoredRoot=t,e.sort((e,t)=>{const a=e.userData?.src,s=t.userData?.src,r="asset_mesh"===a?.type?`${a.assetId}:${JSON.stringify(a.materialAssignments??[])}`:"",i="asset_mesh"===s?.type?`${s.assetId}:${JSON.stringify(s.materialAssignments??[])}`:"";return r.localeCompare(i)});for(let t=0;t<e.length;t+=32){const a={sources:e.slice(t,t+32),sourceVisibility:new Map,sourceUpdateMatrixWorld:new Map,sourceParents:new Map,active:!1};this.editorStaticDrawChunks.push(a);for(const e of a.sources)this.editorStaticChunkBySource.set(e,a);this.buildEditorStaticDrawChunk(a)}this.editorStaticDrawSetUpdated$.next()}buildEditorStaticDrawChunk(e){const t=new p;t.name="Hology WebGPU editor static asset mesh chunk",t.userData.hologyEditorStaticSnapshotRoot=!0,e.sourceVisibility.clear(),e.sourceUpdateMatrixWorld.clear(),e.sourceParents.clear();for(const a of e.sources){if(this.editorStaticEditingObjects.has(a)||this.editorStaticSelectedObjects.has(a)){this.editorStaticSnapshotBySource.delete(a);continue}a.updateWorldMatrix(!0,!0);const s=new p;s.name=a.name;const r=a.userData?.src;for(const e of a.children){const t=e.clone(!0),a=[];t.traverse(e=>{const t=e.userData?.src;(nt(e)||null!=t?.id&&null!=r?.id&&t.id!==r.id)&&a.push(e)});for(const e of a)e.removeFromParent();a.includes(t)||s.add(t)}s.matrix.copy(a.matrixWorld),s.matrix.decompose(s.position,s.quaternion,s.scale),s.matrixAutoUpdate=!1,t.add(s),this.editorStaticSnapshotBySource.set(a,{object:s,chunk:e}),e.sourceVisibility.set(a,a.visible),e.sourceParents.set(a,a.parent),a.visible=!1,this.editorStaticAuthoredRoot?.attach(a),e.sourceUpdateMatrixWorld.set(a,a.updateMatrixWorld),a.updateMatrixWorld=ga}0!==t.children.length&&(ma(t),this.scene.add(t),e.root=t,e.disposer=this.renderingView.registerExperimentalStaticDrawSet(t,`hology-editor-static-asset-meshes-${this.editorStaticDrawChunks.indexOf(e)}`),e.active=!0)}canUseEditorStaticDrawSet(e){let t=!1,a=!0;return e.traverseVisible(e=>{e instanceof m&&!nt(e)&&(t=!0,null!=e.geometry?.index&&null==e.customDepthMaterial&&ba(e.material)||(a=!1))}),t&&a}disposeEditorStaticDrawSet(){for(const e of this.editorStaticDrawChunks)this.disposeEditorStaticDrawChunk(e);this.editorStaticDrawChunks.length=0,this.dirtyEditorStaticDrawChunks.clear(),this.editorStaticChunkBySource=new WeakMap,this.editorStaticSnapshotBySource=new WeakMap,this.editorStaticAuthoredRoot?.removeFromParent(),this.editorStaticAuthoredRoot=void 0}disposeEditorStaticDrawChunk(e){e.disposer?.(),e.disposer=void 0,e.root?.removeFromParent(),e.root=void 0,e.active=!1;for(const[t,a]of e.sourceParents){const e=t.userData?.src,s=null==e?.id||this.sceneObjectMap.get(e.id)===t;(null!=a&&null==t.parent&&s||null!=a&&t.parent===this.editorStaticAuthoredRoot&&s)&&a.attach(t)}e.sourceParents.clear();for(const[t,a]of e.sourceVisibility)t.visible=a;e.sourceVisibility.clear();for(const[t,a]of e.sourceUpdateMatrixWorld)t.updateMatrixWorld=a;e.sourceUpdateMatrixWorld.clear()}async preloadVisualEffects(e){const t=new Set,a=new Set,s=[],r=new A;for(const i of e){const e=i.asset;if(t.has(e.id))continue;t.add(e.id),xs(e,a);const n=await i.create(r);r.add(n.object);const o=n.particleSystemContainer;null!=o&&r.add(o),n.play(),n.onUpdate(.5),n.stop(),n.pause(),s.push(n)}await this.initVfxTextures(a);const i=this.renderingView.compileAsync(r);this.renderingView.initTextures(r),await i;for(const e of s)e.onEndPlay(),e.disposed.next(!0),e.object.removeFromParent()}async initVfxTextures(e){const t=await Promise.all(Array.from(e,async e=>{const t=await this.assetsService.getAsset(e);return null==t?null:this.assetManagerService.getTexture(t)}));for(const e of t)null!=e&&this.renderingView.renderer.initTexture(e)}async initVfx(){await this.preloadVisualEffects(this.actorInstances.flatMap(e=>As(e)))}async initActorsPostInit(e=Array.from(this.materializedActors.entries())){const t=e.map(async([e,t])=>{const a=t.object.userData.src??t.object.userData._src;if("vfx"===a.type)return Promise.resolve();const s="prefab"===a.type?await this.assetsService.getAsset(a.assetId):null,r=e.split("/"),i=r.slice(0,-1),n=i.join("/"),o=(r[r.length-1],new Map);for(const[e,t]of this.materializedActors)if(o.set(e,t),0===n.length)e.includes("/")||o.set(e,t);else if(e.startsWith(n+"/")){const a=e.slice(n.length+1);a.includes("/")||o.set(a,t)}const l={...s?.actor?.params??{},...a.actor?.params??{}},c=[...a.actor?.innerParams??[]];for(let t=i.length-1;t>=0;t--){const a=i.slice(0,t+1).join("/"),s=this.idToSceneObject.get(a);if("prefab"===s?.type&&null!=s.prefab){const i=await this.assetsService.getAsset(s.assetId);if(null!=i){let n=!1,o=a+"/"+i.prefab?.mainActorId;for(;null!=o;){if(o===e){n=!0;break}o=this.prefabInstanceExposedActorMap.get(o)}if(n&&null!=s.prefab.params&&Object.assign(l,Va(s.prefab.params)),null!=s.prefab.innerParams){const e=r.slice(t+1);for(const t of s.prefab.innerParams){const a=Va(t.params);0!==Object.keys(a).length&&(n?c.push({path:za(t.path,e)?t.path.slice(e.length):t.path,params:a}):za(t.path,e)&&c.push({path:t.path.slice(e.length),params:a}))}}}}}this.rememberLivePrefabActorSettings(e,{...a.actor,params:l,innerParams:c});for(const e of c)await this.applyActorComponentParams(t,e.path.slice(),e.params,o);await this.attachEditorComponents(t,a,o);const u=await prepareClassParameters(l,t.constructor,this.assetsService,this.assetManagerService,o,this.renderingView,this.shaders,this.actorProvider,e=>{const t=n.length>0?n+"/"+e:e;return this.prefabInstanceExposedActorMap.get(t)??null},t);Object.assign(t,u);try{return await this.actorProvider.initActor(t)}catch(e){console.error(`Failed to initiate actor (name="${a.name}", id=${a.id})`,e)}});return Promise.all(t)}async attachEditorComponents(e,t,a){const s=t.actor?.components??[],r=new Array(s.length).fill(null);this.editorAttachedActorComponents.set(e,r);for(const[i,n]of s.entries()){const s=this.componentTypes.find(e=>e.name===n.type);if(null==s){console.warn(`Component type '${n.type}' not found for actor ${t.id}`);continue}const o=e.attach(s.type);if(r[i]=o,null!=n.params){const e=await prepareClassParameters(n.params,null,this.assetsService,this.assetManagerService,a,this.renderingView,this.shaders,this.actorProvider,e=>this.prefabInstanceExposedActorMap.get(e)??null,o);Object.assign(o,e)}for(const e of n.innerParams??[])await this.applyActorComponentParams(o,e.path.slice(),e.params,a)}}addVfxChildActors(e,t=e){}async applyActorComponentParams(e,t,a,s){const r=t.length,i=t.shift();if(0==r){const t=await prepareClassParameters(a,null,this.assetsService,this.assetManagerService,s,this.renderingView,this.shaders,this.actorProvider,e=>this.prefabInstanceExposedActorMap.get(e)??null,e);for(const[a,s]of Object.entries(t))null!=s&&(e[a]=s)}else null!=e[i]&&await this.applyActorComponentParams(e[i],t,a,s)}canObjectBeInstanced(e){return e.physics?.type!==Me.dynamic&&"sky"!==e.type&&"global_fog"!==e.type&&"world_env"!==e.type}async canAssetBeInstanced(e){let t=this._canBeInstancedCache.get(e.assetId);if(null==t){const a=await this.createFromAsset(e);if(null==a)return!1;const s=[];a.traverse(e=>{!nt(e)&&e.isMesh&&s.push(e)});const r=1==s.length&&0==s[0].children.length,i=!ra,n=s.every(e=>!Array.isArray(e.material)||1===e.material.length),o=s.some(e=>e instanceof m&&null!=e.geometry.morphAttributes&&Object.keys(e.geometry.morphAttributes).length>0),l=!0;t=s.length>0&&(r||n&&i)&&l&&!o,this._canBeInstancedCache.set(e.assetId,t)}return t}async preInit(){this.renderingView?.onLoop(()=>{null!=this.sky&&this.renderingView.camera.getWorldPosition(this.sky.position)}),await this.preloadAssets()}async preloadAssets(){const e=await this.assetsService.getAssets();for(const t of e)this.assets.set(t.id,t)}shouldBeMaterialized(e){if(!1===e.enabled)return!1;if(null!=this.detailTier&&"asset_mesh"===e.type&&null!=e.assetId){const t=this.assets.get(e.assetId);if(null!=t){const e=t.mesh?.detailTier;if(null!=e)return e<=this.detailTier}}return!0}async initWithInstancing(){await this.preInit(),await this.prefetchAssets(),this.experimentalStaticDrawSetDisposer?.(),this.experimentalStaticDrawSetDisposer=void 0,oa.clear(),la.clear();const e=[],t=new Ye,a=new Ye,s=new Ye;let r=0,n=0,o=0;const u=new Map,d=new Qe(()=>new Map),h="webgpu-experimental"===this.renderingView?.options.backend?new p:null,g=null!=h?new p:null;null!=h&&(h.name="Hology WebGPU static scene objects",g.name="Hology WebGPU unsorted late static scene objects");const y=(e,t)=>{if(null!=h&&function(e){return e.visible&&null!=e.geometry.index&&null==e.customDepthMaterial&&ba(e.material,!0)}(t)){((Array.isArray(t.material)?t.material:[t.material]).some(e=>e.transparent||va(e))?g:h).add(e)}else this.scene.add(e)};for(const i of this.dataProvider.getObjects())await Da(i,async(i,c,p)=>{if(!this.shouldBeMaterialized(i))return;const h="asset_mesh"==i.type&&this.canObjectBeInstanced(i)&&await this.canAssetBeInstanced(i),f="shape_mesh"===i.type&&"landscape"!==i.shape&&i.physics?.type!==Me.dynamic;if(h||f){if(c&&c.children?.length>0){const e=c.children.findIndex(e=>e.id===i.id);e>=0&&c.children.splice(e,1)}if(f){let e=i.shape+JSON.stringify(i.shapeParams??{})+i.castShadow+i.receiveShadow;const t=i.materialAssignments?.at(0)?.materialId,a=null!=t?this.assets.get(t):null;let r=null;if(!1&&null!=a&&"shader"!==a.material.type){if(e+=a.material.type+a.material.shader,null!=a.material.shaderParams){if(e+=Object.entries(a.material.shaderParams).filter(([e,t])=>"color"!=e).map(e=>JSON.stringify(e)).join(),null!=a.material.shaderParams.color){const e=a.material.shaderParams.color;e.type===St.Color&&null!=e.value&&(r=new l(e.value))}}e+=a.material.outlines,null!=a.material.outlineParams&&(e+=JSON.stringify(a.material.outlineParams)),e+=a.material.reflective,e+=a.material.bloom,e+=a.material.side,e+=a.material.side,e+=a.material.transparent,e+=a.material.alphaTest}else e+=t;s.push(e,{object:{...i,parentTransform:p},color:r}),o++}else{const e=this.assets.get(i.assetId);null==e&&console.log("Can't find asset with id "+i.assetId);let s=u.get(i.assetId);if(null==s){const e=await this.createFromAsset(i,{assignMaterials:!1});if(null==e)return;if(s=u.get(i.assetId),null==s){s={useBatchedMesh:null!=et(e)&&Gt(e,e=>!(e instanceof m)||this.testCanBatch(e.material,e.geometry)),assetMesh:e},u.set(i.assetId,s)}}const o=Ba(i.materialAssignments,e.materialAssignments);if(s.useBatchedMesh)await at(s.assetMesh,async t=>{if(!(t instanceof m))return;const s=Array.isArray(t.material)?t.material[0]:t.material,n=await this.resolveMaterialForAssignments(s,o,e);if(null!=n){Oe(n,!1),d.get(i.id).set(t.uuid,n);let s=Ha(t,n);if(s+=rs(n),"webgpu-experimental"===this.renderingView?.options.backend){s+=`|castShadow:${i.castShadow??e.castShadow??!1?1:0}|receiveShadow:${i.receiveShadow??e.receiveShadow??!1?1:0}`}a.push(s,{...i,parentTransform:p,meshUUID:t.uuid}),r++}else console.warn("Can not materialize mesh because missing material",i)});else{const e=i.assetId+JSON.stringify(i.materialAssignments??[]);t.push(e,{...i,parentTransform:p}),n++}}}else null==c&&e.push({...i,parentTransform:p})});console.log(`Scene init stats: \n Batched Assets: ${a.size} groups containing in total ${r} objects.\n Instanced Assets: ${t.size} groups containing in total ${n} objects.\n Shapes: ${s.size} batch groups containing in total ${o} objects. \n ${e.length} objects can not be batched. \n `),console.time("materialize batches");for(const[e,t]of a.entries()){if(0==t.length)continue;let e;u.get(t[0].assetId).assetMesh;e=this.createBatchedMesh(t,d,u);const a=this.assets.get(t[0].assetId);"webgl"===this.renderingView?.activeBackend?(e instanceof Rt&&e.perInstanceCastShadow||(e.castShadow=_s(t,a?.castShadow??!1)),e.receiveShadow=Ls(t,a?.receiveShadow??!1)):(console.log("SETTING CAST SHADOW TO TRUE"),e.castShadow=!0,e.receiveShadow=!0);const s=new st;s.add(e),s.userData.src=t[0],s.castShadow=!1,s.receiveShadow=!1,y(s,e)}for(const e of t.values()){if(0==e.length)continue;let t;const a=u.get(e[0].assetId).assetMesh;t=await this.createInstancedMesh(e,a);const s=this.assets.get(e[0].assetId);t.castShadow=_s(e,s?.castShadow??!1),t.receiveShadow=Ls(e,s?.receiveShadow??!1);const r=new st;r.add(t),r.userData.src=e[0],a instanceof st&&(r.collisionShapes=a.collisionShapes),this.prepareCollisionShapesForInstanced(r),r.castShadow=!1,r.receiveShadow=!1,y(r,t)}console.timeEnd("materialize batches");for(const e of s.values()){if(0==e.length)continue;const t=e[0].object,a=await this.createFromShape(t),s=tt(a,e=>!nt(e)&&null!=e.geometry),r=Ga(s.material);null!=e[0].color&&null!=r.color&&(r.color=new l(16777215));const n=null==s.geometry.index?Jt.mergeVertices(s.geometry):s.geometry;let o,u;!(ra||r instanceof R)?(o=new i.BatchedMesh(e.length,n.getAttribute("position").count,n.index.count,r),o.perObjectFrustumCulled=!0,u=o.addGeometry(n)):o=new i.InstancedMesh(n,r,e.length),o.castShadow=a.castShadow??!0,o.receiveShadow=s.receiveShadow??!1;for(let t=0;t<e.length;t++){const a=e[t],s=(new i.Matrix4).compose((new D).fromArray(a.object.position),(new M).setFromEuler((new c).fromArray(a.object.rotation)),(new D).fromArray(a.object.scale)),r=(new f).copy(a.object.parentTransform).multiply(s);let n;n=o instanceof i.BatchedMesh?o.addInstance(u):t,o.setMatrixAt(n,r),a.color}for(let t=0;t<e.length;t++){const s=e[t],r=new st;r.userData.src=e[0],a instanceof lt&&(r.collisionShapes=[a.collisionShape]),r.castShadow=!0,r.receiveShadow=!0,y(r,o),r.add(o),null==o.userData.hasCollision&&(o.userData.hasCollision=[]),o.userData.hasCollision[t]=!1!==s.object.collisionDetection}}if(null!=h&&h.children.length>0&&(ma(h),this.scene.add(h),this.experimentalStaticDrawSetDisposer=this.renderingView.registerExperimentalStaticDrawSet(h,"hology-materialized-static-scene")),null!=g&&g.children.length>0){ma(g),this.scene.add(g);const e=this.experimentalStaticDrawSetDisposer,t=this.renderingView.registerExperimentalStaticDrawSet(g,"hology-materialized-unsorted-late-static-scene",!0);this.experimentalStaticDrawSetDisposer=()=>{e?.(),t()}}await Promise.all(e.map(e=>this.materialize(e))),await this.initActorsPostInit(),this.announcePrefabEventGraphs(),await this.initVfx(),this.generateOcclusionClusters(),await this.refreshPaintedScatterPresence(!0),await this.refreshSurfaceScatterPresence(!0)}generateOcclusionClusters(){const e=new kt;e.initScene(this.scene),e.clusters.forEach(e=>{this.renderingView.addCluster(e)})}prepareCollisionShapesForInstanced(e){e instanceof st&&e.collisionShapes.forEach(e=>{e instanceof a&&e.mesh instanceof m&&(e.mesh=e.mesh.geometry)})}setScene(e){this.scene=e}testCanBatch(e,t){return!ra&&(!Array.isArray(e)||1==e.length)&&this.testCanBatchMaterial(e)}testCanBatchMaterial(e){return null!=(Array.isArray(e)?e[0]:e)}createBatchedMesh(e,t,a){const s=new Ye;for(const t of e)null!=t.meshUUID?s.push(t.meshUUID??t.assetId,t):console.warn("Missing mesh uuid for batching");let r=0,n=0,o=0;const c=new Map;for(const[e,t]of s.entries()){const s=t[0].assetId,i=a.get(s);if(null==i){console.warn("Missing batching info for asset id "+s);continue}const l=tt(i.assetMesh,t=>t instanceof m&&t.uuid===e);if(null==l){console.warn("Missing mesh in batched asset");continue}c.set(e,l);const u=l.geometry.getAttribute("position");null==u&&console.warn("Missing position attribute for batched mesh"),r+=l.geometry.index.count*t.length,n+=u.count*t.length,o+=t.length}const u=["color","map","roughness","roughnessMap","metalness","metalnessMap","opacity","alphaMap","aoMap","aoMapIntensity","normalMap","normalScale","emissive","emissiveIntensity","emissiveMap"],d=new Map,p=new Map,h=[];let f=new i.MeshStandardMaterial({color:"white"});const g=t.get(e[0].id).get(e[0].meshUUID);if(null==g)throw"missing source material";if(g instanceof w&&!(g instanceof i.MeshPhysicalMaterial)){const a=new Set,s=new Map;for(const r of e){const e=t.get(r.id).get(r.meshUUID);if(null==e)throw"missing mat";for(const t of u){let r=e[t];r instanceof i.CompressedArrayTexture&&null!=r.userData.index&&(r=r.userData.index);const n=s.get(t);void 0===n||Ms(r,n)?s.set(t,r):a.add(t)}}for(const e of a){let t;const a=g[e];let s=e;if("number"==typeof a){let a=h.find(e=>e.params.length<4);if(null==a){const t="vp"+h.length;a={name:t,params:[e],node:k(t)},h.push(a)}else a.params.push(e);s=a.name,t=bs(a.node,a.params.length-1)}else if(a instanceof P)t=k(s);else if(a instanceof D||a instanceof l)t=C(s);else if(a instanceof j)t=E(s);else if(a instanceof i.CompressedArrayTexture)s=e+"_i",t=O(s);else if(a instanceof x)continue;d.set(e,t),p.set(e,s)}let r=re.uv;g instanceof _t&&null!=g.heightMap&&(r=Lt(r,Q(g.heightMap),U(g.heightScale)));let n=gs(d.get("opacity"),$)??U(g.opacity??1);if(null!=g.alphaMap){let e;if(g.alphaMap instanceof i.CompressedArrayTexture){const t=H(g.alphaMap),a=gs(d.get("alphaMap"),$)??U(g.alphaMap.userData.index??0);e=t.sample(le(r.x,r.y,a))}else e=Q(g.alphaMap).sample(r);n=n.multiply(e.r)}let o=L(gs(d.get("color"),ce)??g.color,n);if(null!=g.map){let e;if(g.map instanceof i.CompressedArrayTexture){const t=H(g.map),a=gs(d.get("map"),$)??U(g.map.userData.index??0);e=t.sample(le(r.x,r.y,a))}else e=Q(g.map).sample(Zt(r,g.map));o=o.multiply(e),n=n.multiply(e.a)}g.vertexColors&&(o=o.multiply(ue(se(I.color.rgb),1)));let c=L(gs(d.get("emissive"),ce)??g.emissive,n);if(null!=g.emissiveMap){let e;if(g.emissiveMap instanceof i.CompressedArrayTexture){const t=H(g.emissiveMap),a=gs(d.get("emissiveMap"),$)??U(g.emissiveMap.userData.index??0);e=t.sample(le(r.x,r.y,a))}else e=Q(g.emissiveMap).sample(Zt(r,g.emissiveMap));c=c.multiply(e)}const m=gs(d.get("emissiveIntensity"),$)??U(g.emissiveIntensity??1),y=gs(d.get("normalScale"),oe)??ne(g.normalScale??new j(1,1));let w=ie.normal;if(null!=g.normalMap){let e;if(g.normalMap instanceof i.CompressedArrayTexture){const t=H(g.normalMap),a=gs(d.get("normalMap"),$)??U(g.normalMap.userData.index??0);e=t.sample(le(r.x,r.y,a))}else e=Q(g.normalMap).sample(Zt(r,g.normalMap));w=N(e.rgb,y.x)}let S=gs(d.get("roughness"),$)??U(g.roughness??1);if(null!=g.roughnessMap){let e;if(g.roughnessMap instanceof i.CompressedArrayTexture){const t=H(g.roughnessMap),a=gs(d.get("roughnessMap"),$)??U(g.roughnessMap.userData.index??0);e=t.sample(le(r.x,r.y,a))}else e=Q(g.roughnessMap).sample(Zt(r,g.roughnessMap));S=S.multiply(e.g)}let b=gs(d.get("metalness"),$)??U(g.metalness??0);if(null!=g.metalnessMap){let e;if(g.metalnessMap instanceof i.CompressedArrayTexture){const t=H(g.metalnessMap),a=gs(d.get("metalnessMap"),$)??U(g.metalnessMap.userData.index??0);e=t.sample(le(r.x,r.y,a))}else e=Q(g.metalnessMap).sample(Zt(r,g.metalnessMap));b=b.multiply(e.b)}let v=U(1);if(null!=g.aoMap){let e;if(g.aoMap instanceof i.CompressedArrayTexture){const t=H(g.aoMap),a=gs(d.get("aoMap"),$)??U(g.aoMap.userData.index??0);e=t.sample(le(r.x,r.y,a))}else e=Q(g.aoMap).sample(Zt(r,g.aoMap));v=v.multiply(e.r)}const M=gs(d.get("aoMapIntensity"),$)??U(g.aoMapIntensity??0);let A=w;!0!==g.userData.disableAO&&(A=F("DOUBLE_SIDED",A,e=>J(new V("gl_FrontFacing"),e,e.multiplyScalar(-1))));const T=new R({color:q({color:o,roughness:S,metalness:b,ambientOcclusion:v,ambientOcclusionIntensity:M,emissive:c,emissiveIntensity:m,normal:A}),normal:w,roughness:S,emissive:c.rgb,transparent:g.transparent,alphaTest:g.alphaTest,envMap:g.envMap,opacity:n});null!=g.envMap&&(T.uniforms.envMapIntensity={value:g.envMapIntensity},T.uniforms.envMapRotation={value:Ss(g.envMapRotation,g.envMap)}),T.envMap=g.envMap,T.side=g.side,f=T}else if(g instanceof R){const a=new Set,s=new Map,r=Object.keys(g.uniforms).filter(e=>!os(e));for(const i of e){const e=t.get(i.id).get(i.meshUUID);if(!(e instanceof R))throw new Error("Expected NodeShaderMaterial in node material batch");for(const t of r){const r=e.uniforms[t]?.value,i=s.get(t);void 0===i||Ms(r,i)?s.set(t,r):cs(r)&&cs(i)&&us(r)===us(i)&&a.add(t)}}const i=new Set(Object.keys(g.uniforms)),n={};for(const e of a){let t,a;const s=g.uniforms[e]?.value;if("number"==typeof s){let s=h.find(e=>e.params.length<4);if(null==s){const t=ds("vp"+h.length,i);s={name:t,params:[e],node:k(t)},h.push(s)}else s.params.push(e);a=s.name,t=bs(s.node,s.params.length-1)}else if(s instanceof P)a=ds(e,i),t=k(a);else if(s instanceof D||s instanceof l)a=ds(e,i),t=C(a);else{if(!(s instanceof j))continue;a=ds(e,i),t=E(a)}d.set(e,t),p.set(e,a),n[e]=t}if(0===d.size)f=g;else{const e=B(g,{color:g.outputColor,transform:g.outputTransform??null,position:null==g.outputTransform?g.outputPosition:void 0,normal:g.outputNormal??null,roughness:g.outputRoughness??null,opacity:g.outputOpacity??null,emissive:g.outputEmissive??null,uniforms:ps(g,new Set(d.keys())),uniformNodes:n});e.uniformNodes=n,y=g,(S=e).name=y.name,S.side=y.side,S.blending=y.blending,S.depthWrite=y.depthWrite,S.depthTest=y.depthTest,S.colorWrite=y.colorWrite,S.toneMapped=y.toneMapped,S.visible=y.visible,S.opacity=y.opacity,S.forceSinglePass=y.forceSinglePass,S.premultipliedAlpha=y.premultipliedAlpha,S.polygonOffset=y.polygonOffset,S.polygonOffsetFactor=y.polygonOffsetFactor,S.polygonOffsetUnits=y.polygonOffsetUnits,S.shadowSide=y.shadowSide,Object.assign(S.defines,y.defines),Object.assign(S.userData,y.userData),S.needsUpdate=!0,f=e}}else{f=g;for(const a of e){const e=t.get(a.id).get(a.meshUUID);if(e!=f){console.error(`Different materials in group for object ${a.id} and mesh uuid ${a.meshUUID}`,{objectMaterial:e,sourceMaterial:g});break}}}var y,S;const b=new Rt(o,n,r,f);for(const e of h)b.initUniform(e.name,4);for(const[e,t]of d.entries()){if(h.some(t=>t.params.includes(e)))continue;let a=1;t instanceof de||t instanceof ce?a=4:t instanceof oe&&(a=2),b.initUniform(p.get(e)??e,a,0)}for(const[e,r]of s.entries()){const s=r[0].assetId,n=c.get(e);if(null==n){console.error(`Missing single asset mesh for mesh uuid ${e} and asset id ${s}`);continue}if(null==n.geometry){console.error("Missing geometry on mesh mesh");continue}const o=b.addGeometry(Za(n.geometry,g)),u=this.assets.get(s),f=a.get(s);if(null==f){console.warn("Missing batching info when configuring for asset id "+s);continue}const m=et(f.assetMesh)?.uuid===e,y=f.assetMesh instanceof st&&m?f.assetMesh.collisionShapes:void 0,w=this.configureBatchedInstancedMesh(r,b,n,o,y);for(let e=0;e<w.length;e++){const a=r[e],s=w[e];"webgpu-experimental"!==this.renderingView?.options.backend&&b.setCastShadowAt(s,a.castShadow??u?.castShadow??!1);const n=t.get(a.id).get(a.meshUUID),o=n.userData.surface;null!=o&&(b.surfaceByInstance[s]=o);for(const e of h){let t=vs.set(0,0,0,0);for(let a=0;a<e.params.length;a++){const s=ls(n,e.params[a]);"number"==typeof s&&t.setComponent(a,s)}b.setUniformAt(e.name,s,t)}for(let e of d.keys()){if(h.some(t=>t.params.includes(e)))continue;const t=p.get(e)??e;let a=ls(n,e);if(a instanceof l&&(a=new D(a.r,a.g,a.b)),a instanceof i.CompressedArrayTexture)a=a.userData.index??0;else if(a instanceof x||null==a)continue;b.setUniformAt(t,s,a)}}}return b}async createInstancedMesh(e,t){const a=tt(t,e=>!nt(e)&&null!=e.geometry),s=await this.assetsService.getAsset(e[0].assetId);await this.applyMaterials(t,Ba(e[0].materialAssignments,s.materialAssignments),s),a.updateMatrix();const r=a.geometry.clone(),n=a.material;let o;if(o=new i.InstancedMesh(r,n,e.length),this.configureBatchedInstancedMesh(e,o,a),a.material instanceof h&&o.castShadow&&o.receiveShadow&&Array.isArray(n))for(const e of n);return o}configureBatchedInstancedMesh(e,t,a,s,r){const n=[];a.updateWorldMatrix(!0,!0);for(let o=0;o<e.length;o++){let l=o;t instanceof i.BatchedMesh&&(l=t.addInstance(s)),n.push(l);const u=(new i.Matrix4).compose((new D).fromArray(e[o].position),(new M).setFromEuler((new c).fromArray(e[o].rotation)),(new D).fromArray(e[o].scale)),d=(new f).copy(e[o].parentTransform).multiply(u),p=(new f).copy(d).multiply(a.matrixWorld);t.setMatrixAt(l,p),null==t.userData.hasCollision&&(t.userData.hasCollision=[]);const h=this.assets.get(e[o].assetId);t.userData.hasCollision[l]=!1!==e[o].collisionDetection||!1!==h?.collisionDetection,null!=r&&(null==t.userData.collisionShapes&&(t.userData.collisionShapes=[]),t.userData.collisionShapes[l]=r,null==t.userData.collisionMatrices&&(t.userData.collisionMatrices=[]),t.userData.collisionMatrices[l]=d)}return n}remove(e){if(console.log("Remove scene object",e),"global_fog"==e.type)return void(this.scene.fog=this.originalFog);if("world_env"===e.type)this.resetWorldEnv(),this.worldEnvObj=null;else if("actor"==e.type||"vfx"===e.type){const t=this.materializedActors.get(e.id);null!=t?(t.disposed.next(!0),t.onEndPlay()):console.warn("Failed to remove actor",e)}else if("prefab"===e.type){this.unregisterLivePrefabInstance(e.id);const t=new Set(this.removePrefabEventGraphs(e.id).flatMap(e=>e.actors));this.materializedActors.forEach((a,s)=>{(s===e.id||s.startsWith(e.id+"/"))&&(t.has(a)||(a.disposed.next(!0),a.onEndPlay()),this.materializedActors.delete(s))})}const t=this.sceneObjectMap.get(e.id);t?.parent.remove(t),this.sceneObjectMap.delete(e.id),this.components.filter(t=>t.object.userData.src?.id===e.id).forEach(e=>this.components.splice(this.components.indexOf(e,1))),this.landscapeManagers.filter(t=>t.source.id===e.id).forEach(e=>{e.clear(),e.stop(),this.landscapeManagers.splice(this.landscapeManagers.indexOf(e,1))}),this.removed$.next({object:t,source:e})}deleteSceneObject(e){const t=this.sceneObjectMap.get(e.id);if(this.scene.remove(t),"landscape"==e.type){const t=this.landscapeManagers.findIndex(t=>t.source.id===e.id);if(t>-1){const e=this.landscapeManagers.splice(t,1)[0];e.clear(),e.stop()}}}findByAssetId(e){return Ke(this.scene,t=>t.userData.src?.assetId==e,e=>null!=e.userData.src)}applyMaterials(e,t,a){return null==t?Promise.resolve([]):Promise.all(t.filter(e=>"null"!==e.materialId).map(t=>this.applyMaterial(e,t,a)))}async applyMaterial(e,t,a){await applyMaterial(e,t,async e=>{const t=await this.getAsset(e);if(null!=t)try{return materialFromAsset(t,this.renderingView,this.assetsService,this.assetManagerService,this.shaders)}catch(e){console.error("Failed to apply material",e)}else console.warn("Missing material with id "+e)},this._originalMaterials,{textureFlipY:getConvertedFbxToGlbAssignedMaterialTextureFlipY(a)})}async resolveMaterialForAssignments(e,t,a){let s=e,r=null,i=null;const n=getConvertedFbxToGlbAssignedMaterialTextureFlipY(a);for(const e of t??[]){if(!Ra(s,e,r,i))continue;const t=await this.getAsset(e.materialId);if(null==t){console.warn("Missing material with id "+e.materialId);continue}let a=await materialFromAsset(t,this.renderingView,this.assetsService,this.assetManagerService,this.shaders,!0);null!=a&&(a=La(a,n)),null!=a&&s.id!==a.id&&(r=r??Wa(s),i=i??s.name,s=a);break}return s}unapplyMaterials(e){e.traverse(async e=>{if(e instanceof m)if(e.material instanceof Array)for(let t=0;t<e.material.length;t++)e.material[t]=this._originalMaterials.get(e.id+"#"+t)??e.material[t];else e.material=this._originalMaterials.get(e.id)??e.material})}updateActors(e){console.log("update actors"),this.actorTypes=e;const t=new Set(Object.values(be));Ke(this.scene,e=>e.userData.src?.id&&"actor"===e.userData.src.type&&this.materializedActors.has(e.userData.src?.id)&&!t.has(e.userData.src.actor.type)).forEach(async e=>{this.remove(e.userData.src),await this.materializeAndInitActor(e.userData.src)})}updateComponents(e){this.componentTypes=e,Ke(this.scene,e=>e.userData.src?.id&&"actor"===e.userData.src.type&&this.materializedActors.has(e.userData.src?.id)&&(e.userData.src.actor?.components?.length??0)>0).forEach(async e=>{this.remove(e.userData.src),await this.materializeAndInitActor(e.userData.src)})}updateShaders(e){this.shaders=e;for(const[e,t]of oa.entries())t.userData.customShaderName&&oa.delete(e);this.landscapeManagers.forEach(t=>t.updateShaders(e)),Ke(this.scene,e=>!0).forEach(e=>{e.traverse(async e=>{if(e instanceof m)if(Array.isArray(e.material))for(let t=0;t<e.material.length;t++){const a=e.material[t].userData?.customShaderName;if(null!=a){const a=e.material[t].userData.assetId,s=await this.getAsset(a);null!=s&&this.refreshMaterial(e,e.material[t],s,t)}}else{const t=e.material.userData?.customShaderName;if(null!=t){const t=e.material.userData.assetId,a=await this.getAsset(t);null!=a&&this.refreshMaterial(e,e.material,a)}}})})}async update(e){if("sky"===e.type&&null!=this.sky&&null!=this.sky.parent)return void this.updateSky(e);if("world_env"===e.type&&null!=this.worldEnvObj)return void this.updateWorldEnv(e);const t=this.sceneObjectMap.get(e.id);if(t){let i=!1;if(t.traverseAncestors(e=>{"_hology_transform_group"===e.name&&(i=!0)}),!i){const a=this.findParent(e);null!=a&&a.uuid!=t.uuid?a.attach(t):console.error("Parent is wrong")}if(!("shape_mesh"!==e.type&&"asset_mesh"!==e.type||null==e.renderOrder&&0===t.renderOrder||e.renderOrder===t.renderOrder))return void(t.renderOrder=e.renderOrder??0);if("prefab"!==e.type&&"group"!==e.type){this.unapplyMaterials(t);this.inEditor&&e.hidden&&!1?t.traverse(e=>{e instanceof m&&(e.material.wireframe=!0)}):t.traverse(e=>{e instanceof m&&(e.material.wireframe=!1)})}if("asset_mesh"===e.type&&t.userData.assetId!==e.assetId){this.remove(e);const t=await this.materializeAndInitActor(e);return void this.updated$.next({object:t,source:e})}if("asset_mesh"===e.type){const a=this.assets.get(e.assetId);Ba(e.materialAssignments,a.materialAssignments).forEach(e=>this.applyMaterial(t,e,a))}else"shape_mesh"===e.type&&this.applyMaterials(t,e.materialAssignments);if(i||(null!=e.position&&t.position.fromArray(e.position),null!=e.scale&&t.scale.fromArray(e.scale),null!=e.rotation&&t.rotation.fromArray(e.rotation),this.inEditor&&("asset_mesh"===e.type||"shape_mesh"===e.type&&"landscape"!==e.shape)&&e.physics?.type!==Me.dynamic?wa(t,!1):this.inEditor&&function(e){let t=!1;if(e.traverse(e=>{ya.has(e)&&(t=!0)}),!t)return;e.updateWorldMatrix(!0,!0),e.traverse(e=>{ya.has(e)&&(e.matrixWorldNeedsUpdate=!1)})}(t)),this.applyVertexMaterials(e,t),"light"==e.type){if("point"==e.light.type){const a=t;a.color=new l(e.light.point.color),a.intensity=e.light.point.intensity,a.decay=e.light.point.decay,a.castShadow=e.light.point.castShadow,a.distance=Math.max(e.light.point.distance,0),a.userData.volumetricIntensity=e.light.point.volumetricIntensity}else if("spot"==e.light.type){const a=t;a.color=new l(e.light.spot.color),a.intensity=e.light.spot.intensity,a.decay=e.light.spot.decay,a.angle=e.light.spot.angle,a.penumbra=e.light.spot.penumbra,a.castShadow=e.light.spot.castShadow,a.distance=Math.max(e.light.spot.distance,0),a.userData.volumetricIntensity=e.light.spot.volumetricIntensity,a.map=await this.loadSpotLightMap(e.light.spot.mapTextureId)}else if("directional"===e.light.type)this.applyDirectionalLight(e.light.directional,e);else if("ambient"===e.light.type)this.applyDirectionalAmbientLight(t,e.light.ambient,e);else if("rectArea"===e.light.type){const a=t;a.color=new l(e.light.rectArea.color),a.intensity=e.light.rectArea.intensity,null!=e.scale&&(a.width=e.scale[0],a.height=e.scale[1]),a.children.forEach(e=>{e instanceof qt&&e.update()})}}else if("landscape"===e.shape){const a=this.landscapeManagers.find(t=>t.source.id===e.id),i=null==a||(s=a.source.landscape.options,r=e.landscape.options,s.density!==r.density||s.sections.x!==r.sections.x||s.sections.y!==r.sections.y);if(this.inEditor&&i){this.remove(e);const t=await this.materializeAndInitActor(e);return void this.updated$.next({object:t,source:e})}this.applyHeightMaps(t,e.landscape.heightMaps),this.inEditor&&this.landscapeManagers.filter(t=>t.source.id===e.id).forEach(t=>{t.updateSource(e),t.queueRefreshScatter(this.renderingView.camera.position,!0,e=>!0)})}else if("global_fog"===e.type){const t=(this.scene.fog instanceof d?"density":"linear")!==e.fog.type;this.scene.fog=Ma(e.fog),t&&(a=this.scene).traverse(e=>{if(e instanceof m){const t=e.material;t instanceof R&&(a.fog instanceof u?(t.uniforms.fogFar.value=a.fog.far,t.uniforms.fogNear.value=a.fog.near):a.fog instanceof d&&(t.uniforms.density={value:a.fog.density}),t.needsUpdate=!0,t.uniformsNeedUpdate=!0)}}),this.fixFogColor()}else if("actor"===e.type){if(this.materializedActors.has(e.id)){const t=this.materializedActors.get(e.id);if(t instanceof $t){const a=await prepareClassParameters(e.actor.params,null,this.assetsService,this.assetManagerService,this.materializedActors,this.renderingView,[],this.actorProvider,e=>this.prefabInstanceExposedActorMap.get(e)??null,t);return void Object.assign(t,a)}const a=this.editorActorParamSnapshot.get(e.id);if((null==a||a!==JSON.stringify(e.actor))&&!i){if(null!=t&&null!=a&&await this.tryApplyLiveActorParameterUpdate(t,e,a))return void this.updated$.next({object:t.object,source:e});this.remove(e),await this.materializeAndInitActor(e)}}}else if("shape_mesh"===e.type){const a=await this.createMeshByShape(e.shape,t.material,e.shapeParams);t instanceof lt&&(t.geometry=a.geometry,t.collisionShape=a.collisionShape)}if("shape_mesh"===e.type&&"landscape"!==e.shape)na(t,e.castShadow,e.receiveShadow);else if("asset_mesh"===e.type){const a=this.assets.get(e.assetId);if(null==a)return void console.error("Asset not found",e.assetId);const s=e.receiveShadow??!!a.receiveShadow,r=e.castShadow??!!a.castShadow;na(t,r,s)}e.name&&e.name.length>0&&(t.name=e.name),this.updated$.next({object:t,source:e})}else{const t=await this.materializeAndInitActor(e);this.updated$.next({object:t,source:e})}var a,s,r;this.renderingView.renderer.shadowMap.needsUpdate=!0}async materializeAndInitActor(e,t=this.findParent(e)){const a=await this.materialize(e,t),s=Array.from(this.materializedActors.entries()).filter(([t])=>t===e.id||t.startsWith(e.id+"/"));return await this.initActorsPostInit(s),this.announcePrefabEventGraphs(e.id),a}async tryApplyLiveActorParameterUpdate(e,t,a){let s;try{s=JSON.parse(a)}catch{return!1}const r=await this.tryApplyLiveActorSettingsUpdate(e,s,t.actor);return r&&this.editorActorParamSnapshot.set(t.id,JSON.stringify(t.actor)),r}async tryApplyLiveActorSettingsUpdate(e,t,a){const s=await this.applyLiveActorSettingsUpdate(e,t,a);return s.hasChanges&&!s.rejected}async applyLiveActorSettingsUpdate(e,t,a){const s=t?.components??[],r=a?.components??[];if(t?.type!==a?.type||s.length!==r.length||s.some((e,t)=>e.type!==r[t]?.type))return{applied:t,hasChanges:!0,rejected:!0};let i=!1,n=!1;const o=await this.tryApplyLiveParameterUpdate(e,t?.params??{},a?.params??{});!1===o&&(n=!0),i||(i=!0===o);const l=await this.applyLiveInnerParameterUpdates(e,t?.innerParams??[],a?.innerParams??[]);n||(n=l.rejected),i||(i=l.hasChanges);const c=this.editorAttachedActorComponents.get(e),u=[];for(let e=0;e<r.length;e++){const t=s[e],a=r[e];if(JSON.stringify(t)===JSON.stringify(a)){u.push(a);continue}const o=c?.[e];if(null==o){n=!0,u.push(t);continue}const l=await this.tryApplyLiveParameterUpdate(o,t?.params??{},a?.params??{});!1===l&&(n=!0),i||(i=!0===l);const d=await this.applyLiveInnerParameterUpdates(o,t?.innerParams??[],a?.innerParams??[]);n||(n=d.rejected),i||(i=d.hasChanges),u.push({...a,params:!1===l?t?.params:a?.params,innerParams:d.applied})}return{applied:{...a,params:!1===o?t?.params:a?.params,innerParams:l.applied,components:u},hasChanges:i,rejected:n}}async applyLivePrefabParameterUpdate(e,t){if(!this.assetsService.supportsLivePrefabParameters)return!1;const a=this.livePrefabInstances.get(t.id);if(null==a||0===a.size)return!0;const s=Oa(e.prefab?.objects??[]),r=Oa(t.prefab?.objects??[]);if(s.size!==r.size||[...s.keys()].some(e=>!r.has(e)))return!1;const i=[];await this.applyLiveNestedPrefabOverrideUpdates(e,t,a,i);for(const n of a.values())for(const[a,o]of s){const s=r.get(a),l=n.actorsById.get(a);if(null==s||null==l){i.push(`${n.prefix}/${a}`);continue}const c=n.actorSettingsById.get(a)??Ca(o,n.source,e.prefab?.mainActorId===a),u=Ca(o,n.source,e.prefab?.mainActorId===a),d=ka(u,Ca(s,n.source,t.prefab?.mainActorId===a),n.desiredActorSettingsById.get(a)??u);if(n.desiredActorSettingsById.set(a,d),JSON.stringify(c)===JSON.stringify(d))continue;const p=await this.applyLiveActorSettingsUpdate(l,c,d);n.actorSettingsById.set(a,p.applied),p.rejected&&i.push(`${n.prefix}/${a}`)}return i.length>0&&console.warn(`Some live parameters for prefab ${t.name??t.id} were not applied. The running instances were preserved: ${i.join(", ")}`),!0}async applyLiveNestedPrefabOverrideUpdates(e,t,a,s){const r=Ea(e.prefab?.objects??[]),i=Ea(t.prefab?.objects??[]);for(const[e,t]of r){const r=i.get(e);if(null==r||t.assetId!==r.assetId||JSON.stringify(t.prefab)===JSON.stringify(r.prefab))continue;const n=this.assets.get(r.assetId),o=this.livePrefabInstances.get(r.assetId);if("prefab"!==n?.type||null==n.prefab||null==o)continue;const l=Oa(n.prefab.objects);for(const i of a.values()){const a=`${i.prefix}/${e}`,c=o.get(a);if(null!=c){for(const[e,i]of l){const o=c.actorsById.get(e);if(null==o){s.push(`${a}/${e}`);continue}const l=Ca(i,t,n.prefab.mainActorId===e),u=Ca(i,r,n.prefab.mainActorId===e),d=c.desiredActorSettingsById.get(e)??l,p=ka(l,u,d);c.desiredActorSettingsById.set(e,p);const h=c.actorSettingsById.get(e)??d;if(JSON.stringify(h)!==JSON.stringify(p)){const t=await this.applyLiveActorSettingsUpdate(o,h,p);c.actorSettingsById.set(e,t.applied),t.rejected&&s.push(`${a}/${e}`)}}c.source=r}}}}unregisterLivePrefabInstance(e){if(0!==e.length)for(const[t,a]of this.livePrefabInstances){for(const t of[...a.keys()])(t===e||t.startsWith(e+"/"))&&a.delete(t);0===a.size&&this.livePrefabInstances.delete(t)}}rememberLivePrefabActorSettings(e,t){if(this.assetsService.supportsLivePrefabParameters)for(const a of this.livePrefabInstances.values())for(const s of a.values()){if(!e.startsWith(s.prefix+"/"))continue;const a=e.slice(s.prefix.length+1);s.actorsById.has(a)&&(s.actorSettingsById.set(a,t),s.desiredActorSettingsById.set(a,t))}}async tryApplyLiveParameterUpdate(e,t,a){const s=new Set([...new Set([...Object.keys(t),...Object.keys(a)])].filter(e=>JSON.stringify(t[e])!==JSON.stringify(a[e])));if(0===s.size)return null;const r=await prepareClassParameters(a,null,this.assetsService,this.assetManagerService,this.materializedActors,this.renderingView,[],this.actorProvider,e=>this.prefabInstanceExposedActorMap.get(e)??null,e);return await e.applySceneParameters(r,s)}async applyLiveInnerParameterUpdates(e,t,a){const s=new Map(t.map(e=>[JSON.stringify(e.path),e])),r=new Map(a.map(e=>[JSON.stringify(e.path),e]));if(s.size!==t.length||r.size!==a.length)return{applied:t,hasChanges:!0,rejected:!0};let i=!1,n=!1;const o=[];for(const t of new Set([...s.keys(),...r.keys()])){const a=s.get(t),l=r.get(t);if(JSON.stringify(a?.params??{})===JSON.stringify(l?.params??{})){null!=l&&o.push(l);continue}const c=l?.path??a?.path,u=this.resolveActorComponent(e,c);if(null==u){n=!0,null!=a&&o.push(a);continue}!0===await this.tryApplyLiveParameterUpdate(u,a?.params??{},l?.params??{})?(null!=l&&o.push(l),i=!0):(n=!0,null!=a&&o.push(a))}return{applied:o,hasChanges:i,rejected:n}}resolveActorComponent(e,t){if(null==t||0===t.length)return null;let a=e;for(const e of t){const t=a[e];if(!(t instanceof ve))return null;a=t}return a instanceof ve?a:null}findParent(e){const t=this.dataProvider.getObjects().flatMap(t=>t.id===e.id?null:Xe(t,t=>t.children?.some(t=>t.id===e.id),()=>!0))[0];return null==t?this.scene:null!=t?Ke(this.scene,e=>e.userData?.src?.id===t.id,e=>null!=e.userData?.src)[0]:void 0}fixFogColor(){!0===this.renderingView.options.enableOutlines&&(this.scene.fog.color=new l(this.scene.fog.color))}findMeshWithGeometry(e){let t;return e.traverse(e=>{e instanceof m&&e.geometry&&(t=e)}),t}applyVertexMaterials(e,t){if(null==e.vertexMaterials||0===e.vertexMaterials.length)return;let a=1;for(const t of e.vertexMaterials)a=Math.max(t.w.length,a);const s=He(e.vertexMaterials,e=>e.m);t.traverse(e=>{if(e instanceof m){if(null==e.geometry)return;if(Qa(mt(e,0,!1)),a>0){Qa(mt(e,0,!1))}}});const r=new Set;for(const[e,i]of s.entries()){const s=null!=e?t.getObjectByName(e):this.findMeshWithGeometry(t);let n=!1;if(null==s||null==s.geometry)return void console.warn(`Failed to apply vertex materials on mesh with name "${e}"`);const o=mt(s,0,!0);Qa(o);for(const e of i)o.setX(e.i,e.w[0]??0),o.setY(e.i,e.w[1]??0),o.setZ(e.i,e.w[2]??0),o.setW(e.i,e.w[3]??0),n=!0;if(a>0){const e=mt(s,4,!0);Qa(e);for(const t of i)e.setX(t.i,t.w[4]??0),e.setY(t.i,t.w[5]??0),e.setZ(t.i,t.w[6]??0),e.setW(t.i,t.w[7]??0),e.needsUpdate=!0,n=!0}n&&r.add(e)}this.inEditor&&this.landscapeManagers.filter(t=>t.source.id===e.id).forEach(e=>e.queueRefreshScatter(this.renderingView.camera.position,!0,e=>r.has(e.name)))}async materialize(e,t,a=!1,s){const r=this.getNestedActorId(e.id,s);if(this.idToSceneObject.set(r,e),!this.shouldBeMaterialized(e))return;let i,n;switch(e.type){case"asset_mesh":i=await this.createFromAsset(e),i=function(e){if(null==e)return e;e.updateWorldMatrix(!0,!0);const t=[];e.traverse(e=>{e.isSkinnedMesh&&t.push(e)});let a=e;for(const e of t){const t=Fs(e),s=e.parent;if(null==s){a=t;continue}const r=s.children.indexOf(e);e.removeFromParent(),s.add(t);const i=s.children.indexOf(t);r>=0&&i>=0&&i!==r&&(s.children.splice(i,1),s.children.splice(r,0,t))}return function(e){const t=[];e.traverse(e=>{e.isBone&&t.push(e)});for(const e of t)null!=e.parent&&!e.parent.isBone&&Rs(e)&&e.removeFromParent()}(a),a}(i);break;case"shape_mesh":i=await this.createFromShape(e);break;case"light":i=await this.createLight(e);break;case"particles":i=await this.createParticleSystem(e),e.collisionDetection=!1;break;case"global_fog":this.scene.fog=Ma(e.fog),this.fixFogColor(),i=new p;break;case"sky":this.sky=Pt(),this.updateSky(e),i=this.sky;break;case"world_env":this.updateWorldEnv(e),i=new p,this.worldEnvObj=i;break;case"actor":({object:i,actor:n}=await this.createFromActor(e,s));break;case"group":case"scatter":i=new p;break;case"prefab":i=await this.createFromPrefab(e,s,t);break;case"vfx":i=await this.createFromVfx(e,s);break;default:console.warn(`Failed to materialize object. Unknown type '${e.type}'. This might be because the hology/core library is not compatible with the editor version or because of an error in the scene data. Scene object: id=${e.id}, name=${e.name}`)}if(null==i)return;e.name&&e.name.length>0&&(i.name=e.name),this.applyTransform(e,i),a?i.userData._src=e:i.userData.src=e,null!=n&&(i.userData.actor=n),this.inEditor,this.inEditor,this.objectMap.set(i.uuid,e),this.sceneObjectMap.set(e.id,i),e.physics?.type!==Me.dynamic||null==t||this.inEditor?null==t?this.scene.add(i):null==t||"actor"!==e.type||this.inEditor?t?.add(i):(t.add(i),this.scene?.attach(i),console.log(i)):(t.add(i),i.getWorldPosition(Aa),i.getWorldQuaternion(xa),i.getWorldScale(ja),this.scene.add(i),i.position.copy(Aa),i.quaternion.copy(xa),i.scale.copy(ja)),null!=e.children&&await Promise.all(e.children?.map(e=>this.materialize(e,i,a)));const o=("asset_mesh"===e.type||"shape_mesh"===e.type&&"landscape"!==e.shape)&&e.physics?.type!==Me.dynamic;if(this.inEditor&&o&&!function(e){for(let t=e;null!=t;t=t.parent)if(!0===t.userData.hologyEditorMatrixWorldAutoUpdate)return!0;return!1}(t)?wa(i,!1):this.inEditor||null!=t||"asset_mesh"!=e.type&&"shape_mesh"!==e.type&&"prefab"!==e.type&&"group"!==e.type||"landscape"===e.shape||null!=e.physics?.type&&e.physics.type==Me.dynamic||ma(i),null!=this.renderingView)return this.renderingView.renderer.shadowMap.needsUpdate=!0,i;console.warn("RenderingView not found in materializer")}async handlePaintedScatterSceneMutation(e){const t=this.paintedScatterManager?.referencesSceneObject(e.id)??!1,a=await this.sceneObjectContainsPaintedScatter(e);(t||a)&&await this.refreshPaintedScatterPresence(!1)}async refreshPaintedScatterPresence(e=!1){return await this.sceneContainsPaintedScatter()?(null==this.paintedScatterManager&&(this.paintedScatterManager=new gt(this.scene,this.dataProvider,this.renderingView,this.assetManagerService,this.assetsService)),this.paintedScatterManager.queueRefresh(e),!0):(this.disposePaintedScatterManager(),!1)}disposePaintedScatterManager(){null!=this.paintedScatterManager&&(this.paintedScatterManager.clear(),this.paintedScatterManager.stop(),this.paintedScatterManager=void 0)}async sceneContainsPaintedScatter(){return this.sceneObjectsContainPaintedScatter(this.dataProvider.getObjects())}async sceneObjectsContainPaintedScatter(e,t=[]){for(const a of e??[])if(await this.sceneObjectContainsPaintedScatter(a,t))return!0;return!1}async sceneObjectContainsPaintedScatter(e,t=[]){if("scatter"===e.type&&(e.paintedScatter?.cells?.some(e=>(e.instances?.length??0)>0)||(e.paintedScatter?.palette?.length??0)>0))return!0;if(null!=e.children&&await this.sceneObjectsContainPaintedScatter(e.children,t))return!0;if("prefab"===e.type&&null!=e.assetId){if(t.includes(e.assetId))return!1;const a=this.assets.get(e.assetId)??await this.assetsService.getAsset(e.assetId),s=a?.prefab?.objects;if(null!=s)return this.sceneObjectsContainPaintedScatter(s,[...t,e.assetId])}return!1}async handleSurfaceScatterSceneMutation(e){const t=this.surfaceScatterManager?.referencesSceneObject(e.id)??!1,a=await this.sceneObjectContainsSurfaceScatter(e);(t||a)&&await this.refreshSurfaceScatterPresence(!0)}async refreshSurfaceScatterPresence(e=!1){return await this.sceneContainsSurfaceScatter()?(null==this.surfaceScatterManager&&(this.surfaceScatterManager=new yt(this.scene,this.dataProvider,this.renderingView,this.assetManagerService,this.assetsService)),this.surfaceScatterManager.queueRefresh(e),!0):(this.disposeSurfaceScatterManager(),!1)}disposeSurfaceScatterManager(){null!=this.surfaceScatterManager&&(this.surfaceScatterManager.clear(),this.surfaceScatterManager.stop(),this.surfaceScatterManager=void 0)}async sceneContainsSurfaceScatter(){return this.sceneObjectsContainSurfaceScatter(this.dataProvider.getObjects())}async sceneObjectsContainSurfaceScatter(e,t=[]){for(const a of e??[])if(await this.sceneObjectContainsSurfaceScatter(a,t))return!0;return!1}async sceneObjectContainsSurfaceScatter(e,t=[]){if("asset_mesh"===e.type&&(e.surfaceScatter?.meshes?.length??0)>0)return!0;if(null!=e.children&&await this.sceneObjectsContainSurfaceScatter(e.children,t))return!0;if("prefab"===e.type&&null!=e.assetId){if(t.includes(e.assetId))return!1;const a=this.assets.get(e.assetId)??await this.assetsService.getAsset(e.assetId),s=a?.prefab?.objects;if(null!=s)return this.sceneObjectsContainSurfaceScatter(s,[...t,e.assetId])}return!1}sceneReferencesPrefabAsset(e){const t=(a=[])=>{for(const s of a??[]){if("prefab"===s.type&&s.assetId===e)return!0;if(t(s.children))return!0}return!1};return t(this.dataProvider.getObjects())}async prefabAssetContainsSurfaceScatter(e){return"prefab"===e.type&&null!=e.prefab?.objects&&this.sceneObjectsContainSurfaceScatter(e.prefab.objects,[e.id])}async prefabAssetContainsPaintedScatter(e){return"prefab"===e.type&&null!=e.prefab?.objects&&this.sceneObjectsContainPaintedScatter(e.prefab.objects,[e.id])}applyTransform(e,t){null!=e.position&&t.position.fromArray(e.position),null!=e.scale&&t.scale.fromArray(e.scale),null!=e.rotation&&t.rotation.fromArray(e.rotation)}updateWorldEnv(e){this.renderingView.aoPass.enabled=e.worldEnv.ao.enabled,this.renderingView.aoPass.blendIntensity=e.worldEnv.ao.blendIntensity,this.renderingView.aoPass.updateGtaoMaterial(e.worldEnv.ao);const t=e.worldEnv.toneMapping;null!=t&&(this.renderingView.baseToneMapping=t.mapping??0,this.renderingView.baseToneMappingExposure=t.exposure??1,this.renderingView.renderer.toneMapping=this.renderingView.baseToneMapping,this.renderingView.renderer.toneMappingExposure=this.renderingView.baseToneMappingExposure);const a=e.worldEnv.environment,s=++this.worldEnvironmentRequest;null!=a&&null!=a.textureId?this.assetManagerService.getTexture(this.assets.get(a.textureId)).then(e=>{s===this.worldEnvironmentRequest&&(null!=e?this.renderingView.setWorldEnvironment({source:e,intensity:a.intensity??1}):console.error("Failed to load environment texture with id "+a.textureId))}):this.renderingView.setWorldEnvironment(null)}resetWorldEnv(){this.worldEnvironmentRequest++,this.renderingView.setWorldEnvironment(null),this.renderingView.aoPass.enabled=!1,this.renderingView.aoPass.blendIntensity=1,this.renderingView.aoPass.output=0,this.renderingView.baseToneMapping=0,this.renderingView.baseToneMappingExposure=1,this.renderingView.renderer.toneMapping=this.renderingView.baseToneMapping,this.renderingView.renderer.toneMappingExposure=this.renderingView.baseToneMappingExposure}async updateSky(e){null!=this.sky&&(null==e?.sky?.materialId&&this.sky.material!==It?(this.sky.material=It,this.applySkySettings(this.sky.material)):this.sky.material.userData?.assetId!==e.sky.materialId&&this.updateSkyMaterial(e),null!=e.rotation&&this.sky.rotation.fromArray(e.rotation))}async updateSkyMaterial(e){const t=await this.assetsService.getAsset(e.sky.materialId);if(null==t)return void console.warn(`No material asset found for sky with id ${e.sky.materialId}`);const a=await materialFromAsset(t,this.renderingView,this.assetsService,this.assetManagerService,this.shaders,!1);this.applySkySettings(a),null!=this.sky?this.sky.material=a:console.warn("No sky has been created")}applySkySettings(e){e.side=i.BackSide,(e instanceof w||e instanceof i.MeshBasicMaterial||e instanceof i.ShaderMaterial)&&(e.fog=!1),e.depthTest=!0,e.depthWrite=!1,e.transparent=!0}async createComponent(e,t,a,s){const r=new aa[a.path+"/"+a.className],i=t.id+s;r.id=i,r.object=e;for(const e of a.params)null!=e.value&&(r[e.name]=e.value);return this.components.push(r),i}async createFromActor(e,t){const a=this.actorTypes.find(t=>t.name===e.actor?.type)?.type??be[e.actor?.type];if(null==a)return console.warn(`Failed to materialize actor. No actor class found for type '${e.actor?.type}'.`),{object:null,actor:null};this.inEditor&&this.editorActorParamSnapshot.set(e.id,JSON.stringify(e.actor));const s=await this.actorProvider.create(a,(new D).fromArray(e.position),(new c).fromArray(e.rotation),!0),r=this.getNestedActorId(e.id,t);return s.__netSceneId=r,this.applyInitialMaterializedNetRole(s),this.materializedActors.set(r,s),{object:s?.object,actor:s}}applyInitialMaterializedNetRole(e){if(this.inEditor||this.netMode===Ae.none)return;const t=e.constructor[we];!0!==t?.replicate?this.netMode===Ae.client&&(e.netRole=xe.none):e.netRole=this.netMode===Ae.client?xe.simulatedProxy:xe.authority}getNestedActorId(e,t){return null!=t?t.sceneObjectChain.join("/")+"/"+e:e}async createFromVfx(e,t){const a=await this.assetsService.getAsset(e.assetId);null==a&&console.error("Could not find asset",e);const s=await this.actorProvider.create(he,(new D).fromArray(e.position),(new c).fromArray(e.rotation),!1);try{await s.fromAsset(a)}catch(e){return console.error("Failed to create VFX asset",e),null}return s.play(),this.materializedActors.set(this.getNestedActorId(e.id,t),s),null!=s&&(s.object.userData.actor=s),s?.object}async createFromShape(e){const t=this.inEditor&&e.hidden;let a;if("landscape"==e.shape)a=this.createLandscape(e),a.traverse(e=>{e instanceof m&&this._originalMaterials.set(e.id,e.material)});else{let s=new w({name:"Default",color:new l("#aaaaaa"),visible:this.inEditor||!e.hidden,wireframe:!!t});!0===e.collider&&(s.opacity=.3,s.color.set(2517460),s.transparent=!0);const r=await this.createMeshByShape(e.shape,s,e.shapeParams);r.castShadow=e.castShadow??!0,r.receiveShadow=e.receiveShadow??!1,!1===e.collisionDetection&&(r.collisionShape=null),r.physics=e.physics,a=r,this._originalMaterials.set(a.id,r.material),a.traverse(e=>{})}return t||(await Promise.all((e.materialAssignments??[]).filter(e=>null!=e.materialId).map(e=>this.applyMaterial(a,e))),this.applyVertexMaterials(e,a)),a}createLandscape(e){const t=e.landscape?.options;if(null==t)return console.error(`No landscape options exist on scene object ${e.id} ${e.name}`),new p;const a=ut(e.landscape.options);this.applyHeightMaps(a,e.landscape.heightMaps,!0);const s=new ct(e,this.renderingView,a,this.assetManagerService,this.assetsService,this.shaders,t=>{(e.materialAssignments??[]).filter(e=>null!=e.materialId).forEach(e=>this.applyMaterial(t,e))});return this.landscapeManagers.push(s),s.refreshGeometry(),a}applyHeightMaps(e,t,a=!1){const s=new dt(e.sections);for(const e of t??[]){const t=s.find(e.x,e.y);if(!t)return;const a=t.geometry.getAttribute("position");for(const t of e.points)a.setY(t.i,t.y);a.needsUpdate=!0}const r=e.sections;r.forEach(e=>{e.geometry.computeBoundsTree(),e.geometry.computeVertexNormals()}),this.inEditor&&!a||setTimeout(()=>pt(r),50)}async createMeshByShape(e,t,a={}){if("landscape"!==e&&jt.includes(e)){const s=await prepareShapeParameters(a??{}),r=e+JSON.stringify(a);if(!this.geometryCache.has(r)){const t=xt[e].geometry(s);(function(e){return null!=e.index&&e.hasAttribute("position")&&e.hasAttribute("normal")&&e.hasAttribute("uv")})(t)&&t.computeTangents(),this.geometryCache.set(r,t)}this.collisionShapeCache.has(r)||this.collisionShapeCache.set(r,xt[e].collision(s));return new lt(this.geometryCache.get(r),t,this.collisionShapeCache.get(r))}if(this.inEditor)throw new Error(`Unsupported shape '${e}'`);console.warn(`Failed to create shape. Unsupported shape '${e}'. This might be because the hology/core library is not compatible with the editor version.`)}async createFromAsset(e,t){const a=this.assets.get(e.assetId)??await this.assetsService.getAsset(e.assetId);if(null==a)return void console.warn(`Can not find asset with id ${e.assetId} and name ${e.name}`);let{scene:s}=await this.assetManagerService.getMesh(a,{mergeGeomtries:!0});if(!1!==t?.assignMaterials)try{await Promise.all(Ba(e.materialAssignments,a.materialAssignments).map(e=>this.applyMaterial(s,e,a)))}catch(t){console.error("Failed to apply material"+t,e)}const r=e.receiveShadow??!!a.receiveShadow,i=e.castShadow??!!a.castShadow;return s.receiveShadow=r,na(s,i,r),!1!==e.collisionDetection&&!1!==a.collisionDetection||(s.collisionShapes=[]),null!=e.physics&&!0!==this.inEditor&&(s.physics=e.physics),this.applyVertexMaterials(e,s),s.traverse(e=>{e instanceof m&&"computeBoundsTree"in e.geometry&&null==e.geometry.boundsTree&&e.geometry.computeBoundsTree()}),s.userData.assetId=e.assetId,s.traverse(e=>{if(e instanceof m)for(const t of Ze(e.material))Oe(t,!1)}),s}async createFromPrefab(e,t,a){const s=await this.assetsService.getAsset(e.assetId);if(null==s)return void console.warn(`Can not find asset with id ${e.assetId} and name ${e.name}`);null==t&&(t={sceneObjectChain:[]}),t.sceneObjectChain.push(e.id);const{object:r}=await this.createFromPrefabAsset(s,t,a,e);return t.sceneObjectChain.pop(),r}async createFromPrefabAsset(e,t,a,s,r=!0){this.assets.set(e.id,e);const i=new p;null!=s&&this.applyTransform(s,i),null!=a&&a.add(i),await Promise.all(e.prefab.objects.filter(e=>"global_fog"!==e.type&&"world_env"!==e.type).map(e=>this.materialize(e,i,!0,structuredClone(t))));const n=t.sceneObjectChain.join("/"),o=Array.from(this.materializedActors.entries()).filter(([e,a])=>e.startsWith(n)&&e.split("/").length-1===t.sceneObjectChain.length);o.forEach(e=>{});let l=null;if(null!=e.prefab?.mainActorId){const a=t.sceneObjectChain.join("/")+"/"+e.prefab.mainActorId;l=this.materializedActors.get(a)}r||await this.initActorsPostInit(o);const c=Array.from(this.materializedActors.entries()).filter(([e])=>e.startsWith(n+"/")),u=c.map(([,e])=>e),d=new Map(c.map(([e,t])=>[e.slice(n.length+1),t]));if(this.assetsService.supportsLivePrefabParameters){let t=this.livePrefabInstances.get(e.id);null==t&&(t=new Map,this.livePrefabInstances.set(e.id,t));const a=new Map([...Oa(e.prefab?.objects??[])].map(([t,a])=>[t,Ca(a,s,e.prefab?.mainActorId===t)]));t.set(n,{prefix:n,source:s,actorsById:d,actorSettingsById:a,desiredActorSettingsById:new Map(a)})}if(!this.inEditor&&!0!==t.runtimeSpawn&&ea(e.prefab?.eventGraph)&&this.materializedPrefabEventGraphs.set(n,{id:n,graph:e.prefab.eventGraph,object:i,actors:u,actorsById:d,mainActor:l}),null!=e.prefab?.mainActorId&&null!=s){const a=t.sceneObjectChain.join("/"),s=a+"/"+e.prefab.mainActorId;this.prefabInstanceExposedActorMap.set(a,s)}return{object:i,actors:u,actorsById:d,mainActor:l,instanceId:n}}async createParticleSystem(e){await this.assetsService.getAsset(e.assetId);return new b}async createLight(e){if("point"===e.light.type){const t=new v(e.light.point.color,e.light.point.intensity,Math.max(e.light.point.distance,0),e.light.point.decay);if(t.castShadow=e.light.point.castShadow??!0,t.userData.volumetricIntensity=e.light.point.volumetricIntensity,this.inEditor){const e=(new i.TextureLoader).load("assets/light-bulb-icon.webp"),a=new i.SpriteMaterial({map:e,alphaTest:.5}),s=new Ft(a);s.scale.multiplyScalar(.6),t.add(s)}return t}if("spot"===e.light.type){const t=new i.SpotLight(e.light.spot.color,e.light.spot.intensity,Math.max(e.light.spot.distance,0),e.light.spot.angle,e.light.spot.penumbra,e.light.spot.decay);if(t.castShadow=e.light.spot.castShadow??!0,t.userData.volumetricIntensity=e.light.spot.volumetricIntensity,t.map=await this.loadSpotLightMap(e.light.spot.mapTextureId),t.target=new b,t.target.position.set(0,-1,0),t.add(t.target),this.inEditor){const e=(new i.TextureLoader).load("assets/light-bulb-icon.webp"),a=new i.SpriteMaterial({map:e,alphaTest:.5}),s=new Ft(a);s.scale.multiplyScalar(.6),t.add(s),t.add(new i.SpotLightHelper(t))}return t}if("rectArea"===e.light.type){const t=new i.RectAreaLight(e.light.rectArea.color,e.light.rectArea.intensity,e.scale?e.scale[0]:1,e.scale?e.scale[1]:1);if(this.inEditor){const e=(new i.TextureLoader).load("assets/light-bulb-icon.webp"),a=new i.SpriteMaterial({map:e,alphaTest:.5}),s=new Ft(a);s.scale.multiplyScalar(.6),t.add(s);const r=new qt(t);t.add(r)}return t}return"directional"===e.light.type?(this.applyDirectionalLight(e.light.directional,e),new p):"ambient"===e.light.type?(this.applyDirectionalAmbientLight(null,e.light.ambient,e),new p):void 0}async loadSpotLightMap(e){if(null==e)return null;const t=this.assets.get(e);return null==t||"texture"!==t.type?null:await this.assetManagerService.getTexture(t)}applyDirectionalAmbientLight(e,t,a){const s=this.scene.children.find(e=>e.name===Dt);null!=s?(s.intensity=t.intensity,s.color.set(t.color),s.groundColor.set(t.color),s.userData.src=a,s.userData.volumetricIntensity=t.volumetricIntensity):console.warn("Couldn't find ambient light")}applyDirectionalLight(e,t){for(const a of this.renderingView.csm.lights)a.intensity=e.intensity,a.color.set(e.color),a.castShadow=e.castShadow,a.userData.src=t,a.userData.volumetricIntensity=e.volumetricIntensity;this.renderingView.csm.lightDirection.fromArray(e.direction).normalize()}dispose(){this.editorStaticDisposed=!0,this.disposeEditorStaticDrawSet(),this.editorStaticEditingObjects.clear(),this.editorStaticSelectedObjects.clear(),this.editorStaticObjectsToRebuild.clear(),this.editorStaticDrawSetUpdated$.complete(),this.experimentalStaticDrawSetDisposer?.(),this.experimentalStaticDrawSetDisposer=void 0,this.removePrefabEventGraphs(),this.livePrefabInstances.clear(),this.updateSubscription.unsubscribe(),this.createAssetSubscription.unsubscribe(),this.disposePaintedScatterManager(),this.disposeSurfaceScatterManager(),this.materializedActors.forEach(e=>e.disposed.next(!0)),this.materializedActors.clear()}announcePrefabEventGraphs(e){for(const[t,a]of this.materializedPrefabEventGraphs)(null==e||t===e||t.startsWith(e+"/"))&&(this.announcedPrefabEventGraphs.has(t)||(this.announcedPrefabEventGraphs.add(t),this.prefabEventGraphAdded$.next(a)))}removePrefabEventGraphs(e){const t=[];for(const[a,s]of[...this.materializedPrefabEventGraphs])(null==e||a===e||a.startsWith(e+"/"))&&(t.push(s),this.prefabEventGraphRemoved$.next(s),this.materializedPrefabEventGraphs.delete(a),this.announcedPrefabEventGraphs.delete(a));return t}};ia=e([pe(),t("design:paramtypes",[A,Object,it,rt,Pe,Array,Array,Object,Array])],ia);export{ia as SceneMaterializer};function na(e,t,a){e.castShadow=t,e.receiveShadow=a,e.traverse(e=>{e.castShadow=t,e.receiveShadow=a})}const oa=new Map,la=new Map,ca=new g({color:16711935}),ua=new Map;export async function materialFromAsset(e,t,a,s,r,i=!0){if(null==e||null==e.material)return console.error("Asset or asset material is null",e),ca;const n=JSON.stringify(e.material)+t?._id,o=i&&!("shaderGraph"===e.material.type&&"asset"===e.material.shaderGraph?.source);if(o&&oa.has(n))return oa.get(n);if(o&&la.has(n))return await la.get(n);const l=_materialFromAsset(n,e,t,a,s,r,o);return o?la.set(n,l).get(n):l}export async function _materialFromAsset(e,t,a,r,n,o,c=!0){const u={opacity:t.material.params?.opacity??1,map:null,emissive:t.material.params?.emissive??null,metalness:t.material.params?.metalness??0,flatShading:t.material.params?.flatShading??!1,color:new l(t.material.params?.color),transparent:null!=t.material.params?.opacity&&t.material.params?.opacity<1},d={};if(null!=t.material.params?.map){const e=t.material.params.map,a=await r.getAsset(e);null!=a&&(u.map=await n.getTexture(a))}let p,h,f;switch(t.material.type){case"phong":p=new y({...u,...d});break;case"water":p=wt(u,a);break;case"grassFoliage":p=ht({color:u.color,map:u.map},a);break;case"grass":p=ft({...u,colorTwo:new l(t.material.params.colorTwo),colorThree:new l(t.material.params.colorThree)},a);break;case"shaderGraph":{const e=await async function(e,t){const a=e.material?.shaderGraph;if("local"===a?.source)return a.graph;if("asset"===a?.source){const e=await t.getAsset(a.assetId);return e?.shaderGraph??null}return e.shaderGraph??null}(t,r);if(null==e){console.warn("Missing shader graph for material "+t.name),p=ca;break}"surface"===e.target&&null!=e.materialOptions?.side&&(h=Kt(e.materialOptions.side)),"decal"===e.target?f=!1:null!=e.materialOptions?.transparent&&(f=e.materialOptions.transparent);try{const s=await prepareShaderGraphParameters(t.material?.shaderParams??{},e,r,n,a,o),i=t.shaderGraphPreviewNodeId,l=t.trailBillboard;p=Xt(e,{parameters:s,previewNodeId:i,trailBillboard:l,alphaTest:t.material.alphaTest}),p.userData.customShaderName="asset"===t.material.shaderGraph?.source?`shaderGraph:${t.material.shaderGraph.assetId}`:`shaderGraph:${t.id}`}catch(e){console.warn("Shader graph runtime error: "+e,e),p=ca}break}case"standard":case"unlit":case"toon":case"layered":case"lambert":case"shader":case"landscape":case"landscape-composite":case"decal-unlit":case"decal-standard":case"sprite":const e={standard:sa?Ve:Ue,lambert:Ve,unlit:Be,toon:Wt,layered:Ut,landscape:Ne,"landscape-composite":ze,"decal-unlit":Et,"decal-standard":Ct,sprite:s}[t.material.type]??o.find(e=>e.name==t.material.shader)?.type;if(e){try{let s=new e;const i=await prepareClassParameters(t.material?.shaderParams??{},e,r,n,null,a,o,void 0,void 0,s);Object.assign(s,i),s.alphaTest=t.material.alphaTest??s.alphaTest,p=s.build()}catch(e){console.log("Shader runtime error: "+e,e),ua.has(t.material.shader)||ua.set(t.material.shader,ca.clone()),p=ua.get(t.material.shader)}p.userData.customShaderName=t.material.shader}else console.warn("Missing shader implementation with name "+t.material.shader),p=ca;break;default:throw new Error("Unsupported material type "+t.material.type)}if(a?.csm.setupMaterial(p),p.side=h??t.material.side??p.side??i.FrontSide,p.transparent=(f??t.material.transparent??u.transparent??!1)||p.transparent,p.alphaTest=t.material.alphaTest??p.alphaTest??0,p.userData.receiveDecals=t.material.receiveDecals??!0,null!=t.material.blending&&(p.blending=je[t.material.blending]??i.NormalBlending),!0===t.material.transparent&&(p.depthWrite=!1),t.material.bloom&&(p.userData.hasBloom=!0),t.material.reflective&&(p.userData.reflective=!0),!0===t.material.outlines&&(p.userData.outlineParameters={},null!=t.material.outlineParams&&(null!=t.material.outlineParams.color&&(p.userData.outlineParameters.color=new l(t.material.outlineParams.color).toArray()),null!=t.material.outlineParams.thickness&&(p.userData.outlineParameters.thickness=t.material.outlineParams.thickness),null!=t.material.outlineParams.opacity&&(p.userData.outlineParameters.alpha=t.material.outlineParams.opacity),null!=t.material.outlineParams.colorMode&&(p.userData.outlineParameters.colorMode=t.material.outlineParams.colorMode),null!=t.material.outlineParams.darkening&&(p.userData.outlineParameters.darkening=t.material.outlineParams.darkening))),null!=t.material.surfaceAssetId&&""!==t.material.surfaceAssetId){const e=await materializeDataAssetRef(t.material.surfaceAssetId,r,n,void 0,a,o);null!=e&&(p.userData.surface=e.value)}return p.userData.assetId=t.id,c&&null!=a&&oa.set(e,p),c&&la.delete(e),p}export function prepareCustomParamsFromShaderGraph(e,t={}){return Object.fromEntries((e.parameters??[]).map(e=>{const a=function(e){switch(e){case"float":return St.FloatNode;case"boolean":return St.BooleanNode;case"texture":return St.Sampler2DNode;case"vec2":return St.Vec2Node;case"vec3":return St.Vec3Node;case"vec4":return St.Vec4Node;case"color":return St.RgbNode}}(e.type),s=t[e.name],r=s?.override??null!=s,i=void 0!==e.defaultValue?e.defaultValue:customParameterDefaultValueByType.get(a),n=!1===r?Ua(i):s?.value??Ua(i);return[e.name,{type:a,value:n,override:r}]}))}export async function prepareShaderGraphParameters(e,t,a,s,r,i){const n={},o=prepareCustomParamsFromShaderGraph(t,e);for(const[e,t]of Object.entries(o)){const o=await pa(e,t,a,s,null,r,i);null!=o&&(n[e]=o)}return n}export async function prepareClassParameters(e,t,a,s,r,i,n,o,l,c){const u={},{params:d,skipped:p}=vt(e,{parameterType:t,parameterTarget:c,extractPropertyParameters:$e,toSerializedParamType:toSerializedParamType});for(const e of p)console.warn(`Skipping stored parameter "${e.key}" because it could not be converted from ${St[e.sourceType]} to ${St[e.targetType]}`);for(const[e,t]of Object.entries(d)){if(!1===t.override)continue;const c=await pa(e,t,a,s,r,i,n,o,void 0,void 0,l);null!=c&&(u[e]=c)}return u}export async function prepareShapeParameters(e,t,a){const s={};for(const[r,i]of Object.entries(e)){const e=await pa(r,i,t,a,null,void 0,void 0,void 0,void 0,void 0);null!=e&&(s[r]=e)}return s}const da=new Map;async function pa(e,t,a,s,r,i,n,o,u=t.value,d=t.type,p,h=(t.type===St.Struct?t.struct:void 0)){if(null==t||null==u||""===u)return null;switch(d){case St.Array:if(Array.isArray(u)&&"element"in t)return await Promise.all(u.map(l=>pa(e,t,a,s,r,i,n,o,l,t.element,p,t.elementStruct)));break;case St.Number:case St.FloatNode:let f;if("string"==typeof u?f=parseFloat(u):"number"==typeof u&&(f=u),d===St.FloatNode){if("object"==typeof u&&"a"in u&&"b"in u){const e=u;if(null==e.a)return null;const t="string"==typeof e.a?parseFloat(e.a):e.a;if(null==e.b)return t;const a="string"==typeof e.b?parseFloat(e.b):e.b,s=function(e){let t=da.get(e);return null==t&&(t=Ee(Ot.decode(e)),da.set(e,t)),t}(e.easing),r=s.sample(Ce(ke.energy));return W(U(t),U(a),r)}return new X(qe(e),f,void 0,!1)}return f;case St.Texture:let m=await s.getTexture(await a.getAsset(u));return"envmap"===e.toLowerCase()&&null!=i&&(m=i.getEnvTexture(m)),m;case St.Sampler2DNode:const g=await a.getAsset(u);if(null!=g?.texture?.textureArrayFileKey){const{texture:t,layerIndex:a}=await s.getTextureArray(g);if(t&&null!=a)return new K(null,t,new X(qe(e)+"_i",a,void 0,!1))}const y=await s.getTexture(g);return y?Q(y):null;case St.Boolean:return u;case St.BooleanNode:return new Z(qe(e),u,void 0,!1);case St.Vector2:case St.Vec2Node:if("object"==typeof u){const t=u instanceof Array?(new j).fromArray(u):new j(u.x,u.y);return d===St.Vec2Node?new ee(qe(e),t,void 0,!1):t}return null;case St.Vector3:case St.Vec3Node:if("object"==typeof u){const t=u instanceof Array?(new D).fromArray(u):new D(u.x,u.y,u.z);return d===St.Vec3Node?new te(qe(e),t,void 0,!1):t}return null;case St.Vector4:case St.Vec4Node:if("object"==typeof u){const t=u instanceof Array?(new P).fromArray(u):new P(u.x,u.y,u.z,u.w);return d===St.Vec4Node?new ae(qe(e),t,void 0,!1):t}return null;case St.Color:case St.RgbNode:const w=new l(u);return d===St.RgbNode?new te(qe(e),new D(w.r,w.g,w.b),void 0,!1).rgb:w;case St.String:return u;case St.BaseActor:const S=u;if(null==r&&console.warn("Class parameters can not be prepared as actors are not passed in"),null==S)return null;if("object"==typeof S&&null!=S.type&&null!=S.id){if("actor"===S.type)return r?.get(S.id)??null;if("prefab"===S.type){const e=p?p(S.id):null;if(null!=e)return r?.get(e)??null;const t=[];for(const[e,a]of r?.entries()??[])e.startsWith(S.id+"/")&&t.push(a);return 1===t.length?t[0]:null}}if("string"==typeof S){const e=r?.get(S);if(null!=e)return e;const t=p?p(S):null;if(null!=t)return r?.get(t)??null;const a=[];for(const[e,t]of r?.entries()??[])e.startsWith(S+"/")&&a.push(t);return 1===a.length?a[0]:null}return null;case St.Euler:const b=u;return(new c).fromArray(b);case St.Object3D:{const e=await a.getAsset(u),t=(await s.getMesh(e,{applyMaterials:!0,rescale:!0,mergeGeomtries:!0})).scene;return t.userData.vfxIncludeRootTransform=!0,t}case St.Material:{if(null==u)return null;const e=await a.getAsset(u);return null==e?(console.warn("Material asset not found for material parameter",u),null):null==e.material?(console.warn("Using a non-material asset for material parameter"),null):await materialFromAsset(e,i,a,s,n)}case St.AudioBuffer:return await s.getAudio(await a.getAsset(u));case St.VisualEffect:const v=await a.getAsset(u);if(null==o){console.error("Can not create instance of visual effect because missing actor provider");break}if("vfx"in v)return new fe(o,v);console.error("Using a non-vfx asset for visual effect parameter");break;case St.Prefab:{const e=await a.getAsset(u);return null==e?(console.error("Using a non-prefab asset for prefab parameter",u),null):new me(e)}case St.PrefabActor:{const e=await a.getAsset(u);return null==e?(console.error("Using a non-prefab asset for prefab parameter",u),null):new ge(new me(e))}case St.DataAsset:return materializeDataAssetRef(u,a,s,r,i,n,o,p);case St.Sequence:{if("string"!=typeof u)return console.warn("Invalid sequence parameter value",u),null;const e=await a.getAsset(u);if("sequence"===e?.type&&"sequence"in e)return new Ht(e.sequence);console.error("Using a non-sequence asset for sequence parameter");break}case St.SequenceData:return Qt(u)?u:(console.warn("Invalid inline sequence data parameter value",u),null);case St.Struct:return async function(e,t,a,s,r,i,n,o,l){const c=ha(e),u=c?.struct??t;if(null==u)return console.warn("Missing parameter definition id for struct parameter"),null;const d=Re(u);if(null==d)return console.warn(`Unknown parameter definition "${u}"`),null;if(Le(u))return console.warn(`Can not instantiate abstract parameter definition "${u}"`),null;if(null!=t&&u!==t&&!Je(u,t))return console.warn(`Parameter definition "${u}" is not assignable to "${t}"`),null;let p;try{p=new d}catch(e){return console.warn(`Failed to instantiate parameter definition "${u}"`,e),null}const h=function(e){const t=ha(e);if(null!=t)return t.value;if(fa(e))return e;if(null!=e&&"object"==typeof e&&fa(e.params))return e.params;return{}}(c?.value??e),f=await prepareClassParameters(h,null,a,s,r,i,n,o,l,p);return Object.assign(p,f),p}(u,h,a,s,r,i,n,o,p);case St.Curve:return Ot.decode(u);case St.ColorLayer:case St.MaskLayer:if(Bt(u)){const e=await Tt.decode(u,async e=>await s.getTexture(await a.getAsset(e))),t=await prepareClassParameters(u.params,null,a,s,void 0,void 0,void 0,void 0,void 0,e);return Object.assign(e,t),e}return console.warn("Expecting color layer but got",u),null;case St.AnimationClip:{const e="string"==typeof u?u:"object"==typeof u&&null!=u?u.assetId:null;if(null==e)return console.warn("Invalid animation clip asset id value",u),null;return await s.getAnimationClip(await a.getAsset(e))}}return null}export async function materializeDataAssetRef(e,t,a,s,r,i,n,o){const l="string"==typeof e?e:null!=e&&"object"==typeof e?e.assetId??e.id:null;if(null==l||""===l)return null;const c=await t.getAsset(l);if(null==c)return console.warn(`Data asset "${l}" was not found`),null;if("data"!==c.type||null==c.dataAsset)return console.warn("Using a non-data asset for data asset parameter",l),null;const u=c.dataAsset.definition;if(null==u||""===u)return console.warn(`Missing data asset definition id for asset "${c.id}"`),null;if(_e(u))return console.warn(`Can not instantiate abstract data asset definition "${u}"`),null;const d=Fe(u);if(null==d)return console.warn(`Unknown data asset definition "${u}"`),null;let p;try{p=new d}catch(e){return console.warn(`Failed to instantiate data asset definition "${u}"`,e),null}const h=c.dataAsset.params??{};if("object"!=typeof h||Array.isArray(h))return console.warn(`Invalid data asset params for asset "${c.id}"`),null;try{const e=await prepareClassParameters(h,null,t,a,s,r,i,n,o,p);Object.assign(p,e)}catch(e){return console.warn(`Failed to materialize data asset "${c.id}"`,e),null}return new ye(c,p)}function ha(e){return null!=e&&"object"==typeof e&&!Array.isArray(e)&&"string"==typeof e.struct&&fa(e.value)?e:null}function fa(e){return null!=e&&"object"==typeof e&&!Array.isArray(e)&&Object.values(e).every(e=>null!=e&&"object"==typeof e&&"type"in e)}function ma(e){e.updateWorldMatrix(!0,!0),e.updateMatrix(),e.traverse(e=>{e.matrixAutoUpdate=!1,e.matrixWorldNeedsUpdate=!1});const t=e.updateMatrixWorld;e.updateMatrixWorld=function(){t.apply(e),e.updateMatrixWorld=function(){}}}function ga(){}const ya=new WeakMap;function wa(e,t){if(t)return e.userData.hologyEditorMatrixWorldAutoUpdate=!0,void e.traverse(e=>{const t=ya.get(e);if(null!=t){e.updateMatrixWorld=t.updateMatrixWorld;for(const[e,a]of t.matrixAutoUpdate)e.matrixAutoUpdate=a}});const a=[];e.traverse(e=>{ya.has(e)&&a.push(e)}),0===a.length&&a.push(e);for(const e of a)Sa(e);delete e.userData.hologyEditorMatrixWorldAutoUpdate}function Sa(e){const t=ya.get(e);if(e.updateMatrix(),e.updateWorldMatrix(!0,!0),null==t){const t=new Map;e.traverse(e=>{t.set(e,e.matrixAutoUpdate)}),ya.set(e,{updateMatrixWorld:e.updateMatrixWorld,matrixAutoUpdate:t})}e.traverse(e=>{e.matrixAutoUpdate=!1,e.matrixWorldNeedsUpdate=!1}),e.updateMatrixWorld=ga}function ba(e,t=!1){return Array.isArray(e)?e.every(e=>ba(e,t)):t||!e.transparent&&!va(e)}function va(e){return e instanceof R&&(null!=e.uniforms[ta]||null!=e.uniforms.hology_scene_map)}function Ma(e){return"linear"===e.type?new u(new l(e.color),e.near??100,e.far??1e3):"density"===e.type?new d(e.color,e.density):void console.warn("Invalid fog type",e)}const Aa=new D,xa=new M,ja=new D;new w({color:4229780});async function Da(e,t,a,s){null==s&&(s=(new f).identity());const r=s.clone().multiply(Pa(e,new i.Matrix4));if(null!=e.children&&e.children.length>0)for(let a=e.children.length-1;a>=0;a--)await Da(e.children[a],t,e,r);await t(e,a,s)}function Pa(e,t){return null==e.position||null==e.rotation||null==e.scale?t.identity():t.compose((new D).fromArray(e.position),(new M).setFromEuler((new c).fromArray(e.rotation)),(new D).fromArray(e.scale))}export function toSerializedParamType(e){if(null==e)return;const t=e.constructor.prototype;return t instanceof Number||e===Number?St.Number:t instanceof $||"function"==typeof e.prototype.isFloat?St.FloatNode:t instanceof x||e===x||e.isTexture?St.Texture:t instanceof Te||e===Te||e===Y||"function"==typeof e.prototype?.isSampler2D||!0===e.prototype?.isSampler2D?St.Sampler2DNode:t instanceof Boolean||e===Boolean?St.Boolean:t instanceof z?St.BooleanNode:t instanceof l||e==l?St.Color:t instanceof G||"function"==typeof e.prototype.isRgb?St.RgbNode:t instanceof j||e==j?St.Vector2:t instanceof oe||"function"==typeof e.prototype.isVec2?St.Vec2Node:t instanceof D||e==D?St.Vector3:t instanceof ce||"function"==typeof e.prototype.isVec3?St.Vec3Node:t instanceof P||e==P?St.Vector4:t instanceof de||"function"==typeof e.prototype.isVec4?St.Vec4Node:t instanceof String||e===String?St.String:t instanceof Se||e==Se||e.prototype instanceof Se||e.prototype==Se?St.BaseActor:t instanceof c||e==c?St.Euler:t instanceof b||e==b?St.Object3D:t instanceof h||e==h?St.Material:t instanceof AudioBuffer||e==AudioBuffer?St.AudioBuffer:t instanceof fe||e==fe?St.VisualEffect:t instanceof me||e==me?St.Prefab:t instanceof ge||e==ge?St.PrefabActor:t instanceof ye||e==ye?St.DataAsset:t instanceof Ot||e==Ot?St.Curve:t instanceof Tt||e==Tt?St.ColorLayer:t instanceof Nt||e==Nt?St.MaskLayer:t instanceof i.AnimationClip||e==i.AnimationClip?St.AnimationClip:t instanceof Ht||e==Ht?St.Sequence:"SequenceData"===e.name||e.prototype&&"tracks"in e.prototype?St.SequenceData:null!=We(e)?St.Struct:void console.warn("Failed to map parameter type to serialized version",{type:e})}export function getCustomParamTypeInfo(e){const t=e.type===Object?void 0:toSerializedParamType(e.type),a=t===St.Struct?We(e.type):void 0;return!0===e.options.array?{type:St.Array,element:t,...null!=a?{elementStruct:a}:{}}:{type:t,...null!=a?{struct:a}:{}}}export function prepareCustomParams(e,t,a={},s={}){return Object.fromEntries(e.map(e=>{const r=getCustomParamTypeInfo(e);let i=r;const n=t[e.name],o=Ia(n)?n:void 0,l=!0===s.treatAllAsOptional||!0===e.options.optional,c=s.missingOverrideDefaultsToOverride??!0;let u=o?.override;void 0===u&&null!=n&&l&&c&&(u=!0),void 0===u&&l&&(u=!1);const d=void 0!==a[e.name]||void 0!==e.options.defaultValue,p=function(e,t){if(null==e.type){const a=function(e){return Qt(e)?{type:St.SequenceData}:void 0}(t);null!=a&&(e=a)}if(e.type!==St.Struct)return{typeInfo:e,value:t};const a=ha(t);if(null==a)return{typeInfo:e,value:t};return{typeInfo:{...e,struct:a.struct},value:a.value}}(i,function(e,t){if(void 0!==t[e.name])return t[e.name];if(void 0!==e.options.defaultValue){const t=serializeCustomParameter(e.type,e.options.defaultValue);return void 0!==t?t:e.options.defaultValue}const a=toSerializedParamType(e.type);if(a===St.Struct)return Le(e.type)?{}:prepareCustomParamsFromType(e.type,{});return customParameterDefaultValueByType.get(a)}(e,a)),h=function(e,t){if(Ia(e))return e;if(t.type!==St.SequenceData||!Qt(e))return;return{type:St.SequenceData,value:e}}(n,p.typeInfo);i=function(e,t,a){if(e.type!==St.Struct||a?.type!==St.Struct||null==a.struct)return e;const s=t.struct??e.struct;if(null==s||a.struct===s||Je(a.struct,s)||null==Re(a.struct))return{...e,struct:a.struct};return e}(p.typeInfo,r,h);const f=!1!==u||e.options.array?h?.value??function(e,t,a){if(!0===e.options.array)return a?Ua(t):[];return Ua(t)}(e,p.value,d):Ua(p.value),m=function(e,t,a){if(t.type===St.Struct){if(null!=t.struct&&Le(t.struct))return a;const s=null!=t.struct?Re(t.struct):e.type;return null!=s&&fa(a)?prepareCustomParamsFromType(s,a):a}if(t.type!==St.Array||t.element!==St.Struct||!Array.isArray(a))return a;const s=null!=t.elementStruct?Re(t.elementStruct):e.type;return a.map(e=>{const a=ha(e),r=a?.struct??t.elementStruct;if(null!=r&&Le(r))return e;const i=null!=a?Re(a.struct):s,n=a?.value??(fa(e)?e:null);if(null==i||null==n)return e;const o=prepareCustomParamsFromType(i,n);return null!=a?{struct:a.struct,value:o}:o})}(e,i,f);return[e.name,{...i,value:m,override:u}]}))}function Ia(e){return null!=e&&"object"==typeof e&&!Array.isArray(e)&&"number"==typeof e.type&&"value"in e}function Oa(e){const t=new Map,a=e=>{for(const s of e)"actor"===s.type&&null!=s.actor&&t.set(s.id,s.actor),null!=s.children&&a(s.children)};return a(e),t}function Ea(e){const t=new Map,a=e=>{for(const s of e)"prefab"===s.type&&t.set(s.id,s),null!=s.children&&a(s.children)};return a(e),t}function Ca(e,t,a){if(!a||"prefab"!==t?.type||null==t.prefab)return e;const s=new Map((e.innerParams??[]).map(e=>[JSON.stringify(e.path),{path:e.path,params:{...e.params}}]));for(const e of t.prefab.innerParams??[]){const t=JSON.stringify(e.path),a=s.get(t);s.set(t,{path:e.path,params:{...a?.params??{},...Va(e.params)}})}return{...e,params:{...e.params??{},...Va(t.prefab.params)},innerParams:[...s.values()]}}function ka(e,t,a){const s=new Map((e.innerParams??[]).map(e=>[JSON.stringify(e.path),e])),r=new Map((t.innerParams??[]).map(e=>[JSON.stringify(e.path),e])),i=new Map((a.innerParams??[]).map(e=>[JSON.stringify(e.path),e])),n=[];for(const e of new Set([...s.keys(),...r.keys(),...i.keys()])){const t=s.get(e),a=r.get(e),o=i.get(e),l=Ta(t?.params??{},a?.params??{},o?.params??{});Object.keys(l).length>0&&n.push({path:a?.path??o?.path??t.path,params:l})}return{...t,params:Ta(e.params??{},t.params??{},a.params??{}),innerParams:n}}function Ta(e,t,a){const s={};for(const r of new Set([...Object.keys(e),...Object.keys(t),...Object.keys(a)]))JSON.stringify(a[r])!==JSON.stringify(e[r])?null!=a[r]&&(s[r]=a[r]):null!=t[r]&&(s[r]=t[r]);return s}function Va(e){return null==e?{}:Object.fromEntries(Object.entries(e).filter(([,e])=>function(e){return!0===e?.override}(e)))}function za(e,t){return e.length>=t.length&&t.every((t,a)=>e[a]===t)}export function prepareCustomParamsFromType(e,t,a=null,s={}){const r=$e(e);if(0===r.length)return{};let i;null!=a?De(a,()=>{i=a.get(e)}):i=new e;const n={};for(const e of r){const t=i[e.name];if(null!=t){const a=Na(e,t);void 0!==a&&(n[e.name]=a)}}return prepareCustomParams(r,t,n,s)}function Na(e,t){return!0===e.options.array?Array.isArray(t)?t.map(t=>serializeCustomParameter(e.type,t)??t):[]:serializeCustomParameter(e.type,t)}function Ua(e){return null==e?e:Array.isArray(e)?e.map(e=>Ua(e)):"object"==typeof e?"function"==typeof structuredClone?structuredClone(e):JSON.parse(JSON.stringify(e)):e}export function serializeCustomParameter(e,t){function a(){console.error("Failed to serialize value",{type:e,value:t})}switch(e){case Number:case Boolean:return t;case j:return t instanceof j?t.toArray():void a();case D:return t instanceof D?t.toArray():void a();case P:return t instanceof P?t.toArray():void a();case l:return t instanceof l?"#"+t.getHexString():"string"==typeof t?t:"number"==typeof t?"#"+new l(t).getHexString():void a();case String:return t;case c:return t instanceof c?t.toArray():void a();case me:return t instanceof me?t.asset?.id??null:void a();case ye:return t instanceof ye?t.id:"string"==typeof t?t:void a()}const s=We(e);if(null!=s){const r=ha(t);if(null!=r)return r.struct===s?r.value:r;const i=function(e,t){if(null==t||"object"!=typeof t)return e;const a=t.constructor;return null!=We(a)&&Ge(a,e)?a:e}(e,t),n=We(i),o=function(e,t){if(null==t)return null;if(fa(t))return t;if(null!=t&&"object"==typeof t&&fa(t.params))return t.params;if("object"!=typeof t)return;const a=$e(e),s={};for(const e of a){const a=t[e.name];if(void 0===a)continue;const r=Na(e,a);void 0!==r&&(s[e.name]=r)}return prepareCustomParams(a,{},s)}(i,t);return void 0!==o?null!=o&&null!=n&&n!==s?{struct:n,value:o}:o:void a()}if(Qt(t))return t}function Ba(e,t){return function(e,t,a){const s=[],r=new Set;for(const i of[...e??[],...t??[]]){const e=a(i);r.has(e)||(r.add(e),s.push(i))}return s}((e??[]).filter(e=>$a(e.materialId)),(t??[]).filter(e=>$a(e.materialId)),e=>e.color+e.name)}function $a(e){return"null"!=e&&null!=e}export const customParameterDefaultValueByType=new Map([[St.RgbNode,"#000000"],[St.Color,"#000000"],[St.String,""],[St.Vector4,[0,0,0,0]],[St.Vec4Node,[0,0,0,0]],[St.Vector3,[0,0,0]],[St.Vec3Node,[0,0,0]],[St.Vector2,[0,0]],[St.Vec2Node,[0,0]],[St.Euler,[0,0,0,"XYZ"]],[St.Array,[]],[St.DataAsset,null],[St.SequenceData,Yt()],[St.ColorLayer,Vt],[St.MaskLayer,zt]]);let Fa=new l;new l;function Wa(e){return null==e?.color?null:(Fa.set(e.color),"#"+Fa.getHexString())}function Ra(e,t,a,s){const r="string"==typeof t.name&&""!==t.name?t.name:null;if(null!=r)return e.name===r||s===r;const i=Wa(e);return null!=i&&(i===t.color||a===t.color)}export function applyMaterial(e,t,a,s,r={}){const n=[];return e.traverse(async e=>{if(e instanceof m||e.isMesh||e instanceof i.SkinnedMesh||e.isSkinnedMesh)for(const t of Ze(e.material))t.hasOwnProperty("color")&&n.push(e)}),Promise.all(n.map(async e=>{if(e.material instanceof Array)for(let i=0;i<e.material.length;i++){const n=e.material[i];if(null==n.color||!(n.color instanceof l))continue;const o=Wa(n),c=n.name;if(Ra(n,t,e.userData["originalColor_"+i],e.userData["originalMaterialName_"+i])){const n=La(await a(t.materialId),r.textureFlipY),l=e.material[i];null!=n&&l.id!=n.id&&(e.material[i]=n,e.userData["originalColor_"+i]=e.userData["originalColor_"+i]??o,e.userData["originalMaterialName_"+i]=e.userData["originalMaterialName_"+i]??c,null!=s&&s.set(e.id+"#"+i,l))}}else if("color"in e.material){const i=e.material,n=Wa(i),o=i.name;if(Ra(i,t,e.userData.originalColor,e.userData.originalMaterialName)){const i=La(await a(t.materialId),r.textureFlipY),l=e.material;null!=i&&(e.material=i,e.userData.originalColor=e.userData.originalColor??n,e.userData.originalMaterialName=e.userData.originalMaterialName??o,null!=s&&(s.has(e.id)||s.set(e.id,l)))}}}))}const _a=new WeakMap;export function getConvertedFbxToGlbAssignedMaterialTextureFlipY(e){const t=e?.mesh?.uvConversion;return"fbx2gltf"===t?.source?!0!==t.flipV&&void 0:!function(e){return"glb"===e?.fileFormat&&!0===e.originalFileKey?.toLowerCase().endsWith(".fbx")}(e)&&void 0}function La(e,t){if(null==e||null==t||!function(e,t){return function(e){const t=[];for(const[a,s]of Object.entries(e))Ja(a,s)&&t.push(s);if(e instanceof i.ShaderMaterial)for(const[a,s]of Object.entries(e.uniforms))Ja(a,s.value)&&t.push(s.value);return t}(e).some(e=>e.flipY!==t)}(e,t))return e;let a=_a.get(e);null==a&&(a=new Map,_a.set(e,a));const s=a.get(t);if(null!=s)return s;const r=Ga(e);if(function(e,t){for(const a of Object.keys(e)){const s=e[a];Ja(a,s)&&(e[a]=qa(s,t))}}(r,t),r instanceof i.ShaderMaterial){for(const[e,a]of Object.entries(r.uniforms))Ja(e,a.value)&&(a.value=qa(a.value,t));r.uniformsNeedUpdate=!0}return r.needsUpdate=!0,a.set(t,r),r}function Ga(e){const t=e.clone();return t.userData={...e.userData??{}},t}function Ja(e,t){const a=t;return(t instanceof x||!0===a?.isTexture)&&!e.toLowerCase().includes("envmap")&&!0!==a.isCompressedTexture&&!0!==a.isCompressedArrayTexture}function qa(e,t){if(e.flipY===t)return e;const a=e.clone();return a.flipY=t,a.userData={...e.userData??{}},a.needsUpdate=!0,a}function Ya(e,t){if(e instanceof i.ShaderMaterial&&t instanceof i.ShaderMaterial){return e.fragmentShader+e.vertexShader==t.fragmentShader+t.vertexShader&&function(e,t){if(e instanceof i.ShaderMaterial&&t instanceof i.ShaderMaterial){for(const a in e.uniforms){if(null==t.uniforms[a])return!1;if(t.uniforms[a].value!==e.uniforms[a].value)return!1}return!0}return!1}(e,t)}return!1}function Qa(e){if(null!=e){for(let t=0;t<e.array.length;t++)e.setX(t,0);e.needsUpdate=!0}}function Ha(e,t){const a=et(e);return null==a?"":function(e,t){const a=Ds(e,t),s=a.sort().map(t=>{const a=e.getAttribute(t);if(null!=a){const e=a.array??a.data?.array,s=e?.constructor?.name??"";return`${t}:${a.itemSize}:${a.normalized?1:0}:${s}`}const s=function(e,t){if("uv"===t&&es(e))return{itemSize:2,normalized:!1,arrayType:"Float32Array"};throw new Error(`Unsupported synthetic batching geometry attribute: ${t}`)}(e,t);return`${t}:${s.itemSize}:${s.normalized?1:0}:${s.arrayType}`}).join(",");return`${null!=e.index?"indexed":"nonindexed"}|${s}`}(a.geometry,t)}function Za(e,t){const a=Ds(e,t);if(a.length===Object.keys(e.attributes).length)return e;const s=new o;s.name=e.name;const r=e.getIndex();null!=r&&s.setIndex(r);for(const t of a)s.setAttribute(t,Ka(e,t));for(const t of e.groups)s.addGroup(t.start,t.count,t.materialIndex);return s.setDrawRange(e.drawRange.start,e.drawRange.count),null!=e.boundingBox&&(s.boundingBox=e.boundingBox.clone()),null!=e.boundingSphere&&(s.boundingSphere=e.boundingSphere.clone()),s.userData=e.userData,s}const Xa=new WeakMap;function Ka(e,t){return e.getAttribute(t)??function(e,t){if("uv"===t)return function(e){let t=Xa.get(e);const a=e.getAttribute("position");if(null==a)throw new Error("Can not create synthetic batching UVs without a position attribute");null!=t&&t.count===a.count||(t=new i.Float32BufferAttribute(new Float32Array(2*a.count),2),Xa.set(e,t));return t}(e);throw new Error(`Unsupported synthetic batching geometry attribute: ${t}`)}(e,t)}function es(e){return null!=e.getAttribute("position")}const ts=new WeakMap,as="hbat_",ss=new Set(["ambientLightColor","cameraNear","directionalLightShadows","directionalLights","directionalShadowMap","directionalShadowMatrix","fogColor","fogDensity","fogFar","fogNear","hemisphereLights","lightProbe","ltc_1","ltc_2","pointLightShadows","pointLights","pointShadowMap","pointShadowMatrix","receiveShadow","rectAreaLights","shadowFar","spotLightMap","spotLightMatrix","spotLightShadows","spotLights","spotShadowMap"]);function rs(e){let t=ts.get(e);return null==t&&(t=function(e){let t=e.type;if(e instanceof R)t+=function(e){let t="nodeShader";t+=function(e){if(null==e)return"";let t="";for(const a of Object.keys(e).sort())t+=`${a}:${String(e[a])};`;return t}(e.defines),t+=e.lights?"lights":"",t+=e.fog?"fog":"";for(const a of Object.keys(e.uniforms).sort()){if(os(a))continue;const s=e.uniforms[a]?.value;cs(s)||(t+=`u:${a}:${ms(s)};`)}return t+=ns(e.vertexShader),t+=ns(e.fragmentShader),t}(e);else if(e instanceof i.MeshStandardMaterial&&!(e instanceof i.MeshPhysicalMaterial)||(t+=e.id+""),(e instanceof i.MeshBasicMaterial||e instanceof i.MeshLambertMaterial||e instanceof w||e instanceof y)&&(null!=e.map&&(t+="c"+e.map?.id),null!=e.aoMap&&(t+="o"+e.aoMap?.id),null!=e.lightMap&&(t+="l"+e.lightMap?.id),null!=e.envMap&&(t+="v"+e.envMap?.id),null!=e.alphaMap&&(t+="a"+e.alphaMap?.id)),e instanceof w&&(null!=e.normalMap&&(t+="n"+e.normalMap?.id),null!=e.roughnessMap&&(t+="r"+e.roughnessMap?.id),null!=e.metalnessMap&&(t+="m"+e.metalnessMap?.id),null!=e.emissiveMap&&(t+="e"+e.emissiveMap?.id)),e instanceof i.MeshPhysicalMaterial&&(null!=e.sheenColorMap&&(t+="sc"+e.sheenColorMap?.id),null!=e.sheenRoughnessMap&&(t+="sr"+e.sheenRoughnessMap?.id)),(e instanceof g||e instanceof y)&&null!=e.specularMap&&(t+="s"+e.specularMap?.id),e instanceof i.MeshToonMaterial&&(null!=e.map&&(t+="c"+e.map?.id),null!=e.aoMap&&(t+="o"+e.aoMap?.id),null!=e.lightMap&&(t+="l"+e.lightMap?.id),null!=e.alphaMap&&(t+="a"+e.alphaMap?.id)),e instanceof _t&&null!=e.heightMap&&(t+="h"+e.heightMap?.id),e instanceof i.ShaderMaterial){t+=e.vertexShader,t+=e.fragmentShader;for(const a in e.uniforms){const s=e.uniforms[a];s&&s.value&&s.value.isTexture&&null!=s.value.id&&(t+="t:"+a+":"+s.value.id)}}null!=e.userData.outlineParameters&&(t+=e.userData.outlineParameters.color,t+=e.userData.outlineParameters.thickness,t+=e.userData.outlineParameters.alpha,t+=e.userData.outlineParameters.colorMode,t+=e.userData.outlineParameters.darkening);return t+=`side:${e.side};shadowSide:${e.shadowSide??"auto"};`,t+=e.transparent?"t":"",t+=e.vertexColors?"vc":"",t+=e.depthWrite?"dw":"",t+=e.depthTest?"dt":"",t+=`alphaTest:${e.alphaTest>0};`,t}(e),ts.set(e,t)),t}const is=new Map;function ns(e){return is.has(e)||is.set(e,`shader_${is.size}`),is.get(e)}function os(e){return ss.has(e)||e.startsWith("hology_")}function ls(e,t){return e instanceof R?e.uniforms[t]?.value:e[t]}function cs(e){return"number"==typeof e||e instanceof j||e instanceof D||e instanceof P||e instanceof l}function us(e){return"number"==typeof e?1:e instanceof j?2:4}function ds(e,t){const a=e.replace(/[^A-Za-z0-9_]/g,"_");let s=as+a;for(;t.has(s);)s=as+s;return t.add(s),s}function ps(e,t){const a={};for(const[s,r]of Object.entries(e.uniforms))t.has(s)||(a[s]={value:r.value});return a}const hs=new WeakMap;let fs=1;function ms(e){if(null==e)return"null";if(e instanceof x||!0===e?.isTexture)return`texture:${e.id}`;if(e instanceof i.Matrix3||e instanceof i.Matrix4)return e.toArray().join(",");if("boolean"==typeof e||"number"==typeof e||"string"==typeof e)return String(e);if(Array.isArray(e)&&e.every(e=>null==e||["boolean","number","string"].includes(typeof e)))return JSON.stringify(e);if("object"==typeof e){let t=hs.get(e);return null==t&&(t=fs++,hs.set(e,t)),`object:${t}`}return String(e)}function gs(e,t){if(null==e)return null;if(!(e instanceof t))throw new Error(`Value is not an instance of ${t.name}`);return e}const ys=new f,ws=new c;function Ss(e,t){return ws.copy(e),ws.x*=-1,ws.y*=-1,ws.z*=-1,t.isCubeTexture&&!1===t.isRenderTargetTexture&&(ws.y*=-1,ws.z*=-1),(new i.Matrix3).setFromMatrix4(ys.makeRotationFromEuler(ws))}function bs(e,t){switch(t){case 0:return e.x;case 1:return e.y;case 2:return e.z;case 3:return e.w}}const vs=new P;function Ms(e,t){return e===t||null==e==(null==t)&&("number"==typeof e&&"number"==typeof t?e===t||isNaN(e)&&isNaN(t):e instanceof i.Color&&t instanceof i.Color?e.r===t.r&&e.g===t.g&&e.b===t.b:e instanceof j&&t instanceof j?e.x===t.x&&e.y===t.y:e instanceof D&&t instanceof D?e.x===t.x&&e.y===t.y&&e.z===t.z:e instanceof P&&t instanceof P&&(e.x===t.x&&e.y===t.y&&e.z===t.z&&e.w===t.w))}function As(e){const t=[];for(const[a,s]of Object.entries(e))s instanceof fe?t.push(s):s instanceof ve&&t.push(...As(s));return t}function xs(e,t){const a=e=>{const s=e.output;switch(s.type){case"sprite":case"stretchedSprite":t.add(s.texture);break;case"trail":null!=s.texture&&t.add(s.texture);break;case"decal":t.add(s.colorMap),t.add(s.alphaMap)}e.children?.forEach(a)};e.vfx.emitters.forEach(a)}const js=new WeakMap;function Ds(e,t){const a=Object.keys(e.attributes).filter(a=>Ps(e,t,a));return!e.hasAttribute("uv")&&es(e)&&Ps(e,t,"uv")&&a.push("uv"),a}function Ps(e,t,a){return"position"===a||("uv"===a?function(e){if(e instanceof R)return Os(e,"uv");if(e instanceof i.ShaderMaterial)return Es(e.vertexShader,"uv");if(e instanceof _t&&null!=e.heightMap)return!0;return Is.some(t=>e[t]?.isTexture)}(t):t instanceof R?Os(t,a):t instanceof i.ShaderMaterial?function(e,t){if("uv1"===t||"uv2"===t||"uv3"===t)return Es(e.vertexShader,t);return!0}(t,a):"uv1"!==a&&(("color"!==a||!function(e){let t=js.get(e);if(null!=t)return t;const a=e.getAttribute("color");if(null==a)t=!1;else{t=!0;for(let e=0;e<a.count;e++){for(let s=0;s<3;s++)if(1!==a.getComponent(e,s)){t=!1;break}if(!t)break}}return js.set(e,t),t}(e))&&("uv2"!==a||(null!=t.lightMap||null!=t.aoMap))))}const Is=["map","alphaMap","emissiveMap","normalMap","bumpMap","displacementMap","roughnessMap","metalnessMap","aoMap","specularMap","gradientMap","clearcoatMap","clearcoatNormalMap","clearcoatRoughnessMap","iridescenceMap","iridescenceThicknessMap","sheenColorMap","sheenRoughnessMap","transmissionMap","thicknessMap","anisotropyMap"];function Os(e,t){return Es(e.vertexShader,t)}function Es(e,t){return new RegExp(`(^|[^A-Za-z0-9_])${a=t,a.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}([^A-Za-z0-9_]|$)`).test(e);var a}function Cs(e,t,a){if(t(e))return e;for(const s of e.children??[]){const e=Cs(s,t,a);if(null!=e)return e}if(null!=a&&"prefab"===e.type){const s=a.get(e.assetId);if(null!=s){const e=s.prefab.objects.find(e=>Cs(e,t,a));if(null!=e)return e}}return null}const ks=new D,Ts=new D,Vs=new D,zs=new P,Ns=new P,Us=new f,Bs=new f,$s=new S;function Fs(e){e.updateWorldMatrix(!0,!1);const t=e.geometry.clone(),a=t.getAttribute("position"),s=t.getAttribute("normal"),r=t.getAttribute("tangent");if(null!=a){for(let t=0;t<a.count;t++)ks.fromBufferAttribute(a,t),e.applyBoneTransform(t,ks),a.setXYZ(t,ks.x,ks.y,ks.z);a.needsUpdate=!0}if(null!=s||null!=r){const a=t.getAttribute("skinIndex"),i=t.getAttribute("skinWeight");if(null!=a&&null!=i){for(let t=0;t<a.count;t++)Ws(e,t,Bs),null!=s&&(Ts.fromBufferAttribute(s,t),$s.getNormalMatrix(Bs),Ts.applyMatrix3($s).normalize(),s.setXYZ(t,Ts.x,Ts.y,Ts.z)),null!=r&&(Vs.fromBufferAttribute(r,t),Vs.transformDirection(Bs),r.setXYZ(t,Vs.x,Vs.y,Vs.z));null!=s&&(s.needsUpdate=!0),null!=r&&(r.needsUpdate=!0)}}t.deleteAttribute("skinIndex"),t.deleteAttribute("skinWeight"),t.computeBoundingBox(),t.computeBoundingSphere();const i=new m(t,e.material);return i.copy(e,!1),i.geometry=t,i.material=e.material,i.userData={...e.userData},i}function Ws(e,t,a){const s=e.geometry,r=s.getAttribute("skinIndex"),i=s.getAttribute("skinWeight"),n=e.skeleton;zs.fromBufferAttribute(r,t),Ns.fromBufferAttribute(i,t),a.identity().multiplyScalar(0);for(let e=0;e<4;e++){const t=Ns.getComponent(e);if(0===t)continue;const s=zs.getComponent(e);Us.multiplyMatrices(n.bones[s].matrixWorld,n.boneInverses[s]);for(let e=0;e<16;e++)a.elements[e]+=Us.elements[e]*t}return a.premultiply(e.bindMatrixInverse).multiply(e.bindMatrix),a}function Rs(e){let t=!0;return e.traverse(a=>{a===e||a.isBone||(t=!1)}),t}function _s(e,t){let a=t??!1,s=!0;for(const t of e)if(!1!==t.castShadow){s=!1;break}for(const t of e)if(!0===t.castShadow)return!0;return a&&!s}function Ls(e,t){let a=t??!1,s=!0;for(const t of e)if(!1!==t.receiveShadow){s=!1;break}if(s)return!1;for(const t of e)if(!0===t.receiveShadow)return!0;return a&&!s}/*
|
|
2
2
|
* Copyright (©) 2026 Hology Interactive AB. All rights reserved.
|
|
3
3
|
* See the LICENSE.md file for details.
|
|
4
4
|
*/
|