incanto 0.78.2 → 0.79.0

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 (33) hide show
  1. package/assets/backdrops/sky_gradient.png +0 -0
  2. package/assets/catalog.json +8 -0
  3. package/dist/2d.js +4 -4
  4. package/dist/3d.d.ts +39 -0
  5. package/dist/3d.js +5 -5
  6. package/dist/{agent8-B-bh3n0X.js → agent8---rIaJ3j.js} +1 -1
  7. package/dist/{create-game-BMIPKrQW.js → create-game-CtYQT8Uk.js} +6 -6
  8. package/dist/{create-game-Dai5vfVu.js → create-game-Cxx820o9.js} +67 -9
  9. package/dist/editor.js +37 -25
  10. package/dist/{environment-presets-e_9YCnGu.js → environment-presets-fGpZHUab.js} +3 -3
  11. package/dist/{gameplay-Bfff_beb.js → gameplay-CplbZE7c.js} +1 -1
  12. package/dist/gameplay.js +2 -2
  13. package/dist/index.js +3 -3
  14. package/dist/net.js +2 -2
  15. package/dist/{physics-2d-Tuf5LAyq.js → physics-2d-Cm1DIjk2.js} +3 -3
  16. package/dist/{physics-3d-C5MOujfQ.js → physics-3d-CwJzo3fP.js} +3 -3
  17. package/dist/{picking-DIwE48sU.js → picking-DxHiUoLo.js} +2 -2
  18. package/dist/{pose-ByFB_J3O.js → pose-O50uVW-j.js} +18 -1
  19. package/dist/react.js +1 -1
  20. package/dist/{register-B768Qedj.js → register-CIDbUbFG.js} +1 -1
  21. package/dist/{register-7E3P1gz6.js → register-l4ZWcLwD.js} +3 -3
  22. package/dist/{replay-DrqQ6dZj.js → replay-CooHM9lL.js} +2 -2
  23. package/dist/{split-screen-B-dIcQsQ.js → split-screen-BRbSkBMO.js} +3 -3
  24. package/dist/{test-CVbxnXlv.js → test-Def33MoL.js} +13 -13
  25. package/dist/test.js +2 -2
  26. package/dist/vite.js +2 -2
  27. package/editor/assets/{agent8-DA-I5qhv.js → agent8-WXuvhs5H.js} +1 -1
  28. package/editor/assets/{debug-99tEPoGm.js → debug-xpJQqbx1.js} +1 -1
  29. package/editor/assets/{index-Db74LZY-.js → index-DJryzpvb.js} +102 -102
  30. package/editor/index.html +1 -1
  31. package/package.json +1 -1
  32. package/skills/incanto-assets.md +15 -0
  33. package/skills/incanto-building-3d-games.md +39 -0
@@ -390,5 +390,13 @@
390
390
  "kind": "tile",
391
391
  "bytes": 44344,
392
392
  "description": "Basic wall tile texture for Dungeons and Dungeoners project, suitable for dungeon vertical boundaries."
393
+ },
394
+ {
395
+ "name": "sky_gradient",
396
+ "file": "backdrops/sky_gradient.png",
397
+ "url": "incanto/assets/backdrops/sky_gradient.png",
398
+ "kind": "backdrop",
399
+ "bytes": 16239,
400
+ "description": "Equirectangular sky backdrop (1024x512 PNG, generated, CC0): blue zenith to pale horizon, a low sun disc at elevation 30 / azimuth 150 (the atmosphere defaults), dark ground below. For `environment.skybox` — a picture behind the scene, never a light source; keep `sky` or `preset` for lighting."
393
401
  }
394
402
  ]
package/dist/2d.js CHANGED
@@ -1,10 +1,10 @@
1
1
  import { t as IncantoError } from "./errors-BpWbnbb_.js";
2
2
  import { t as showBootFailure } from "./boot-failure-CKYrEcGF.js";
3
3
  import { t as isWebGLAvailable } from "./webgl-unavailable-C8aDbGmR.js";
4
- import { a as AssetStore2D, i as syncTree2D, r as Renderer2D, t as createGame2D } from "./create-game-BMIPKrQW.js";
5
- import { _ as Node2D, f as Area2D, g as StaticBody2D, h as RigidBody2D, m as PhysicsBody2D, p as CharacterBody2D } from "./gameplay-Bfff_beb.js";
6
- import { a as parseCells, c as ColorRect2D, d as AnimatedSprite2D, f as Sprite2D, i as mergeSolidRects, l as CharacterController2D, n as UILayer, o as Particles2D, p as Joint2D, r as TileMap2D, s as Label, t as registerNodes2D, u as Camera2D } from "./register-7E3P1gz6.js";
7
- import { n as enablePhysics2D, t as Physics2D } from "./physics-2d-Tuf5LAyq.js";
4
+ import { a as AssetStore2D, i as syncTree2D, r as Renderer2D, t as createGame2D } from "./create-game-CtYQT8Uk.js";
5
+ import { _ as Node2D, f as Area2D, g as StaticBody2D, h as RigidBody2D, m as PhysicsBody2D, p as CharacterBody2D } from "./gameplay-CplbZE7c.js";
6
+ import { a as parseCells, c as ColorRect2D, d as AnimatedSprite2D, f as Sprite2D, i as mergeSolidRects, l as CharacterController2D, n as UILayer, o as Particles2D, p as Joint2D, r as TileMap2D, s as Label, t as registerNodes2D, u as Camera2D } from "./register-l4ZWcLwD.js";
7
+ import { n as enablePhysics2D, t as Physics2D } from "./physics-2d-Cm1DIjk2.js";
8
8
  //#region src/2d/library-sprite.ts
9
9
  /**
10
10
  * What a `CharacterController2D`/`3D` will ask a skin to play, and the clip in
package/dist/3d.d.ts CHANGED
@@ -1278,6 +1278,17 @@ interface Environment3DConfig {
1278
1278
  * (the renderer then makes the scene's main DirectionalLight cast).
1279
1279
  */
1280
1280
  shadows: ShadowsEnvironment | false | null;
1281
+ /**
1282
+ * What is VISIBLE behind the scene — a separate question from what lights
1283
+ * it. `true` = show the `hdri`/`preset` that already lights the scene; a
1284
+ * string = show THAT image (`.jpg`/`.png`/`.webp`, or an `.hdr`) and leave
1285
+ * the lighting wherever it was. `null` = the flat `background` colour.
1286
+ *
1287
+ * The image form never reaches `scene.environment`: an 8-bit picture used
1288
+ * as light clips the sun to flat white and turns every metal into plastic,
1289
+ * so the two roles are kept apart on purpose.
1290
+ */
1291
+ skybox: true | string | null;
1281
1292
  }
1282
1293
  /** Parse + hard-validate the 3D slice of a scene's `environment` header. */
1283
1294
  declare function parseEnvironment3D(env: JsonObject | undefined): Environment3DConfig;
