@hology/core 0.0.218 → 0.0.220

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.
@@ -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 n from"three";import{BoxGeometry as i,BufferGeometry as o,Color as l,Euler as c,Fog as u,FogExp2 as p,Group as h,Material as d,Matrix4 as f,Mesh as m,MeshLambertMaterial as g,MeshPhongMaterial as y,MeshStandardMaterial as w,Matrix3 as b,Object3D as v,PointLight as S,Quaternion as M,Scene as A,Texture as x,Vector2 as I,Vector3 as P,Vector4 as j}from"three";import{attributes as C,batchingUniformFloat as D,batchingUniformVec2 as O,batchingUniformVec3 as T,batchingUniformVec4 as E,bool as k,BooleanExpression as N,BooleanNode as z,colorToNormal as V,float as B,FloatNode as F,ifDefApply as $,mix as U,NodeShaderMaterial as G,rgb as L,rgba as _,RgbNode as W,select as R,standardMaterial as J,Texture2dLookupNode as q,textureSampler2d as Y,textureSampler2dArray as X,UniformBoolNode as Z,UniformFloatNode as H,UniformSampler2dArraySlice as K,UniformVec2Node as Q,UniformVec3Node as ee,UniformVec4Node as te,varying as ae,varyingAttributes as se,varyingTransformed as re,vec2 as ne,Vec2Node as ie,vec3 as oe,Vec3Node as le,vec4 as ce,Vec4Node as ue}from"three-shader-graph";import{Service as pe}from"typedi";import{VfxActor as he}from"../effects/vfx/vfx-actor.js";import{VisualEffect as de}from"../effects/vfx/vfx-param.js";import{Prefab as fe,PrefabOf as me}from"./objects/prefab.js";import{DataAssetRef as ge}from"./objects/data-asset.js";import{$actorOptions as ye,BaseActor as we}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 Se}from"../gameplay/services/physics/physics-system.js";import{NetMode as Me}from"../gameplay/net/net-session.js";import{NetRole as Ae}from"../gameplay/net/service/net-actor-role.js";import{ThreeBlendingMode as xe}from"../effects/vfx/vfx-asset.js";import{withInjectionContext as Ie}from"../gameplay/inject.js";import{RenderingView as Pe}from"../rendering.js";import{curveSampler as je,oneMinus as Ce,particleUniforms as De,Sampler2DNode as Oe}from"../shader-nodes/index.js";import{LambertShader as Te}from"../shader/builtin/lambert-shader.js";import{LandscapeCompositeShader as Ee}from"../shader/builtin/landscape-composite-shader";import{LandscapeShader as ke}from"../shader/builtin/landscape-shader.js";import{StandardShader as Ne}from"../shader/builtin/standard-shader.js";import{UnlitShader as ze}from"../shader/builtin/unlit-shader.js";import{extractShaderParameters as Ve,getDataAssetDefinitionType as Be,getParameterDefinitionId as Fe,getParameterDefinitionType as $e,isDataAssetDefinitionAbstract as Ue,isParameterDefinitionAbstract as Ge,isParameterDefinitionAssignableTo as Le,isParameterDefinitionStructAssignableTo as _e,shaderParameterUniformName as We}from"../shader/parameter.js";import{ArrayMap as Re,DefaultMap as Je,groupBy as qe}from"../utils/collections.js";import{iterateMaterials as Ye}from"../utils/materials.js";import{filterChildrenShallow as Xe,filterSceneShallow as Ze,findFirstVisibleMesh as He,findFirstVisibleObject as Ke,traverseAsync as Qe}from"../utils/three/traverse.js";import{AssetMeshInstance as et,AssetResourceLoader as tt}from"./asset-resource-loader.js";import{AssetsProvider as at}from"./assets-provider.js";import{isCollisionMesh as st}from"./collision/collision-shape-import.js";import{BoxCollisionShape as rt,PhysicalShapeMesh as nt}from"./collision/collision-shape.js";import{LandscapeManager as it}from"./landscape/landscape-manager.js";import{initLandscape as ot}from"./landscape/landscape.js";import{SectionGrid as lt,smoothNormalsCrossMeshes as ct}from"./landscape/utils.js";import{createGrassFoliageMaterial as ut}from"./materials/grass-foliage.js";import{createGrassMaterial as pt}from"./materials/grass.js";import{getMaterialAttribute as ht}from"./materials/utils/material-painting.js";import{PaintedScatterManager as dt}from"./scatter/painted-scatter-manager.js";import{SurfaceScatterManager as ft}from"./scatter/surface-scatter-manager.js";import{createWaterMaterial as mt}from"./materials/water.js";import{SerializedParamType as gt}from"./model.js";import{applyRuntimeParamTypeInference as yt,convertConfiguredParamsToRuntimeTypes as wt,convertConfiguredParamValueToRuntimeType as bt,inferRuntimeSerializedParamTypeHint as vt}from"./custom-param-runtime-types.js";import{ShapeLibrary as St,ShapeLibraryKeys as Mt}from"./objects/shapes.js";import{ambientLightName as At,createSky as xt,defaultSkyMaterial as It}from"./sky.js";import{Curve2 as Pt}from"../utils/curve.js";import{DecalUnlitShader as jt}from"../shader/builtin/decal-unlit-shader.js";import{DecalStandardShader as Ct}from"../shader/builtin/decal-standard-shader.js";import{ColorLayer as Dt,defaultValueColorLayer as Ot,defaultValueMaskLayer as Tt,MaskLayer as Et}from"../shader/color-layer.js";import{LayeredShader as kt}from"../shader/builtin/layered-shader";import{isColorLayerSerialized as Nt}from"../shader/color-layer";import{FogVolume as zt}from"../rendering/fog/fog-volume-actor.js";import{UnscaledSprite as Vt}from"../utils/three/unscaled-sprite.js";import{ToonShader as Bt}from"../shader/builtin/toon-shader.js";import{BatchedMesh2 as Ft}from"./batched-mesh-2.js";import{ParallaxStandardMaterial as $t}from"../shader/builtin/standard-shader";import{parallaxOcclusionMapping as Ut}from"../shader-nodes/pom.js";import{traverseVisibleEvery as Gt}from"../utils/three/traverse";import{RectAreaLightHelper as Lt}from"three/examples/jsm/Addons.js";import{createSequenceData as _t,isSequenceData as Wt,Sequence as Rt}from"../effects/sequence/sequence-data.js";import{applyUvTiling as Jt}from"./../shader/uv-nodes.js";import{buildShaderGraphMaterial as qt,shaderGraphMaterialSideToThree as Yt}from"../shader/graph/index.js";import{hasExecutableEventGraphDocument as Xt}from"../gameplay/event-graph/model.js";export{yt as applyRuntimeParamTypeInference,wt as convertConfiguredParamsToRuntimeTypes,bt as convertConfiguredParamValueToRuntimeType,vt as inferRuntimeSerializedParamTypeHint};const Zt={},Ht=/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent),Kt=/^((?!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 Qt(e,this.dataProvider,this.assetsService,this.assetManagerService,t,[],[],{create:()=>null,initActor:async()=>{}})}}let Qt=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,i,o,l,c,u=[]){this.scene=e,this.dataProvider=t,this.assetsService=a,this.assetManagerService=s,this.renderingView=i,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=Me.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._originalMaterials=new Map,this.pmremGeneratorResults=new WeakMap,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),this.handlePaintedScatterSceneMutation(e),this.handleSurfaceScatterSceneMutation(e)}),t.onUpdate(e=>{this.update(e),this.handlePaintedScatterSceneMutation(e),this.handleSurfaceScatterSceneMutation(e)}),t.onRemove(e=>{this.remove(e),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)e.traverse(e=>{if(e instanceof n.Mesh)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)});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})});for(const e of this.assets.values())if("prefab"==e.type){if(!e.prefab.objects.some(e=>ms(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)})}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)}),(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)this.scene.traverse(e=>{if(e instanceof m)if(Array.isArray(e.material))for(let a=0;a<e.material.length;a++)this.refreshMaterialTextures(e,e.material[a],t,a);else this.refreshMaterialTextures(e,e.material,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))}})}})}async refreshMaterialTextures(e,t,a,s){if("texture"!==a.type)return void console.error("Can not refresh material textures. Asset is not a texture",a);const r=await this.assetManagerService.getTexture(a);if(null!=r)if(t instanceof n.ShaderMaterial)for(const[e,s]of Object.entries(t.uniforms))s.value instanceof n.Texture&&s.value.userData.assetId===a.id&&(t.uniforms[e].value=r);else for(const[e,s]of Object.entries(t))s instanceof n.Texture&&s.userData.assetId===a.id&&(t[e]=r);else console.error("Can not refresh material textures. Texture not found",a)}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===gt.Material&&s.value===a.id){t=!0;break}if(s.type===gt.Array&&"element"in s&&s.element===gt.Material&&s.value.includes(a.id)){t=!0;break}}if(!t)return}const n=await materialFromAsset(this.assets.get(r),this.renderingView,this.assetsService,this.assetManagerService,this.shaders,!1),i=n.userData;n.userData=t.userData,n.userData.hasBloom=i.hasBloom,n.userData.reflective=i.reflective,n.userData.outlineParameters=i.outlineParameters,null!=s?ka(e.material[s],n)||(e.material[s]=n):ka(e.material,n)||(e.material=n,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===gt.Texture&&"string"==typeof a.value){const s=this.assets.get(a.value);if(null==s)continue;const r=await this.assetManagerService.getTexture(s);if(null!=r&&t.push(r),null!=s.texture?.textureArrayFileKey&&!e.has(s.texture?.textureArrayFileKey)){const a=await this.assetManagerService.getTextureArray(s);null!=a?.texture&&(t.push(a.texture),e.add(s.texture.textureArrayFileKey))}}})),0!==t.length&&this.renderingView){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(),ta.clear(),aa.clear(),await this.prefetchAssets(),await Promise.all(this.dataProvider.getObjects().map(e=>this.materialize(e))),await this.initActorsPostInit(),this.announcePrefabEventGraphs(),await this.refreshPaintedScatterPresence(!0),await this.refreshSurfaceScatterPresence(!0)}async initVfx(){console.time("Init VFX");const e=new Set,t=[],a=new A;for(const s of this.actorInstances){const r=ls(s);for(const s of r){const r=s.asset;if(e.has(r.id))continue;e.add(r.id),r.vfx.emitters;const n=await s.create(a);a.add(n.object),a.add(n.particleSystemContainer),n.play(),n.onUpdate(.5),n.stop(),n.pause(),t.push(n)}}const s=this.renderingView.compileAsync(a);this.renderingView.initTextures(a),await s;for(const e of t)e.onEndPlay(),e.disposed.next(!0),e.object.removeFromParent();console.timeEnd("Init VFX")}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("/"),n=r.slice(0,-1),i=n.join("/"),o=(r[r.length-1],new Map);for(const[e,t]of this.materializedActors)if(o.set(e,t),0===i.length)e.includes("/")||o.set(e,t);else if(e.startsWith(i+"/")){const a=e.slice(i.length+1);a.includes("/")||o.set(a,t)}const l={...s?.actor?.params??{},...a.actor?.params??{}},c=[...a.actor?.innerParams??[]];for(let t=n.length-1;t>=0;t--){const a=n.slice(0,t+1).join("/"),s=this.idToSceneObject.get(a);if("prefab"===s?.type&&null!=s.prefab){const n=await this.assetsService.getAsset(s.assetId);if(null!=n){let i=!1,o=a+"/"+n.prefab?.mainActorId;for(;null!=o;){if(o===e){i=!0;break}o=this.prefabInstanceExposedActorMap.get(o)}if(i&&null!=s.prefab.params&&Object.assign(l,ba(s.prefab.params)),null!=s.prefab.innerParams){const e=r.slice(t+1);for(const t of s.prefab.innerParams){const a=ba(t.params);0!==Object.keys(a).length&&(i?c.push({path:va(t.path,e)?t.path.slice(e.length):t.path,params:a}):va(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=i.length>0?i+"/"+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[n,i]of s.entries()){const s=this.componentTypes.find(e=>e.name===i.type);if(null==s){console.warn(`Component type '${i.type}' not found for actor ${t.id}`);continue}const o=e.attach(s.type);if(r[n]=o,null!=i.params){const e=await prepareClassParameters(i.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 i.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,n=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[n]&&await this.applyActorComponentParams(e[n],t,a,s)}canObjectBeInstanced(e){return e.physics?.type!==Se.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=>{!st(e)&&e.isMesh&&s.push(e)});const r=1==s.length&&0==s[0].children.length,n=!Kt,i=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||i&&n)&&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(),ta.clear(),aa.clear();const e=[],t=new Re,a=new Re,s=new Re;let r=0,i=0,o=0;const u=new Map,p=new Je(()=>new Map);for(const n of this.dataProvider.getObjects())await pa(n,async(n,c,h)=>{if(!this.shouldBeMaterialized(n))return;const d="asset_mesh"==n.type&&this.canObjectBeInstanced(n)&&await this.canAssetBeInstanced(n),f="shape_mesh"===n.type&&"landscape"!==n.shape&&n.physics?.type!==Se.dynamic;if(d||f){if(c&&c.children?.length>0){const e=c.children.findIndex(e=>e.id===n.id);e>=0&&c.children.splice(e,1)}if(f){let e=n.shape+JSON.stringify(n.shapeParams??{})+n.castShadow+n.receiveShadow;const t=n.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===gt.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:{...n,parentTransform:h},color:r}),o++}else{const e=this.assets.get(n.assetId);null==e&&console.log("Can't find asset with id "+n.assetId);let s=u.get(n.assetId);if(null==s){const e=await this.createFromAsset(n,{assignMaterials:!1});if(null==e)return;if(s=u.get(n.assetId),null==s){s={useBatchedMesh:null!=He(e)&&Gt(e,e=>!(e instanceof m)||this.testCanBatch(e.material,e.geometry)),assetMesh:e},u.set(n.assetId,s)}}const o=Aa(n.materialAssignments,e.materialAssignments);if(s.useBatchedMesh)await Qe(s.assetMesh,async t=>{if(!(t instanceof m))return;const s=Array.isArray(t.material)?t.material[0]:t.material,i=await this.resolveMaterialForAssignments(s,o,e);if(null!=i){p.get(n.id).set(t.uuid,i);let e=za(t,i);e+=_a(i),a.push(e,{...n,parentTransform:h,meshUUID:t.uuid}),r++}else console.warn("Can not materialize mesh because missing material",n)});else{const e=n.assetId+JSON.stringify(n.materialAssignments??[]);t.push(e,{...n,parentTransform:h}),i++}}}else null==c&&e.push({...n,parentTransform:h})});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 ${i} 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,p,u);const a=this.assets.get(t[0].assetId);e instanceof Ft&&e.perInstanceCastShadow||(e.castShadow=js(t,a?.castShadow??!1)),e.receiveShadow=Cs(t,a?.receiveShadow??!1);const s=new et;s.add(e),s.userData.src=t[0],s.castShadow=!1,s.receiveShadow=!1,this.scene.add(s)}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=js(e,s?.castShadow??!1),t.receiveShadow=Cs(e,s?.receiveShadow??!1);const r=new et;r.add(t),r.userData.src=e[0],a instanceof et&&(r.collisionShapes=a.collisionShapes),this.prepareCollisionShapesForInstanced(r),r.castShadow=!1,r.receiveShadow=!1,this.scene.add(r)}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=Ke(a,e=>!st(e)&&null!=e.geometry),r=Oa(s.material);null!=e[0].color&&null!=r.color&&(r.color=new l(16777215));const i=s.geometry;let o,u;!(Kt||r instanceof G||null==i.index)?(o=new n.BatchedMesh(e.length,i.getAttribute("position").count,i.index.count,r),o.perObjectFrustumCulled=!0,u=o.addGeometry(i)):o=new n.InstancedMesh(i,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 n.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 i;i=o instanceof n.BatchedMesh?o.addInstance(u):t,o.setMatrixAt(i,r),a.color}for(let t=0;t<e.length;t++){const s=e[t],r=new et;r.userData.src=e[0],a instanceof nt&&(r.collisionShapes=[a.collisionShape]),r.castShadow=!1,r.receiveShadow=!1,this.scene.add(r),r.add(o),null==o.userData.hasCollision&&(o.userData.hasCollision=[]),o.userData.hasCollision[t]=!1!==s.object.collisionDetection}}await Promise.all(e.map(e=>this.materialize(e))),await this.initActorsPostInit(),this.announcePrefabEventGraphs(),await this.initVfx(),await this.refreshPaintedScatterPresence(!0),await this.refreshSurfaceScatterPresence(!0)}prepareCollisionShapesForInstanced(e){e instanceof et&&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!Kt&&(!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 Re;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,i=0,o=0;const c=new Map;for(const[e,t]of s.entries()){const s=t[0].assetId,n=a.get(s);if(null==n){console.warn("Missing batching info for asset id "+s);continue}const l=Ke(n.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,i+=u.count*t.length,o+=t.length}const u=["color","map","roughness","roughnessMap","metalness","metalnessMap","opacity","alphaMap","aoMap","aoMapIntensity","normalMap","normalScale","emissive","emissiveIntensity","emissiveMap"],p=new Map,h=new Map,d=[];let f=new n.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 n.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 n.CompressedArrayTexture&&null!=r.userData.index&&(r=r.userData.index);const i=s.get(t);void 0===i||os(r,i)?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=d.find(e=>e.params.length<4);if(null==a){const t="vp"+d.length;a={name:t,params:[e],node:E(t)},d.push(a)}else a.params.push(e);s=a.name,t=ns(a.node,a.params.length-1)}else if(a instanceof j)t=E(s);else if(a instanceof P||a instanceof l)t=T(s);else if(a instanceof I)t=O(s);else if(a instanceof n.CompressedArrayTexture)s=e+"_i",t=D(s);else if(a instanceof x)continue;p.set(e,t),h.set(e,s)}let r=se.uv;g instanceof $t&&null!=g.heightMap&&(r=Ut(r,Y(g.heightMap),B(g.heightScale)));let i=ts(p.get("opacity"),F)??B(g.opacity??1);if(null!=g.alphaMap){let e;if(g.alphaMap instanceof n.CompressedArrayTexture){const t=X(g.alphaMap),a=ts(p.get("alphaMap"),F)??B(g.alphaMap.userData.index??0);e=t.sample(oe(r.x,r.y,a))}else e=Y(g.alphaMap).sample(r);i=i.multiply(e.r)}let o=_(ts(p.get("color"),le)??g.color,i);if(null!=g.map){let e;if(g.map instanceof n.CompressedArrayTexture){const t=X(g.map),a=ts(p.get("map"),F)??B(g.map.userData.index??0);e=t.sample(oe(r.x,r.y,a))}else e=Y(g.map).sample(Jt(r,g.map));o=o.multiply(e),i=i.multiply(e.a)}g.vertexColors&&(o=o.multiply(ce(ae(C.color.rgb),1)));let c=_(ts(p.get("emissive"),le)??g.emissive,i);if(null!=g.emissiveMap){let e;if(g.emissiveMap instanceof n.CompressedArrayTexture){const t=X(g.emissiveMap),a=ts(p.get("emissiveMap"),F)??B(g.emissiveMap.userData.index??0);e=t.sample(oe(r.x,r.y,a))}else e=Y(g.emissiveMap).sample(Jt(r,g.emissiveMap));c=c.multiply(e)}const m=ts(p.get("emissiveIntensity"),F)??B(g.emissiveIntensity??1),y=ts(p.get("normalScale"),ie)??ne(g.normalScale??new I(1,1));let w=re.normal;if(null!=g.normalMap){let e;if(g.normalMap instanceof n.CompressedArrayTexture){const t=X(g.normalMap),a=ts(p.get("normalMap"),F)??B(g.normalMap.userData.index??0);e=t.sample(oe(r.x,r.y,a))}else e=Y(g.normalMap).sample(Jt(r,g.normalMap));w=V(e.rgb,y.x)}let b=ts(p.get("roughness"),F)??B(g.roughness??1);if(null!=g.roughnessMap){let e;if(g.roughnessMap instanceof n.CompressedArrayTexture){const t=X(g.roughnessMap),a=ts(p.get("roughnessMap"),F)??B(g.roughnessMap.userData.index??0);e=t.sample(oe(r.x,r.y,a))}else e=Y(g.roughnessMap).sample(Jt(r,g.roughnessMap));b=b.multiply(e.g)}let v=ts(p.get("metalness"),F)??B(g.metalness??0);if(null!=g.metalnessMap){let e;if(g.metalnessMap instanceof n.CompressedArrayTexture){const t=X(g.metalnessMap),a=ts(p.get("metalnessMap"),F)??B(g.metalnessMap.userData.index??0);e=t.sample(oe(r.x,r.y,a))}else e=Y(g.metalnessMap).sample(Jt(r,g.metalnessMap));v=v.multiply(e.b)}let S=B(1);if(null!=g.aoMap){let e;if(g.aoMap instanceof n.CompressedArrayTexture){const t=X(g.aoMap),a=ts(p.get("aoMap"),F)??B(g.aoMap.userData.index??0);e=t.sample(oe(r.x,r.y,a))}else e=Y(g.aoMap).sample(Jt(r,g.aoMap));S=S.multiply(e.r)}const M=ts(p.get("aoMapIntensity"),F)??B(g.aoMapIntensity??0);let A=w;!0!==g.userData.disableAO&&(A=$("DOUBLE_SIDED",A,e=>R(new N("gl_FrontFacing"),e,e.multiplyScalar(-1))));const k=new G({color:J({color:o,roughness:b,metalness:v,ambientOcclusion:S,ambientOcclusionIntensity:M,emissive:c,emissiveIntensity:m,normal:A}),normal:w,roughness:b,emissive:c.rgb,transparent:g.transparent,alphaTest:g.alphaTest,envMap:g.envMap,opacity:i});null!=g.envMap&&(k.uniforms.envMapIntensity={value:g.envMapIntensity},k.uniforms.envMapRotation={value:rs(g.envMapRotation,g.envMap)}),k.envMap=g.envMap,k.side=g.side,f=k}else if(g instanceof G){const a=new Set,s=new Map,r=Object.keys(g.uniforms).filter(e=>!Ja(e));for(const n of e){const e=t.get(n.id).get(n.meshUUID);if(!(e instanceof G))throw new Error("Expected NodeShaderMaterial in node material batch");for(const t of r){const r=e.uniforms[t]?.value,n=s.get(t);void 0===n||os(r,n)?s.set(t,r):Ya(r)&&Ya(n)&&Xa(r)===Xa(n)&&a.add(t)}}const n=new Set(Object.keys(g.uniforms)),i={};for(const e of a){let t,a;const s=g.uniforms[e]?.value;if("number"==typeof s){let s=d.find(e=>e.params.length<4);if(null==s){const t=Za("vp"+d.length,n);s={name:t,params:[e],node:E(t)},d.push(s)}else s.params.push(e);a=s.name,t=ns(s.node,s.params.length-1)}else if(s instanceof j)a=Za(e,n),t=E(a);else if(s instanceof P||s instanceof l)a=Za(e,n),t=T(a);else{if(!(s instanceof I))continue;a=Za(e,n),t=O(a)}p.set(e,t),h.set(e,a),i[e]=t}if(0===p.size)f=g;else{const e=new 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,transparent:g.transparent,alphaTest:g.alphaTest,envMap:g.envMap??null,fog:g.fog,lights:g.lights,uniforms:Ha(g,new Set(p.keys())),uniformNodes:i});e.uniformNodes=i,y=g,(b=e).name=y.name,b.side=y.side,b.blending=y.blending,b.depthWrite=y.depthWrite,b.depthTest=y.depthTest,b.colorWrite=y.colorWrite,b.toneMapped=y.toneMapped,b.visible=y.visible,b.opacity=y.opacity,b.forceSinglePass=y.forceSinglePass,b.premultipliedAlpha=y.premultipliedAlpha,b.polygonOffset=y.polygonOffset,b.polygonOffsetFactor=y.polygonOffsetFactor,b.polygonOffsetUnits=y.polygonOffsetUnits,b.shadowSide=y.shadowSide,Object.assign(b.defines,y.defines),Object.assign(b.userData,y.userData),b.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,b;const v=new Ft(o,i,r,f);for(const e of d)v.initUniform(e.name,4);for(const[e,t]of p.entries()){if(d.some(t=>t.params.includes(e)))continue;let a=1;t instanceof ue||t instanceof le?a=4:t instanceof ie&&(a=2),v.initUniform(h.get(e)??e,a,0)}for(const[e,r]of s.entries()){const s=r[0].assetId,i=c.get(e);if(null==i){console.error(`Missing single asset mesh for mesh uuid ${e} and asset id ${s}`);continue}if(null==i.geometry){console.error("Missing geometry on mesh mesh");continue}const o=v.addGeometry(Va(i.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=He(f.assetMesh)?.uuid===e,y=f.assetMesh instanceof et&&m?f.assetMesh.collisionShapes:void 0,w=this.configureBatchedInstancedMesh(r,v,i,o,y);for(let e=0;e<w.length;e++){const a=r[e],s=w[e];v.setCastShadowAt(s,a.castShadow??u?.castShadow??!1);const i=t.get(a.id).get(a.meshUUID),o=i.userData.surface;null!=o&&(v.surfaceByInstance[s]=o);for(const e of d){let t=is.set(0,0,0,0);for(let a=0;a<e.params.length;a++){const s=qa(i,e.params[a]);"number"==typeof s&&t.setComponent(a,s)}v.setUniformAt(e.name,s,t)}for(let e of p.keys()){if(d.some(t=>t.params.includes(e)))continue;const t=h.get(e)??e;let a=qa(i,e);if(a instanceof l&&(a=new P(a.r,a.g,a.b)),a instanceof n.CompressedArrayTexture)a=a.userData.index??0;else if(a instanceof x||null==a)continue;v.setUniformAt(t,s,a)}}}return v}async createInstancedMesh(e,t){const a=Ke(t,e=>!st(e)&&null!=e.geometry),s=await this.assetsService.getAsset(e[0].assetId);await this.applyMaterials(t,Aa(e[0].materialAssignments,s.materialAssignments),s),a.updateMatrix();const r=a.geometry.clone(),i=a.material;let o;if(o=new n.InstancedMesh(r,i,e.length),this.configureBatchedInstancedMesh(e,o,a),a.material instanceof d&&o.castShadow&&o.receiveShadow&&Array.isArray(i))for(const e of i);return o}configureBatchedInstancedMesh(e,t,a,s,r){const i=[];a.updateWorldMatrix(!0,!0);for(let o=0;o<e.length;o++){let l=o;t instanceof n.BatchedMesh&&(l=t.addInstance(s)),i.push(l);const u=(new n.Matrix4).compose((new P).fromArray(e[o].position),(new M).setFromEuler((new c).fromArray(e[o].rotation)),(new P).fromArray(e[o].scale)),p=(new f).copy(e[o].parentTransform).multiply(u),h=(new f).copy(p).multiply(a.matrixWorld);t.setMatrixAt(l,h),null==t.userData.hasCollision&&(t.userData.hasCollision=[]);const d=this.assets.get(e[o].assetId);t.userData.hasCollision[l]=!1!==e[o].collisionDetection||!1!==d?.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]=p)}return i}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 Ze(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,n=null;const i=getConvertedFbxToGlbAssignedMaterialTextureFlipY(a);for(const e of t??[]){if(!ja(s,e,r,n))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=Da(a,i)),null!=a&&s.id!==a.id&&(r=r??Pa(s),n=n??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));Ze(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,Ze(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 ta.entries())t.userData.customShaderName&&ta.delete(e);this.landscapeManagers.forEach(t=>t.updateShaders(e)),Ze(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 n=!1;if(t.traverseAncestors(e=>{"_hology_transform_group"===e.name&&(n=!0)}),!n){const a=this.findParent(e);null!=a&&a.uuid!=t.uuid?a.attach(t):console.error("Parent is wrong")}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);Aa(e.materialAssignments,a.materialAssignments).forEach(e=>this.applyMaterial(t,e,a))}else"shape_mesh"===e.type&&this.applyMaterials(t,e.materialAssignments);if(n||(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.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 Lt&&e.update()})}}else if("landscape"===e.shape){const a=this.landscapeManagers.find(t=>t.source.id===e.id),n=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&&n){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 p?"density":"linear")!==e.fog.type;this.scene.fog=ua(e.fog),t&&(a=this.scene).traverse(e=>{if(e instanceof m){const t=e.material;t instanceof G&&(a.fog instanceof u?(t.uniforms.fogFar.value=a.fog.far,t.uniforms.fogNear.value=a.fog.near):a.fog instanceof p&&(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 zt){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))&&!n){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 nt&&(t.geometry=a.geometry,t.collisionShape=a.collisionShape)}if("shape_mesh"===e.type&&"landscape"!==e.shape)ea(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;ea(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 n=!1,i=!1;const o=await this.tryApplyLiveParameterUpdate(e,t?.params??{},a?.params??{});!1===o&&(i=!0),n||(n=!0===o);const l=await this.applyLiveInnerParameterUpdates(e,t?.innerParams??[],a?.innerParams??[]);i||(i=l.rejected),n||(n=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){i=!0,u.push(t);continue}const l=await this.tryApplyLiveParameterUpdate(o,t?.params??{},a?.params??{});!1===l&&(i=!0),n||(n=!0===l);const p=await this.applyLiveInnerParameterUpdates(o,t?.innerParams??[],a?.innerParams??[]);i||(i=p.rejected),n||(n=p.hasChanges),u.push({...a,params:!1===l?t?.params:a?.params,innerParams:p.applied})}return{applied:{...a,params:!1===o?t?.params:a?.params,innerParams:l.applied,components:u},hasChanges:n,rejected:i}}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=fa(e.prefab?.objects??[]),r=fa(t.prefab?.objects??[]);if(s.size!==r.size||[...s.keys()].some(e=>!r.has(e)))return!1;const n=[];await this.applyLiveNestedPrefabOverrideUpdates(e,t,a,n);for(const i of a.values())for(const[a,o]of s){const s=r.get(a),l=i.actorsById.get(a);if(null==s||null==l){n.push(`${i.prefix}/${a}`);continue}const c=i.actorSettingsById.get(a)??ga(o,i.source,e.prefab?.mainActorId===a),u=ga(o,i.source,e.prefab?.mainActorId===a),p=ya(u,ga(s,i.source,t.prefab?.mainActorId===a),i.desiredActorSettingsById.get(a)??u);if(i.desiredActorSettingsById.set(a,p),JSON.stringify(c)===JSON.stringify(p))continue;const h=await this.applyLiveActorSettingsUpdate(l,c,p);i.actorSettingsById.set(a,h.applied),h.rejected&&n.push(`${i.prefix}/${a}`)}return n.length>0&&console.warn(`Some live parameters for prefab ${t.name??t.id} were not applied. The running instances were preserved: ${n.join(", ")}`),!0}async applyLiveNestedPrefabOverrideUpdates(e,t,a,s){const r=ma(e.prefab?.objects??[]),n=ma(t.prefab?.objects??[]);for(const[e,t]of r){const r=n.get(e);if(null==r||t.assetId!==r.assetId||JSON.stringify(t.prefab)===JSON.stringify(r.prefab))continue;const i=this.assets.get(r.assetId),o=this.livePrefabInstances.get(r.assetId);if("prefab"!==i?.type||null==i.prefab||null==o)continue;const l=fa(i.prefab.objects);for(const n of a.values()){const a=`${n.prefix}/${e}`,c=o.get(a);if(null!=c){for(const[e,n]of l){const o=c.actorsById.get(e);if(null==o){s.push(`${a}/${e}`);continue}const l=ga(n,t,i.prefab.mainActorId===e),u=ga(n,r,i.prefab.mainActorId===e),p=c.desiredActorSettingsById.get(e)??l,h=ya(l,u,p);c.desiredActorSettingsById.set(e,h);const d=c.actorSettingsById.get(e)??p;if(JSON.stringify(d)!==JSON.stringify(h)){const t=await this.applyLiveActorSettingsUpdate(o,d,h);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 n=!1,i=!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){i=!0,null!=a&&o.push(a);continue}!0===await this.tryApplyLiveParameterUpdate(u,a?.params??{},l?.params??{})?(null!=l&&o.push(l),n=!0):(i=!0,null!=a&&o.push(a))}return{applied:o,hasChanges:n,rejected:i}}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?Ze(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=qe(e.vertexMaterials,e=>e.m);t.traverse(e=>{if(e instanceof m){if(null==e.geometry)return;if(Na(ht(e,0,!1)),a>0){Na(ht(e,0,!1))}}});const r=new Set;for(const[e,n]of s.entries()){const s=null!=e?t.getObjectByName(e):this.findMeshWithGeometry(t);let i=!1;if(null==s||null==s.geometry)return void console.warn(`Failed to apply vertex materials on mesh with name "${e}"`);const o=ht(s,0,!0);Na(o);for(const e of n)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),i=!0;if(a>0){const e=ht(s,4,!0);Na(e);for(const t of n)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,i=!0}i&&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 n,i;switch(e.type){case"asset_mesh":n=await this.createFromAsset(e),n=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=xs(e),s=e.parent;if(null==s){a=t;continue}const r=s.children.indexOf(e);e.removeFromParent(),s.add(t);const n=s.children.indexOf(t);r>=0&&n>=0&&n!==r&&(s.children.splice(n,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&&Ps(e)&&e.removeFromParent()}(a),a}(n);break;case"shape_mesh":n=await this.createFromShape(e);break;case"light":n=await this.createLight(e);break;case"particles":n=await this.createParticleSystem(e),e.collisionDetection=!1;break;case"global_fog":this.scene.fog=ua(e.fog),this.fixFogColor(),n=new h;break;case"sky":this.sky=xt(),this.updateSky(e),n=this.sky;break;case"world_env":this.updateWorldEnv(e),n=new h,this.worldEnvObj=n;break;case"actor":({object:n,actor:i}=await this.createFromActor(e,s));break;case"group":case"scatter":n=new h;break;case"prefab":n=await this.createFromPrefab(e,s,t);break;case"vfx":n=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!=n){if(e.name&&e.name.length>0&&(n.name=e.name),this.applyTransform(e,n),a?n.userData._src=e:n.userData.src=e,null!=i&&(n.userData.actor=i),this.inEditor,this.inEditor,this.objectMap.set(n.uuid,e),this.sceneObjectMap.set(e.id,n),e.physics?.type!==Se.dynamic||null==t||this.inEditor?null==t?this.scene.add(n):null==t||"actor"!==e.type||this.inEditor?t?.add(n):(t.add(n),this.scene?.attach(n),console.log(n)):(t.add(n),n.getWorldPosition(n.position),n.getWorldQuaternion(n.quaternion),n.getWorldScale(n.scale),this.scene?.attach(n)),null!=e.children&&await Promise.all(e.children?.map(e=>this.materialize(e,n,a))),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==Se.dynamic||ca(n),null!=this.renderingView)return this.renderingView.renderer.shadowMap.needsUpdate=!0,n;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 dt(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 ft(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;null!=a&&null!=a.textureId?this.assetManagerService.getTexture(this.assets.get(a.textureId)).then(e=>{if(null==e)return void console.error("Failed to load environment texture with id "+a.textureId);if(null==this.pmremGenerator&&(this.pmremGenerator=new n.PMREMGenerator(this.renderingView.renderer),this.pmremGenerator.compileEquirectangularShader()),!this.pmremGeneratorResults.has(e))try{const t=this.pmremGenerator.fromEquirectangular(e).texture;this.pmremGeneratorResults.set(e,t)}catch(e){return void console.error("Failed to generate PMREM for environment texture",e)}const t=this.pmremGeneratorResults.get(e);this.renderingView.scene.environment=t,this.renderingView.scene.environmentIntensity=a.intensity??1}):this.renderingView.scene.environment=null}resetWorldEnv(){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=n.BackSide,(e instanceof w||e instanceof n.MeshBasicMaterial||e instanceof n.ShaderMaterial)&&(e.fog=!1),e.depthTest=!1}async createComponent(e,t,a,s){const r=new Zt[a.path+"/"+a.className],n=t.id+s;r.id=n,r.object=e;for(const e of a.params)null!=e.value&&(r[e.name]=e.value);return this.components.push(r),n}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===Me.none)return;const t=e.constructor[ye];!0!==t?.replicate?this.netMode===Me.client&&(e.netRole=Ae.none):e.netRole=this.netMode===Me.client?Ae.simulatedProxy:Ae.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 h;const a=ot(e.landscape.options);this.applyHeightMaps(a,e.landscape.heightMaps,!0);const s=new it(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 lt(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(()=>ct(r),50)}async createMeshByShape(e,t,a={}){if("landscape"!==e&&Mt.includes(e)){const s=await prepareShapeParameters(a??{}),r=e+JSON.stringify(a);if(!this.geometryCache.has(r)){const t=St[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,St[e].collision(s));return new nt(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(Aa(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,n=e.castShadow??!!a.castShadow;return s.receiveShadow=r,ea(s,n,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}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 n=new h;null!=s&&this.applyTransform(s,n),null!=a&&a.add(n),await Promise.all(e.prefab.objects.filter(e=>"global_fog"!==e.type&&"world_env"!==e.type).map(e=>this.materialize(e,n,!0,structuredClone(t))));const i=t.sceneObjectChain.join("/"),o=Array.from(this.materializedActors.entries()).filter(([e,a])=>e.startsWith(i)&&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(i+"/")),u=c.map(([,e])=>e),p=new Map(c.map(([e,t])=>[e.slice(i.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([...fa(e.prefab?.objects??[])].map(([t,a])=>[t,ga(a,s,e.prefab?.mainActorId===t)]));t.set(i,{prefix:i,source:s,actorsById:p,actorSettingsById:a,desiredActorSettingsById:new Map(a)})}if(!this.inEditor&&!0!==t.runtimeSpawn&&Xt(e.prefab?.eventGraph)&&this.materializedPrefabEventGraphs.set(i,{id:i,graph:e.prefab.eventGraph,object:n,actors:u,actorsById:p,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:n,actors:u,actorsById:p,mainActor:l,instanceId:i}}async createParticleSystem(e){await this.assetsService.getAsset(e.assetId);return new v}async createLight(e){if("point"===e.light.type){const t=new S(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 n.TextureLoader).load("assets/light-bulb-icon.webp"),a=new n.SpriteMaterial({map:e,alphaTest:.5}),s=new Vt(a);s.scale.multiplyScalar(.6),t.add(s)}return t}if("spot"===e.light.type){const t=new n.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 v,t.target.position.set(0,-1,0),t.add(t.target),this.inEditor){const e=(new n.TextureLoader).load("assets/light-bulb-icon.webp"),a=new n.SpriteMaterial({map:e,alphaTest:.5}),s=new Vt(a);s.scale.multiplyScalar(.6),t.add(s),t.add(new n.SpotLightHelper(t))}return t}if("rectArea"===e.light.type){const t=new n.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 n.TextureLoader).load("assets/light-bulb-icon.webp"),a=new n.SpriteMaterial({map:e,alphaTest:.5}),s=new Vt(a);s.scale.multiplyScalar(.6),t.add(s);const r=new Lt(t);t.add(r)}return t}return"directional"===e.light.type?(this.applyDirectionalLight(e.light.directional,e),new h):"ambient"===e.light.type?(this.applyDirectionalAmbientLight(null,e.light.ambient,e),new h):void 0}applyDirectionalAmbientLight(e,t,a){const s=this.scene.children.find(e=>e.name===At);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.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}};Qt=e([pe(),t("design:paramtypes",[A,Object,at,tt,Pe,Array,Array,Object,Array])],Qt);export{Qt as SceneMaterializer};function ea(e,t,a){e.castShadow=t,e.receiveShadow=a,e.traverse(e=>{e.castShadow=t,e.receiveShadow=a})}const ta=new Map,aa=new Map,sa=new g({color:16711935}),ra=new Map;export async function materialFromAsset(e,t,a,s,r,n=!0){if(null==e||null==e.material)return console.error("Asset or asset material is null",e),sa;const i=JSON.stringify(e.material)+t?._id,o=n&&!("shaderGraph"===e.material.type&&"asset"===e.material.shaderGraph?.source);if(o&&ta.has(i))return ta.get(i);if(o&&aa.has(i))return await aa.get(i);const l=_materialFromAsset(i,e,t,a,s,r,o);return o?aa.set(i,l).get(i):l}export async function _materialFromAsset(e,t,a,r,i,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},p={};if(null!=t.material.params?.map){const e=t.material.params.map,a=await r.getAsset(e);null!=a&&(u.map=await i.getTexture(a))}let h,d,f;switch(t.material.type){case"phong":h=new y({...u,...p});break;case"water":h=mt(u,a);break;case"grassFoliage":h=ut({color:u.color,map:u.map},a);break;case"grass":h=pt({...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),h=sa;break}"surface"===e.target&&null!=e.materialOptions?.side&&(d=Yt(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,i,a,o),n=t.shaderGraphPreviewNodeId,l=t.trailBillboard;h=qt(e,{parameters:s,previewNodeId:n,trailBillboard:l,alphaTest:t.material.alphaTest}),h.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),h=sa}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:Ht?Te:Ne,lambert:Te,unlit:ze,toon:Bt,layered:kt,landscape:ke,"landscape-composite":Ee,"decal-unlit":jt,"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 n=await prepareClassParameters(t.material?.shaderParams??{},e,r,i,null,a,o,void 0,void 0,s);Object.assign(s,n),s.alphaTest=t.material.alphaTest??s.alphaTest,h=s.build()}catch(e){console.log("Shader runtime error: "+e,e),ra.has(t.material.shader)||ra.set(t.material.shader,sa.clone()),h=ra.get(t.material.shader)}h.userData.customShaderName=t.material.shader}else console.warn("Missing shader implementation with name "+t.material.shader),h=sa;break;default:throw new Error("Unsupported material type "+t.material.type)}if(a?.csm.setupMaterial(h),h.side=d??t.material.side??h.side??n.FrontSide,h.transparent=(f??t.material.transparent??u.transparent??!1)||h.transparent,h.alphaTest=t.material.alphaTest??h.alphaTest??0,null!=t.material.blending&&(h.blending=xe[t.material.blending]??n.NormalBlending),t.material.bloom&&(h.userData.hasBloom=!0),t.material.reflective&&(h.userData.reflective=!0),!0===t.material.outlines&&(h.userData.outlineParameters={},null!=t.material.outlineParams&&(null!=t.material.outlineParams.color&&(h.userData.outlineParameters.color=new l(t.material.outlineParams.color).toArray()),null!=t.material.outlineParams.thickness&&(h.userData.outlineParameters.thickness=t.material.outlineParams.thickness))),null!=t.material.surfaceAssetId&&""!==t.material.surfaceAssetId){const e=await materializeDataAssetRef(t.material.surfaceAssetId,r,i,void 0,a,o);null!=e&&(h.userData.surface=e.value)}return h.userData.assetId=t.id,c&&null!=a&&ta.set(e,h),c&&aa.delete(e),h}export function prepareCustomParamsFromShaderGraph(e,t={}){return Object.fromEntries((e.parameters??[]).map(e=>{const a=function(e){switch(e){case"float":return gt.FloatNode;case"boolean":return gt.BooleanNode;case"texture":return gt.Sampler2DNode;case"vec2":return gt.Vec2Node;case"vec3":return gt.Vec3Node;case"vec4":return gt.Vec4Node;case"color":return gt.RgbNode}}(e.type),s=t[e.name],r=s?.override??null!=s,n=void 0!==e.defaultValue?e.defaultValue:customParameterDefaultValueByType.get(a),i=!1===r?Ma(n):s?.value??Ma(n);return[e.name,{type:a,value:i,override:r}]}))}export async function prepareShaderGraphParameters(e,t,a,s,r,n){const i={},o=prepareCustomParamsFromShaderGraph(t,e);for(const[e,t]of Object.entries(o)){const o=await ia(e,t,a,s,null,r,n);null!=o&&(i[e]=o)}return i}export async function prepareClassParameters(e,t,a,s,r,n,i,o,l,c){const u={},{params:p,skipped:h}=wt(e,{parameterType:t,parameterTarget:c,extractPropertyParameters:Ve,toSerializedParamType:toSerializedParamType});for(const e of h)console.warn(`Skipping stored parameter "${e.key}" because it could not be converted from ${gt[e.sourceType]} to ${gt[e.targetType]}`);for(const[e,t]of Object.entries(p)){if(!1===t.override)continue;const c=await ia(e,t,a,s,r,n,i,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,n]of Object.entries(e)){const e=await ia(r,n,t,a,null,void 0,void 0,void 0,void 0,void 0);null!=e&&(s[r]=e)}return s}const na=new Map;async function ia(e,t,a,s,r,n,i,o,u=t.value,p=t.type,h,d=(t.type===gt.Struct?t.struct:void 0)){if(null==t||null==u||""===u)return null;switch(p){case gt.Array:if(Array.isArray(u)&&"element"in t)return await Promise.all(u.map(l=>ia(e,t,a,s,r,n,i,o,l,t.element,h,t.elementStruct)));break;case gt.Number:case gt.FloatNode:let f;if("string"==typeof u?f=parseFloat(u):"number"==typeof u&&(f=u),p===gt.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=na.get(e);return null==t&&(t=je(Pt.decode(e)),na.set(e,t)),t}(e.easing),r=s.sample(Ce(De.energy));return U(B(t),B(a),r)}return new H(We(e),f,void 0,!1)}return f;case gt.Texture:let m=await s.getTexture(await a.getAsset(u));return"envmap"===e.toLowerCase()&&null!=n&&(m=n.getEnvTexture(m)),m;case gt.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 H(We(e)+"_i",a,void 0,!1))}const y=await s.getTexture(g);return y?Y(y):null;case gt.Boolean:return u;case gt.BooleanNode:return new Z(We(e),u,void 0,!1);case gt.Vector2:case gt.Vec2Node:if("object"==typeof u){const t=u instanceof Array?(new I).fromArray(u):new I(u.x,u.y);return p===gt.Vec2Node?new Q(We(e),t,void 0,!1):t}return null;case gt.Vector3:case gt.Vec3Node:if("object"==typeof u){const t=u instanceof Array?(new P).fromArray(u):new P(u.x,u.y,u.z);return p===gt.Vec3Node?new ee(We(e),t,void 0,!1):t}return null;case gt.Vector4:case gt.Vec4Node:if("object"==typeof u){const t=u instanceof Array?(new j).fromArray(u):new j(u.x,u.y,u.z,u.w);return p===gt.Vec4Node?new te(We(e),t,void 0,!1):t}return null;case gt.Color:case gt.RgbNode:const w=new l(u);return p===gt.RgbNode?new ee(We(e),new P(w.r,w.g,w.b),void 0,!1).rgb:w;case gt.String:return u;case gt.BaseActor:const b=u;if(null==r&&console.warn("Class parameters can not be prepared as actors are not passed in"),null==b)return null;if("object"==typeof b&&null!=b.type&&null!=b.id){if("actor"===b.type)return r?.get(b.id)??null;if("prefab"===b.type){const e=h?h(b.id):null;if(null!=e)return r?.get(e)??null;const t=[];for(const[e,a]of r?.entries()??[])e.startsWith(b.id+"/")&&t.push(a);return 1===t.length?t[0]:null}}if("string"==typeof b){const e=r?.get(b);if(null!=e)return e;const t=h?h(b):null;if(null!=t)return r?.get(t)??null;const a=[];for(const[e,t]of r?.entries()??[])e.startsWith(b+"/")&&a.push(t);return 1===a.length?a[0]:null}return null;case gt.Euler:const v=u;return(new c).fromArray(v);case gt.Object3D:{const e=await a.getAsset(u);return(await s.getMesh(e,{applyMaterials:!0,rescale:!0})).scene}case gt.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,n,a,s,i)}case gt.AudioBuffer:return await s.getAudio(await a.getAsset(u));case gt.VisualEffect:const S=await a.getAsset(u);if(null==o){console.error("Can not create instance of visual effect because missing actor provider");break}if("vfx"in S)return new de(o,S);console.error("Using a non-vfx asset for visual effect parameter");break;case gt.Prefab:{const e=await a.getAsset(u);return null==e?(console.error("Using a non-prefab asset for prefab parameter",u),null):new fe(e)}case gt.PrefabActor:{const e=await a.getAsset(u);return null==e?(console.error("Using a non-prefab asset for prefab parameter",u),null):new me(new fe(e))}case gt.DataAsset:return materializeDataAssetRef(u,a,s,r,n,i,o,h);case gt.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 Rt(e.sequence);console.error("Using a non-sequence asset for sequence parameter");break}case gt.SequenceData:return Wt(u)?u:(console.warn("Invalid inline sequence data parameter value",u),null);case gt.Struct:return async function(e,t,a,s,r,n,i,o,l){const c=oa(e),u=c?.struct??t;if(null==u)return console.warn("Missing parameter definition id for struct parameter"),null;const p=$e(u);if(null==p)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&&!_e(u,t))return console.warn(`Parameter definition "${u}" is not assignable to "${t}"`),null;let h;try{h=new p}catch(e){return console.warn(`Failed to instantiate parameter definition "${u}"`,e),null}const d=function(e){const t=oa(e);if(null!=t)return t.value;if(la(e))return e;if(null!=e&&"object"==typeof e&&la(e.params))return e.params;return{}}(c?.value??e),f=await prepareClassParameters(d,null,a,s,r,n,i,o,l,h);return Object.assign(h,f),h}(u,d,a,s,r,n,i,o,h);case gt.Curve:return Pt.decode(u);case gt.ColorLayer:case gt.MaskLayer:if(Nt(u)){const e=await Dt.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 gt.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,n,i,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(Ue(u))return console.warn(`Can not instantiate abstract data asset definition "${u}"`),null;const p=Be(u);if(null==p)return console.warn(`Unknown data asset definition "${u}"`),null;let h;try{h=new p}catch(e){return console.warn(`Failed to instantiate data asset definition "${u}"`,e),null}const d=c.dataAsset.params??{};if("object"!=typeof d||Array.isArray(d))return console.warn(`Invalid data asset params for asset "${c.id}"`),null;try{const e=await prepareClassParameters(d,null,t,a,s,r,n,i,o,h);Object.assign(h,e)}catch(e){return console.warn(`Failed to materialize data asset "${c.id}"`,e),null}return new ge(c,h)}function oa(e){return null!=e&&"object"==typeof e&&!Array.isArray(e)&&"string"==typeof e.struct&&la(e.value)?e:null}function la(e){return null!=e&&"object"==typeof e&&!Array.isArray(e)&&Object.values(e).every(e=>null!=e&&"object"==typeof e&&"type"in e)}function ca(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 ua(e){return"linear"===e.type?new u(new l(e.color),e.near??100,e.far??1e3):"density"===e.type?new p(e.color,e.density):void console.warn("Invalid fog type",e)}new w({color:4229780});async function pa(e,t,a,s){null==s&&(s=(new f).identity());const r=s.clone().multiply(ha(e,new n.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 ha(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?gt.Number:t instanceof F||"function"==typeof e.prototype.isFloat?gt.FloatNode:t instanceof x||e===x||e.isTexture?gt.Texture:t instanceof Oe||e===Oe||e===q||"function"==typeof e.prototype?.isSampler2D||!0===e.prototype?.isSampler2D?gt.Sampler2DNode:t instanceof Boolean||e===Boolean?gt.Boolean:t instanceof z?gt.BooleanNode:t instanceof l||e==l?gt.Color:t instanceof W||"function"==typeof e.prototype.isRgb?gt.RgbNode:t instanceof I||e==I?gt.Vector2:t instanceof ie||"function"==typeof e.prototype.isVec2?gt.Vec2Node:t instanceof P||e==P?gt.Vector3:t instanceof le||"function"==typeof e.prototype.isVec3?gt.Vec3Node:t instanceof j||e==j?gt.Vector4:t instanceof ue||"function"==typeof e.prototype.isVec4?gt.Vec4Node:t instanceof String||e===String?gt.String:t instanceof we||e==we||e.prototype instanceof we||e.prototype==we?gt.BaseActor:t instanceof c||e==c?gt.Euler:t instanceof v||e==v?gt.Object3D:t instanceof d||e==d?gt.Material:t instanceof AudioBuffer||e==AudioBuffer?gt.AudioBuffer:t instanceof de||e==de?gt.VisualEffect:t instanceof fe||e==fe?gt.Prefab:t instanceof me||e==me?gt.PrefabActor:t instanceof ge||e==ge?gt.DataAsset:t instanceof Pt||e==Pt?gt.Curve:t instanceof Dt||e==Dt?gt.ColorLayer:t instanceof Et||e==Et?gt.MaskLayer:t instanceof n.AnimationClip||e==n.AnimationClip?gt.AnimationClip:t instanceof Rt||e==Rt?gt.Sequence:"SequenceData"===e.name||e.prototype&&"tracks"in e.prototype?gt.SequenceData:null!=Fe(e)?gt.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===gt.Struct?Fe(e.type):void 0;return!0===e.options.array?{type:gt.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 n=r;const i=t[e.name],o=da(i)?i:void 0,l=!0===s.treatAllAsOptional||!0===e.options.optional,c=s.missingOverrideDefaultsToOverride??!0;let u=o?.override;void 0===u&&null!=i&&l&&c&&(u=!0),void 0===u&&l&&(u=!1);const p=void 0!==a[e.name]||void 0!==e.options.defaultValue,h=function(e,t){if(null==e.type){const a=function(e){return Wt(e)?{type:gt.SequenceData}:void 0}(t);null!=a&&(e=a)}if(e.type!==gt.Struct)return{typeInfo:e,value:t};const a=oa(t);if(null==a)return{typeInfo:e,value:t};return{typeInfo:{...e,struct:a.struct},value:a.value}}(n,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===gt.Struct)return Ge(e.type)?{}:prepareCustomParamsFromType(e.type,{});return customParameterDefaultValueByType.get(a)}(e,a)),d=function(e,t){if(da(e))return e;if(t.type!==gt.SequenceData||!Wt(e))return;return{type:gt.SequenceData,value:e}}(i,h.typeInfo);n=function(e,t,a){if(e.type!==gt.Struct||a?.type!==gt.Struct||null==a.struct)return e;const s=t.struct??e.struct;if(null==s||a.struct===s||_e(a.struct,s)||null==$e(a.struct))return{...e,struct:a.struct};return e}(h.typeInfo,r,d);const f=!1!==u||e.options.array?d?.value??function(e,t,a){if(!0===e.options.array)return a?Ma(t):[];return Ma(t)}(e,h.value,p):Ma(h.value);return[e.name,{...n,value:f,override:u}]}))}function da(e){return null!=e&&"object"==typeof e&&!Array.isArray(e)&&"number"==typeof e.type&&"value"in e}function fa(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 ma(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 ga(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??{},...ba(e.params)}})}return{...e,params:{...e.params??{},...ba(t.prefab.params)},innerParams:[...s.values()]}}function ya(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])),n=new Map((a.innerParams??[]).map(e=>[JSON.stringify(e.path),e])),i=[];for(const e of new Set([...s.keys(),...r.keys(),...n.keys()])){const t=s.get(e),a=r.get(e),o=n.get(e),l=wa(t?.params??{},a?.params??{},o?.params??{});Object.keys(l).length>0&&i.push({path:a?.path??o?.path??t.path,params:l})}return{...t,params:wa(e.params??{},t.params??{},a.params??{}),innerParams:i}}function wa(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 ba(e){return null==e?{}:Object.fromEntries(Object.entries(e).filter(([,e])=>function(e){return!0===e?.override}(e)))}function va(e,t){return e.length>=t.length&&t.every((t,a)=>e[a]===t)}export function prepareCustomParamsFromType(e,t,a=null,s={}){const r=Ve(e);if(0===r.length)return{};let n;null!=a?Ie(a,()=>{n=a.get(e)}):n=new e;const i={};for(const e of r){const t=n[e.name];if(null!=t){const a=Sa(e,t);void 0!==a&&(i[e.name]=a)}}return prepareCustomParams(r,t,i,s)}function Sa(e,t){return!0===e.options.array?Array.isArray(t)?t.map(t=>serializeCustomParameter(e.type,t)??t):[]:serializeCustomParameter(e.type,t)}function Ma(e){return null==e?e:Array.isArray(e)?e.map(e=>Ma(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 I:return t instanceof I?t.toArray():void a();case P:return t instanceof P?t.toArray():void a();case j:return t instanceof j?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 fe:return t instanceof fe?t.asset?.id??null:void a();case ge:return t instanceof ge?t.id:"string"==typeof t?t:void a()}const s=Fe(e);if(null!=s){const r=oa(t);if(null!=r)return r.struct===s?r.value:r;const n=function(e,t){if(null==t||"object"!=typeof t)return e;const a=t.constructor;return null!=Fe(a)&&Le(a,e)?a:e}(e,t),i=Fe(n),o=function(e,t){if(null==t)return null;if(la(t))return t;if(null!=t&&"object"==typeof t&&la(t.params))return t.params;if("object"!=typeof t)return;const a=Ve(e),s={};for(const e of a){const a=t[e.name];if(void 0===a)continue;const r=Sa(e,a);void 0!==r&&(s[e.name]=r)}return prepareCustomParams(a,{},s)}(n,t);return void 0!==o?null!=o&&null!=i&&i!==s?{struct:i,value:o}:o:void a()}if(Wt(t))return t}function Aa(e,t){return function(e,t,a){const s=[],r=new Set;for(const n of[...e??[],...t??[]]){const e=a(n);r.has(e)||(r.add(e),s.push(n))}return s}((e??[]).filter(e=>xa(e.materialId)),(t??[]).filter(e=>xa(e.materialId)),e=>e.color+e.name)}function xa(e){return"null"!=e&&null!=e}export const customParameterDefaultValueByType=new Map([[gt.RgbNode,"#000000"],[gt.Color,"#000000"],[gt.String,""],[gt.Vector4,[0,0,0,0]],[gt.Vec4Node,[0,0,0,0]],[gt.Vector3,[0,0,0]],[gt.Vec3Node,[0,0,0]],[gt.Vector2,[0,0]],[gt.Vec2Node,[0,0]],[gt.Euler,[0,0,0,"XYZ"]],[gt.Array,[]],[gt.DataAsset,null],[gt.SequenceData,_t()],[gt.ColorLayer,Ot],[gt.MaskLayer,Tt]]);let Ia=new l;new l;function Pa(e){return null==e?.color?null:(Ia.set(e.color),"#"+Ia.getHexString())}function ja(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 n=Pa(e);return null!=n&&(n===t.color||a===t.color)}export function applyMaterial(e,t,a,s,r={}){const i=[];return e.traverse(async e=>{if(e instanceof m||e.isMesh||e instanceof n.SkinnedMesh||e.isSkinnedMesh)for(const t of Ye(e.material))t.hasOwnProperty("color")&&i.push(e)}),Promise.all(i.map(async e=>{if(e.material instanceof Array)for(let n=0;n<e.material.length;n++){const i=e.material[n];if(null==i.color||!(i.color instanceof l))continue;const o=Pa(i),c=i.name;if(ja(i,t,e.userData["originalColor_"+n],e.userData["originalMaterialName_"+n])){const i=Da(await a(t.materialId),r.textureFlipY),l=e.material[n];null!=i&&l.id!=i.id&&(e.material[n]=i,e.userData["originalColor_"+n]=e.userData["originalColor_"+n]??o,e.userData["originalMaterialName_"+n]=e.userData["originalMaterialName_"+n]??c,null!=s&&s.set(e.id+"#"+n,l))}}else if("color"in e.material){const n=e.material,i=Pa(n),o=n.name;if(ja(n,t,e.userData.originalColor,e.userData.originalMaterialName)){const n=Da(await a(t.materialId),r.textureFlipY),l=e.material;null!=n&&(e.material=n,e.userData.originalColor=e.userData.originalColor??i,e.userData.originalMaterialName=e.userData.originalMaterialName??o,null!=s&&(s.has(e.id)||s.set(e.id,l)))}}}))}const Ca=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 Da(e,t){if(null==e||null==t||!function(e,t){return function(e){const t=[];for(const[a,s]of Object.entries(e))Ta(a,s)&&t.push(s);if(e instanceof n.ShaderMaterial)for(const[a,s]of Object.entries(e.uniforms))Ta(a,s.value)&&t.push(s.value);return t}(e).some(e=>e.flipY!==t)}(e,t))return e;let a=Ca.get(e);null==a&&(a=new Map,Ca.set(e,a));const s=a.get(t);if(null!=s)return s;const r=Oa(e);if(function(e,t){for(const a of Object.keys(e)){const s=e[a];Ta(a,s)&&(e[a]=Ea(s,t))}}(r,t),r instanceof n.ShaderMaterial){for(const[e,a]of Object.entries(r.uniforms))Ta(e,a.value)&&(a.value=Ea(a.value,t));r.uniformsNeedUpdate=!0}return r.needsUpdate=!0,a.set(t,r),r}function Oa(e){const t=e.clone();return t.userData={...e.userData??{}},t}function Ta(e,t){const a=t;return(t instanceof x||!0===a?.isTexture)&&!e.toLowerCase().includes("envmap")&&!0!==a.isCompressedTexture&&!0!==a.isCompressedArrayTexture}function Ea(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 ka(e,t){if(e instanceof n.ShaderMaterial&&t instanceof n.ShaderMaterial){return e.fragmentShader+e.vertexShader==t.fragmentShader+t.vertexShader&&function(e,t){if(e instanceof n.ShaderMaterial&&t instanceof n.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 Na(e){if(null!=e){for(let t=0;t<e.array.length;t++)e.setX(t,0);e.needsUpdate=!0}}function za(e,t){const a=He(e);return null==a?"":function(e,t){const a=us(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&&$a(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 Va(e,t){const a=us(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,Fa(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 Ba=new WeakMap;function Fa(e,t){return e.getAttribute(t)??function(e,t){if("uv"===t)return function(e){let t=Ba.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 n.Float32BufferAttribute(new Float32Array(2*a.count),2),Ba.set(e,t));return t}(e);throw new Error(`Unsupported synthetic batching geometry attribute: ${t}`)}(e,t)}function $a(e){return null!=e.getAttribute("position")}const Ua=new WeakMap,Ga="hbat_",La=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 _a(e){let t=Ua.get(e);return null==t&&(t=function(e){let t=e.type;if(e instanceof G)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(Ja(a))continue;const s=e.uniforms[a]?.value;Ya(s)||(t+=`u:${a}:${es(s)};`)}return t+=Ra(e.vertexShader),t+=Ra(e.fragmentShader),t}(e);else if(e instanceof n.MeshStandardMaterial&&!(e instanceof n.MeshPhysicalMaterial)||(t+=e.id+""),(e instanceof n.MeshBasicMaterial||e instanceof n.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 n.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 n.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 n.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);return t+=e.side,t+=e.transparent?"t":"",t+=e.vertexColors?"vc":"",t+=e.depthWrite?"dw":"",t+=e.depthTest?"dt":"",t+=e.alphaTest?"at":"",t}(e),Ua.set(e,t)),t}const Wa=new Map;function Ra(e){return Wa.has(e)||Wa.set(e,`shader_${Wa.size}`),Wa.get(e)}function Ja(e){return La.has(e)||e.startsWith("hology_")}function qa(e,t){return e instanceof G?e.uniforms[t]?.value:e[t]}function Ya(e){return"number"==typeof e||e instanceof I||e instanceof P||e instanceof j||e instanceof l}function Xa(e){return"number"==typeof e?1:e instanceof I?2:4}function Za(e,t){const a=e.replace(/[^A-Za-z0-9_]/g,"_");let s=Ga+a;for(;t.has(s);)s=Ga+s;return t.add(s),s}function Ha(e,t){const a={};for(const[s,r]of Object.entries(e.uniforms))t.has(s)||(a[s]={value:r.value});return a}const Ka=new WeakMap;let Qa=1;function es(e){if(null==e)return"null";if(e instanceof x||!0===e?.isTexture)return`texture:${e.id}`;if(e instanceof n.Matrix3||e instanceof n.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=Ka.get(e);return null==t&&(t=Qa++,Ka.set(e,t)),`object:${t}`}return String(e)}function ts(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 as=new f,ss=new c;function rs(e,t){return ss.copy(e),ss.x*=-1,ss.y*=-1,ss.z*=-1,t.isCubeTexture&&!1===t.isRenderTargetTexture&&(ss.y*=-1,ss.z*=-1),(new n.Matrix3).setFromMatrix4(as.makeRotationFromEuler(ss))}function ns(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 is=new j;function os(e,t){return e===t||null==e==(null==t)&&("number"==typeof e&&"number"==typeof t?e===t||isNaN(e)&&isNaN(t):e instanceof n.Color&&t instanceof n.Color?e.r===t.r&&e.g===t.g&&e.b===t.b:e instanceof I&&t instanceof I?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 j&&t instanceof j&&(e.x===t.x&&e.y===t.y&&e.z===t.z&&e.w===t.w))}function ls(e){const t=[];for(const[a,s]of Object.entries(e))s instanceof de?t.push(s):s instanceof ve&&t.push(...ls(s));return t}const cs=new WeakMap;function us(e,t){const a=Object.keys(e.attributes).filter(a=>ps(e,t,a));return!e.hasAttribute("uv")&&$a(e)&&ps(e,t,"uv")&&a.push("uv"),a}function ps(e,t,a){return"position"===a||("uv"===a?function(e){if(e instanceof G)return ds(e,"uv");if(e instanceof n.ShaderMaterial)return fs(e.vertexShader,"uv");if(e instanceof $t&&null!=e.heightMap)return!0;return hs.some(t=>e[t]?.isTexture)}(t):t instanceof G?ds(t,a):t instanceof n.ShaderMaterial?function(e,t){if("uv1"===t||"uv2"===t||"uv3"===t)return fs(e.vertexShader,t);return!0}(t,a):"uv1"!==a&&(("color"!==a||!function(e){let t=cs.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 cs.set(e,t),t}(e))&&("uv2"!==a||(null!=t.lightMap||null!=t.aoMap))))}const hs=["map","alphaMap","emissiveMap","normalMap","bumpMap","displacementMap","roughnessMap","metalnessMap","aoMap","specularMap","gradientMap","clearcoatMap","clearcoatNormalMap","clearcoatRoughnessMap","iridescenceMap","iridescenceThicknessMap","sheenColorMap","sheenRoughnessMap","transmissionMap","thicknessMap","anisotropyMap"];function ds(e,t){return fs(e.vertexShader,t)}function fs(e,t){return new RegExp(`(^|[^A-Za-z0-9_])${a=t,a.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}([^A-Za-z0-9_]|$)`).test(e);var a}function ms(e,t,a){if(t(e))return e;for(const s of e.children??[]){const e=ms(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=>ms(e,t,a));if(null!=e)return e}}return null}const gs=new P,ys=new P,ws=new P,bs=new j,vs=new j,Ss=new f,Ms=new f,As=new b;function xs(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++)gs.fromBufferAttribute(a,t),e.applyBoneTransform(t,gs),a.setXYZ(t,gs.x,gs.y,gs.z);a.needsUpdate=!0}if(null!=s||null!=r){const a=t.getAttribute("skinIndex"),n=t.getAttribute("skinWeight");if(null!=a&&null!=n){for(let t=0;t<a.count;t++)Is(e,t,Ms),null!=s&&(ys.fromBufferAttribute(s,t),As.getNormalMatrix(Ms),ys.applyMatrix3(As).normalize(),s.setXYZ(t,ys.x,ys.y,ys.z)),null!=r&&(ws.fromBufferAttribute(r,t),ws.transformDirection(Ms),r.setXYZ(t,ws.x,ws.y,ws.z));null!=s&&(s.needsUpdate=!0),null!=r&&(r.needsUpdate=!0)}}t.deleteAttribute("skinIndex"),t.deleteAttribute("skinWeight"),t.computeBoundingBox(),t.computeBoundingSphere();const n=new m(t,e.material);return n.copy(e,!1),n.geometry=t,n.material=e.material,n.userData={...e.userData},n}function Is(e,t,a){const s=e.geometry,r=s.getAttribute("skinIndex"),n=s.getAttribute("skinWeight"),i=e.skeleton;bs.fromBufferAttribute(r,t),vs.fromBufferAttribute(n,t),a.identity().multiplyScalar(0);for(let e=0;e<4;e++){const t=vs.getComponent(e);if(0===t)continue;const s=bs.getComponent(e);Ss.multiplyMatrices(i.bones[s].matrixWorld,i.boneInverses[s]);for(let e=0;e<16;e++)a.elements[e]+=Ss.elements[e]*t}return a.premultiply(e.bindMatrixInverse).multiply(e.bindMatrix),a}function Ps(e){let t=!0;return e.traverse(a=>{a===e||a.isBone||(t=!1)}),t}function js(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 Cs(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 n from"three";import{BoxGeometry as i,BufferGeometry as o,Color as l,Euler as c,Fog as u,FogExp2 as p,Group as h,Material as d,Matrix4 as f,Mesh as m,MeshLambertMaterial as g,MeshPhongMaterial as y,MeshStandardMaterial as w,Matrix3 as b,Object3D as v,PointLight as S,Quaternion as M,Scene as A,Texture as x,Vector2 as I,Vector3 as P,Vector4 as j}from"three";import{attributes as C,batchingUniformFloat as O,batchingUniformVec2 as D,batchingUniformVec3 as T,batchingUniformVec4 as E,bool as k,BooleanExpression as N,BooleanNode as z,colorToNormal as V,float as B,FloatNode as F,ifDefApply as $,mix as U,NodeShaderMaterial as G,rgb as L,rgba as _,RgbNode as W,select as R,standardMaterial as J,Texture2dLookupNode as q,textureSampler2d as Y,textureSampler2dArray as X,UniformBoolNode as Z,UniformFloatNode as H,UniformSampler2dArraySlice as K,UniformVec2Node as Q,UniformVec3Node as ee,UniformVec4Node as te,varying as ae,varyingAttributes as se,varyingTransformed as re,vec2 as ne,Vec2Node as ie,vec3 as oe,Vec3Node as le,vec4 as ce,Vec4Node as ue}from"three-shader-graph";import{Service as pe}from"typedi";import{VfxActor as he}from"../effects/vfx/vfx-actor.js";import{VisualEffect as de}from"../effects/vfx/vfx-param.js";import{Prefab as fe,PrefabOf as me}from"./objects/prefab.js";import{DataAssetRef as ge}from"./objects/data-asset.js";import{$actorOptions as ye,BaseActor as we}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 Se}from"../gameplay/services/physics/physics-system.js";import{NetMode as Me}from"../gameplay/net/net-session.js";import{NetRole as Ae}from"../gameplay/net/service/net-actor-role.js";import{ThreeBlendingMode as xe}from"../effects/vfx/vfx-asset.js";import{withInjectionContext as Ie}from"../gameplay/inject.js";import{RenderingView as Pe}from"../rendering.js";import{curveSampler as je,oneMinus as Ce,particleUniforms as Oe,Sampler2DNode as De}from"../shader-nodes/index.js";import{LambertShader as Te}from"../shader/builtin/lambert-shader.js";import{LandscapeCompositeShader as Ee}from"../shader/builtin/landscape-composite-shader";import{LandscapeShader as ke}from"../shader/builtin/landscape-shader.js";import{StandardShader as Ne}from"../shader/builtin/standard-shader.js";import{UnlitShader as ze}from"../shader/builtin/unlit-shader.js";import{extractShaderParameters as Ve,getDataAssetDefinitionType as Be,getParameterDefinitionId as Fe,getParameterDefinitionType as $e,isDataAssetDefinitionAbstract as Ue,isParameterDefinitionAbstract as Ge,isParameterDefinitionAssignableTo as Le,isParameterDefinitionStructAssignableTo as _e,shaderParameterUniformName as We}from"../shader/parameter.js";import{ArrayMap as Re,DefaultMap as Je,groupBy as qe}from"../utils/collections.js";import{iterateMaterials as Ye}from"../utils/materials.js";import{filterChildrenShallow as Xe,filterSceneShallow as Ze,findFirstVisibleMesh as He,findFirstVisibleObject as Ke,traverseAsync as Qe}from"../utils/three/traverse.js";import{AssetMeshInstance as et,AssetResourceLoader as tt}from"./asset-resource-loader.js";import{AssetsProvider as at}from"./assets-provider.js";import{isCollisionMesh as st}from"./collision/collision-shape-import.js";import{BoxCollisionShape as rt,PhysicalShapeMesh as nt}from"./collision/collision-shape.js";import{LandscapeManager as it}from"./landscape/landscape-manager.js";import{initLandscape as ot}from"./landscape/landscape.js";import{SectionGrid as lt,smoothNormalsCrossMeshes as ct}from"./landscape/utils.js";import{createGrassFoliageMaterial as ut}from"./materials/grass-foliage.js";import{createGrassMaterial as pt}from"./materials/grass.js";import{getMaterialAttribute as ht}from"./materials/utils/material-painting.js";import{PaintedScatterManager as dt}from"./scatter/painted-scatter-manager.js";import{SurfaceScatterManager as ft}from"./scatter/surface-scatter-manager.js";import{createWaterMaterial as mt}from"./materials/water.js";import{SerializedParamType as gt}from"./model.js";import{applyRuntimeParamTypeInference as yt,convertConfiguredParamsToRuntimeTypes as wt,convertConfiguredParamValueToRuntimeType as bt,inferRuntimeSerializedParamTypeHint as vt}from"./custom-param-runtime-types.js";import{ShapeLibrary as St,ShapeLibraryKeys as Mt}from"./objects/shapes.js";import{ambientLightName as At,createSky as xt,defaultSkyMaterial as It}from"./sky.js";import{Curve2 as Pt}from"../utils/curve.js";import{DecalUnlitShader as jt}from"../shader/builtin/decal-unlit-shader.js";import{DecalStandardShader as Ct}from"../shader/builtin/decal-standard-shader.js";import{ClusterGenerator as Ot}from"../rendering/cluster-generator.js";import{ColorLayer as Dt,defaultValueColorLayer as Tt,defaultValueMaskLayer as Et,MaskLayer as kt}from"../shader/color-layer.js";import{LayeredShader as Nt}from"../shader/builtin/layered-shader";import{isColorLayerSerialized as zt}from"../shader/color-layer";import{FogVolume as Vt}from"../rendering/fog/fog-volume-actor.js";import{UnscaledSprite as Bt}from"../utils/three/unscaled-sprite.js";import{ToonShader as Ft}from"../shader/builtin/toon-shader.js";import{BatchedMesh2 as $t}from"./batched-mesh-2.js";import{ParallaxStandardMaterial as Ut}from"../shader/builtin/standard-shader";import{parallaxOcclusionMapping as Gt}from"../shader-nodes/pom.js";import{traverseVisibleEvery as Lt}from"../utils/three/traverse";import{RectAreaLightHelper as _t}from"three/examples/jsm/Addons.js";import{createSequenceData as Wt,isSequenceData as Rt,Sequence as Jt}from"../effects/sequence/sequence-data.js";import{applyUvTiling as qt}from"./../shader/uv-nodes.js";import{buildShaderGraphMaterial as Yt,shaderGraphMaterialSideToThree as Xt}from"../shader/graph/index.js";import{hasExecutableEventGraphDocument as Zt}from"../gameplay/event-graph/model.js";export{yt as applyRuntimeParamTypeInference,wt as convertConfiguredParamsToRuntimeTypes,bt as convertConfiguredParamValueToRuntimeType,vt as inferRuntimeSerializedParamTypeHint};const Ht={},Kt=/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent),Qt=/^((?!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 ea(e,this.dataProvider,this.assetsService,this.assetManagerService,t,[],[],{create:()=>null,initActor:async()=>{}})}}let ea=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,i,o,l,c,u=[]){this.scene=e,this.dataProvider=t,this.assetsService=a,this.assetManagerService=s,this.renderingView=i,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=Me.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._originalMaterials=new Map,this.pmremGeneratorResults=new WeakMap,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),this.handlePaintedScatterSceneMutation(e),this.handleSurfaceScatterSceneMutation(e)}),t.onUpdate(e=>{this.update(e),this.handlePaintedScatterSceneMutation(e),this.handleSurfaceScatterSceneMutation(e)}),t.onRemove(e=>{this.remove(e),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)e.traverse(e=>{if(e instanceof n.Mesh)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)});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})});for(const e of this.assets.values())if("prefab"==e.type){if(!e.prefab.objects.some(e=>gs(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)})}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)}),(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 ha(e,async e=>{"vfx"===e.type&&e.assetId===t.id&&(this.remove(e),await this.materializeAndInitActor(e))});else if("texture"===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.refreshMaterialTextures(e,e.material[a],t,a);else this.refreshMaterialTextures(e,e.material,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 ha(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))}})}})}async refreshMaterialTextures(e,t,a,s){if("texture"!==a.type)return void console.error("Can not refresh material textures. Asset is not a texture",a);const r=await this.assetManagerService.getTexture(a);if(null!=r)if(t instanceof n.ShaderMaterial)for(const[e,s]of Object.entries(t.uniforms))s.value instanceof n.Texture&&s.value.userData.assetId===a.id&&(t.uniforms[e].value=r);else for(const[e,s]of Object.entries(t))s instanceof n.Texture&&s.userData.assetId===a.id&&(t[e]=r);else console.error("Can not refresh material textures. Texture not found",a)}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===gt.Material&&s.value===a.id){t=!0;break}if(s.type===gt.Array&&"element"in s&&s.element===gt.Material&&s.value.includes(a.id)){t=!0;break}}if(!t)return}const n=await materialFromAsset(this.assets.get(r),this.renderingView,this.assetsService,this.assetManagerService,this.shaders,!1),i=n.userData;n.userData=t.userData,n.userData.hasBloom=i.hasBloom,n.userData.reflective=i.reflective,n.userData.outlineParameters=i.outlineParameters,null!=s?Na(e.material[s],n)||(e.material[s]=n):Na(e.material,n)||(e.material=n,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===gt.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){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(),aa.clear(),sa.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)}async initVfx(){console.time("Init VFX");const e=new Set,t=[],a=new A;for(const s of this.actorInstances){const r=cs(s);for(const s of r){const r=s.asset;if(e.has(r.id))continue;e.add(r.id),r.vfx.emitters;const n=await s.create(a);a.add(n.object),a.add(n.particleSystemContainer),n.play(),n.onUpdate(.5),n.stop(),n.pause(),t.push(n)}}const s=this.renderingView.compileAsync(a);this.renderingView.initTextures(a),await s;for(const e of t)e.onEndPlay(),e.disposed.next(!0),e.object.removeFromParent();console.timeEnd("Init VFX")}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("/"),n=r.slice(0,-1),i=n.join("/"),o=(r[r.length-1],new Map);for(const[e,t]of this.materializedActors)if(o.set(e,t),0===i.length)e.includes("/")||o.set(e,t);else if(e.startsWith(i+"/")){const a=e.slice(i.length+1);a.includes("/")||o.set(a,t)}const l={...s?.actor?.params??{},...a.actor?.params??{}},c=[...a.actor?.innerParams??[]];for(let t=n.length-1;t>=0;t--){const a=n.slice(0,t+1).join("/"),s=this.idToSceneObject.get(a);if("prefab"===s?.type&&null!=s.prefab){const n=await this.assetsService.getAsset(s.assetId);if(null!=n){let i=!1,o=a+"/"+n.prefab?.mainActorId;for(;null!=o;){if(o===e){i=!0;break}o=this.prefabInstanceExposedActorMap.get(o)}if(i&&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&&(i?c.push({path:Sa(t.path,e)?t.path.slice(e.length):t.path,params:a}):Sa(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=i.length>0?i+"/"+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[n,i]of s.entries()){const s=this.componentTypes.find(e=>e.name===i.type);if(null==s){console.warn(`Component type '${i.type}' not found for actor ${t.id}`);continue}const o=e.attach(s.type);if(r[n]=o,null!=i.params){const e=await prepareClassParameters(i.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 i.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,n=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[n]&&await this.applyActorComponentParams(e[n],t,a,s)}canObjectBeInstanced(e){return e.physics?.type!==Se.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=>{!st(e)&&e.isMesh&&s.push(e)});const r=1==s.length&&0==s[0].children.length,n=!Qt,i=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||i&&n)&&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(),aa.clear(),sa.clear();const e=[],t=new Re,a=new Re,s=new Re;let r=0,i=0,o=0;const u=new Map,p=new Je(()=>new Map);for(const n of this.dataProvider.getObjects())await ha(n,async(n,c,h)=>{if(!this.shouldBeMaterialized(n))return;const d="asset_mesh"==n.type&&this.canObjectBeInstanced(n)&&await this.canAssetBeInstanced(n),f="shape_mesh"===n.type&&"landscape"!==n.shape&&n.physics?.type!==Se.dynamic;if(d||f){if(c&&c.children?.length>0){const e=c.children.findIndex(e=>e.id===n.id);e>=0&&c.children.splice(e,1)}if(f){let e=n.shape+JSON.stringify(n.shapeParams??{})+n.castShadow+n.receiveShadow;const t=n.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===gt.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:{...n,parentTransform:h},color:r}),o++}else{const e=this.assets.get(n.assetId);null==e&&console.log("Can't find asset with id "+n.assetId);let s=u.get(n.assetId);if(null==s){const e=await this.createFromAsset(n,{assignMaterials:!1});if(null==e)return;if(s=u.get(n.assetId),null==s){s={useBatchedMesh:null!=He(e)&&Lt(e,e=>!(e instanceof m)||this.testCanBatch(e.material,e.geometry)),assetMesh:e},u.set(n.assetId,s)}}const o=xa(n.materialAssignments,e.materialAssignments);if(s.useBatchedMesh)await Qe(s.assetMesh,async t=>{if(!(t instanceof m))return;const s=Array.isArray(t.material)?t.material[0]:t.material,i=await this.resolveMaterialForAssignments(s,o,e);if(null!=i){p.get(n.id).set(t.uuid,i);let e=Va(t,i);e+=Wa(i),a.push(e,{...n,parentTransform:h,meshUUID:t.uuid}),r++}else console.warn("Can not materialize mesh because missing material",n)});else{const e=n.assetId+JSON.stringify(n.materialAssignments??[]);t.push(e,{...n,parentTransform:h}),i++}}}else null==c&&e.push({...n,parentTransform:h})});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 ${i} 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,p,u);const a=this.assets.get(t[0].assetId);e instanceof $t&&e.perInstanceCastShadow||(e.castShadow=Cs(t,a?.castShadow??!1)),e.receiveShadow=Os(t,a?.receiveShadow??!1);const s=new et;s.add(e),s.userData.src=t[0],s.castShadow=!1,s.receiveShadow=!1,this.scene.add(s)}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=Cs(e,s?.castShadow??!1),t.receiveShadow=Os(e,s?.receiveShadow??!1);const r=new et;r.add(t),r.userData.src=e[0],a instanceof et&&(r.collisionShapes=a.collisionShapes),this.prepareCollisionShapesForInstanced(r),r.castShadow=!1,r.receiveShadow=!1,this.scene.add(r)}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=Ke(a,e=>!st(e)&&null!=e.geometry),r=Ta(s.material);null!=e[0].color&&null!=r.color&&(r.color=new l(16777215));const i=s.geometry;let o,u;!(Qt||r instanceof G||null==i.index)?(o=new n.BatchedMesh(e.length,i.getAttribute("position").count,i.index.count,r),o.perObjectFrustumCulled=!0,u=o.addGeometry(i)):o=new n.InstancedMesh(i,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 n.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 i;i=o instanceof n.BatchedMesh?o.addInstance(u):t,o.setMatrixAt(i,r),a.color}for(let t=0;t<e.length;t++){const s=e[t],r=new et;r.userData.src=e[0],a instanceof nt&&(r.collisionShapes=[a.collisionShape]),r.castShadow=!1,r.receiveShadow=!1,this.scene.add(r),r.add(o),null==o.userData.hasCollision&&(o.userData.hasCollision=[]),o.userData.hasCollision[t]=!1!==s.object.collisionDetection}}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 Ot;e.initScene(this.scene),e.clusters.forEach(e=>{this.renderingView.addCluster(e)})}prepareCollisionShapesForInstanced(e){e instanceof et&&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!Qt&&(!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 Re;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,i=0,o=0;const c=new Map;for(const[e,t]of s.entries()){const s=t[0].assetId,n=a.get(s);if(null==n){console.warn("Missing batching info for asset id "+s);continue}const l=Ke(n.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,i+=u.count*t.length,o+=t.length}const u=["color","map","roughness","roughnessMap","metalness","metalnessMap","opacity","alphaMap","aoMap","aoMapIntensity","normalMap","normalScale","emissive","emissiveIntensity","emissiveMap"],p=new Map,h=new Map,d=[];let f=new n.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 n.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 n.CompressedArrayTexture&&null!=r.userData.index&&(r=r.userData.index);const i=s.get(t);void 0===i||ls(r,i)?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=d.find(e=>e.params.length<4);if(null==a){const t="vp"+d.length;a={name:t,params:[e],node:E(t)},d.push(a)}else a.params.push(e);s=a.name,t=is(a.node,a.params.length-1)}else if(a instanceof j)t=E(s);else if(a instanceof P||a instanceof l)t=T(s);else if(a instanceof I)t=D(s);else if(a instanceof n.CompressedArrayTexture)s=e+"_i",t=O(s);else if(a instanceof x)continue;p.set(e,t),h.set(e,s)}let r=se.uv;g instanceof Ut&&null!=g.heightMap&&(r=Gt(r,Y(g.heightMap),B(g.heightScale)));let i=as(p.get("opacity"),F)??B(g.opacity??1);if(null!=g.alphaMap){let e;if(g.alphaMap instanceof n.CompressedArrayTexture){const t=X(g.alphaMap),a=as(p.get("alphaMap"),F)??B(g.alphaMap.userData.index??0);e=t.sample(oe(r.x,r.y,a))}else e=Y(g.alphaMap).sample(r);i=i.multiply(e.r)}let o=_(as(p.get("color"),le)??g.color,i);if(null!=g.map){let e;if(g.map instanceof n.CompressedArrayTexture){const t=X(g.map),a=as(p.get("map"),F)??B(g.map.userData.index??0);e=t.sample(oe(r.x,r.y,a))}else e=Y(g.map).sample(qt(r,g.map));o=o.multiply(e),i=i.multiply(e.a)}g.vertexColors&&(o=o.multiply(ce(ae(C.color.rgb),1)));let c=_(as(p.get("emissive"),le)??g.emissive,i);if(null!=g.emissiveMap){let e;if(g.emissiveMap instanceof n.CompressedArrayTexture){const t=X(g.emissiveMap),a=as(p.get("emissiveMap"),F)??B(g.emissiveMap.userData.index??0);e=t.sample(oe(r.x,r.y,a))}else e=Y(g.emissiveMap).sample(qt(r,g.emissiveMap));c=c.multiply(e)}const m=as(p.get("emissiveIntensity"),F)??B(g.emissiveIntensity??1),y=as(p.get("normalScale"),ie)??ne(g.normalScale??new I(1,1));let w=re.normal;if(null!=g.normalMap){let e;if(g.normalMap instanceof n.CompressedArrayTexture){const t=X(g.normalMap),a=as(p.get("normalMap"),F)??B(g.normalMap.userData.index??0);e=t.sample(oe(r.x,r.y,a))}else e=Y(g.normalMap).sample(qt(r,g.normalMap));w=V(e.rgb,y.x)}let b=as(p.get("roughness"),F)??B(g.roughness??1);if(null!=g.roughnessMap){let e;if(g.roughnessMap instanceof n.CompressedArrayTexture){const t=X(g.roughnessMap),a=as(p.get("roughnessMap"),F)??B(g.roughnessMap.userData.index??0);e=t.sample(oe(r.x,r.y,a))}else e=Y(g.roughnessMap).sample(qt(r,g.roughnessMap));b=b.multiply(e.g)}let v=as(p.get("metalness"),F)??B(g.metalness??0);if(null!=g.metalnessMap){let e;if(g.metalnessMap instanceof n.CompressedArrayTexture){const t=X(g.metalnessMap),a=as(p.get("metalnessMap"),F)??B(g.metalnessMap.userData.index??0);e=t.sample(oe(r.x,r.y,a))}else e=Y(g.metalnessMap).sample(qt(r,g.metalnessMap));v=v.multiply(e.b)}let S=B(1);if(null!=g.aoMap){let e;if(g.aoMap instanceof n.CompressedArrayTexture){const t=X(g.aoMap),a=as(p.get("aoMap"),F)??B(g.aoMap.userData.index??0);e=t.sample(oe(r.x,r.y,a))}else e=Y(g.aoMap).sample(qt(r,g.aoMap));S=S.multiply(e.r)}const M=as(p.get("aoMapIntensity"),F)??B(g.aoMapIntensity??0);let A=w;!0!==g.userData.disableAO&&(A=$("DOUBLE_SIDED",A,e=>R(new N("gl_FrontFacing"),e,e.multiplyScalar(-1))));const k=new G({color:J({color:o,roughness:b,metalness:v,ambientOcclusion:S,ambientOcclusionIntensity:M,emissive:c,emissiveIntensity:m,normal:A}),normal:w,roughness:b,emissive:c.rgb,transparent:g.transparent,alphaTest:g.alphaTest,envMap:g.envMap,opacity:i});null!=g.envMap&&(k.uniforms.envMapIntensity={value:g.envMapIntensity},k.uniforms.envMapRotation={value:ns(g.envMapRotation,g.envMap)}),k.envMap=g.envMap,k.side=g.side,f=k}else if(g instanceof G){const a=new Set,s=new Map,r=Object.keys(g.uniforms).filter(e=>!qa(e));for(const n of e){const e=t.get(n.id).get(n.meshUUID);if(!(e instanceof G))throw new Error("Expected NodeShaderMaterial in node material batch");for(const t of r){const r=e.uniforms[t]?.value,n=s.get(t);void 0===n||ls(r,n)?s.set(t,r):Xa(r)&&Xa(n)&&Za(r)===Za(n)&&a.add(t)}}const n=new Set(Object.keys(g.uniforms)),i={};for(const e of a){let t,a;const s=g.uniforms[e]?.value;if("number"==typeof s){let s=d.find(e=>e.params.length<4);if(null==s){const t=Ha("vp"+d.length,n);s={name:t,params:[e],node:E(t)},d.push(s)}else s.params.push(e);a=s.name,t=is(s.node,s.params.length-1)}else if(s instanceof j)a=Ha(e,n),t=E(a);else if(s instanceof P||s instanceof l)a=Ha(e,n),t=T(a);else{if(!(s instanceof I))continue;a=Ha(e,n),t=D(a)}p.set(e,t),h.set(e,a),i[e]=t}if(0===p.size)f=g;else{const e=new 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,transparent:g.transparent,alphaTest:g.alphaTest,envMap:g.envMap??null,fog:g.fog,lights:g.lights,uniforms:Ka(g,new Set(p.keys())),uniformNodes:i});e.uniformNodes=i,y=g,(b=e).name=y.name,b.side=y.side,b.blending=y.blending,b.depthWrite=y.depthWrite,b.depthTest=y.depthTest,b.colorWrite=y.colorWrite,b.toneMapped=y.toneMapped,b.visible=y.visible,b.opacity=y.opacity,b.forceSinglePass=y.forceSinglePass,b.premultipliedAlpha=y.premultipliedAlpha,b.polygonOffset=y.polygonOffset,b.polygonOffsetFactor=y.polygonOffsetFactor,b.polygonOffsetUnits=y.polygonOffsetUnits,b.shadowSide=y.shadowSide,Object.assign(b.defines,y.defines),Object.assign(b.userData,y.userData),b.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,b;const v=new $t(o,i,r,f);for(const e of d)v.initUniform(e.name,4);for(const[e,t]of p.entries()){if(d.some(t=>t.params.includes(e)))continue;let a=1;t instanceof ue||t instanceof le?a=4:t instanceof ie&&(a=2),v.initUniform(h.get(e)??e,a,0)}for(const[e,r]of s.entries()){const s=r[0].assetId,i=c.get(e);if(null==i){console.error(`Missing single asset mesh for mesh uuid ${e} and asset id ${s}`);continue}if(null==i.geometry){console.error("Missing geometry on mesh mesh");continue}const o=v.addGeometry(Ba(i.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=He(f.assetMesh)?.uuid===e,y=f.assetMesh instanceof et&&m?f.assetMesh.collisionShapes:void 0,w=this.configureBatchedInstancedMesh(r,v,i,o,y);for(let e=0;e<w.length;e++){const a=r[e],s=w[e];v.setCastShadowAt(s,a.castShadow??u?.castShadow??!1);const i=t.get(a.id).get(a.meshUUID),o=i.userData.surface;null!=o&&(v.surfaceByInstance[s]=o);for(const e of d){let t=os.set(0,0,0,0);for(let a=0;a<e.params.length;a++){const s=Ya(i,e.params[a]);"number"==typeof s&&t.setComponent(a,s)}v.setUniformAt(e.name,s,t)}for(let e of p.keys()){if(d.some(t=>t.params.includes(e)))continue;const t=h.get(e)??e;let a=Ya(i,e);if(a instanceof l&&(a=new P(a.r,a.g,a.b)),a instanceof n.CompressedArrayTexture)a=a.userData.index??0;else if(a instanceof x||null==a)continue;v.setUniformAt(t,s,a)}}}return v}async createInstancedMesh(e,t){const a=Ke(t,e=>!st(e)&&null!=e.geometry),s=await this.assetsService.getAsset(e[0].assetId);await this.applyMaterials(t,xa(e[0].materialAssignments,s.materialAssignments),s),a.updateMatrix();const r=a.geometry.clone(),i=a.material;let o;if(o=new n.InstancedMesh(r,i,e.length),this.configureBatchedInstancedMesh(e,o,a),a.material instanceof d&&o.castShadow&&o.receiveShadow&&Array.isArray(i))for(const e of i);return o}configureBatchedInstancedMesh(e,t,a,s,r){const i=[];a.updateWorldMatrix(!0,!0);for(let o=0;o<e.length;o++){let l=o;t instanceof n.BatchedMesh&&(l=t.addInstance(s)),i.push(l);const u=(new n.Matrix4).compose((new P).fromArray(e[o].position),(new M).setFromEuler((new c).fromArray(e[o].rotation)),(new P).fromArray(e[o].scale)),p=(new f).copy(e[o].parentTransform).multiply(u),h=(new f).copy(p).multiply(a.matrixWorld);t.setMatrixAt(l,h),null==t.userData.hasCollision&&(t.userData.hasCollision=[]);const d=this.assets.get(e[o].assetId);t.userData.hasCollision[l]=!1!==e[o].collisionDetection||!1!==d?.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]=p)}return i}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 Ze(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,n=null;const i=getConvertedFbxToGlbAssignedMaterialTextureFlipY(a);for(const e of t??[]){if(!Ca(s,e,r,n))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=Da(a,i)),null!=a&&s.id!==a.id&&(r=r??ja(s),n=n??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));Ze(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,Ze(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 aa.entries())t.userData.customShaderName&&aa.delete(e);this.landscapeManagers.forEach(t=>t.updateShaders(e)),Ze(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 n=!1;if(t.traverseAncestors(e=>{"_hology_transform_group"===e.name&&(n=!0)}),!n){const a=this.findParent(e);null!=a&&a.uuid!=t.uuid?a.attach(t):console.error("Parent is wrong")}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);xa(e.materialAssignments,a.materialAssignments).forEach(e=>this.applyMaterial(t,e,a))}else"shape_mesh"===e.type&&this.applyMaterials(t,e.materialAssignments);if(n||(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.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 _t&&e.update()})}}else if("landscape"===e.shape){const a=this.landscapeManagers.find(t=>t.source.id===e.id),n=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&&n){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 p?"density":"linear")!==e.fog.type;this.scene.fog=pa(e.fog),t&&(a=this.scene).traverse(e=>{if(e instanceof m){const t=e.material;t instanceof G&&(a.fog instanceof u?(t.uniforms.fogFar.value=a.fog.far,t.uniforms.fogNear.value=a.fog.near):a.fog instanceof p&&(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 Vt){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))&&!n){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 nt&&(t.geometry=a.geometry,t.collisionShape=a.collisionShape)}if("shape_mesh"===e.type&&"landscape"!==e.shape)ta(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;ta(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 n=!1,i=!1;const o=await this.tryApplyLiveParameterUpdate(e,t?.params??{},a?.params??{});!1===o&&(i=!0),n||(n=!0===o);const l=await this.applyLiveInnerParameterUpdates(e,t?.innerParams??[],a?.innerParams??[]);i||(i=l.rejected),n||(n=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){i=!0,u.push(t);continue}const l=await this.tryApplyLiveParameterUpdate(o,t?.params??{},a?.params??{});!1===l&&(i=!0),n||(n=!0===l);const p=await this.applyLiveInnerParameterUpdates(o,t?.innerParams??[],a?.innerParams??[]);i||(i=p.rejected),n||(n=p.hasChanges),u.push({...a,params:!1===l?t?.params:a?.params,innerParams:p.applied})}return{applied:{...a,params:!1===o?t?.params:a?.params,innerParams:l.applied,components:u},hasChanges:n,rejected:i}}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=ma(e.prefab?.objects??[]),r=ma(t.prefab?.objects??[]);if(s.size!==r.size||[...s.keys()].some(e=>!r.has(e)))return!1;const n=[];await this.applyLiveNestedPrefabOverrideUpdates(e,t,a,n);for(const i of a.values())for(const[a,o]of s){const s=r.get(a),l=i.actorsById.get(a);if(null==s||null==l){n.push(`${i.prefix}/${a}`);continue}const c=i.actorSettingsById.get(a)??ya(o,i.source,e.prefab?.mainActorId===a),u=ya(o,i.source,e.prefab?.mainActorId===a),p=wa(u,ya(s,i.source,t.prefab?.mainActorId===a),i.desiredActorSettingsById.get(a)??u);if(i.desiredActorSettingsById.set(a,p),JSON.stringify(c)===JSON.stringify(p))continue;const h=await this.applyLiveActorSettingsUpdate(l,c,p);i.actorSettingsById.set(a,h.applied),h.rejected&&n.push(`${i.prefix}/${a}`)}return n.length>0&&console.warn(`Some live parameters for prefab ${t.name??t.id} were not applied. The running instances were preserved: ${n.join(", ")}`),!0}async applyLiveNestedPrefabOverrideUpdates(e,t,a,s){const r=ga(e.prefab?.objects??[]),n=ga(t.prefab?.objects??[]);for(const[e,t]of r){const r=n.get(e);if(null==r||t.assetId!==r.assetId||JSON.stringify(t.prefab)===JSON.stringify(r.prefab))continue;const i=this.assets.get(r.assetId),o=this.livePrefabInstances.get(r.assetId);if("prefab"!==i?.type||null==i.prefab||null==o)continue;const l=ma(i.prefab.objects);for(const n of a.values()){const a=`${n.prefix}/${e}`,c=o.get(a);if(null!=c){for(const[e,n]of l){const o=c.actorsById.get(e);if(null==o){s.push(`${a}/${e}`);continue}const l=ya(n,t,i.prefab.mainActorId===e),u=ya(n,r,i.prefab.mainActorId===e),p=c.desiredActorSettingsById.get(e)??l,h=wa(l,u,p);c.desiredActorSettingsById.set(e,h);const d=c.actorSettingsById.get(e)??p;if(JSON.stringify(d)!==JSON.stringify(h)){const t=await this.applyLiveActorSettingsUpdate(o,d,h);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 n=!1,i=!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){i=!0,null!=a&&o.push(a);continue}!0===await this.tryApplyLiveParameterUpdate(u,a?.params??{},l?.params??{})?(null!=l&&o.push(l),n=!0):(i=!0,null!=a&&o.push(a))}return{applied:o,hasChanges:n,rejected:i}}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?Ze(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=qe(e.vertexMaterials,e=>e.m);t.traverse(e=>{if(e instanceof m){if(null==e.geometry)return;if(za(ht(e,0,!1)),a>0){za(ht(e,0,!1))}}});const r=new Set;for(const[e,n]of s.entries()){const s=null!=e?t.getObjectByName(e):this.findMeshWithGeometry(t);let i=!1;if(null==s||null==s.geometry)return void console.warn(`Failed to apply vertex materials on mesh with name "${e}"`);const o=ht(s,0,!0);za(o);for(const e of n)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),i=!0;if(a>0){const e=ht(s,4,!0);za(e);for(const t of n)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,i=!0}i&&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 n,i;switch(e.type){case"asset_mesh":n=await this.createFromAsset(e),n=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=Is(e),s=e.parent;if(null==s){a=t;continue}const r=s.children.indexOf(e);e.removeFromParent(),s.add(t);const n=s.children.indexOf(t);r>=0&&n>=0&&n!==r&&(s.children.splice(n,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&&js(e)&&e.removeFromParent()}(a),a}(n);break;case"shape_mesh":n=await this.createFromShape(e);break;case"light":n=await this.createLight(e);break;case"particles":n=await this.createParticleSystem(e),e.collisionDetection=!1;break;case"global_fog":this.scene.fog=pa(e.fog),this.fixFogColor(),n=new h;break;case"sky":this.sky=xt(),this.updateSky(e),n=this.sky;break;case"world_env":this.updateWorldEnv(e),n=new h,this.worldEnvObj=n;break;case"actor":({object:n,actor:i}=await this.createFromActor(e,s));break;case"group":case"scatter":n=new h;break;case"prefab":n=await this.createFromPrefab(e,s,t);break;case"vfx":n=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!=n){if(e.name&&e.name.length>0&&(n.name=e.name),this.applyTransform(e,n),a?n.userData._src=e:n.userData.src=e,null!=i&&(n.userData.actor=i),this.inEditor,this.inEditor,this.objectMap.set(n.uuid,e),this.sceneObjectMap.set(e.id,n),e.physics?.type!==Se.dynamic||null==t||this.inEditor?null==t?this.scene.add(n):null==t||"actor"!==e.type||this.inEditor?t?.add(n):(t.add(n),this.scene?.attach(n),console.log(n)):(t.add(n),n.getWorldPosition(n.position),n.getWorldQuaternion(n.quaternion),n.getWorldScale(n.scale),this.scene?.attach(n)),null!=e.children&&await Promise.all(e.children?.map(e=>this.materialize(e,n,a))),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==Se.dynamic||ua(n),null!=this.renderingView)return this.renderingView.renderer.shadowMap.needsUpdate=!0,n;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 dt(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 ft(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;null!=a&&null!=a.textureId?this.assetManagerService.getTexture(this.assets.get(a.textureId)).then(e=>{if(null==e)return void console.error("Failed to load environment texture with id "+a.textureId);if(null==this.pmremGenerator&&(this.pmremGenerator=new n.PMREMGenerator(this.renderingView.renderer),this.pmremGenerator.compileEquirectangularShader()),!this.pmremGeneratorResults.has(e))try{const t=this.pmremGenerator.fromEquirectangular(e).texture;this.pmremGeneratorResults.set(e,t)}catch(e){return void console.error("Failed to generate PMREM for environment texture",e)}const t=this.pmremGeneratorResults.get(e);this.renderingView.scene.environment=t,this.renderingView.scene.environmentIntensity=a.intensity??1}):this.renderingView.scene.environment=null}resetWorldEnv(){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=n.BackSide,(e instanceof w||e instanceof n.MeshBasicMaterial||e instanceof n.ShaderMaterial)&&(e.fog=!1),e.depthTest=!1}async createComponent(e,t,a,s){const r=new Ht[a.path+"/"+a.className],n=t.id+s;r.id=n,r.object=e;for(const e of a.params)null!=e.value&&(r[e.name]=e.value);return this.components.push(r),n}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===Me.none)return;const t=e.constructor[ye];!0!==t?.replicate?this.netMode===Me.client&&(e.netRole=Ae.none):e.netRole=this.netMode===Me.client?Ae.simulatedProxy:Ae.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 h;const a=ot(e.landscape.options);this.applyHeightMaps(a,e.landscape.heightMaps,!0);const s=new it(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 lt(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(()=>ct(r),50)}async createMeshByShape(e,t,a={}){if("landscape"!==e&&Mt.includes(e)){const s=await prepareShapeParameters(a??{}),r=e+JSON.stringify(a);if(!this.geometryCache.has(r)){const t=St[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,St[e].collision(s));return new nt(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(xa(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,n=e.castShadow??!!a.castShadow;return s.receiveShadow=r,ta(s,n,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}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 n=new h;null!=s&&this.applyTransform(s,n),null!=a&&a.add(n),await Promise.all(e.prefab.objects.filter(e=>"global_fog"!==e.type&&"world_env"!==e.type).map(e=>this.materialize(e,n,!0,structuredClone(t))));const i=t.sceneObjectChain.join("/"),o=Array.from(this.materializedActors.entries()).filter(([e,a])=>e.startsWith(i)&&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(i+"/")),u=c.map(([,e])=>e),p=new Map(c.map(([e,t])=>[e.slice(i.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([...ma(e.prefab?.objects??[])].map(([t,a])=>[t,ya(a,s,e.prefab?.mainActorId===t)]));t.set(i,{prefix:i,source:s,actorsById:p,actorSettingsById:a,desiredActorSettingsById:new Map(a)})}if(!this.inEditor&&!0!==t.runtimeSpawn&&Zt(e.prefab?.eventGraph)&&this.materializedPrefabEventGraphs.set(i,{id:i,graph:e.prefab.eventGraph,object:n,actors:u,actorsById:p,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:n,actors:u,actorsById:p,mainActor:l,instanceId:i}}async createParticleSystem(e){await this.assetsService.getAsset(e.assetId);return new v}async createLight(e){if("point"===e.light.type){const t=new S(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 n.TextureLoader).load("assets/light-bulb-icon.webp"),a=new n.SpriteMaterial({map:e,alphaTest:.5}),s=new Bt(a);s.scale.multiplyScalar(.6),t.add(s)}return t}if("spot"===e.light.type){const t=new n.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 v,t.target.position.set(0,-1,0),t.add(t.target),this.inEditor){const e=(new n.TextureLoader).load("assets/light-bulb-icon.webp"),a=new n.SpriteMaterial({map:e,alphaTest:.5}),s=new Bt(a);s.scale.multiplyScalar(.6),t.add(s),t.add(new n.SpotLightHelper(t))}return t}if("rectArea"===e.light.type){const t=new n.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 n.TextureLoader).load("assets/light-bulb-icon.webp"),a=new n.SpriteMaterial({map:e,alphaTest:.5}),s=new Bt(a);s.scale.multiplyScalar(.6),t.add(s);const r=new _t(t);t.add(r)}return t}return"directional"===e.light.type?(this.applyDirectionalLight(e.light.directional,e),new h):"ambient"===e.light.type?(this.applyDirectionalAmbientLight(null,e.light.ambient,e),new h):void 0}applyDirectionalAmbientLight(e,t,a){const s=this.scene.children.find(e=>e.name===At);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.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}};ea=e([pe(),t("design:paramtypes",[A,Object,at,tt,Pe,Array,Array,Object,Array])],ea);export{ea as SceneMaterializer};function ta(e,t,a){e.castShadow=t,e.receiveShadow=a,e.traverse(e=>{e.castShadow=t,e.receiveShadow=a})}const aa=new Map,sa=new Map,ra=new g({color:16711935}),na=new Map;export async function materialFromAsset(e,t,a,s,r,n=!0){if(null==e||null==e.material)return console.error("Asset or asset material is null",e),ra;const i=JSON.stringify(e.material)+t?._id,o=n&&!("shaderGraph"===e.material.type&&"asset"===e.material.shaderGraph?.source);if(o&&aa.has(i))return aa.get(i);if(o&&sa.has(i))return await sa.get(i);const l=_materialFromAsset(i,e,t,a,s,r,o);return o?sa.set(i,l).get(i):l}export async function _materialFromAsset(e,t,a,r,i,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},p={};if(null!=t.material.params?.map){const e=t.material.params.map,a=await r.getAsset(e);null!=a&&(u.map=await i.getTexture(a))}let h,d,f;switch(t.material.type){case"phong":h=new y({...u,...p});break;case"water":h=mt(u,a);break;case"grassFoliage":h=ut({color:u.color,map:u.map},a);break;case"grass":h=pt({...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),h=ra;break}"surface"===e.target&&null!=e.materialOptions?.side&&(d=Xt(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,i,a,o),n=t.shaderGraphPreviewNodeId,l=t.trailBillboard;h=Yt(e,{parameters:s,previewNodeId:n,trailBillboard:l,alphaTest:t.material.alphaTest}),h.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),h=ra}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:Kt?Te:Ne,lambert:Te,unlit:ze,toon:Ft,layered:Nt,landscape:ke,"landscape-composite":Ee,"decal-unlit":jt,"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 n=await prepareClassParameters(t.material?.shaderParams??{},e,r,i,null,a,o,void 0,void 0,s);Object.assign(s,n),s.alphaTest=t.material.alphaTest??s.alphaTest,h=s.build()}catch(e){console.log("Shader runtime error: "+e,e),na.has(t.material.shader)||na.set(t.material.shader,ra.clone()),h=na.get(t.material.shader)}h.userData.customShaderName=t.material.shader}else console.warn("Missing shader implementation with name "+t.material.shader),h=ra;break;default:throw new Error("Unsupported material type "+t.material.type)}if(a?.csm.setupMaterial(h),h.side=d??t.material.side??h.side??n.FrontSide,h.transparent=(f??t.material.transparent??u.transparent??!1)||h.transparent,h.alphaTest=t.material.alphaTest??h.alphaTest??0,null!=t.material.blending&&(h.blending=xe[t.material.blending]??n.NormalBlending),t.material.bloom&&(h.userData.hasBloom=!0),t.material.reflective&&(h.userData.reflective=!0),!0===t.material.outlines&&(h.userData.outlineParameters={},null!=t.material.outlineParams&&(null!=t.material.outlineParams.color&&(h.userData.outlineParameters.color=new l(t.material.outlineParams.color).toArray()),null!=t.material.outlineParams.thickness&&(h.userData.outlineParameters.thickness=t.material.outlineParams.thickness))),null!=t.material.surfaceAssetId&&""!==t.material.surfaceAssetId){const e=await materializeDataAssetRef(t.material.surfaceAssetId,r,i,void 0,a,o);null!=e&&(h.userData.surface=e.value)}return h.userData.assetId=t.id,c&&null!=a&&aa.set(e,h),c&&sa.delete(e),h}export function prepareCustomParamsFromShaderGraph(e,t={}){return Object.fromEntries((e.parameters??[]).map(e=>{const a=function(e){switch(e){case"float":return gt.FloatNode;case"boolean":return gt.BooleanNode;case"texture":return gt.Sampler2DNode;case"vec2":return gt.Vec2Node;case"vec3":return gt.Vec3Node;case"vec4":return gt.Vec4Node;case"color":return gt.RgbNode}}(e.type),s=t[e.name],r=s?.override??null!=s,n=void 0!==e.defaultValue?e.defaultValue:customParameterDefaultValueByType.get(a),i=!1===r?Aa(n):s?.value??Aa(n);return[e.name,{type:a,value:i,override:r}]}))}export async function prepareShaderGraphParameters(e,t,a,s,r,n){const i={},o=prepareCustomParamsFromShaderGraph(t,e);for(const[e,t]of Object.entries(o)){const o=await oa(e,t,a,s,null,r,n);null!=o&&(i[e]=o)}return i}export async function prepareClassParameters(e,t,a,s,r,n,i,o,l,c){const u={},{params:p,skipped:h}=wt(e,{parameterType:t,parameterTarget:c,extractPropertyParameters:Ve,toSerializedParamType:toSerializedParamType});for(const e of h)console.warn(`Skipping stored parameter "${e.key}" because it could not be converted from ${gt[e.sourceType]} to ${gt[e.targetType]}`);for(const[e,t]of Object.entries(p)){if(!1===t.override)continue;const c=await oa(e,t,a,s,r,n,i,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,n]of Object.entries(e)){const e=await oa(r,n,t,a,null,void 0,void 0,void 0,void 0,void 0);null!=e&&(s[r]=e)}return s}const ia=new Map;async function oa(e,t,a,s,r,n,i,o,u=t.value,p=t.type,h,d=(t.type===gt.Struct?t.struct:void 0)){if(null==t||null==u||""===u)return null;switch(p){case gt.Array:if(Array.isArray(u)&&"element"in t)return await Promise.all(u.map(l=>oa(e,t,a,s,r,n,i,o,l,t.element,h,t.elementStruct)));break;case gt.Number:case gt.FloatNode:let f;if("string"==typeof u?f=parseFloat(u):"number"==typeof u&&(f=u),p===gt.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=ia.get(e);return null==t&&(t=je(Pt.decode(e)),ia.set(e,t)),t}(e.easing),r=s.sample(Ce(Oe.energy));return U(B(t),B(a),r)}return new H(We(e),f,void 0,!1)}return f;case gt.Texture:let m=await s.getTexture(await a.getAsset(u));return"envmap"===e.toLowerCase()&&null!=n&&(m=n.getEnvTexture(m)),m;case gt.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 H(We(e)+"_i",a,void 0,!1))}const y=await s.getTexture(g);return y?Y(y):null;case gt.Boolean:return u;case gt.BooleanNode:return new Z(We(e),u,void 0,!1);case gt.Vector2:case gt.Vec2Node:if("object"==typeof u){const t=u instanceof Array?(new I).fromArray(u):new I(u.x,u.y);return p===gt.Vec2Node?new Q(We(e),t,void 0,!1):t}return null;case gt.Vector3:case gt.Vec3Node:if("object"==typeof u){const t=u instanceof Array?(new P).fromArray(u):new P(u.x,u.y,u.z);return p===gt.Vec3Node?new ee(We(e),t,void 0,!1):t}return null;case gt.Vector4:case gt.Vec4Node:if("object"==typeof u){const t=u instanceof Array?(new j).fromArray(u):new j(u.x,u.y,u.z,u.w);return p===gt.Vec4Node?new te(We(e),t,void 0,!1):t}return null;case gt.Color:case gt.RgbNode:const w=new l(u);return p===gt.RgbNode?new ee(We(e),new P(w.r,w.g,w.b),void 0,!1).rgb:w;case gt.String:return u;case gt.BaseActor:const b=u;if(null==r&&console.warn("Class parameters can not be prepared as actors are not passed in"),null==b)return null;if("object"==typeof b&&null!=b.type&&null!=b.id){if("actor"===b.type)return r?.get(b.id)??null;if("prefab"===b.type){const e=h?h(b.id):null;if(null!=e)return r?.get(e)??null;const t=[];for(const[e,a]of r?.entries()??[])e.startsWith(b.id+"/")&&t.push(a);return 1===t.length?t[0]:null}}if("string"==typeof b){const e=r?.get(b);if(null!=e)return e;const t=h?h(b):null;if(null!=t)return r?.get(t)??null;const a=[];for(const[e,t]of r?.entries()??[])e.startsWith(b+"/")&&a.push(t);return 1===a.length?a[0]:null}return null;case gt.Euler:const v=u;return(new c).fromArray(v);case gt.Object3D:{const e=await a.getAsset(u);return(await s.getMesh(e,{applyMaterials:!0,rescale:!0})).scene}case gt.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,n,a,s,i)}case gt.AudioBuffer:return await s.getAudio(await a.getAsset(u));case gt.VisualEffect:const S=await a.getAsset(u);if(null==o){console.error("Can not create instance of visual effect because missing actor provider");break}if("vfx"in S)return new de(o,S);console.error("Using a non-vfx asset for visual effect parameter");break;case gt.Prefab:{const e=await a.getAsset(u);return null==e?(console.error("Using a non-prefab asset for prefab parameter",u),null):new fe(e)}case gt.PrefabActor:{const e=await a.getAsset(u);return null==e?(console.error("Using a non-prefab asset for prefab parameter",u),null):new me(new fe(e))}case gt.DataAsset:return materializeDataAssetRef(u,a,s,r,n,i,o,h);case gt.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 Jt(e.sequence);console.error("Using a non-sequence asset for sequence parameter");break}case gt.SequenceData:return Rt(u)?u:(console.warn("Invalid inline sequence data parameter value",u),null);case gt.Struct:return async function(e,t,a,s,r,n,i,o,l){const c=la(e),u=c?.struct??t;if(null==u)return console.warn("Missing parameter definition id for struct parameter"),null;const p=$e(u);if(null==p)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&&!_e(u,t))return console.warn(`Parameter definition "${u}" is not assignable to "${t}"`),null;let h;try{h=new p}catch(e){return console.warn(`Failed to instantiate parameter definition "${u}"`,e),null}const d=function(e){const t=la(e);if(null!=t)return t.value;if(ca(e))return e;if(null!=e&&"object"==typeof e&&ca(e.params))return e.params;return{}}(c?.value??e),f=await prepareClassParameters(d,null,a,s,r,n,i,o,l,h);return Object.assign(h,f),h}(u,d,a,s,r,n,i,o,h);case gt.Curve:return Pt.decode(u);case gt.ColorLayer:case gt.MaskLayer:if(zt(u)){const e=await Dt.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 gt.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,n,i,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(Ue(u))return console.warn(`Can not instantiate abstract data asset definition "${u}"`),null;const p=Be(u);if(null==p)return console.warn(`Unknown data asset definition "${u}"`),null;let h;try{h=new p}catch(e){return console.warn(`Failed to instantiate data asset definition "${u}"`,e),null}const d=c.dataAsset.params??{};if("object"!=typeof d||Array.isArray(d))return console.warn(`Invalid data asset params for asset "${c.id}"`),null;try{const e=await prepareClassParameters(d,null,t,a,s,r,n,i,o,h);Object.assign(h,e)}catch(e){return console.warn(`Failed to materialize data asset "${c.id}"`,e),null}return new ge(c,h)}function la(e){return null!=e&&"object"==typeof e&&!Array.isArray(e)&&"string"==typeof e.struct&&ca(e.value)?e:null}function ca(e){return null!=e&&"object"==typeof e&&!Array.isArray(e)&&Object.values(e).every(e=>null!=e&&"object"==typeof e&&"type"in e)}function ua(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 pa(e){return"linear"===e.type?new u(new l(e.color),e.near??100,e.far??1e3):"density"===e.type?new p(e.color,e.density):void console.warn("Invalid fog type",e)}new w({color:4229780});async function ha(e,t,a,s){null==s&&(s=(new f).identity());const r=s.clone().multiply(da(e,new n.Matrix4));if(null!=e.children&&e.children.length>0)for(let a=e.children.length-1;a>=0;a--)await ha(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?gt.Number:t instanceof F||"function"==typeof e.prototype.isFloat?gt.FloatNode:t instanceof x||e===x||e.isTexture?gt.Texture:t instanceof De||e===De||e===q||"function"==typeof e.prototype?.isSampler2D||!0===e.prototype?.isSampler2D?gt.Sampler2DNode:t instanceof Boolean||e===Boolean?gt.Boolean:t instanceof z?gt.BooleanNode:t instanceof l||e==l?gt.Color:t instanceof W||"function"==typeof e.prototype.isRgb?gt.RgbNode:t instanceof I||e==I?gt.Vector2:t instanceof ie||"function"==typeof e.prototype.isVec2?gt.Vec2Node:t instanceof P||e==P?gt.Vector3:t instanceof le||"function"==typeof e.prototype.isVec3?gt.Vec3Node:t instanceof j||e==j?gt.Vector4:t instanceof ue||"function"==typeof e.prototype.isVec4?gt.Vec4Node:t instanceof String||e===String?gt.String:t instanceof we||e==we||e.prototype instanceof we||e.prototype==we?gt.BaseActor:t instanceof c||e==c?gt.Euler:t instanceof v||e==v?gt.Object3D:t instanceof d||e==d?gt.Material:t instanceof AudioBuffer||e==AudioBuffer?gt.AudioBuffer:t instanceof de||e==de?gt.VisualEffect:t instanceof fe||e==fe?gt.Prefab:t instanceof me||e==me?gt.PrefabActor:t instanceof ge||e==ge?gt.DataAsset:t instanceof Pt||e==Pt?gt.Curve:t instanceof Dt||e==Dt?gt.ColorLayer:t instanceof kt||e==kt?gt.MaskLayer:t instanceof n.AnimationClip||e==n.AnimationClip?gt.AnimationClip:t instanceof Jt||e==Jt?gt.Sequence:"SequenceData"===e.name||e.prototype&&"tracks"in e.prototype?gt.SequenceData:null!=Fe(e)?gt.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===gt.Struct?Fe(e.type):void 0;return!0===e.options.array?{type:gt.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 n=r;const i=t[e.name],o=fa(i)?i:void 0,l=!0===s.treatAllAsOptional||!0===e.options.optional,c=s.missingOverrideDefaultsToOverride??!0;let u=o?.override;void 0===u&&null!=i&&l&&c&&(u=!0),void 0===u&&l&&(u=!1);const p=void 0!==a[e.name]||void 0!==e.options.defaultValue,h=function(e,t){if(null==e.type){const a=function(e){return Rt(e)?{type:gt.SequenceData}:void 0}(t);null!=a&&(e=a)}if(e.type!==gt.Struct)return{typeInfo:e,value:t};const a=la(t);if(null==a)return{typeInfo:e,value:t};return{typeInfo:{...e,struct:a.struct},value:a.value}}(n,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===gt.Struct)return Ge(e.type)?{}:prepareCustomParamsFromType(e.type,{});return customParameterDefaultValueByType.get(a)}(e,a)),d=function(e,t){if(fa(e))return e;if(t.type!==gt.SequenceData||!Rt(e))return;return{type:gt.SequenceData,value:e}}(i,h.typeInfo);n=function(e,t,a){if(e.type!==gt.Struct||a?.type!==gt.Struct||null==a.struct)return e;const s=t.struct??e.struct;if(null==s||a.struct===s||_e(a.struct,s)||null==$e(a.struct))return{...e,struct:a.struct};return e}(h.typeInfo,r,d);const f=!1!==u||e.options.array?d?.value??function(e,t,a){if(!0===e.options.array)return a?Aa(t):[];return Aa(t)}(e,h.value,p):Aa(h.value);return[e.name,{...n,value:f,override:u}]}))}function fa(e){return null!=e&&"object"==typeof e&&!Array.isArray(e)&&"number"==typeof e.type&&"value"in e}function ma(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 ga(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 ya(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 wa(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])),n=new Map((a.innerParams??[]).map(e=>[JSON.stringify(e.path),e])),i=[];for(const e of new Set([...s.keys(),...r.keys(),...n.keys()])){const t=s.get(e),a=r.get(e),o=n.get(e),l=ba(t?.params??{},a?.params??{},o?.params??{});Object.keys(l).length>0&&i.push({path:a?.path??o?.path??t.path,params:l})}return{...t,params:ba(e.params??{},t.params??{},a.params??{}),innerParams:i}}function ba(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 Sa(e,t){return e.length>=t.length&&t.every((t,a)=>e[a]===t)}export function prepareCustomParamsFromType(e,t,a=null,s={}){const r=Ve(e);if(0===r.length)return{};let n;null!=a?Ie(a,()=>{n=a.get(e)}):n=new e;const i={};for(const e of r){const t=n[e.name];if(null!=t){const a=Ma(e,t);void 0!==a&&(i[e.name]=a)}}return prepareCustomParams(r,t,i,s)}function Ma(e,t){return!0===e.options.array?Array.isArray(t)?t.map(t=>serializeCustomParameter(e.type,t)??t):[]:serializeCustomParameter(e.type,t)}function Aa(e){return null==e?e:Array.isArray(e)?e.map(e=>Aa(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 I:return t instanceof I?t.toArray():void a();case P:return t instanceof P?t.toArray():void a();case j:return t instanceof j?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 fe:return t instanceof fe?t.asset?.id??null:void a();case ge:return t instanceof ge?t.id:"string"==typeof t?t:void a()}const s=Fe(e);if(null!=s){const r=la(t);if(null!=r)return r.struct===s?r.value:r;const n=function(e,t){if(null==t||"object"!=typeof t)return e;const a=t.constructor;return null!=Fe(a)&&Le(a,e)?a:e}(e,t),i=Fe(n),o=function(e,t){if(null==t)return null;if(ca(t))return t;if(null!=t&&"object"==typeof t&&ca(t.params))return t.params;if("object"!=typeof t)return;const a=Ve(e),s={};for(const e of a){const a=t[e.name];if(void 0===a)continue;const r=Ma(e,a);void 0!==r&&(s[e.name]=r)}return prepareCustomParams(a,{},s)}(n,t);return void 0!==o?null!=o&&null!=i&&i!==s?{struct:i,value:o}:o:void a()}if(Rt(t))return t}function xa(e,t){return function(e,t,a){const s=[],r=new Set;for(const n of[...e??[],...t??[]]){const e=a(n);r.has(e)||(r.add(e),s.push(n))}return s}((e??[]).filter(e=>Ia(e.materialId)),(t??[]).filter(e=>Ia(e.materialId)),e=>e.color+e.name)}function Ia(e){return"null"!=e&&null!=e}export const customParameterDefaultValueByType=new Map([[gt.RgbNode,"#000000"],[gt.Color,"#000000"],[gt.String,""],[gt.Vector4,[0,0,0,0]],[gt.Vec4Node,[0,0,0,0]],[gt.Vector3,[0,0,0]],[gt.Vec3Node,[0,0,0]],[gt.Vector2,[0,0]],[gt.Vec2Node,[0,0]],[gt.Euler,[0,0,0,"XYZ"]],[gt.Array,[]],[gt.DataAsset,null],[gt.SequenceData,Wt()],[gt.ColorLayer,Tt],[gt.MaskLayer,Et]]);let Pa=new l;new l;function ja(e){return null==e?.color?null:(Pa.set(e.color),"#"+Pa.getHexString())}function Ca(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 n=ja(e);return null!=n&&(n===t.color||a===t.color)}export function applyMaterial(e,t,a,s,r={}){const i=[];return e.traverse(async e=>{if(e instanceof m||e.isMesh||e instanceof n.SkinnedMesh||e.isSkinnedMesh)for(const t of Ye(e.material))t.hasOwnProperty("color")&&i.push(e)}),Promise.all(i.map(async e=>{if(e.material instanceof Array)for(let n=0;n<e.material.length;n++){const i=e.material[n];if(null==i.color||!(i.color instanceof l))continue;const o=ja(i),c=i.name;if(Ca(i,t,e.userData["originalColor_"+n],e.userData["originalMaterialName_"+n])){const i=Da(await a(t.materialId),r.textureFlipY),l=e.material[n];null!=i&&l.id!=i.id&&(e.material[n]=i,e.userData["originalColor_"+n]=e.userData["originalColor_"+n]??o,e.userData["originalMaterialName_"+n]=e.userData["originalMaterialName_"+n]??c,null!=s&&s.set(e.id+"#"+n,l))}}else if("color"in e.material){const n=e.material,i=ja(n),o=n.name;if(Ca(n,t,e.userData.originalColor,e.userData.originalMaterialName)){const n=Da(await a(t.materialId),r.textureFlipY),l=e.material;null!=n&&(e.material=n,e.userData.originalColor=e.userData.originalColor??i,e.userData.originalMaterialName=e.userData.originalMaterialName??o,null!=s&&(s.has(e.id)||s.set(e.id,l)))}}}))}const Oa=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 Da(e,t){if(null==e||null==t||!function(e,t){return function(e){const t=[];for(const[a,s]of Object.entries(e))Ea(a,s)&&t.push(s);if(e instanceof n.ShaderMaterial)for(const[a,s]of Object.entries(e.uniforms))Ea(a,s.value)&&t.push(s.value);return t}(e).some(e=>e.flipY!==t)}(e,t))return e;let a=Oa.get(e);null==a&&(a=new Map,Oa.set(e,a));const s=a.get(t);if(null!=s)return s;const r=Ta(e);if(function(e,t){for(const a of Object.keys(e)){const s=e[a];Ea(a,s)&&(e[a]=ka(s,t))}}(r,t),r instanceof n.ShaderMaterial){for(const[e,a]of Object.entries(r.uniforms))Ea(e,a.value)&&(a.value=ka(a.value,t));r.uniformsNeedUpdate=!0}return r.needsUpdate=!0,a.set(t,r),r}function Ta(e){const t=e.clone();return t.userData={...e.userData??{}},t}function Ea(e,t){const a=t;return(t instanceof x||!0===a?.isTexture)&&!e.toLowerCase().includes("envmap")&&!0!==a.isCompressedTexture&&!0!==a.isCompressedArrayTexture}function ka(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 Na(e,t){if(e instanceof n.ShaderMaterial&&t instanceof n.ShaderMaterial){return e.fragmentShader+e.vertexShader==t.fragmentShader+t.vertexShader&&function(e,t){if(e instanceof n.ShaderMaterial&&t instanceof n.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 za(e){if(null!=e){for(let t=0;t<e.array.length;t++)e.setX(t,0);e.needsUpdate=!0}}function Va(e,t){const a=He(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&&Ua(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 Ba(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,$a(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 Fa=new WeakMap;function $a(e,t){return e.getAttribute(t)??function(e,t){if("uv"===t)return function(e){let t=Fa.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 n.Float32BufferAttribute(new Float32Array(2*a.count),2),Fa.set(e,t));return t}(e);throw new Error(`Unsupported synthetic batching geometry attribute: ${t}`)}(e,t)}function Ua(e){return null!=e.getAttribute("position")}const Ga=new WeakMap,La="hbat_",_a=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 Wa(e){let t=Ga.get(e);return null==t&&(t=function(e){let t=e.type;if(e instanceof G)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(qa(a))continue;const s=e.uniforms[a]?.value;Xa(s)||(t+=`u:${a}:${ts(s)};`)}return t+=Ja(e.vertexShader),t+=Ja(e.fragmentShader),t}(e);else if(e instanceof n.MeshStandardMaterial&&!(e instanceof n.MeshPhysicalMaterial)||(t+=e.id+""),(e instanceof n.MeshBasicMaterial||e instanceof n.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 n.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 n.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 Ut&&null!=e.heightMap&&(t+="h"+e.heightMap?.id),e instanceof n.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);return t+=e.side,t+=e.transparent?"t":"",t+=e.vertexColors?"vc":"",t+=e.depthWrite?"dw":"",t+=e.depthTest?"dt":"",t+=e.alphaTest?"at":"",t}(e),Ga.set(e,t)),t}const Ra=new Map;function Ja(e){return Ra.has(e)||Ra.set(e,`shader_${Ra.size}`),Ra.get(e)}function qa(e){return _a.has(e)||e.startsWith("hology_")}function Ya(e,t){return e instanceof G?e.uniforms[t]?.value:e[t]}function Xa(e){return"number"==typeof e||e instanceof I||e instanceof P||e instanceof j||e instanceof l}function Za(e){return"number"==typeof e?1:e instanceof I?2:4}function Ha(e,t){const a=e.replace(/[^A-Za-z0-9_]/g,"_");let s=La+a;for(;t.has(s);)s=La+s;return t.add(s),s}function Ka(e,t){const a={};for(const[s,r]of Object.entries(e.uniforms))t.has(s)||(a[s]={value:r.value});return a}const Qa=new WeakMap;let es=1;function ts(e){if(null==e)return"null";if(e instanceof x||!0===e?.isTexture)return`texture:${e.id}`;if(e instanceof n.Matrix3||e instanceof n.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=Qa.get(e);return null==t&&(t=es++,Qa.set(e,t)),`object:${t}`}return String(e)}function as(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 ss=new f,rs=new c;function ns(e,t){return rs.copy(e),rs.x*=-1,rs.y*=-1,rs.z*=-1,t.isCubeTexture&&!1===t.isRenderTargetTexture&&(rs.y*=-1,rs.z*=-1),(new n.Matrix3).setFromMatrix4(ss.makeRotationFromEuler(rs))}function is(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 os=new j;function ls(e,t){return e===t||null==e==(null==t)&&("number"==typeof e&&"number"==typeof t?e===t||isNaN(e)&&isNaN(t):e instanceof n.Color&&t instanceof n.Color?e.r===t.r&&e.g===t.g&&e.b===t.b:e instanceof I&&t instanceof I?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 j&&t instanceof j&&(e.x===t.x&&e.y===t.y&&e.z===t.z&&e.w===t.w))}function cs(e){const t=[];for(const[a,s]of Object.entries(e))s instanceof de?t.push(s):s instanceof ve&&t.push(...cs(s));return t}const us=new WeakMap;function ps(e,t){const a=Object.keys(e.attributes).filter(a=>hs(e,t,a));return!e.hasAttribute("uv")&&Ua(e)&&hs(e,t,"uv")&&a.push("uv"),a}function hs(e,t,a){return"position"===a||("uv"===a?function(e){if(e instanceof G)return fs(e,"uv");if(e instanceof n.ShaderMaterial)return ms(e.vertexShader,"uv");if(e instanceof Ut&&null!=e.heightMap)return!0;return ds.some(t=>e[t]?.isTexture)}(t):t instanceof G?fs(t,a):t instanceof n.ShaderMaterial?function(e,t){if("uv1"===t||"uv2"===t||"uv3"===t)return ms(e.vertexShader,t);return!0}(t,a):"uv1"!==a&&(("color"!==a||!function(e){let t=us.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 us.set(e,t),t}(e))&&("uv2"!==a||(null!=t.lightMap||null!=t.aoMap))))}const ds=["map","alphaMap","emissiveMap","normalMap","bumpMap","displacementMap","roughnessMap","metalnessMap","aoMap","specularMap","gradientMap","clearcoatMap","clearcoatNormalMap","clearcoatRoughnessMap","iridescenceMap","iridescenceThicknessMap","sheenColorMap","sheenRoughnessMap","transmissionMap","thicknessMap","anisotropyMap"];function fs(e,t){return ms(e.vertexShader,t)}function ms(e,t){return new RegExp(`(^|[^A-Za-z0-9_])${a=t,a.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}([^A-Za-z0-9_]|$)`).test(e);var a}function gs(e,t,a){if(t(e))return e;for(const s of e.children??[]){const e=gs(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=>gs(e,t,a));if(null!=e)return e}}return null}const ys=new P,ws=new P,bs=new P,vs=new j,Ss=new j,Ms=new f,As=new f,xs=new b;function Is(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++)ys.fromBufferAttribute(a,t),e.applyBoneTransform(t,ys),a.setXYZ(t,ys.x,ys.y,ys.z);a.needsUpdate=!0}if(null!=s||null!=r){const a=t.getAttribute("skinIndex"),n=t.getAttribute("skinWeight");if(null!=a&&null!=n){for(let t=0;t<a.count;t++)Ps(e,t,As),null!=s&&(ws.fromBufferAttribute(s,t),xs.getNormalMatrix(As),ws.applyMatrix3(xs).normalize(),s.setXYZ(t,ws.x,ws.y,ws.z)),null!=r&&(bs.fromBufferAttribute(r,t),bs.transformDirection(As),r.setXYZ(t,bs.x,bs.y,bs.z));null!=s&&(s.needsUpdate=!0),null!=r&&(r.needsUpdate=!0)}}t.deleteAttribute("skinIndex"),t.deleteAttribute("skinWeight"),t.computeBoundingBox(),t.computeBoundingSphere();const n=new m(t,e.material);return n.copy(e,!1),n.geometry=t,n.material=e.material,n.userData={...e.userData},n}function Ps(e,t,a){const s=e.geometry,r=s.getAttribute("skinIndex"),n=s.getAttribute("skinWeight"),i=e.skeleton;vs.fromBufferAttribute(r,t),Ss.fromBufferAttribute(n,t),a.identity().multiplyScalar(0);for(let e=0;e<4;e++){const t=Ss.getComponent(e);if(0===t)continue;const s=vs.getComponent(e);Ms.multiplyMatrices(i.bones[s].matrixWorld,i.boneInverses[s]);for(let e=0;e<16;e++)a.elements[e]+=Ms.elements[e]*t}return a.premultiply(e.bindMatrixInverse).multiply(e.bindMatrix),a}function js(e){let t=!0;return e.traverse(a=>{a===e||a.isBone||(t=!1)}),t}function Cs(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 Os(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
  */
@@ -1,4 +1,4 @@
1
- import"reflect-metadata";import{afterEach as e,expect as t,test as o,vi as n}from"vitest";n.hoisted(()=>{if("undefined"==typeof HTMLCanvasElement)return;const e=new Proxy({},{get:(e,t)=>(t in e||(e[t]=("string"!=typeof t||!t.startsWith("is"))&&n.fn()),e[t]),set:(e,t,o)=>(e[t]=o,!0)});Object.defineProperty(HTMLCanvasElement.prototype,"getContext",{configurable:!0,value:()=>e})}),n.mock("../gameplay/services/render.js",()=>({ViewController:class{}})),n.mock("../gameplay/services/physics/physics-system.js",()=>({PhysicsSystem:class{},RayTestResult:class{}})),n.mock("../gameplay/services/world.js",()=>({World:class{}})),n.mock("@hology/nebula",()=>({ease:{easeInOutCubic:e=>e}}));import{Subject as a}from"rxjs";import{Container as i}from"typedi";import{Object3D as s,Ray as r,Scene as c,Vector3 as p}from"three";import{BaseActor as m}from"../gameplay/actors/actor.js";import{FirstPersonCameraComponent as l}from"../gameplay/actors/camera/first-person-camera-component.js";import{ThirdPersonCameraComponent as d}from"../gameplay/actors/camera/third-person-camera-component.js";import{PhysicsSystem as y}from"../gameplay/services/physics/physics-system.js";import{ViewController as u}from"../gameplay/services/render.js";import{World as v}from"../gameplay/services/world.js";function f(e=new g){const t=h(),o=new l;return o.actor=e,{camera:o,actor:e,element:t}}function h(){const e=document.createElement("div"),t=document.createElement("canvas");return e.appendChild(t),Object.defineProperty(e,"clientWidth",{configurable:!0,value:1280}),Object.defineProperty(e,"clientHeight",{configurable:!0,value:720}),i.set(u,{htmlElement:e,setCamera:n.fn(),onUpdate:()=>new a,onLateUpdate:()=>new a}),i.set(v,{scene:new c}),i.set(y,{sphereCast:n.fn()}),e}function w(){Object.defineProperty(document.body,"requestPointerLock",{configurable:!0,value:n.fn()}),Object.defineProperty(document,"pointerLockElement",{configurable:!0,value:null})}function B(e,t){return e.mock.calls.filter(e=>e[0]===t).length}e(()=>{n.restoreAllMocks(),i.reset()}),o("first-person camera clamps pitch input",()=>{const{camera:e}=f();e.rotationInput.rotateX(Math.PI),t(e.rotationInput.rotation.x).toBeCloseTo(Math.PI/2-.01),e.rotationInput.rotateX(2*-Math.PI),t(e.rotationInput.rotation.x).toBeCloseTo(-Math.PI/2+.01)}),o("first-person camera follows actor eye offset",async()=>{const e=new g;e.position.set(1,2,3),e.rotation.y=Math.PI/2,e.object.updateMatrixWorld(!0);const{camera:o}=f(e);o.eyeHeight=1.5,o.offsetZ=.25,o.autoActivate=!1,await o.onInit(),o.updateCameraTransform(),t(o.camera.position.x).toBeCloseTo(1.25),t(o.camera.position.y).toBeCloseTo(3.5),t(o.camera.position.z).toBeCloseTo(3)}),o("first-person aim helpers write to caller-provided objects",async()=>{const e=new g;e.position.set(0,1,0);const{camera:o}=f(e);o.autoActivate=!1,await o.onInit();const n=new p,a=new p,i=new r;t(o.getAimOrigin(n)).toBe(n),t(o.getAimDirection(a)).toBe(a),t(o.getAimRay(i)).toBe(i),t(i.origin).toEqual(n),t(i.direction).toEqual(a),t(a.x).toBeCloseTo(0),t(a.y).toBeCloseTo(0),t(a.z).toBeCloseTo(1),t(a.length()).toBeCloseTo(1)}),o("first-person camera pitch input tilts aim downward when positive",async()=>{const{camera:e}=f();e.autoActivate=!1,await e.onInit(),e.rotationInput.rotateX(.25),e.updateCameraTransform();const o=e.getAimDirection(new p);t(o.y).toBeLessThan(0),t(o.z).toBeGreaterThan(0),t(o.length()).toBeCloseTo(1)}),o("first-person hidden objects restore their previous visibility",()=>{const{camera:e}=f(),o=new s,n=new s;n.visible=!1,e.hideObjects(o,n),t(o.visible).toBe(!1),t(n.visible).toBe(!1),e.restoreHiddenObjects(),t(o.visible).toBe(!0),t(n.visible).toBe(!1)}),o("first-person activation is idempotent",async()=>{const{camera:e,element:o}=f();e.autoActivate=!1,await e.onInit(),w();const a=n.spyOn(o,"addEventListener"),i=n.spyOn(o,"removeEventListener"),s=n.spyOn(document,"addEventListener"),r=n.spyOn(document,"removeEventListener");e.activate(),e.activate(),t(B(a,"pointerdown")).toBe(1),t(B(a,"keydown")).toBe(1),t(B(s,"pointerlockchange")).toBe(1),e.deactivate(),e.deactivate(),t(B(i,"pointerdown")).toBe(1),t(B(i,"keydown")).toBe(1),t(B(r,"pointerlockchange")).toBe(1)}),o("third-person activation remains idempotent",async()=>{const e=new g,o=h(),a=new d;a.actor=e,a.autoActivate=!1,await a.onInit(),w();const i=n.spyOn(o,"addEventListener"),s=n.spyOn(o,"removeEventListener"),r=n.spyOn(document,"addEventListener"),c=n.spyOn(document,"removeEventListener");a.activate(),a.activate(),t(B(i,"pointerdown")).toBe(1),t(B(i,"keydown")).toBe(1),t(B(r,"pointerlockchange")).toBe(1),a.deactivate(),a.deactivate(),t(B(s,"pointerdown")).toBe(1),t(B(s,"keydown")).toBe(1),t(B(c,"pointerlockchange")).toBe(1)}),o("third-person camera does not treat sustained fast movement as a teleport",async()=>{const e=new g;h();const o=new d;o.actor=e,o.autoActivate=!0,o.collision=!1,o.fixedBehind=!1,o.smoothCamera=!0,o.smoothSpeed=10,await o.onInit(),o.onLateUpdate(1/60);for(let t=0;t<12;t++)e.position.x+=.2,o.onLateUpdate(1/60);t(e.position.x-o.camera.position.x).toBeGreaterThan(.7)}),o("third-person camera still snaps after a target teleport",async()=>{const e=new g;h();const o=new d;o.actor=e,o.autoActivate=!0,o.collision=!1,o.fixedBehind=!1,o.smoothCamera=!0,o.teleportSnapDistance=5,await o.onInit(),o.onLateUpdate(1/60),e.position.x=10,o.onLateUpdate(1/60),t(o.camera.position.x).toBeCloseTo(10)});class g extends m{constructor(){super(),this.__isInitialised=!0}}/*
1
+ import"reflect-metadata";import{afterEach as e,expect as t,test as o,vi as n}from"vitest";n.hoisted(()=>{if("undefined"==typeof HTMLCanvasElement)return;const e=new Proxy({},{get:(e,t)=>(t in e||(e[t]=("string"!=typeof t||!t.startsWith("is"))&&n.fn()),e[t]),set:(e,t,o)=>(e[t]=o,!0)});Object.defineProperty(HTMLCanvasElement.prototype,"getContext",{configurable:!0,value:()=>e})}),n.mock("../gameplay/services/render.js",()=>({ViewController:class{}})),n.mock("../gameplay/services/physics/physics-system.js",()=>({PhysicsSystem:class{},RayTestResult:class{}})),n.mock("../gameplay/services/world.js",()=>({World:class{}})),n.mock("@hology/nebula",()=>({ease:{easeInOutCubic:e=>e}}));import{Subject as a}from"rxjs";import{Container as i}from"typedi";import{Object3D as r,Ray as s,Scene as c,Vector3 as p}from"three";import{BaseActor as l}from"../gameplay/actors/actor.js";import{FirstPersonCameraComponent as m}from"../gameplay/actors/camera/first-person-camera-component.js";import{ThirdPersonCameraComponent as d}from"../gameplay/actors/camera/third-person-camera-component.js";import{PhysicsSystem as u}from"../gameplay/services/physics/physics-system.js";import{ViewController as v}from"../gameplay/services/render.js";import{World as y}from"../gameplay/services/world.js";function f(e=new g){const t=h(),o=new m;return o.actor=e,{camera:o,actor:e,element:t}}function h(){const e=document.createElement("div"),t=document.createElement("canvas");return e.appendChild(t),Object.defineProperty(e,"clientWidth",{configurable:!0,value:1280}),Object.defineProperty(e,"clientHeight",{configurable:!0,value:720}),i.set(v,{htmlElement:e,setCamera:n.fn(),onUpdate:()=>new a,onLateUpdate:()=>new a}),i.set(y,{scene:new c}),i.set(u,{sphereCast:n.fn()}),e}function w(){Object.defineProperty(document.body,"requestPointerLock",{configurable:!0,value:n.fn()}),Object.defineProperty(document,"pointerLockElement",{configurable:!0,value:null})}function B(e,t){return e.mock.calls.filter(e=>e[0]===t).length}e(()=>{n.restoreAllMocks(),i.reset()}),o("first-person camera clamps pitch input",()=>{const{camera:e}=f();e.rotationInput.rotateX(Math.PI),t(e.rotationInput.rotation.x).toBeCloseTo(Math.PI/2-.01),e.rotationInput.rotateX(2*-Math.PI),t(e.rotationInput.rotation.x).toBeCloseTo(-Math.PI/2+.01)}),o("first-person camera follows actor eye offset",async()=>{const e=new g;e.position.set(1,2,3),e.rotation.y=Math.PI/2,e.object.updateMatrixWorld(!0);const{camera:o}=f(e);o.eyeHeight=1.5,o.offsetZ=.25,o.autoActivate=!1,await o.onInit(),o.updateCameraTransform(),t(o.camera.position.x).toBeCloseTo(1.25),t(o.camera.position.y).toBeCloseTo(3.5),t(o.camera.position.z).toBeCloseTo(3)}),o("first-person aim helpers write to caller-provided objects",async()=>{const e=new g;e.position.set(0,1,0);const{camera:o}=f(e);o.autoActivate=!1,await o.onInit();const n=new p,a=new p,i=new s;t(o.getAimOrigin(n)).toBe(n),t(o.getAimDirection(a)).toBe(a),t(o.getAimRay(i)).toBe(i),t(i.origin).toEqual(n),t(i.direction).toEqual(a),t(a.x).toBeCloseTo(0),t(a.y).toBeCloseTo(0),t(a.z).toBeCloseTo(1),t(a.length()).toBeCloseTo(1)}),o("first-person camera pitch input tilts aim downward when positive",async()=>{const{camera:e}=f();e.autoActivate=!1,await e.onInit(),e.rotationInput.rotateX(.25),e.updateCameraTransform();const o=e.getAimDirection(new p);t(o.y).toBeLessThan(0),t(o.z).toBeGreaterThan(0),t(o.length()).toBeCloseTo(1)}),o("first-person hidden objects restore their previous visibility",()=>{const{camera:e}=f(),o=new r,n=new r;n.visible=!1,e.hideObjects(o,n),t(o.visible).toBe(!1),t(n.visible).toBe(!1),e.restoreHiddenObjects(),t(o.visible).toBe(!0),t(n.visible).toBe(!1)}),o("first-person activation is idempotent",async()=>{const{camera:e,element:o}=f();e.autoActivate=!1,await e.onInit(),w();const a=n.spyOn(o,"addEventListener"),i=n.spyOn(o,"removeEventListener"),r=n.spyOn(document,"addEventListener"),s=n.spyOn(document,"removeEventListener");e.activate(),e.activate(),t(B(a,"pointerdown")).toBe(1),t(B(a,"keydown")).toBe(1),t(B(r,"pointerlockchange")).toBe(1),e.deactivate(),e.deactivate(),t(B(i,"pointerdown")).toBe(1),t(B(i,"keydown")).toBe(1),t(B(s,"pointerlockchange")).toBe(1)}),o("third-person activation remains idempotent",async()=>{const e=new g,o=h(),a=new d;a.actor=e,a.autoActivate=!1,await a.onInit(),w();const i=n.spyOn(o,"addEventListener"),r=n.spyOn(o,"removeEventListener"),s=n.spyOn(document,"addEventListener"),c=n.spyOn(document,"removeEventListener");a.activate(),a.activate(),t(B(i,"pointerdown")).toBe(1),t(B(i,"keydown")).toBe(1),t(B(s,"pointerlockchange")).toBe(1),a.deactivate(),a.deactivate(),t(B(r,"pointerdown")).toBe(1),t(B(r,"keydown")).toBe(1),t(B(c,"pointerlockchange")).toBe(1)}),o("third-person camera hides the cursor only after pointer lock is active",async()=>{const e=new g,o=h(),a=o.querySelector("canvas"),i=new d;i.actor=e,i.autoActivate=!1,await i.onInit(),w();const r=n.fn(()=>Promise.resolve());Object.defineProperty(a,"requestPointerLock",{configurable:!0,value:r});let s=null;Object.defineProperty(document,"pointerLockElement",{configurable:!0,get:()=>s}),i.activate(),i.hideCursor({ignoreRecentUnlock:!0}),t(r).toHaveBeenCalledWith(),t(i.isMouseLocked).toBe(!1),t(o.style.cursor).not.toBe("none"),s=a,document.dispatchEvent(new Event("pointerlockchange")),t(i.isMouseLocked).toBe(!0),t(o.style.cursor).toBe("none")}),o("third-person camera does not treat sustained fast movement as a teleport",async()=>{const e=new g;h();const o=new d;o.actor=e,o.autoActivate=!0,o.collision=!1,o.fixedBehind=!1,o.smoothCamera=!0,o.smoothSpeed=10,await o.onInit(),o.onLateUpdate(1/60);for(let t=0;t<12;t++)e.position.x+=.2,o.onLateUpdate(1/60);t(e.position.x-o.camera.position.x).toBeGreaterThan(.7)}),o("third-person camera still snaps after a target teleport",async()=>{const e=new g;h();const o=new d;o.actor=e,o.autoActivate=!0,o.collision=!1,o.fixedBehind=!1,o.smoothCamera=!0,o.teleportSnapDistance=5,await o.onInit(),o.onLateUpdate(1/60),e.position.x=10,o.onLateUpdate(1/60),t(o.camera.position.x).toBeCloseTo(10)});class g extends l{constructor(){super(),this.__isInitialised=!0}}/*
2
2
  * Copyright (©) 2026 Hology Interactive AB. All rights reserved.
3
3
  * See the LICENSE.md file for details.
4
4
  */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hology/core",
3
- "version": "0.0.218",
3
+ "version": "0.0.220",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",