@hology/core 0.0.233 → 0.0.235

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 (150) hide show
  1. package/dist/csm.d.ts +2 -2
  2. package/dist/data/surface-definition.js +1 -1
  3. package/dist/effects/sequence/sequence-action.d.ts +4 -4
  4. package/dist/effects/sequence/sequence-animation-retiming.d.ts +1 -1
  5. package/dist/effects/sequence/sequence-data.d.ts +3 -2
  6. package/dist/effects/sequence/sequence-definitions.d.ts +2 -2
  7. package/dist/effects/sequence/sequence-event.d.ts +1 -1
  8. package/dist/effects/sequence/sequence-locator.d.ts +1 -1
  9. package/dist/effects/sequence/sequence-ops.d.ts +1 -1
  10. package/dist/effects/sequence/sequence-player.d.ts +8 -7
  11. package/dist/effects/sequence/sequence-transform.d.ts +1 -1
  12. package/dist/effects/sequence/sequence-value-lane.d.ts +2 -2
  13. package/dist/effects/vfx/behaviours.d.ts +2 -1
  14. package/dist/effects/vfx/initializsers.d.ts +2 -1
  15. package/dist/effects/vfx/rates.d.ts +1 -1
  16. package/dist/effects/vfx/trail-renderer.d.ts +1 -1
  17. package/dist/effects/vfx/vfx-asset.d.ts +4 -3
  18. package/dist/effects/vfx/vfx-binding-runtime.d.ts +2 -2
  19. package/dist/effects/vfx/vfx-collision-behaviour.d.ts +3 -2
  20. package/dist/effects/vfx/vfx-defs.d.ts +5 -3
  21. package/dist/effects/vfx/vfx-input-runtime.d.ts +1 -1
  22. package/dist/effects/vfx/vfx-materializer.d.ts +7 -7
  23. package/dist/effects/vfx/vfx-param.d.ts +3 -3
  24. package/dist/effects/vfx/vfx-renderers.d.ts +4 -3
  25. package/dist/effects/vfx/vfx-renderers.js +1 -1
  26. package/dist/effects/vfx/vfx-service.d.ts +1 -1
  27. package/dist/effects/vfx/vfx-service.js +1 -1
  28. package/dist/game-component/game-component.d.ts +1 -1
  29. package/dist/gameplay/actors/builtin/components/character/character-movement.js +1 -1
  30. package/dist/gameplay/actors/builtin/components/editor-sprite-component.d.ts +1 -1
  31. package/dist/gameplay/actors/builtin/components/editor-sprite-component.js +1 -1
  32. package/dist/gameplay/actors/builtin/components/volume-editor-component.d.ts +1 -1
  33. package/dist/gameplay/actors/builtin/components/volume-editor-component.js +1 -1
  34. package/dist/gameplay/actors/builtin/navmesh-actor.d.ts +1 -1
  35. package/dist/gameplay/actors/builtin/navmesh-actor.js +1 -1
  36. package/dist/gameplay/actors/builtin/post-process-volume-actor.d.ts +1 -1
  37. package/dist/gameplay/actors/builtin/post-process-volume-actor.js +1 -1
  38. package/dist/gameplay/actors/component.d.ts +2 -2
  39. package/dist/gameplay/actors/controller/actor-controller.d.ts +1 -1
  40. package/dist/gameplay/actors/controller/actor-controller.js +1 -1
  41. package/dist/gameplay/actors/internal/component-init.d.ts +1 -1
  42. package/dist/gameplay/actors/internal/container-map.d.ts +2 -2
  43. package/dist/gameplay/ai/behavior-tree/move.d.ts +3 -3
  44. package/dist/gameplay/ai/behavior-tree/move.js +1 -1
  45. package/dist/gameplay/ai/build-tile.d.ts +2 -1
  46. package/dist/gameplay/ai/dynamic-tiled-navmesh.d.ts +4 -3
  47. package/dist/gameplay/ai/navigation.js +1 -1
  48. package/dist/gameplay/animation/anim-sm.d.ts +1 -1
  49. package/dist/gameplay/animation/retarget.d.ts +2 -1
  50. package/dist/gameplay/animation/root-motion.d.ts +2 -1
  51. package/dist/gameplay/event-graph/runtime-assets.d.ts +1 -1
  52. package/dist/gameplay/initiate.d.ts +5 -5
  53. package/dist/gameplay/inject.d.ts +1 -1
  54. package/dist/gameplay/net/browser/index.d.ts +3 -2
  55. package/dist/gameplay/net/browser/index.js +1 -1
  56. package/dist/gameplay/net/net-session.d.ts +2 -2
  57. package/dist/gameplay/services/asset-loader.js +1 -1
  58. package/dist/gameplay/services/game-time-scheduler.d.ts +1 -1
  59. package/dist/gameplay/services/physics/abstract-physics-system.d.ts +7 -7
  60. package/dist/gameplay/services/pointer-events.d.ts +2 -2
  61. package/dist/gameplay/services/pointer-events.js +1 -1
  62. package/dist/gameplay/services/world.d.ts +1 -1
  63. package/dist/gameplay/services/world.js +1 -1
  64. package/dist/index.d.ts +3 -3
  65. package/dist/index.js +1 -1
  66. package/dist/rendering/cluster-generator.d.ts +2 -1
  67. package/dist/rendering/fog/fog-volume-actor.d.ts +1 -1
  68. package/dist/rendering/fog/fog-volume-actor.js +1 -1
  69. package/dist/rendering/fog/fog-volume-object.d.ts +2 -1
  70. package/dist/rendering/fog/volumetric-fog-pass.d.ts +4 -2
  71. package/dist/rendering/fog/volumetric-fog-pass.js +1 -1
  72. package/dist/rendering/light-probes/light-volume-capture.d.ts +2 -1
  73. package/dist/rendering/motion-vector-node.d.ts +8 -0
  74. package/dist/rendering/motion-vector-node.js +4 -0
  75. package/dist/rendering/node-material-webgpu-resolver.d.ts +2 -1
  76. package/dist/rendering/post-process-effect.d.ts +1 -1
  77. package/dist/rendering/webgpu-experimental-backend.d.ts +23 -3
  78. package/dist/rendering/webgpu-experimental-backend.js +1 -1
  79. package/dist/rendering.d.ts +14 -2
  80. package/dist/rendering.js +1 -1
  81. package/dist/scene/asset-resource-loader.d.ts +5 -4
  82. package/dist/scene/assets-provider.d.ts +2 -2
  83. package/dist/scene/batched-mesh-2.d.ts +1 -1
  84. package/dist/scene/bootstrap.d.ts +8 -7
  85. package/dist/scene/collision/collision-shape-import.d.ts +3 -3
  86. package/dist/scene/collision/collision-shape.d.ts +2 -1
  87. package/dist/scene/custom-param-deserialize.d.ts +1 -1
  88. package/dist/scene/custom-param-runtime-types.d.ts +2 -1
  89. package/dist/scene/landscape/landscape-manager.d.ts +6 -6
  90. package/dist/scene/landscape/landscape-manager.js +1 -1
  91. package/dist/scene/landscape/utils.d.ts +2 -2
  92. package/dist/scene/materializer.js +1 -1
  93. package/dist/scene/materials/grass-foliage.d.ts +2 -2
  94. package/dist/scene/materials/grass.d.ts +1 -1
  95. package/dist/scene/materials/utils/material-painting.d.ts +2 -1
  96. package/dist/scene/materials/water.d.ts +1 -1
  97. package/dist/scene/model.d.ts +1 -1
  98. package/dist/scene/objects/prefab.d.ts +3 -3
  99. package/dist/scene/objects/shapes.d.ts +4 -2
  100. package/dist/scene/runtime-asset-service.d.ts +2 -2
  101. package/dist/scene/runtime-backend-service.d.ts +2 -2
  102. package/dist/scene/runtime-bundled-backend-service.d.ts +3 -3
  103. package/dist/scene/scatter/painted-scatter-manager.d.ts +1 -1
  104. package/dist/scene/scatter/surface-scatter-manager.d.ts +4 -4
  105. package/dist/scene/scene-data-service.d.ts +1 -1
  106. package/dist/scene/surface-query.d.ts +2 -2
  107. package/dist/scene/surface-query.js +1 -1
  108. package/dist/shader/builtin/decal-unlit-shader.js +1 -1
  109. package/dist/shader/builtin/index.d.ts +1 -1
  110. package/dist/shader/decal-shader.d.ts +3 -2
  111. package/dist/shader/graph/compiler.d.ts +1 -1
  112. package/dist/shader/parameter.d.ts +8 -8
  113. package/dist/shader/post-process-shader.d.ts +2 -1
  114. package/dist/shader/shader.d.ts +6 -5
  115. package/dist/shader/trail-shader.d.ts +3 -2
  116. package/dist/shader/trail-shader.js +1 -1
  117. package/dist/shader/uv-nodes.d.ts +2 -2
  118. package/dist/shader-nodes/bulge.d.ts +1 -1
  119. package/dist/shader-nodes/curve-sample.d.ts +2 -2
  120. package/dist/shader-nodes/depth.d.ts +3 -3
  121. package/dist/shader-nodes/dither.d.ts +1 -1
  122. package/dist/shader-nodes/effects.d.ts +1 -1
  123. package/dist/shader-nodes/glsl-node.d.ts +1 -1
  124. package/dist/shader-nodes/glsl-node.js +1 -1
  125. package/dist/shader-nodes/gradient-sample.d.ts +1 -1
  126. package/dist/shader-nodes/landscape.d.ts +1 -1
  127. package/dist/shader-nodes/layers.d.ts +1 -1
  128. package/dist/shader-nodes/material-flags.d.ts +1 -1
  129. package/dist/shader-nodes/material-flags.js +1 -1
  130. package/dist/shader-nodes/particle.d.ts +1 -1
  131. package/dist/shader-nodes/particle.js +1 -1
  132. package/dist/shader-nodes/pom.d.ts +2 -1
  133. package/dist/shader-nodes/pom.js +1 -1
  134. package/dist/shader-nodes/scene-sample.d.ts +2 -1
  135. package/dist/shader-nodes/shapes.d.ts +1 -1
  136. package/dist/shader-nodes/texture-sequence.d.ts +1 -1
  137. package/dist/shader-nodes/time.d.ts +1 -1
  138. package/dist/shader-nodes/voronoi.d.ts +1 -1
  139. package/dist/shader-nodes/wgsl-node.d.ts +1 -1
  140. package/dist/shader-nodes/wgsl-node.js +1 -1
  141. package/dist/test/parameter-definition.test.js +1 -1
  142. package/dist/utils/materials.d.ts +1 -1
  143. package/dist/utils/mesh.d.ts +1 -1
  144. package/dist/utils/obb-utils.d.ts +2 -1
  145. package/dist/utils/three/cleanup.d.ts +1 -1
  146. package/dist/utils/three/depth-pass.d.ts +1 -1
  147. package/dist/utils/three/traverse.d.ts +2 -1
  148. package/dist/worker/index.js +1 -1
  149. package/package.json +2 -1
  150. package/tsconfig.tsbuildinfo +1 -1
@@ -1,6 +1,6 @@
1
1
  import { NodeShaderMaterial } from '../../shader-nodes/index.js';
