@hology/core 0.0.157 → 0.0.159

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.
Files changed (180) hide show
  1. package/dist/gameplay/services/physics/physics-system.d.ts +10 -1
  2. package/dist/gameplay/services/physics/physics-system.js +1 -1
  3. package/dist/rendering.js +1 -1
  4. package/dist/scene/asset-resource-loader.d.ts +13 -0
  5. package/dist/scene/asset-resource-loader.js +1 -1
  6. package/dist/scene/materializer.d.ts +7 -0
  7. package/dist/scene/materializer.js +1 -1
  8. package/dist/utils/three/traverse.d.ts +8 -0
  9. package/dist/utils/three/traverse.js +1 -1
  10. package/package.json +2 -2
  11. package/tsconfig.tsbuildinfo +1 -1
  12. package/dist/config/project-config.d.ts.map +0 -1
  13. package/dist/controllers/base-game-controller.d.ts.map +0 -1
  14. package/dist/csm.d.ts.map +0 -1
  15. package/dist/effects/particles/examples.d.ts.map +0 -1
  16. package/dist/effects/particles/particle-system-config.d.ts.map +0 -1
  17. package/dist/effects/vfx/behaviours.d.ts.map +0 -1
  18. package/dist/effects/vfx/index.d.ts.map +0 -1
  19. package/dist/effects/vfx/initializsers.d.ts.map +0 -1
  20. package/dist/effects/vfx/rates.d.ts.map +0 -1
  21. package/dist/effects/vfx/stretched-sprite.d.ts.map +0 -1
  22. package/dist/effects/vfx/trail-renderer.d.ts.map +0 -1
  23. package/dist/effects/vfx/vfx-actor.d.ts.map +0 -1
  24. package/dist/effects/vfx/vfx-asset.d.ts.map +0 -1
  25. package/dist/effects/vfx/vfx-collision-behaviour.d.ts.map +0 -1
  26. package/dist/effects/vfx/vfx-defs.d.ts.map +0 -1
  27. package/dist/effects/vfx/vfx-materializer.d.ts.map +0 -1
  28. package/dist/effects/vfx/vfx-old-materializer.d.ts.map +0 -1
  29. package/dist/effects/vfx/vfx-param.d.ts.map +0 -1
  30. package/dist/effects/vfx/vfx-renderers.d.ts.map +0 -1
  31. package/dist/effects/vfx/vfx-service.d.ts.map +0 -1
  32. package/dist/effects/vfx/zones.d.ts.map +0 -1
  33. package/dist/game-component/component-decorators.d.ts.map +0 -1
  34. package/dist/game-component/game-component.d.ts.map +0 -1
  35. package/dist/gameplay/actors/actor.d.ts.map +0 -1
  36. package/dist/gameplay/actors/builtin/camera-actor.d.ts.map +0 -1
  37. package/dist/gameplay/actors/builtin/components/character/character-animation.d.ts.map +0 -1
  38. package/dist/gameplay/actors/builtin/components/character/character-movement.d.ts.map +0 -1
  39. package/dist/gameplay/actors/builtin/components/character/modes.d.ts.map +0 -1
  40. package/dist/gameplay/actors/builtin/components/editor-sprite-component.d.ts.map +0 -1
  41. package/dist/gameplay/actors/builtin/components/mesh-component.d.ts.map +0 -1
  42. package/dist/gameplay/actors/builtin/components/scene-component.d.ts.map +0 -1
  43. package/dist/gameplay/actors/builtin/components/volume-editor-component.d.ts.map +0 -1
  44. package/dist/gameplay/actors/builtin/index.d.ts.map +0 -1
  45. package/dist/gameplay/actors/builtin/navmesh-actor.d.ts.map +0 -1
  46. package/dist/gameplay/actors/builtin/positional-audio-actor.d.ts.map +0 -1
  47. package/dist/gameplay/actors/builtin/post-process-volume-actor.d.ts.map +0 -1
  48. package/dist/gameplay/actors/builtin/spawn-point.d.ts.map +0 -1
  49. package/dist/gameplay/actors/builtin/trigger-volume.d.ts.map +0 -1
  50. package/dist/gameplay/actors/camera/camera-component.d.ts.map +0 -1
  51. package/dist/gameplay/actors/camera/third-person-camera-component.d.ts.map +0 -1
  52. package/dist/gameplay/actors/component.d.ts.map +0 -1
  53. package/dist/gameplay/actors/factory.d.ts.map +0 -1
  54. package/dist/gameplay/actors/index.d.ts.map +0 -1
  55. package/dist/gameplay/actors/internal/component-init.d.ts.map +0 -1
  56. package/dist/gameplay/actors/internal/container-map.d.ts.map +0 -1
  57. package/dist/gameplay/ai/behavior-tree/bt.d.ts.map +0 -1
  58. package/dist/gameplay/ai/behavior-tree/move.d.ts.map +0 -1
  59. package/dist/gameplay/ai/build-tile.d.ts.map +0 -1
  60. package/dist/gameplay/ai/dynamic-tiled-navmesh.d.ts.map +0 -1
  61. package/dist/gameplay/ai/dynamic-tiled-navmesh.worker.d.ts.map +0 -1
  62. package/dist/gameplay/ai/index.d.ts.map +0 -1
  63. package/dist/gameplay/ai/navigation.d.ts.map +0 -1
  64. package/dist/gameplay/animation/anim-sm.d.ts.map +0 -1
  65. package/dist/gameplay/animation/root-motion.d.ts.map +0 -1
  66. package/dist/gameplay/env.d.ts.map +0 -1
  67. package/dist/gameplay/index.d.ts.map +0 -1
  68. package/dist/gameplay/initiate.d.ts.map +0 -1
  69. package/dist/gameplay/inject.d.ts.map +0 -1
  70. package/dist/gameplay/input/index.d.ts.map +0 -1
  71. package/dist/gameplay/input/input-service.d.ts.map +0 -1
  72. package/dist/gameplay/input/input.d.ts.map +0 -1
  73. package/dist/gameplay/input/keybind.d.ts.map +0 -1
  74. package/dist/gameplay/polyfill.d.ts.map +0 -1
  75. package/dist/gameplay/services/asset-loader.d.ts.map +0 -1
  76. package/dist/gameplay/services/physics/abstract-physics-system.d.ts.map +0 -1
  77. package/dist/gameplay/services/physics/collision-contact.d.ts.map +0 -1
  78. package/dist/gameplay/services/physics/physics-system.d.ts.map +0 -1
  79. package/dist/gameplay/services/pointer-events.d.ts.map +0 -1
  80. package/dist/gameplay/services/render.d.ts.map +0 -1
  81. package/dist/gameplay/services/shader-provider.d.ts.map +0 -1
  82. package/dist/gameplay/services/world.d.ts.map +0 -1
  83. package/dist/index.d.ts.map +0 -1
  84. package/dist/rendering/bloom/LuminosityHighPassShader.d.ts.map +0 -1
  85. package/dist/rendering/bloom/UnrealBloomPass.d.ts.map +0 -1
  86. package/dist/rendering/bloom/types.d.ts.map +0 -1
  87. package/dist/rendering/color-pass.d.ts.map +0 -1
  88. package/dist/rendering/fog/fog-volume-actor.d.ts.map +0 -1
  89. package/dist/rendering/fog/fog-volume-object.d.ts.map +0 -1
  90. package/dist/rendering/fog/volumetric-fog-pass.d.ts.map +0 -1
  91. package/dist/rendering/outline-effect.d.ts.map +0 -1
  92. package/dist/rendering/shader-override.d.ts.map +0 -1
  93. package/dist/rendering/ssr/SSRPass.d.ts.map +0 -1
  94. package/dist/rendering/ssr/SSRShader.d.ts.map +0 -1
  95. package/dist/rendering/tone-mapping.d.ts.map +0 -1
  96. package/dist/rendering.d.ts.map +0 -1
  97. package/dist/scene/asset-resource-loader.d.ts.map +0 -1
  98. package/dist/scene/assets-provider.d.ts.map +0 -1
  99. package/dist/scene/batched-mesh-2.d.ts.map +0 -1
  100. package/dist/scene/bootstrap.d.ts.map +0 -1
  101. package/dist/scene/collision/collision-shape-import.d.ts.map +0 -1
  102. package/dist/scene/collision/collision-shape.d.ts.map +0 -1
  103. package/dist/scene/landscape/landscape-manager.d.ts.map +0 -1
  104. package/dist/scene/landscape/landscape.d.ts.map +0 -1
  105. package/dist/scene/landscape/utils.d.ts.map +0 -1
  106. package/dist/scene/materializer.d.ts.map +0 -1
  107. package/dist/scene/materials/grass-foliage.d.ts.map +0 -1
  108. package/dist/scene/materials/grass.d.ts.map +0 -1
  109. package/dist/scene/materials/utils/material-painting.d.ts.map +0 -1
  110. package/dist/scene/materials/utils/noise.glsl.d.ts.map +0 -1
  111. package/dist/scene/materials/water.d.ts.map +0 -1
  112. package/dist/scene/model.d.ts.map +0 -1
  113. package/dist/scene/objects/prefab.d.ts.map +0 -1
  114. package/dist/scene/objects/ramp-geometry.d.ts.map +0 -1
  115. package/dist/scene/objects/shapes.d.ts.map +0 -1
  116. package/dist/scene/objects/stairs-geometry.d.ts.map +0 -1
  117. package/dist/scene/runtime-asset-service.d.ts.map +0 -1
  118. package/dist/scene/runtime-backend-service.d.ts.map +0 -1
  119. package/dist/scene/runtime-bundled-backend-service.d.ts.map +0 -1
  120. package/dist/scene/scene-data-service.d.ts.map +0 -1
  121. package/dist/scene/sky.d.ts.map +0 -1
  122. package/dist/scene/storage/storage.d.ts.map +0 -1
  123. package/dist/shader/builtin/decal-standard-shader.d.ts.map +0 -1
  124. package/dist/shader/builtin/decal-unlit-shader.d.ts.map +0 -1
  125. package/dist/shader/builtin/index.d.ts.map +0 -1
  126. package/dist/shader/builtin/lambert-shader.d.ts.map +0 -1
  127. package/dist/shader/builtin/landscape-composite-shader.d.ts.map +0 -1
  128. package/dist/shader/builtin/landscape-shader.d.ts.map +0 -1
  129. package/dist/shader/builtin/layered-shader.d.ts.map +0 -1
  130. package/dist/shader/builtin/standard-shader.d.ts.map +0 -1
  131. package/dist/shader/builtin/toon-shader.d.ts.map +0 -1
  132. package/dist/shader/builtin/unlit-shader.d.ts.map +0 -1
  133. package/dist/shader/color-layer.d.ts.map +0 -1
  134. package/dist/shader/decal-shader.d.ts.map +0 -1
  135. package/dist/shader/index.d.ts.map +0 -1
  136. package/dist/shader/parameter.d.ts.map +0 -1
  137. package/dist/shader/shader.d.ts.map +0 -1
  138. package/dist/shader/sprite-shader.d.ts.map +0 -1
  139. package/dist/shader/trail-shader.d.ts.map +0 -1
  140. package/dist/shader-nodes/bulge.d.ts.map +0 -1
  141. package/dist/shader-nodes/curve-sample.d.ts.map +0 -1
  142. package/dist/shader-nodes/decal.d.ts.map +0 -1
  143. package/dist/shader-nodes/depth.d.ts.map +0 -1
  144. package/dist/shader-nodes/effects.d.ts.map +0 -1
  145. package/dist/shader-nodes/glsl-node.d.ts.map +0 -1
  146. package/dist/shader-nodes/index.d.ts.map +0 -1
  147. package/dist/shader-nodes/landscape.d.ts.map +0 -1
  148. package/dist/shader-nodes/layers.d.ts.map +0 -1
  149. package/dist/shader-nodes/math.d.ts.map +0 -1
  150. package/dist/shader-nodes/particle.d.ts.map +0 -1
  151. package/dist/shader-nodes/pom.d.ts.map +0 -1
  152. package/dist/shader-nodes/scene-sample.d.ts.map +0 -1
  153. package/dist/shader-nodes/shapes.d.ts.map +0 -1
  154. package/dist/shader-nodes/texture-sequence.d.ts.map +0 -1
  155. package/dist/shader-nodes/time.d.ts.map +0 -1
  156. package/dist/shader-nodes/voronoi.d.ts.map +0 -1
  157. package/dist/test/injection.test.d.ts.map +0 -1
  158. package/dist/utils/async.d.ts.map +0 -1
  159. package/dist/utils/buffer.d.ts.map +0 -1
  160. package/dist/utils/collections.d.ts.map +0 -1
  161. package/dist/utils/curve.d.ts.map +0 -1
  162. package/dist/utils/files.d.ts.map +0 -1
  163. package/dist/utils/materials.d.ts.map +0 -1
  164. package/dist/utils/math.d.ts.map +0 -1
  165. package/dist/utils/mesh.d.ts.map +0 -1
  166. package/dist/utils/polyfill.d.ts.map +0 -1
  167. package/dist/utils/three/cleanup.d.ts.map +0 -1
  168. package/dist/utils/three/depth-pass.d.ts.map +0 -1
  169. package/dist/utils/three/gpu-stats-panel.d.ts.map +0 -1
  170. package/dist/utils/three/line-sphere.d.ts.map +0 -1
  171. package/dist/utils/three/outline-pass.d.ts.map +0 -1
  172. package/dist/utils/three/positional-audio-helper.d.ts.map +0 -1
  173. package/dist/utils/three/stats.d.ts.map +0 -1
  174. package/dist/utils/three/transform-controls.d.ts.map +0 -1
  175. package/dist/utils/three/traverse.d.ts.map +0 -1
  176. package/dist/utils/three/unscaled-sprite.d.ts.map +0 -1
  177. package/dist/utils/type.d.ts.map +0 -1
  178. package/dist/utils/uuid.d.ts.map +0 -1
  179. package/dist/utils/voxel-bitset.d.ts.map +0 -1
  180. package/dist/worker/index.d.ts.map +0 -1