@@ -1361,6 +1372,19 @@ declare class Environment3D {
1361
1372
  /** Told when the scene's HDRI/preset lighting fails to arrive. Set by the
1362
1373
  * renderer, which is the piece that knows the engine and the asset store. */
1363
1374
  onHdriError: ((url: string, error: unknown) => void) | null;
1375
+ /**
1376
+ * The shared texture store, set by the renderer — the same one every
1377
+ * `Sprite3D` and `MeshInstance3D` map goes through, so a `skybox` image is
1378
+ * decoded once, and a 404 lands in `assetErrors()` under the url the author
1379
+ * wrote. `null` headless (and in a detached probe): the picture is simply
1380
+ * not there, which is what a test asserts against.
1381
+ */
1382
+ assets: {
1383
+ textures: TextureCache3D;
1384
+ } | null;
1385
+ /** `environment.skybox` as an image: the url in flight, and what it produced. */
1386
+ private backdropUrl;
1387
+ private backdropTexture;
1364
1388
  constructor(scene: Scene);
1365
1389
  /** The sky's unit sun direction, or null when no sky is declared. */
1366
1390
  get sunDirection(): [number, number, number] | null;
@@ -1404,6 +1428,21 @@ declare class Environment3D {
1404
1428
  */
1405
1429
  applyUnderwater(config: UnderwaterConfig | null): void;
1406
1430
  private applyHdri;
1431
+ /**
1432
+ * `environment.skybox` as an image — a backdrop and nothing else.
1433
+ *
1434
+ * Two loaders, by extension. `.hdr` is RGBE, which an image decoder cannot
1435
+ * read, so it takes the same `RGBELoader` path as `hdri` — and then is
1436
+ * assigned to `background` only, never to `environment`. Everything else is
1437
+ * an ordinary picture and goes through the shared store: one decode however
1438
+ * many frames ask, sRGB because the eye reads it as colour, and a 404 filed
1439
+ * where `assetErrors()` looks, under the url the author wrote.
1440
+ *
1441
+ * Cheap when unchanged (`apply()` runs every frame); switching the url drops
1442
+ * the previous texture. `acquireOwn` because equirect `mapping` is set on
1443
+ * it, and a shared texture must not be re-mapped under another node's feet.
1444
+ */
1445
+ private applyBackdrop;
1407
1446
  private applySky;
1408
1447
  private applyFog;
1409
1448
  dispose(): void;
package/dist/3d.js CHANGED
@@ -1,12 +1,12 @@
1
- import { D as sunDirectionFromElevationAzimuth, E as parseEnvironment3D, O as sunDirectionFromSky, T as horizonColorFromSky } from "./pose-ByFB_J3O.js";
1
+ import { D as sunDirectionFromElevationAzimuth, E as parseEnvironment3D, O as sunDirectionFromSky, T as horizonColorFromSky } from "./pose-O50uVW-j.js";
2
2
  import { t as showBootFailure } from "./boot-failure-CKYrEcGF.js";
3
3
  import { t as isWebGLAvailable } from "./webgl-unavailable-C8aDbGmR.js";
4
4
  import { a as frameSignature, n as diffSignatures, o as frameStats, r as diffText, s as frameText, t as SIGNATURE_GRID } from "./frame-report-D-_7YF2G.js";
5
- import { $ as Water3D, at as PhysicsBody3D, ct as Node3D, dt as WATER_MAX_RIPPLES, et as WATER_CUTOUT_MAX, it as CharacterBody3D, ot as RigidBody3D, rt as Area3D, st as StaticBody3D, tt as WaterCutout3D } from "./gameplay-Bfff_beb.js";
6
- import { A as CharacterController3D, B as InstancedMesh3D, C as SpotLight3D, D as resolveFlowerDensity, E as Flowers3D, F as Terrain3D, G as keyboardIntensity, I as DEFAULT_TERRAIN_TEXTURE_BASE, J as TextureCache3D, K as movementState, L as TERRAIN_THEMES, M as BoneLookAt3D, N as BoneAttachment3D, O as FLOWER_VARIETIES, P as Billboard3D, R as terrainThemeLayers, S as OmniLight3D, T as DENSITY_PRESETS, U as QUARTER_PITCH, V as MeshInstance3D, W as cameraRelative, X as acquireTexture, Y as acquireOwnTexture, _ as Ragdoll3D, a as VoxelGrid3D, b as LoftMesh3D, c as Trail3D, d as findRiverCoverageGaps, f as projectToRiver, g as traceDownhillPath, h as smoothCourse, i as VOXEL_PALETTE, j as Camera3D, k as Flock3D, l as River3D, m as riverStepFor, n as registerNodes3D, o as Vehicle3D, p as riverCarveChannels, q as rigPose, r as Weather3D, s as Tree3D, u as buildRiverRings, v as Particles3D, w as Foliage3D, x as DirectionalLight3D, y as ModelInstance3D, z as Joint3D } from "./environment-presets-e_9YCnGu.js";
7
- import { a as Environment3D, c as AssetStore3D, i as syncTree, o as applyQualityTier3D, r as Renderer3D, s as setEnvironment3D, t as createGame3D } from "./create-game-Dai5vfVu.js";
5
+ import { $ as Water3D, at as PhysicsBody3D, ct as Node3D, dt as WATER_MAX_RIPPLES, et as WATER_CUTOUT_MAX, it as CharacterBody3D, ot as RigidBody3D, rt as Area3D, st as StaticBody3D, tt as WaterCutout3D } from "./gameplay-CplbZE7c.js";
6
+ import { A as CharacterController3D, B as InstancedMesh3D, C as SpotLight3D, D as resolveFlowerDensity, E as Flowers3D, F as Terrain3D, G as keyboardIntensity, I as DEFAULT_TERRAIN_TEXTURE_BASE, J as TextureCache3D, K as movementState, L as TERRAIN_THEMES, M as BoneLookAt3D, N as BoneAttachment3D, O as FLOWER_VARIETIES, P as Billboard3D, R as terrainThemeLayers, S as OmniLight3D, T as DENSITY_PRESETS, U as QUARTER_PITCH, V as MeshInstance3D, W as cameraRelative, X as acquireTexture, Y as acquireOwnTexture, _ as Ragdoll3D, a as VoxelGrid3D, b as LoftMesh3D, c as Trail3D, d as findRiverCoverageGaps, f as projectToRiver, g as traceDownhillPath, h as smoothCourse, i as VOXEL_PALETTE, j as Camera3D, k as Flock3D, l as River3D, m as riverStepFor, n as registerNodes3D, o as Vehicle3D, p as riverCarveChannels, q as rigPose, r as Weather3D, s as Tree3D, u as buildRiverRings, v as Particles3D, w as Foliage3D, x as DirectionalLight3D, y as ModelInstance3D, z as Joint3D } from "./environment-presets-fGpZHUab.js";
7
+ import { a as Environment3D, c as AssetStore3D, i as syncTree, o as applyQualityTier3D, r as Renderer3D, s as setEnvironment3D, t as createGame3D } from "./create-game-Cxx820o9.js";
8
8
  import { n as splatWeights, t as buildHeightmap } from "./heightmap-BYgD5Edk.js";
9
- import { n as enablePhysics3D, t as Physics3D } from "./physics-3d-C5MOujfQ.js";
9
+ import { n as enablePhysics3D, t as Physics3D } from "./physics-3d-CwJzo3fP.js";
10
10
  //#region src/3d/model-verdict.ts
11
11
  /** Mixamo exports every bone as `mixamorigX`; the retargeter binds by that name. */
12
12
  const MIXAMO = /^mixamorig[:_]?/i;
@@ -1,5 +1,5 @@
1
1
  import { o as __exportAll } from "./json-CfTjpvW8.js";
2
- import { et as diagnose } from "./pose-ByFB_J3O.js";
2
+ import { et as diagnose } from "./pose-O50uVW-j.js";
3
3
  //#region src/net/agent8.ts
4
4
  var agent8_exports = /* @__PURE__ */ __exportAll({
5
5
  Agent8TransportForTest: () => Agent8Transport,
@@ -1,15 +1,15 @@
1
1
  import { o as __exportAll } from "./json-CfTjpvW8.js";
2
- import { M as computeViewport, N as resolveViewport, U as sceneDimension, b as loadScene, dt as registerBehavior, et as diagnose } from "./pose-ByFB_J3O.js";
3
- import { T as qualityRendering, b as Engine, y as AudioPlayer } from "./register-B768Qedj.js";
2
+ import { M as computeViewport, N as resolveViewport, U as sceneDimension, b as loadScene, dt as registerBehavior, et as diagnose } from "./pose-O50uVW-j.js";
3
+ import { T as qualityRendering, b as Engine, y as AudioPlayer } from "./register-CIDbUbFG.js";
4
4
  import { t as IncantoError } from "./errors-BpWbnbb_.js";
5
5
  import { n as attachTouchControls } from "./touch-CioTZB-y.js";
6
6
  import { n as withWebGLContext, r as resolveRendering } from "./webgl-unavailable-C8aDbGmR.js";
7
- import { a as devServerLibrary, c as applyDriveStep, d as audioErrors, i as crossFade, l as wireDevChannel, n as teardown, o as openBundledEditor, r as pauseWhenHidden, t as nodeFromHits, u as claimCanvasGestures } from "./picking-DIwE48sU.js";
7
+ import { a as devServerLibrary, c as applyDriveStep, d as audioErrors, i as crossFade, l as wireDevChannel, n as teardown, o as openBundledEditor, r as pauseWhenHidden, t as nodeFromHits, u as claimCanvasGestures } from "./picking-DxHiUoLo.js";
8
8
  import { o as frameStats } from "./frame-report-D-_7YF2G.js";
9
- import { _ as Node2D, m as PhysicsBody2D, n as registerGameplayBehaviors } from "./gameplay-Bfff_beb.js";
9
+ import { _ as Node2D, m as PhysicsBody2D, n as registerGameplayBehaviors } from "./gameplay-CplbZE7c.js";
10
10
  import { t as debugSources } from "./debug-draw-BM3DsvtT.js";
11
- import { n as UILayer, t as registerNodes2D, u as Camera2D } from "./register-7E3P1gz6.js";
12
- import { n as enablePhysics2D } from "./physics-2d-Tuf5LAyq.js";
11
+ import { n as UILayer, t as registerNodes2D, u as Camera2D } from "./register-l4ZWcLwD.js";
12
+ import { n as enablePhysics2D } from "./physics-2d-Cm1DIjk2.js";
13
13
  import { Box3, BufferAttribute, BufferGeometry, Color, LineBasicMaterial, LineSegments, LinearFilter, NearestFilter, OrthographicCamera, Raycaster, SRGBColorSpace, Scene, TextureLoader, Vector2, Vector3, WebGLRenderer } from "three";
14
14
  //#region src/2d/assets.ts
15
15
  /**
@@ -1,16 +1,16 @@
1
1
  import { o as __exportAll } from "./json-CfTjpvW8.js";
2
- import { E as parseEnvironment3D, O as sunDirectionFromSky, T as horizonColorFromSky, U as sceneDimension, b as loadScene, dt as registerBehavior, et as diagnose } from "./pose-ByFB_J3O.js";
3
- import { C as qualityCaps, T as qualityRendering, b as Engine, w as qualityEnvironment, y as AudioPlayer } from "./register-B768Qedj.js";
2
+ import { E as parseEnvironment3D, O as sunDirectionFromSky, T as horizonColorFromSky, U as sceneDimension, b as loadScene, dt as registerBehavior, et as diagnose } from "./pose-O50uVW-j.js";
3
+ import { C as qualityCaps, T as qualityRendering, b as Engine, w as qualityEnvironment, y as AudioPlayer } from "./register-CIDbUbFG.js";
4
4
  import { t as IncantoError } from "./errors-BpWbnbb_.js";
5
5
  import { n as attachTouchControls } from "./touch-CioTZB-y.js";
6
6
  import { n as withWebGLContext, r as resolveRendering } from "./webgl-unavailable-C8aDbGmR.js";
7
- import { a as devServerLibrary, c as applyDriveStep, d as audioErrors, i as crossFade, l as wireDevChannel, n as teardown, o as openBundledEditor, r as pauseWhenHidden, s as poseFromRenderer, t as nodeFromHits, u as claimCanvasGestures } from "./picking-DIwE48sU.js";
7
+ import { a as devServerLibrary, c as applyDriveStep, d as audioErrors, i as crossFade, l as wireDevChannel, n as teardown, o as openBundledEditor, r as pauseWhenHidden, s as poseFromRenderer, t as nodeFromHits, u as claimCanvasGestures } from "./picking-DxHiUoLo.js";
8
8
  import { o as frameStats } from "./frame-report-D-_7YF2G.js";
9
- import { at as PhysicsBody3D, ct as Node3D, n as registerGameplayBehaviors, ut as createCausticsQuad } from "./gameplay-Bfff_beb.js";
9
+ import { at as PhysicsBody3D, ct as Node3D, n as registerGameplayBehaviors, ut as createCausticsQuad } from "./gameplay-CplbZE7c.js";
10
10
  import { t as debugSources } from "./debug-draw-BM3DsvtT.js";
11
- import { J as TextureCache3D, j as Camera3D, n as registerNodes3D, t as resolveEnvironmentHdri, x as DirectionalLight3D, y as ModelInstance3D } from "./environment-presets-e_9YCnGu.js";
12
- import { n as enablePhysics3D } from "./physics-3d-C5MOujfQ.js";
13
- import { ACESFilmicToneMapping, AmbientLight, Box3, BufferAttribute, BufferGeometry, Color, DepthTexture, EquirectangularReflectionMapping, FloatType, Fog, HalfFloatType, LineBasicMaterial, LineSegments, LoadingManager, Matrix4, Mesh, PCFShadowMap, PMREMGenerator, PerspectiveCamera, PlaneGeometry, Quaternion, Raycaster, Scene, ShaderMaterial, Vector2, Vector3, WebGLRenderTarget, WebGLRenderer } from "three";
11
+ import { J as TextureCache3D, j as Camera3D, n as registerNodes3D, t as resolveEnvironmentHdri, x as DirectionalLight3D, y as ModelInstance3D } from "./environment-presets-fGpZHUab.js";
12
+ import { n as enablePhysics3D } from "./physics-3d-CwJzo3fP.js";
13
+ import { ACESFilmicToneMapping, AmbientLight, Box3, BufferAttribute, BufferGeometry, Color, DepthTexture, EquirectangularReflectionMapping, FloatType, Fog, HalfFloatType, LineBasicMaterial, LineSegments, LoadingManager, Matrix4, Mesh, PCFShadowMap, PMREMGenerator, PerspectiveCamera, PlaneGeometry, Quaternion, Raycaster, SRGBColorSpace, Scene, ShaderMaterial, Vector2, Vector3, WebGLRenderTarget, WebGLRenderer } from "three";
14
14
  import { VRMLoaderPlugin, VRMUtils } from "@pixiv/three-vrm";
15
15
  import { GLTFLoader } from "three/addons/loaders/GLTFLoader.js";
16
16
  import { RGBELoader } from "three/examples/jsm/loaders/RGBELoader.js";
@@ -858,6 +858,17 @@ var Environment3D = class {
858
858
  /** Told when the scene's HDRI/preset lighting fails to arrive. Set by the
859
859
  * renderer, which is the piece that knows the engine and the asset store. */
860
860
  onHdriError = null;
861
+ /**
862
+ * The shared texture store, set by the renderer — the same one every
863
+ * `Sprite3D` and `MeshInstance3D` map goes through, so a `skybox` image is
864
+ * decoded once, and a 404 lands in `assetErrors()` under the url the author
865
+ * wrote. `null` headless (and in a detached probe): the picture is simply
866
+ * not there, which is what a test asserts against.
867
+ */
868
+ assets = null;
869
+ /** `environment.skybox` as an image: the url in flight, and what it produced. */
870
+ backdropUrl = null;
871
+ backdropTexture = null;
861
872
  constructor(scene) {
862
873
  this.scene = scene;
863
874
  this.scene.add(this.ambient);
@@ -905,11 +916,13 @@ var Environment3D = class {
905
916
  }
906
917
  this.applyHdri(env);
907
918
  this.applySky(cfg.sky, gl);
908
- if (this._sky) this._sky.visible = true;
919
+ this.applyBackdrop(cfg.skybox);
920
+ if (this._sky) this._sky.visible = this.backdropTexture === null;
909
921
  this.applyFog(cfg);
910
922
  this.scene.environment = this.hdriTexture ?? this.skyEnvTarget?.texture ?? null;
911
923
  this.scene.environmentIntensity = (this.scene.environment === this.skyEnvTarget?.texture && this.skyEnvTarget ? .55 : 1) * parseIblIntensity(env?.iblIntensity);
912
- if (env?.skybox === true && this.hdriTexture) this.scene.background = this.hdriTexture;
924
+ if (this.backdropTexture) this.scene.background = this.backdropTexture;
925
+ else if (cfg.skybox === true && this.hdriTexture) this.scene.background = this.hdriTexture;
913
926
  else {
914
927
  const background = env?.background;
915
928
  this.scene.background = typeof background === "string" ? new Color(background) : null;
@@ -1009,6 +1022,47 @@ var Environment3D = class {
1009
1022
  this.onHdriError?.(url, error);
1010
1023
  });
1011
1024
  }
1025
+ /**
1026
+ * `environment.skybox` as an image — a backdrop and nothing else.
1027
+ *
1028
+ * Two loaders, by extension. `.hdr` is RGBE, which an image decoder cannot
1029
+ * read, so it takes the same `RGBELoader` path as `hdri` — and then is
1030
+ * assigned to `background` only, never to `environment`. Everything else is
1031
+ * an ordinary picture and goes through the shared store: one decode however
1032
+ * many frames ask, sRGB because the eye reads it as colour, and a 404 filed
1033
+ * where `assetErrors()` looks, under the url the author wrote.
1034
+ *
1035
+ * Cheap when unchanged (`apply()` runs every frame); switching the url drops
1036
+ * the previous texture. `acquireOwn` because equirect `mapping` is set on
1037
+ * it, and a shared texture must not be re-mapped under another node's feet.
1038
+ */
1039
+ applyBackdrop(skybox) {
1040
+ const url = typeof skybox === "string" ? skybox : null;
1041
+ if (url === this.backdropUrl) return;
1042
+ this.backdropUrl = url;
1043
+ this.backdropTexture?.dispose();
1044
+ this.backdropTexture = null;
1045
+ if (!url) return;
1046
+ if (/\.hdr(\?|#|$)/i.test(url)) {
1047
+ if (typeof document === "undefined") return;
1048
+ new RGBELoader().load(url, (texture) => {
1049
+ if (this.backdropUrl !== url) {
1050
+ texture.dispose();
1051
+ return;
1052
+ }
1053
+ texture.mapping = EquirectangularReflectionMapping;
1054
+ this.backdropTexture = texture;
1055
+ }, void 0, (error) => {
1056
+ this.onHdriError?.(url, error);
1057
+ });
1058
+ return;
1059
+ }
1060
+ const texture = this.assets?.textures.acquireOwn(url, { colorSpace: "srgb" }) ?? null;
1061
+ if (!texture) return;
1062
+ texture.mapping = EquirectangularReflectionMapping;
1063
+ texture.colorSpace = SRGBColorSpace;
1064
+ this.backdropTexture = texture;
1065
+ }
1012
1066
  applySky(sky, gl) {
1013
1067
  const skyKey = sky ? JSON.stringify(sky) : "";
1014
1068
  if (skyKey !== this.skyKey) {
@@ -1059,6 +1113,9 @@ var Environment3D = class {
1059
1113
  dispose() {
1060
1114
  this.hdriTexture?.dispose();
1061
1115
  this.hdriTexture = null;
1116
+ this.backdropTexture?.dispose();
1117
+ this.backdropTexture = null;
1118
+ this.backdropUrl = null;
1062
1119
  this.skyEnvTarget?.dispose();
1063
1120
  this.skyEnvTarget = null;
1064
1121
  if (this._sky) {
@@ -1549,6 +1606,7 @@ var Renderer3D = class {
1549
1606
  this.engine = opts.engine;
1550
1607
  this.ownsAssets = !opts.assets;
1551
1608
  this.assets = opts.assets ?? new AssetStore3D(this.engine);
1609
+ this.environment.assets = this.assets;
1552
1610
  const rendering = resolveRendering(opts.engine.scene?.environment, {
1553
1611
  antialias: opts.qualityDefaults?.antialias ?? true,
1554
1612
  pixelRatio: opts.qualityDefaults?.pixelRatio ?? Math.min(globalThis.devicePixelRatio ?? 1, 2),
package/dist/editor.js CHANGED
@@ -2068,7 +2068,7 @@ function cn(e) {
2068
2068
  }
2069
2069
  //#endregion
2070
2070
  //#region ../engine/assets/catalog.json
2071
- var ln = /*#__PURE__*/ JSON.parse("[{\"name\":\"2dbasic\",\"file\":\"characters/2dbasic.png\",\"url\":\"incanto/assets/characters/2dbasic.png\",\"kind\":\"character\",\"bytes\":30499,\"description\":\"2dbasic sprite sheet image.anything,base character.\",\"animation\":\"characters/2dbasic.json\",\"frameWidth\":111,\"frameHeight\":83},{\"name\":\"attacked\",\"file\":\"audio/attacked.mp3\",\"url\":\"incanto/assets/audio/attacked.mp3\",\"kind\":\"audio\",\"bytes\":8757,\"description\":\"Short hurt / took-damage SFX for the player or an enemy.\"},{\"name\":\"bark_birch_color\",\"file\":\"vegetation/bark/birch_color_1k.jpg\",\"url\":\"https://agent8-games.verse8.io/assets/3D/default/textures/vegetation/bark/birch_color_1k.jpg\",\"kind\":\"foliage\",\"bytes\":194186,\"description\":\"Birch bark base color texture (1k), ambientcg Bark (CC0) packaged by ez-tree (MIT). Tree3D trunks/branches sample it by default from the agent8 CDN (the only sanctioned external host); the bundled `incanto/assets` copy (see this entry’s `file`) serves it offline.\"},{\"name\":\"bark_birch_normal\",\"file\":\"vegetation/bark/birch_normal_1k.jpg\",\"url\":\"https://agent8-games.verse8.io/assets/3D/default/textures/vegetation/bark/birch_normal_1k.jpg\",\"kind\":\"foliage\",\"bytes\":378046,\"description\":\"Birch bark tangent-space normal texture (1k), ambientcg Bark (CC0) packaged by ez-tree (MIT). Tree3D trunks/branches sample it by default from the agent8 CDN (the only sanctioned external host); the bundled `incanto/assets` copy (see this entry’s `file`) serves it offline.\"},{\"name\":\"bark_birch_roughness\",\"file\":\"vegetation/bark/birch_roughness_1k.jpg\",\"url\":\"https://agent8-games.verse8.io/assets/3D/default/textures/vegetation/bark/birch_roughness_1k.jpg\",\"kind\":\"foliage\",\"bytes\":127387,\"description\":\"Birch bark roughness texture (1k), ambientcg Bark (CC0) packaged by ez-tree (MIT). Tree3D trunks/branches sample it by default from the agent8 CDN (the only sanctioned external host); the bundled `incanto/assets` copy (see this entry’s `file`) serves it offline.\"},{\"name\":\"bark_oak_color\",\"file\":\"vegetation/bark/oak_color_1k.jpg\",\"url\":\"https://agent8-games.verse8.io/assets/3D/default/textures/vegetation/bark/oak_color_1k.jpg\",\"kind\":\"foliage\",\"bytes\":297877,\"description\":\"Oak bark base color texture (1k), ambientcg Bark (CC0) packaged by ez-tree (MIT). Tree3D trunks/branches sample it by default from the agent8 CDN (the only sanctioned external host); the bundled `incanto/assets` copy (see this entry’s `file`) serves it offline.\"},{\"name\":\"bark_oak_normal\",\"file\":\"vegetation/bark/oak_normal_1k.jpg\",\"url\":\"https://agent8-games.verse8.io/assets/3D/default/textures/vegetation/bark/oak_normal_1k.jpg\",\"kind\":\"foliage\",\"bytes\":67610,\"description\":\"Oak bark tangent-space normal texture (1k), ambientcg Bark (CC0) packaged by ez-tree (MIT). Tree3D trunks/branches sample it by default from the agent8 CDN (the only sanctioned external host); the bundled `incanto/assets` copy (see this entry’s `file`) serves it offline.\"},{\"name\":\"bark_oak_roughness\",\"file\":\"vegetation/bark/oak_roughness_1k.jpg\",\"url\":\"https://agent8-games.verse8.io/assets/3D/default/textures/vegetation/bark/oak_roughness_1k.jpg\",\"kind\":\"foliage\",\"bytes\":16648,\"description\":\"Oak bark roughness texture (1k), ambientcg Bark (CC0) packaged by ez-tree (MIT). Tree3D trunks/branches sample it by default from the agent8 CDN (the only sanctioned external host); the bundled `incanto/assets` copy (see this entry’s `file`) serves it offline.\"},{\"name\":\"bark_pine_color\",\"file\":\"vegetation/bark/pine_color_1k.jpg\",\"url\":\"https://agent8-games.verse8.io/assets/3D/default/textures/vegetation/bark/pine_color_1k.jpg\",\"kind\":\"foliage\",\"bytes\":196361,\"description\":\"Pine bark base color texture (1k), ambientcg Bark (CC0) packaged by ez-tree (MIT). Tree3D trunks/branches sample it by default from the agent8 CDN (the only sanctioned external host); the bundled `incanto/assets` copy (see this entry’s `file`) serves it offline.\"},{\"name\":\"bark_pine_normal\",\"file\":\"vegetation/bark/pine_normal_1k.jpg\",\"url\":\"https://agent8-games.verse8.io/assets/3D/default/textures/vegetation/bark/pine_normal_1k.jpg\",\"kind\":\"foliage\",\"bytes\":58237,\"description\":\"Pine bark tangent-space normal texture (1k), ambientcg Bark (CC0) packaged by ez-tree (MIT). Tree3D trunks/branches sample it by default from the agent8 CDN (the only sanctioned external host); the bundled `incanto/assets` copy (see this entry’s `file`) serves it offline.\"},{\"name\":\"bark_pine_roughness\",\"file\":\"vegetation/bark/pine_roughness_1k.jpg\",\"url\":\"https://agent8-games.verse8.io/assets/3D/default/textures/vegetation/bark/pine_roughness_1k.jpg\",\"kind\":\"foliage\",\"bytes\":36136,\"description\":\"Pine bark roughness texture (1k), ambientcg Bark (CC0) packaged by ez-tree (MIT). Tree3D trunks/branches sample it by default from the agent8 CDN (the only sanctioned external host); the bundled `incanto/assets` copy (see this entry’s `file`) serves it offline.\"},{\"name\":\"box\",\"file\":\"items/box.png\",\"url\":\"incanto/assets/items/box.png\",\"kind\":\"item\",\"bytes\":10861,\"description\":\"Item box sprite for Dungeons and Dungeoners. Container sprite that holds random items or rewards when opened by player.\"},{\"name\":\"buff_potion\",\"file\":\"items/buff_potion.png\",\"url\":\"incanto/assets/items/buff_potion.png\",\"kind\":\"item\",\"bytes\":3809,\"description\":\"Buff potion item sprite for Dungeons and Dungeoners. Consumable item that grants temporary stat boosts or positive effects to player character.\"},{\"name\":\"coin\",\"file\":\"items/coin.png\",\"url\":\"incanto/assets/items/coin.png\",\"kind\":\"item\",\"bytes\":1689,\"description\":\"Gold coin collectible sprite for Dungeons and Dungeoners. Currency item with metallic sheen, used as in-game money or collectible reward.\"},{\"name\":\"explosion\",\"file\":\"audio/explosion.mp3\",\"url\":\"incanto/assets/audio/explosion.mp3\",\"kind\":\"audio\",\"bytes\":40124,\"description\":\"Impactful explosion / large destructive hit SFX. Pair with the Particles2D \\\"explosion\\\" preset.\"},{\"name\":\"floor00\",\"file\":\"tiles/floor00.jpg\",\"url\":\"incanto/assets/tiles/floor00.jpg\",\"kind\":\"tile\",\"bytes\":28736,\"description\":\"Basic floor tile texture for Dungeons and Dungeoners project, suitable for dungeon ground surfaces.\"},{\"name\":\"gem\",\"file\":\"items/gem.png\",\"url\":\"incanto/assets/items/gem.png\",\"kind\":\"item\",\"bytes\":8762,\"description\":\"Gem collectible sprite for Dungeons and Dungeoners. Valuable gemstone item used as currency, crafting material, or quest objective.\"},{\"name\":\"ghost\",\"file\":\"characters/ghost.png\",\"url\":\"incanto/assets/characters/ghost.png\",\"kind\":\"character\",\"bytes\":22933,\"description\":\"Ghost character with translucent appearance sprite sheet image\",\"animation\":\"characters/ghost.json\",\"frameWidth\":112,\"frameHeight\":128},{\"name\":\"goblin\",\"file\":\"characters/goblin.png\",\"url\":\"incanto/assets/characters/goblin.png\",\"kind\":\"character\",\"bytes\":57994,\"description\":\"Medieval goblin with torch sprite sheet image\",\"animation\":\"characters/goblin.json\",\"frameWidth\":192,\"frameHeight\":192},{\"name\":\"gold\",\"file\":\"items/gold.png\",\"url\":\"incanto/assets/items/gold.png\",\"kind\":\"item\",\"bytes\":22313,\"description\":\"Gold item sprite for Dungeons and Dungeoners. Gold pile or gold bar sprite representing valuable currency or treasure reward.\"},{\"name\":\"gold-loot\",\"file\":\"audio/gold_loot.mp3\",\"url\":\"incanto/assets/audio/gold_loot.mp3\",\"kind\":\"audio\",\"bytes\":7506,\"description\":\"Metallic coin / gold pickup jingle — collecting currency.\"},{\"name\":\"ground_dirt\",\"file\":\"vegetation/ground/dirt_color.jpg\",\"url\":\"https://agent8-games.verse8.io/assets/3D/default/textures/vegetation/ground/dirt_color.jpg\",\"kind\":\"foliage\",\"bytes\":231383,\"description\":\"Dense dirt/gravel ground texture (1024px) from the ez-tree demo app (MIT) — the reference meadow ground. Terrain3D grassland themes tile it for slope + noise-patch dirt by default; also bundled in `incanto/assets` (see `file`) for offline use.\"},{\"name\":\"ground_dirt_normal\",\"file\":\"vegetation/ground/dirt_normal.jpg\",\"url\":\"https://agent8-games.verse8.io/assets/3D/default/textures/vegetation/ground/dirt_normal.jpg\",\"kind\":\"foliage\",\"bytes\":123478,\"description\":\"Dirt ground normal map (1024px) from the ez-tree demo app (MIT). Terrain3D grassland themes apply it across the whole ground band (demo parity); also bundled in `incanto/assets` (see `file`) for offline use.\"},{\"name\":\"ground_grass\",\"file\":\"vegetation/ground/grass.jpg\",\"url\":\"https://agent8-games.verse8.io/assets/3D/default/textures/vegetation/ground/grass.jpg\",\"kind\":\"foliage\",\"bytes\":322486,\"description\":\"Mossy meadow grass ground texture (1024px) from the ez-tree demo app (MIT). Terrain3D grassland themes (meadow/forest generators) tile it as the grass splat layer by default; also bundled in `incanto/assets` (see `file`) for offline use.\"},{\"name\":\"heal\",\"file\":\"audio/heal.mp3\",\"url\":\"incanto/assets/audio/heal.mp3\",\"kind\":\"audio\",\"bytes\":29764,\"description\":\"Soothing health-restore / heal spell SFX.\"},{\"name\":\"hit-metal-bang\",\"file\":\"audio/hit_metal_bang.mp3\",\"url\":\"incanto/assets/audio/hit_metal_bang.mp3\",\"kind\":\"audio\",\"bytes\":17972,\"description\":\"Metallic impact — hitting armor, metal, or a blocked attack.\"},{\"name\":\"hp_potion\",\"file\":\"items/hp_potion.png\",\"url\":\"incanto/assets/items/hp_potion.png\",\"kind\":\"item\",\"bytes\":3513,\"description\":\"Health potion item sprite for Dungeons and Dungeoners. Consumable healing item that restores player health points when used.\"},{\"name\":\"ice-spear\",\"file\":\"audio/ice_spear.mp3\",\"url\":\"incanto/assets/audio/ice_spear.mp3\",\"kind\":\"audio\",\"bytes\":21315,\"description\":\"Sharp piercing ice projectile fire SFX.\"},{\"name\":\"leaves_ash\",\"file\":\"vegetation/ash_color.png\",\"url\":\"https://agent8-games.verse8.io/assets/3D/default/textures/vegetation/ash_color.png\",\"kind\":\"foliage\",\"bytes\":181423,\"description\":\"Ash leaf-cluster alpha-cutout texture (1024px) from ez-tree by Dan Greenheck (MIT). Tree3D samples it for broadleaf/dead ash variants by default; copy it next to your game and set leafTexture to serve offline.\"},{\"name\":\"leaves_aspen\",\"file\":\"vegetation/aspen_color.png\",\"url\":\"https://agent8-games.verse8.io/assets/3D/default/textures/vegetation/aspen_color.png\",\"kind\":\"foliage\",\"bytes\":142116,\"description\":\"Aspen leaf-cluster alpha-cutout texture (1024px) from ez-tree by Dan Greenheck (MIT). Tree3D samples it for high-tier broadleaf aspen variants; copy + leafTexture for offline serving.\"},{\"name\":\"leaves_oak\",\"file\":\"vegetation/oak_color.png\",\"url\":\"https://agent8-games.verse8.io/assets/3D/default/textures/vegetation/oak_color.png\",\"kind\":\"foliage\",\"bytes\":238115,\"description\":\"Oak leaf-cluster alpha-cutout texture (1024px) from ez-tree by Dan Greenheck (MIT). Tree3D samples it for broadleaf oak variants by default; copy + leafTexture for offline serving.\"},{\"name\":\"leaves_pine\",\"file\":\"vegetation/pine_color.png\",\"url\":\"https://agent8-games.verse8.io/assets/3D/default/textures/vegetation/pine_color.png\",\"kind\":\"foliage\",\"bytes\":303684,\"description\":\"Pine needle-cluster alpha-cutout texture (1024px) from ez-tree by Dan Greenheck (MIT). Tree3D samples it for conifer variants by default; copy + leafTexture for offline serving.\"},{\"name\":\"locked_item_box\",\"file\":\"items/locked_item_box.png\",\"url\":\"incanto/assets/items/locked_item_box.png\",\"kind\":\"item\",\"bytes\":11074,\"description\":\"Locked item box sprite for Dungeons and Dungeoners. Container sprite requiring key or lockpick to open, containing valuable rewards.\"},{\"name\":\"map\",\"file\":\"items/map.png\",\"url\":\"incanto/assets/items/map.png\",\"kind\":\"item\",\"bytes\":3754,\"description\":\"Map item sprite for Dungeons and Dungeoners. Navigation item revealing dungeon layout or providing exploration assistance.\"},{\"name\":\"medieval-knight\",\"file\":\"characters/medieval-knight.png\",\"url\":\"incanto/assets/characters/medieval-knight.png\",\"kind\":\"character\",\"bytes\":84367,\"description\":\"Using a medieval-themed SD(Super Deformed) knight sprite sheet image, you can apply idle, move, and attack animations, among others.\",\"animation\":\"characters/medieval-knight.json\",\"frameWidth\":192,\"frameHeight\":192},{\"name\":\"minecraft-tiles\",\"file\":\"tiles/minecraft-tiles.png\",\"url\":\"incanto/assets/tiles/minecraft-tiles.png\",\"kind\":\"tile\",\"bytes\":10511,\"description\":\"Minecraft-themed tiles sprite sheet image\",\"frameWidth\":16,\"frameHeight\":16,\"columns\":5,\"tiles\":25},{\"name\":\"monster-died\",\"file\":\"audio/monster_died.mp3\",\"url\":\"incanto/assets/audio/monster_died.mp3\",\"kind\":\"audio\",\"bytes\":16836,\"description\":\"Enemy defeat / death SFX.\"},{\"name\":\"resurrection_potion\",\"file\":\"items/resurrection_potion.png\",\"url\":\"incanto/assets/items/resurrection_potion.png\",\"kind\":\"item\",\"bytes\":3471,\"description\":\"Resurrection potion item sprite for Dungeons and Dungeoners. Rare consumable that revives fallen party members or prevents death.\"},{\"name\":\"slash\",\"file\":\"audio/slash.mp3\",\"url\":\"incanto/assets/audio/slash.mp3\",\"kind\":\"audio\",\"bytes\":10425,\"description\":\"Quick sword swing / melee slash SFX.\"},{\"name\":\"smite\",\"file\":\"audio/smite.mp3\",\"url\":\"incanto/assets/audio/smite.mp3\",\"kind\":\"audio\",\"bytes\":12956,\"description\":\"Powerful holy downward-strike SFX.\"},{\"name\":\"spells-cast\",\"file\":\"audio/spells_cast.mp3\",\"url\":\"incanto/assets/audio/spells_cast.mp3\",\"kind\":\"audio\",\"bytes\":22151,\"description\":\"Generic magical spell-cast / chant SFX.\"},{\"name\":\"super_box\",\"file\":\"items/super_box.png\",\"url\":\"incanto/assets/items/super_box.png\",\"kind\":\"item\",\"bytes\":12184,\"description\":\"Super item box sprite for Dungeons and Dungeoners. Premium container sprite containing rare or powerful items and equipment.\"},{\"name\":\"swoosh\",\"file\":\"effects/swoosh.png\",\"url\":\"incanto/assets/effects/swoosh.png\",\"kind\":\"effect\",\"bytes\":2599,\"description\":\"Swoosh effect sprite for Dungeons and Dungeoners. Motion blur or attack trail effect used for melee attacks, sword slashes, or fast movement animations.\"},{\"name\":\"trap\",\"file\":\"items/trap.png\",\"url\":\"incanto/assets/items/trap.png\",\"kind\":\"item\",\"bytes\":3969,\"description\":\"Trap object sprite for Dungeons and Dungeoners. Hazard sprite that damages players when triggered in dungeon exploration.\"},{\"name\":\"ui-click\",\"file\":\"audio/ui_click.wav\",\"url\":\"incanto/assets/audio/ui_click.wav\",\"kind\":\"audio\",\"bytes\":17332,\"description\":\"Short tactile UI click for menus and buttons.\"},{\"name\":\"walk\",\"file\":\"audio/walk.mp3\",\"url\":\"incanto/assets/audio/walk.mp3\",\"kind\":\"audio\",\"bytes\":5642,\"description\":\"Single footstep SFX for character movement (loop or one-shot).\"},{\"name\":\"wall00\",\"file\":\"tiles/wall00.jpg\",\"url\":\"incanto/assets/tiles/wall00.jpg\",\"kind\":\"tile\",\"bytes\":44344,\"description\":\"Basic wall tile texture for Dungeons and Dungeoners project, suitable for dungeon vertical boundaries.\"}]");
2071
+ var ln = /*#__PURE__*/ JSON.parse("[{\"name\":\"2dbasic\",\"file\":\"characters/2dbasic.png\",\"url\":\"incanto/assets/characters/2dbasic.png\",\"kind\":\"character\",\"bytes\":30499,\"description\":\"2dbasic sprite sheet image.anything,base character.\",\"animation\":\"characters/2dbasic.json\",\"frameWidth\":111,\"frameHeight\":83},{\"name\":\"attacked\",\"file\":\"audio/attacked.mp3\",\"url\":\"incanto/assets/audio/attacked.mp3\",\"kind\":\"audio\",\"bytes\":8757,\"description\":\"Short hurt / took-damage SFX for the player or an enemy.\"},{\"name\":\"bark_birch_color\",\"file\":\"vegetation/bark/birch_color_1k.jpg\",\"url\":\"https://agent8-games.verse8.io/assets/3D/default/textures/vegetation/bark/birch_color_1k.jpg\",\"kind\":\"foliage\",\"bytes\":194186,\"description\":\"Birch bark base color texture (1k), ambientcg Bark (CC0) packaged by ez-tree (MIT). Tree3D trunks/branches sample it by default from the agent8 CDN (the only sanctioned external host); the bundled `incanto/assets` copy (see this entry’s `file`) serves it offline.\"},{\"name\":\"bark_birch_normal\",\"file\":\"vegetation/bark/birch_normal_1k.jpg\",\"url\":\"https://agent8-games.verse8.io/assets/3D/default/textures/vegetation/bark/birch_normal_1k.jpg\",\"kind\":\"foliage\",\"bytes\":378046,\"description\":\"Birch bark tangent-space normal texture (1k), ambientcg Bark (CC0) packaged by ez-tree (MIT). Tree3D trunks/branches sample it by default from the agent8 CDN (the only sanctioned external host); the bundled `incanto/assets` copy (see this entry’s `file`) serves it offline.\"},{\"name\":\"bark_birch_roughness\",\"file\":\"vegetation/bark/birch_roughness_1k.jpg\",\"url\":\"https://agent8-games.verse8.io/assets/3D/default/textures/vegetation/bark/birch_roughness_1k.jpg\",\"kind\":\"foliage\",\"bytes\":127387,\"description\":\"Birch bark roughness texture (1k), ambientcg Bark (CC0) packaged by ez-tree (MIT). Tree3D trunks/branches sample it by default from the agent8 CDN (the only sanctioned external host); the bundled `incanto/assets` copy (see this entry’s `file`) serves it offline.\"},{\"name\":\"bark_oak_color\",\"file\":\"vegetation/bark/oak_color_1k.jpg\",\"url\":\"https://agent8-games.verse8.io/assets/3D/default/textures/vegetation/bark/oak_color_1k.jpg\",\"kind\":\"foliage\",\"bytes\":297877,\"description\":\"Oak bark base color texture (1k), ambientcg Bark (CC0) packaged by ez-tree (MIT). Tree3D trunks/branches sample it by default from the agent8 CDN (the only sanctioned external host); the bundled `incanto/assets` copy (see this entry’s `file`) serves it offline.\"},{\"name\":\"bark_oak_normal\",\"file\":\"vegetation/bark/oak_normal_1k.jpg\",\"url\":\"https://agent8-games.verse8.io/assets/3D/default/textures/vegetation/bark/oak_normal_1k.jpg\",\"kind\":\"foliage\",\"bytes\":67610,\"description\":\"Oak bark tangent-space normal texture (1k), ambientcg Bark (CC0) packaged by ez-tree (MIT). Tree3D trunks/branches sample it by default from the agent8 CDN (the only sanctioned external host); the bundled `incanto/assets` copy (see this entry’s `file`) serves it offline.\"},{\"name\":\"bark_oak_roughness\",\"file\":\"vegetation/bark/oak_roughness_1k.jpg\",\"url\":\"https://agent8-games.verse8.io/assets/3D/default/textures/vegetation/bark/oak_roughness_1k.jpg\",\"kind\":\"foliage\",\"bytes\":16648,\"description\":\"Oak bark roughness texture (1k), ambientcg Bark (CC0) packaged by ez-tree (MIT). Tree3D trunks/branches sample it by default from the agent8 CDN (the only sanctioned external host); the bundled `incanto/assets` copy (see this entry’s `file`) serves it offline.\"},{\"name\":\"bark_pine_color\",\"file\":\"vegetation/bark/pine_color_1k.jpg\",\"url\":\"https://agent8-games.verse8.io/assets/3D/default/textures/vegetation/bark/pine_color_1k.jpg\",\"kind\":\"foliage\",\"bytes\":196361,\"description\":\"Pine bark base color texture (1k), ambientcg Bark (CC0) packaged by ez-tree (MIT). Tree3D trunks/branches sample it by default from the agent8 CDN (the only sanctioned external host); the bundled `incanto/assets` copy (see this entry’s `file`) serves it offline.\"},{\"name\":\"bark_pine_normal\",\"file\":\"vegetation/bark/pine_normal_1k.jpg\",\"url\":\"https://agent8-games.verse8.io/assets/3D/default/textures/vegetation/bark/pine_normal_1k.jpg\",\"kind\":\"foliage\",\"bytes\":58237,\"description\":\"Pine bark tangent-space normal texture (1k), ambientcg Bark (CC0) packaged by ez-tree (MIT). Tree3D trunks/branches sample it by default from the agent8 CDN (the only sanctioned external host); the bundled `incanto/assets` copy (see this entry’s `file`) serves it offline.\"},{\"name\":\"bark_pine_roughness\",\"file\":\"vegetation/bark/pine_roughness_1k.jpg\",\"url\":\"https://agent8-games.verse8.io/assets/3D/default/textures/vegetation/bark/pine_roughness_1k.jpg\",\"kind\":\"foliage\",\"bytes\":36136,\"description\":\"Pine bark roughness texture (1k), ambientcg Bark (CC0) packaged by ez-tree (MIT). Tree3D trunks/branches sample it by default from the agent8 CDN (the only sanctioned external host); the bundled `incanto/assets` copy (see this entry’s `file`) serves it offline.\"},{\"name\":\"box\",\"file\":\"items/box.png\",\"url\":\"incanto/assets/items/box.png\",\"kind\":\"item\",\"bytes\":10861,\"description\":\"Item box sprite for Dungeons and Dungeoners. Container sprite that holds random items or rewards when opened by player.\"},{\"name\":\"buff_potion\",\"file\":\"items/buff_potion.png\",\"url\":\"incanto/assets/items/buff_potion.png\",\"kind\":\"item\",\"bytes\":3809,\"description\":\"Buff potion item sprite for Dungeons and Dungeoners. Consumable item that grants temporary stat boosts or positive effects to player character.\"},{\"name\":\"coin\",\"file\":\"items/coin.png\",\"url\":\"incanto/assets/items/coin.png\",\"kind\":\"item\",\"bytes\":1689,\"description\":\"Gold coin collectible sprite for Dungeons and Dungeoners. Currency item with metallic sheen, used as in-game money or collectible reward.\"},{\"name\":\"explosion\",\"file\":\"audio/explosion.mp3\",\"url\":\"incanto/assets/audio/explosion.mp3\",\"kind\":\"audio\",\"bytes\":40124,\"description\":\"Impactful explosion / large destructive hit SFX. Pair with the Particles2D \\\"explosion\\\" preset.\"},{\"name\":\"floor00\",\"file\":\"tiles/floor00.jpg\",\"url\":\"incanto/assets/tiles/floor00.jpg\",\"kind\":\"tile\",\"bytes\":28736,\"description\":\"Basic floor tile texture for Dungeons and Dungeoners project, suitable for dungeon ground surfaces.\"},{\"name\":\"gem\",\"file\":\"items/gem.png\",\"url\":\"incanto/assets/items/gem.png\",\"kind\":\"item\",\"bytes\":8762,\"description\":\"Gem collectible sprite for Dungeons and Dungeoners. Valuable gemstone item used as currency, crafting material, or quest objective.\"},{\"name\":\"ghost\",\"file\":\"characters/ghost.png\",\"url\":\"incanto/assets/characters/ghost.png\",\"kind\":\"character\",\"bytes\":22933,\"description\":\"Ghost character with translucent appearance sprite sheet image\",\"animation\":\"characters/ghost.json\",\"frameWidth\":112,\"frameHeight\":128},{\"name\":\"goblin\",\"file\":\"characters/goblin.png\",\"url\":\"incanto/assets/characters/goblin.png\",\"kind\":\"character\",\"bytes\":57994,\"description\":\"Medieval goblin with torch sprite sheet image\",\"animation\":\"characters/goblin.json\",\"frameWidth\":192,\"frameHeight\":192},{\"name\":\"gold\",\"file\":\"items/gold.png\",\"url\":\"incanto/assets/items/gold.png\",\"kind\":\"item\",\"bytes\":22313,\"description\":\"Gold item sprite for Dungeons and Dungeoners. Gold pile or gold bar sprite representing valuable currency or treasure reward.\"},{\"name\":\"gold-loot\",\"file\":\"audio/gold_loot.mp3\",\"url\":\"incanto/assets/audio/gold_loot.mp3\",\"kind\":\"audio\",\"bytes\":7506,\"description\":\"Metallic coin / gold pickup jingle — collecting currency.\"},{\"name\":\"ground_dirt\",\"file\":\"vegetation/ground/dirt_color.jpg\",\"url\":\"https://agent8-games.verse8.io/assets/3D/default/textures/vegetation/ground/dirt_color.jpg\",\"kind\":\"foliage\",\"bytes\":231383,\"description\":\"Dense dirt/gravel ground texture (1024px) from the ez-tree demo app (MIT) — the reference meadow ground. Terrain3D grassland themes tile it for slope + noise-patch dirt by default; also bundled in `incanto/assets` (see `file`) for offline use.\"},{\"name\":\"ground_dirt_normal\",\"file\":\"vegetation/ground/dirt_normal.jpg\",\"url\":\"https://agent8-games.verse8.io/assets/3D/default/textures/vegetation/ground/dirt_normal.jpg\",\"kind\":\"foliage\",\"bytes\":123478,\"description\":\"Dirt ground normal map (1024px) from the ez-tree demo app (MIT). Terrain3D grassland themes apply it across the whole ground band (demo parity); also bundled in `incanto/assets` (see `file`) for offline use.\"},{\"name\":\"ground_grass\",\"file\":\"vegetation/ground/grass.jpg\",\"url\":\"https://agent8-games.verse8.io/assets/3D/default/textures/vegetation/ground/grass.jpg\",\"kind\":\"foliage\",\"bytes\":322486,\"description\":\"Mossy meadow grass ground texture (1024px) from the ez-tree demo app (MIT). Terrain3D grassland themes (meadow/forest generators) tile it as the grass splat layer by default; also bundled in `incanto/assets` (see `file`) for offline use.\"},{\"name\":\"heal\",\"file\":\"audio/heal.mp3\",\"url\":\"incanto/assets/audio/heal.mp3\",\"kind\":\"audio\",\"bytes\":29764,\"description\":\"Soothing health-restore / heal spell SFX.\"},{\"name\":\"hit-metal-bang\",\"file\":\"audio/hit_metal_bang.mp3\",\"url\":\"incanto/assets/audio/hit_metal_bang.mp3\",\"kind\":\"audio\",\"bytes\":17972,\"description\":\"Metallic impact — hitting armor, metal, or a blocked attack.\"},{\"name\":\"hp_potion\",\"file\":\"items/hp_potion.png\",\"url\":\"incanto/assets/items/hp_potion.png\",\"kind\":\"item\",\"bytes\":3513,\"description\":\"Health potion item sprite for Dungeons and Dungeoners. Consumable healing item that restores player health points when used.\"},{\"name\":\"ice-spear\",\"file\":\"audio/ice_spear.mp3\",\"url\":\"incanto/assets/audio/ice_spear.mp3\",\"kind\":\"audio\",\"bytes\":21315,\"description\":\"Sharp piercing ice projectile fire SFX.\"},{\"name\":\"leaves_ash\",\"file\":\"vegetation/ash_color.png\",\"url\":\"https://agent8-games.verse8.io/assets/3D/default/textures/vegetation/ash_color.png\",\"kind\":\"foliage\",\"bytes\":181423,\"description\":\"Ash leaf-cluster alpha-cutout texture (1024px) from ez-tree by Dan Greenheck (MIT). Tree3D samples it for broadleaf/dead ash variants by default; copy it next to your game and set leafTexture to serve offline.\"},{\"name\":\"leaves_aspen\",\"file\":\"vegetation/aspen_color.png\",\"url\":\"https://agent8-games.verse8.io/assets/3D/default/textures/vegetation/aspen_color.png\",\"kind\":\"foliage\",\"bytes\":142116,\"description\":\"Aspen leaf-cluster alpha-cutout texture (1024px) from ez-tree by Dan Greenheck (MIT). Tree3D samples it for high-tier broadleaf aspen variants; copy + leafTexture for offline serving.\"},{\"name\":\"leaves_oak\",\"file\":\"vegetation/oak_color.png\",\"url\":\"https://agent8-games.verse8.io/assets/3D/default/textures/vegetation/oak_color.png\",\"kind\":\"foliage\",\"bytes\":238115,\"description\":\"Oak leaf-cluster alpha-cutout texture (1024px) from ez-tree by Dan Greenheck (MIT). Tree3D samples it for broadleaf oak variants by default; copy + leafTexture for offline serving.\"},{\"name\":\"leaves_pine\",\"file\":\"vegetation/pine_color.png\",\"url\":\"https://agent8-games.verse8.io/assets/3D/default/textures/vegetation/pine_color.png\",\"kind\":\"foliage\",\"bytes\":303684,\"description\":\"Pine needle-cluster alpha-cutout texture (1024px) from ez-tree by Dan Greenheck (MIT). Tree3D samples it for conifer variants by default; copy + leafTexture for offline serving.\"},{\"name\":\"locked_item_box\",\"file\":\"items/locked_item_box.png\",\"url\":\"incanto/assets/items/locked_item_box.png\",\"kind\":\"item\",\"bytes\":11074,\"description\":\"Locked item box sprite for Dungeons and Dungeoners. Container sprite requiring key or lockpick to open, containing valuable rewards.\"},{\"name\":\"map\",\"file\":\"items/map.png\",\"url\":\"incanto/assets/items/map.png\",\"kind\":\"item\",\"bytes\":3754,\"description\":\"Map item sprite for Dungeons and Dungeoners. Navigation item revealing dungeon layout or providing exploration assistance.\"},{\"name\":\"medieval-knight\",\"file\":\"characters/medieval-knight.png\",\"url\":\"incanto/assets/characters/medieval-knight.png\",\"kind\":\"character\",\"bytes\":84367,\"description\":\"Using a medieval-themed SD(Super Deformed) knight sprite sheet image, you can apply idle, move, and attack animations, among others.\",\"animation\":\"characters/medieval-knight.json\",\"frameWidth\":192,\"frameHeight\":192},{\"name\":\"minecraft-tiles\",\"file\":\"tiles/minecraft-tiles.png\",\"url\":\"incanto/assets/tiles/minecraft-tiles.png\",\"kind\":\"tile\",\"bytes\":10511,\"description\":\"Minecraft-themed tiles sprite sheet image\",\"frameWidth\":16,\"frameHeight\":16,\"columns\":5,\"tiles\":25},{\"name\":\"monster-died\",\"file\":\"audio/monster_died.mp3\",\"url\":\"incanto/assets/audio/monster_died.mp3\",\"kind\":\"audio\",\"bytes\":16836,\"description\":\"Enemy defeat / death SFX.\"},{\"name\":\"resurrection_potion\",\"file\":\"items/resurrection_potion.png\",\"url\":\"incanto/assets/items/resurrection_potion.png\",\"kind\":\"item\",\"bytes\":3471,\"description\":\"Resurrection potion item sprite for Dungeons and Dungeoners. Rare consumable that revives fallen party members or prevents death.\"},{\"name\":\"slash\",\"file\":\"audio/slash.mp3\",\"url\":\"incanto/assets/audio/slash.mp3\",\"kind\":\"audio\",\"bytes\":10425,\"description\":\"Quick sword swing / melee slash SFX.\"},{\"name\":\"smite\",\"file\":\"audio/smite.mp3\",\"url\":\"incanto/assets/audio/smite.mp3\",\"kind\":\"audio\",\"bytes\":12956,\"description\":\"Powerful holy downward-strike SFX.\"},{\"name\":\"spells-cast\",\"file\":\"audio/spells_cast.mp3\",\"url\":\"incanto/assets/audio/spells_cast.mp3\",\"kind\":\"audio\",\"bytes\":22151,\"description\":\"Generic magical spell-cast / chant SFX.\"},{\"name\":\"super_box\",\"file\":\"items/super_box.png\",\"url\":\"incanto/assets/items/super_box.png\",\"kind\":\"item\",\"bytes\":12184,\"description\":\"Super item box sprite for Dungeons and Dungeoners. Premium container sprite containing rare or powerful items and equipment.\"},{\"name\":\"swoosh\",\"file\":\"effects/swoosh.png\",\"url\":\"incanto/assets/effects/swoosh.png\",\"kind\":\"effect\",\"bytes\":2599,\"description\":\"Swoosh effect sprite for Dungeons and Dungeoners. Motion blur or attack trail effect used for melee attacks, sword slashes, or fast movement animations.\"},{\"name\":\"trap\",\"file\":\"items/trap.png\",\"url\":\"incanto/assets/items/trap.png\",\"kind\":\"item\",\"bytes\":3969,\"description\":\"Trap object sprite for Dungeons and Dungeoners. Hazard sprite that damages players when triggered in dungeon exploration.\"},{\"name\":\"ui-click\",\"file\":\"audio/ui_click.wav\",\"url\":\"incanto/assets/audio/ui_click.wav\",\"kind\":\"audio\",\"bytes\":17332,\"description\":\"Short tactile UI click for menus and buttons.\"},{\"name\":\"walk\",\"file\":\"audio/walk.mp3\",\"url\":\"incanto/assets/audio/walk.mp3\",\"kind\":\"audio\",\"bytes\":5642,\"description\":\"Single footstep SFX for character movement (loop or one-shot).\"},{\"name\":\"wall00\",\"file\":\"tiles/wall00.jpg\",\"url\":\"incanto/assets/tiles/wall00.jpg\",\"kind\":\"tile\",\"bytes\":44344,\"description\":\"Basic wall tile texture for Dungeons and Dungeoners project, suitable for dungeon vertical boundaries.\"},{\"name\":\"sky_gradient\",\"file\":\"backdrops/sky_gradient.png\",\"url\":\"incanto/assets/backdrops/sky_gradient.png\",\"kind\":\"backdrop\",\"bytes\":16239,\"description\":\"Equirectangular sky backdrop (1024x512 PNG, generated, CC0): blue zenith to pale horizon, a low sun disc at elevation 30 / azimuth 150 (the atmosphere defaults), dark ground below. For `environment.skybox` — a picture behind the scene, never a light source; keep `sky` or `preset` for lighting.\"}]");
2072
2072
  //#endregion
2073
2073
  //#region src/connections.ts
2074
2074
  function un(e) {
@@ -2542,15 +2542,15 @@ function Xn(e, t, n) {
2542
2542
  gravity: e
2543
2543
  };
2544
2544
  });
2545
- })), e.appendChild(Rr("environment")), Zn(e, t), e.appendChild(Rr("constants")), kr(e, t, n), e.appendChild(Rr("strings")), Mr(e, t, n), e.appendChild(Rr("draw order bands")), Or(e, t), e.appendChild(Rr("advanced"));
2545
+ })), e.appendChild(Rr("environment")), Zn(e, t, n), e.appendChild(Rr("constants")), kr(e, t, n), e.appendChild(Rr("strings")), Mr(e, t, n), e.appendChild(Rr("draw order bands")), Or(e, t), e.appendChild(Rr("advanced"));
2546
2546
  for (let n of Yn) e.appendChild(Yr(n, t.working[n], (e) => {
2547
2547
  t.mutate(() => {
2548
2548
  e === void 0 ? delete t.working[n] : t.working[n] = e;
2549
2549
  });
2550
2550
  }));
2551
2551
  }
2552
- function Zn(e, t) {
2553
- let n = t.working.environment ?? {}, r = (e) => {
2552
+ function Zn(e, t, n) {
2553
+ let r = t.working.environment ?? {}, i = (e) => {
2554
2554
  t.mutate(() => {
2555
2555
  let n = {
2556
2556
  ...t.working.environment ?? {},
@@ -2560,43 +2560,55 @@ function Zn(e, t) {
2560
2560
  Object.keys(n).length === 0 ? delete t.working.environment : t.working.environment = n;
2561
2561
  });
2562
2562
  };
2563
- e.appendChild(Qn("background", n.background ?? "", (e) => {
2564
- r({ background: e === "" ? void 0 : e });
2565
- })), e.appendChild(Qn("ambient color", n.ambient?.color ?? "", (e) => {
2563
+ e.appendChild(Qn("background", r.background ?? "", (e) => {
2564
+ i({ background: e === "" ? void 0 : e });
2565
+ })), e.appendChild(Qn("ambient color", r.ambient?.color ?? "", (e) => {
2566
2566
  let t = {
2567
- ...n.ambient,
2567
+ ...r.ambient,
2568
2568
  color: e === "" ? void 0 : e
2569
2569
  };
2570
- t.color === void 0 && delete t.color, r({ ambient: Object.keys(t).length ? t : void 0 });
2571
- })), e.appendChild(Kr("ambient power", n.ambient?.intensity ?? 0, (e) => {
2572
- r({ ambient: {
2573
- ...n.ambient,
2570
+ t.color === void 0 && delete t.color, i({ ambient: Object.keys(t).length ? t : void 0 });
2571
+ })), e.appendChild(Kr("ambient power", r.ambient?.intensity ?? 0, (e) => {
2572
+ i({ ambient: {
2573
+ ...r.ambient,
2574
2574
  intensity: e
2575
2575
  } });
2576
2576
  }));
2577
- let i = n.rendering ?? {}, a = (e) => {
2577
+ let a = r.rendering ?? {}, o = (e) => {
2578
2578
  let t = {
2579
- ...i,
2579
+ ...a,
2580
2580
  ...e
2581
2581
  };
2582
2582
  for (let e of Object.keys(t)) t[e] === void 0 && delete t[e];
2583
- r({ rendering: Object.keys(t).length ? t : void 0 });
2584
- }, o = document.createElement("input");
2585
- o.type = "checkbox", o.checked = i.antialias !== !1, o.addEventListener("change", () => {
2586
- a({ antialias: o.checked ? void 0 : !1 });
2587
- }), e.appendChild(B("antialias", o));
2588
- let s = document.createElement("select");
2583
+ i({ rendering: Object.keys(t).length ? t : void 0 });
2584
+ }, s = document.createElement("input");
2585
+ s.type = "checkbox", s.checked = a.antialias !== !1, s.addEventListener("change", () => {
2586
+ o({ antialias: s.checked ? void 0 : !1 });
2587
+ }), e.appendChild(B("antialias", s));
2588
+ let c = document.createElement("select");
2589
2589
  for (let [e, t] of [
2590
2590
  ["", "1 — soft hiDPI upscale (default)"],
2591
2591
  ["device", "device — crisp retina"],
2592
2592
  ["2", "2"]
2593
2593
  ]) {
2594
2594
  let n = document.createElement("option");
2595
- n.value = e, n.textContent = t, String(i.pixelRatio ?? "") === e && (n.selected = !0), s.appendChild(n);
2596
- }
2597
- s.addEventListener("change", () => {
2598
- a({ pixelRatio: s.value === "" ? void 0 : s.value === "device" ? "device" : Number(s.value) });
2599
- }), e.appendChild(B("pixel ratio", s));
2595
+ n.value = e, n.textContent = t, String(a.pixelRatio ?? "") === e && (n.selected = !0), c.appendChild(n);
2596
+ }
2597
+ c.addEventListener("change", () => {
2598
+ o({ pixelRatio: c.value === "" ? void 0 : c.value === "device" ? "device" : Number(c.value) });
2599
+ }), e.appendChild(B("pixel ratio", c));
2600
+ let l = typeof r.skybox == "string" ? r.skybox : "";
2601
+ e.appendChild(z("skybox image", l, br((e) => e.kind === "backdrop"), (e) => {
2602
+ i(e === "" ? { skybox: r.skybox === !0 ? !0 : void 0 } : { skybox: e });
2603
+ }, {
2604
+ placeholder: "sky_gradient.png · an equirect .jpg/.png (or .hdr) — a backdrop, not a light",
2605
+ library: {
2606
+ kind: "image",
2607
+ target: "skybox",
2608
+ shelf: ["3d", "textures"]
2609
+ },
2610
+ ctx: n
2611
+ }));
2600
2612
  }
2601
2613
  function Qn(e, t, n) {
2602
2614
  let r = document.createElement("div");
@@ -1,11 +1,11 @@
1
- import { et as diagnose, h as rebuildOptions, i as worldPosition, v as buildNodeJson } from "./pose-ByFB_J3O.js";
2
- import { P as translateOn, t as registerCoreNodes } from "./register-B768Qedj.js";
1
+ import { et as diagnose, h as rebuildOptions, i as worldPosition, v as buildNodeJson } from "./pose-O50uVW-j.js";
2
+ import { P as translateOn, t as registerCoreNodes } from "./register-CIDbUbFG.js";
3
3
  import { t as IncantoError } from "./errors-BpWbnbb_.js";
4
4
  import { t as Rng } from "./rng-CDOMybym.js";
5
5
  import { c as getNodeSchema, h as didYouMean, p as registerNode } from "./touch-CioTZB-y.js";
6
6
  import { t as createNoise2D } from "./noise-D3nPpmFg.js";
7
7
  import { i as ParticleSim, n as resolveFrames, o as PARTICLE_PRESET_NAMES, r as validateAnimations, s as applyParticlePreset, t as resolveAnimation } from "./sprite-animation-SQa5gIu2.js";
8
- import { $ as Water3D, Q as tolerateUnknownAction, V as effectRng, at as PhysicsBody3D, ct as Node3D, ft as colliderFootDrop, ht as buildSeaSpectrum, it as CharacterBody3D, mt as seaFftSupported, nt as rejectScale, ot as RigidBody3D, pt as SeaFft, rt as Area3D, st as StaticBody3D, tt as WaterCutout3D, vt as findHealth } from "./gameplay-Bfff_beb.js";
8
+ import { $ as Water3D, Q as tolerateUnknownAction, V as effectRng, at as PhysicsBody3D, ct as Node3D, ft as colliderFootDrop, ht as buildSeaSpectrum, it as CharacterBody3D, mt as seaFftSupported, nt as rejectScale, ot as RigidBody3D, pt as SeaFft, rt as Area3D, st as StaticBody3D, tt as WaterCutout3D, vt as findHealth } from "./gameplay-CplbZE7c.js";
9
9
  import { t as checkSheetGrid } from "./sheet-grid-Cea343VO.js";
10
10
  import { n as splatWeights, t as buildHeightmap } from "./heightmap-BYgD5Edk.js";
11
11
  import { AdditiveBlending, AnimationClip, AnimationMixer, Box3, BoxGeometry, BufferAttribute, BufferGeometry, CanvasTexture, CapsuleGeometry, ClampToEdgeWrapping, Color, ConeGeometry, CubeCamera, CylinderGeometry, DataTexture, DirectionalLight, DoubleSide, DynamicDrawUsage, Euler, Group, HalfFloatType, IcosahedronGeometry, ImageBitmapLoader, InstancedBufferAttribute, InstancedMesh, LinearFilter, LinearMipmapLinearFilter, LoopOnce, LoopRepeat, MathUtils, Matrix4, Mesh, MeshBasicMaterial, MeshDepthMaterial, MeshPhysicalMaterial, MeshStandardMaterial, NearestFilter, NoBlending, NoColorSpace, NormalBlending, PerspectiveCamera, PlaneGeometry, PointLight, Points, PointsMaterial, Quaternion, QuaternionKeyframeTrack, RGBADepthPacking, RGBAFormat, RepeatWrapping, SRGBColorSpace, ShaderChunk, ShaderMaterial, SphereGeometry, SpotLight, Texture, TextureLoader, UniformsLib, UniformsUtils, Vector3, Vector4, VectorKeyframeTrack, WebGLCubeRenderTarget } from "three";
@@ -1,5 +1,5 @@
1
1
  import { t as jsonClone } from "./json-CfTjpvW8.js";
2
- import { $ as Node, G as HudLayer, Z as requireNumber, at as Behavior, b as loadScene, d as duplicateNode, dt as registerBehavior, et as diagnose, g as rememberAuthoredPath, h as rebuildOptions, i as worldPosition, n as localFromWorld, o as SaveSlots, r as worldDirection, v as buildNodeJson, z as effectiveOrder } from "./pose-ByFB_J3O.js";
2
+ import { $ as Node, G as HudLayer, Z as requireNumber, at as Behavior, b as loadScene, d as duplicateNode, dt as registerBehavior, et as diagnose, g as rememberAuthoredPath, h as rebuildOptions, i as worldPosition, n as localFromWorld, o as SaveSlots, r as worldDirection, v as buildNodeJson, z as effectiveOrder } from "./pose-O50uVW-j.js";
3
3
  import { t as IncantoError } from "./errors-BpWbnbb_.js";
4
4
  import { t as Rng } from "./rng-CDOMybym.js";
5
5
  import { h as didYouMean } from "./touch-CioTZB-y.js";
package/dist/gameplay.js CHANGED
@@ -1,3 +1,3 @@
1
- import { i as worldPosition, n as localFromWorld, r as worldDirection } from "./pose-ByFB_J3O.js";
2
- import { A as Lifetime, B as FollowCamera, C as Pickup, D as Oscillate, E as PathFollow, F as Interactable, G as phaseOf, H as FloatAway, I as GroupCamera, J as Collector, K as DamageOnContact, L as GameFlow, M as Cooldown, N as hitStop, O as MoveTo, P as screenFlash, R as goToScene, S as PrefabShelf, T as Patrol, U as FaceTarget, W as DayNight, X as ChaseCamera, Y as Checkpoint, Z as Chase, _t as Health, a as Wander, b as SavePoint, c as ballisticPath, d as Sight, gt as Blast, i as WaveSpawner, j as CameraShake, k as Mount, l as maxRangeAim, n as registerGameplayBehaviors, o as Turret, q as Currency, r as ZombieAI, s as ballisticAim, t as GAMEPLAY_BEHAVIORS, u as Spawner, w as Phases, x as Projectile, y as ScoreKeeper, z as restartScene } from "./gameplay-Bfff_beb.js";
1
+ import { i as worldPosition, n as localFromWorld, r as worldDirection } from "./pose-O50uVW-j.js";
2
+ import { A as Lifetime, B as FollowCamera, C as Pickup, D as Oscillate, E as PathFollow, F as Interactable, G as phaseOf, H as FloatAway, I as GroupCamera, J as Collector, K as DamageOnContact, L as GameFlow, M as Cooldown, N as hitStop, O as MoveTo, P as screenFlash, R as goToScene, S as PrefabShelf, T as Patrol, U as FaceTarget, W as DayNight, X as ChaseCamera, Y as Checkpoint, Z as Chase, _t as Health, a as Wander, b as SavePoint, c as ballisticPath, d as Sight, gt as Blast, i as WaveSpawner, j as CameraShake, k as Mount, l as maxRangeAim, n as registerGameplayBehaviors, o as Turret, q as Currency, r as ZombieAI, s as ballisticAim, t as GAMEPLAY_BEHAVIORS, u as Spawner, w as Phases, x as Projectile, y as ScoreKeeper, z as restartScene } from "./gameplay-CplbZE7c.js";
3
3
  export { Blast, CameraShake, Chase, ChaseCamera, Checkpoint, Collector, Cooldown, Currency, DamageOnContact, DayNight, FaceTarget, FloatAway, FollowCamera, GAMEPLAY_BEHAVIORS, GameFlow, GroupCamera, Health, Interactable, Lifetime, Mount, MoveTo, Oscillate, PathFollow, Patrol, Phases, Pickup, PrefabShelf, Projectile, SavePoint, ScoreKeeper, Sight, Spawner, Turret, Wander, WaveSpawner, ZombieAI, ballisticAim, ballisticPath, goToScene, hitStop, localFromWorld, maxRangeAim, phaseOf, registerGameplayBehaviors, restartScene, screenFlash, worldDirection, worldPosition };
package/dist/index.js CHANGED
@@ -1,9 +1,9 @@
1
1
  import { n as jsonEquals, r as jsonKind, t as jsonClone } from "./json-CfTjpvW8.js";
2
- import { $ as Node, A as isConstRef, B as resolveOrderGroups, C as serializeNode, F as SceneTree, G as HudLayer, I as createSaveStore, J as UiBanner, M as computeViewport, N as resolveViewport, P as newUid, R as ORDER_GROUP_BASE, S as Scene, V as InputMap, X as UiText, Y as UiBar, at as Behavior, b as loadScene, c as captureBehaviors, ct as behaviorSignals, d as duplicateNode, dt as registerBehavior, ft as registeredBehaviors, it as parseNodePath, j as resolveConstants, k as CONST_REF_KEY, l as restoreBehaviors, lt as clearBehaviors, nt as nodeRefWarnings, o as SaveSlots, pt as Signal, rt as resolveRefInJson, s as behaviorsWithoutSave, st as behaviorSchema, tt as describeRefProblem, u as savesWithoutUid, ut as getBehavior, w as SCENE_FORMAT, z as effectiveOrder } from "./pose-ByFB_J3O.js";
3
- import { A as BASE_LOCALE, B as spatialPan, D as suggestQuality, E as readDeviceHints, F as translationKey, G as MusicManager, H as SFX_PRESET_NAMES, I as SfxEngine, J as fadeGain, K as WebAudioMusicBackend, L as isAudioContextAvailable, M as T_PREFIX, N as suggestLocale, O as LogManager, R as ROLLOFF_MODELS, S as Settings, U as sfxDuration, V as SFX_PRESETS, W as synthSfx, Y as AudioBuses, _ as UiButton, a as UiImage, b as Engine, c as UiPanel, d as UiSelect, f as UiSlider, g as Respawn, h as Timer, i as UiFrameCapSelect, j as Localization, k as EffectLog, l as UiQualitySelect, m as UiVolumeSlider, n as UiWaypoint, o as UiLanguageSelect, p as UiToggle, q as crossfadeGains, r as UiMinimap, s as UiMuteToggle, t as registerCoreNodes, u as UiRenderScaleSelect, v as UiDialogue, w as qualityEnvironment, y as AudioPlayer, z as spatialGain } from "./register-B768Qedj.js";
2
+ import { $ as Node, A as isConstRef, B as resolveOrderGroups, C as serializeNode, F as SceneTree, G as HudLayer, I as createSaveStore, J as UiBanner, M as computeViewport, N as resolveViewport, P as newUid, R as ORDER_GROUP_BASE, S as Scene, V as InputMap, X as UiText, Y as UiBar, at as Behavior, b as loadScene, c as captureBehaviors, ct as behaviorSignals, d as duplicateNode, dt as registerBehavior, ft as registeredBehaviors, it as parseNodePath, j as resolveConstants, k as CONST_REF_KEY, l as restoreBehaviors, lt as clearBehaviors, nt as nodeRefWarnings, o as SaveSlots, pt as Signal, rt as resolveRefInJson, s as behaviorsWithoutSave, st as behaviorSchema, tt as describeRefProblem, u as savesWithoutUid, ut as getBehavior, w as SCENE_FORMAT, z as effectiveOrder } from "./pose-O50uVW-j.js";
3
+ import { A as BASE_LOCALE, B as spatialPan, D as suggestQuality, E as readDeviceHints, F as translationKey, G as MusicManager, H as SFX_PRESET_NAMES, I as SfxEngine, J as fadeGain, K as WebAudioMusicBackend, L as isAudioContextAvailable, M as T_PREFIX, N as suggestLocale, O as LogManager, R as ROLLOFF_MODELS, S as Settings, U as sfxDuration, V as SFX_PRESETS, W as synthSfx, Y as AudioBuses, _ as UiButton, a as UiImage, b as Engine, c as UiPanel, d as UiSelect, f as UiSlider, g as Respawn, h as Timer, i as UiFrameCapSelect, j as Localization, k as EffectLog, l as UiQualitySelect, m as UiVolumeSlider, n as UiWaypoint, o as UiLanguageSelect, p as UiToggle, q as crossfadeGains, r as UiMinimap, s as UiMuteToggle, t as registerCoreNodes, u as UiRenderScaleSelect, v as UiDialogue, w as qualityEnvironment, y as AudioPlayer, z as spatialGain } from "./register-CIDbUbFG.js";
4
4
  import { t as IncantoError } from "./errors-BpWbnbb_.js";
5
5
  import { t as Rng } from "./rng-CDOMybym.js";
6
- import { n as startRecording, r as auditScene, t as replay } from "./replay-DrqQ6dZj.js";
6
+ import { n as startRecording, r as auditScene, t as replay } from "./replay-CooHM9lL.js";
7
7
  import { c as getNodeSchema, f as mergeStaticSignals, i as joystickVector, l as getNodeSignals, m as registeredTypes, n as attachTouchControls, o as clearRegistry, p as registerNode, s as createNode, t as TouchControls, u as getNodeType } from "./touch-CioTZB-y.js";
8
8
  import { t as showBootFailure } from "./boot-failure-CKYrEcGF.js";
9
9
  import { a as logText, i as logReport, o as parseDrive, r as resolveRendering, t as isWebGLAvailable } from "./webgl-unavailable-C8aDbGmR.js";
package/dist/net.js CHANGED
@@ -1,3 +1,3 @@
1
- import { n as createAgent8Server } from "./agent8-B-bh3n0X.js";
2
- import { a as NetworkManager, d as createLocalGameServer, f as LoopbackHub, l as LocalGameServer, n as registerNodesNet, o as applySyncPatch, p as LoopbackTransport, r as NetworkSpawner, t as createSplitScreen, u as LocalGameServerTransport } from "./split-screen-B-dIcQsQ.js";
1
+ import { n as createAgent8Server } from "./agent8---rIaJ3j.js";
2
+ import { a as NetworkManager, d as createLocalGameServer, f as LoopbackHub, l as LocalGameServer, n as registerNodesNet, o as applySyncPatch, p as LoopbackTransport, r as NetworkSpawner, t as createSplitScreen, u as LocalGameServerTransport } from "./split-screen-BRbSkBMO.js";
3
3
  export { LocalGameServer, LocalGameServerTransport, LoopbackHub, LoopbackTransport, NetworkManager, NetworkSpawner, applySyncPatch, createAgent8Server, createLocalGameServer, createSplitScreen, registerNodesNet };
@@ -1,10 +1,10 @@
1
1
  import { o as __exportAll } from "./json-CfTjpvW8.js";
2
- import { et as diagnose } from "./pose-ByFB_J3O.js";
2
+ import { et as diagnose } from "./pose-O50uVW-j.js";
3
3
  import { t as IncantoError } from "./errors-BpWbnbb_.js";
4
- import { _ as Node2D, f as Area2D, g as StaticBody2D, h as RigidBody2D, m as PhysicsBody2D, p as CharacterBody2D, v as validateCollider2D } from "./gameplay-Bfff_beb.js";
4
+ import { _ as Node2D, f as Area2D, g as StaticBody2D, h as RigidBody2D, m as PhysicsBody2D, p as CharacterBody2D, v as validateCollider2D } from "./gameplay-CplbZE7c.js";
5
5
  import { n as registerDebugSource } from "./debug-draw-BM3DsvtT.js";
6
6
  import { n as jointContacts, t as withoutRapierInitNoise } from "./quiet-rapier-C6fW4zcW.js";
7
- import { p as Joint2D } from "./register-7E3P1gz6.js";
7
+ import { p as Joint2D } from "./register-l4ZWcLwD.js";
8
8
  //#region src/2d/physics/physics-2d.ts
9
9
  var physics_2d_exports = /* @__PURE__ */ __exportAll({
10
10
  Physics2D: () => Physics2D,
@@ -1,10 +1,10 @@
1
1
  import { o as __exportAll } from "./json-CfTjpvW8.js";
2
- import { et as diagnose } from "./pose-ByFB_J3O.js";
2
+ import { et as diagnose } from "./pose-O50uVW-j.js";
3
3
  import { t as IncantoError } from "./errors-BpWbnbb_.js";
4
- import { $ as Water3D, at as PhysicsBody3D, ct as Node3D, it as CharacterBody3D, lt as validateCollider3D, ot as RigidBody3D, rt as Area3D, st as StaticBody3D } from "./gameplay-Bfff_beb.js";
4
+ import { $ as Water3D, at as PhysicsBody3D, ct as Node3D, it as CharacterBody3D, lt as validateCollider3D, ot as RigidBody3D, rt as Area3D, st as StaticBody3D } from "./gameplay-CplbZE7c.js";
5
5
  import { n as registerDebugSource } from "./debug-draw-BM3DsvtT.js";
6
6
  import { n as jointContacts, t as withoutRapierInitNoise } from "./quiet-rapier-C6fW4zcW.js";
7
- import { B as InstancedMesh3D, F as Terrain3D, H as buildMeshGeometry, z as Joint3D } from "./environment-presets-e_9YCnGu.js";
7
+ import { B as InstancedMesh3D, F as Terrain3D, H as buildMeshGeometry, z as Joint3D } from "./environment-presets-fGpZHUab.js";
8
8
  import { Euler, Matrix4, Quaternion, Vector3 } from "three";
9
9
  //#region src/3d/physics/collider-lines.ts
10
10
  /**
@@ -1,5 +1,5 @@
1
- import { i as worldPosition } from "./pose-ByFB_J3O.js";
2
- import { y as AudioPlayer } from "./register-B768Qedj.js";
1
+ import { i as worldPosition } from "./pose-O50uVW-j.js";
2
+ import { y as AudioPlayer } from "./register-CIDbUbFG.js";
3
3
  import { i as logReport, o as parseDrive } from "./webgl-unavailable-C8aDbGmR.js";
4
4
  import { a as frameSignature, i as frameImage, o as frameStats } from "./frame-report-D-_7YF2G.js";
5
5
  //#region src/core/audio-errors.ts