2
- import { Color, Texture } from 'three';
3
- import { RenderingView } from '../../rendering.js';
2
+ import type { Color, Texture } from 'three';
3
+ import type { RenderingView } from '../../rendering.js';
4
4
  export interface GrassFoliageMaterialParameters {
5
5
  map: Texture;
6
6
  color: Color;
@@ -1,5 +1,5 @@
1
1
  import * as THREE from 'three';
2
- import { RenderingView } from '../../rendering.js';
2
+ import type { RenderingView } from '../../rendering.js';
3
3
  export declare function createGrassMaterial(params: any, renderingView: RenderingView): THREE.MeshStandardMaterial;
4
4
  export declare function createGrassMaterialOld(params: any, renderingView: RenderingView): THREE.ShaderMaterial;
5
5
  //# sourceMappingURL=grass.d.ts.map
@@ -1,3 +1,4 @@
1
- import { Mesh, BufferAttribute } from "three";
1
+ import type { Mesh } from "three";
2
+ import { BufferAttribute } from "three";
2
3
  export declare function getMaterialAttribute(mesh: Mesh, index: number, recreate?: boolean): BufferAttribute;
3
4
  //# sourceMappingURL=material-painting.d.ts.map
@@ -1,4 +1,4 @@
1
1
  import * as THREE from 'three';
2
- import { RenderingView } from '../../rendering.js';
2
+ import type { RenderingView } from '../../rendering.js';
3
3
  export declare function createWaterMaterial(params: any, renderingView: RenderingView): THREE.ShaderMaterial;
4
4
  //# sourceMappingURL=water.d.ts.map
@@ -1,4 +1,4 @@
1
- import { EulerOrder, Side } from 'three';
1
+ import type { EulerOrder, Side } from 'three';
2
2
  import type { SequenceData } from '../effects/sequence/sequence-data.js';
3
3
  import type { BlendingMode, VfxAssetData } from '../effects/vfx/vfx-asset.js';
4
4
  import type { ShaderGraphDocument, ShaderGraphMaterialReference } from '../shader/graph/model.js';
@@ -1,6 +1,6 @@
1
- import { Object3D } from "three";
2
- import { BaseActor } from "../../gameplay/actors/actor.js";
3
- import { Asset } from "../model";
1
+ import type { Object3D } from "three";
2
+ import type { BaseActor } from "../../gameplay/actors/actor.js";
3
+ import type { Asset } from "../model.js";
4
4
  export declare class Prefab {
5
5
  asset: Asset;
6
6
  }
@@ -1,5 +1,7 @@
1
- import { BoxCollisionShape, CapsuleCollisionShape, CollisionShape, ConeCollisionShape, ConvexPolyhedronCollisionShape, CylinderCollisionShape, PlaneCollisionShape, SphereCollisionShape, TrimeshCollisionShape } from '../collision/collision-shape.js';
2
- import { BoxGeometry, PlaneGeometry, BufferGeometry, CylinderGeometry, SphereGeometry, TorusGeometry, ConeGeometry, CircleGeometry, CapsuleGeometry, Vector2, Color } from "three";
1
+ import type { CollisionShape } from '../collision/collision-shape.js';
2
+ import { BoxCollisionShape, CapsuleCollisionShape, ConeCollisionShape, ConvexPolyhedronCollisionShape, CylinderCollisionShape, PlaneCollisionShape, SphereCollisionShape, TrimeshCollisionShape } from '../collision/collision-shape.js';
3
+ import type { BufferGeometry, Vector2, Color } from "three";
4
+ import { BoxGeometry, PlaneGeometry, CylinderGeometry, SphereGeometry, TorusGeometry, ConeGeometry, CircleGeometry, CapsuleGeometry } from "three";
3
5
  import { TextGeometry } from 'three/examples/jsm/geometries/TextGeometry.js';
4
6
  type AVec3 = [number, number, number];
5
7
  type ShapeParameterDef<T = boolean | number | string | Vector2 | AVec3 | Color> = {
@@ -1,7 +1,7 @@
1
1
  import { AssetsProvider } from '../scene/assets-provider.js';
2
2
  import { Subject } from 'rxjs';
3
- import { Asset } from '../scene/model.js';
4
- import { RuntimeBackendService } from './runtime-backend-service.js';
3
+ import type { Asset } from '../scene/model.js';
4
+ import type { RuntimeBackendService } from './runtime-backend-service.js';
5
5
  export declare class RuntimeAssetsService extends AssetsProvider {
6
6
  private backend;
7
7
  private assets;
@@ -1,5 +1,5 @@
1
- import { SceneObject } from './materializer.js';
2
- import { Asset, SceneData } from './model.js';
1
+ import type { SceneObject } from './materializer.js';
2
+ import type { Asset, SceneData } from './model.js';
3
3
  export interface RuntimeBackendService {
4
4
  getAssets(): Promise<Asset[]>;
5
5
  getAsset(id: string): Promise<Asset>;
@@ -1,6 +1,6 @@
1
- import { SceneObject } from './materializer.js';
2
- import { Asset, SceneData } from './model.js';
3
- import { RuntimeBackendService } from './runtime-backend-service.js';
1
+ import type { SceneObject } from './materializer.js';
2
+ import type { Asset, SceneData } from './model.js';
3
+ import type { RuntimeBackendService } from './runtime-backend-service.js';
4
4
  export declare class RuntimeBundledBackendService implements RuntimeBackendService {
5
5
  private assets;
6
6
  private scenes;
@@ -2,7 +2,7 @@ import type { RenderingView } from '../../rendering.js';
2
2
  import type { AssetResourceLoader } from '../asset-resource-loader.js';
3
3
  import type { AssetsProvider } from '../assets-provider.js';
4
4
  import type { SceneDataProvider } from '../materializer.js';
5
- import { Scene } from 'three';
5
+ import type { Scene } from 'three';
6
6
  export declare class PaintedScatterManager {
7
7
  private scene;
8
8
  private dataProvider;
@@ -1,8 +1,8 @@
1
- import { RenderingView } from '../../rendering.js';
2
- import { AssetResourceLoader } from '../asset-resource-loader.js';
3
- import { AssetsProvider } from '../assets-provider.js';
1
+ import type { RenderingView } from '../../rendering.js';
2
+ import type { AssetResourceLoader } from '../asset-resource-loader.js';
3
+ import type { AssetsProvider } from '../assets-provider.js';
4
4
  import type { SceneDataProvider } from '../materializer.js';
5
- import { Scene } from 'three';
5
+ import type { Scene } from 'three';
6
6
  export declare class SurfaceScatterManager {
7
7
  private scene;
8
8
  private dataProvider;
@@ -1,4 +1,4 @@
1
- import { SceneDataProvider, SceneObject, ChangeCallback } from '../scene/materializer.js';
1
+ import type { SceneDataProvider, SceneObject, ChangeCallback } from '../scene/materializer.js';
2
2
  import { BehaviorSubject } from 'rxjs';
3
3
  import { Matrix4 } from 'three';
4
4
  export declare class SceneDataService implements SceneDataProvider {
@@ -1,4 +1,4 @@
1
- import type { BaseSurfaceDefinition } from "../data/surface-definition";
2
- import { Intersection } from "three";
1
+ import type { BaseSurfaceDefinition } from "../data/surface-definition.js";
2
+ import type { Intersection } from "three";
3
3
  export declare function findSurfaceDefinition(intersection: Intersection): BaseSurfaceDefinition | null;
4
4
  //# sourceMappingURL=surface-query.d.ts.map
@@ -1,4 +1,4 @@
1
- import{Mesh as t,Vector3 as e}from"three";import{BatchedMesh2 as r}from"./batched-mesh-2";export function findSurfaceDefinition(e){const u=e.object;if(null==u||!(u instanceof t)||null==u.material)return;const o=Array.isArray(u.material)?u.material[e.face.materialIndex]:u.material;if(null==o)return null;if(u instanceof r){const t=u.surfaceByInstance?.[e.batchId];if(null!=t)return t}let l;return l=function(t,e,r){if(null==t.userData.surfaceByLayer||!e.hasAttribute("material"))return null;const u=function(t,e){const r=t.object,u=e.getAttribute("position"),o=e.index,l=t.faceIndex,f=o?o.getX(3*l+0):3*l+0,c=o?o.getX(3*l+1):3*l+1,s=o?o.getX(3*l+2):3*l+2;n.fromBufferAttribute(u,f).applyMatrix4(r.matrixWorld),a.fromBufferAttribute(u,c).applyMatrix4(r.matrixWorld),i.fromBufferAttribute(u,s).applyMatrix4(r.matrixWorld);const m=t.point,d=m.distanceToSquared(n),p=m.distanceToSquared(a),b=m.distanceToSquared(i),y=d<p?d<b?f:s:p<b?c:s,x=e.getAttribute("material"),g=e.getAttribute("material2"),A=4;let B=0;const h=.5;if(null!=x)for(let t=0;t<A;t++){x.getComponent(y,t)>h&&(B=t+1)}if(null!=g)for(let t=0;t<A;t++){g.getComponent(y,t)>h&&(B=t+5)}return B}(r,e);return t.userData.surfaceByLayer[u]}(o,u.geometry,e),null!=l?l:o.userData.surface}const n=new e,a=new e,i=new e;/*
1
+ import{Mesh as t,Vector3 as e}from"three";import{BatchedMesh2 as r}from"./batched-mesh-2.js";export function findSurfaceDefinition(e){const u=e.object;if(null==u||!(u instanceof t)||null==u.material)return;const o=Array.isArray(u.material)?u.material[e.face.materialIndex]:u.material;if(null==o)return null;if(u instanceof r){const t=u.surfaceByInstance?.[e.batchId];if(null!=t)return t}let l;return l=function(t,e,r){if(null==t.userData.surfaceByLayer||!e.hasAttribute("material"))return null;const u=function(t,e){const r=t.object,u=e.getAttribute("position"),o=e.index,l=t.faceIndex,f=o?o.getX(3*l+0):3*l+0,c=o?o.getX(3*l+1):3*l+1,s=o?o.getX(3*l+2):3*l+2;n.fromBufferAttribute(u,f).applyMatrix4(r.matrixWorld),a.fromBufferAttribute(u,c).applyMatrix4(r.matrixWorld),i.fromBufferAttribute(u,s).applyMatrix4(r.matrixWorld);const m=t.point,d=m.distanceToSquared(n),p=m.distanceToSquared(a),b=m.distanceToSquared(i),y=d<p?d<b?f:s:p<b?c:s,x=e.getAttribute("material"),g=e.getAttribute("material2"),A=4;let B=0;const h=.5;if(null!=x)for(let t=0;t<A;t++){x.getComponent(y,t)>h&&(B=t+1)}if(null!=g)for(let t=0;t<A;t++){g.getComponent(y,t)>h&&(B=t+5)}return B}(r,e);return t.userData.surfaceByLayer[u]}(o,u.geometry,e),null!=l?l:o.userData.surface}const n=new e,a=new e,i=new e;/*
2
2
  * Copyright (©) 2026 Hology Interactive AB. All rights reserved.
3
3
  * See the LICENSE.md file for details.
4
4
  */
@@ -1,4 +1,4 @@
1
- import{__decorate as t,__metadata as e}from"tslib";import{Color as i,Texture as r,Vector2 as a,BackSide as l}from"three";import{Parameter as o}from"../parameter.js";import{DecalNodeShader as p}from"../decal-shader.js";import{float as s,rgb as d,rgba as n,textureSampler2d as h}from"three-shader-graph";import{decalAlpha as c,decalUV as m}from"../../shader-nodes/decal.js";import{particleUniforms as y}from"../../shader-nodes/particle.js";import{tileUv as u}from"./decal-standard-shader";export class DecalUnlitShader extends p{constructor(){super(...arguments),this.color=new i("#FFFFFF"),this.opacity=1,this.intensity=1,this.atlasSize=new a(1,1),this.atlasTile=1}output(){let t=u(m,this.atlasSize,this.atlasTile),e=s(this.opacity).multiply(y.opacity);null!=this.alphaMap&&(e=e.multiply(h(this.alphaMap).sample(t).r)),e=e.multiply(c);let i=n(d(this.color).multiply(y.color),e);return null!=this.colorMap&&(i=i.multiply(h(this.colorMap).sample(t))),i=n(i.rgb.multiplyScalar(this.intensity),i.a),{color:i,emissive:i.rgb}}build(){const t=super.build();return t.depthTest=!0,t.depthWrite=!1,t.userData.isDecal=!0,t.side=l,t}}t([o(),e("design:type",i)],DecalUnlitShader.prototype,"color",void 0),t([o({range:[0,1]}),e("design:type",Number)],DecalUnlitShader.prototype,"opacity",void 0),t([o({range:[0,10]}),e("design:type",Number)],DecalUnlitShader.prototype,"intensity",void 0),t([o(),e("design:type",r)],DecalUnlitShader.prototype,"colorMap",void 0),t([o(),e("design:type",r)],DecalUnlitShader.prototype,"alphaMap",void 0),t([o(),e("design:type",a)],DecalUnlitShader.prototype,"atlasSize",void 0),t([o({range:[1,64],precision:0}),e("design:type",Number)],DecalUnlitShader.prototype,"atlasTile",void 0);/*
1
+ import{__decorate as t,__metadata as e}from"tslib";import{Color as i,Texture as r,Vector2 as a,BackSide as l}from"three";import{Parameter as o}from"../parameter.js";import{DecalNodeShader as p}from"../decal-shader.js";import{float as s,rgb as d,rgba as n,textureSampler2d as h}from"three-shader-graph";import{decalAlpha as c,decalUV as m}from"../../shader-nodes/decal.js";import{particleUniforms as y}from"../../shader-nodes/particle.js";import{tileUv as u}from"./decal-standard-shader.js";export class DecalUnlitShader extends p{constructor(){super(...arguments),this.color=new i("#FFFFFF"),this.opacity=1,this.intensity=1,this.atlasSize=new a(1,1),this.atlasTile=1}output(){let t=u(m,this.atlasSize,this.atlasTile),e=s(this.opacity).multiply(y.opacity);null!=this.alphaMap&&(e=e.multiply(h(this.alphaMap).sample(t).r)),e=e.multiply(c);let i=n(d(this.color).multiply(y.color),e);return null!=this.colorMap&&(i=i.multiply(h(this.colorMap).sample(t))),i=n(i.rgb.multiplyScalar(this.intensity),i.a),{color:i,emissive:i.rgb}}build(){const t=super.build();return t.depthTest=!0,t.depthWrite=!1,t.userData.isDecal=!0,t.side=l,t}}t([o(),e("design:type",i)],DecalUnlitShader.prototype,"color",void 0),t([o({range:[0,1]}),e("design:type",Number)],DecalUnlitShader.prototype,"opacity",void 0),t([o({range:[0,10]}),e("design:type",Number)],DecalUnlitShader.prototype,"intensity",void 0),t([o(),e("design:type",r)],DecalUnlitShader.prototype,"colorMap",void 0),t([o(),e("design:type",r)],DecalUnlitShader.prototype,"alphaMap",void 0),t([o(),e("design:type",a)],DecalUnlitShader.prototype,"atlasSize",void 0),t([o({range:[1,64],precision:0}),e("design:type",Number)],DecalUnlitShader.prototype,"atlasTile",void 0);/*
2
2
  * Copyright (©) 2026 Hology Interactive AB. All rights reserved.
3
3
  * See the LICENSE.md file for details.
4
4
  */
@@ -1,4 +1,4 @@
1
- import { ShaderType } from '../shader.js';
1
+ import type { ShaderType } from '../shader.js';
2
2
  export * from './standard-shader.js';
3
3
  export * from './lambert-shader.js';
4
4
  export * from './unlit-shader.js';
@@ -1,5 +1,6 @@
1
- import { Material } from "three";
2
- import { NodeShaderOutput, Shader } from "./shader.js";
1
+ import type { Material } from "three";
2
+ import type { NodeShaderOutput } from "./shader.js";
3
+ import { Shader } from "./shader.js";
3
4
  export declare abstract class DecalNodeShader extends Shader {
4
5
  build(): Material;
5
6
  abstract output(): NodeShaderOutput;
@@ -1,4 +1,4 @@
1
- import { Material, Side } from 'three';
1
+ import type { Material, Side } from 'three';
2
2
  import { FloatNode, NodeShaderMaterial, Vec2Node, Vec3Node } from '../../shader-nodes/index.js';
3
3
  import type { NodeShaderOutput } from '../shader.js';
4
4
  import type { ShaderGraphDocument, ShaderGraphMaterialSide, ShaderGraphNode, ShaderGraphValueType } from './model.js';
@@ -1,12 +1,12 @@
1
1
  import 'reflect-metadata';
2
- import { AbstractType, Type } from '../utils/type.js';
3
- import { BaseActor } from '../gameplay/actors/actor.js';
4
- import { Color, Euler, Material, Object3D, Texture, Vector2, Vector3, Vector4, AnimationClip } from 'three';
5
- import { BooleanNode, FloatNode, RgbNode, Sampler2DNode, Vec2Node, Vec3Node, Vec4Node } from '../shader-nodes/index.js';
6
- import { VisualEffect } from '../effects/vfx/vfx-param.js';
7
- import { Prefab, PrefabOf } from '../scene/objects/prefab.js';
8
- import { DataAssetRef } from '../scene/objects/data-asset.js';
9
- import { Curve2 } from '../utils/curve.js';
2
+ import type { AbstractType, Type } from '../utils/type.js';
3
+ import type { BaseActor } from '../gameplay/actors/actor.js';
4
+ import type { Color, Euler, Material, Object3D, Texture, Vector2, Vector3, Vector4, AnimationClip } from 'three';
5
+ import type { BooleanNode, FloatNode, RgbNode, Sampler2DNode, Vec2Node, Vec3Node, Vec4Node } from '../shader-nodes/index.js';
6
+ import type { VisualEffect } from '../effects/vfx/vfx-param.js';
7
+ import type { Prefab, PrefabOf } from '../scene/objects/prefab.js';
8
+ import type { DataAssetRef } from '../scene/objects/data-asset.js';
9
+ import type { Curve2 } from '../utils/curve.js';
10
10
  import type { ColorLayer, MaskLayer } from './color-layer.js';
11
11
  import type { Sequence } from '../effects/sequence/sequence-data.js';
12
12
  export type KnownParameterType = Type<FloatNode | Number | Texture | Sampler2DNode | Boolean | BooleanNode | Vector2 | Vec2Node | Vector3 | Vec3Node | Vector4 | Vec4Node | Color | RgbNode | String | BaseActor | Euler | Object3D | Material | AnimationClip | VisualEffect | Sequence | Prefab | PrefabOf<BaseActor> | DataAssetRef | Curve2 | ColorLayer | MaskLayer>;
@@ -1,5 +1,6 @@
1
1
  import { ShaderMaterial } from 'three';
2
- import { FloatNode, NodeShaderMaterial, Vec2Node, Vec3Node, Vec4Node } from '../shader-nodes/index.js';
2
+ import type { FloatNode, Vec2Node, Vec3Node, Vec4Node } from '../shader-nodes/index.js';
3
+ import { NodeShaderMaterial } from '../shader-nodes/index.js';
3
4
  export type PostProcessShaderOutput = Vec4Node | Vec3Node | Vec2Node | FloatNode;
4
5
  export interface PostProcessMaterialBuilder {
5
6
  build(): ShaderMaterial;
@@ -1,8 +1,9 @@
1
- import { ActorComponent } from '../gameplay/actors/component.js';
2
- import { BaseActor } from '../gameplay/actors/actor.js';
3
- import { Material } from 'three';
4
- import { Mat4Node, BooleanNode, Vec4Node, Vec3Node, FloatNode, Vec2Node } from '../shader-nodes/index.js';
5
- import { Type } from '../utils/type.js';
1
+ import type { ActorComponent } from '../gameplay/actors/component.js';
2
+ import type { BaseActor } from '../gameplay/actors/actor.js';
3
+ import type { Material } from 'three';
4
+ import type { Mat4Node, Vec4Node, Vec3Node, FloatNode, Vec2Node } from '../shader-nodes/index.js';
5
+ import { BooleanNode } from '../shader-nodes/index.js';
6
+ import type { Type } from '../utils/type.js';
6
7
  export * from './parameter.js';
7
8
  export declare abstract class Shader {
8
9
  alphaTest: number;
@@ -1,5 +1,6 @@
1
- import { Material } from "three";
2
- import { NodeShaderOutput, Shader } from "./shader.js";
1
+ import type { Material } from "three";
2
+ import type { NodeShaderOutput } from "./shader.js";
3
+ import { Shader } from "./shader.js";
3
4
  export declare abstract class TrailNodeShader extends Shader {
4
5
  build(): Material;
5
6
  abstract output(): NodeShaderOutput;
@@ -1,4 +1,4 @@
1
- import{Shader as r}from"./shader.js";import{NodeShaderMaterial as e}from"three-shader-graph";import{Trail as o}from"../effects/vfx/trail-renderer";export class TrailNodeShader extends r{build(){const r=this.output(),{position:t}=o.getTrailShaderNodes(!1),a=new e({position:t,color:r.color});return o.applyTrailShaderParameters(a),a}}/*
1
+ import{Shader as r}from"./shader.js";import{NodeShaderMaterial as e}from"three-shader-graph";import{Trail as o}from"../effects/vfx/trail-renderer.js";export class TrailNodeShader extends r{build(){const r=this.output(),{position:t}=o.getTrailShaderNodes(!1),a=new e({position:t,color:r.color});return o.applyTrailShaderParameters(a),a}}/*
2
2
  * Copyright (©) 2026 Hology Interactive AB. All rights reserved.
3
3
  * See the LICENSE.md file for details.
4
4
  */
@@ -1,4 +1,4 @@
1
- import { Texture } from 'three';
2
- import { Vec2Node } from 'three-shader-graph';
1
+ import type { Texture } from 'three';
2
+ import type { Vec2Node } from 'three-shader-graph';
3
3
  export declare function applyUvTiling(uv: Vec2Node, texture: Texture): Vec2Node;
4
4
  //# sourceMappingURL=uv-nodes.d.ts.map
@@ -1,4 +1,4 @@
1
- import { FloatNode, Vec2Node } from "three-shader-graph";
1
+ import type { FloatNode, Vec2Node } from "three-shader-graph";
2
2
  /**
3
3
  * Create a distortion such that the center is has a smaller is expanded
4
4
  */
@@ -1,5 +1,5 @@
1
- import { FloatNode, Sampler2DNode } from "three-shader-graph";
2
- import { Curve2 } from "../utils/curve";
1
+ import type { FloatNode, Sampler2DNode } from "three-shader-graph";
2
+ import type { Curve2 } from "../utils/curve.js";
3
3
  export declare function sampleCurve(curve: Curve2, t: FloatNode): FloatNode;
4
4
  export declare function sampleNamedEasingCurve(name: unknown, t: FloatNode): FloatNode | undefined;
5
5
  export declare function curveSampler(curve: Curve2, resolution?: number): CurveSampler;
@@ -1,6 +1,6 @@
1
- import { WebGLRenderer } from "three";
2
- import { FloatNode, Vec2Node, Vec3Node } from "three-shader-graph";
3
- import type { Compiler } from "three-shader-graph/build/main/lib/compiler.js";
1
+ import type { WebGLRenderer } from "three";
2
+ import { FloatNode, Vec2Node } from "three-shader-graph";
3
+ import type { Compiler, Vec3Node } from "three-shader-graph";
4
4
  export declare function supportsDepthTextureExtension(renderer: WebGLRenderer): boolean;
5
5
  export declare const depthUniformName = "hology_depth_map";
6
6
  export declare const resolutionUniformName = "hology_resolution";
@@ -1,4 +1,4 @@
1
- import { RgbNode, Vec3Node } from "three-shader-graph";
1
+ import type { RgbNode, Vec3Node } from "three-shader-graph";
2
2
  /**
3
3
  * Remove banding of colors. Apply after calculating lighting.
4
4
  * @param color
@@ -1,4 +1,4 @@
1
- import { FloatNode } from "three-shader-graph";
1
+ import type { FloatNode } from "three-shader-graph";
2
2
  export declare function fresnelEffect(power?: number | FloatNode): FloatNode;
3
3
  /**
4
4
  * Gives a factor for how shallow the depth is where 1 is the most shallow.
@@ -1,4 +1,4 @@
1
- import { FloatNode, BooleanNode, IntNode, Vec2Node, Vec3Node, Vec4Node, Mat2Node, Mat3Node, Mat4Node, RgbNode, RgbaNode, Sampler2DNode } from "../shader-nodes/index.js";
1
+ import type { FloatNode, BooleanNode, IntNode, Vec2Node, Vec3Node, Vec4Node, Mat2Node, Mat3Node, Mat4Node, RgbNode, RgbaNode, Sampler2DNode } from "../shader-nodes/index.js";
2
2
  type AbstractType<T> = abstract new (...args: unknown[]) => T;
3
3
  type ShaderNode = FloatNode | BooleanNode | IntNode | Vec2Node | Vec3Node | Vec4Node | Mat2Node | Mat3Node | Mat4Node | RgbNode | RgbaNode | Sampler2DNode;
4
4
  /**
@@ -1,4 +1,4 @@
1
- import{isWgslCompiler as e}from"three-shader-graph/build/main/lib/compiler.js";export function glslFunction(t,n,o){const r=t.typeName;return new class extends t{compile(t){if(e(t))throw new Error("WGSL cannot compile a glslFunction body. Replace it with shared nodes or provide a native WGSL node emitter.");const i=`customFunction_${t.variable()}`,a=Object.entries(n).map(([e,t])=>`${t.constructor.typeName} ${e}`).join(", "),c=Object.values(n).map(e=>t.get(e)).join(", ");return{pars:`${r} ${i}(${a}) {\n ${o}\n }`,out:`${i}(${c})`}}}}/*
1
+ import{isWgslCompiler as e}from"three-shader-graph";export function glslFunction(t,n,o){const r=t.typeName;return new class extends t{compile(t){if(e(t))throw new Error("WGSL cannot compile a glslFunction body. Replace it with shared nodes or provide a native WGSL node emitter.");const a=`customFunction_${t.variable()}`,i=Object.entries(n).map(([e,t])=>`${t.constructor.typeName} ${e}`).join(", "),c=Object.values(n).map(e=>t.get(e)).join(", ");return{pars:`${r} ${a}(${i}) {\n ${o}\n }`,out:`${a}(${c})`}}}}/*
2
2
  * Copyright (©) 2026 Hology Interactive AB. All rights reserved.
3
3
  * See the LICENSE.md file for details.
4
4
  */
@@ -1,5 +1,5 @@
1
1
  import { Color } from 'three';
2
- import { FloatNode, RgbaNode, Sampler2DNode } from 'three-shader-graph';
2
+ import type { FloatNode, RgbaNode, Sampler2DNode } from 'three-shader-graph';
3
3
  export interface ColorGradientStop {
4
4
  position: number;
5
5
  color: string | number | Color | number[];
@@ -1,4 +1,4 @@
1
- import { FloatNode } from 'three-shader-graph';
1
+ import type { FloatNode } from 'three-shader-graph';
2
2
  /**
3
3
  * Get coordinates in world space which can be much better for texturing landscapes than using UV
4
4
  */
@@ -1,4 +1,4 @@
1
- import { RgbNode, RgbaNode, FloatNode, Vec4Node, Vec3Node, Vec2Node } from "three-shader-graph";
1
+ import type { RgbNode, RgbaNode, FloatNode, Vec4Node, Vec3Node, Vec2Node } from "three-shader-graph";
2
2
  export declare enum LayerMixMode {
3
3
  hard = 0,
4
4
  soft = 1
@@ -1,5 +1,5 @@
1
1
  import { BooleanNode } from 'three-shader-graph';
2
- import { Compiler } from 'three-shader-graph/build/main/lib/compiler';
2
+ import type { Compiler } from 'three-shader-graph';
3
3
  export declare const MATERIAL_FLAG_ALPHA_TEST = 1;
4
4
  export declare const MATERIAL_FLAG_RECEIVE_DECALS = 2;
5
5
  declare class SampledSurfaceRejectsDecalsNode extends BooleanNode {
@@ -1,4 +1,4 @@
1
- import{BooleanNode as e}from"three-shader-graph";import{isWgslCompiler as r}from"three-shader-graph/build/main/lib/compiler";import{screenUV as t}from"./depth.js";import{sceneColorSampler as o}from"./scene-sample.js";export const MATERIAL_FLAG_ALPHA_TEST=1;export const MATERIAL_FLAG_RECEIVE_DECALS=2;const s=o.sample(t).a.lt(2);export const sampledSurfaceRejectsDecals=new class extends e{compile(e){return r(e)?{out:e.get(s)}:{out:"false"}}};/*
1
+ import{BooleanNode as e}from"three-shader-graph";import{isWgslCompiler as t}from"three-shader-graph";import{screenUV as r}from"./depth.js";import{sceneColorSampler as o}from"./scene-sample.js";export const MATERIAL_FLAG_ALPHA_TEST=1;export const MATERIAL_FLAG_RECEIVE_DECALS=2;const s=o.sample(r).a.lt(2);export const sampledSurfaceRejectsDecals=new class extends e{compile(e){return t(e)?{out:e.get(s)}:{out:"false"}}};/*
2
2
  * Copyright (©) 2026 Hology Interactive AB. All rights reserved.
3
3
  * See the LICENSE.md file for details.
4
4
  */
@@ -1,5 +1,5 @@
1
1
  import { FloatNode, Vec3Node } from 'three-shader-graph';
2
- import { Compiler } from 'three-shader-graph/build/main/lib/compiler';
2
+ import type { Compiler } from 'three-shader-graph';
3
3
  export declare const particleEnergyUniformName = "hology_particle_energy";
4
4
  export declare const particleTimeUniformName = "hology_particle_time";
5
5
  export declare const particleVelcoityUniformName = "hology_particle_velocity";
@@ -1,4 +1,4 @@
1
- import{Vector3 as e}from"three";import{attributeVec3 as t,FloatNode as o,ifDefApply as r,uniformFloat as n,Vec3Node as i,Vec3ExpressionNode as c,UniformVec3Node as a,autoVarying as l}from"three-shader-graph";import{isWgslCompiler as s,isWgslFragmentCompiler as p}from"three-shader-graph/build/main/lib/compiler";export const particleEnergyUniformName="hology_particle_energy";export const particleTimeUniformName="hology_particle_time";export const particleVelcoityUniformName="hology_particle_velocity";const m=new a("color",new e(1,1,1),void 0,!1);const h=l(new class extends i{compile(e){if(s(e))return p(e)?e.defineVarying("vec3",new c("instanceColor")):{out:"rendererObjectColor(input.instanceIndex).xyz"};return{chunk:`\n #ifdef USE_INSTANCING_COLOR\n vec3 instanceColor = instanceColor;\n #else\n vec3 instanceColor = ${e.get(m)};\n #endif\n `,out:"instanceColor"}}});class u extends o{constructor(e,o){super(),this.uniform=e,this.component=o,this.particleData=t("particleData")}compile(e){if(s(e)){const t=e.get(this.uniform),o=e.get(this.particleData);return{out:`select(${t}, ${o}.${this.component}, ${o}.z > 0.5)`}}return{out:e.get(r("USE_INSTANCING",this.uniform,()=>this.particleData[this.component]))}}}export const particleUniforms={energy:new u(n("hology_particle_energy",1),"y"),color:h,opacity:new u(n("opacity",1),"x"),time:n("hology_particle_time")};export const particleAttributes={};/*
1
+ import{Vector3 as e}from"three";import{attributeVec3 as t,FloatNode as o,ifDefApply as r,uniformFloat as n,Vec3Node as i,Vec3ExpressionNode as c,UniformVec3Node as a,autoVarying as s}from"three-shader-graph";import{isWgslCompiler as l,isWgslFragmentCompiler as p}from"three-shader-graph";export const particleEnergyUniformName="hology_particle_energy";export const particleTimeUniformName="hology_particle_time";export const particleVelcoityUniformName="hology_particle_velocity";const m=new a("color",new e(1,1,1),void 0,!1);const h=s(new class extends i{compile(e){if(l(e))return p(e)?e.defineVarying("vec3",new c("instanceColor")):{out:"rendererObjectColor(input.instanceIndex).xyz"};return{chunk:`\n #ifdef USE_INSTANCING_COLOR\n vec3 instanceColor = instanceColor;\n #else\n vec3 instanceColor = ${e.get(m)};\n #endif\n `,out:"instanceColor"}}});class f extends o{constructor(e,o){super(),this.uniform=e,this.component=o,this.particleData=t("particleData")}compile(e){if(l(e)){const t=e.get(this.uniform),o=e.get(this.particleData);return{out:`select(${t}, ${o}.${this.component}, ${o}.z > 0.5)`}}return{out:e.get(r("USE_INSTANCING",this.uniform,()=>this.particleData[this.component]))}}}export const particleUniforms={energy:new f(n("hology_particle_energy",1),"y"),color:h,opacity:new f(n("opacity",1),"x"),time:n("hology_particle_time")};export const particleAttributes={};/*
2
2
  * Copyright (©) 2026 Hology Interactive AB. All rights reserved.
3
3
  * See the LICENSE.md file for details.
4
4
  */
@@ -1,4 +1,5 @@
1
- import { FloatNode, Sampler2DNode, Vec2Node, Vec3Node, Vec4Node } from "three-shader-graph";
1
+ import type { FloatNode, Sampler2DNode, Vec3Node, Vec4Node } from "three-shader-graph";
2
+ import { Vec2Node } from "three-shader-graph";
2
3
  /**
3
4
  * Computes tangent vector using normal, position and uv.
4
5
  * Equivalent to:
@@ -1,4 +1,4 @@
1
- import{abs as e,attributes as t,cross as n,dFdx as r,dFdy as a,float as i,normalize as l,select as s,transformed as p,UniformSampler2dArraySlice as f,uniforms as $,varying as o,Vec2Node as v,vec3 as u,vec4 as m}from"three-shader-graph";import{isWgslCompiler as h,isWgslFragmentCompiler as d}from"three-shader-graph/build/main/lib/compiler.js";import{glslFunction as c}from"./glsl-node";export function computeTangent(e,t,i){const s=r(t),p=a(t),f=r(i),$=a(i),o=n(p,e),v=n(e,s),u=o.multiplyScalar(f.x).add(v.multiplyScalar($.x));return m(l(u),1)}export function fallbackTangent(t){const r=e(t.y),a=s(r.lt(i(.999)),u(0,1,0),u(1,0,0));return l(n(a,t))}const g=t.normal,S=o(l($.normalMatrix.multiplyVec(g))),x=o(p.mvPosition.xyz.multiplyScalar(-1));export function parallaxOcclusionMapping(e,t,n,r=8,a=24){return new y(e,t,n,r,a)}class y extends v{constructor(e,t,n,r,a){super(),this.uv=e,this.heightMap=t,this.heightScale=n,this.minLayers=r,this.maxLayers=a}compile(e){if(!h(e))return{out:e.get(this.compileGlsl())};if(!d(e))throw new Error("Parallax occlusion mapping requires fragment-stage derivatives in WGSL.");const t=`pom_${e.variable()}`,n=e.get(this.uv),r=e.get(this.heightMap),a=e.get(this.heightScale),l=e.get(S),s=e.get(x),p=e.get(i(this.minLayers)),f=e.get(i(this.maxLayers)),$=C(this.heightMap)?e.get(L(this.heightMap)):null;return{chunk:`\n let ${t}Uv = ${n};\n let ${t}Normal = normalize(${l});\n let ${t}ViewPosition = ${s};\n let ${t}ViewDirection = normalize(${t}ViewPosition);\n let ${t}Dp1 = dpdx(-${t}ViewPosition);\n // WGSL fragment coordinates have the opposite Y orientation from GLSL.\n // Negate both Y derivatives so the reconstructed cotangent frame keeps\n // the same handedness as the GLSL implementation.\n let ${t}Dp2 = -dpdy(-${t}ViewPosition);\n let ${t}Duv1 = dpdx(${t}Uv);\n let ${t}Duv2 = -dpdy(${t}Uv);\n let ${t}Dp2Perp = cross(${t}Dp2, ${t}Normal);\n let ${t}Dp1Perp = cross(${t}Normal, ${t}Dp1);\n let ${t}T = ${t}Dp2Perp * ${t}Duv1.x + ${t}Dp1Perp * ${t}Duv2.x;\n let ${t}B = ${t}Dp2Perp * ${t}Duv1.y + ${t}Dp1Perp * ${t}Duv2.y;\n let ${t}InvMax = inverseSqrt(max(dot(${t}T, ${t}T), dot(${t}B, ${t}B)));\n let ${t}Tbn = mat3x3<f32>(\n ${t}T * ${t}InvMax,\n ${t}B * ${t}InvMax,\n ${t}Normal\n );\n let ${t}Vv = -(transpose(${t}Tbn) * ${t}ViewDirection);\n let ${t}SafeVvZ = select(\n ${t}Vv.z,\n select(-0.0001, 0.0001, ${t}Vv.z >= 0.0),\n abs(${t}Vv.z) < 0.0001\n );\n let ${t}ParallaxLimit = (-length(${t}Vv.xy) / ${t}SafeVvZ) * ${a};\n let ${t}OffsetDirection = normalize(${t}Vv.xy);\n let ${t}MaxOffset = ${t}OffsetDirection * ${t}ParallaxLimit;\n let ${t}NumSamples = max(\n 1.0,\n mix(${f}, ${p}, dot(-${t}ViewDirection, ${t}Normal))\n );\n let ${t}StepSize = 1.0 / ${t}NumSamples;\n var ${t}CurrentRayHeight = 1.0;\n var ${t}CurrentOffset = vec2<f32>(0.0);\n var ${t}LastOffset = vec2<f32>(0.0);\n var ${t}LastSampledHeight = 1.0;\n var ${t}CurrentSampledHeight = 1.0;\n for (var ${t}SampleIndex: i32 = 0; ${t}SampleIndex < 24; ${t}SampleIndex = ${t}SampleIndex + 1) {\n if (f32(${t}SampleIndex) > ${t}NumSamples) {\n break;\n }\n ${t}CurrentSampledHeight = ${null==$?`textureSampleLevel(${r}Texture, ${r}Sampler, ${t}Uv + ${t}CurrentOffset, 0.0).r`:`textureSampleLevel(${r}Texture, ${r}Sampler, ${t}Uv + ${t}CurrentOffset, i32(${$}), 0.0).r`};\n if (${t}CurrentSampledHeight > ${t}CurrentRayHeight) {\n let ${t}Delta1 = ${t}CurrentSampledHeight - ${t}CurrentRayHeight;\n let ${t}Delta2 = (${t}CurrentRayHeight + ${t}StepSize) - ${t}LastSampledHeight;\n let ${t}Ratio = ${t}Delta1 / (${t}Delta1 + ${t}Delta2);\n ${t}CurrentOffset = ${t}Ratio * ${t}LastOffset + (1.0 - ${t}Ratio) * ${t}CurrentOffset;\n break;\n }\n ${t}CurrentRayHeight = ${t}CurrentRayHeight - ${t}StepSize;\n ${t}LastOffset = ${t}CurrentOffset;\n ${t}CurrentOffset = ${t}CurrentOffset + ${t}StepSize * ${t}MaxOffset;\n ${t}LastSampledHeight = ${t}CurrentSampledHeight;\n }\n let ${t}UvWithOffset = ${t}Uv + ${t}CurrentOffset;\n `,out:`${t}UvWithOffset`}}compileGlsl(){const e=C(this.heightMap)?L(this.heightMap):null,t=null==e?"texture2D(heightMap, uv + vCurrOffset).r":"texture(heightMap, vec3(uv + vCurrOffset, heightMapLayer)).r",n={uv:this.uv,heightScale:this.heightScale,heightMap:this.heightMap,minLayers:i(this.minLayers),maxLayers:i(this.maxLayers),vN:S,vViewPosition:x,...null==e?{}:{heightMapLayer:e}};return c(v,n,`\n vec3 N = normalize(vN);\n vec3 viewDir = normalize(vViewPosition);\n vec3 dp1 = dFdx(-vViewPosition);\n vec3 dp2 = dFdy(-vViewPosition);\n vec2 duv1 = dFdx(uv);\n vec2 duv2 = dFdy(uv);\n vec3 dp2perp = cross(dp2, N);\n vec3 dp1perp = cross(N, dp1);\n vec3 T = dp2perp * duv1.x + dp1perp * duv2.x;\n vec3 B = dp2perp * duv1.y + dp1perp * duv2.y;\n float invmax = inversesqrt(max(dot(T, T), dot(B, B)));\n mat3 tbn = mat3(T * invmax, B * invmax, N);\n vec3 vv = -viewDir * tbn;\n float parallaxLimit = -length(vv.xy) / vv.z;\n parallaxLimit *= heightScale;\n vec2 vOffsetDir = normalize(vv.xy);\n vec2 vMaxOffset = vOffsetDir * parallaxLimit;\n float nNumSamples = mix(float(maxLayers), float(minLayers), dot(-viewDir, N));\n float fStepSize = 1.0 / nNumSamples;\n float fCurrRayHeight = 1.0;\n vec2 vCurrOffset = vec2(0.0);\n vec2 vLastOffset = vec2(0.0);\n float fLastSampledHeight = 1.0;\n float fCurrSampledHeight = 1.0;\n for (int nCurrSample = 0; nCurrSample < 24; nCurrSample++) {\n if (float(nCurrSample) > nNumSamples) break;\n fCurrSampledHeight = ${t};\n if (fCurrSampledHeight > fCurrRayHeight) {\n float delta1 = fCurrSampledHeight - fCurrRayHeight;\n float delta2 = (fCurrRayHeight + fStepSize) - fLastSampledHeight;\n float ratio = delta1 / (delta1 + delta2);\n vCurrOffset = ratio * vLastOffset + (1.0 - ratio) * vCurrOffset;\n break;\n } else {\n fCurrRayHeight -= fStepSize;\n vLastOffset = vCurrOffset;\n vCurrOffset += fStepSize * vMaxOffset;\n fLastSampledHeight = fCurrSampledHeight;\n }\n }\n return uv + vCurrOffset;\n `)}}function C(e){return e instanceof f||"sampler2DArray"===e.constructor.typeName}function L(e){return e.index??i(0)}/*
1
+ import{abs as e,attributes as t,cross as n,dFdx as r,dFdy as a,float as i,normalize as l,select as s,transformed as p,UniformSampler2dArraySlice as f,uniforms as $,varying as o,Vec2Node as v,vec3 as u,vec4 as m}from"three-shader-graph";import{isWgslCompiler as h,isWgslFragmentCompiler as d}from"three-shader-graph";import{glslFunction as c}from"./glsl-node.js";export function computeTangent(e,t,i){const s=r(t),p=a(t),f=r(i),$=a(i),o=n(p,e),v=n(e,s),u=o.multiplyScalar(f.x).add(v.multiplyScalar($.x));return m(l(u),1)}export function fallbackTangent(t){const r=e(t.y),a=s(r.lt(i(.999)),u(0,1,0),u(1,0,0));return l(n(a,t))}const g=t.normal,S=o(l($.normalMatrix.multiplyVec(g))),x=o(p.mvPosition.xyz.multiplyScalar(-1));export function parallaxOcclusionMapping(e,t,n,r=8,a=24){return new y(e,t,n,r,a)}class y extends v{constructor(e,t,n,r,a){super(),this.uv=e,this.heightMap=t,this.heightScale=n,this.minLayers=r,this.maxLayers=a}compile(e){if(!h(e))return{out:e.get(this.compileGlsl())};if(!d(e))throw new Error("Parallax occlusion mapping requires fragment-stage derivatives in WGSL.");const t=`pom_${e.variable()}`,n=e.get(this.uv),r=e.get(this.heightMap),a=e.get(this.heightScale),l=e.get(S),s=e.get(x),p=e.get(i(this.minLayers)),f=e.get(i(this.maxLayers)),$=C(this.heightMap)?e.get(L(this.heightMap)):null;return{chunk:`\n let ${t}Uv = ${n};\n let ${t}Normal = normalize(${l});\n let ${t}ViewPosition = ${s};\n let ${t}ViewDirection = normalize(${t}ViewPosition);\n let ${t}Dp1 = dpdx(-${t}ViewPosition);\n // WGSL fragment coordinates have the opposite Y orientation from GLSL.\n // Negate both Y derivatives so the reconstructed cotangent frame keeps\n // the same handedness as the GLSL implementation.\n let ${t}Dp2 = -dpdy(-${t}ViewPosition);\n let ${t}Duv1 = dpdx(${t}Uv);\n let ${t}Duv2 = -dpdy(${t}Uv);\n let ${t}Dp2Perp = cross(${t}Dp2, ${t}Normal);\n let ${t}Dp1Perp = cross(${t}Normal, ${t}Dp1);\n let ${t}T = ${t}Dp2Perp * ${t}Duv1.x + ${t}Dp1Perp * ${t}Duv2.x;\n let ${t}B = ${t}Dp2Perp * ${t}Duv1.y + ${t}Dp1Perp * ${t}Duv2.y;\n let ${t}InvMax = inverseSqrt(max(dot(${t}T, ${t}T), dot(${t}B, ${t}B)));\n let ${t}Tbn = mat3x3<f32>(\n ${t}T * ${t}InvMax,\n ${t}B * ${t}InvMax,\n ${t}Normal\n );\n let ${t}Vv = -(transpose(${t}Tbn) * ${t}ViewDirection);\n let ${t}SafeVvZ = select(\n ${t}Vv.z,\n select(-0.0001, 0.0001, ${t}Vv.z >= 0.0),\n abs(${t}Vv.z) < 0.0001\n );\n let ${t}ParallaxLimit = (-length(${t}Vv.xy) / ${t}SafeVvZ) * ${a};\n let ${t}OffsetDirection = normalize(${t}Vv.xy);\n let ${t}MaxOffset = ${t}OffsetDirection * ${t}ParallaxLimit;\n let ${t}NumSamples = max(\n 1.0,\n mix(${f}, ${p}, dot(-${t}ViewDirection, ${t}Normal))\n );\n let ${t}StepSize = 1.0 / ${t}NumSamples;\n var ${t}CurrentRayHeight = 1.0;\n var ${t}CurrentOffset = vec2<f32>(0.0);\n var ${t}LastOffset = vec2<f32>(0.0);\n var ${t}LastSampledHeight = 1.0;\n var ${t}CurrentSampledHeight = 1.0;\n for (var ${t}SampleIndex: i32 = 0; ${t}SampleIndex < 24; ${t}SampleIndex = ${t}SampleIndex + 1) {\n if (f32(${t}SampleIndex) > ${t}NumSamples) {\n break;\n }\n ${t}CurrentSampledHeight = ${null==$?`textureSampleLevel(${r}Texture, ${r}Sampler, ${t}Uv + ${t}CurrentOffset, 0.0).r`:`textureSampleLevel(${r}Texture, ${r}Sampler, ${t}Uv + ${t}CurrentOffset, i32(${$}), 0.0).r`};\n if (${t}CurrentSampledHeight > ${t}CurrentRayHeight) {\n let ${t}Delta1 = ${t}CurrentSampledHeight - ${t}CurrentRayHeight;\n let ${t}Delta2 = (${t}CurrentRayHeight + ${t}StepSize) - ${t}LastSampledHeight;\n let ${t}Ratio = ${t}Delta1 / (${t}Delta1 + ${t}Delta2);\n ${t}CurrentOffset = ${t}Ratio * ${t}LastOffset + (1.0 - ${t}Ratio) * ${t}CurrentOffset;\n break;\n }\n ${t}CurrentRayHeight = ${t}CurrentRayHeight - ${t}StepSize;\n ${t}LastOffset = ${t}CurrentOffset;\n ${t}CurrentOffset = ${t}CurrentOffset + ${t}StepSize * ${t}MaxOffset;\n ${t}LastSampledHeight = ${t}CurrentSampledHeight;\n }\n let ${t}UvWithOffset = ${t}Uv + ${t}CurrentOffset;\n `,out:`${t}UvWithOffset`}}compileGlsl(){const e=C(this.heightMap)?L(this.heightMap):null,t=null==e?"texture2D(heightMap, uv + vCurrOffset).r":"texture(heightMap, vec3(uv + vCurrOffset, heightMapLayer)).r",n={uv:this.uv,heightScale:this.heightScale,heightMap:this.heightMap,minLayers:i(this.minLayers),maxLayers:i(this.maxLayers),vN:S,vViewPosition:x,...null==e?{}:{heightMapLayer:e}};return c(v,n,`\n vec3 N = normalize(vN);\n vec3 viewDir = normalize(vViewPosition);\n vec3 dp1 = dFdx(-vViewPosition);\n vec3 dp2 = dFdy(-vViewPosition);\n vec2 duv1 = dFdx(uv);\n vec2 duv2 = dFdy(uv);\n vec3 dp2perp = cross(dp2, N);\n vec3 dp1perp = cross(N, dp1);\n vec3 T = dp2perp * duv1.x + dp1perp * duv2.x;\n vec3 B = dp2perp * duv1.y + dp1perp * duv2.y;\n float invmax = inversesqrt(max(dot(T, T), dot(B, B)));\n mat3 tbn = mat3(T * invmax, B * invmax, N);\n vec3 vv = -viewDir * tbn;\n float parallaxLimit = -length(vv.xy) / vv.z;\n parallaxLimit *= heightScale;\n vec2 vOffsetDir = normalize(vv.xy);\n vec2 vMaxOffset = vOffsetDir * parallaxLimit;\n float nNumSamples = mix(float(maxLayers), float(minLayers), dot(-viewDir, N));\n float fStepSize = 1.0 / nNumSamples;\n float fCurrRayHeight = 1.0;\n vec2 vCurrOffset = vec2(0.0);\n vec2 vLastOffset = vec2(0.0);\n float fLastSampledHeight = 1.0;\n float fCurrSampledHeight = 1.0;\n for (int nCurrSample = 0; nCurrSample < 24; nCurrSample++) {\n if (float(nCurrSample) > nNumSamples) break;\n fCurrSampledHeight = ${t};\n if (fCurrSampledHeight > fCurrRayHeight) {\n float delta1 = fCurrSampledHeight - fCurrRayHeight;\n float delta2 = (fCurrRayHeight + fStepSize) - fLastSampledHeight;\n float ratio = delta1 / (delta1 + delta2);\n vCurrOffset = ratio * vLastOffset + (1.0 - ratio) * vCurrOffset;\n break;\n } else {\n fCurrRayHeight -= fStepSize;\n vLastOffset = vCurrOffset;\n vCurrOffset += fStepSize * vMaxOffset;\n fLastSampledHeight = fCurrSampledHeight;\n }\n }\n return uv + vCurrOffset;\n `)}}function C(e){return e instanceof f||"sampler2DArray"===e.constructor.typeName}function L(e){return e.index??i(0)}/*
2
2
  * Copyright (©) 2026 Hology Interactive AB. All rights reserved.
3
3
  * See the LICENSE.md file for details.
4
4
  */
@@ -1,4 +1,5 @@
1
- import { FloatNode, RgbaNode, Vec2Node, Vec3ExpressionNode } from 'three-shader-graph';
1
+ import type { FloatNode, RgbaNode, Vec2Node } from 'three-shader-graph';
2
+ import { Vec3ExpressionNode } from 'three-shader-graph';
2
3
  export declare const sceneMapUniformName = "hology_scene_map";
3
4
  export declare const sceneColorSampler: import("three-shader-graph").UniformSampler2d;
4
5
  export declare function sampleSceneColor(uv: Vec2Node): RgbaNode;
@@ -1,4 +1,4 @@
1
- import { FloatNode, Vec2Node } from "three-shader-graph";
1
+ import type { FloatNode, Vec2Node } from "three-shader-graph";
2
2
  export declare function rectangleFloat(uv: Vec2Node, width: FloatNode, height: FloatNode): FloatNode;
3
3
  export declare function roundedRectangleFloat(uv: Vec2Node, width: FloatNode, height: FloatNode, radius: FloatNode): FloatNode;
4
4
  //# sourceMappingURL=shapes.d.ts.map
@@ -1,4 +1,4 @@
1
- import { FloatNode, Sampler2DNode, Vec2Node } from "three-shader-graph";
1
+ import type { FloatNode, Sampler2DNode, Vec2Node } from "three-shader-graph";
2
2
  export declare function flipbookUv(uv: Vec2Node, columns: number | FloatNode, rows: number | FloatNode, time: FloatNode, fps?: number | FloatNode, mode?: 'clamp' | 'loop'): Vec2Node;
3
3
  export declare function sampleFlipbook(sampler: Sampler2DNode, uv: Vec2Node, columns: number | FloatNode, rows: number | FloatNode, time: FloatNode, fps?: number | FloatNode, mode?: 'clamp' | 'loop'): import("three-shader-graph").RgbaNode;
4
4
  //# sourceMappingURL=texture-sequence.d.ts.map
@@ -1,4 +1,4 @@
1
- import { FloatNode, Vec2Node } from 'three-shader-graph';
1
+ import type { FloatNode, Vec2Node } from 'three-shader-graph';
2
2
  export declare const elapsedTimeUniformName = "hology_elapsed_time";
3
3
  export declare const timeUniforms: {
4
4
  elapsed: import("three-shader-graph").UniformFloatNode;
@@ -1,4 +1,4 @@
1
- import { FloatNode, Vec2Node } from "three-shader-graph";
1
+ import type { FloatNode, Vec2Node } from "three-shader-graph";
2
2
  export declare function voronoi(uv: Vec2Node, angleOffset: FloatNode, cellDensity: FloatNode): {
3
3
  noise: FloatNode;
4
4
  cells: FloatNode;
@@ -1,4 +1,4 @@
1
- import { FloatNode, BooleanNode, IntNode, Vec2Node, Vec3Node, Vec4Node, Mat2Node, Mat3Node, Mat4Node, RgbNode, RgbaNode, Sampler2DNode } from "../shader-nodes/index.js";
1
+ import type { FloatNode, BooleanNode, IntNode, Vec2Node, Vec3Node, Vec4Node, Mat2Node, Mat3Node, Mat4Node, RgbNode, RgbaNode, Sampler2DNode } from "../shader-nodes/index.js";
2
2
  type AbstractType<T> = abstract new (...args: unknown[]) => T;
3
3
  type ShaderNode = FloatNode | BooleanNode | IntNode | Vec2Node | Vec3Node | Vec4Node | Mat2Node | Mat3Node | Mat4Node | RgbNode | RgbaNode | Sampler2DNode;
4
4
  /**
@@ -1,4 +1,4 @@
1
- import{isWgslCompiler as e}from"three-shader-graph/build/main/lib/compiler.js";export function wgslFunction(n,t,o){const i=n.typeName;return new class extends n{compile(n){if(!e(n))throw new Error("GLSL cannot compile a wgslFunction body. Use glslFunction or shared nodes instead.");const r=`customFunction_${n.variable()}`,s=Object.entries(t).map(([e,t])=>`${e}: ${n.type(t.constructor.typeName)}`).join(", "),c=Object.values(t).map(e=>n.get(e)).join(", ");return n.addWgslDefinition(`fn ${r}(${s}) -> ${n.type(i)} {\n ${o}\n }`),{out:`${r}(${c})`}}}}/*
1
+ import{isWgslCompiler as e}from"three-shader-graph";export function wgslFunction(n,t,o){const r=n.typeName;return new class extends n{compile(n){if(!e(n))throw new Error("GLSL cannot compile a wgslFunction body. Use glslFunction or shared nodes instead.");const s=`customFunction_${n.variable()}`,i=Object.entries(t).map(([e,t])=>`${e}: ${n.type(t.constructor.typeName)}`).join(", "),c=Object.values(t).map(e=>n.get(e)).join(", ");return n.addWgslDefinition(`fn ${s}(${i}) -> ${n.type(r)} {\n ${o}\n }`),{out:`${s}(${c})`}}}}/*
2
2
  * Copyright (©) 2026 Hology Interactive AB. All rights reserved.
3
3
  * See the LICENSE.md file for details.
4
4
  */
@@ -1,4 +1,4 @@
1
- import{__decorate as t,__metadata as e}from"tslib";import{describe as a,expect as s,it as o,vi as i}from"vitest";i.hoisted(()=>{if("undefined"==typeof HTMLCanvasElement)return;const t=new Proxy({},{get:(t,e)=>(e in t||(t[e]=("string"!=typeof e||!e.startsWith("is"))&&i.fn()),t[e]),set:(t,e,a)=>(t[e]=a,!0)});Object.defineProperty(HTMLCanvasElement.prototype,"getContext",{configurable:!0,value:()=>t}),"undefined"==typeof AudioBuffer&&Object.defineProperty(globalThis,"AudioBuffer",{configurable:!0,value:class{}})}),i.mock("../gameplay/actors/builtin/index.js",()=>({default:{}})),i.mock("../effects/vfx/vfx-actor.js",()=>({VfxActor:class{}})),i.mock("../effects/vfx/vfx-param.js",()=>({VisualEffect:class{}})),i.mock("../rendering.js",()=>({RenderingView:class{},setRenderingPaused:i.fn()}));import{convertConfiguredParamValueToRuntimeType as r}from"../scene/custom-param-runtime-types.js";import{prepareClassParameters as n,prepareCustomParamsFromType as c}from"../scene/materializer.js";import{SerializedParamType as l}from"../scene/model.js";import{extractShaderParameters as u,getAssignableParameterDefinitions as p,isParameterDefinitionAbstract as m,Parameter as y,ParameterDefinition as d}from"../shader/parameter.js";let b=class{constructor(){this.damage=10,this.label="Slash"}kind(){return"attack"}};t([y({type:Number}),e("design:type",Object)],b.prototype,"damage",void 0),t([y({type:String}),e("design:type",Object)],b.prototype,"label",void 0),b=t([d("test.attack")],b);let g=class extends b{constructor(){super(...arguments),this.manaCost=5}kind(){return"magic"}};t([y({type:Number}),e("design:type",Object)],g.prototype,"manaCost",void 0),g=t([d("test.magicAttack")],g);let v=class{constructor(){this.amount=20}};t([y({type:Number}),e("design:type",Object)],v.prototype,"amount",void 0),v=t([d("test.heal")],v);class f{constructor(){this.attacks=[]}}t([y({type:()=>b,array:!0}),e("design:type",Array)],f.prototype,"attacks",void 0);class k{constructor(){this.attacks=[]}}t([y(),e("design:type",Array)],k.prototype,"attacks",void 0),Reflect.defineMetadata("design:type",Array,k.prototype,"attacks"),Reflect.defineMetadata("parameter:arrayElementType",b,k.prototype,"attacks");class B{constructor(){this.primaryAttack=new b}}t([y({type:()=>b}),e("design:type",Object)],B.prototype,"primaryAttack",void 0);let h=class{constructor(){this.cooldown=1}};t([y({type:Number}),e("design:type",Object)],h.prototype,"cooldown",void 0),h=t([d("test.ability",{abstract:!0})],h);let A=class extends h{constructor(){super(...arguments),this.manaCost=6}kind(){return"magicAbility"}};t([y({type:Number}),e("design:type",Object)],A.prototype,"manaCost",void 0),A=t([d("test.magicAbility")],A);class S{constructor(){this.ability=void 0}}t([y({type:()=>h}),e("design:type",h)],S.prototype,"ability",void 0);class j{constructor(){this.abilities=[]}}t([y({type:()=>h,array:!0}),e("design:type",Array)],j.prototype,"abilities",void 0);class w{constructor(){this.value=void 0}}var O,N;t([y({type:String}),e("design:type",Object)],w.prototype,"value",void 0),function(t){t[t.good=0]="good",t[t.bad=1]="bad"}(O||(O={})),function(t){t.good="good",t.bad="bad"}(N||(N={}));class C{constructor(){this.faction=O.bad,this.stringFaction=N.good}}t([y({enum:O}),e("design:type",Object)],C.prototype,"faction",void 0),t([y({enum:N}),e("design:type",Object)],C.prototype,"stringFaction",void 0);class E{}t([y({enum:N}),e("design:type",String)],E.prototype,"stringFaction",void 0);class z{constructor(){this.faction=O.good}}t([y(),e("design:type",Number)],z.prototype,"faction",void 0),Reflect.defineMetadata("parameter:enum",O,z.prototype,"faction"),a("parameter definitions",()=>{o("generates editor options from enum decorator options",()=>{const t=u(C),e=t.find(t=>"faction"===t.name),a=t.find(t=>"stringFaction"===t.name);s(e?.type).toBe(Number),s(e?.options.options).toEqual([{name:"Good",value:O.good},{name:"Bad",value:O.bad}]),s(a?.type).toBe(String),s(a?.options.options).toEqual([{name:"Good",value:N.good},{name:"Bad",value:N.bad}])}),o("prepares enum params as number or string custom values",()=>{const t=c(C,{});s(t.faction).toMatchObject({type:l.Number,value:O.bad}),s(t.stringFaction).toMatchObject({type:l.String,value:N.good})}),o("uses the first enum option as the default when no initializer is set",()=>{const t=c(E,{});s(t.stringFaction).toMatchObject({type:l.String,value:N.good})}),o("uses reflected enum metadata for direct enum parameter annotations",()=>{const[t]=u(z),e=c(z,{});s(t.type).toBe(Number),s(t.options.options).toEqual([{name:"Good",value:O.good},{name:"Bad",value:O.bad}]),s(e.faction).toMatchObject({type:l.Number,value:O.good})}),o("lists assignable parameter definitions with display labels",()=>{const t=p(b);s(t.map(t=>t.id)).toEqual(["test.attack","test.magicAttack"]),s(t.map(t=>t.label)).toEqual(["Attack","Magic Attack"]),s(t.some(t=>"test.heal"===t.id)).toBe(!1)}),o("lists concrete assignable definitions for abstract bases",()=>{const t=p(h);s(m(h)).toBe(!0),s(m("test.ability")).toBe(!0),s(t.map(t=>t.id)).toEqual(["test.magicAbility"]),s(t.map(t=>t.label)).toEqual(["Magic Ability"])}),o("serializes arrays of nested parameter definitions with stable definition ids",()=>{const t=c(f,{}).attacks;s(t.type).toBe(l.Array),s(t.element).toBe(l.Struct),s(t.elementStruct).toBe("test.attack"),s(t.value).toEqual([])}),o("uses reflected array element type metadata for parameter arrays",()=>{const[t]=u(k),e=c(k,{}).attacks;s(t.type).toBe(b),s(t.options.array).toBe(!0),s(e.type).toBe(l.Array),s(e.element).toBe(l.Struct),s(e.elementStruct).toBe("test.attack"),s(e.value).toEqual([])}),o("serializes nested parameter definition defaults",()=>{const t=c(B,{}).primaryAttack;s(t.type).toBe(l.Struct),s(t.struct).toBe("test.attack"),s(t.value.damage.value).toBe(10),s(t.value.label.value).toBe("Slash")}),o("uses an empty string for string parameters without explicit defaults",()=>{const t=c(w,{}).value;s(t.type).toBe(l.String),s(t.value).toBe("")}),o("serializes nested subclass defaults with concrete definition ids",()=>{class a{constructor(){this.primaryAttack=new g}}t([y({type:()=>b}),e("design:type",Object)],a.prototype,"primaryAttack",void 0);const o=c(a,{}).primaryAttack;s(o.type).toBe(l.Struct),s(o.struct).toBe("test.magicAttack"),s(o.value.damage.value).toBe(10),s(o.value.label.value).toBe("Slash"),s(o.value.manaCost.value).toBe(5)}),o("serializes abstract parameter definitions as unselected structs",()=>{const t=c(S,{}).ability;s(t.type).toBe(l.Struct),s(t.struct).toBe("test.ability"),s(t.value).toEqual({})}),o("serializes abstract base defaults with concrete subclass ids",()=>{class a{constructor(){this.ability=new A}}t([y({type:()=>h}),e("design:type",Object)],a.prototype,"ability",void 0);const o=c(a,{}).ability;s(o.type).toBe(l.Struct),s(o.struct).toBe("test.magicAbility"),s(o.value.cooldown.value).toBe(1),s(o.value.manaCost.value).toBe(6)}),o("preserves previously selected concrete definition ids when preparing params",()=>{const t=c(B,{primaryAttack:{type:l.Struct,struct:"test.magicAttack",value:{damage:{type:l.Number,value:22},manaCost:{type:l.Number,value:7}}}}).primaryAttack;s(t.struct).toBe("test.magicAttack"),s(t.value.damage.value).toBe(22),s(t.value.manaCost.value).toBe(7)}),o("materializes nested parameter definitions as class instances",async()=>{const t=await n({attacks:{type:l.Array,element:l.Struct,elementStruct:"test.attack",value:[{damage:{type:l.Number,value:25},label:{type:l.String,value:"Heavy Slash"}}]}},f,{},{});s(t.attacks).toHaveLength(1),s(t.attacks[0]).toBeInstanceOf(b),s(t.attacks[0].damage).toBe(25),s(t.attacks[0].label).toBe("Heavy Slash")}),o("materializes a selected subclass for a non-array base parameter",async()=>{const t=await n({primaryAttack:{type:l.Struct,struct:"test.magicAttack",value:{damage:{type:l.Number,value:30},label:{type:l.String,value:"Arcane Slash"},manaCost:{type:l.Number,value:12}}}},B,{},{});s(t.primaryAttack).toBeInstanceOf(g),s(t.primaryAttack.kind()).toBe("magic"),s(t.primaryAttack.damage).toBe(30),s(t.primaryAttack.manaCost).toBe(12)}),o("materializes a selected subclass for an abstract base parameter",async()=>{const t=await n({ability:{type:l.Struct,struct:"test.magicAbility",value:{cooldown:{type:l.Number,value:2},manaCost:{type:l.Number,value:9}}}},S,{},{});s(t.ability).toBeInstanceOf(A),s(t.ability.cooldown).toBe(2),s(t.ability.manaCost).toBe(9),s(t.ability.kind()).toBe("magicAbility")}),o("does not instantiate abstract parameter definitions",async()=>{const t=i.spyOn(console,"warn").mockImplementation(()=>{}),e=await n({ability:{type:l.Struct,struct:"test.ability",value:{}}},S,{},{});s(e.ability).toBeUndefined(),s(t).toHaveBeenCalledWith('Can not instantiate abstract parameter definition "test.ability"'),t.mockRestore()}),o("materializes compact and tagged struct array elements",async()=>{const t=await n({attacks:{type:l.Array,element:l.Struct,elementStruct:"test.attack",value:[{damage:{type:l.Number,value:15},label:{type:l.String,value:"Quick Slash"}},{struct:"test.magicAttack",value:{damage:{type:l.Number,value:45},label:{type:l.String,value:"Meteor"},manaCost:{type:l.Number,value:18}}}]}},f,{},{});s(t.attacks).toHaveLength(2),s(t.attacks[0]).toBeInstanceOf(b),s(t.attacks[0]).not.toBeInstanceOf(g),s(t.attacks[1]).toBeInstanceOf(g),s(t.attacks[1].damage).toBe(45),s(t.attacks[1].manaCost).toBe(18)}),o("materializes tagged struct array elements for abstract bases",async()=>{const t=await n({abilities:{type:l.Array,element:l.Struct,elementStruct:"test.ability",value:[{struct:"test.magicAbility",value:{cooldown:{type:l.Number,value:3},manaCost:{type:l.Number,value:11}}}]}},j,{},{});s(t.abilities).toHaveLength(1),s(t.abilities[0]).toBeInstanceOf(A),s(t.abilities[0].cooldown).toBe(3),s(t.abilities[0].manaCost).toBe(11)}),o("preserves compatible selected subclass ids during runtime normalization",()=>{const t=r({type:l.Struct,struct:"test.magicAttack",value:{manaCost:{type:l.Number,value:9}}},{type:l.Struct,struct:"test.attack"});s(t.struct).toBe("test.magicAttack")})});/*
1
+ import{__decorate as t,__metadata as e}from"tslib";import{describe as a,expect as s,it as o,vi as i}from"vitest";i.hoisted(()=>{if("undefined"==typeof HTMLCanvasElement)return;const t=new Proxy({},{get:(t,e)=>(e in t||(t[e]=("string"!=typeof e||!e.startsWith("is"))&&i.fn()),t[e]),set:(t,e,a)=>(t[e]=a,!0)});Object.defineProperty(HTMLCanvasElement.prototype,"getContext",{configurable:!0,value:()=>t}),"undefined"==typeof AudioBuffer&&Object.defineProperty(globalThis,"AudioBuffer",{configurable:!0,value:class{}})}),i.mock("../gameplay/actors/builtin/index.js",()=>({default:{}})),i.mock("../effects/vfx/vfx-actor.js",()=>({VfxActor:class{}})),i.mock("../effects/vfx/vfx-param.js",()=>({VisualEffect:class{}})),i.mock("../rendering.js",()=>({RenderingView:class{},setRenderingPaused:i.fn()}));import{convertConfiguredParamValueToRuntimeType as r}from"../scene/custom-param-runtime-types.js";import{prepareClassParameters as n,prepareCustomParamsFromType as c}from"../scene/materializer.js";import{SerializedParamType as l}from"../scene/model.js";import{extractShaderParameters as u,getAssignableParameterDefinitions as p,isParameterDefinitionAbstract as m,Parameter as y,ParameterDefinition as d}from"../shader/parameter.js";let b=class{constructor(){this.damage=10,this.label="Slash"}kind(){return"attack"}};t([y({type:Number}),e("design:type",Object)],b.prototype,"damage",void 0),t([y({type:String}),e("design:type",Object)],b.prototype,"label",void 0),b=t([d("test.attack")],b);let g=class extends b{constructor(){super(...arguments),this.manaCost=5}kind(){return"magic"}};t([y({type:Number}),e("design:type",Object)],g.prototype,"manaCost",void 0),g=t([d("test.magicAttack")],g);let v=class{constructor(){this.amount=20}};t([y({type:Number}),e("design:type",Object)],v.prototype,"amount",void 0),v=t([d("test.heal")],v);class f{constructor(){this.attacks=[]}}t([y({type:()=>b,array:!0}),e("design:type",Array)],f.prototype,"attacks",void 0);class k{constructor(){this.attacks=[]}}t([y(),e("design:type",Array)],k.prototype,"attacks",void 0),Reflect.defineMetadata("design:type",Array,k.prototype,"attacks"),Reflect.defineMetadata("parameter:arrayElementType",b,k.prototype,"attacks");class B{constructor(){this.primaryAttack=new b}}t([y({type:()=>b}),e("design:type",Object)],B.prototype,"primaryAttack",void 0);let h=class{constructor(){this.cooldown=1}};t([y({type:Number}),e("design:type",Object)],h.prototype,"cooldown",void 0),h=t([d("test.ability",{abstract:!0})],h);let A=class extends h{constructor(){super(...arguments),this.manaCost=6}kind(){return"magicAbility"}};t([y({type:Number}),e("design:type",Object)],A.prototype,"manaCost",void 0),A=t([d("test.magicAbility")],A);class S{constructor(){this.ability=void 0}}t([y({type:()=>h}),e("design:type",h)],S.prototype,"ability",void 0);class j{constructor(){this.abilities=[]}}t([y({type:()=>h,array:!0}),e("design:type",Array)],j.prototype,"abilities",void 0);class w{constructor(){this.value=void 0}}var O,N;t([y({type:String}),e("design:type",Object)],w.prototype,"value",void 0),function(t){t[t.good=0]="good",t[t.bad=1]="bad"}(O||(O={})),function(t){t.good="good",t.bad="bad"}(N||(N={}));class C{constructor(){this.faction=O.bad,this.stringFaction=N.good}}t([y({enum:O}),e("design:type",Object)],C.prototype,"faction",void 0),t([y({enum:N}),e("design:type",Object)],C.prototype,"stringFaction",void 0);class E{}t([y({enum:N}),e("design:type",String)],E.prototype,"stringFaction",void 0);class z{constructor(){this.faction=O.good}}t([y(),e("design:type",Number)],z.prototype,"faction",void 0),Reflect.defineMetadata("parameter:enum",O,z.prototype,"faction"),a("parameter definitions",()=>{o("generates editor options from enum decorator options",()=>{const t=u(C),e=t.find(t=>"faction"===t.name),a=t.find(t=>"stringFaction"===t.name);s(e?.type).toBe(Number),s(e?.options.options).toEqual([{name:"Good",value:O.good},{name:"Bad",value:O.bad}]),s(a?.type).toBe(String),s(a?.options.options).toEqual([{name:"Good",value:N.good},{name:"Bad",value:N.bad}])}),o("prepares enum params as number or string custom values",()=>{const t=c(C,{});s(t.faction).toMatchObject({type:l.Number,value:O.bad}),s(t.stringFaction).toMatchObject({type:l.String,value:N.good})}),o("uses the first enum option as the default when no initializer is set",()=>{const t=c(E,{});s(t.stringFaction).toMatchObject({type:l.String,value:N.good})}),o("uses reflected enum metadata for direct enum parameter annotations",()=>{const[t]=u(z),e=c(z,{});s(t.type).toBe(Number),s(t.options.options).toEqual([{name:"Good",value:O.good},{name:"Bad",value:O.bad}]),s(e.faction).toMatchObject({type:l.Number,value:O.good})}),o("lists assignable parameter definitions with display labels",()=>{const t=p(b);s(t.map(t=>t.id)).toEqual(["test.attack","test.magicAttack"]),s(t.map(t=>t.label)).toEqual(["Attack","Magic Attack"]),s(t.some(t=>"test.heal"===t.id)).toBe(!1)}),o("lists concrete assignable definitions for abstract bases",()=>{const t=p(h);s(m(h)).toBe(!0),s(m("test.ability")).toBe(!0),s(t.map(t=>t.id)).toEqual(["test.magicAbility"]),s(t.map(t=>t.label)).toEqual(["Magic Ability"])}),o("serializes arrays of nested parameter definitions with stable definition ids",()=>{const t=c(f,{}).attacks;s(t.type).toBe(l.Array),s(t.element).toBe(l.Struct),s(t.elementStruct).toBe("test.attack"),s(t.value).toEqual([])}),o("uses reflected array element type metadata for parameter arrays",()=>{const[t]=u(k),e=c(k,{}).attacks;s(t.type).toBe(b),s(t.options.array).toBe(!0),s(e.type).toBe(l.Array),s(e.element).toBe(l.Struct),s(e.elementStruct).toBe("test.attack"),s(e.value).toEqual([])}),o("serializes nested parameter definition defaults",()=>{const t=c(B,{}).primaryAttack;s(t.type).toBe(l.Struct),s(t.struct).toBe("test.attack"),s(t.value.damage.value).toBe(10),s(t.value.label.value).toBe("Slash")}),o("uses an empty string for string parameters without explicit defaults",()=>{const t=c(w,{}).value;s(t.type).toBe(l.String),s(t.value).toBe("")}),o("serializes nested subclass defaults with concrete definition ids",()=>{class a{constructor(){this.primaryAttack=new g}}t([y({type:()=>b}),e("design:type",Object)],a.prototype,"primaryAttack",void 0);const o=c(a,{}).primaryAttack;s(o.type).toBe(l.Struct),s(o.struct).toBe("test.magicAttack"),s(o.value.damage.value).toBe(10),s(o.value.label.value).toBe("Slash"),s(o.value.manaCost.value).toBe(5)}),o("serializes abstract parameter definitions as unselected structs",()=>{const t=c(S,{}).ability;s(t.type).toBe(l.Struct),s(t.struct).toBe("test.ability"),s(t.value).toEqual({})}),o("serializes abstract base defaults with concrete subclass ids",()=>{class a{constructor(){this.ability=new A}}t([y({type:()=>h}),e("design:type",Object)],a.prototype,"ability",void 0);const o=c(a,{}).ability;s(o.type).toBe(l.Struct),s(o.struct).toBe("test.magicAbility"),s(o.value.cooldown.value).toBe(1),s(o.value.manaCost.value).toBe(6)}),o("preserves previously selected concrete definition ids when preparing params",()=>{const t=c(B,{primaryAttack:{type:l.Struct,struct:"test.magicAttack",value:{damage:{type:l.Number,value:22},manaCost:{type:l.Number,value:7}}}}).primaryAttack;s(t.struct).toBe("test.magicAttack"),s(t.value.damage.value).toBe(22),s(t.value.label.value).toBe("Slash"),s(t.value.manaCost.value).toBe(7)}),o("backfills missing parameters in existing struct array elements",()=>{const t=c(f,{attacks:{type:l.Array,element:l.Struct,elementStruct:"test.attack",value:[{damage:{type:l.Number,value:25}}]}}).attacks.value[0];s(t.damage.value).toBe(25),s(t.label.value).toBe("Slash")}),o("materializes nested parameter definitions as class instances",async()=>{const t=await n({attacks:{type:l.Array,element:l.Struct,elementStruct:"test.attack",value:[{damage:{type:l.Number,value:25},label:{type:l.String,value:"Heavy Slash"}}]}},f,{},{});s(t.attacks).toHaveLength(1),s(t.attacks[0]).toBeInstanceOf(b),s(t.attacks[0].damage).toBe(25),s(t.attacks[0].label).toBe("Heavy Slash")}),o("materializes a selected subclass for a non-array base parameter",async()=>{const t=await n({primaryAttack:{type:l.Struct,struct:"test.magicAttack",value:{damage:{type:l.Number,value:30},label:{type:l.String,value:"Arcane Slash"},manaCost:{type:l.Number,value:12}}}},B,{},{});s(t.primaryAttack).toBeInstanceOf(g),s(t.primaryAttack.kind()).toBe("magic"),s(t.primaryAttack.damage).toBe(30),s(t.primaryAttack.manaCost).toBe(12)}),o("materializes a selected subclass for an abstract base parameter",async()=>{const t=await n({ability:{type:l.Struct,struct:"test.magicAbility",value:{cooldown:{type:l.Number,value:2},manaCost:{type:l.Number,value:9}}}},S,{},{});s(t.ability).toBeInstanceOf(A),s(t.ability.cooldown).toBe(2),s(t.ability.manaCost).toBe(9),s(t.ability.kind()).toBe("magicAbility")}),o("does not instantiate abstract parameter definitions",async()=>{const t=i.spyOn(console,"warn").mockImplementation(()=>{}),e=await n({ability:{type:l.Struct,struct:"test.ability",value:{}}},S,{},{});s(e.ability).toBeUndefined(),s(t).toHaveBeenCalledWith('Can not instantiate abstract parameter definition "test.ability"'),t.mockRestore()}),o("materializes compact and tagged struct array elements",async()=>{const t=await n({attacks:{type:l.Array,element:l.Struct,elementStruct:"test.attack",value:[{damage:{type:l.Number,value:15},label:{type:l.String,value:"Quick Slash"}},{struct:"test.magicAttack",value:{damage:{type:l.Number,value:45},label:{type:l.String,value:"Meteor"},manaCost:{type:l.Number,value:18}}}]}},f,{},{});s(t.attacks).toHaveLength(2),s(t.attacks[0]).toBeInstanceOf(b),s(t.attacks[0]).not.toBeInstanceOf(g),s(t.attacks[1]).toBeInstanceOf(g),s(t.attacks[1].damage).toBe(45),s(t.attacks[1].manaCost).toBe(18)}),o("materializes tagged struct array elements for abstract bases",async()=>{const t=await n({abilities:{type:l.Array,element:l.Struct,elementStruct:"test.ability",value:[{struct:"test.magicAbility",value:{cooldown:{type:l.Number,value:3},manaCost:{type:l.Number,value:11}}}]}},j,{},{});s(t.abilities).toHaveLength(1),s(t.abilities[0]).toBeInstanceOf(A),s(t.abilities[0].cooldown).toBe(3),s(t.abilities[0].manaCost).toBe(11)}),o("preserves compatible selected subclass ids during runtime normalization",()=>{const t=r({type:l.Struct,struct:"test.magicAttack",value:{manaCost:{type:l.Number,value:9}}},{type:l.Struct,struct:"test.attack"});s(t.struct).toBe("test.magicAttack")})});/*
2
2
  * Copyright (©) 2026 Hology Interactive AB. All rights reserved.
3
3
  * See the LICENSE.md file for details.
4
4
  */
@@ -1,3 +1,3 @@
1
- import * as THREE from 'three';
1
+ import type * as THREE from 'three';
2
2
  export declare function iterateMaterials(material: THREE.Material | THREE.Material[]): Generator<THREE.Material, void, unknown>;
3
3
  //# sourceMappingURL=materials.d.ts.map
@@ -1,5 +1,5 @@
1
1
  import * as THREE from 'three';
2
- import { Object3D } from 'three';
2
+ import type { Object3D } from 'three';
3
3
  export declare class NoRaycastMesh extends THREE.Mesh {
4
4
  raycast(...args: any[]): void;
5
5
  }
@@ -1,4 +1,5 @@
1
- import { BufferGeometry, Euler, Vector3 } from "three";
1
+ import type { BufferGeometry } from "three";
2
+ import { Euler, Vector3 } from "three";
2
3
  export interface OBBData {
3
4
  center: Vector3;
4
5
  size: Vector3;
@@ -1,4 +1,4 @@
1
- import { Material, Object3D } from "three";
1
+ import type { Material, Object3D } from "three";
2
2
  export declare function disposeScene(scene: Object3D): void;
3
3
  export declare function disposeMaterial(material: Material): void;
4
4
  //# sourceMappingURL=cleanup.d.ts.map
@@ -1,4 +1,4 @@
1
- import { Camera, MeshDepthMaterial, Scene, WebGLRenderTarget, WebGLRenderer } from "three";
1
+ import type { Camera, MeshDepthMaterial, Scene, WebGLRenderTarget, WebGLRenderer } from "three";
2
2
  import { Pass } from "three-stdlib";
3
3
  declare class DepthPass extends Pass {
4
4
  private scene;
@@ -1,4 +1,5 @@
1
- import { Mesh, Object3D, Vector3 } from 'three';
1
+ import type { Object3D } from 'three';
2
+ import { Mesh, Vector3 } from 'three';
2
3
  type ObjectPredicate<T> = (obj: T) => boolean;
3
4
  export declare function filterScene(scene: Object3D, predicate: ObjectPredicate<Object3D>): Object3D<import("three").Object3DEventMap, Event>[];
4
5
  export declare function findFirstVisibleObject(scene: Object3D, predicate: ObjectPredicate<Object3D>): Object3D;