@@ -1,4 +1,4 @@
1
- import{__decorate as e,__metadata as t}from"tslib";import{ConvexPolyhedronCollisionShape as a}from"@hology/core";import{Subject as s}from"rxjs";import*as r from"three";import{BoxGeometry as i,Color as n,Euler as o,Fog as l,FogExp2 as c,Group as h,Material as p,Matrix4 as m,Mesh as d,MeshLambertMaterial as u,MeshPhongMaterial as f,MeshStandardMaterial as g,Object3D as y,PointLight as w,Quaternion as M,Scene as v,Texture as b,Vector2 as A,Vector3 as S,Vector4 as x}from"three";import j,{SpriteRenderer as I}from"@hology/nebula";import{batchingUniformFloat as P,batchingUniformVec2 as D,batchingUniformVec3 as C,batchingUniformVec4 as E,bool as T,BooleanExpression as V,BooleanNode as O,colorToNormal as k,float as B,FloatNode as F,ifDefApply as N,mix as z,NodeShaderMaterial as _,rgb as W,rgba as L,RgbNode as $,select as R,standardMaterial as U,Texture2dLookupNode as G,textureSampler2d as H,textureSampler2dArray as J,varyingAttributes as q,varyingTransformed as X,vec2 as Y,Vec2Node as Z,vec3 as K,Vec3Node as Q,vec4 as ee,Vec4Node as te}from"three-shader-graph";import{Service as ae}from"typedi";import{VfxActor as se}from"../effects/vfx/vfx-actor.js";import{VisualEffect as re}from"../effects/vfx/vfx-param.js";import{BaseActor as ie}from"../gameplay/actors/actor.js";import ne from"../gameplay/actors/builtin/index.js";import{PhysicsBodyType as oe,ThreeBlendingMode as le,withInjectionContext as ce}from"../gameplay/index.js";import{RenderingView as he}from"../rendering.js";import{curveSampler as pe,oneMinus as me,particleUniforms as de,Sampler2DNode as ue}from"../shader-nodes/index.js";import{LambertShader as fe}from"../shader/builtin/lambert-shader.js";import{LandscapeCompositeShader as ge}from"../shader/builtin/landscape-composite-shader";import{LandscapeShader as ye}from"../shader/builtin/landscape-shader.js";import{StandardShader as we}from"../shader/builtin/standard-shader.js";import{UnlitShader as Me}from"../shader/builtin/unlit-shader.js";import{extractShaderParameters as ve}from"../shader/parameter.js";import{ArrayMap as be,groupBy as Ae}from"../utils/collections.js";import{iterateMaterials as Se}from"../utils/materials.js";import{filterChildrenShallow as xe,filterSceneShallow as je,findFirstVisibleMesh as Ie,findFirstVisibleObject as Pe}from"../utils/three/traverse.js";import{AssetMeshInstance as De,AssetResourceLoader as Ce}from"./asset-resource-loader.js";import{isCollisionMesh as Ee}from"./collision/collision-shape-import.js";import{BoxCollisionShape as Te,PhysicalShapeMesh as Ve}from"./collision/collision-shape.js";import{LandscapeManager as Oe}from"./landscape/landscape-manager.js";import{initLandscape as ke}from"./landscape/landscape.js";import{SectionGrid as Be,smoothNormalsCrossMeshes as Fe}from"./landscape/utils.js";import{createGrassFoliageMaterial as Ne}from"./materials/grass-foliage.js";import{createGrassMaterial as ze}from"./materials/grass.js";import{getMaterialAttribute as _e}from"./materials/utils/material-painting.js";import{createWaterMaterial as We}from"./materials/water.js";import{SerializedParamType as Le}from"./model.js";import{ShapeLibrary as $e,ShapeLibraryKeys as Re}from"./objects/shapes.js";import{ambientLightName as Ue,createSky as Ge,defaultSkyMaterial as He}from"./sky.js";import{Curve2 as Je}from"../utils/curve.js";import{DecalUnlitShader as qe}from"../shader/builtin/decal-unlit-shader.js";import{DecalStandardShader as Xe}from"../shader/builtin/decal-standard-shader.js";import{ColorLayer as Ye,defaultValueColorLayer as Ze,defaultValueMaskLayer as Ke,MaskLayer as Qe}from"../shader/color-layer.js";import{LayeredShader as et}from"../shader/builtin/layered-shader";import{isColorLayerSerialized as tt}from"../shader/color-layer";import{FogVolume as at}from"../rendering/fog/fog-volume-actor.js";import{UnscaledSprite as st}from"../utils/three/unscaled-sprite.js";import{ToonShader as rt}from"../shader/builtin/toon-shader.js";import{BatchedMesh2 as it}from"./batched-mesh-2.js";import{ParallaxStandardMaterial as nt}from"../shader/builtin/standard-shader";import{parallaxOcclusionMapping as ot}from"../shader-nodes/pom.js";const lt={},ct=/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent),ht=/^((?!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 pt(e,this.dataProvider,this.assetsService,this.assetManagerService,t,[],[],{create:()=>null,initActor:async()=>{}})}}let pt=class{constructor(e,t,a,i,n,o,l,c){this.scene=e,this.dataProvider=t,this.assetsService=a,this.assetManagerService=i,this.renderingView=n,this.shaders=o,this.actorTypes=l,this.actorProvider=c,this.objectMap=new Map,this.sceneObjectMap=new Map,this.components=[],this.landscapeManagers=[],this.materializedActors=new Map,this.inEditor=!0,this.updated$=new s,this.removed$=new s,this.error$=new s,this.editorActorParamSnapshot=new Map,this.assets=new Map,this._canBeInstancedCache=new Map,this._originalMaterials=new Map,this.pmremGeneratorResults=new WeakMap,this.prefabInstanceChain=[],this.geometryCache=new Map,this.collisionShapeCache=new Map,this.originalFog=null,t.onCreate(e=>this.update(e)),t.onUpdate(e=>this.update(e)),t.onRemove(e=>this.remove(e)),this.createAssetSubscription=a.onCreate.subscribe(e=>{this.assets.set(e.id,e)}),this.updateSubscription=a.onUpdate.subscribe(async t=>{this.assets.set(t.id,t),"material"==t.type?e.traverse(e=>{if(e instanceof r.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)}):"mesh"==t.type?(this.findByAssetId(t.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 S,!0)})):"prefab"===t.type?this.findByAssetId(t.id).forEach(e=>{const t=e.userData.src;this.remove(t),this.materializeAndInitActor(t)}):"vfx"===t.type&&this.dataProvider.getObjects().forEach(e=>{At(e,(e,a)=>{"vfx"===e.type&&e.assetId===t.id&&(this.remove(e),this.materializeAndInitActor(e))})})})}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)for(const s of Object.values(e.material.shaderParams)){if(s.type===Le.Material&&s.value===a.id){t=!0;break}if(s.type===Le.Array&&"element"in s&&s.element===Le.Material&&s.value.includes(a.id)){t=!0;break}}if(!t)return}const i=await materialFromAsset(this.assets.get(r),this.renderingView,this.assetsService,this.assetManagerService,this.shaders,!1),n=i.userData;i.userData=t.userData,i.userData.hasBloom=n.hasBloom,i.userData.reflective=n.reflective,i.userData.outlineParameters=n.outlineParameters,null!=s?jt(e.material[s],i)||(e.material[s]=i):jt(e.material,i)||(e.material=i,e===this.sky&&this.applySkySettings(e.material))}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=[];if(await Promise.all(this.dataProvider.getObjects().filter(e=>"shape_mesh"===e.type||"asset_mesh"===e.type).filter(e=>null!=e.materialAssignments).flatMap(e=>e.materialAssignments).map(async t=>{const a=this.assets.get(t.materialId);if(null!=a)for(const t of Object.values(a.material.shaderParams))if(t.type===Le.Texture&&"string"==typeof t.value){const a=this.assets.get(t.value),s=await this.assetManagerService.getTexture(a);null!=s&&e.push(s)}})),0!==e.length&&this.renderingView){console.log(`Initializing ${e.length} textures`),console.time("Init textures");for(const t of e)this.renderingView.renderer.initTexture(t);console.timeEnd("Init textures")}}async prefetchAssets(){const e=Array.from(new Set(this.dataProvider.getObjects().filter(e=>null!=e.assetId&&"asset_mesh"==e.type).filter(e=>e.assetId)));await Promise.all(e.map(e=>this.assetsService.getAsset(e.assetId).then(e=>{if(null!=e)return this.assetManagerService.getMesh(e)}))),this.initTextures()}async init(){await this.preInit(),dt.clear(),ut.clear(),await this.prefetchAssets(),await Promise.all(this.dataProvider.getObjects().map(e=>this.materialize(e))),await this.initActorsPostInit()}initActorsPostInit(e=this.getTopLevelActors(),t){const a=e.map(async e=>{const a=e.object.userData.src??e.object.userData._src;if("vfx"===a.type)return Promise.resolve();const s=await this.assetsService.getAsset(a.assetId),r={...s?.actor?.params??{},...a.actor?.params??{}},i=null!=t?new Map(Array.from(this.materializedActors.entries()).filter(([e,a])=>e.startsWith(t.sceneObjectChain.join("/"))&&e.split("/").length-1===t.sceneObjectChain.length).map(([e,t])=>[e.split("/").pop(),t])):this.materializedActors;for(const t of a.actor.innerParams??[])await this.applyActorComponentParams(e,t.path.slice(),t.params,i);const n=await prepareClassParameters(r,e.constructor,this.assetsService,this.assetManagerService,i,this.renderingView,this.shaders,this.actorProvider);Object.assign(e,n);try{return await this.actorProvider.initActor(e)}catch(e){console.error(`Failed to initiate actor (name="${a.name}", id=${a.id})`,e)}});return Promise.all(a)}addVfxChildActors(e,t=e){}async applyActorComponentParams(e,t,a,s){const r=t.length,i=t.shift();if(0==r){const t=await prepareClassParameters(a,null,this.assetsService,this.assetManagerService,s,this.renderingView,this.shaders,this.actorProvider);for(const[a,s]of Object.entries(t))null!=s&&(e[a]=s)}else null!=e[i]&&await this.applyActorComponentParams(e[i],t,a,s)}canObjectBeInstanced(e){return e.physics?.type!==oe.dynamic&&"sky"!==e.type&&"global_fog"!==e.type&&"world_env"!==e.type}async canAssetBeInstanced(e){if(!this._canBeInstancedCache.has(e.assetId)){const t=await this.createFromAsset(e);if(null==t)return!1;const a=[];t.traverse(e=>{!Ee(e)&&e.isMesh&&a.push(e)});const s=1==a.length&&0==a[0].children.length,r=a[0]instanceof d&&null!=a[0].geometry.morphAttributes&&Object.keys(a[0].geometry.morphAttributes).length>0,i=!0;this._canBeInstancedCache.set(e.assetId,s&&i&&!r)}return this._canBeInstancedCache.get(e.assetId)}async preInit(){this.renderingView?.onLoop(()=>{null!=this.sky&&this.renderingView.camera.getWorldPosition(this.sky.position)}),this.assetsService.getAssets().then(e=>{for(const t of e)this.assets.set(t.id,t)})}shouldBeMaterialized(e){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(),dt.clear(),ut.clear();const e=[],t=new be,a=new be;let s=0,i=0;const l=new Map,c=new Map;for(const r of this.dataProvider.getObjects())await At(r,async(r,o,h)=>{if(!this.shouldBeMaterialized(r))return;const p="asset_mesh"==r.type&&this.canObjectBeInstanced(r)&&await this.canAssetBeInstanced(r),m="shape_mesh"===r.type&&"landscape"!==r.shape&&r.physics?.type!==oe.dynamic;if(p||m){if(o&&o.children?.length>0){const e=o.children.findIndex(e=>e.id===r.id);e>=0&&o.children.splice(e,1)}if(m){let e=r.shape+JSON.stringify(r.shapeParams??{})+r.castShadow+r.receiveShadow;const t=r.materialAssignments?.at(0)?.materialId,s=null!=t?this.assets.get(t):null;let o=null;if(null!=s&&"shader"!==s.material.type){if(e+=s.material.type+s.material.shader,null!=s.material.shaderParams){if(e+=Object.entries(s.material.shaderParams).filter(([e,t])=>"color"!=e).map(e=>JSON.stringify(e)).join(),null!=s.material.shaderParams.color){const e=s.material.shaderParams.color;e.type===Le.Color&&null!=e.value&&(o=new n(e.value))}}}else e+=t;a.push(e,{object:{...r,parentTransform:h},color:o}),i++}else{const e=this.assets.get(r.assetId);St(e.materialAssignments,r.materialAssignments);let a=l.get(r.assetId);if(null==a){const e=await this.createFromAsset(r),t=Ie(e);a={useBatchedMesh:null!=t&&this.testCanBatch(t.material,t.geometry),assetMesh:e},l.set(r.assetId,a)}if(a.useBatchedMesh){const s=St(r.materialAssignments,e.materialAssignments),i=s[0]?.materialId;let n;if(i){const e=this.assets.get(i);n=await materialFromAsset(e,this.renderingView,this.assetsService,this.assetManagerService,this.shaders,!0)}if(null==n)if(null==a.defaultMaterial){const e=Ie(a.assetMesh);null!=e&&(n=Array.isArray(e.material)?e.material[0]:e.material,a.defaultMaterial=n)}else n=a.defaultMaterial;if(null!=n){c.set(r.id,n);let e=Et(n);e+=Dt(a.assetMesh),t.push(e,{...r,parentTransform:h})}else console.warn("Can not materialize mesh because missing material",r)}else{const e=r.assetId+JSON.stringify(r.materialAssignments??[]);t.push(e,{...r,parentTransform:h})}s++}}else null==o&&e.push({...r,parentTransform:h})});console.log(`Scene init stats: \n Assets: ${t.size} batch groups containing in total ${s} objects.\n Shapes: ${a.size} batch groups containing in total ${i} objects. \n ${e.length} objects can not be batched. \n `);for(const e of l.values())this.prepareCollisionShapesForInstanced(e.assetMesh);console.time("materialize batches");for(const e of t.values()){if(0==e.length)continue;const t=await this.createFromAsset(e[0]);if(null==t)continue;let a;if(l.get(e[0].assetId).useBatchedMesh){a=this.createBatchedMesh(e,c,l)}else a=await this.createInstancedMesh(e,t);const s=this.assets.get(e[0].assetId);a.castShadow=e[0].castShadow??s.castShadow??!0,a.receiveShadow=e[0].receiveShadow??s.receiveShadow??!0;const r=new De;r.add(a),r.userData.src=e[0],t instanceof De&&(r.collisionShapes=t.collisionShapes),this.prepareCollisionShapesForInstanced(r),r.castShadow=!1,r.receiveShadow=!1,this.scene.add(r)}console.timeEnd("materialize batches");for(const e of a.values()){if(0==e.length)continue;const t=e[0].object,a=await this.createFromShape(t),s=Pe(a,e=>!Ee(e)&&null!=e.geometry),i=s.material.clone();null!=e[0].color&&null!=i.color&&(i.color=new n(16777215));const l=s.geometry;let c,h;!(ht||i instanceof _||null==l.index)?(c=new r.BatchedMesh(e.length,l.getAttribute("position").count,l.index.count,i),c.perObjectFrustumCulled=!0,h=c.addGeometry(l)):c=new r.InstancedMesh(l,i,e.length),c.castShadow=a.castShadow??!0,c.receiveShadow=s.receiveShadow??!0;for(let t=0;t<e.length;t++){const a=e[t],s=(new r.Matrix4).compose((new S).fromArray(a.object.position),(new M).setFromEuler((new o).fromArray(a.object.rotation)),(new S).fromArray(a.object.scale)),i=(new m).copy(a.object.parentTransform).multiply(s);let n;n=c instanceof r.BatchedMesh?c.addInstance(h):t,c.setMatrixAt(n,i),null!=a.color&&c.setColorAt(n,a.color)}for(let t=0;t<e.length;t++){const s=e[t],r=new De;r.userData.src=e[0],a instanceof Ve&&(r.collisionShapes=[a.collisionShape]),r.castShadow=!1,r.receiveShadow=!1,this.scene.add(r),r.add(c),null==c.userData.hasCollision&&(c.userData.hasCollision=[]),c.userData.hasCollision[t]=!!s.object.collisionDetection}}await Promise.all(e.map(e=>this.materialize(e))),await this.initActorsPostInit()}prepareCollisionShapesForInstanced(e){e instanceof De&&e.collisionShapes.forEach(e=>{e instanceof a&&e.mesh instanceof d&&(e.mesh=e.mesh.geometry)})}testCanBatch(e,t){return!ht&&!(e instanceof _)&&t.groups.length<2&&(!Array.isArray(e)||1==e.length)&&this.testCanBatchMaterial(e)}testCanBatchMaterial(e){const t=Array.isArray(e)?e[0]:e;return null!=t&&(t instanceof g&&(null==t.bumpMap&&null==t.lightMap&&null==t.displacementMap))}createBatchedMesh(e,t,a){const s=new be;for(const t of e)s.push(t.assetId,t);let i=0,o=0,l=0;const c=new Map;for(const[e,t]of s.entries()){const s=a.get(e);if(null==s){console.warn("Missing batching info for asset id "+e);continue}const r=Ie(s.assetMesh);if(null==r){console.warn("Missing mesh in batched asset");continue}c.set(e,r);const n=r.geometry.getAttribute("position");null==n&&console.warn("Missing position attribute for batched mesh"),i+=r.geometry.index.count*t.length,o+=n.count*t.length,l+=t.length}const h=["color","map","roughness","roughnessMap","metalness","metalnessMap","opacity","alphaMap","aoMap","aoMapIntensity","normalMap","normalScale","emissive","emissiveIntensity","emissiveMap"];let p=new Map,m=new r.MeshStandardMaterial({color:"white"});const d=t.get(e[0].id);if(d instanceof g){const a=new Set,s=new Map;for(const i of e){const e=t.get(i.id);for(const t of h){let i=e[t];i instanceof r.CompressedArrayTexture&&null!=i.userData.index&&(i=i.userData.index);const n=s.get(t);void 0!==n&&i!==n?a.add(t):s.set(t,i)}}for(const e of a){let t;const a=d[e];if("number"==typeof a)t=P(e);else if(a instanceof x)t=E(e);else if(a instanceof S||a instanceof n)t=C(e);else if(a instanceof A)t=D(e);else if(a instanceof r.CompressedArrayTexture)t=P(e+"_i");else if(a instanceof b)continue;p.set(e,t)}let i=q.uv;d instanceof nt&&null!=d.heightMap&&(i=ot(i,H(d.heightMap),B(d.heightScale)));let o=Tt(p.get("opacity"),F)??B(d.opacity??1);if(null!=d.alphaMap){let e;if(d.alphaMap instanceof r.CompressedArrayTexture){const t=J(d.alphaMap),a=Tt(p.get("alphaMap"),F)??B(d.alphaMap.userData.index??0);e=t.sample(K(i.x,i.y,a))}else e=H(d.alphaMap).sample(i);o=o.multiply(e.r)}let l=L(Tt(p.get("color"),Q)??d.color,o);if(null!=d.map){let e;if(d.map instanceof r.CompressedArrayTexture){const t=J(d.map),a=Tt(p.get("map"),F)??B(d.map.userData.index??0);e=t.sample(K(i.x,i.y,a))}else e=H(d.map).sample(i);l=l.multiply(e)}let c=L(Tt(p.get("emissive"),Q)??d.emissive,o);if(null!=d.emissiveMap){let e;if(d.emissiveMap instanceof r.CompressedArrayTexture){const t=J(d.emissiveMap),a=Tt(p.get("emissiveMap"),F)??B(d.emissiveMap.userData.index??0);e=t.sample(K(i.x,i.y,a))}else e=H(d.emissiveMap).sample(i);c=c.multiply(e)}const f=Tt(p.get("emissiveIntensity"),F)??B(d.emissiveIntensity??1),g=Tt(p.get("normalScale"),Z)??Y(d.normalScale??new A(1,1));let y=X.normal;if(null!=d.normalMap){let e;if(d.normalMap instanceof r.CompressedArrayTexture){const t=J(d.normalMap),a=Tt(p.get("normalMap"),F)??B(d.normalMap.userData.index??0);e=t.sample(K(i.x,i.y,a))}else e=H(d.normalMap).sample(i);y=k(e.rgb,g.x)}let w=Tt(p.get("roughness"),F)??B(d.roughness??1);if(null!=d.roughnessMap){let e;if(d.roughnessMap instanceof r.CompressedArrayTexture){const t=J(d.roughnessMap),a=Tt(p.get("roughnessMap"),F)??B(d.roughnessMap.userData.index??0);e=t.sample(K(i.x,i.y,a))}else e=H(d.roughnessMap).sample(i);w=w.multiply(e.g)}let M=Tt(p.get("metalness"),F)??B(d.metalness??0);if(null!=d.metalnessMap){let e;if(d.metalnessMap instanceof r.CompressedArrayTexture){const t=J(d.metalnessMap),a=Tt(p.get("metalnessMap"),F)??B(d.metalnessMap.userData.index??0);e=t.sample(K(i.x,i.y,a))}else e=H(d.metalnessMap).sample(i);M=M.multiply(e.b)}let v=B(1);if(null!=d.aoMap){let e;if(d.aoMap instanceof r.CompressedArrayTexture){const t=J(d.aoMap),a=Tt(p.get("aoMap"),F)??B(d.aoMap.userData.index??0);e=t.sample(K(i.x,i.y,a))}else e=H(d.aoMap).sample(i);v=v.multiply(e.r)}const j=Tt(p.get("aoMapIntensity"),F)??B(d.aoMapIntensity??0);let I=y;!0!==d.userData.disableAO&&(I=N("DOUBLE_SIDED",I,e=>R(new V("gl_FrontFacing"),e,e.multiplyScalar(-1))));const T=new _({color:U({color:l,roughness:w,metalness:M,ambientOcclusion:v,ambientOcclusionIntensity:j,emissive:c,emissiveIntensity:f,normal:I}),normal:y,roughness:w,opacity:o,emissive:c.rgb,transparent:d.transparent,alphaTest:d.alphaTest,envMap:d.envMap});null!=d.envMap&&(T.uniforms.envMapIntensity={value:d.envMapIntensity},T.uniforms.envMapRotation={value:(u=d.envMapRotation,(new r.Matrix3).setFromMatrix4(Vt.makeRotationFromEuler(u)))}),m=T}var u;const f=new it(l,o,i,m);for(const[e,t]of p.entries()){let a=1;t instanceof te||t instanceof Q?a=4:t instanceof Z&&(a=2),f.initUniform(e,a,0)}for(const[e,i]of s.entries()){const s=c.get(e),o=f.addGeometry(s.geometry),l=a.get(e);if(null==l){console.warn("Missing batching info when configuring for asset id "+e);continue}let h=l.assetMesh instanceof De?l.assetMesh.collisionShapes:void 0;const m=this.configureBatchedInstancedMesh(i,f,s,o,h);for(let e=0;e<m.length;e++){const a=i[e],s=m[e],o=t.get(a.id);for(let e of p.keys()){let t=o[e];if(t instanceof n&&(t=new S(t.r,t.g,t.b)),t instanceof r.CompressedArrayTexture)t=t.userData.index??0,e+="_i";else if(t instanceof b||null==t)continue;f.setUniformAt(e,s,t)}}}return f}async createInstancedMesh(e,t){const a=Pe(t,e=>!Ee(e)&&null!=e.geometry),s=await this.assetsService.getAsset(e[0].assetId);await this.applyMaterials(t,St(e[0].materialAssignments,s.materialAssignments)),a.updateMatrix();const i=a.geometry.clone(),n=a.material;let o,l;if(this.testCanBatch(n,i)){const t=Array.isArray(n)?n[0]:n,a=i.getAttribute("position").count;o=new r.BatchedMesh(e.length,a,null!=i.index?i.index.count:a,t),o.perObjectFrustumCulled=!0,l=o.addGeometry(i)}else o=new r.InstancedMesh(i,n,e.length);if(this.configureBatchedInstancedMesh(e,o,a),a.material instanceof p&&o.castShadow&&o.receiveShadow&&Array.isArray(n))for(const e of n);return o}configureBatchedInstancedMesh(e,t,a,s,i){const n=[];for(let l=0;l<e.length;l++){let c=l;t instanceof r.BatchedMesh&&(c=t.addInstance(s)),n.push(c);const h=(new r.Matrix4).compose((new S).fromArray(e[l].position),(new M).setFromEuler((new o).fromArray(e[l].rotation)),(new S).fromArray(e[l].scale)),p=(new m).copy(e[l].parentTransform).multiply(h).multiply(a.matrixWorld);t.setMatrixAt(c,p),null==t.userData.hasCollision&&(t.userData.hasCollision=[]),t.userData.hasCollision[c]=!!e[l].collisionDetection,null!=i&&(null==t.userData.collisionShapes&&(t.userData.collisionShapes=[]),t.userData.collisionShapes[c]=i)}return n}remove(e){if(console.log("Remove scene object",e),"global_fog"==e.type)return void(this.scene.fog=this.originalFog);if("world_env"===e.type)this.resetWorldEnv(),this.worldEnvObj=null;else if("actor"==e.type||"vfx"===e.type){const t=this.materializedActors.get(e.id);null!=t?(t.disposed.next(!0),t.onEndPlay()):console.warn("Failed to remove actor",e)}else"prefab"===e.type&&this.materializedActors.forEach((t,a)=>{a.startsWith(e.id)&&(t.disposed.next(!0),t.onEndPlay()),this.materializedActors.delete(a)});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 je(this.scene,t=>t.userData.src?.assetId==e,e=>null!=e.userData.src)}applyMaterials(e,t){return null==t?Promise.resolve([]):Promise.all(t.filter(e=>"null"!==e.materialId).map(t=>this.applyMaterial(e,t)))}async applyMaterial(e,t){await applyMaterial(e,t,e=>{const t=this.assets.get(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)}},this._originalMaterials)}unapplyMaterials(e){e.traverse(async e=>{if(e instanceof d)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(ne));je(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)})}updateShaders(e){this.shaders=e;for(const[e,t]of dt.entries())t.userData.customShaderName&&dt.delete(e);this.landscapeManagers.forEach(t=>t.updateShaders(e)),je(this.scene,e=>!0).forEach(e=>{e.traverse(async e=>{if(e instanceof d)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=this.assets.get(e.material[t].userData.assetId);this.refreshMaterial(e,e.material[t],a,t)}}else{const t=e.material.userData?.customShaderName;if(null!=t){const t=this.assets.get(e.material.userData.assetId);this.refreshMaterial(e,e.material,t)}}})})}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 s=!1;if(t.traverseAncestors(e=>{"_hology_transform_group"===e.name&&(s=!0)}),!s){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 d&&(e.material.wireframe=!0)}):t.traverse(e=>{e instanceof d&&(e.material.wireframe=!1)})}if("asset_mesh"===e.type){const a=this.assets.get(e.assetId);St(e.materialAssignments,a.materialAssignments).forEach(e=>this.applyMaterial(t,e))}else"shape_mesh"===e.type&&this.applyMaterials(t,e.materialAssignments);if(s||(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 n(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 n(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"directional"===e.light.type?this.applyDirectionalLight(e.light.directional,e):"ambient"===e.light.type&&this.applyDirectionalAmbientLight(t,e.light.ambient,e);else if("landscape"===e.shape){const a=this.landscapeManagers.find(t=>t.source.id===e.id).source.landscape.options.density!==e.landscape.options.density;if(this.inEditor&&a){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 c?"density":"linear")!==e.fog.type;this.scene.fog=vt(e.fog),t&&(a=this.scene).traverse(e=>{if(e instanceof d){const t=e.material;t instanceof _&&(a.fog instanceof l?(t.uniforms.fogFar.value=a.fog.far,t.uniforms.fogNear.value=a.fog.near):a.fog instanceof c&&(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 at){const a=await prepareClassParameters(e.actor.params,null,this.assetsService,this.assetManagerService,this.materializedActors,this.renderingView,[],this.actorProvider);return void Object.assign(t,a)}const a=this.editorActorParamSnapshot.get(e.id);null!=a&&a===JSON.stringify(e.actor)||s||(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 Ve&&(t.geometry=a.geometry,t.collisionShape=a.collisionShape)}("asset_mesh"===e.type||"shape_mesh"===e.type&&"landscape"!==e.shape)&&mt(t,e.castShadow,e.receiveShadow),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;this.renderingView.renderer.shadowMap.needsUpdate=!0}async materializeAndInitActor(e,t=this.findParent(e)){const a=await this.materialize(e,t);return At(e,async e=>{if("actor"===e.type){const t=this.materializedActors.get(e.id);null!=t?await this.initActorsPostInit([t]):console.error(`Something went wrong when creating actor ${e.id}`)}}),a}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?je(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 n(this.scene.fog.color))}findMeshWithGeometry(e){let t;return e.traverse(e=>{e instanceof d&&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=Ae(e.vertexMaterials,e=>e.m);t.traverse(e=>{if(e instanceof d){if(null==e.geometry)return;if(It(_e(e,0,!1)),a>0){It(_e(e,0,!1))}}});const r=new Set;for(const[e,i]of s.entries()){const s=null!=e?t.getObjectByName(e):this.findMeshWithGeometry(t);let n=!1;if(null==s||null==s.geometry)return void console.warn(`Failed to apply vertex materials on mesh with name "${e}"`);const o=_e(s,0,!0);It(o);for(const e of i)o.setX(e.i,e.w[0]??0),o.setY(e.i,e.w[1]??0),o.setZ(e.i,e.w[2]??0),o.setW(e.i,e.w[3]??0),n=!0;if(a>0){const e=_e(s,4,!0);It(e);for(const t of i)e.setX(t.i,t.w[4]??0),e.setY(t.i,t.w[5]??0),e.setZ(t.i,t.w[6]??0),e.setW(t.i,t.w[7]??0),e.needsUpdate=!0,n=!0}n&&r.add(e)}this.inEditor&&this.landscapeManagers.filter(t=>t.source.id===e.id).forEach(e=>e.queueRefreshScatter(this.renderingView.camera.position,!0,e=>r.has(e.name)))}async materialize(e,t,a=!1,s){if(!this.shouldBeMaterialized(e))return;let r,n;switch(e.type){case"asset_mesh":r=await this.createFromAsset(e);break;case"shape_mesh":r=await this.createFromShape(e);break;case"light":r=await this.createLight(e);break;case"particles":r=await this.createParticleSystem(e),e.collisionDetection=!1;break;case"global_fog":this.scene.fog=vt(e.fog),this.fixFogColor(),r=new h;break;case"sky":this.sky=Ge(),this.updateSky(e),r=this.sky;break;case"world_env":this.updateWorldEnv(e),r=new h,this.worldEnvObj=r;break;case"actor":({object:r,actor:n}=await this.createFromActor(e,s));break;case"group":r=new h;break;case"prefab":r=await this.createFromPrefab(e,s);break;case"vfx":r=await this.createFromVfx(e,s);break;default:if(this.inEditor)throw new Error("unknown type "+e.type);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.`)}if(null!=r){if(e.name&&e.name.length>0&&(r.name=e.name),null!=e.position&&r.position.fromArray(e.position),null!=e.scale&&r.scale.fromArray(e.scale),null!=e.rotation&&r.rotation.fromArray(e.rotation),a?r.userData._src=e:r.userData.src=e,null!=n&&(r.userData.actor=n),this.inEditor,this.inEditor){let e=null;r instanceof Ve&&(e=function(e){if(e instanceof Te)return new d(new i(...e.offset.toArray()),bt);return null}(r.collisionShape)),null!=e&&(e.layers.disable(0),e.layers.enable(18),e.scale.multiplyScalar(1.1),r.add(e))}if(this.objectMap.set(r.uuid,e),this.sceneObjectMap.set(e.id,r),e.physics?.type!==oe.dynamic||null==t||this.inEditor?null==t?this.scene.add(r):t?.add(r):(t.add(r),r.getWorldPosition(r.position),r.getWorldQuaternion(r.quaternion),r.getWorldScale(r.scale),this.scene?.attach(r)),null!=e.children&&await Promise.all(e.children?.map(e=>this.materialize(e,r,a))),this.inEditor||"asset_mesh"!=e.type&&"shape_mesh"!==e.type||"landscape"===e.shape||null!=e.physics?.type&&e.physics.type==oe.dynamic||Mt(r),null!=this.renderingView)return this.renderingView.renderer.shadowMap.needsUpdate=!0,r;console.warn("RenderingView not found in materializer. No idea what called this")}}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),this.renderingView.aoPass.output=!0===e.worldEnv.ao.onlyAO?5:0;const t=e.worldEnv.toneMapping;null!=t&&(this.renderingView.renderer.toneMapping=t.mapping??0,this.renderingView.renderer.toneMappingExposure=t.exposure??1);const a=e.worldEnv.environment;null!=a&&null!=a.textureId?this.assetManagerService.getTexture(this.assets.get(a.textureId)).then(e=>{null==this.pmremGenerator&&(this.pmremGenerator=new r.PMREMGenerator(this.renderingView.renderer),this.pmremGenerator.compileEquirectangularShader()),this.pmremGeneratorResults.has(e)||this.pmremGeneratorResults.set(e,this.pmremGenerator.fromEquirectangular(e).texture);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.renderer.toneMapping=0,this.renderingView.renderer.toneMappingExposure=1}async updateSky(e){if(null==e?.sky?.materialId)return void(this.sky.material=He);const t=await this.assetsService.getAsset(e.sky.materialId),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=r.BackSide,(e instanceof g||e instanceof r.MeshBasicMaterial||e instanceof r.ShaderMaterial)&&(e.fog=!1),e.depthTest=!1}async createComponent(e,t,a,s){const r=new lt[a.path+"/"+a.className],i=t.id+s;r.id=i,r.object=e;for(const e of a.params)null!=e.value&&(r[e.name]=e.value);return this.components.push(r),i}async createFromActor(e,t){const a=this.actorTypes.find(t=>t.name===e.actor?.type)?.type??ne[e.actor?.type];if(null==a)return{object:null,actor:null};this.inEditor&&this.editorActorParamSnapshot.set(e.id,JSON.stringify(e.actor));const s=await this.actorProvider.create(a,(new S).fromArray(e.position),(new o).fromArray(e.rotation),!0);return this.materializedActors.set(this.getNestedActorId(e.id,t),s),{object:s?.object,actor:s}}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(se,(new S).fromArray(e.position),(new o).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 d&&this._originalMaterials.set(e.id,e.material)});else{let s=new g({name:"Default",color:new n("#aaaaaa"),visible:this.inEditor||!e.hidden,wireframe:!!t});const r=await this.createMeshByShape(e.shape,s,e.shapeParams);r.castShadow=e.castShadow??!0,r.receiveShadow=e.castShadow??!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=ke(e.landscape.options);this.applyHeightMaps(a,e.landscape.heightMaps,!0);const s=new Oe(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 Be(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(()=>Fe(r),50)}async createMeshByShape(e,t,a={}){if("landscape"!==e&&Re.includes(e)){const s=await prepareShapeParameters(a??{}),r=e+JSON.stringify(a);if(!this.geometryCache.has(r)){const t=$e[e].geometry(s);t.computeTangents(),this.geometryCache.set(r,t)}this.collisionShapeCache.has(r)||this.collisionShapeCache.set(r,$e[e].collision(s));return new Ve(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){const t=await this.assetsService.getAsset(e.assetId);if(null==t)return void console.warn(`Can not find asset with id ${e.assetId} and name ${e.name}`);let{scene:a}=await this.assetManagerService.getMesh(t,{mergeGeomtries:!0});try{await Promise.all(St(e.materialAssignments,t.materialAssignments).map(e=>this.applyMaterial(a,e)))}catch(t){console.error("Failed to apply material"+t,e)}const s=e.receiveShadow??!!t.receiveShadow??!0,r=e.castShadow??!!t.castShadow??!1;return a.receiveShadow=s,mt(a,r,s),e.collisionDetection||(a.collisionShapes=[]),null!=e.physics&&!0!==this.inEditor&&(a.physics=e.physics),this.applyVertexMaterials(e,a),a.traverse(e=>{e instanceof d&&"computeBoundsTree"in e.geometry&&null==e.geometry.boundsTree&&e.geometry.computeBoundsTree()}),a}async createFromPrefab(e,t){const a=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}`);null==t&&(t={sceneObjectChain:[]}),t.sceneObjectChain.push(e.id);const{object:s}=await this.createFromPrefabAsset(a,t);return t.sceneObjectChain.pop(),s}async createFromPrefabAsset(e,t){const a=new h;await Promise.all(e.prefab.objects.filter(e=>"global_fog"!==e.type&&"world_env"!==e.type).map(e=>this.materialize(e,a,!0,structuredClone(t))));const s=t.sceneObjectChain.join("/"),r=Array.from(this.materializedActors.entries()).filter(([e,a])=>e.startsWith(s)&&e.split("/").length-1===t.sceneObjectChain.length).map(([,e])=>e);r.forEach(e=>{a.add(e.object)}),this.initActorsPostInit(r,structuredClone(t));const i=Array.from(this.materializedActors.entries()).filter(([e,t])=>e.startsWith(s)).map(([,e])=>e);return{object:a,actors:i}}async createParticleSystem(e){const t=await this.assetsService.getAsset(e.assetId),a=new y;return await j.fromJSONAsync(t.particleSystem,r).then(e=>{const t=new I(a,r);e.addRenderer(t),this.renderingView.onLoop(t=>e.update())}),a}async createLight(e){if("point"===e.light.type){const t=new w(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 r.TextureLoader).load("assets/light-bulb-icon.webp"),a=new r.SpriteMaterial({map:e,alphaTest:.5}),s=new st(a);s.scale.multiplyScalar(.6),t.add(s)}return t}if("spot"===e.light.type){const t=new r.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 y,t.target.position.set(0,-1,0),t.add(t.target),this.inEditor){const e=(new r.TextureLoader).load("assets/light-bulb-icon.webp"),a=new r.SpriteMaterial({map:e,alphaTest:.5}),s=new st(a);s.scale.multiplyScalar(.6),t.add(s),t.add(new r.SpotLightHelper(t))}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===Ue);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.updateSubscription.unsubscribe(),this.createAssetSubscription.unsubscribe(),this.materializedActors.forEach(e=>e.disposed.next(!0)),this.materializedActors.clear()}};pt=e([ae(),t("design:paramtypes",[v,Object,Object,Ce,he,Array,Array,Object])],pt);export{pt as SceneMaterializer};function mt(e,t,a){e.castShadow=t,e.receiveShadow=a,e.traverse(e=>{e.castShadow=t,e.receiveShadow=a})}const dt=new Map,ut=new Map,ft=new u({color:16711935}),gt=new Map;export async function materialFromAsset(e,t,a,s,r,i=!0){const n=JSON.stringify(e.material);return i&&dt.has(n)?dt.get(n):i&&ut.has(n)?await ut.get(n):ut.set(n,_materialFromAsset(n,e,t,a,s,r,i)).get(n)}export async function _materialFromAsset(e,t,a,s,i,o,l=!0){const c={opacity:t.material.params.opacity,map:null,emissive:t.material.params.emissive??null,metalness:t.material.params.metalness??0,flatShading:t.material.params.flatShading??!1,color:new n(t.material.params.color),transparent:null!=t.material.params.opacity&&t.material.params.opacity<1},h={};if(null!=t.material.params.map){const e=t.material.params.map,a=await s.getAsset(e);null!=a&&(c.map=await i.getTexture(a))}let p;switch(t.material.type){case"phong":p=new f({...c,...h});break;case"water":p=We(c,a);break;case"grassFoliage":p=Ne({color:c.color,map:c.map},a);break;case"grass":p=ze({...c,colorTwo:new n(t.material.params.colorTwo),colorThree:new n(t.material.params.colorThree)},a);break;case"standard":case"unlit":case"toon":case"layered":case"lambert":case"shader":case"landscape":case"landscape-composite":case"decal-unlit":case"decal-standard":const e={standard:ct?fe:we,lambert:fe,unlit:Me,toon:rt,layered:et,landscape:ye,"landscape-composite":ge,"decal-unlit":qe,"decal-standard":Xe}[t.material.type]??o.find(e=>e.name==t.material.shader)?.type;if(e){try{let r=new e;const n=await prepareClassParameters(t.material?.shaderParams??{},e,s,i,null,a,o);Object.assign(r,n),p=r.build()}catch(e){console.log("Shader runtime error: "+e),gt.has(t.material.shader)||gt.set(t.material.shader,ft.clone()),p=gt.get(t.material.shader)}p.userData.customShaderName=t.material.shader}else console.warn("Missing shader implementation with name "+t.material.shader),p=ft;break;default:throw new Error("Unsupported material type"+t.material.type)}return a?.csm.setupMaterial(p),null!=a&&dt.set(e,p),p.side=t.material.side??p.side??r.FrontSide,p.transparent=(t.material.transparent??c.transparent??!1)||p.transparent,p.alphaTest=t.material.alphaTest??p.alphaTest??0,null!=t.material.blending&&(p.blending=le[t.material.blending]??r.NormalBlending),t.material.bloom&&(p.userData.hasBloom=!0),t.material.reflective&&(p.userData.reflective=!0),!0===t.material.outlines&&(p.userData.outlineParameters={},null!=t.material.outlineParams&&(null!=t.material.outlineParams.color&&(p.userData.outlineParameters.color=new n(t.material.outlineParams.color).toArray()),null!=t.material.outlineParams.thickness&&(p.userData.outlineParameters.thickness=t.material.outlineParams.thickness))),p.userData.assetId=t.id,ut.delete(e),p}export async function prepareClassParameters(e,t,a,s,r,i,n,o){const l={};for(const[t,c]of Object.entries(e)){const e=await wt(t,c,a,s,r,i,n,o);null!=e&&(l[t]=e)}return l}export async function prepareShapeParameters(e){const t={};for(const[a,s]of Object.entries(e)){const e=await wt(a,s,null,null,null);null!=e&&(t[a]=e)}return t}const yt=new Map;async function wt(e,t,a,s,r,i,l,c,h=t.value,p=t.type){if(null==t||null==h||""===h)return null;switch(p){case Le.Array:if(Array.isArray(h)&&"element"in t)return await Promise.all(h.map(n=>wt(e,t,a,s,r,i,l,c,n,t.element)));break;case Le.Number:case Le.FloatNode:let p;if("string"==typeof h?p=parseFloat(h):"number"==typeof h&&(p=h),t.type===Le.FloatNode){if("object"==typeof h&&"a"in h&&"b"in h){const e=h;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=yt.get(e);return null==t&&(t=pe(Je.decode(e)),yt.set(e,t)),t}(e.easing),r=s.sample(me(de.energy));return z(B(t),B(a),r)}return B(p)}return p;case Le.Texture:let m=await s.getTexture(await a.getAsset(h));return"envmap"===e.toLowerCase()&&null!=i&&(m=i.getEnvTexture(m)),m;case Le.Sampler2DNode:return H(await s.getTexture(await a.getAsset(h)));case Le.Boolean:return h;case Le.BooleanNode:return T(h);case Le.Vector2:case Le.Vec2Node:if("object"==typeof h){const e=h instanceof Array?(new A).fromArray(h):new A(h.x,h.y);return t.type===Le.Vec2Node?Y(e):e}return null;case Le.Vector3:case Le.Vec3Node:if("object"==typeof h){const e=h instanceof Array?(new S).fromArray(h):new S(h.x,h.y,h.z);return t.type===Le.Vec3Node?K(e):e}return null;case Le.Color:case Le.RgbNode:const d=new n(h);return t.type===Le.RgbNode?W(d):d;case Le.String:return h;case Le.BaseActor:const u=h;return null==r&&console.warn("Class parameters can not be prepared as actors are not passed in"),r?.get(u);case Le.Euler:const f=h;return(new o).fromArray(f);case Le.Object3D:return(await s.getMesh(await a.getAsset(h))).scene;case Le.Material:return await materialFromAsset(await a.getAsset(h),i,a,s,l);case Le.AudioBuffer:return await s.getAudio(await a.getAsset(h));case Le.VisualEffect:const g=await a.getAsset(h);if(null==c){console.error("Can not create instance of visual effect because missing actor provider");break}if("vfx"in g)return new re(c,g);console.error("Using a non-vfx asset for visual effect parameter");break;case Le.Curve:return Je.decode(h);case Le.ColorLayer:case Le.MaskLayer:if(tt(h)){const e=await Ye.decode(h,async e=>await s.getTexture(await a.getAsset(e))),t=await prepareClassParameters(h.params,null,a,s);return Object.assign(e,t),e}return console.warn("Expecting color layer but got",h),null}return null}function Mt(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 vt(e){return"linear"===e.type?new l(new n(e.color),e.near??100,e.far??1e3):"density"===e.type?new c(e.color,e.density):void console.warn("Invalid fog type",e)}const bt=new g({color:4229780});async function At(e,t,a,s){null==s&&(s=(new m).identity()),await t(e,a,s);const i=s.clone().multiply(function(e,t){if(null==e.position||null==e.rotation||null==e.scale)return t.identity();return t.compose((new S).fromArray(e.position),(new M).setFromEuler((new o).fromArray(e.rotation)),(new S).fromArray(e.scale))}(e,new r.Matrix4));return Promise.all((e.children??[]).map(a=>At(a,t,e,i)))}export function toSerializedParamType(e){const t=e.constructor.prototype;return t instanceof Number||e===Number?Le.Number:t instanceof F||"function"==typeof e.prototype.isFloat?Le.FloatNode:t instanceof b||e===b||e.isTexture?Le.Texture:t instanceof ue||e===G?Le.Sampler2DNode:t instanceof Boolean||e===Boolean?Le.Boolean:t instanceof O?Le.BooleanNode:t instanceof n||e==n?Le.Color:t instanceof $||"function"==typeof e.prototype.isRgb?Le.RgbNode:t instanceof A||e==A?Le.Vector2:t instanceof Z||"function"==typeof e.prototype.isVec2?Le.Vec2Node:t instanceof S||e==S?Le.Vector3:t instanceof Q||"function"==typeof e.prototype.isVec3?Le.Vec3Node:t instanceof String||e===String?Le.String:t instanceof ie||e==ie||e.prototype instanceof ie||e.prototype==ie?Le.BaseActor:t instanceof o||e==o?Le.Euler:t instanceof y||e==y?Le.Object3D:t instanceof p||e==p?Le.Material:t instanceof AudioBuffer||e==AudioBuffer?Le.AudioBuffer:t instanceof re||e==re?Le.VisualEffect:t instanceof Je||e==Je?Le.Curve:t instanceof Ye||e==Ye?Le.ColorLayer:t instanceof Qe||e==Qe?Le.MaskLayer:void console.warn("Failed to map parameter type to serialized version",{type:e})}export function prepareCustomParams(e,t,a={}){return Object.fromEntries(e.map(e=>[e.name,{type:e.options.array?Le.Array:toSerializedParamType(e.type),...e.options.array?{element:toSerializedParamType(e.type)}:{},value:t[e.name]?.value??(!0!==e.options.array?a[e.name]??customParameterDefaultValueByType.get(toSerializedParamType(e.type)):[])}]))}export function prepareCustomParamsFromType(e,t,a=null){const s=ve(e);if(0===s.length)return{};let r;null!=a?ce(a,()=>{r=a.get(e)}):r=new e;const i={};for(const e of s){const t=r[e.name];if(null!=t&&!0!==e.options.array){const a=serializeCustomParameter(e.type,t);null!=a&&(i[e.name]=a)}}return prepareCustomParams(s,t,i)}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 A:return t instanceof A?t.toArray():void a();case S:return t instanceof S?t.toArray():void a();case x:return t instanceof x?t.toArray():void a();case n:return t instanceof n?"#"+t.getHexString():"string"==typeof t?t:"number"==typeof t?"#"+new n(t).getHexString():void a();case String:return t;case o:return t instanceof o?t.toArray():void a()}}function St(e,t){return function(e,t,a){const s=[],r=new Set;for(const i of[...e??[],...t??[]]){const e=a(i);r.has(e)||(r.add(e),s.push(i))}return s}((e??[]).filter(e=>xt(e.materialId)),(t??[]).filter(e=>xt(e.materialId)),e=>e.color+e.name)}function xt(e){return"null"!=e&&null!=e}export const customParameterDefaultValueByType=new Map([[Le.RgbNode,"#000000"],[Le.Color,"#000000"],[Le.Vector4,[0,0,0,0]],[Le.Vec4Node,[0,0,0,0]],[Le.Vector3,[0,0,0]],[Le.Vec3Node,[0,0,0]],[Le.Vector2,[0,0]],[Le.Vec2Node,[0,0]],[Le.Euler,[0,0,0,"XYZ"]],[Le.Array,[]],[Le.ColorLayer,Ze],[Le.MaskLayer,Ke]]);export function applyMaterial(e,t,a,s){const i=[];return e.traverse(async e=>{if(e instanceof d||e.isMesh||e instanceof r.SkinnedMesh||e.isSkinnedMesh)for(const t of Se(e.material))t.hasOwnProperty("color")&&i.push(e)}),Promise.all(i.map(async e=>{if(e.material instanceof Array)for(let r=0;r<e.material.length;r++){const i=e.material[r];if(null==i.color||!(i.color instanceof n))continue;const o="#"+i.color.getHexString(),l=i.name;if(o===t.color&&(i.name===t.name||null==t.name)||e.userData["originalColor_"+r]===t.color&&e.userData["originalMaterialName_"+r]===t.name){const i=await a(t.materialId),n=e.material[r];null!=i&&n.id!=i.id&&(e.material[r]=i,e.userData["originalColor_"+r]=e.userData["originalColor_"+r]??o,e.userData["originalMaterialName_"+r]=e.userData["originalMaterialName_"+r]??l,null!=s&&s.set(e.id+"#"+r,n))}}else if("color"in e.material){const r="#"+e.material.color.getHexString(),i=e.material.name;if(r===t.color&&(e.material.name===t.name||null==t.name)||e.userData.originalColor===t.color&&e.userData.originalName===t.name){const n=await a(t.materialId),o=e.material;null!=n&&(e.material=n,e.userData.originalColor=e.userData.originalColor??r,e.userData.originalMaterialName=e.userData.originalMaterialName??i,null!=s&&(s.has(e.id)||s.set(e.id,o)))}}}))}function jt(e,t){if(e instanceof r.ShaderMaterial&&t instanceof r.ShaderMaterial){return e.fragmentShader+e.vertexShader==t.fragmentShader+t.vertexShader&&function(e,t){if(e instanceof r.ShaderMaterial&&t instanceof r.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 It(e){if(null!=e){for(let t=0;t<e.array.length;t++)e.setX(t,0);e.needsUpdate=!0}}const Pt=new WeakMap;function Dt(e){let t=Pt.get(e);return null==t&&(t=function(e){const t=Ie(e);if(null==t)return"";return Object.keys(t.geometry.attributes).sort().join(",")}(e),Pt.set(e,t)),t}const Ct=new WeakMap;function Et(e){let t=Ct.get(e);return null==t&&(t=function(e){let t=e.type;e instanceof r.MeshToonMaterial&&(t+=e.id);(e instanceof r.MeshBasicMaterial||e instanceof r.MeshLambertMaterial||e instanceof g||e instanceof f)&&(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 g&&(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 u||e instanceof f)&&null!=e.specularMap&&(t+="s"+e.specularMap?.id);e instanceof r.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 nt&&null!=e.heightMap&&(t+="h"+e.heightMap?.id);if(e instanceof r.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.depthWrite?"dw":"",t+=e.depthTest?"dt":"",t+=e.alphaTest,t}(e),Ct.set(e,t)),t}function Tt(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 Vt=new m;/*
1
+ import{__decorate as e,__metadata as t}from"tslib";import{ConvexPolyhedronCollisionShape as a}from"@hology/core";import{Subject as s}from"rxjs";import*as r from"three";import{BoxGeometry as i,Color as n,Euler as o,Fog as l,FogExp2 as c,Group as h,Material as p,Matrix4 as d,Mesh as m,MeshLambertMaterial as u,MeshPhongMaterial as f,MeshStandardMaterial as g,Object3D as y,PointLight as w,Quaternion as M,Scene as v,Texture as b,Vector2 as A,Vector3 as S,Vector4 as x}from"three";import I,{SpriteRenderer as j}from"@hology/nebula";import{batchingUniformFloat as D,batchingUniformVec2 as P,batchingUniformVec3 as C,batchingUniformVec4 as E,bool as T,BooleanExpression as V,BooleanNode as O,colorToNormal as k,float as F,FloatNode as B,ifDefApply as z,mix as N,NodeShaderMaterial as _,rgb as U,rgba as $,RgbNode as W,select as L,standardMaterial as R,Texture2dLookupNode as G,textureSampler2d as H,textureSampler2dArray as J,varyingAttributes as q,varyingTransformed as X,vec2 as Y,Vec2Node as Z,vec3 as K,Vec3Node as Q,vec4 as ee,Vec4Node as te}from"three-shader-graph";import{Service as ae}from"typedi";import{VfxActor as se}from"../effects/vfx/vfx-actor.js";import{VisualEffect as re}from"../effects/vfx/vfx-param.js";import{BaseActor as ie}from"../gameplay/actors/actor.js";import ne from"../gameplay/actors/builtin/index.js";import{PhysicsBodyType as oe,ThreeBlendingMode as le,withInjectionContext as ce}from"../gameplay/index.js";import{RenderingView as he}from"../rendering.js";import{curveSampler as pe,oneMinus as de,particleUniforms as me,Sampler2DNode as ue}from"../shader-nodes/index.js";import{LambertShader as fe}from"../shader/builtin/lambert-shader.js";import{LandscapeCompositeShader as ge}from"../shader/builtin/landscape-composite-shader";import{LandscapeShader as ye}from"../shader/builtin/landscape-shader.js";import{StandardShader as we}from"../shader/builtin/standard-shader.js";import{UnlitShader as Me}from"../shader/builtin/unlit-shader.js";import{extractShaderParameters as ve}from"../shader/parameter.js";import{ArrayMap as be,DefaultMap as Ae,groupBy as Se}from"../utils/collections.js";import{iterateMaterials as xe}from"../utils/materials.js";import{filterChildrenShallow as Ie,filterSceneShallow as je,findFirstVisibleMesh as De,findFirstVisibleObject as Pe,traverseAsync as Ce}from"../utils/three/traverse.js";import{AssetMeshInstance as Ee,AssetResourceLoader as Te}from"./asset-resource-loader.js";import{isCollisionMesh as Ve}from"./collision/collision-shape-import.js";import{BoxCollisionShape as Oe,PhysicalShapeMesh as ke}from"./collision/collision-shape.js";import{LandscapeManager as Fe}from"./landscape/landscape-manager.js";import{initLandscape as Be}from"./landscape/landscape.js";import{SectionGrid as ze,smoothNormalsCrossMeshes as Ne}from"./landscape/utils.js";import{createGrassFoliageMaterial as _e}from"./materials/grass-foliage.js";import{createGrassMaterial as Ue}from"./materials/grass.js";import{getMaterialAttribute as $e}from"./materials/utils/material-painting.js";import{createWaterMaterial as We}from"./materials/water.js";import{SerializedParamType as Le}from"./model.js";import{ShapeLibrary as Re,ShapeLibraryKeys as Ge}from"./objects/shapes.js";import{ambientLightName as He,createSky as Je,defaultSkyMaterial as qe}from"./sky.js";import{Curve2 as Xe}from"../utils/curve.js";import{DecalUnlitShader as Ye}from"../shader/builtin/decal-unlit-shader.js";import{DecalStandardShader as Ze}from"../shader/builtin/decal-standard-shader.js";import{ColorLayer as Ke,defaultValueColorLayer as Qe,defaultValueMaskLayer as et,MaskLayer as tt}from"../shader/color-layer.js";import{LayeredShader as at}from"../shader/builtin/layered-shader";import{isColorLayerSerialized as st}from"../shader/color-layer";import{FogVolume as rt}from"../rendering/fog/fog-volume-actor.js";import{UnscaledSprite as it}from"../utils/three/unscaled-sprite.js";import{ToonShader as nt}from"../shader/builtin/toon-shader.js";import{BatchedMesh2 as ot}from"./batched-mesh-2.js";import{ParallaxStandardMaterial as lt}from"../shader/builtin/standard-shader";import{parallaxOcclusionMapping as ct}from"../shader-nodes/pom.js";import{traverseVisibleEvery as ht}from"../utils/three/traverse";const pt={},dt=/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent),mt=/^((?!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 ut(e,this.dataProvider,this.assetsService,this.assetManagerService,t,[],[],{create:()=>null,initActor:async()=>{}})}}let ut=class{constructor(e,t,a,i,n,o,l,c){this.scene=e,this.dataProvider=t,this.assetsService=a,this.assetManagerService=i,this.renderingView=n,this.shaders=o,this.actorTypes=l,this.actorProvider=c,this.objectMap=new Map,this.sceneObjectMap=new Map,this.components=[],this.landscapeManagers=[],this.materializedActors=new Map,this.inEditor=!0,this.updated$=new s,this.removed$=new s,this.error$=new s,this.editorActorParamSnapshot=new Map,this.assets=new Map,this._canBeInstancedCache=new Map,this._originalMaterials=new Map,this.pmremGeneratorResults=new WeakMap,this.prefabInstanceChain=[],this.geometryCache=new Map,this.collisionShapeCache=new Map,this.originalFog=null,t.onCreate(e=>this.update(e)),t.onUpdate(e=>this.update(e)),t.onRemove(e=>this.remove(e)),this.createAssetSubscription=a.onCreate.subscribe(e=>{this.assets.set(e.id,e)}),this.updateSubscription=a.onUpdate.subscribe(async t=>{this.assets.set(t.id,t),"material"==t.type?e.traverse(e=>{if(e instanceof r.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)}):"mesh"==t.type?(this.findByAssetId(t.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 S,!0)})):"prefab"===t.type?this.findByAssetId(t.id).forEach(e=>{const t=e.userData.src;this.remove(t),this.materializeAndInitActor(t)}):"vfx"===t.type&&this.dataProvider.getObjects().forEach(e=>{It(e,(e,a)=>{"vfx"===e.type&&e.assetId===t.id&&(this.remove(e),this.materializeAndInitActor(e))})})})}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)for(const s of Object.values(e.material.shaderParams)){if(s.type===Le.Material&&s.value===a.id){t=!0;break}if(s.type===Le.Array&&"element"in s&&s.element===Le.Material&&s.value.includes(a.id)){t=!0;break}}if(!t)return}const i=await materialFromAsset(this.assets.get(r),this.renderingView,this.assetsService,this.assetManagerService,this.shaders,!1),n=i.userData;i.userData=t.userData,i.userData.hasBloom=n.hasBloom,i.userData.reflective=n.reflective,i.userData.outlineParameters=n.outlineParameters,null!=s?Vt(e.material[s],i)||(e.material[s]=i):Vt(e.material,i)||(e.material=i,e===this.sky&&this.applySkySettings(e.material))}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=[];if(await Promise.all(this.dataProvider.getObjects().filter(e=>"shape_mesh"===e.type||"asset_mesh"===e.type).filter(e=>null!=e.materialAssignments).flatMap(e=>e.materialAssignments).map(async t=>{const a=this.assets.get(t.materialId);if(null!=a)for(const t of Object.values(a.material.shaderParams))if(t.type===Le.Texture&&"string"==typeof t.value){const a=this.assets.get(t.value),s=await this.assetManagerService.getTexture(a);null!=s&&e.push(s)}})),0!==e.length&&this.renderingView){console.log(`Initializing ${e.length} textures`),console.time("Init textures");for(const t of e)this.renderingView.renderer.initTexture(t);console.timeEnd("Init textures")}}async prefetchAssets(){const e=Array.from(new Set(this.dataProvider.getObjects().filter(e=>null!=e.assetId&&"asset_mesh"==e.type).filter(e=>e.assetId)));await Promise.all(e.map(e=>this.assetsService.getAsset(e.assetId).then(e=>{if(null!=e)return this.assetManagerService.getMesh(e)}))),this.initTextures()}async init(){await this.preInit(),gt.clear(),yt.clear(),await this.prefetchAssets(),await Promise.all(this.dataProvider.getObjects().map(e=>this.materialize(e))),await this.initActorsPostInit()}initActorsPostInit(e=this.getTopLevelActors(),t){const a=e.map(async e=>{const a=e.object.userData.src??e.object.userData._src;if("vfx"===a.type)return Promise.resolve();const s=await this.assetsService.getAsset(a.assetId),r={...s?.actor?.params??{},...a.actor?.params??{}},i=null!=t?new Map(Array.from(this.materializedActors.entries()).filter(([e,a])=>e.startsWith(t.sceneObjectChain.join("/"))&&e.split("/").length-1===t.sceneObjectChain.length).map(([e,t])=>[e.split("/").pop(),t])):this.materializedActors;for(const t of a.actor.innerParams??[])await this.applyActorComponentParams(e,t.path.slice(),t.params,i);const n=await prepareClassParameters(r,e.constructor,this.assetsService,this.assetManagerService,i,this.renderingView,this.shaders,this.actorProvider);Object.assign(e,n);try{return await this.actorProvider.initActor(e)}catch(e){console.error(`Failed to initiate actor (name="${a.name}", id=${a.id})`,e)}});return Promise.all(a)}addVfxChildActors(e,t=e){}async applyActorComponentParams(e,t,a,s){const r=t.length,i=t.shift();if(0==r){const t=await prepareClassParameters(a,null,this.assetsService,this.assetManagerService,s,this.renderingView,this.shaders,this.actorProvider);for(const[a,s]of Object.entries(t))null!=s&&(e[a]=s)}else null!=e[i]&&await this.applyActorComponentParams(e[i],t,a,s)}canObjectBeInstanced(e){return e.physics?.type!==oe.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=>{!Ve(e)&&e.isMesh&&s.push(e)});const r=1==s.length&&0==s[0].children.length,i=!mt,n=s.every(e=>!Array.isArray(e.material)||1===e.material.length),o=s.some(e=>e instanceof m&&null!=e.geometry.morphAttributes&&Object.keys(e.geometry.morphAttributes).length>0),l=!0;t=s.length>0&&(r||n&&i)&&l&&!o,this._canBeInstancedCache.set(e.assetId,t)}return t}async preInit(){this.renderingView?.onLoop(()=>{null!=this.sky&&this.renderingView.camera.getWorldPosition(this.sky.position)}),this.assetsService.getAssets().then(e=>{for(const t of e)this.assets.set(t.id,t)})}shouldBeMaterialized(e){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(),gt.clear(),yt.clear();const e=[],t=new be,a=new be,s=new be;let i=0,l=0,c=0;const h=new Map,p=new Ae(()=>new Map);for(const r of this.dataProvider.getObjects())await It(r,async(r,o,d)=>{if(!this.shouldBeMaterialized(r))return;const u="asset_mesh"==r.type&&this.canObjectBeInstanced(r)&&await this.canAssetBeInstanced(r),f="shape_mesh"===r.type&&"landscape"!==r.shape&&r.physics?.type!==oe.dynamic;if(u||f){if(o&&o.children?.length>0){const e=o.children.findIndex(e=>e.id===r.id);e>=0&&o.children.splice(e,1)}if(f){let e=r.shape+JSON.stringify(r.shapeParams??{})+r.castShadow+r.receiveShadow;const t=r.materialAssignments?.at(0)?.materialId,a=null!=t?this.assets.get(t):null;let i=null;if(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===Le.Color&&null!=e.value&&(i=new n(e.value))}}}else e+=t;s.push(e,{object:{...r,parentTransform:d},color:i}),c++}else{const e=this.assets.get(r.assetId);let s=h.get(r.assetId);if(null==s){const e=await this.createFromAsset(r,{assignMaterials:!1});if(null==e)return;if(s=h.get(r.assetId),null==s){s={useBatchedMesh:null!=De(e)&&ht(e,e=>!(e instanceof m)||this.testCanBatch(e.material,e.geometry)),assetMesh:e},h.set(r.assetId,s)}}const n=Dt(r.materialAssignments,e.materialAssignments);if(s.useBatchedMesh)await Ce(s.assetMesh,async e=>{if(!(e instanceof m))return;const t=Array.isArray(e.material)?e.material[0]:e.material,s=n.find(e=>null!=t.color&&Tt(e.color,t.color)&&(null==e.name||t.name===e.name))?.materialId;let o=t;if(null!=s){const e=this.assets.get(s);o=await materialFromAsset(e,this.renderingView,this.assetsService,this.assetManagerService,this.shaders,!0)}if(null!=o){p.get(r.id).set(e.uuid,o);let t=zt(o);t+=Ft(e),a.push(t,{...r,parentTransform:d,meshUUID:e.uuid}),i++}else console.warn("Can not materialize mesh because missing material",r)});else{const e=r.assetId+JSON.stringify(r.materialAssignments??[]);t.push(e,{...r,parentTransform:d}),l++}}}else null==o&&e.push({...r,parentTransform:d})});console.log(`Scene init stats: \n Batched Assets: ${a.size} groups containing in total ${i} objects.\n Instanced Assets: ${t.size} groups containing in total ${l} objects.\n Shapes: ${s.size} batch groups containing in total ${c} objects. \n ${e.length} objects can not be batched. \n `);for(const e of h.values())this.prepareCollisionShapesForInstanced(e.assetMesh);console.time("materialize batches");for(const e of a.values()){if(0==e.length)continue;let t;const a=h.get(e[0].assetId).assetMesh;t=this.createBatchedMesh(e,p,h);const s=this.assets.get(e[0].assetId);t.castShadow=e[0].castShadow??s.castShadow??!0,t.receiveShadow=e[0].receiveShadow??s.receiveShadow??!0;const r=new Ee;r.add(t),r.userData.src=e[0],a instanceof Ee&&(r.collisionShapes=a.collisionShapes),r.castShadow=!1,r.receiveShadow=!1,this.scene.add(r)}for(const e of t.values()){if(0==e.length)continue;let t;const a=h.get(e[0].assetId).assetMesh;t=await this.createInstancedMesh(e,a);const s=this.assets.get(e[0].assetId);t.castShadow=e[0].castShadow??s.castShadow??!0,t.receiveShadow=e[0].receiveShadow??s.receiveShadow??!0;const r=new Ee;r.add(t),r.userData.src=e[0],a instanceof Ee&&(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=Pe(a,e=>!Ve(e)&&null!=e.geometry),i=s.material.clone();null!=e[0].color&&null!=i.color&&(i.color=new n(16777215));const l=s.geometry;let c,h;!(mt||i instanceof _||null==l.index)?(c=new r.BatchedMesh(e.length,l.getAttribute("position").count,l.index.count,i),c.perObjectFrustumCulled=!0,h=c.addGeometry(l)):c=new r.InstancedMesh(l,i,e.length),c.castShadow=a.castShadow??!0,c.receiveShadow=s.receiveShadow??!0;for(let t=0;t<e.length;t++){const a=e[t],s=(new r.Matrix4).compose((new S).fromArray(a.object.position),(new M).setFromEuler((new o).fromArray(a.object.rotation)),(new S).fromArray(a.object.scale)),i=(new d).copy(a.object.parentTransform).multiply(s);let n;n=c instanceof r.BatchedMesh?c.addInstance(h):t,c.setMatrixAt(n,i),null!=a.color&&c.setColorAt(n,a.color)}for(let t=0;t<e.length;t++){const s=e[t],r=new Ee;r.userData.src=e[0],a instanceof ke&&(r.collisionShapes=[a.collisionShape]),r.castShadow=!1,r.receiveShadow=!1,this.scene.add(r),r.add(c),null==c.userData.hasCollision&&(c.userData.hasCollision=[]),c.userData.hasCollision[t]=!!s.object.collisionDetection}}await Promise.all(e.map(e=>this.materialize(e))),await this.initActorsPostInit()}prepareCollisionShapesForInstanced(e){e instanceof Ee&&e.collisionShapes.forEach(e=>{e instanceof a&&e.mesh instanceof m&&(e.mesh=e.mesh.geometry)})}testCanBatch(e,t){return!mt&&t.groups.length<2&&(!Array.isArray(e)||1==e.length)&&this.testCanBatchMaterial(e)}testCanBatchMaterial(e){const t=Array.isArray(e)?e[0]:e;return null!=t&&(!(t instanceof g)||null==t.bumpMap&&null==t.lightMap&&null==t.displacementMap)}createBatchedMesh(e,t,a){const s=new be;for(const t of e)null!=t.meshUUID?s.push(t.meshUUID??t.assetId,t):console.warn("Missing mesh uuid for batching");let i=0,o=0,l=0;const c=new Map;for(const[e,t]of s.entries()){const s=t[0].assetId,r=a.get(s);if(null==r){console.warn("Missing batching info for asset id "+s);continue}const n=Pe(r.assetMesh,t=>t instanceof m&&t.uuid===e);if(null==n){console.warn("Missing mesh in batched asset");continue}c.set(e,n);const h=n.geometry.getAttribute("position");null==h&&console.warn("Missing position attribute for batched mesh"),i+=n.geometry.index.count*t.length,o+=h.count*t.length,l+=t.length}const h=["color","map","roughness","roughnessMap","metalness","metalnessMap","opacity","alphaMap","aoMap","aoMapIntensity","normalMap","normalScale","emissive","emissiveIntensity","emissiveMap"];let p=new Map,d=new r.MeshStandardMaterial({color:"white"});const u=t.get(e[0].id).get(e[0].meshUUID);if(null==u)throw"missing source material";if(u instanceof g){const a=new Set,s=new Map;for(const i of e){const e=t.get(i.id).get(i.meshUUID);if(null==e)throw"missing mat";for(const t of h){let i=e[t];i instanceof r.CompressedArrayTexture&&null!=i.userData.index&&(i=i.userData.index);const n=s.get(t);void 0!==n&&i!==n?a.add(t):s.set(t,i)}}for(const e of a){let t;const a=u[e];if("number"==typeof a)t=D(e);else if(a instanceof x)t=E(e);else if(a instanceof S||a instanceof n)t=C(e);else if(a instanceof A)t=P(e);else if(a instanceof r.CompressedArrayTexture)t=D(e+"_i");else if(a instanceof b)continue;p.set(e,t)}let i=q.uv;u instanceof lt&&null!=u.heightMap&&(i=ct(i,H(u.heightMap),F(u.heightScale)));let o=Nt(p.get("opacity"),B)??F(u.opacity??1);if(null!=u.alphaMap){let e;if(u.alphaMap instanceof r.CompressedArrayTexture){const t=J(u.alphaMap),a=Nt(p.get("alphaMap"),B)??F(u.alphaMap.userData.index??0);e=t.sample(K(i.x,i.y,a))}else e=H(u.alphaMap).sample(i);o=o.multiply(e.r)}let l=$(Nt(p.get("color"),Q)??u.color,o);if(null!=u.map){let e;if(u.map instanceof r.CompressedArrayTexture){const t=J(u.map),a=Nt(p.get("map"),B)??F(u.map.userData.index??0);e=t.sample(K(i.x,i.y,a))}else e=H(u.map).sample(i);l=l.multiply(e)}let c=$(Nt(p.get("emissive"),Q)??u.emissive,o);if(null!=u.emissiveMap){let e;if(u.emissiveMap instanceof r.CompressedArrayTexture){const t=J(u.emissiveMap),a=Nt(p.get("emissiveMap"),B)??F(u.emissiveMap.userData.index??0);e=t.sample(K(i.x,i.y,a))}else e=H(u.emissiveMap).sample(i);c=c.multiply(e)}const m=Nt(p.get("emissiveIntensity"),B)??F(u.emissiveIntensity??1),f=Nt(p.get("normalScale"),Z)??Y(u.normalScale??new A(1,1));let g=X.normal;if(null!=u.normalMap){let e;if(u.normalMap instanceof r.CompressedArrayTexture){const t=J(u.normalMap),a=Nt(p.get("normalMap"),B)??F(u.normalMap.userData.index??0);e=t.sample(K(i.x,i.y,a))}else e=H(u.normalMap).sample(i);g=k(e.rgb,f.x)}let y=Nt(p.get("roughness"),B)??F(u.roughness??1);if(null!=u.roughnessMap){let e;if(u.roughnessMap instanceof r.CompressedArrayTexture){const t=J(u.roughnessMap),a=Nt(p.get("roughnessMap"),B)??F(u.roughnessMap.userData.index??0);e=t.sample(K(i.x,i.y,a))}else e=H(u.roughnessMap).sample(i);y=y.multiply(e.g)}let w=Nt(p.get("metalness"),B)??F(u.metalness??0);if(null!=u.metalnessMap){let e;if(u.metalnessMap instanceof r.CompressedArrayTexture){const t=J(u.metalnessMap),a=Nt(p.get("metalnessMap"),B)??F(u.metalnessMap.userData.index??0);e=t.sample(K(i.x,i.y,a))}else e=H(u.metalnessMap).sample(i);w=w.multiply(e.b)}let M=F(1);if(null!=u.aoMap){let e;if(u.aoMap instanceof r.CompressedArrayTexture){const t=J(u.aoMap),a=Nt(p.get("aoMap"),B)??F(u.aoMap.userData.index??0);e=t.sample(K(i.x,i.y,a))}else e=H(u.aoMap).sample(i);M=M.multiply(e.r)}const v=Nt(p.get("aoMapIntensity"),B)??F(u.aoMapIntensity??0);let I=g;!0!==u.userData.disableAO&&(I=z("DOUBLE_SIDED",I,e=>L(new V("gl_FrontFacing"),e,e.multiplyScalar(-1))));const j=new _({color:R({color:l,roughness:y,metalness:w,ambientOcclusion:M,ambientOcclusionIntensity:v,emissive:c,emissiveIntensity:m,normal:I}),normal:g,roughness:y,opacity:o,emissive:c.rgb,transparent:u.transparent,alphaTest:u.alphaTest,envMap:u.envMap});null!=u.envMap&&(j.uniforms.envMapIntensity={value:u.envMapIntensity},j.uniforms.envMapRotation={value:$t(u.envMapRotation,u.envMap)}),j.envMap=u.envMap,j.side=u.side,d=j}else{d=u;for(const a of e){const e=t.get(a.id).get(a.meshUUID);if(e!=d){console.error(`Different materials in group for object ${a.id} and mesh uuid ${a.meshUUID}`,{objectMaterial:e,sourceMaterial:u});break}}}const f=new ot(l,o,i,d);for(const[e,t]of p.entries()){let a=1;t instanceof te||t instanceof Q?a=4:t instanceof Z&&(a=2),f.initUniform(e,a,0)}for(const[e,i]of s.entries()){const s=i[0].assetId,o=c.get(e);if(null==o){console.error(`Missing single asset mesh for mesh uuid ${e} and asset id ${s}`);continue}if(null==o.geometry){console.error("Missing geometry on mesh mesh");continue}const l=f.addGeometry(o.geometry),h=a.get(s);if(null==h){console.warn("Missing batching info when configuring for asset id "+s);continue}const d=De(h.assetMesh)?.uuid===e,m=h.assetMesh instanceof Ee&&d?h.assetMesh.collisionShapes:void 0,u=this.configureBatchedInstancedMesh(i,f,o,l,m);for(let e=0;e<u.length;e++){const a=i[e],s=u[e],o=t.get(a.id).get(a.meshUUID);for(let e of p.keys()){let t=o[e];if(t instanceof n&&(t=new S(t.r,t.g,t.b)),t instanceof r.CompressedArrayTexture)t=t.userData.index??0,e+="_i";else if(t instanceof b||null==t)continue;f.setUniformAt(e,s,t)}}}return f}async createInstancedMesh(e,t){const a=Pe(t,e=>!Ve(e)&&null!=e.geometry),s=await this.assetsService.getAsset(e[0].assetId);await this.applyMaterials(t,Dt(e[0].materialAssignments,s.materialAssignments)),a.updateMatrix();const i=a.geometry.clone(),n=a.material;let o;if(o=new r.InstancedMesh(i,n,e.length),this.configureBatchedInstancedMesh(e,o,a),a.material instanceof p&&o.castShadow&&o.receiveShadow&&Array.isArray(n))for(const e of n);return o}configureBatchedInstancedMesh(e,t,a,s,i){const n=[];for(let l=0;l<e.length;l++){let c=l;t instanceof r.BatchedMesh&&(c=t.addInstance(s)),n.push(c);const h=(new r.Matrix4).compose((new S).fromArray(e[l].position),(new M).setFromEuler((new o).fromArray(e[l].rotation)),(new S).fromArray(e[l].scale)),p=(new d).copy(e[l].parentTransform).multiply(h).multiply(a.matrixWorld);t.setMatrixAt(c,p),null==t.userData.hasCollision&&(t.userData.hasCollision=[]),t.userData.hasCollision[c]=!!e[l].collisionDetection,null!=i&&(null==t.userData.collisionShapes&&(t.userData.collisionShapes=[]),t.userData.collisionShapes[c]=i)}return n}remove(e){if(console.log("Remove scene object",e),"global_fog"==e.type)return void(this.scene.fog=this.originalFog);if("world_env"===e.type)this.resetWorldEnv(),this.worldEnvObj=null;else if("actor"==e.type||"vfx"===e.type){const t=this.materializedActors.get(e.id);null!=t?(t.disposed.next(!0),t.onEndPlay()):console.warn("Failed to remove actor",e)}else"prefab"===e.type&&this.materializedActors.forEach((t,a)=>{a.startsWith(e.id)&&(t.disposed.next(!0),t.onEndPlay()),this.materializedActors.delete(a)});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 je(this.scene,t=>t.userData.src?.assetId==e,e=>null!=e.userData.src)}applyMaterials(e,t){return null==t?Promise.resolve([]):Promise.all(t.filter(e=>"null"!==e.materialId).map(t=>this.applyMaterial(e,t)))}async applyMaterial(e,t){await applyMaterial(e,t,e=>{const t=this.assets.get(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)}},this._originalMaterials)}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(ne));je(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)})}updateShaders(e){this.shaders=e;for(const[e,t]of gt.entries())t.userData.customShaderName&&gt.delete(e);this.landscapeManagers.forEach(t=>t.updateShaders(e)),je(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=this.assets.get(e.material[t].userData.assetId);this.refreshMaterial(e,e.material[t],a,t)}}else{const t=e.material.userData?.customShaderName;if(null!=t){const t=this.assets.get(e.material.userData.assetId);this.refreshMaterial(e,e.material,t)}}})})}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 s=!1;if(t.traverseAncestors(e=>{"_hology_transform_group"===e.name&&(s=!0)}),!s){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){const a=this.assets.get(e.assetId);Dt(e.materialAssignments,a.materialAssignments).forEach(e=>this.applyMaterial(t,e))}else"shape_mesh"===e.type&&this.applyMaterials(t,e.materialAssignments);if(s||(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 n(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 n(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"directional"===e.light.type?this.applyDirectionalLight(e.light.directional,e):"ambient"===e.light.type&&this.applyDirectionalAmbientLight(t,e.light.ambient,e);else if("landscape"===e.shape){const a=this.landscapeManagers.find(t=>t.source.id===e.id).source.landscape.options.density!==e.landscape.options.density;if(this.inEditor&&a){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 c?"density":"linear")!==e.fog.type;this.scene.fog=St(e.fog),t&&(a=this.scene).traverse(e=>{if(e instanceof m){const t=e.material;t instanceof _&&(a.fog instanceof l?(t.uniforms.fogFar.value=a.fog.far,t.uniforms.fogNear.value=a.fog.near):a.fog instanceof c&&(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 rt){const a=await prepareClassParameters(e.actor.params,null,this.assetsService,this.assetManagerService,this.materializedActors,this.renderingView,[],this.actorProvider);return void Object.assign(t,a)}const a=this.editorActorParamSnapshot.get(e.id);null!=a&&a===JSON.stringify(e.actor)||s||(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 ke&&(t.geometry=a.geometry,t.collisionShape=a.collisionShape)}("asset_mesh"===e.type||"shape_mesh"===e.type&&"landscape"!==e.shape)&&ft(t,e.castShadow,e.receiveShadow),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;this.renderingView.renderer.shadowMap.needsUpdate=!0}async materializeAndInitActor(e,t=this.findParent(e)){const a=await this.materialize(e,t);return It(e,async e=>{if("actor"===e.type){const t=this.materializedActors.get(e.id);null!=t?await this.initActorsPostInit([t]):console.error(`Something went wrong when creating actor ${e.id}`)}}),a}findParent(e){const t=this.dataProvider.getObjects().flatMap(t=>t.id===e.id?null:Ie(t,t=>t.children?.some(t=>t.id===e.id),()=>!0))[0];return null==t?this.scene:null!=t?je(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 n(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=Se(e.vertexMaterials,e=>e.m);t.traverse(e=>{if(e instanceof m){if(null==e.geometry)return;if(Ot($e(e,0,!1)),a>0){Ot($e(e,0,!1))}}});const r=new Set;for(const[e,i]of s.entries()){const s=null!=e?t.getObjectByName(e):this.findMeshWithGeometry(t);let n=!1;if(null==s||null==s.geometry)return void console.warn(`Failed to apply vertex materials on mesh with name "${e}"`);const o=$e(s,0,!0);Ot(o);for(const e of i)o.setX(e.i,e.w[0]??0),o.setY(e.i,e.w[1]??0),o.setZ(e.i,e.w[2]??0),o.setW(e.i,e.w[3]??0),n=!0;if(a>0){const e=$e(s,4,!0);Ot(e);for(const t of i)e.setX(t.i,t.w[4]??0),e.setY(t.i,t.w[5]??0),e.setZ(t.i,t.w[6]??0),e.setW(t.i,t.w[7]??0),e.needsUpdate=!0,n=!0}n&&r.add(e)}this.inEditor&&this.landscapeManagers.filter(t=>t.source.id===e.id).forEach(e=>e.queueRefreshScatter(this.renderingView.camera.position,!0,e=>r.has(e.name)))}async materialize(e,t,a=!1,s){if(!this.shouldBeMaterialized(e))return;let r,n;switch(e.type){case"asset_mesh":r=await this.createFromAsset(e);break;case"shape_mesh":r=await this.createFromShape(e);break;case"light":r=await this.createLight(e);break;case"particles":r=await this.createParticleSystem(e),e.collisionDetection=!1;break;case"global_fog":this.scene.fog=St(e.fog),this.fixFogColor(),r=new h;break;case"sky":this.sky=Je(),this.updateSky(e),r=this.sky;break;case"world_env":this.updateWorldEnv(e),r=new h,this.worldEnvObj=r;break;case"actor":({object:r,actor:n}=await this.createFromActor(e,s));break;case"group":r=new h;break;case"prefab":r=await this.createFromPrefab(e,s);break;case"vfx":r=await this.createFromVfx(e,s);break;default:if(this.inEditor)throw new Error("unknown type "+e.type);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.`)}if(null!=r){if(e.name&&e.name.length>0&&(r.name=e.name),null!=e.position&&r.position.fromArray(e.position),null!=e.scale&&r.scale.fromArray(e.scale),null!=e.rotation&&r.rotation.fromArray(e.rotation),a?r.userData._src=e:r.userData.src=e,null!=n&&(r.userData.actor=n),this.inEditor,this.inEditor){let e=null;r instanceof ke&&(e=function(e){if(e instanceof Oe)return new m(new i(...e.offset.toArray()),xt);return null}(r.collisionShape)),null!=e&&(e.layers.disable(0),e.layers.enable(18),e.scale.multiplyScalar(1.1),r.add(e))}if(this.objectMap.set(r.uuid,e),this.sceneObjectMap.set(e.id,r),e.physics?.type!==oe.dynamic||null==t||this.inEditor?null==t?this.scene.add(r):t?.add(r):(t.add(r),r.getWorldPosition(r.position),r.getWorldQuaternion(r.quaternion),r.getWorldScale(r.scale),this.scene?.attach(r)),null!=e.children&&await Promise.all(e.children?.map(e=>this.materialize(e,r,a))),this.inEditor||"asset_mesh"!=e.type&&"shape_mesh"!==e.type||"landscape"===e.shape||null!=e.physics?.type&&e.physics.type==oe.dynamic||At(r),null!=this.renderingView)return this.renderingView.renderer.shadowMap.needsUpdate=!0,r;console.warn("RenderingView not found in materializer. No idea what called this")}}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),this.renderingView.aoPass.output=!0===e.worldEnv.ao.onlyAO?5:0;const t=e.worldEnv.toneMapping;null!=t&&(this.renderingView.renderer.toneMapping=t.mapping??0,this.renderingView.renderer.toneMappingExposure=t.exposure??1);const a=e.worldEnv.environment;null!=a&&null!=a.textureId?this.assetManagerService.getTexture(this.assets.get(a.textureId)).then(e=>{null==this.pmremGenerator&&(this.pmremGenerator=new r.PMREMGenerator(this.renderingView.renderer),this.pmremGenerator.compileEquirectangularShader()),this.pmremGeneratorResults.has(e)||this.pmremGeneratorResults.set(e,this.pmremGenerator.fromEquirectangular(e).texture);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.renderer.toneMapping=0,this.renderingView.renderer.toneMappingExposure=1}async updateSky(e){if(null==e?.sky?.materialId)return void(this.sky.material=qe);const t=await this.assetsService.getAsset(e.sky.materialId),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=r.BackSide,(e instanceof g||e instanceof r.MeshBasicMaterial||e instanceof r.ShaderMaterial)&&(e.fog=!1),e.depthTest=!1}async createComponent(e,t,a,s){const r=new pt[a.path+"/"+a.className],i=t.id+s;r.id=i,r.object=e;for(const e of a.params)null!=e.value&&(r[e.name]=e.value);return this.components.push(r),i}async createFromActor(e,t){const a=this.actorTypes.find(t=>t.name===e.actor?.type)?.type??ne[e.actor?.type];if(null==a)return{object:null,actor:null};this.inEditor&&this.editorActorParamSnapshot.set(e.id,JSON.stringify(e.actor));const s=await this.actorProvider.create(a,(new S).fromArray(e.position),(new o).fromArray(e.rotation),!0);return this.materializedActors.set(this.getNestedActorId(e.id,t),s),{object:s?.object,actor:s}}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(se,(new S).fromArray(e.position),(new o).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 g({name:"Default",color:new n("#aaaaaa"),visible:this.inEditor||!e.hidden,wireframe:!!t});const r=await this.createMeshByShape(e.shape,s,e.shapeParams);r.castShadow=e.castShadow??!0,r.receiveShadow=e.castShadow??!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=Be(e.landscape.options);this.applyHeightMaps(a,e.landscape.heightMaps,!0);const s=new Fe(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 ze(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(()=>Ne(r),50)}async createMeshByShape(e,t,a={}){if("landscape"!==e&&Ge.includes(e)){const s=await prepareShapeParameters(a??{}),r=e+JSON.stringify(a);if(!this.geometryCache.has(r)){const t=Re[e].geometry(s);t.computeTangents(),this.geometryCache.set(r,t)}this.collisionShapeCache.has(r)||this.collisionShapeCache.set(r,Re[e].collision(s));return new ke(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=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(Dt(e.materialAssignments,a.materialAssignments).map(e=>this.applyMaterial(s,e)))}catch(t){console.error("Failed to apply material"+t,e)}const r=e.receiveShadow??!!a.receiveShadow??!0,i=e.castShadow??!!a.castShadow??!1;return s.receiveShadow=r,ft(s,i,r),e.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}async createFromPrefab(e,t){const a=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}`);null==t&&(t={sceneObjectChain:[]}),t.sceneObjectChain.push(e.id);const{object:s}=await this.createFromPrefabAsset(a,t);return t.sceneObjectChain.pop(),s}async createFromPrefabAsset(e,t){const a=new h;await Promise.all(e.prefab.objects.filter(e=>"global_fog"!==e.type&&"world_env"!==e.type).map(e=>this.materialize(e,a,!0,structuredClone(t))));const s=t.sceneObjectChain.join("/"),r=Array.from(this.materializedActors.entries()).filter(([e,a])=>e.startsWith(s)&&e.split("/").length-1===t.sceneObjectChain.length).map(([,e])=>e);r.forEach(e=>{a.add(e.object)}),this.initActorsPostInit(r,structuredClone(t));const i=Array.from(this.materializedActors.entries()).filter(([e,t])=>e.startsWith(s)).map(([,e])=>e);return{object:a,actors:i}}async createParticleSystem(e){const t=await this.assetsService.getAsset(e.assetId),a=new y;return await I.fromJSONAsync(t.particleSystem,r).then(e=>{const t=new j(a,r);e.addRenderer(t),this.renderingView.onLoop(t=>e.update())}),a}async createLight(e){if("point"===e.light.type){const t=new w(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 r.TextureLoader).load("assets/light-bulb-icon.webp"),a=new r.SpriteMaterial({map:e,alphaTest:.5}),s=new it(a);s.scale.multiplyScalar(.6),t.add(s)}return t}if("spot"===e.light.type){const t=new r.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 y,t.target.position.set(0,-1,0),t.add(t.target),this.inEditor){const e=(new r.TextureLoader).load("assets/light-bulb-icon.webp"),a=new r.SpriteMaterial({map:e,alphaTest:.5}),s=new it(a);s.scale.multiplyScalar(.6),t.add(s),t.add(new r.SpotLightHelper(t))}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===He);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.updateSubscription.unsubscribe(),this.createAssetSubscription.unsubscribe(),this.materializedActors.forEach(e=>e.disposed.next(!0)),this.materializedActors.clear()}};ut=e([ae(),t("design:paramtypes",[v,Object,Object,Te,he,Array,Array,Object])],ut);export{ut as SceneMaterializer};function ft(e,t,a){e.castShadow=t,e.receiveShadow=a,e.traverse(e=>{e.castShadow=t,e.receiveShadow=a})}const gt=new Map,yt=new Map,wt=new u({color:16711935}),Mt=new Map;export async function materialFromAsset(e,t,a,s,r,i=!0){const n=JSON.stringify(e.material);return i&&gt.has(n)?gt.get(n):i&&yt.has(n)?await yt.get(n):yt.set(n,_materialFromAsset(n,e,t,a,s,r,i)).get(n)}export async function _materialFromAsset(e,t,a,s,i,o,l=!0){const c={opacity:t.material.params.opacity,map:null,emissive:t.material.params.emissive??null,metalness:t.material.params.metalness??0,flatShading:t.material.params.flatShading??!1,color:new n(t.material.params.color),transparent:null!=t.material.params.opacity&&t.material.params.opacity<1},h={};if(null!=t.material.params.map){const e=t.material.params.map,a=await s.getAsset(e);null!=a&&(c.map=await i.getTexture(a))}let p;switch(t.material.type){case"phong":p=new f({...c,...h});break;case"water":p=We(c,a);break;case"grassFoliage":p=_e({color:c.color,map:c.map},a);break;case"grass":p=Ue({...c,colorTwo:new n(t.material.params.colorTwo),colorThree:new n(t.material.params.colorThree)},a);break;case"standard":case"unlit":case"toon":case"layered":case"lambert":case"shader":case"landscape":case"landscape-composite":case"decal-unlit":case"decal-standard":const e={standard:dt?fe:we,lambert:fe,unlit:Me,toon:nt,layered:at,landscape:ye,"landscape-composite":ge,"decal-unlit":Ye,"decal-standard":Ze}[t.material.type]??o.find(e=>e.name==t.material.shader)?.type;if(e){try{let r=new e;const n=await prepareClassParameters(t.material?.shaderParams??{},e,s,i,null,a,o);Object.assign(r,n),p=r.build()}catch(e){console.log("Shader runtime error: "+e),Mt.has(t.material.shader)||Mt.set(t.material.shader,wt.clone()),p=Mt.get(t.material.shader)}p.userData.customShaderName=t.material.shader}else console.warn("Missing shader implementation with name "+t.material.shader),p=wt;break;default:throw new Error("Unsupported material type"+t.material.type)}return a?.csm.setupMaterial(p),null!=a&&gt.set(e,p),p.side=t.material.side??p.side??r.FrontSide,p.transparent=(t.material.transparent??c.transparent??!1)||p.transparent,p.alphaTest=t.material.alphaTest??p.alphaTest??0,null!=t.material.blending&&(p.blending=le[t.material.blending]??r.NormalBlending),t.material.bloom&&(p.userData.hasBloom=!0),t.material.reflective&&(p.userData.reflective=!0),!0===t.material.outlines&&(p.userData.outlineParameters={},null!=t.material.outlineParams&&(null!=t.material.outlineParams.color&&(p.userData.outlineParameters.color=new n(t.material.outlineParams.color).toArray()),null!=t.material.outlineParams.thickness&&(p.userData.outlineParameters.thickness=t.material.outlineParams.thickness))),p.userData.assetId=t.id,yt.delete(e),p}export async function prepareClassParameters(e,t,a,s,r,i,n,o){const l={};for(const[t,c]of Object.entries(e)){const e=await bt(t,c,a,s,r,i,n,o);null!=e&&(l[t]=e)}return l}export async function prepareShapeParameters(e){const t={};for(const[a,s]of Object.entries(e)){const e=await bt(a,s,null,null,null);null!=e&&(t[a]=e)}return t}const vt=new Map;async function bt(e,t,a,s,r,i,l,c,h=t.value,p=t.type){if(null==t||null==h||""===h)return null;switch(p){case Le.Array:if(Array.isArray(h)&&"element"in t)return await Promise.all(h.map(n=>bt(e,t,a,s,r,i,l,c,n,t.element)));break;case Le.Number:case Le.FloatNode:let p;if("string"==typeof h?p=parseFloat(h):"number"==typeof h&&(p=h),t.type===Le.FloatNode){if("object"==typeof h&&"a"in h&&"b"in h){const e=h;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=vt.get(e);return null==t&&(t=pe(Xe.decode(e)),vt.set(e,t)),t}(e.easing),r=s.sample(de(me.energy));return N(F(t),F(a),r)}return F(p)}return p;case Le.Texture:let d=await s.getTexture(await a.getAsset(h));return"envmap"===e.toLowerCase()&&null!=i&&(d=i.getEnvTexture(d)),d;case Le.Sampler2DNode:return H(await s.getTexture(await a.getAsset(h)));case Le.Boolean:return h;case Le.BooleanNode:return T(h);case Le.Vector2:case Le.Vec2Node:if("object"==typeof h){const e=h instanceof Array?(new A).fromArray(h):new A(h.x,h.y);return t.type===Le.Vec2Node?Y(e):e}return null;case Le.Vector3:case Le.Vec3Node:if("object"==typeof h){const e=h instanceof Array?(new S).fromArray(h):new S(h.x,h.y,h.z);return t.type===Le.Vec3Node?K(e):e}return null;case Le.Color:case Le.RgbNode:const m=new n(h);return t.type===Le.RgbNode?U(m):m;case Le.String:return h;case Le.BaseActor:const u=h;return null==r&&console.warn("Class parameters can not be prepared as actors are not passed in"),r?.get(u);case Le.Euler:const f=h;return(new o).fromArray(f);case Le.Object3D:return(await s.getMesh(await a.getAsset(h))).scene;case Le.Material:return await materialFromAsset(await a.getAsset(h),i,a,s,l);case Le.AudioBuffer:return await s.getAudio(await a.getAsset(h));case Le.VisualEffect:const g=await a.getAsset(h);if(null==c){console.error("Can not create instance of visual effect because missing actor provider");break}if("vfx"in g)return new re(c,g);console.error("Using a non-vfx asset for visual effect parameter");break;case Le.Curve:return Xe.decode(h);case Le.ColorLayer:case Le.MaskLayer:if(st(h)){const e=await Ke.decode(h,async e=>await s.getTexture(await a.getAsset(e))),t=await prepareClassParameters(h.params,null,a,s);return Object.assign(e,t),e}return console.warn("Expecting color layer but got",h),null}return null}function At(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 St(e){return"linear"===e.type?new l(new n(e.color),e.near??100,e.far??1e3):"density"===e.type?new c(e.color,e.density):void console.warn("Invalid fog type",e)}const xt=new g({color:4229780});async function It(e,t,a,s){null==s&&(s=(new d).identity());const i=s.clone().multiply(jt(e,new r.Matrix4));if(null!=e.children&&e.children.length>0)for(let a=e.children.length-1;a>=0;a--)await It(e.children[a],t,e,i);await t(e,a,s)}function jt(e,t){return null==e.position||null==e.rotation||null==e.scale?t.identity():t.compose((new S).fromArray(e.position),(new M).setFromEuler((new o).fromArray(e.rotation)),(new S).fromArray(e.scale))}export function toSerializedParamType(e){const t=e.constructor.prototype;return t instanceof Number||e===Number?Le.Number:t instanceof B||"function"==typeof e.prototype.isFloat?Le.FloatNode:t instanceof b||e===b||e.isTexture?Le.Texture:t instanceof ue||e===G?Le.Sampler2DNode:t instanceof Boolean||e===Boolean?Le.Boolean:t instanceof O?Le.BooleanNode:t instanceof n||e==n?Le.Color:t instanceof W||"function"==typeof e.prototype.isRgb?Le.RgbNode:t instanceof A||e==A?Le.Vector2:t instanceof Z||"function"==typeof e.prototype.isVec2?Le.Vec2Node:t instanceof S||e==S?Le.Vector3:t instanceof Q||"function"==typeof e.prototype.isVec3?Le.Vec3Node:t instanceof String||e===String?Le.String:t instanceof ie||e==ie||e.prototype instanceof ie||e.prototype==ie?Le.BaseActor:t instanceof o||e==o?Le.Euler:t instanceof y||e==y?Le.Object3D:t instanceof p||e==p?Le.Material:t instanceof AudioBuffer||e==AudioBuffer?Le.AudioBuffer:t instanceof re||e==re?Le.VisualEffect:t instanceof Xe||e==Xe?Le.Curve:t instanceof Ke||e==Ke?Le.ColorLayer:t instanceof tt||e==tt?Le.MaskLayer:void console.warn("Failed to map parameter type to serialized version",{type:e})}export function prepareCustomParams(e,t,a={}){return Object.fromEntries(e.map(e=>[e.name,{type:e.options.array?Le.Array:toSerializedParamType(e.type),...e.options.array?{element:toSerializedParamType(e.type)}:{},value:t[e.name]?.value??(!0!==e.options.array?a[e.name]??customParameterDefaultValueByType.get(toSerializedParamType(e.type)):[])}]))}export function prepareCustomParamsFromType(e,t,a=null){const s=ve(e);if(0===s.length)return{};let r;null!=a?ce(a,()=>{r=a.get(e)}):r=new e;const i={};for(const e of s){const t=r[e.name];if(null!=t&&!0!==e.options.array){const a=serializeCustomParameter(e.type,t);null!=a&&(i[e.name]=a)}}return prepareCustomParams(s,t,i)}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 A:return t instanceof A?t.toArray():void a();case S:return t instanceof S?t.toArray():void a();case x:return t instanceof x?t.toArray():void a();case n:return t instanceof n?"#"+t.getHexString():"string"==typeof t?t:"number"==typeof t?"#"+new n(t).getHexString():void a();case String:return t;case o:return t instanceof o?t.toArray():void a()}}function Dt(e,t){return function(e,t,a){const s=[],r=new Set;for(const i of[...e??[],...t??[]]){const e=a(i);r.has(e)||(r.add(e),s.push(i))}return s}((e??[]).filter(e=>Pt(e.materialId)),(t??[]).filter(e=>Pt(e.materialId)),e=>e.color+e.name)}function Pt(e){return"null"!=e&&null!=e}export const customParameterDefaultValueByType=new Map([[Le.RgbNode,"#000000"],[Le.Color,"#000000"],[Le.Vector4,[0,0,0,0]],[Le.Vec4Node,[0,0,0,0]],[Le.Vector3,[0,0,0]],[Le.Vec3Node,[0,0,0]],[Le.Vector2,[0,0]],[Le.Vec2Node,[0,0]],[Le.Euler,[0,0,0,"XYZ"]],[Le.Array,[]],[Le.ColorLayer,Qe],[Le.MaskLayer,et]]);let Ct=new n,Et=new n;function Tt(e,t){return Ct.set(e),Et.set(t),Ct.getHexString()==Et.getHexString()}export function applyMaterial(e,t,a,s){const i=[];return e.traverse(async e=>{if(e instanceof m||e.isMesh||e instanceof r.SkinnedMesh||e.isSkinnedMesh)for(const t of xe(e.material))t.hasOwnProperty("color")&&i.push(e)}),Promise.all(i.map(async e=>{if(e.material instanceof Array)for(let r=0;r<e.material.length;r++){const i=e.material[r];if(null==i.color||!(i.color instanceof n))continue;const o="#"+i.color.getHexString(),l=i.name;if(o===t.color&&(i.name===t.name||null==t.name)||e.userData["originalColor_"+r]===t.color&&e.userData["originalMaterialName_"+r]===t.name){const i=await a(t.materialId),n=e.material[r];null!=i&&n.id!=i.id&&(e.material[r]=i,e.userData["originalColor_"+r]=e.userData["originalColor_"+r]??o,e.userData["originalMaterialName_"+r]=e.userData["originalMaterialName_"+r]??l,null!=s&&s.set(e.id+"#"+r,n))}}else if("color"in e.material){const r="#"+e.material.color.getHexString(),i=e.material.name;if(r===t.color&&(e.material.name===t.name||null==t.name)||e.userData.originalColor===t.color&&e.userData.originalName===t.name){const n=await a(t.materialId),o=e.material;null!=n&&(e.material=n,e.userData.originalColor=e.userData.originalColor??r,e.userData.originalMaterialName=e.userData.originalMaterialName??i,null!=s&&(s.has(e.id)||s.set(e.id,o)))}}}))}function Vt(e,t){if(e instanceof r.ShaderMaterial&&t instanceof r.ShaderMaterial){return e.fragmentShader+e.vertexShader==t.fragmentShader+t.vertexShader&&function(e,t){if(e instanceof r.ShaderMaterial&&t instanceof r.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 Ot(e){if(null!=e){for(let t=0;t<e.array.length;t++)e.setX(t,0);e.needsUpdate=!0}}const kt=new WeakMap;function Ft(e){let t=kt.get(e);return null==t&&(t=function(e){const t=De(e);if(null==t)return"";return Object.keys(t.geometry.attributes).sort().join(",")}(e),kt.set(e,t)),t}const Bt=new WeakMap;function zt(e){let t=Bt.get(e);return null==t&&(t=function(e){let t=e.type;e instanceof r.MeshStandardMaterial||(t+=e.id+"");(e instanceof r.MeshBasicMaterial||e instanceof r.MeshLambertMaterial||e instanceof g||e instanceof f)&&(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 g&&(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 u||e instanceof f)&&null!=e.specularMap&&(t+="s"+e.specularMap?.id);e instanceof r.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 lt&&null!=e.heightMap&&(t+="h"+e.heightMap?.id);if(e instanceof r.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.depthWrite?"dw":"",t+=e.depthTest?"dt":"",t+=e.alphaTest,t}(e),Bt.set(e,t)),t}function Nt(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 _t=new d,Ut=new o;function $t(e,t){return Ut.copy(e),Ut.x*=-1,Ut.y*=-1,Ut.z*=-1,t.isCubeTexture&&!1===t.isRenderTargetTexture&&(Ut.y*=-1,Ut.z*=-1),(new r.Matrix3).setFromMatrix4(_t.makeRotationFromEuler(Ut))}/*
2
2
  * Copyright (©) 2025 Hology Interactive AB. All rights reserved.
3
3
  * See the LICENSE.md file for details.
4
4
  */
@@ -18,5 +18,13 @@ export declare function calculateEffectiveScale(obj: Object3D): Vector3;
18
18
  * objects that you know are not relevant.
19
19
  */
20
20
  export declare function traverseVisibleStop(object: Object3D, fn: (o: Object3D) => false | void | undefined): any;
21
+ /**
22
+ * Check that every visible object (including the root itself if visible) returns true for the predicate function.
23
+ * Only visible objects are checked - if the root object is not visible, no objects are checked and true is returned.
24
+ * @param object
25
+ * @param predicate
26
+ */
27
+ export declare function traverseVisibleEvery(object: Object3D, predicate: (o: Object3D) => boolean): boolean;
28
+ export declare function traverseAsync(object: Object3D, fn: (o: Object3D) => Promise<void>): Promise<void>;
21
29
  export {};
22
30
  //# sourceMappingURL=traverse.d.ts.map
@@ -1,4 +1,4 @@
1
- import{Mesh as e,Scene as n,Vector3 as t}from"three";import{isCollisionMesh as r}from"../../scene/collision/collision-shape-import.js";export function filterScene(e,n){const t=[];return e.traverse(e=>{n(e)&&t.push(e)}),t}export function findFirstVisibleObject(e,n){const t=[e];for(;t.length>0;){const e=t.pop();if(n(e))return e;e.visible&&null!=e.children&&t.push(...e.children)}return null}export function findFirstVisibleMesh(n){return findFirstVisibleObject(n,n=>!r(n)&&n instanceof e&&null!=n.geometry)}export function filterSceneShallow(e,n,t){return filterChildrenShallow(e,n,t)}export function filterChildrenShallow(e,t,r){const l=[],i=[e];for(;i.length>0;){const e=i.pop();t(e)?l.push(e):(null==r||r(e)||e instanceof n)&&null!=e.children&&i.push(...e.children)}return l}const l=new t;export function calculateEffectiveScale(e){return l.copy(e.scale),e.traverseAncestors(e=>{l.multiply(e.scale)}),l}export function traverseVisibleStop(e,n){const t=[e];for(;t.length>0;){const e=t.pop();e.visible&&!1!==n(e)&&null!=e.children&&t.push(...e.children)}return null}/*
1
+ import{Mesh as e,Scene as t,Vector3 as n}from"three";import{isCollisionMesh as r}from"../../scene/collision/collision-shape-import.js";import{traverseVisibleGenerator as i}from"three/examples/jsm/utils/SceneUtils.js";export function filterScene(e,t){const n=[];return e.traverse(e=>{t(e)&&n.push(e)}),n}export function findFirstVisibleObject(e,t){const n=[e];for(;n.length>0;){const e=n.pop();if(t(e))return e;e.visible&&null!=e.children&&n.push(...e.children)}return null}export function findFirstVisibleMesh(t){return findFirstVisibleObject(t,t=>!r(t)&&t instanceof e&&null!=t.geometry)}export function filterSceneShallow(e,t,n){return filterChildrenShallow(e,t,n)}export function filterChildrenShallow(e,n,r){const i=[],l=[e];for(;l.length>0;){const e=l.pop();n(e)?i.push(e):(null==r||r(e)||e instanceof t)&&null!=e.children&&l.push(...e.children)}return i}const l=new n;export function calculateEffectiveScale(e){return l.copy(e.scale),e.traverseAncestors(e=>{l.multiply(e.scale)}),l}export function traverseVisibleStop(e,t){const n=[e];for(;n.length>0;){const e=n.pop();e.visible&&!1!==t(e)&&null!=e.children&&n.push(...e.children)}return null}export function traverseVisibleEvery(e,t){let n=!0;return traverseVisibleStop(e,e=>{if(n=n&&t(e),!n)return!1}),n}export async function traverseAsync(e,t){for(const n of i(e))await t(n)}/*
2
2
  * Copyright (©) 2025 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.157",
3
+ "version": "0.0.159",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",
@@ -174,7 +174,7 @@
174
174
  "recast-navigation": "0.39.0",
175
175
  "rxjs": "7.8.1",
176
176
  "three-mesh-bvh": "^0.7.5",
177
- "three-shader-graph": "^0.2.24",
177
+ "three-shader-graph": "^0.2.25",
178
178
  "three-stdlib": "2.34.0",
179
179
  "ts-key-enum": "^2.0.12",
180
180
  "typedi": "^0.10.0"