@zylem/game-lib 0.5.0 → 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +23 -41
- package/dist/actions.d.ts +25 -0
- package/dist/actions.js +287 -8
- package/dist/actions.js.map +1 -0
- package/dist/behaviors.d.ts +108 -0
- package/dist/behaviors.js +396 -6
- package/dist/behaviors.js.map +1 -0
- package/dist/{src/lib/camera/zylem-camera.d.ts → camera-Dk-fOVZE.d.ts} +55 -8
- package/dist/camera.d.ts +5 -0
- package/dist/camera.js +504 -4
- package/dist/camera.js.map +1 -0
- package/dist/core-C2mjetAd.d.ts +431 -0
- package/dist/core.d.ts +9 -0
- package/dist/core.js +4780 -9
- package/dist/core.js.map +1 -0
- package/dist/entities.d.ts +269 -0
- package/dist/entities.js +2161 -17
- package/dist/entities.js.map +1 -0
- package/dist/entity-bQElAdpo.d.ts +347 -0
- package/dist/entity-spawner-DNnLYnZq.d.ts +11 -0
- package/dist/main.d.ts +135 -0
- package/dist/main.js +6599 -56
- package/dist/main.js.map +1 -0
- package/dist/moveable-B_vyA6cw.d.ts +67 -0
- package/dist/stage-CrmY7V0i.d.ts +287 -0
- package/dist/stage.d.ts +26 -0
- package/dist/stage.js +2229 -4
- package/dist/stage.js.map +1 -0
- package/dist/transformable-CUhvyuYO.d.ts +67 -0
- package/package.json +9 -45
- package/LICENSE +0 -21
- package/dist/.vite/manifest.json +0 -716
- package/dist/assets/zylem-logo.png +0 -0
- package/dist/examples/00-readme-example.d.ts +0 -2
- package/dist/examples/00-readme-example.d.ts.map +0 -1
- package/dist/examples/01-basic.d.ts +0 -2
- package/dist/examples/01-basic.d.ts.map +0 -1
- package/dist/examples/01.1-basic-ball.d.ts +0 -9
- package/dist/examples/01.1-basic-ball.d.ts.map +0 -1
- package/dist/examples/01.2-ricochet-test.d.ts +0 -2
- package/dist/examples/01.2-ricochet-test.d.ts.map +0 -1
- package/dist/examples/01.3-rect.d.ts +0 -2
- package/dist/examples/01.3-rect.d.ts.map +0 -1
- package/dist/examples/02-input.d.ts +0 -2
- package/dist/examples/02-input.d.ts.map +0 -1
- package/dist/examples/03-stage-test/03-stage-test.d.ts +0 -2
- package/dist/examples/03-stage-test/03-stage-test.d.ts.map +0 -1
- package/dist/examples/03-stage-test/stage0.d.ts +0 -2
- package/dist/examples/03-stage-test/stage0.d.ts.map +0 -1
- package/dist/examples/03-stage-test/stage1.d.ts +0 -2
- package/dist/examples/03-stage-test/stage1.d.ts.map +0 -1
- package/dist/examples/03-stage-test/stage2.d.ts +0 -2
- package/dist/examples/03-stage-test/stage2.d.ts.map +0 -1
- package/dist/examples/03-stage-test/stage3.d.ts +0 -2
- package/dist/examples/03-stage-test/stage3.d.ts.map +0 -1
- package/dist/examples/03.1-stage-variable.d.ts +0 -2
- package/dist/examples/03.1-stage-variable.d.ts.map +0 -1
- package/dist/examples/04-vessel-test.d.ts +0 -18
- package/dist/examples/04-vessel-test.d.ts.map +0 -1
- package/dist/examples/05-camera-test.d.ts +0 -2
- package/dist/examples/05-camera-test.d.ts.map +0 -1
- package/dist/examples/06-entity-test.d.ts +0 -2
- package/dist/examples/06-entity-test.d.ts.map +0 -1
- package/dist/examples/07-behaviors.d.ts +0 -2
- package/dist/examples/07-behaviors.d.ts.map +0 -1
- package/dist/examples/07.01-behavior-context.d.ts +0 -2
- package/dist/examples/07.01-behavior-context.d.ts.map +0 -1
- package/dist/examples/08-pong.d.ts +0 -2
- package/dist/examples/08-pong.d.ts.map +0 -1
- package/dist/examples/08.01-breakout.d.ts +0 -2
- package/dist/examples/08.01-breakout.d.ts.map +0 -1
- package/dist/examples/09-space-invaders.d.ts +0 -2
- package/dist/examples/09-space-invaders.d.ts.map +0 -1
- package/dist/examples/10-asteroids.d.ts +0 -2
- package/dist/examples/10-asteroids.d.ts.map +0 -1
- package/dist/examples/11-2d-platformer.d.ts +0 -2
- package/dist/examples/11-2d-platformer.d.ts.map +0 -1
- package/dist/examples/12-3d-platformer.d.ts +0 -2
- package/dist/examples/12-3d-platformer.d.ts.map +0 -1
- package/dist/examples/13-fps.d.ts +0 -2
- package/dist/examples/13-fps.d.ts.map +0 -1
- package/dist/examples/14-strategy.d.ts +0 -2
- package/dist/examples/14-strategy.d.ts.map +0 -1
- package/dist/examples/15-zylem-planet-demo.d.ts +0 -2
- package/dist/examples/15-zylem-planet-demo.d.ts.map +0 -1
- package/dist/examples/16-timbotron.d.ts +0 -2
- package/dist/examples/16-timbotron.d.ts.map +0 -1
- package/dist/examples/17-stress-test.d.ts +0 -2
- package/dist/examples/17-stress-test.d.ts.map +0 -1
- package/dist/examples/architecture-test.d.ts +0 -2
- package/dist/examples/architecture-test.d.ts.map +0 -1
- package/dist/examples/utils.d.ts +0 -10
- package/dist/examples/utils.d.ts.map +0 -1
- package/dist/lib/actions/behaviors/actions.js +0 -35
- package/dist/lib/actions/behaviors/boundaries/boundary.js +0 -40
- package/dist/lib/actions/behaviors/ricochet/ricochet-2d-collision.js +0 -100
- package/dist/lib/actions/behaviors/ricochet/ricochet-2d-in-bounds.js +0 -37
- package/dist/lib/actions/behaviors/ricochet/ricochet.js +0 -6
- package/dist/lib/actions/capabilities/moveable.js +0 -108
- package/dist/lib/actions/capabilities/rotatable.js +0 -82
- package/dist/lib/actions/capabilities/transformable.js +0 -9
- package/dist/lib/actions/global-change.js +0 -40
- package/dist/lib/camera/camera.js +0 -19
- package/dist/lib/camera/fixed-2d.js +0 -30
- package/dist/lib/camera/perspective.js +0 -10
- package/dist/lib/camera/third-person.js +0 -42
- package/dist/lib/camera/zylem-camera.js +0 -208
- package/dist/lib/collision/collision-builder.js +0 -46
- package/dist/lib/collision/collision-delegate.js +0 -6
- package/dist/lib/collision/utils.js +0 -24
- package/dist/lib/collision/world.js +0 -77
- package/dist/lib/core/base-node.js +0 -61
- package/dist/lib/core/entity-asset-loader.js +0 -54
- package/dist/lib/core/lifecycle-base.js +0 -20
- package/dist/lib/core/preset-shader.js +0 -26
- package/dist/lib/core/three-addons/Timer.js +0 -103
- package/dist/lib/core/utility/nodes.js +0 -31
- package/dist/lib/core/utility/strings.js +0 -14
- package/dist/lib/core/utility/vector.js +0 -8
- package/dist/lib/core/vessel.js +0 -26
- package/dist/lib/debug/console/console-state.js +0 -11
- package/dist/lib/debug/debug-state.js +0 -40
- package/dist/lib/device/aspect-ratio.js +0 -44
- package/dist/lib/entities/actor.js +0 -122
- package/dist/lib/entities/box.js +0 -68
- package/dist/lib/entities/builder.js +0 -79
- package/dist/lib/entities/create.js +0 -31
- package/dist/lib/entities/delegates/animation.js +0 -58
- package/dist/lib/entities/delegates/debug.js +0 -71
- package/dist/lib/entities/delegates/loader.js +0 -19
- package/dist/lib/entities/destroy.js +0 -15
- package/dist/lib/entities/entity-factory.js +0 -24
- package/dist/lib/entities/entity.js +0 -121
- package/dist/lib/entities/plane.js +0 -81
- package/dist/lib/entities/rect.js +0 -160
- package/dist/lib/entities/sphere.js +0 -68
- package/dist/lib/entities/sprite.js +0 -125
- package/dist/lib/entities/text.js +0 -140
- package/dist/lib/entities/zone.js +0 -103
- package/dist/lib/game/game-canvas.js +0 -57
- package/dist/lib/game/game-config.js +0 -78
- package/dist/lib/game/game-default.js +0 -23
- package/dist/lib/game/game-retro-resolutions.js +0 -80
- package/dist/lib/game/game-state.js +0 -17
- package/dist/lib/game/game.js +0 -131
- package/dist/lib/game/zylem-game.js +0 -140
- package/dist/lib/graphics/geometries/XZPlaneGeometry.js +0 -34
- package/dist/lib/graphics/material.js +0 -64
- package/dist/lib/graphics/mesh.js +0 -14
- package/dist/lib/graphics/render-pass.js +0 -56
- package/dist/lib/graphics/shaders/fragment/debug.glsl.js +0 -23
- package/dist/lib/graphics/shaders/fragment/fire.glsl.js +0 -52
- package/dist/lib/graphics/shaders/fragment/standard.glsl.js +0 -11
- package/dist/lib/graphics/shaders/fragment/stars.glsl.js +0 -44
- package/dist/lib/graphics/shaders/vertex/debug.glsl.js +0 -15
- package/dist/lib/graphics/shaders/vertex/object-shader.glsl.js +0 -11
- package/dist/lib/graphics/shaders/vertex/standard.glsl.js +0 -9
- package/dist/lib/graphics/zylem-scene.js +0 -75
- package/dist/lib/input/gamepad-provider.js +0 -58
- package/dist/lib/input/input-manager.js +0 -70
- package/dist/lib/input/keyboard-provider.js +0 -120
- package/dist/lib/stage/debug-entity-cursor.js +0 -53
- package/dist/lib/stage/entity-spawner.js +0 -27
- package/dist/lib/stage/stage-debug-delegate.js +0 -100
- package/dist/lib/stage/stage-default.js +0 -32
- package/dist/lib/stage/stage-factory.js +0 -22
- package/dist/lib/stage/stage-manager.js +0 -49
- package/dist/lib/stage/stage-state.js +0 -36
- package/dist/lib/stage/stage.js +0 -67
- package/dist/lib/stage/zylem-stage.js +0 -268
- package/dist/lib/systems/transformable.system.js +0 -43
- package/dist/node_modules/.pnpm/idb-keyval@6.2.2/node_modules/idb-keyval/dist/index.js +0 -34
- package/dist/node_modules/.pnpm/msgpackr@1.11.5/node_modules/msgpackr/pack.js +0 -520
- package/dist/node_modules/.pnpm/msgpackr@1.11.5/node_modules/msgpackr/unpack.js +0 -672
- package/dist/src/api/actions.d.ts +0 -5
- package/dist/src/api/actions.d.ts.map +0 -1
- package/dist/src/api/behaviors.d.ts +0 -4
- package/dist/src/api/behaviors.d.ts.map +0 -1
- package/dist/src/api/camera.d.ts +0 -4
- package/dist/src/api/camera.d.ts.map +0 -1
- package/dist/src/api/core.d.ts +0 -6
- package/dist/src/api/core.d.ts.map +0 -1
- package/dist/src/api/entities.d.ts +0 -9
- package/dist/src/api/entities.d.ts.map +0 -1
- package/dist/src/api/main.d.ts +0 -32
- package/dist/src/api/main.d.ts.map +0 -1
- package/dist/src/api/stage.d.ts +0 -5
- package/dist/src/api/stage.d.ts.map +0 -1
- package/dist/src/lib/actions/behaviors/actions.d.ts +0 -11
- package/dist/src/lib/actions/behaviors/actions.d.ts.map +0 -1
- package/dist/src/lib/actions/behaviors/behavior.d.ts +0 -6
- package/dist/src/lib/actions/behaviors/behavior.d.ts.map +0 -1
- package/dist/src/lib/actions/behaviors/boundaries/boundary.d.ts +0 -37
- package/dist/src/lib/actions/behaviors/boundaries/boundary.d.ts.map +0 -1
- package/dist/src/lib/actions/behaviors/character-controller.d.ts +0 -6
- package/dist/src/lib/actions/behaviors/character-controller.d.ts.map +0 -1
- package/dist/src/lib/actions/behaviors/debug/debug-collision.d.ts +0 -6
- package/dist/src/lib/actions/behaviors/debug/debug-collision.d.ts.map +0 -1
- package/dist/src/lib/actions/behaviors/debug/debug-update.d.ts +0 -5
- package/dist/src/lib/actions/behaviors/debug/debug-update.d.ts.map +0 -1
- package/dist/src/lib/actions/behaviors/debug/debug.d.ts +0 -10
- package/dist/src/lib/actions/behaviors/debug/debug.d.ts.map +0 -1
- package/dist/src/lib/actions/behaviors/movement/movement-sequence-2d.d.ts +0 -24
- package/dist/src/lib/actions/behaviors/movement/movement-sequence-2d.d.ts.map +0 -1
- package/dist/src/lib/actions/behaviors/ricochet/ricochet-2d-collision.d.ts +0 -11
- package/dist/src/lib/actions/behaviors/ricochet/ricochet-2d-collision.d.ts.map +0 -1
- package/dist/src/lib/actions/behaviors/ricochet/ricochet-2d-in-bounds.d.ts +0 -12
- package/dist/src/lib/actions/behaviors/ricochet/ricochet-2d-in-bounds.d.ts.map +0 -1
- package/dist/src/lib/actions/behaviors/ricochet/ricochet.d.ts +0 -44
- package/dist/src/lib/actions/behaviors/ricochet/ricochet.d.ts.map +0 -1
- package/dist/src/lib/actions/behaviors/zylem-behavior.d.ts +0 -2
- package/dist/src/lib/actions/behaviors/zylem-behavior.d.ts.map +0 -1
- package/dist/src/lib/actions/capabilities/moveable.d.ts +0 -125
- package/dist/src/lib/actions/capabilities/moveable.d.ts.map +0 -1
- package/dist/src/lib/actions/capabilities/rotatable.d.ts +0 -111
- package/dist/src/lib/actions/capabilities/rotatable.d.ts.map +0 -1
- package/dist/src/lib/actions/capabilities/transformable.d.ts +0 -7
- package/dist/src/lib/actions/capabilities/transformable.d.ts.map +0 -1
- package/dist/src/lib/actions/global-change.d.ts +0 -23
- package/dist/src/lib/actions/global-change.d.ts.map +0 -1
- package/dist/src/lib/camera/camera.d.ts +0 -16
- package/dist/src/lib/camera/camera.d.ts.map +0 -1
- package/dist/src/lib/camera/fixed-2d.d.ts +0 -32
- package/dist/src/lib/camera/fixed-2d.d.ts.map +0 -1
- package/dist/src/lib/camera/perspective.d.ts +0 -9
- package/dist/src/lib/camera/perspective.d.ts.map +0 -1
- package/dist/src/lib/camera/third-person.d.ts +0 -32
- package/dist/src/lib/camera/third-person.d.ts.map +0 -1
- package/dist/src/lib/camera/zylem-camera.d.ts.map +0 -1
- package/dist/src/lib/collision/collision-builder.d.ts +0 -17
- package/dist/src/lib/collision/collision-builder.d.ts.map +0 -1
- package/dist/src/lib/collision/collision-delegate.d.ts +0 -6
- package/dist/src/lib/collision/collision-delegate.d.ts.map +0 -1
- package/dist/src/lib/collision/collision-group.d.ts +0 -11
- package/dist/src/lib/collision/collision-group.d.ts.map +0 -1
- package/dist/src/lib/collision/collision-mask.d.ts +0 -18
- package/dist/src/lib/collision/collision-mask.d.ts.map +0 -1
- package/dist/src/lib/collision/collision.d.ts +0 -19
- package/dist/src/lib/collision/collision.d.ts.map +0 -1
- package/dist/src/lib/collision/utils.d.ts +0 -15
- package/dist/src/lib/collision/utils.d.ts.map +0 -1
- package/dist/src/lib/collision/world.d.ts +0 -23
- package/dist/src/lib/collision/world.d.ts.map +0 -1
- package/dist/src/lib/core/asset-manager.d.ts +0 -2
- package/dist/src/lib/core/asset-manager.d.ts.map +0 -1
- package/dist/src/lib/core/base-node-life-cycle.d.ts +0 -54
- package/dist/src/lib/core/base-node-life-cycle.d.ts.map +0 -1
- package/dist/src/lib/core/base-node.d.ts +0 -36
- package/dist/src/lib/core/base-node.d.ts.map +0 -1
- package/dist/src/lib/core/blueprints.d.ts +0 -22
- package/dist/src/lib/core/blueprints.d.ts.map +0 -1
- package/dist/src/lib/core/entity-asset-loader.d.ts +0 -16
- package/dist/src/lib/core/entity-asset-loader.d.ts.map +0 -1
- package/dist/src/lib/core/errors.d.ts +0 -5
- package/dist/src/lib/core/errors.d.ts.map +0 -1
- package/dist/src/lib/core/flags.d.ts +0 -3
- package/dist/src/lib/core/flags.d.ts.map +0 -1
- package/dist/src/lib/core/index.d.ts +0 -5
- package/dist/src/lib/core/index.d.ts.map +0 -1
- package/dist/src/lib/core/interfaces.d.ts +0 -25
- package/dist/src/lib/core/interfaces.d.ts.map +0 -1
- package/dist/src/lib/core/lazy-loader.d.ts +0 -80
- package/dist/src/lib/core/lazy-loader.d.ts.map +0 -1
- package/dist/src/lib/core/lifecycle-base.d.ts +0 -17
- package/dist/src/lib/core/lifecycle-base.d.ts.map +0 -1
- package/dist/src/lib/core/node-interface.d.ts +0 -12
- package/dist/src/lib/core/node-interface.d.ts.map +0 -1
- package/dist/src/lib/core/preset-shader.d.ts +0 -8
- package/dist/src/lib/core/preset-shader.d.ts.map +0 -1
- package/dist/src/lib/core/three-addons/Timer.d.ts +0 -92
- package/dist/src/lib/core/three-addons/Timer.d.ts.map +0 -1
- package/dist/src/lib/core/utility/nodes.d.ts +0 -13
- package/dist/src/lib/core/utility/nodes.d.ts.map +0 -1
- package/dist/src/lib/core/utility/strings.d.ts +0 -3
- package/dist/src/lib/core/utility/strings.d.ts.map +0 -1
- package/dist/src/lib/core/utility/vector.d.ts +0 -8
- package/dist/src/lib/core/utility/vector.d.ts.map +0 -1
- package/dist/src/lib/core/vector.d.ts +0 -4
- package/dist/src/lib/core/vector.d.ts.map +0 -1
- package/dist/src/lib/core/vessel.d.ts +0 -13
- package/dist/src/lib/core/vessel.d.ts.map +0 -1
- package/dist/src/lib/debug/console/console-state.d.ts +0 -20
- package/dist/src/lib/debug/console/console-state.d.ts.map +0 -1
- package/dist/src/lib/debug/console/console-store.d.ts +0 -6
- package/dist/src/lib/debug/console/console-store.d.ts.map +0 -1
- package/dist/src/lib/debug/debug-state.d.ts +0 -38
- package/dist/src/lib/debug/debug-state.d.ts.map +0 -1
- package/dist/src/lib/debug/debug-store.d.ts +0 -15
- package/dist/src/lib/debug/debug-store.d.ts.map +0 -1
- package/dist/src/lib/debug/state-based-debug-loader.d.ts +0 -8
- package/dist/src/lib/debug/state-based-debug-loader.d.ts.map +0 -1
- package/dist/src/lib/device/aspect-ratio.d.ts +0 -38
- package/dist/src/lib/device/aspect-ratio.d.ts.map +0 -1
- package/dist/src/lib/device/desktop.d.ts +0 -2
- package/dist/src/lib/device/desktop.d.ts.map +0 -1
- package/dist/src/lib/device/mobile.d.ts +0 -2
- package/dist/src/lib/device/mobile.d.ts.map +0 -1
- package/dist/src/lib/device/tablet.d.ts +0 -2
- package/dist/src/lib/device/tablet.d.ts.map +0 -1
- package/dist/src/lib/entities/actor.d.ts +0 -44
- package/dist/src/lib/entities/actor.d.ts.map +0 -1
- package/dist/src/lib/entities/box.d.ts +0 -27
- package/dist/src/lib/entities/box.d.ts.map +0 -1
- package/dist/src/lib/entities/builder.d.ts +0 -28
- package/dist/src/lib/entities/builder.d.ts.map +0 -1
- package/dist/src/lib/entities/create.d.ts +0 -15
- package/dist/src/lib/entities/create.d.ts.map +0 -1
- package/dist/src/lib/entities/delegates/animation.d.ts +0 -33
- package/dist/src/lib/entities/delegates/animation.d.ts.map +0 -1
- package/dist/src/lib/entities/delegates/debug.d.ts +0 -29
- package/dist/src/lib/entities/delegates/debug.d.ts.map +0 -1
- package/dist/src/lib/entities/delegates/loader.d.ts +0 -12
- package/dist/src/lib/entities/delegates/loader.d.ts.map +0 -1
- package/dist/src/lib/entities/destroy.d.ts +0 -4
- package/dist/src/lib/entities/destroy.d.ts.map +0 -1
- package/dist/src/lib/entities/entity-factory.d.ts +0 -10
- package/dist/src/lib/entities/entity-factory.d.ts.map +0 -1
- package/dist/src/lib/entities/entity.d.ts +0 -98
- package/dist/src/lib/entities/entity.d.ts.map +0 -1
- package/dist/src/lib/entities/index.d.ts +0 -12
- package/dist/src/lib/entities/index.d.ts.map +0 -1
- package/dist/src/lib/entities/plane.d.ts +0 -36
- package/dist/src/lib/entities/plane.d.ts.map +0 -1
- package/dist/src/lib/entities/rect.d.ts +0 -63
- package/dist/src/lib/entities/rect.d.ts.map +0 -1
- package/dist/src/lib/entities/sphere.d.ts +0 -29
- package/dist/src/lib/entities/sphere.d.ts.map +0 -1
- package/dist/src/lib/entities/sprite.d.ts +0 -54
- package/dist/src/lib/entities/sprite.d.ts.map +0 -1
- package/dist/src/lib/entities/text.d.ts +0 -49
- package/dist/src/lib/entities/text.d.ts.map +0 -1
- package/dist/src/lib/entities/zone.d.ts +0 -54
- package/dist/src/lib/entities/zone.d.ts.map +0 -1
- package/dist/src/lib/game/game-blueprint.d.ts +0 -38
- package/dist/src/lib/game/game-blueprint.d.ts.map +0 -1
- package/dist/src/lib/game/game-canvas.d.ts +0 -35
- package/dist/src/lib/game/game-canvas.d.ts.map +0 -1
- package/dist/src/lib/game/game-config.d.ts +0 -59
- package/dist/src/lib/game/game-config.d.ts.map +0 -1
- package/dist/src/lib/game/game-default.d.ts +0 -14
- package/dist/src/lib/game/game-default.d.ts.map +0 -1
- package/dist/src/lib/game/game-interfaces.d.ts +0 -29
- package/dist/src/lib/game/game-interfaces.d.ts.map +0 -1
- package/dist/src/lib/game/game-retro-resolutions.d.ts +0 -25
- package/dist/src/lib/game/game-retro-resolutions.d.ts.map +0 -1
- package/dist/src/lib/game/game-state.d.ts +0 -11
- package/dist/src/lib/game/game-state.d.ts.map +0 -1
- package/dist/src/lib/game/game.d.ts +0 -39
- package/dist/src/lib/game/game.d.ts.map +0 -1
- package/dist/src/lib/game/zylem-game.d.ts +0 -58
- package/dist/src/lib/game/zylem-game.d.ts.map +0 -1
- package/dist/src/lib/graphics/geometries/XZPlaneGeometry.d.ts +0 -8
- package/dist/src/lib/graphics/geometries/XZPlaneGeometry.d.ts.map +0 -1
- package/dist/src/lib/graphics/material.d.ts +0 -29
- package/dist/src/lib/graphics/material.d.ts.map +0 -1
- package/dist/src/lib/graphics/mesh.d.ts +0 -19
- package/dist/src/lib/graphics/mesh.d.ts.map +0 -1
- package/dist/src/lib/graphics/render-pass.d.ts +0 -17
- package/dist/src/lib/graphics/render-pass.d.ts.map +0 -1
- package/dist/src/lib/graphics/zylem-scene.d.ts +0 -50
- package/dist/src/lib/graphics/zylem-scene.d.ts.map +0 -1
- package/dist/src/lib/input/gamepad-provider.d.ts +0 -14
- package/dist/src/lib/input/gamepad-provider.d.ts.map +0 -1
- package/dist/src/lib/input/input-manager.d.ts +0 -15
- package/dist/src/lib/input/input-manager.d.ts.map +0 -1
- package/dist/src/lib/input/input-provider.d.ts +0 -7
- package/dist/src/lib/input/input-provider.d.ts.map +0 -1
- package/dist/src/lib/input/input.d.ts +0 -48
- package/dist/src/lib/input/input.d.ts.map +0 -1
- package/dist/src/lib/input/keyboard-provider.d.ts +0 -21
- package/dist/src/lib/input/keyboard-provider.d.ts.map +0 -1
- package/dist/src/lib/interfaces/entity.d.ts +0 -26
- package/dist/src/lib/interfaces/entity.d.ts.map +0 -1
- package/dist/src/lib/sounds/index.d.ts +0 -3
- package/dist/src/lib/sounds/index.d.ts.map +0 -1
- package/dist/src/lib/sounds/ping-pong-sound.d.ts +0 -5
- package/dist/src/lib/sounds/ping-pong-sound.d.ts.map +0 -1
- package/dist/src/lib/sounds/ricochet-sound.d.ts +0 -5
- package/dist/src/lib/sounds/ricochet-sound.d.ts.map +0 -1
- package/dist/src/lib/stage/debug-entity-cursor.d.ts +0 -24
- package/dist/src/lib/stage/debug-entity-cursor.d.ts.map +0 -1
- package/dist/src/lib/stage/entity-spawner.d.ts +0 -9
- package/dist/src/lib/stage/entity-spawner.d.ts.map +0 -1
- package/dist/src/lib/stage/stage-camera-debug-delegate.d.ts +0 -14
- package/dist/src/lib/stage/stage-camera-debug-delegate.d.ts.map +0 -1
- package/dist/src/lib/stage/stage-debug-delegate.d.ts +0 -26
- package/dist/src/lib/stage/stage-debug-delegate.d.ts.map +0 -1
- package/dist/src/lib/stage/stage-default.d.ts +0 -3
- package/dist/src/lib/stage/stage-default.d.ts.map +0 -1
- package/dist/src/lib/stage/stage-factory.d.ts +0 -6
- package/dist/src/lib/stage/stage-factory.d.ts.map +0 -1
- package/dist/src/lib/stage/stage-manager.d.ts +0 -30
- package/dist/src/lib/stage/stage-manager.d.ts.map +0 -1
- package/dist/src/lib/stage/stage-state.d.ts +0 -14
- package/dist/src/lib/stage/stage-state.d.ts.map +0 -1
- package/dist/src/lib/stage/stage.d.ts +0 -35
- package/dist/src/lib/stage/stage.d.ts.map +0 -1
- package/dist/src/lib/stage/zylem-stage.d.ts +0 -128
- package/dist/src/lib/stage/zylem-stage.d.ts.map +0 -1
- package/dist/src/lib/systems/test-system.d.ts +0 -2
- package/dist/src/lib/systems/test-system.d.ts.map +0 -1
- package/dist/src/lib/systems/transformable.system.d.ts +0 -25
- package/dist/src/lib/systems/transformable.system.d.ts.map +0 -1
- package/dist/src/lib/types/entity-types.d.ts +0 -24
- package/dist/src/lib/types/entity-types.d.ts.map +0 -1
- package/dist/src/lib/types/index.d.ts +0 -3
- package/dist/src/lib/types/index.d.ts.map +0 -1
- package/dist/src/lib/types/stage-types.d.ts +0 -26
- package/dist/src/lib/types/stage-types.d.ts.map +0 -1
- package/dist/src/lib/ui/Debug.d.ts +0 -6
- package/dist/src/lib/ui/Debug.d.ts.map +0 -1
- package/dist/src/lib/ui/console/Console.d.ts +0 -7
- package/dist/src/lib/ui/console/Console.d.ts.map +0 -1
- package/dist/src/lib/ui/debug-panel/AccordionMenu.d.ts +0 -7
- package/dist/src/lib/ui/debug-panel/AccordionMenu.d.ts.map +0 -1
- package/dist/src/lib/ui/debug-panel/Menu.d.ts +0 -6
- package/dist/src/lib/ui/debug-panel/Menu.d.ts.map +0 -1
- package/dist/src/lib/ui/debug-panel/sections/EntitiesSection.d.ts +0 -4
- package/dist/src/lib/ui/debug-panel/sections/EntitiesSection.d.ts.map +0 -1
- package/dist/src/lib/ui/debug-panel/sections/GameSection.d.ts +0 -3
- package/dist/src/lib/ui/debug-panel/sections/GameSection.d.ts.map +0 -1
- package/dist/src/lib/ui/debug-panel/sections/StagesSection.d.ts +0 -3
- package/dist/src/lib/ui/debug-panel/sections/StagesSection.d.ts.map +0 -1
- package/dist/src/lib/ui/debug-panel/sections/all.d.ts +0 -4
- package/dist/src/lib/ui/debug-panel/sections/all.d.ts.map +0 -1
- package/dist/src/lib/ui/toolbar/Toolbar.d.ts +0 -6
- package/dist/src/lib/ui/toolbar/Toolbar.d.ts.map +0 -1
- package/dist/tests/e2e/basic-game.spec.d.ts +0 -2
- package/dist/tests/e2e/basic-game.spec.d.ts.map +0 -1
- package/dist/tests/integration/debug.sim.spec.d.ts +0 -2
- package/dist/tests/integration/debug.sim.spec.d.ts.map +0 -1
- package/dist/tests/unit/collision/collision.spec.d.ts +0 -2
- package/dist/tests/unit/collision/collision.spec.d.ts.map +0 -1
- package/dist/tests/unit/core/base-node.spec.d.ts +0 -2
- package/dist/tests/unit/core/base-node.spec.d.ts.map +0 -1
- package/dist/tests/unit/core/game.spec.d.ts +0 -2
- package/dist/tests/unit/core/game.spec.d.ts.map +0 -1
- package/dist/tests/unit/core/stage.spec.d.ts +0 -2
- package/dist/tests/unit/core/stage.spec.d.ts.map +0 -1
- package/dist/tests/unit/core/vessel.spec.d.ts +0 -2
- package/dist/tests/unit/core/vessel.spec.d.ts.map +0 -1
package/dist/core.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lib/core/utility/path-utils.ts","../src/lib/game/game-state.ts","../src/lib/debug/debug-state.ts","../src/lib/core/flags.ts","../src/lib/core/base-node.ts","../src/lib/systems/transformable.system.ts","../src/lib/entities/entity.ts","../src/lib/entities/delegates/loader.ts","../src/lib/entities/create.ts","../src/lib/core/entity-asset-loader.ts","../src/lib/entities/delegates/animation.ts","../src/lib/collision/collision-builder.ts","../src/lib/core/utility/strings.ts","../src/lib/graphics/shaders/fragment/stars.glsl","../src/lib/graphics/shaders/fragment/fire.glsl","../src/lib/graphics/shaders/fragment/standard.glsl","../src/lib/graphics/shaders/fragment/debug.glsl","../src/lib/graphics/shaders/vertex/object-shader.glsl","../src/lib/graphics/shaders/vertex/debug.glsl","../src/lib/core/preset-shader.ts","../src/lib/graphics/material.ts","../src/lib/entities/builder.ts","../src/lib/entities/actor.ts","../src/lib/collision/collision-delegate.ts","../src/lib/collision/world.ts","../src/lib/graphics/zylem-scene.ts","../src/lib/stage/stage-state.ts","../src/lib/core/utility/vector.ts","../src/lib/core/lifecycle-base.ts","../src/lib/camera/perspective.ts","../src/lib/camera/third-person.ts","../src/lib/camera/fixed-2d.ts","../src/lib/graphics/shaders/vertex/standard.glsl","../src/lib/graphics/render-pass.ts","../src/lib/camera/zylem-camera.ts","../src/lib/camera/camera.ts","../src/lib/stage/debug-entity-cursor.ts","../src/lib/stage/stage-debug-delegate.ts","../src/lib/stage/zylem-stage.ts","../src/lib/stage/stage-default.ts","../src/lib/stage/stage.ts","../src/lib/game/game-default.ts","../src/lib/game/zylem-game.ts","../src/lib/input/keyboard-provider.ts","../src/lib/input/gamepad-provider.ts","../src/lib/input/input-manager.ts","../src/lib/core/three-addons/Timer.ts","../src/lib/device/aspect-ratio.ts","../src/lib/game/game-retro-resolutions.ts","../src/lib/game/game-config.ts","../src/lib/game/game-canvas.ts","../src/lib/game/game.ts","../src/lib/core/utility/nodes.ts","../src/lib/stage/stage-manager.ts","../src/lib/stage/stage-factory.ts","../src/lib/entities/text.ts","../src/lib/entities/delegates/debug.ts","../src/lib/entities/sprite.ts","../src/lib/entities/entity-factory.ts","../src/lib/core/vessel.ts","../src/lib/actions/global-change.ts"],"sourcesContent":["/**\n * Lodash-style path utilities for getting/setting nested object values.\n */\n\n/**\n * Get a value from an object by path string.\n * @example getByPath({ player: { health: 100 } }, 'player.health') // 100\n */\nexport function getByPath<T = unknown>(obj: object, path: string): T | undefined {\n\tif (!path) return undefined;\n\tconst keys = path.split('.');\n\tlet current: any = obj;\n\tfor (const key of keys) {\n\t\tif (current == null || typeof current !== 'object') {\n\t\t\treturn undefined;\n\t\t}\n\t\tcurrent = current[key];\n\t}\n\treturn current as T;\n}\n\n/**\n * Set a value on an object by path string, creating intermediate objects as needed.\n * @example setByPath({}, 'player.health', 100) // { player: { health: 100 } }\n */\nexport function setByPath(obj: object, path: string, value: unknown): void {\n\tif (!path) return;\n\tconst keys = path.split('.');\n\tlet current: any = obj;\n\tfor (let i = 0; i < keys.length - 1; i++) {\n\t\tconst key = keys[i];\n\t\tif (current[key] == null || typeof current[key] !== 'object') {\n\t\t\tcurrent[key] = {};\n\t\t}\n\t\tcurrent = current[key];\n\t}\n\tcurrent[keys[keys.length - 1]] = value;\n}\n\n/**\n * Check if a path exists in an object.\n */\nexport function hasPath(obj: object, path: string): boolean {\n\tif (!path) return false;\n\tconst keys = path.split('.');\n\tlet current: any = obj;\n\tfor (const key of keys) {\n\t\tif (current == null || typeof current !== 'object' || !(key in current)) {\n\t\t\treturn false;\n\t\t}\n\t\tcurrent = current[key];\n\t}\n\treturn true;\n}\n","import { proxy, subscribe } from 'valtio/vanilla';\nimport { getByPath, setByPath } from '../core/utility/path-utils';\n\n/**\n * Internal game state store using valtio proxy for reactivity.\n */\nconst state = proxy({\n\tid: '',\n\tglobals: {} as Record<string, unknown>,\n\ttime: 0,\n});\n\n/**\n * Set a global value by path.\n * @example setGlobal('score', 100)\n * @example setGlobal('player.health', 50)\n */\nexport function setGlobal(path: string, value: unknown): void {\n\tsetByPath(state.globals, path, value);\n}\n\n/**\n * Create/initialize a global with a default value.\n * Only sets the value if it doesn't already exist.\n * Use this to ensure globals have initial values before game starts.\n * @example createGlobal('score', 0)\n * @example createGlobal('player.health', 100)\n */\nexport function createGlobal<T>(path: string, defaultValue: T): T {\n\tconst existing = getByPath<T>(state.globals, path);\n\tif (existing === undefined) {\n\t\tsetByPath(state.globals, path, defaultValue);\n\t\treturn defaultValue;\n\t}\n\treturn existing;\n}\n\n/**\n * Get a global value by path.\n * @example getGlobal('score') // 100\n * @example getGlobal<number>('player.health') // 50\n */\nexport function getGlobal<T = unknown>(path: string): T | undefined {\n\treturn getByPath<T>(state.globals, path);\n}\n\n/**\n * Subscribe to changes on a global value at a specific path.\n * Returns an unsubscribe function.\n * @example const unsub = onGlobalChange('score', (val) => console.log(val));\n */\nexport function onGlobalChange<T = unknown>(\n\tpath: string,\n\tcallback: (value: T) => void\n): () => void {\n\tlet previous = getByPath<T>(state.globals, path);\n\treturn subscribe(state.globals, () => {\n\t\tconst current = getByPath<T>(state.globals, path);\n\t\tif (current !== previous) {\n\t\t\tprevious = current;\n\t\t\tcallback(current as T);\n\t\t}\n\t});\n}\n\n/**\n * Subscribe to changes on multiple global paths.\n * Callback fires when any of the paths change, receiving all current values.\n * Returns an unsubscribe function.\n * @example const unsub = onGlobalChanges(['score', 'lives'], ([score, lives]) => console.log(score, lives));\n */\nexport function onGlobalChanges<T extends unknown[] = unknown[]>(\n\tpaths: string[],\n\tcallback: (values: T) => void\n): () => void {\n\tlet previousValues = paths.map(p => getByPath(state.globals, p));\n\treturn subscribe(state.globals, () => {\n\t\tconst currentValues = paths.map(p => getByPath(state.globals, p));\n\t\tconst hasChange = currentValues.some((val, i) => val !== previousValues[i]);\n\t\tif (hasChange) {\n\t\t\tpreviousValues = currentValues;\n\t\t\tcallback(currentValues as T);\n\t\t}\n\t});\n}\n\n/**\n * Get the entire globals object (read-only snapshot).\n */\nexport function getGlobals<T = Record<string, unknown>>(): T {\n\treturn state.globals as T;\n}\n\n/**\n * Initialize globals from an object. Used internally during game setup.\n */\nexport function initGlobals(globals: Record<string, unknown>): void {\n\tfor (const [key, value] of Object.entries(globals)) {\n\t\tsetByPath(state.globals, key, value);\n\t}\n}\n\n/**\n * Reset all globals. Used internally on game dispose.\n */\nexport function resetGlobals(): void {\n\tstate.globals = {};\n}\n\nexport { state };","import { proxy } from 'valtio';\nimport type { GameEntity } from '../entities/entity';\n\nexport type DebugTools = 'select' | 'translate' | 'rotate' | 'scale' | 'delete' | 'none';\n\nexport interface DebugState {\n\tenabled: boolean;\n\tpaused: boolean;\n\ttool: DebugTools;\n\tselectedEntity: GameEntity<any> | null;\n\thoveredEntity: GameEntity<any> | null;\n\tflags: Set<string>;\n}\n\nexport const debugState = proxy<DebugState>({\n\tenabled: false,\n\tpaused: false,\n\ttool: 'none',\n\tselectedEntity: null,\n\thoveredEntity: null,\n\tflags: new Set(),\n});\n\nexport function isPaused(): boolean {\n\treturn debugState.paused;\n}\n\nexport function setPaused(paused: boolean): void {\n\tdebugState.paused = paused;\n}\n\nexport function setDebugFlag(flag: string, value: boolean): void {\n\tif (value) {\n\t\tdebugState.flags.add(flag);\n\t} else {\n\t\tdebugState.flags.delete(flag);\n\t}\n}\n\nexport function getDebugTool(): DebugTools {\n\treturn debugState.tool;\n}\n\nexport function setDebugTool(tool: DebugTools): void {\n\tdebugState.tool = tool;\n}\n\nexport function getSelectedEntity(): GameEntity<any> | null {\n\treturn debugState.selectedEntity;\n}\n\nexport function setSelectedEntity(entity: GameEntity<any> | null): void {\n\tdebugState.selectedEntity = entity;\n}\n\nexport function getHoveredEntity(): GameEntity<any> | null {\n\treturn debugState.hoveredEntity;\n}\n\nexport function setHoveredEntity(entity: GameEntity<any> | null): void {\n\tdebugState.hoveredEntity = entity;\n}\n\nexport function resetHoveredEntity(): void {\n\tdebugState.hoveredEntity = null;\n}\n","/** Vite build flags */\nexport const DEBUG_FLAG = import.meta.env.VITE_DEBUG_FLAG === 'true';","import {\n\tCleanupContext,\n\tCleanupFunction,\n\tDestroyContext,\n\tDestroyFunction,\n\tLoadedContext,\n\tLoadedFunction,\n\tSetupContext,\n\tSetupFunction,\n\tUpdateContext,\n\tUpdateFunction,\n} from \"./base-node-life-cycle\";\nimport { DEBUG_FLAG } from \"./flags\";\nimport { nanoid } from \"nanoid\";\nimport { NodeInterface } from \"./node-interface\";\n\nexport type BaseNodeOptions<T = any> = BaseNode | Partial<T>;\n\nexport abstract class BaseNode<Options = any, T = any> implements NodeInterface {\n\tprotected parent: NodeInterface | null = null;\n\tprotected children: NodeInterface[] = [];\n\tpublic options: Options;\n\tpublic eid: number = 0;\n\tpublic uuid: string = '';\n\tpublic name: string = '';\n\tpublic markedForRemoval: boolean = false;\n\n\tsetup: SetupFunction<this> = () => { };\n\tloaded: LoadedFunction<this> = () => { };\n\tupdate: UpdateFunction<this> = () => { };\n\tdestroy: DestroyFunction<this> = () => { };\n\tcleanup: CleanupFunction<this> = () => { };\n\n\tconstructor(args: BaseNodeOptions[] = []) {\n\t\tconst options = args\n\t\t\t.filter(arg => !(arg instanceof BaseNode))\n\t\t\t.reduce((acc, opt) => ({ ...acc, ...opt }), {});\n\t\tthis.options = options as Options;\n\t\tthis.uuid = nanoid();\n\t}\n\n\tpublic setParent(parent: NodeInterface | null): void {\n\t\tthis.parent = parent;\n\t}\n\n\tpublic getParent(): NodeInterface | null {\n\t\treturn this.parent;\n\t}\n\n\tpublic add(baseNode: NodeInterface): void {\n\t\tthis.children.push(baseNode);\n\t\tbaseNode.setParent(this);\n\t}\n\n\tpublic remove(baseNode: NodeInterface): void {\n\t\tconst index = this.children.indexOf(baseNode);\n\t\tif (index !== -1) {\n\t\t\tthis.children.splice(index, 1);\n\t\t\tbaseNode.setParent(null);\n\t\t}\n\t}\n\n\tpublic getChildren(): NodeInterface[] {\n\t\treturn this.children;\n\t}\n\n\tpublic isComposite(): boolean {\n\t\treturn this.children.length > 0;\n\t}\n\n\tpublic abstract create(): T;\n\n\tprotected abstract _setup(params: SetupContext<this>): void;\n\n\tprotected abstract _loaded(params: LoadedContext<this>): Promise<void>;\n\n\tprotected abstract _update(params: UpdateContext<this>): void;\n\n\tprotected abstract _destroy(params: DestroyContext<this>): void;\n\n\tprotected abstract _cleanup(params: CleanupContext<this>): Promise<void>;\n\n\tpublic nodeSetup(params: SetupContext<this>) {\n\t\tif (DEBUG_FLAG) { /** */ }\n\t\tthis.markedForRemoval = false;\n\t\tif (typeof this._setup === 'function') {\n\t\t\tthis._setup(params);\n\t\t}\n\t\tif (this.setup) {\n\t\t\tthis.setup(params);\n\t\t}\n\t\tthis.children.forEach(child => child.nodeSetup(params));\n\t}\n\n\tpublic nodeUpdate(params: UpdateContext<this>): void {\n\t\tif (this.markedForRemoval) {\n\t\t\treturn;\n\t\t}\n\t\tif (typeof this._update === 'function') {\n\t\t\tthis._update(params);\n\t\t}\n\t\tif (this.update) {\n\t\t\tthis.update(params);\n\t\t}\n\t\tthis.children.forEach(child => child.nodeUpdate(params));\n\t}\n\n\tpublic nodeDestroy(params: DestroyContext<this>): void {\n\t\tthis.children.forEach(child => child.nodeDestroy(params));\n\t\tif (this.destroy) {\n\t\t\tthis.destroy(params);\n\t\t}\n\t\tif (typeof this._destroy === 'function') {\n\t\t\tthis._destroy(params);\n\t\t}\n\t\tthis.markedForRemoval = true;\n\t}\n\n\tpublic getOptions(): Options {\n\t\treturn this.options;\n\t}\n\n\tpublic setOptions(options: Partial<Options>): void {\n\t\tthis.options = { ...this.options, ...options };\n\t}\n}","import {\n\tdefineSystem,\n\tdefineQuery,\n\tdefineComponent,\n\tTypes,\n} from 'bitecs';\nimport { Quaternion } from 'three';\nimport { StageEntity } from '../interfaces/entity';\nimport RAPIER from '@dimforge/rapier3d-compat';\n\nexport type StageSystem = {\n\t_childrenMap: Map<number, StageEntity & { body: RAPIER.RigidBody }>;\n}\n\nexport const position = defineComponent({\n\tx: Types.f32,\n\ty: Types.f32,\n\tz: Types.f32\n});\n\nexport const rotation = defineComponent({\n\tx: Types.f32,\n\ty: Types.f32,\n\tz: Types.f32,\n\tw: Types.f32\n});\n\nexport const scale = defineComponent({\n\tx: Types.f32,\n\ty: Types.f32,\n\tz: Types.f32\n});\n\nexport default function createTransformSystem(stage: StageSystem) {\n\tconst transformQuery = defineQuery([position, rotation]);\n\tconst stageEntities = stage._childrenMap;\n\treturn defineSystem((world) => {\n\t\tconst entities = transformQuery(world);\n\t\tif (stageEntities === undefined) {\n\t\t\treturn world;\n\t\t};\n\t\tfor (const [key, value] of stageEntities) {\n\t\t\tconst id = entities[key];\n\t\t\tconst stageEntity = value;\n\t\t\tif (stageEntity === undefined || !stageEntity?.body || stageEntity.markedForRemoval) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst { x, y, z } = stageEntity.body.translation();\n\t\t\tposition.x[id] = x;\n\t\t\tposition.y[id] = y;\n\t\t\tposition.z[id] = z;\n\t\t\tif (stageEntity.group) {\n\t\t\t\tstageEntity.group.position.set(position.x[id], position.y[id], position.z[id]);\n\t\t\t} else if (stageEntity.mesh) {\n\t\t\t\tstageEntity.mesh.position.set(position.x[id], position.y[id], position.z[id]);\n\t\t\t}\n\t\t\tif (stageEntity.controlledRotation) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst { x: rx, y: ry, z: rz, w: rw } = stageEntity.body.rotation();\n\t\t\trotation.x[id] = rx;\n\t\t\trotation.y[id] = ry;\n\t\t\trotation.z[id] = rz;\n\t\t\trotation.w[id] = rw;\n\t\t\tconst newRotation = new Quaternion(\n\t\t\t\trotation.x[id],\n\t\t\t\trotation.y[id],\n\t\t\t\trotation.z[id],\n\t\t\t\trotation.w[id]\n\t\t\t);\n\t\t\tif (stageEntity.group) {\n\t\t\t\tstageEntity.group.setRotationFromQuaternion(newRotation);\n\t\t\t} else if (stageEntity.mesh) {\n\t\t\t\tstageEntity.mesh.setRotationFromQuaternion(newRotation);\n\t\t\t}\n\t\t}\n\n\t\treturn world;\n\t});\n}","import { Mesh, Material, ShaderMaterial, Group, Color } from \"three\";\nimport { Collider, ColliderDesc, RigidBody, RigidBodyDesc } from \"@dimforge/rapier3d-compat\";\nimport { position, rotation, scale } from \"../systems/transformable.system\";\nimport { Vec3 } from \"../core/vector\";\nimport { MaterialBuilder, MaterialOptions } from \"../graphics/material\";\nimport { CollisionOptions } from \"../collision/collision\";\nimport { BaseNode } from \"../core/base-node\";\nimport { DestroyContext, SetupContext, UpdateContext, LoadedContext, CleanupContext } from \"../core/base-node-life-cycle\";\nimport type { EntityMeshBuilder, EntityCollisionBuilder } from \"./builder\";\nimport { Behavior } from \"../actions/behaviors/behavior\";\n\nexport interface LifeCycleDelegate<U> {\n\tsetup?: ((params: SetupContext<U>) => void)[];\n\tupdate?: ((params: UpdateContext<U>) => void)[];\n\tdestroy?: ((params: DestroyContext<U>) => void)[];\n}\n\nexport interface CollisionContext<T, O extends GameEntityOptions, TGlobals extends Record<string, unknown> = any> {\n\tentity: T;\n\tother: GameEntity<O>;\n\tglobals: TGlobals;\n}\n\nexport type BehaviorContext<T, O extends GameEntityOptions> =\n\tSetupContext<T, O> |\n\tUpdateContext<T, O> |\n\tCollisionContext<T, O> |\n\tDestroyContext<T, O>;\n\nexport type BehaviorCallback<T, O extends GameEntityOptions> = (params: BehaviorContext<T, O>) => void;\n\nexport interface CollisionDelegate<T, O extends GameEntityOptions> {\n\tcollision?: ((params: CollisionContext<T, O>) => void)[];\n}\n\nexport type IBuilder<BuilderOptions = any> = {\n\tpreBuild: (options: BuilderOptions) => BuilderOptions;\n\tbuild: (options: BuilderOptions) => BuilderOptions;\n\tpostBuild: (options: BuilderOptions) => BuilderOptions;\n}\n\nexport type GameEntityOptions = {\n\tname?: string;\n\tcolor?: Color;\n\tsize?: Vec3;\n\tposition?: Vec3;\n\tbatched?: boolean;\n\tcollision?: Partial<CollisionOptions>;\n\tmaterial?: Partial<MaterialOptions>;\n\tcustom?: { [key: string]: any };\n\tcollisionType?: string;\n\tcollisionGroup?: string;\n\tcollisionFilter?: string[];\n\t_builders?: {\n\t\tmeshBuilder?: IBuilder | EntityMeshBuilder | null;\n\t\tcollisionBuilder?: IBuilder | EntityCollisionBuilder | null;\n\t\tmaterialBuilder?: MaterialBuilder | null;\n\t};\n}\n\nexport abstract class GameEntityLifeCycle {\n\tabstract _setup(params: SetupContext<this>): void;\n\tabstract _update(params: UpdateContext<this>): void;\n\tabstract _destroy(params: DestroyContext<this>): void;\n}\n\nexport interface EntityDebugInfo {\n\tbuildInfo: () => Record<string, string>;\n}\n\nexport type BehaviorCallbackType = 'setup' | 'update' | 'destroy' | 'collision';\n\nexport class GameEntity<O extends GameEntityOptions> extends BaseNode<O> implements\n\tGameEntityLifeCycle,\n\tEntityDebugInfo {\n\tpublic behaviors: Behavior[] = [];\n\tpublic group: Group | undefined;\n\tpublic mesh: Mesh | undefined;\n\tpublic materials: Material[] | undefined;\n\tpublic bodyDesc: RigidBodyDesc | null = null;\n\tpublic body: RigidBody | null = null;\n\tpublic colliderDesc: ColliderDesc | undefined;\n\tpublic collider: Collider | undefined;\n\tpublic custom: Record<string, any> = {};\n\n\tpublic debugInfo: Record<string, any> = {};\n\tpublic debugMaterial: ShaderMaterial | undefined;\n\n\tpublic lifeCycleDelegate: LifeCycleDelegate<O> = {\n\t\tsetup: [],\n\t\tupdate: [],\n\t\tdestroy: [],\n\t};\n\tpublic collisionDelegate: CollisionDelegate<this, O> = {\n\t\tcollision: [],\n\t};\n\tpublic collisionType?: string;\n\n\tpublic behaviorCallbackMap: Record<BehaviorCallbackType, BehaviorCallback<this, O>[]> = {\n\t\tsetup: [],\n\t\tupdate: [],\n\t\tdestroy: [],\n\t\tcollision: [],\n\t};\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\tpublic create(): this {\n\t\tconst { position: setupPosition } = this.options;\n\t\tconst { x, y, z } = setupPosition || { x: 0, y: 0, z: 0 };\n\t\tthis.behaviors = [\n\t\t\t{ component: position, values: { x, y, z } },\n\t\t\t{ component: scale, values: { x: 0, y: 0, z: 0 } },\n\t\t\t{ component: rotation, values: { x: 0, y: 0, z: 0, w: 0 } },\n\t\t];\n\t\tthis.name = this.options.name || '';\n\t\treturn this;\n\t}\n\n\tpublic onSetup(...callbacks: ((params: SetupContext<this>) => void)[]): this {\n\t\tconst combineCallbacks = [...(this.lifeCycleDelegate.setup ?? []), ...callbacks];\n\t\tthis.lifeCycleDelegate = {\n\t\t\t...this.lifeCycleDelegate,\n\t\t\tsetup: combineCallbacks as unknown as ((params: SetupContext<O>) => void)[]\n\t\t};\n\t\treturn this;\n\t}\n\n\tpublic onUpdate(...callbacks: ((params: UpdateContext<this>) => void)[]): this {\n\t\tconst combineCallbacks = [...(this.lifeCycleDelegate.update ?? []), ...callbacks];\n\t\tthis.lifeCycleDelegate = {\n\t\t\t...this.lifeCycleDelegate,\n\t\t\tupdate: combineCallbacks as unknown as ((params: UpdateContext<O>) => void)[]\n\t\t};\n\t\treturn this;\n\t}\n\n\tpublic onDestroy(...callbacks: ((params: DestroyContext<this>) => void)[]): this {\n\t\tthis.lifeCycleDelegate = {\n\t\t\t...this.lifeCycleDelegate,\n\t\t\tdestroy: callbacks.length > 0 ? callbacks as unknown as ((params: DestroyContext<O>) => void)[] : undefined\n\t\t};\n\t\treturn this;\n\t}\n\n\tpublic onCollision(...callbacks: ((params: CollisionContext<this, O>) => void)[]): this {\n\t\tthis.collisionDelegate = {\n\t\t\tcollision: callbacks.length > 0 ? callbacks : undefined\n\t\t};\n\t\treturn this;\n\t}\n\n\tpublic _setup(params: SetupContext<this>): void {\n\t\tthis.behaviorCallbackMap.setup.forEach(callback => {\n\t\t\tcallback({ ...params, me: this });\n\t\t});\n\t\tif (this.lifeCycleDelegate.setup?.length) {\n\t\t\tconst callbacks = this.lifeCycleDelegate.setup;\n\t\t\tcallbacks.forEach(callback => {\n\t\t\t\tcallback({ ...params, me: this as unknown as O });\n\t\t\t});\n\t\t}\n\t}\n\n\tprotected async _loaded(_params: LoadedContext<this>): Promise<void> { }\n\n\tpublic _update(params: UpdateContext<this>): void {\n\t\tthis.updateMaterials(params);\n\t\tif (this.lifeCycleDelegate.update?.length) {\n\t\t\tconst callbacks = this.lifeCycleDelegate.update;\n\t\t\tcallbacks.forEach(callback => {\n\t\t\t\tcallback({ ...params, me: this as unknown as O });\n\t\t\t});\n\t\t}\n\t\tthis.behaviorCallbackMap.update.forEach(callback => {\n\t\t\tcallback({ ...params, me: this });\n\t\t});\n\t}\n\n\tpublic _destroy(params: DestroyContext<this>): void {\n\t\tif (this.lifeCycleDelegate.destroy?.length) {\n\t\t\tconst callbacks = this.lifeCycleDelegate.destroy;\n\t\t\tcallbacks.forEach(callback => {\n\t\t\t\tcallback({ ...params, me: this as unknown as O });\n\t\t\t});\n\t\t}\n\t\tthis.behaviorCallbackMap.destroy.forEach(callback => {\n\t\t\tcallback({ ...params, me: this });\n\t\t});\n\t}\n\n\tprotected async _cleanup(_params: CleanupContext<this>): Promise<void> { }\n\n\tpublic _collision(other: GameEntity<O>, globals?: any): void {\n\t\tif (this.collisionDelegate.collision?.length) {\n\t\t\tconst callbacks = this.collisionDelegate.collision;\n\t\t\tcallbacks.forEach(callback => {\n\t\t\t\tcallback({ entity: this, other, globals });\n\t\t\t});\n\t\t}\n\t\tthis.behaviorCallbackMap.collision.forEach(callback => {\n\t\t\tcallback({ entity: this, other, globals });\n\t\t});\n\t}\n\n\tpublic addBehavior(\n\t\tbehaviorCallback: ({ type: BehaviorCallbackType, handler: any })\n\t): this {\n\t\tconst handler = behaviorCallback.handler as unknown as BehaviorCallback<this, O>;\n\t\tif (handler) {\n\t\t\tthis.behaviorCallbackMap[behaviorCallback.type].push(handler);\n\t\t}\n\t\treturn this;\n\t}\n\n\tpublic addBehaviors(\n\t\tbehaviorCallbacks: ({ type: BehaviorCallbackType, handler: any })[]\n\t): this {\n\t\tbehaviorCallbacks.forEach(callback => {\n\t\t\tconst handler = callback.handler as unknown as BehaviorCallback<this, O>;\n\t\t\tif (handler) {\n\t\t\t\tthis.behaviorCallbackMap[callback.type].push(handler);\n\t\t\t}\n\t\t});\n\t\treturn this;\n\t}\n\n\tprotected updateMaterials(params: any) {\n\t\tif (!this.materials?.length) {\n\t\t\treturn;\n\t\t}\n\t\tfor (const material of this.materials) {\n\t\t\tif (material instanceof ShaderMaterial) {\n\t\t\t\tif (material.uniforms) {\n\t\t\t\t\tmaterial.uniforms.iTime && (material.uniforms.iTime.value += params.delta);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic buildInfo(): Record<string, string> {\n\t\tconst info: Record<string, string> = {};\n\t\tinfo.name = this.name;\n\t\tinfo.uuid = this.uuid;\n\t\tinfo.eid = this.eid.toString();\n\t\treturn info;\n\t}\n}\n","// this class is not for asset loading, it is for loading entity specific data\n// this is to keep the entity class focused purely on entity logic\n\nexport function isLoadable(obj: any): obj is EntityLoaderDelegate {\n\treturn typeof obj?.load === \"function\" && typeof obj?.data === \"function\";\n}\n\nexport interface EntityLoaderDelegate {\n\tload(): Promise<void>;\n\tdata(): any;\n}\n\nexport class EntityLoader {\n\tentityReference: EntityLoaderDelegate;\n\n\tconstructor(entity: EntityLoaderDelegate) {\n\t\tthis.entityReference = entity;\n\t}\n\n\tasync load() {\n\t\tif (this.entityReference.load) {\n\t\t\tawait this.entityReference.load();\n\t\t}\n\t}\n\n\tasync data() {\n\t\tif (this.entityReference.data) {\n\t\t\treturn this.entityReference.data();\n\t\t}\n\t\treturn null;\n\t}\n}","import { GameEntityOptions, GameEntity } from \"./entity\";\nimport { BaseNode } from \"../core/base-node\";\nimport { EntityBuilder } from \"./builder\";\nimport { EntityCollisionBuilder } from \"./builder\";\nimport { EntityMeshBuilder } from \"./builder\";\nimport { EntityLoader, isLoadable } from \"./delegates/loader\";\n\nexport interface CreateGameEntityOptions<T extends GameEntity<any>, CreateOptions extends GameEntityOptions> {\n\targs: Array<any>;\n\tdefaultConfig: GameEntityOptions;\n\tEntityClass: new (options: any) => T;\n\tBuilderClass: new (options: any, entity: T, meshBuilder: any, collisionBuilder: any) => EntityBuilder<T, CreateOptions>;\n\tMeshBuilderClass?: new (data: any) => EntityMeshBuilder;\n\tCollisionBuilderClass?: new (data: any) => EntityCollisionBuilder;\n\tentityType: symbol;\n};\n\nexport async function createEntity<T extends GameEntity<any>, CreateOptions extends GameEntityOptions>(params: CreateGameEntityOptions<T, CreateOptions>): Promise<T> {\n\tconst {\n\t\targs,\n\t\tdefaultConfig,\n\t\tEntityClass,\n\t\tBuilderClass,\n\t\tentityType,\n\t\tMeshBuilderClass,\n\t\tCollisionBuilderClass,\n\t} = params;\n\n\tlet builder: EntityBuilder<T, CreateOptions> | null = null;\n\tlet configuration;\n\n\tconst configurationIndex = args.findIndex(node => !(node instanceof BaseNode));\n\tif (configurationIndex !== -1) {\n\t\tconst subArgs = args.splice(configurationIndex, 1);\n\t\tconfiguration = subArgs.find(node => !(node instanceof BaseNode));\n\t}\n\n\tconst mergedConfiguration = configuration ? { ...defaultConfig, ...configuration } : defaultConfig;\n\targs.push(mergedConfiguration);\n\n\tfor (const arg of args) {\n\t\tif (arg instanceof BaseNode) {\n\t\t\tcontinue;\n\t\t}\n\t\tlet entityData = null;\n\t\tconst entity = new EntityClass(arg);\n\t\ttry {\n\t\t\tif (isLoadable(entity)) {\n\t\t\t\tconst loader = new EntityLoader(entity);\n\t\t\t\tawait loader.load();\n\t\t\t\tentityData = await loader.data();\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.error(\"Error creating entity with loader:\", error);\n\t\t}\n\t\tbuilder = new BuilderClass(\n\t\t\targ,\n\t\t\tentity,\n\t\t\tMeshBuilderClass ? new MeshBuilderClass(entityData) : null,\n\t\t\tCollisionBuilderClass ? new CollisionBuilderClass(entityData) : null,\n\t\t);\n\t\tif (arg.material) {\n\t\t\tawait builder.withMaterial(arg.material, entityType);\n\t\t}\n\t}\n\n\tif (!builder) {\n\t\tthrow new Error(`missing options for ${String(entityType)}, builder is not initialized.`);\n\t}\n\n\treturn await builder.build();\n}\n\n","import { AnimationClip, Object3D } from 'three';\nimport { FBXLoader } from 'three/addons/loaders/FBXLoader.js';\nimport { GLTF, GLTFLoader } from 'three/addons/loaders/GLTFLoader.js';\n\nenum FileExtensionTypes {\n\tFBX = 'fbx',\n\tGLTF = 'gltf'\n}\n\nexport interface AssetLoaderResult {\n\tobject?: Object3D;\n\tanimation?: AnimationClip;\n\tgltf?: GLTF;\n}\n\nexport interface IAssetLoader {\n\tload(file: string): Promise<AssetLoaderResult>;\n\tisSupported(file: string): boolean;\n}\n\nclass FBXAssetLoader implements IAssetLoader {\n\tprivate loader: FBXLoader = new FBXLoader();\n\n\tisSupported(file: string): boolean {\n\t\treturn file.toLowerCase().endsWith(FileExtensionTypes.FBX);\n\t}\n\n\tasync load(file: string): Promise<AssetLoaderResult> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tthis.loader.load(\n\t\t\t\tfile,\n\t\t\t\t(object: Object3D) => {\n\t\t\t\t\tconst animation = object.animations[0];\n\t\t\t\t\tresolve({\n\t\t\t\t\t\tobject,\n\t\t\t\t\t\tanimation\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tundefined,\n\t\t\t\treject\n\t\t\t);\n\t\t});\n\t}\n}\n\nclass GLTFAssetLoader implements IAssetLoader {\n\tprivate loader: GLTFLoader = new GLTFLoader();\n\n\tisSupported(file: string): boolean {\n\t\treturn file.toLowerCase().endsWith(FileExtensionTypes.GLTF);\n\t}\n\n\tasync load(file: string): Promise<AssetLoaderResult> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tthis.loader.load(\n\t\t\t\tfile,\n\t\t\t\t(gltf: GLTF) => {\n\t\t\t\t\tresolve({\n\t\t\t\t\t\tobject: gltf.scene,\n\t\t\t\t\t\tgltf\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tundefined,\n\t\t\t\treject\n\t\t\t);\n\t\t});\n\t}\n}\n\nexport class EntityAssetLoader {\n\tprivate loaders: IAssetLoader[] = [\n\t\tnew FBXAssetLoader(),\n\t\tnew GLTFAssetLoader()\n\t];\n\n\tasync loadFile(file: string): Promise<AssetLoaderResult> {\n\t\tconst loader = this.loaders.find(l => l.isSupported(file));\n\n\t\tif (!loader) {\n\t\t\tthrow new Error(`Unsupported file type: ${file}`);\n\t\t}\n\n\t\treturn loader.load(file);\n\t}\n}\n","import {\n\tAnimationAction,\n\tAnimationClip,\n\tAnimationMixer,\n\tLoopOnce,\n\tLoopRepeat,\n\tObject3D,\n} from 'three';\nimport { EntityAssetLoader, AssetLoaderResult } from '../../core/entity-asset-loader';\n\nexport type AnimationOptions = {\n\tkey: string;\n\tpauseAtEnd?: boolean;\n\tpauseAtPercentage?: number;\n\tfadeToKey?: string;\n\tfadeDuration?: number;\n};\n\ntype AnimationObject = {\n\tkey?: string;\n\tpath: string;\n};\n\nexport class AnimationDelegate {\n\tprivate _mixer: AnimationMixer | null = null;\n\tprivate _actions: Record<string, AnimationAction> = {};\n\tprivate _animations: AnimationClip[] = [];\n\tprivate _currentAction: AnimationAction | null = null;\n\n\tprivate _pauseAtPercentage = 0;\n\tprivate _isPaused = false;\n\tprivate _queuedKey: string | null = null;\n\tprivate _fadeDuration = 0.5;\n\n\tprivate _currentKey: string = '';\n\tprivate _assetLoader = new EntityAssetLoader();\n\n\tconstructor(private target: Object3D) { }\n\n\tasync loadAnimations(animations: AnimationObject[]): Promise<void> {\n\t\tif (!animations.length) return;\n\n\t\tconst results = await Promise.all(animations.map(a => this._assetLoader.loadFile(a.path)));\n\t\tthis._animations = results\n\t\t\t.filter((r): r is AssetLoaderResult => !!r.animation)\n\t\t\t.map(r => r.animation!);\n\n\t\tif (!this._animations.length) return;\n\n\t\tthis._mixer = new AnimationMixer(this.target);\n\t\tthis._animations.forEach((clip, i) => {\n\t\t\tconst key = animations[i].key || i.toString();\n\t\t\tthis._actions[key] = this._mixer!.clipAction(clip);\n\t\t});\n\n\t\tthis.playAnimation({ key: Object.keys(this._actions)[0] });\n\t}\n\n\tupdate(delta: number): void {\n\t\tif (!this._mixer || !this._currentAction) return;\n\n\t\tthis._mixer.update(delta);\n\n\t\tconst pauseAtTime = this._currentAction.getClip().duration * (this._pauseAtPercentage / 100);\n\t\tif (\n\t\t\t!this._isPaused &&\n\t\t\tthis._pauseAtPercentage > 0 &&\n\t\t\tthis._currentAction.time >= pauseAtTime\n\t\t) {\n\t\t\tthis._currentAction.time = pauseAtTime;\n\t\t\tthis._currentAction.paused = true;\n\t\t\tthis._isPaused = true;\n\n\t\t\tif (this._queuedKey !== null) {\n\t\t\t\tconst next = this._actions[this._queuedKey];\n\t\t\t\tnext.reset().play();\n\t\t\t\tthis._currentAction.crossFadeTo(next, this._fadeDuration, false);\n\t\t\t\tthis._currentAction = next;\n\t\t\t\tthis._currentKey = this._queuedKey;\n\t\t\t\tthis._queuedKey = null;\n\t\t\t}\n\t\t}\n\t}\n\n\tplayAnimation(opts: AnimationOptions): void {\n\t\tif (!this._mixer) return;\n\t\tconst { key, pauseAtPercentage = 0, pauseAtEnd = false, fadeToKey, fadeDuration = 0.5 } = opts;\n\t\tif (key === this._currentKey) return;\n\n\t\tthis._queuedKey = fadeToKey || null;\n\t\tthis._fadeDuration = fadeDuration;\n\n\t\tthis._pauseAtPercentage = pauseAtEnd ? 100 : pauseAtPercentage;\n\t\tthis._isPaused = false;\n\n\t\tconst prev = this._currentAction;\n\t\tif (prev) prev.stop();\n\n\t\tconst action = this._actions[key];\n\t\tif (!action) return;\n\n\t\tif (this._pauseAtPercentage > 0) {\n\t\t\taction.setLoop(LoopOnce, Infinity);\n\t\t\taction.clampWhenFinished = true;\n\t\t} else {\n\t\t\taction.setLoop(LoopRepeat, Infinity);\n\t\t\taction.clampWhenFinished = false;\n\t\t}\n\n\t\tif (prev) {\n\t\t\tprev.crossFadeTo(action, fadeDuration, false);\n\t\t}\n\t\taction.reset().play();\n\n\t\tthis._currentAction = action;\n\t\tthis._currentKey = key;\n\t}\n\n\tget currentAnimationKey() { return this._currentKey; }\n\tget animations() { return this._animations; }\n}\n","import { ActiveCollisionTypes, ColliderDesc, RigidBodyDesc, RigidBodyType, Vector3 } from \"@dimforge/rapier3d-compat\";\nimport { Vec3 } from \"../core/vector\";\nimport { CollisionOptions } from \"./collision\";\n\nconst typeToGroup = new Map<string, number>();\nlet nextGroupId = 0;\n\nexport function getOrCreateCollisionGroupId(type: string): number {\n\tlet groupId = typeToGroup.get(type);\n\tif (groupId === undefined) {\n\t\tgroupId = nextGroupId++ % 16;\n\t\ttypeToGroup.set(type, groupId);\n\t}\n\treturn groupId;\n}\n\nexport function createCollisionFilter(allowedTypes: string[]): number {\n\tlet filter = 0;\n\tallowedTypes.forEach(type => {\n\t\tconst groupId = getOrCreateCollisionGroupId(type);\n\t\tfilter |= (1 << groupId);\n\t});\n\treturn filter;\n}\n\nexport class CollisionBuilder {\n\tstatic: boolean = false;\n\tsensor: boolean = false;\n\tgravity: Vec3 = new Vector3(0, 0, 0);\n\n\tbuild(options: Partial<CollisionOptions>): [RigidBodyDesc, ColliderDesc] {\n\t\tconst bodyDesc = this.bodyDesc({\n\t\t\tisDynamicBody: !this.static\n\t\t});\n\t\tconst collider = this.collider(options);\n\t\tconst type = options.collisionType;\n\t\tif (type) {\n\t\t\tlet groupId = getOrCreateCollisionGroupId(type);\n\t\t\tlet filter = 0b1111111111111111;\n\t\t\tif (options.collisionFilter) {\n\t\t\t\tfilter = createCollisionFilter(options.collisionFilter);\n\t\t\t}\n\t\t\tcollider.setCollisionGroups((groupId << 16) | filter);\n\t\t}\n\t\tconst { KINEMATIC_FIXED, DEFAULT } = ActiveCollisionTypes;\n\t\tcollider.activeCollisionTypes = (this.sensor) ? KINEMATIC_FIXED : DEFAULT;\n\t\treturn [bodyDesc, collider];\n\t}\n\n\twithCollision(collisionOptions: Partial<CollisionOptions>): this {\n\t\tthis.sensor = collisionOptions?.sensor ?? this.sensor;\n\t\tthis.static = collisionOptions?.static ?? this.static;\n\t\treturn this;\n\t}\n\n\tcollider(options: CollisionOptions): ColliderDesc {\n\t\tconst size = options.size ?? new Vector3(1, 1, 1);\n\t\tconst half = { x: size.x / 2, y: size.y / 2, z: size.z / 2 };\n\t\tlet colliderDesc = ColliderDesc.cuboid(half.x, half.y, half.z);\n\t\treturn colliderDesc;\n\t}\n\n\tbodyDesc({ isDynamicBody = true }): RigidBodyDesc {\n\t\tconst type = isDynamicBody ? RigidBodyType.Dynamic : RigidBodyType.Fixed;\n\t\tconst bodyDesc = new RigidBodyDesc(type)\n\t\t\t.setTranslation(0, 0, 0)\n\t\t\t.setGravityScale(1.0)\n\t\t\t.setCanSleep(false)\n\t\t\t.setCcdEnabled(true);\n\t\treturn bodyDesc;\n\t}\n}","export function sortedStringify(obj: Record<string, any>) {\n\tconst sortedObj = Object.keys(obj)\n\t\t.sort()\n\t\t.reduce((acc: Record<string, any>, key: string) => {\n\t\t\tacc[key] = obj[key];\n\t\t\treturn acc;\n\t\t}, {} as Record<string, any>);\n\n\treturn JSON.stringify(sortedObj);\n}\n\nexport function shortHash(objString: string) {\n\tlet hash = 0;\n\tfor (let i = 0; i < objString.length; i++) {\n\t\thash = Math.imul(31, hash) + objString.charCodeAt(i) | 0;\n\t}\n\treturn hash.toString(36);\n}","export default \"#include <common>\\n\\nuniform vec3 iResolution;\\nuniform float iTime;\\nvarying vec2 vUv;\\n\\n// Credit goes to:\\n// https://www.shadertoy.com/view/mtyGWy\\n\\nvec3 palette( float t ) {\\n vec3 a = vec3(0.5, 0.5, 0.5);\\n vec3 b = vec3(0.5, 0.5, 0.5);\\n vec3 c = vec3(1.0, 1.0, 1.0);\\n vec3 d = vec3(0.263,0.416,0.557);\\n\\n return a + b*cos( 6.28318*(c*t+d) );\\n}\\n\\nvoid mainImage( out vec4 fragColor, in vec2 fragCoord ) {\\n vec2 uv = (fragCoord * 2.0 - iResolution.xy) / iResolution.y;\\n vec2 uv0 = uv;\\n vec3 finalColor = vec3(0.0);\\n \\n for (float i = 0.0; i < 4.0; i++) {\\n uv = fract(uv * 1.5) - 0.5;\\n\\n float d = length(uv) * exp(-length(uv0));\\n\\n vec3 col = palette(length(uv0) + i*.4 + iTime*.4);\\n\\n d = sin(d*5. + iTime)/5.;\\n d = abs(d);\\n\\n d = pow(0.01 / d, 1.2);\\n\\n finalColor += col * d;\\n }\\n \\n fragColor = vec4(finalColor, 1.0);\\n}\\n \\nvoid main() {\\n mainImage(gl_FragColor, vUv);\\n}\"","export default \"#include <common>\\n \\nuniform vec3 iResolution;\\nuniform float iTime;\\nuniform vec2 iOffset;\\nvarying vec2 vUv;\\n\\nfloat snoise(vec3 uv, float res)\\n{\\n\\tconst vec3 s = vec3(1e0, 1e2, 1e3);\\n\\t\\n\\tuv *= res;\\n\\t\\n\\tvec3 uv0 = floor(mod(uv, res))*s;\\n\\tvec3 uv1 = floor(mod(uv+vec3(1.), res))*s;\\n\\t\\n\\tvec3 f = fract(uv); f = f*f*(3.0-2.0*f);\\n\\n\\tvec4 v = vec4(uv0.x+uv0.y+uv0.z, uv1.x+uv0.y+uv0.z,\\n\\t\\t \\t uv0.x+uv1.y+uv0.z, uv1.x+uv1.y+uv0.z);\\n\\n\\tvec4 r = fract(sin(v*1e-1)*1e3);\\n\\tfloat r0 = mix(mix(r.x, r.y, f.x), mix(r.z, r.w, f.x), f.y);\\n\\t\\n\\tr = fract(sin((v + uv1.z - uv0.z)*1e-1)*1e3);\\n\\tfloat r1 = mix(mix(r.x, r.y, f.x), mix(r.z, r.w, f.x), f.y);\\n\\t\\n\\treturn mix(r0, r1, f.z)*2.-1.;\\n}\\n\\nvoid mainImage( out vec4 fragColor, in vec2 fragCoord ) {\\n\\tvec2 p = -.5 + fragCoord.xy / iResolution.xy;\\n\\tp.x *= iResolution.x/iResolution.y;\\n\\t\\n\\tfloat color = 3.0 - (3.*length(2.*p));\\n\\t\\n\\tvec3 coord = vec3(atan(p.x,p.y)/6.2832+.5, length(p)*.4, .5);\\n\\t\\n\\tfor(int i = 1; i <= 7; i++)\\n\\t{\\n\\t\\tfloat power = pow(2.0, float(i));\\n\\t\\tcolor += (1.5 / power) * snoise(coord + vec3(0.,-iTime*.05, iTime*.01), power*16.);\\n\\t}\\n\\tfragColor = vec4( color, pow(max(color,0.),2.)*0.4, pow(max(color,0.),3.)*0.15 , 1.0);\\n}\\n\\nvoid main() {\\n mainImage(gl_FragColor, vUv);\\n}\"","export default \"uniform sampler2D tDiffuse;\\nvarying vec2 vUv;\\n\\nvoid main() {\\n\\tvec4 texel = texture2D( tDiffuse, vUv );\\n\\n\\tgl_FragColor = texel;\\n}\"","export default \"varying vec3 vBarycentric;\\nuniform vec3 baseColor;\\nuniform vec3 wireframeColor;\\nuniform float wireframeThickness;\\n\\nfloat edgeFactor() {\\n vec3 d = fwidth(vBarycentric);\\n vec3 a3 = smoothstep(vec3(0.0), d * wireframeThickness, vBarycentric);\\n return min(min(a3.x, a3.y), a3.z);\\n}\\n\\nvoid main() {\\n float edge = edgeFactor();\\n\\n vec3 wireColor = wireframeColor;\\n\\n vec3 finalColor = mix(wireColor, baseColor, edge);\\n \\n gl_FragColor = vec4(finalColor, 1.0);\\n}\\n\"","export default \"uniform vec2 uvScale;\\nvarying vec2 vUv;\\n\\nvoid main() {\\n\\tvUv = uv;\\n\\tvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\\n\\tgl_Position = projectionMatrix * mvPosition;\\n}\"","export default \"varying vec3 vBarycentric;\\n\\nvoid main() {\\n vec3 barycentric = vec3(0.0);\\n int index = gl_VertexID % 3;\\n if (index == 0) barycentric = vec3(1.0, 0.0, 0.0);\\n else if (index == 1) barycentric = vec3(0.0, 1.0, 0.0);\\n else barycentric = vec3(0.0, 0.0, 1.0);\\n vBarycentric = barycentric;\\n \\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\\n}\\n\"","/* Fragment Shaders **/\nimport starsTest from '../graphics/shaders/fragment/stars.glsl';\nimport fireFragment from '../graphics/shaders/fragment/fire.glsl';\nimport fragmentShader from '../graphics/shaders/fragment/standard.glsl';\nimport debugFragment from '../graphics/shaders/fragment/debug.glsl';\n\n/* Vertex Shaders **/\nimport vertexShader from '../graphics/shaders/vertex/object-shader.glsl';\nimport debugVertexShader from '../graphics/shaders/vertex/debug.glsl';\n\nexport type ZylemShaderObject = { fragment: string, vertex: string };\n\nconst starShader: ZylemShaderObject = {\n\tfragment: starsTest,\n\tvertex: vertexShader\n};\n\nconst fireShader: ZylemShaderObject = {\n\tfragment: fireFragment,\n\tvertex: vertexShader\n};\n\nconst standardShader: ZylemShaderObject = {\n\tfragment: fragmentShader,\n\tvertex: vertexShader\n};\n\nconst debugShader: ZylemShaderObject = {\n\tfragment: debugFragment,\n\tvertex: debugVertexShader\n};\n\nexport type ZylemShaderType = 'standard' | 'fire' | 'star' | 'debug';\n\nconst shaderMap: Map<ZylemShaderType, ZylemShaderObject> = new Map();\nshaderMap.set('standard', standardShader);\nshaderMap.set('fire', fireShader);\nshaderMap.set('star', starShader);\nshaderMap.set('debug', debugShader);\n\nexport default shaderMap;","import {\n\tColor,\n\tMaterial,\n\tMeshPhongMaterial,\n\tMeshStandardMaterial,\n\tRepeatWrapping,\n\tShaderMaterial,\n\tTextureLoader,\n\tVector2,\n\tVector3\n} from 'three';\nimport { shortHash, sortedStringify } from '../core/utility/strings';\nimport shaderMap, { ZylemShaderObject, ZylemShaderType } from '../core/preset-shader';\n\nexport interface MaterialOptions {\n\tpath?: string;\n\trepeat?: Vector2;\n\tshader?: ZylemShaderType;\n\tcolor?: Color;\n}\n\ntype BatchGeometryMap = Map<symbol, number>;\n\ninterface BatchMaterialMapObject {\n\tgeometryMap: BatchGeometryMap;\n\tmaterial: Material;\n};\n\ntype BatchKey = ReturnType<typeof shortHash>;\n\nexport type TexturePath = string | null;\n\nexport class MaterialBuilder {\n\tstatic batchMaterialMap: Map<BatchKey, BatchMaterialMapObject> = new Map();\n\n\tmaterials: Material[] = [];\n\n\tbatchMaterial(options: Partial<MaterialOptions>, entityType: symbol) {\n\t\tconst batchKey = shortHash(sortedStringify(options));\n\t\tconst mappedObject = MaterialBuilder.batchMaterialMap.get(batchKey);\n\t\tif (mappedObject) {\n\t\t\tconst count = mappedObject.geometryMap.get(entityType);\n\t\t\tif (count) {\n\t\t\t\tmappedObject.geometryMap.set(entityType, count + 1);\n\t\t\t} else {\n\t\t\t\tmappedObject.geometryMap.set(entityType, 1);\n\t\t\t}\n\t\t} else {\n\t\t\tMaterialBuilder.batchMaterialMap.set(\n\t\t\t\tbatchKey, {\n\t\t\t\tgeometryMap: new Map([[entityType, 1]]),\n\t\t\t\tmaterial: this.materials[0]\n\t\t\t});\n\t\t}\n\t}\n\n\tasync build(options: Partial<MaterialOptions>, entityType: symbol) {\n\t\tconst { path, repeat, color, shader } = options;\n\t\tif (shader) this.withShader(shader);\n\t\tif (color) this.withColor(color);\n\t\tawait this.setTexture(path ?? null, repeat);\n\t\tif (this.materials.length === 0) {\n\t\t\tthis.setColor(new Color('#ffffff'));\n\t\t}\n\t\tthis.batchMaterial(options, entityType);\n\t}\n\n\twithColor(color: Color): this {\n\t\tthis.setColor(color);\n\t\treturn this;\n\t}\n\n\twithShader(shaderType: ZylemShaderType): this {\n\t\tthis.setShader(shaderType);\n\t\treturn this;\n\t}\n\n\tasync setTexture(texturePath: TexturePath = null, repeat: Vector2 = new Vector2(1, 1)) {\n\t\tif (!texturePath) {\n\t\t\treturn;\n\t\t}\n\t\tconst loader = new TextureLoader();\n\t\tconst texture = await loader.loadAsync(texturePath as string);\n\t\ttexture.repeat = repeat;\n\t\ttexture.wrapS = RepeatWrapping;\n\t\ttexture.wrapT = RepeatWrapping;\n\t\tconst material = new MeshPhongMaterial({\n\t\t\tmap: texture,\n\t\t});\n\t\tthis.materials.push(material);\n\t}\n\n\tsetColor(color: Color) {\n\t\tconst material = new MeshStandardMaterial({\n\t\t\tcolor: color,\n\t\t\temissiveIntensity: 0.5,\n\t\t\tlightMapIntensity: 0.5,\n\t\t\tfog: true,\n\t\t});\n\n\t\tthis.materials.push(material);\n\t}\n\n\tsetShader(customShader: ZylemShaderType) {\n\t\tconst { fragment, vertex } = shaderMap.get(customShader) ?? shaderMap.get('standard') as ZylemShaderObject;\n\n\t\tconst shader = new ShaderMaterial({\n\t\t\tuniforms: {\n\t\t\t\tiResolution: { value: new Vector3(1, 1, 1) },\n\t\t\t\tiTime: { value: 0 },\n\t\t\t\ttDiffuse: { value: null },\n\t\t\t\ttDepth: { value: null },\n\t\t\t\ttNormal: { value: null }\n\t\t\t},\n\t\t\tvertexShader: vertex,\n\t\t\tfragmentShader: fragment,\n\t\t});\n\t\tthis.materials.push(shader);\n\t}\n}\n","import { ColliderDesc } from \"@dimforge/rapier3d-compat\";\nimport { GameEntity, GameEntityOptions } from \"./entity\";\nimport { BufferGeometry, Group, Material, Mesh, Color } from \"three\";\nimport { CollisionBuilder } from \"../collision/collision-builder\";\nimport { MeshBuilder } from \"../graphics/mesh\";\nimport { MaterialBuilder, MaterialOptions } from \"../graphics/material\";\nimport { Vec3 } from \"../core/vector\";\n\nexport abstract class EntityCollisionBuilder extends CollisionBuilder {\n\tabstract collider(options: GameEntityOptions): ColliderDesc;\n}\n\nexport abstract class EntityMeshBuilder extends MeshBuilder {\n\tbuild(options: GameEntityOptions): BufferGeometry {\n\t\treturn new BufferGeometry();\n\t}\n\n\tpostBuild(): void {\n\t\treturn;\n\t}\n}\n\nexport abstract class EntityBuilder<T extends GameEntity<U> & P, U extends GameEntityOptions, P = any> {\n\tprotected meshBuilder: EntityMeshBuilder | null;\n\tprotected collisionBuilder: EntityCollisionBuilder | null;\n\tprotected materialBuilder: MaterialBuilder | null;\n\tprotected options: Partial<U>;\n\tprotected entity: T;\n\n\tconstructor(\n\t\toptions: Partial<U>,\n\t\tentity: T,\n\t\tmeshBuilder: EntityMeshBuilder | null,\n\t\tcollisionBuilder: EntityCollisionBuilder | null,\n\t) {\n\t\tthis.options = options;\n\t\tthis.entity = entity;\n\t\tthis.meshBuilder = meshBuilder;\n\t\tthis.collisionBuilder = collisionBuilder;\n\t\tthis.materialBuilder = new MaterialBuilder();\n\t\tconst builders: NonNullable<GameEntityOptions[\"_builders\"]> = {\n\t\t\tmeshBuilder: this.meshBuilder,\n\t\t\tcollisionBuilder: this.collisionBuilder,\n\t\t\tmaterialBuilder: this.materialBuilder,\n\t\t};\n\t\t(this.options as Partial<GameEntityOptions>)._builders = builders;\n\t}\n\n\twithPosition(setupPosition: Vec3): this {\n\t\tthis.options.position = setupPosition;\n\t\treturn this;\n\t}\n\n\tasync withMaterial(options: Partial<MaterialOptions>, entityType: symbol): Promise<this> {\n\t\tif (this.materialBuilder) {\n\t\t\tawait this.materialBuilder.build(options, entityType);\n\t\t}\n\t\treturn this;\n\t}\n\n\tapplyMaterialToGroup(group: Group, materials: Material[]): void {\n\t\tgroup.traverse((child) => {\n\t\t\tif (child instanceof Mesh) {\n\t\t\t\tif (child.type === 'SkinnedMesh' && materials[0] && !child.material.map) {\n\t\t\t\t\tchild.material = materials[0];\n\t\t\t\t}\n\t\t\t}\n\t\t\tchild.castShadow = true;\n\t\t\tchild.receiveShadow = true;\n\t\t});\n\t}\n\n\tasync build(): Promise<T> {\n\t\tconst entity = this.entity;\n\t\tif (this.materialBuilder) {\n\t\t\tentity.materials = this.materialBuilder.materials;\n\t\t}\n\t\tif (this.meshBuilder && entity.materials) {\n\t\t\tconst geometry = this.meshBuilder.build(this.options);\n\t\t\tentity.mesh = this.meshBuilder._build(this.options, geometry, entity.materials);\n\t\t\tthis.meshBuilder.postBuild();\n\t\t}\n\n\t\tif (entity.group && entity.materials) {\n\t\t\tthis.applyMaterialToGroup(entity.group, entity.materials);\n\t\t}\n\n\t\tif (this.collisionBuilder) {\n\t\t\tthis.collisionBuilder.withCollision(this.options?.collision || {});\n\t\t\tconst [bodyDesc, colliderDesc] = this.collisionBuilder.build(this.options as any);\n\t\t\tentity.bodyDesc = bodyDesc;\n\t\t\tentity.colliderDesc = colliderDesc;\n\n\t\t\tconst { x, y, z } = this.options.position || { x: 0, y: 0, z: 0 };\n\t\t\tentity.bodyDesc.setTranslation(x, y, z);\n\t\t}\n\t\tif (this.options.collisionType) {\n\t\t\tentity.collisionType = this.options.collisionType;\n\t\t}\n\n\t\tif (this.options.color instanceof Color) {\n\t\t\tconst applyColor = (material: Material) => {\n\t\t\t\tconst anyMat = material as any;\n\t\t\t\tif (anyMat && anyMat.color && anyMat.color.set) {\n\t\t\t\t\tanyMat.color.set(this.options.color as Color);\n\t\t\t\t}\n\t\t\t};\n\t\t\tif (entity.materials?.length) {\n\t\t\t\tfor (const mat of entity.materials) applyColor(mat);\n\t\t\t}\n\t\t\tif (entity.mesh && entity.mesh.material) {\n\t\t\t\tconst mat = entity.mesh.material as any;\n\t\t\t\tif (Array.isArray(mat)) mat.forEach(applyColor); else applyColor(mat);\n\t\t\t}\n\t\t\tif (entity.group) {\n\t\t\t\tentity.group.traverse((child) => {\n\t\t\t\t\tif (child instanceof Mesh && child.material) {\n\t\t\t\t\t\tconst mat = child.material as any;\n\t\t\t\t\t\tif (Array.isArray(mat)) mat.forEach(applyColor); else applyColor(mat);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn entity;\n\t}\n\n\tprotected abstract createEntity(options: Partial<U>): T;\n}","import { ActiveCollisionTypes, ColliderDesc } from '@dimforge/rapier3d-compat';\nimport { BufferGeometry, Object3D, SkinnedMesh, Group, Vector3 } from 'three';\nimport { BaseNode } from '../core/base-node';\nimport { GameEntityOptions, GameEntity } from './entity';\nimport { createEntity } from './create';\nimport { UpdateContext, UpdateFunction } from '../core/base-node-life-cycle';\nimport { EntityAssetLoader } from '../core/entity-asset-loader';\nimport { EntityLoaderDelegate } from './delegates/loader';\nimport { Vec3 } from '../core/vector';\nimport { AnimationDelegate, AnimationOptions } from './delegates/animation';\nimport { MaterialOptions } from '../graphics/material';\nimport { DebugInfoProvider } from './delegates/debug';\nimport { EntityBuilder } from './builder';\nimport { EntityCollisionBuilder } from './builder';\n\ntype AnimationObject = {\n\tkey?: string;\n\tpath: string;\n};\n\ntype ZylemActorOptions = GameEntityOptions & {\n\tstatic?: boolean;\n\tanimations?: AnimationObject[];\n\tmodels?: string[];\n\tscale?: Vec3;\n\tmaterial?: MaterialOptions;\n};\n\nconst actorDefaults: ZylemActorOptions = {\n\tposition: { x: 0, y: 0, z: 0 },\n\tcollision: {\n\t\tstatic: false,\n\t\tsize: new Vector3(0.5, 0.5, 0.5),\n\t\tposition: new Vector3(0, 0, 0),\n\t},\n\tmaterial: {\n\t\tshader: 'standard',\n\t},\n\tanimations: [],\n\tmodels: []\n};\n\nclass ActorCollisionBuilder extends EntityCollisionBuilder {\n\tprivate height: number = 1;\n\tprivate objectModel: Group | null = null;\n\n\tconstructor(data: any) {\n\t\tsuper();\n\t\tthis.objectModel = data.objectModel;\n\t}\n\n\tcreateColliderFromObjectModel(objectModel: Group | null): ColliderDesc {\n\t\tif (!objectModel) return ColliderDesc.capsule(1, 1);\n\n\t\tconst skinnedMesh = objectModel.children.find(child => child instanceof SkinnedMesh) as SkinnedMesh;\n\t\tconst geometry = skinnedMesh.geometry as BufferGeometry;\n\n\t\tif (geometry) {\n\t\t\tgeometry.computeBoundingBox();\n\t\t\tif (geometry.boundingBox) {\n\t\t\t\tconst maxY = geometry.boundingBox.max.y;\n\t\t\t\tconst minY = geometry.boundingBox.min.y;\n\t\t\t\tthis.height = maxY - minY;\n\t\t\t}\n\t\t}\n\t\tthis.height = 1;\n\t\tlet colliderDesc = ColliderDesc.capsule(this.height / 2, 1);\n\t\tcolliderDesc.setSensor(false);\n\t\tcolliderDesc.setTranslation(0, this.height + 0.5, 0);\n\t\tcolliderDesc.activeCollisionTypes = ActiveCollisionTypes.DEFAULT;\n\n\t\treturn colliderDesc;\n\t}\n\n\tcollider(options: ZylemActorOptions): ColliderDesc {\n\t\tlet colliderDesc = this.createColliderFromObjectModel(this.objectModel);\n\n\t\treturn colliderDesc;\n\t}\n}\n\nclass ActorBuilder extends EntityBuilder<ZylemActor, ZylemActorOptions> {\n\tprotected createEntity(options: Partial<ZylemActorOptions>): ZylemActor {\n\t\treturn new ZylemActor(options);\n\t}\n}\n\nconst ACTOR_TYPE = Symbol('Actor');\n\nexport class ZylemActor extends GameEntity<ZylemActorOptions> implements EntityLoaderDelegate, DebugInfoProvider {\n\tstatic type = ACTOR_TYPE;\n\n\tprivate _object: Object3D | null = null;\n\tprivate _animationDelegate: AnimationDelegate | null = null;\n\tprivate _modelFileNames: string[] = [];\n\tprivate _assetLoader: EntityAssetLoader = new EntityAssetLoader();\n\n\tcontrolledRotation: boolean = false;\n\n\tconstructor(options?: ZylemActorOptions) {\n\t\tsuper();\n\t\tthis.options = { ...actorDefaults, ...options };\n\t\tthis.lifeCycleDelegate = {\n\t\t\tupdate: [this.actorUpdate.bind(this) as UpdateFunction<ZylemActorOptions>],\n\t\t};\n\t\tthis.controlledRotation = true;\n\t}\n\n\tasync load(): Promise<void> {\n\t\tthis._modelFileNames = this.options.models || [];\n\t\tawait this.loadModels();\n\t\tif (this._object) {\n\t\t\tthis._animationDelegate = new AnimationDelegate(this._object);\n\t\t\tawait this._animationDelegate.loadAnimations(this.options.animations || []);\n\t\t}\n\t}\n\n\tasync data(): Promise<any> {\n\t\treturn {\n\t\t\tanimations: this._animationDelegate?.animations,\n\t\t\tobjectModel: this._object,\n\t\t};\n\t}\n\n\tasync actorUpdate(params: UpdateContext<ZylemActorOptions>): Promise<void> {\n\t\tthis._animationDelegate?.update(params.delta);\n\t}\n\n\tprivate async loadModels(): Promise<void> {\n\t\tif (this._modelFileNames.length === 0) return;\n\t\tconst promises = this._modelFileNames.map(file => this._assetLoader.loadFile(file));\n\t\tconst results = await Promise.all(promises);\n\t\tif (results[0]?.object) {\n\t\t\tthis._object = results[0].object;\n\t\t}\n\t\tif (this._object) {\n\t\t\tthis.group = new Group();\n\t\t\tthis.group.attach(this._object);\n\t\t\tthis.group.scale.set(\n\t\t\t\tthis.options.scale?.x || 1,\n\t\t\t\tthis.options.scale?.y || 1,\n\t\t\t\tthis.options.scale?.z || 1\n\t\t\t);\n\t\t}\n\t}\n\n\tplayAnimation(animationOptions: AnimationOptions) {\n\t\tthis._animationDelegate?.playAnimation(animationOptions);\n\t}\n\n\tget object(): Object3D | null {\n\t\treturn this._object;\n\t}\n\n\t/**\n\t * Provide custom debug information for the actor\n\t * This will be merged with the default debug information\n\t */\n\tgetDebugInfo(): Record<string, any> {\n\t\tconst debugInfo: Record<string, any> = {\n\t\t\ttype: 'Actor',\n\t\t\tmodels: this._modelFileNames.length > 0 ? this._modelFileNames : 'none',\n\t\t\tmodelLoaded: !!this._object,\n\t\t\tscale: this.options.scale ?\n\t\t\t\t`${this.options.scale.x}, ${this.options.scale.y}, ${this.options.scale.z}` :\n\t\t\t\t'1, 1, 1',\n\t\t};\n\n\t\t// Add animation info if available\n\t\tif (this._animationDelegate) {\n\t\t\tdebugInfo.currentAnimation = this._animationDelegate.currentAnimationKey || 'none';\n\t\t\tdebugInfo.animationsCount = this.options.animations?.length || 0;\n\t\t}\n\n\t\t// Add mesh info if model is loaded\n\t\tif (this._object) {\n\t\t\tlet meshCount = 0;\n\t\t\tlet vertexCount = 0;\n\t\t\tthis._object.traverse((child) => {\n\t\t\t\tif ((child as any).isMesh) {\n\t\t\t\t\tmeshCount++;\n\t\t\t\t\tconst geometry = (child as SkinnedMesh).geometry;\n\t\t\t\t\tif (geometry && geometry.attributes.position) {\n\t\t\t\t\t\tvertexCount += geometry.attributes.position.count;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t\tdebugInfo.meshCount = meshCount;\n\t\t\tdebugInfo.vertexCount = vertexCount;\n\t\t}\n\n\t\treturn debugInfo;\n\t}\n}\n\ntype ActorOptions = BaseNode | ZylemActorOptions;\n\nexport async function actor(...args: Array<ActorOptions>): Promise<ZylemActor> {\n\treturn await createEntity<ZylemActor, ZylemActorOptions>({\n\t\targs,\n\t\tdefaultConfig: actorDefaults,\n\t\tEntityClass: ZylemActor,\n\t\tBuilderClass: ActorBuilder,\n\t\tCollisionBuilderClass: ActorCollisionBuilder,\n\t\tentityType: ZylemActor.type\n\t});\n}","\nexport function isCollisionHandlerDelegate(obj: any): obj is CollisionHandlerDelegate {\n\treturn typeof obj?.handlePostCollision === \"function\" && typeof obj?.handleIntersectionEvent === \"function\";\n}\n\nexport interface CollisionHandlerDelegate {\n\thandlePostCollision(params: any): boolean;\n\thandleIntersectionEvent(params: any): void;\n}\n\nclass CollisionHandler {\n\tentityReference: CollisionHandlerDelegate;\n\n\tconstructor(entity: CollisionHandlerDelegate) {\n\t\tthis.entityReference = entity;\n\t}\n\n\thandlePostCollision(params: any): boolean {\n\t\treturn this.entityReference.handlePostCollision(params);\n\t}\n\n\thandleIntersectionEvent(params: any) {\n\t\tthis.entityReference.handleIntersectionEvent(params);\n\t}\n}\n","import { Vector3 } from 'three';\nimport RAPIER, { World } from '@dimforge/rapier3d-compat';\n\nimport { Entity } from '../interfaces/entity';\nimport { state } from '../game/game-state';\nimport { UpdateContext } from '../core/base-node-life-cycle';\nimport { ZylemActor } from '../entities/actor';\nimport { isCollisionHandlerDelegate } from './collision-delegate';\nimport { GameEntity } from '../entities/entity';\n\nexport class ZylemWorld implements Entity<ZylemWorld> {\n\ttype = 'World';\n\tworld: World;\n\tcollisionMap: Map<string, GameEntity<any>> = new Map();\n\tcollisionBehaviorMap: Map<string, GameEntity<any>> = new Map();\n\t_removalMap: Map<string, GameEntity<any>> = new Map();\n\n\tstatic async loadPhysics(gravity: Vector3) {\n\t\tawait RAPIER.init();\n\t\tconst physicsWorld = new RAPIER.World(gravity);\n\t\treturn physicsWorld;\n\t}\n\n\tconstructor(world: World) {\n\t\tthis.world = world;\n\t}\n\n\taddEntity(entity: any) {\n\t\tconst rigidBody = this.world.createRigidBody(entity.bodyDesc);\n\t\tentity.body = rigidBody;\n\t\t// TODO: consider passing in more specific data\n\t\tentity.body.userData = { uuid: entity.uuid, ref: entity };\n\t\tif (this.world.gravity.x === 0 && this.world.gravity.y === 0 && this.world.gravity.z === 0) {\n\t\t\tentity.body.lockTranslations(true, true);\n\t\t\tentity.body.lockRotations(true, true);\n\t\t}\n\t\tconst collider = this.world.createCollider(entity.colliderDesc, entity.body);\n\t\tentity.collider = collider;\n\t\tif (entity.controlledRotation || entity instanceof ZylemActor) {\n\t\t\tentity.body.lockRotations(true, true);\n\t\t\tentity.characterController = this.world.createCharacterController(0.01);\n\t\t\tentity.characterController.setMaxSlopeClimbAngle(45 * Math.PI / 180);\n\t\t\tentity.characterController.setMinSlopeSlideAngle(30 * Math.PI / 180);\n\t\t\tentity.characterController.enableSnapToGround(0.01);\n\t\t\tentity.characterController.setSlideEnabled(true);\n\t\t\tentity.characterController.setApplyImpulsesToDynamicBodies(true);\n\t\t\tentity.characterController.setCharacterMass(1);\n\t\t}\n\t\tthis.collisionMap.set(entity.uuid, entity);\n\t}\n\n\tsetForRemoval(entity: any) {\n\t\tif (entity.body) {\n\t\t\tthis._removalMap.set(entity.uuid, entity);\n\t\t}\n\t}\n\n\tdestroyEntity(entity: GameEntity<any>) {\n\t\tif (entity.collider) {\n\t\t\tthis.world.removeCollider(entity.collider, true);\n\t\t}\n\t\tif (entity.body) {\n\t\t\tthis.world.removeRigidBody(entity.body);\n\t\t\tthis.collisionMap.delete(entity.uuid);\n\t\t\tthis._removalMap.delete(entity.uuid);\n\t\t}\n\t}\n\n\tsetup() { }\n\n\tupdate(params: UpdateContext<any>) {\n\t\tconst { delta } = params;\n\t\tif (!this.world) {\n\t\t\treturn;\n\t\t}\n\t\tthis.updateColliders(delta);\n\t\tthis.updatePostCollisionBehaviors(delta);\n\t\tthis.world.step();\n\t}\n\n\tupdatePostCollisionBehaviors(delta: number) {\n\t\tconst dictionaryRef = this.collisionBehaviorMap;\n\t\tfor (let [id, collider] of dictionaryRef) {\n\t\t\tconst gameEntity = collider as any;\n\t\t\tif (!isCollisionHandlerDelegate(gameEntity)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst active = gameEntity.handlePostCollision({ entity: gameEntity, delta });\n\t\t\tif (!active) {\n\t\t\t\tthis.collisionBehaviorMap.delete(id);\n\t\t\t}\n\t\t}\n\t}\n\n\tupdateColliders(delta: number) {\n\t\tconst dictionaryRef = this.collisionMap;\n\t\tfor (let [id, collider] of dictionaryRef) {\n\t\t\tconst gameEntity = collider as GameEntity<any>;\n\t\t\tif (!gameEntity.body) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (this._removalMap.get(gameEntity.uuid)) {\n\t\t\t\tthis.destroyEntity(gameEntity);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tthis.world.contactsWith(gameEntity.body.collider(0), (otherCollider) => {\n\t\t\t\t// @ts-ignore\n\t\t\t\tconst uuid = otherCollider._parent.userData.uuid;\n\t\t\t\tconst entity = dictionaryRef.get(uuid);\n\t\t\t\tif (!entity) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (gameEntity._collision) {\n\t\t\t\t\tgameEntity._collision(entity, state.globals);\n\t\t\t\t}\n\t\t\t});\n\t\t\tthis.world.intersectionsWith(gameEntity.body.collider(0), (otherCollider) => {\n\t\t\t\t// @ts-ignore\n\t\t\t\tconst uuid = otherCollider._parent.userData.uuid;\n\t\t\t\tconst entity = dictionaryRef.get(uuid);\n\t\t\t\tif (!entity) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (gameEntity._collision) {\n\t\t\t\t\tgameEntity._collision(entity, state.globals);\n\t\t\t\t}\n\t\t\t\tif (isCollisionHandlerDelegate(entity)) {\n\t\t\t\t\tentity.handleIntersectionEvent({ entity, other: gameEntity, delta });\n\t\t\t\t\tthis.collisionBehaviorMap.set(uuid, entity);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tdestroy() {\n\t\ttry {\n\t\t\tfor (const [, entity] of this.collisionMap) {\n\t\t\t\ttry { this.destroyEntity(entity); } catch { /* noop */ }\n\t\t\t}\n\t\t\tthis.collisionMap.clear();\n\t\t\tthis.collisionBehaviorMap.clear();\n\t\t\tthis._removalMap.clear();\n\t\t\t// @ts-ignore\n\t\t\tthis.world = undefined as any;\n\t\t} catch { /* noop */ }\n\t}\n\n}","import {\n\tScene,\n\tColor,\n\tAmbientLight,\n\tDirectionalLight,\n\tObject3D,\n\tVector3,\n\tTextureLoader,\n\tGridHelper\n} from 'three';\nimport { Entity, LifecycleFunction } from '../interfaces/entity';\nimport { GameEntity } from '../entities/entity';\nimport { ZylemCamera } from '../camera/zylem-camera';\nimport { debugState } from '../debug/debug-state';\nimport { SetupFunction } from '../core/base-node-life-cycle';\nimport { getGlobals } from '../game/game-state';\n\ninterface SceneState {\n\tbackgroundColor: Color | string;\n\tbackgroundImage: string | null;\n}\n\nexport class ZylemScene implements Entity<ZylemScene> {\n\tpublic type = 'Scene';\n\n\t_setup?: SetupFunction<ZylemScene>;\n\tscene!: Scene;\n\tzylemCamera!: ZylemCamera;\n\tcontainerElement: HTMLElement | null = null;\n\tupdate: LifecycleFunction<ZylemScene> = () => { };\n\t_collision?: ((entity: any, other: any, globals?: any) => void) | undefined;\n\t_destroy?: ((globals?: any) => void) | undefined;\n\tname?: string | undefined;\n\ttag?: Set<string> | undefined;\n\n\tconstructor(id: string, camera: ZylemCamera, state: SceneState) {\n\t\tconst scene = new Scene();\n\t\tconst isColor = state.backgroundColor instanceof Color;\n\t\tconst backgroundColor = (isColor) ? state.backgroundColor : new Color(state.backgroundColor);\n\t\tscene.background = backgroundColor as Color;\n\t\tif (state.backgroundImage) {\n\t\t\tconst loader = new TextureLoader();\n\t\t\tconst texture = loader.load(state.backgroundImage);\n\t\t\tscene.background = texture;\n\t\t}\n\n\t\tthis.scene = scene;\n\t\tthis.zylemCamera = camera;\n\n\t\tthis.setupLighting(scene);\n\t\tthis.setupCamera(scene, camera);\n\t\tif (debugState.enabled) {\n\t\t\tthis.debugScene();\n\t\t}\n\t}\n\n\tsetup() {\n\t\tif (this._setup) {\n\t\t\tthis._setup({ me: this, camera: this.zylemCamera, globals: getGlobals() });\n\t\t}\n\t}\n\n\tdestroy() {\n\t\tif (this.zylemCamera && (this.zylemCamera as any).destroy) {\n\t\t\t(this.zylemCamera as any).destroy();\n\t\t}\n\t\tif (this.scene) {\n\t\t\tthis.scene.traverse((obj: any) => {\n\t\t\t\tif (obj.geometry) {\n\t\t\t\t\tobj.geometry.dispose?.();\n\t\t\t\t}\n\t\t\t\tif (obj.material) {\n\t\t\t\t\tif (Array.isArray(obj.material)) {\n\t\t\t\t\t\tobj.material.forEach((m: any) => m.dispose?.());\n\t\t\t\t\t} else {\n\t\t\t\t\t\tobj.material.dispose?.();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\t/**\n\t * Setup camera with the scene\n\t */\n\tsetupCamera(scene: Scene, camera: ZylemCamera) {\n\t\tscene.add(camera.cameraRig);\n\t\t// Camera handles its own setup now\n\t\tcamera.setup(scene);\n\t}\n\n\t/**\n\t * Setup scene lighting\n\t */\n\tsetupLighting(scene: Scene) {\n\t\tconst ambientLight = new AmbientLight(0xffffff, 2);\n\t\tscene.add(ambientLight);\n\n\t\tconst directionalLight = new DirectionalLight(0xffffff, 2);\n\t\tdirectionalLight.name = 'Light';\n\t\tdirectionalLight.position.set(0, 100, 0);\n\t\tdirectionalLight.castShadow = true;\n\t\tdirectionalLight.shadow.camera.near = 0.1;\n\t\tdirectionalLight.shadow.camera.far = 2000;\n\t\tdirectionalLight.shadow.camera.left = -100;\n\t\tdirectionalLight.shadow.camera.right = 100;\n\t\tdirectionalLight.shadow.camera.top = 100;\n\t\tdirectionalLight.shadow.camera.bottom = -100;\n\t\tdirectionalLight.shadow.mapSize.width = 2048;\n\t\tdirectionalLight.shadow.mapSize.height = 2048;\n\t\tscene.add(directionalLight);\n\t}\n\n\t/**\n\t * Update renderer size - delegates to camera\n\t */\n\tupdateRenderer(width: number, height: number) {\n\t\tthis.zylemCamera.resize(width, height);\n\t}\n\n\t/**\n\t * Add object to scene\n\t */\n\tadd(object: Object3D, position: Vector3 = new Vector3(0, 0, 0)) {\n\t\tobject.position.set(position.x, position.y, position.z);\n\t\tthis.scene.add(object);\n\t}\n\n\t/**\n\t * Add game entity to scene\n\t */\n\taddEntity(entity: GameEntity<any>) {\n\t\tif (entity.group) {\n\t\t\tthis.add(entity.group, entity.options.position);\n\t\t} else if (entity.mesh) {\n\t\t\tthis.add(entity.mesh, entity.options.position);\n\t\t}\n\t}\n\n\t/**\n\t * Add debug helpers to scene\n\t */\n\tdebugScene() {\n\t\tconst size = 1000;\n\t\tconst divisions = 100;\n\n\t\tconst gridHelper = new GridHelper(size, divisions);\n\t\tthis.scene.add(gridHelper);\n\t}\n}","import { Color, Vector3 } from 'three';\nimport { proxy, subscribe } from 'valtio/vanilla';\nimport { BaseEntityInterface } from '../types/entity-types';\nimport { StageStateInterface } from '../types/stage-types';\nimport { getByPath, setByPath } from '../core/utility/path-utils';\n\n/**\n * Stage state proxy for reactive updates.\n */\nconst stageState = proxy({\n\tbackgroundColor: new Color(Color.NAMES.cornflowerblue),\n\tbackgroundImage: null,\n\tinputs: {\n\t\tp1: ['gamepad-1', 'keyboard-1'],\n\t\tp2: ['gamepad-2', 'keyboard-2'],\n\t},\n\tvariables: {},\n\tgravity: new Vector3(0, 0, 0),\n\tentities: [],\n} as StageStateInterface);\n\n// ============================================================\n// Stage state setters (internal use)\n// ============================================================\n\nconst setStageBackgroundColor = (value: Color) => {\n\tstageState.backgroundColor = value;\n};\n\nconst setStageBackgroundImage = (value: string | null) => {\n\tstageState.backgroundImage = value;\n};\n\nconst setEntitiesToStage = (entities: Partial<BaseEntityInterface>[]) => {\n\tstageState.entities = entities;\n};\n\n/** Replace the entire stage variables object (used on stage load). */\nconst setStageVariables = (variables: Record<string, any>) => {\n\tstageState.variables = { ...variables };\n};\n\n/** Reset all stage variables (used on stage unload). */\nconst resetStageVariables = () => {\n\tstageState.variables = {};\n};\n\nconst stageStateToString = (state: StageStateInterface) => {\n\tlet string = `\\n`;\n\tfor (const key in state) {\n\t\tconst value = state[key as keyof StageStateInterface];\n\t\tstring += `${key}:\\n`;\n\t\tif (key === 'entities') {\n\t\t\tfor (const entity of state.entities) {\n\t\t\t\tstring += ` ${entity.uuid}: ${entity.name}\\n`;\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\tif (typeof value === 'object' && value !== null) {\n\t\t\tfor (const subKey in value as Record<string, any>) {\n\t\t\t\tconst subValue = value?.[subKey as keyof typeof value];\n\t\t\t\tif (subValue) {\n\t\t\t\t\tstring += ` ${subKey}: ${subValue}\\n`;\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (typeof value === 'string') {\n\t\t\tstring += ` ${key}: ${value}\\n`;\n\t\t}\n\t}\n\treturn string;\n};\n\n// ============================================================\n// Object-scoped variable storage (WeakMap-based)\n// ============================================================\n\n/**\n * WeakMap to store variables keyed by object reference.\n * Variables are automatically garbage collected when the target is collected.\n */\nconst variableStore = new WeakMap<object, Record<string, unknown>>();\n\n/**\n * Separate proxy store for reactivity. We need a regular Map for subscriptions\n * since WeakMap doesn't support iteration/subscriptions.\n */\nconst variableProxyStore = new Map<object, ReturnType<typeof proxy>>();\n\nfunction getOrCreateVariableProxy(target: object): Record<string, unknown> {\n\tlet store = variableProxyStore.get(target) as Record<string, unknown> | undefined;\n\tif (!store) {\n\t\tstore = proxy({});\n\t\tvariableProxyStore.set(target, store);\n\t}\n\treturn store;\n}\n\n/**\n * Set a variable on an object by path.\n * @example setVariable(stage1, 'totalAngle', 0.5)\n * @example setVariable(entity, 'enemy.count', 10)\n */\nexport function setVariable(target: object, path: string, value: unknown): void {\n\tconst store = getOrCreateVariableProxy(target);\n\tsetByPath(store, path, value);\n}\n\n/**\n * Create/initialize a variable with a default value on a target object.\n * Only sets the value if it doesn't already exist.\n * @example createVariable(stage1, 'totalAngle', 0)\n * @example createVariable(entity, 'enemy.count', 10)\n */\nexport function createVariable<T>(target: object, path: string, defaultValue: T): T {\n\tconst store = getOrCreateVariableProxy(target);\n\tconst existing = getByPath<T>(store, path);\n\tif (existing === undefined) {\n\t\tsetByPath(store, path, defaultValue);\n\t\treturn defaultValue;\n\t}\n\treturn existing;\n}\n\n/**\n * Get a variable from an object by path.\n * @example getVariable(stage1, 'totalAngle') // 0.5\n * @example getVariable<number>(entity, 'enemy.count') // 10\n */\nexport function getVariable<T = unknown>(target: object, path: string): T | undefined {\n\tconst store = variableProxyStore.get(target);\n\tif (!store) return undefined;\n\treturn getByPath<T>(store, path);\n}\n\n/**\n * Subscribe to changes on a variable at a specific path for a target object.\n * Returns an unsubscribe function.\n * @example const unsub = onVariableChange(stage1, 'score', (val) => console.log(val));\n */\nexport function onVariableChange<T = unknown>(\n\ttarget: object,\n\tpath: string,\n\tcallback: (value: T) => void\n): () => void {\n\tconst store = getOrCreateVariableProxy(target);\n\tlet previous = getByPath<T>(store, path);\n\treturn subscribe(store, () => {\n\t\tconst current = getByPath<T>(store, path);\n\t\tif (current !== previous) {\n\t\t\tprevious = current;\n\t\t\tcallback(current as T);\n\t\t}\n\t});\n}\n\n/**\n * Subscribe to changes on multiple variable paths for a target object.\n * Callback fires when any of the paths change, receiving all current values.\n * Returns an unsubscribe function.\n * @example const unsub = onVariableChanges(stage1, ['count', 'total'], ([count, total]) => console.log(count, total));\n */\nexport function onVariableChanges<T extends unknown[] = unknown[]>(\n\ttarget: object,\n\tpaths: string[],\n\tcallback: (values: T) => void\n): () => void {\n\tconst store = getOrCreateVariableProxy(target);\n\tlet previousValues = paths.map(p => getByPath(store, p));\n\treturn subscribe(store, () => {\n\t\tconst currentValues = paths.map(p => getByPath(store, p));\n\t\tconst hasChange = currentValues.some((val, i) => val !== previousValues[i]);\n\t\tif (hasChange) {\n\t\t\tpreviousValues = currentValues;\n\t\t\tcallback(currentValues as T);\n\t\t}\n\t});\n}\n\n/**\n * Clear all variables for a target object. Used on stage/entity dispose.\n */\nexport function clearVariables(target: object): void {\n\tvariableProxyStore.delete(target);\n}\n\n// ============================================================\n// Legacy stage variable functions (internal, for stage defaults)\n// ============================================================\n\nconst setStageVariable = (key: string, value: any) => {\n\tstageState.variables[key] = value;\n};\n\nconst getStageVariable = (key: string) => {\n\tif (stageState.variables.hasOwnProperty(key)) {\n\t\treturn stageState.variables[key];\n\t} else {\n\t\tconsole.warn(`Stage variable ${key} not found`);\n\t}\n};\n\nexport {\n\tstageState,\n\t\n\tsetStageBackgroundColor,\n\tsetStageBackgroundImage,\n\t\n\tstageStateToString,\n\tsetStageVariable,\n\tgetStageVariable,\n\tsetStageVariables,\n\tresetStageVariables,\n};","import { Color, Vector3 as ThreeVector3 } from 'three';\nimport { Vector3 } from '@dimforge/rapier3d-compat';\n\n// TODO: needs implementations\n/**\n * @deprecated This type is deprecated.\n */\nexport type Vect3 = ThreeVector3 | Vector3;\n\nexport const ZylemBlueColor = new Color('#0333EC');\nconst ZylemBlue = '#0333EC';\nconst ZylemBlueTransparent = '#0333ECA0';\nconst ZylemGoldText = '#DAA420';\n\ntype SizeVector = Vect3 | null;\n\nconst Vec0 = new Vector3(0, 0, 0);\nconst Vec1 = new Vector3(1, 1, 1);","import { DestroyContext, DestroyFunction, SetupContext, SetupFunction, UpdateContext, UpdateFunction } from './base-node-life-cycle';\n\n/**\n * Provides BaseNode-like lifecycle without ECS/children. Consumers implement\n * the protected hooks and may assign public setup/update/destroy callbacks.\n */\nexport abstract class LifeCycleBase<TSelf> {\n\tupdate: UpdateFunction<TSelf> = () => { };\n\tsetup: SetupFunction<TSelf> = () => { };\n\tdestroy: DestroyFunction<TSelf> = () => { };\n\n\tprotected abstract _setup(context: SetupContext<TSelf>): void;\n\tprotected abstract _update(context: UpdateContext<TSelf>): void;\n\tprotected abstract _destroy(context: DestroyContext<TSelf>): void;\n\n\tnodeSetup(context: SetupContext<TSelf>) {\n\t\tif (typeof (this as any)._setup === 'function') {\n\t\t\tthis._setup(context);\n\t\t}\n\t\tif (this.setup) {\n\t\t\tthis.setup(context);\n\t\t}\n\t}\n\n\tnodeUpdate(context: UpdateContext<TSelf>) {\n\t\tif (typeof (this as any)._update === 'function') {\n\t\t\tthis._update(context);\n\t\t}\n\t\tif (this.update) {\n\t\t\tthis.update(context);\n\t\t}\n\t}\n\n\tnodeDestroy(context: DestroyContext<TSelf>) {\n\t\tif (this.destroy) {\n\t\t\tthis.destroy(context);\n\t\t}\n\t\tif (typeof (this as any)._destroy === 'function') {\n\t\t\tthis._destroy(context);\n\t\t}\n\t}\n}\n\n\n","export const Perspectives = {\n\tFirstPerson: 'first-person',\n\tThirdPerson: 'third-person',\n\tIsometric: 'isometric',\n\tFlat2D: 'flat-2d',\n\tFixed2D: 'fixed-2d',\n} as const;\n\nexport type PerspectiveType = (typeof Perspectives)[keyof typeof Perspectives];","import { Scene, Vector2, Vector3, WebGLRenderer } from 'three';\nimport { PerspectiveController, ZylemCamera } from './zylem-camera';\nimport { StageEntity } from '../interfaces/entity';\n\ninterface ThirdPersonCameraOptions {\n\ttarget: StageEntity;\n\tdistance: Vector3;\n\tscreenResolution: Vector2;\n\trenderer: WebGLRenderer;\n\tscene: Scene;\n}\n\nexport class ThirdPersonCamera implements PerspectiveController {\n\tdistance: Vector3;\n\tscreenResolution: Vector2 | null = null;\n\trenderer: WebGLRenderer | null = null;\n\tscene: Scene | null = null;\n\tcameraRef: ZylemCamera | null = null;\n\n\tconstructor() {\n\t\tthis.distance = new Vector3(0, 5, 8);\n\t}\n\n\t/**\n\t * Setup the third person camera controller\n\t */\n\tsetup(params: { screenResolution: Vector2; renderer: WebGLRenderer; scene: Scene; camera: ZylemCamera }) {\n\t\tconst { screenResolution, renderer, scene, camera } = params;\n\t\tthis.screenResolution = screenResolution;\n\t\tthis.renderer = renderer;\n\t\tthis.scene = scene;\n\t\tthis.cameraRef = camera;\n\t}\n\n\t/**\n\t * Update the third person camera\n\t */\n\tupdate(delta: number) {\n\t\tif (!this.cameraRef!.target) {\n\t\t\treturn;\n\t\t}\n\t\t// TODO: Implement third person camera following logic\n\t\tconst desiredCameraPosition = this.cameraRef!.target!.group.position.clone().add(this.distance);\n\t\tthis.cameraRef!.camera.position.lerp(desiredCameraPosition, 0.1);\n\t\tthis.cameraRef!.camera.lookAt(this.cameraRef!.target!.group.position);\n\t}\n\n\t/**\n\t * Handle resize events\n\t */\n\tresize(width: number, height: number) {\n\t\tif (this.screenResolution) {\n\t\t\tthis.screenResolution.set(width, height);\n\t\t}\n\t\t// TODO: Handle any third-person specific resize logic\n\t}\n\n\t/**\n\t * Set the distance from the target\n\t */\n\tsetDistance(distance: Vector3) {\n\t\tthis.distance = distance;\n\t}\n}","import { Scene, Vector2, WebGLRenderer } from 'three';\nimport { PerspectiveController, ZylemCamera } from './zylem-camera';\n\n/**\n * Fixed 2D Camera Controller\n * Maintains a static 2D camera view with no automatic following or movement\n */\nexport class Fixed2DCamera implements PerspectiveController {\n\tscreenResolution: Vector2 | null = null;\n\trenderer: WebGLRenderer | null = null;\n\tscene: Scene | null = null;\n\tcameraRef: ZylemCamera | null = null;\n\n\tconstructor() {\n\t\t// Fixed 2D camera doesn't need any initial setup parameters\n\t}\n\n\t/**\n\t * Setup the fixed 2D camera controller\n\t */\n\tsetup(params: { screenResolution: Vector2; renderer: WebGLRenderer; scene: Scene; camera: ZylemCamera }) {\n\t\tconst { screenResolution, renderer, scene, camera } = params;\n\t\tthis.screenResolution = screenResolution;\n\t\tthis.renderer = renderer;\n\t\tthis.scene = scene;\n\t\tthis.cameraRef = camera;\n\n\t\t// Position camera for 2D view (looking down the Z-axis)\n\t\tthis.cameraRef.camera.position.set(0, 0, 10);\n\t\tthis.cameraRef.camera.lookAt(0, 0, 0);\n\t}\n\n\t/**\n\t * Update the fixed 2D camera\n\t * Fixed cameras don't need to update position/rotation automatically\n\t */\n\tupdate(delta: number) {\n\t\t// Fixed 2D camera maintains its position and orientation\n\t\t// No automatic updates needed for a truly fixed camera\n\t}\n\n\t/**\n\t * Handle resize events for 2D camera\n\t */\n\tresize(width: number, height: number) {\n\t\tif (this.screenResolution) {\n\t\t\tthis.screenResolution.set(width, height);\n\t\t}\n\n\t\t// For orthographic cameras, we might need to adjust the frustum\n\t\t// This is handled in the main ZylemCamera resize method\n\t}\n}\n","export default \"varying vec2 vUv;\\n\\nvoid main() {\\n\\tvUv = uv;\\n\\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\\n}\"","import * as THREE from 'three';\nimport fragmentShader from './shaders/fragment/standard.glsl';\nimport vertexShader from './shaders/vertex/standard.glsl';\nimport { WebGLRenderer, WebGLRenderTarget } from 'three';\nimport { Pass, FullScreenQuad } from 'three/addons/postprocessing/Pass.js';\n\nexport default class RenderPass extends Pass {\n\tfsQuad: FullScreenQuad;\n\tresolution: THREE.Vector2;\n\tscene: THREE.Scene;\n\tcamera: THREE.Camera;\n\trgbRenderTarget: WebGLRenderTarget;\n\tnormalRenderTarget: WebGLRenderTarget;\n\tnormalMaterial: THREE.Material;\n\n\tconstructor(resolution: THREE.Vector2, scene: THREE.Scene, camera: THREE.Camera) {\n\t\tsuper();\n\t\tthis.resolution = resolution;\n\t\tthis.fsQuad = new FullScreenQuad(this.material());\n\t\tthis.scene = scene;\n\t\tthis.camera = camera;\n\n\t\tthis.rgbRenderTarget = new WebGLRenderTarget(resolution.x * 4, resolution.y * 4);\n\t\tthis.normalRenderTarget = new WebGLRenderTarget(resolution.x * 4, resolution.y * 4);\n\n\t\tthis.normalMaterial = new THREE.MeshNormalMaterial();\n\t}\n\n\trender(\n\t\trenderer: WebGLRenderer,\n\t\twriteBuffer: WebGLRenderTarget\n\t) {\n\t\trenderer.setRenderTarget(this.rgbRenderTarget);\n\t\trenderer.render(this.scene, this.camera);\n\n\t\tconst overrideMaterial_old = this.scene.overrideMaterial;\n\t\trenderer.setRenderTarget(this.normalRenderTarget);\n\t\tthis.scene.overrideMaterial = this.normalMaterial;\n\t\trenderer.render(this.scene, this.camera);\n\t\tthis.scene.overrideMaterial = overrideMaterial_old;\n\n\t\t// @ts-ignore\n\t\tconst uniforms = this.fsQuad.material.uniforms;\n\t\tuniforms.tDiffuse.value = this.rgbRenderTarget.texture;\n\t\tuniforms.tDepth.value = this.rgbRenderTarget.depthTexture;\n\t\tuniforms.tNormal.value = this.normalRenderTarget.texture;\n\t\tuniforms.iTime.value += 0.01;\n\n\t\tif (this.renderToScreen) {\n\t\t\trenderer.setRenderTarget(null);\n\t\t} else {\n\t\t\trenderer.setRenderTarget(writeBuffer);\n\t\t}\n\t\tthis.fsQuad.render(renderer);\n\t}\n\n\tmaterial() {\n\t\treturn new THREE.ShaderMaterial({\n\t\t\tuniforms: {\n\t\t\t\tiTime: { value: 0 },\n\t\t\t\ttDiffuse: { value: null },\n\t\t\t\ttDepth: { value: null },\n\t\t\t\ttNormal: { value: null },\n\t\t\t\tresolution: {\n\t\t\t\t\tvalue: new THREE.Vector4(\n\t\t\t\t\t\tthis.resolution.x,\n\t\t\t\t\t\tthis.resolution.y,\n\t\t\t\t\t\t1 / this.resolution.x,\n\t\t\t\t\t\t1 / this.resolution.y,\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t},\n\t\t\tvertexShader: vertexShader,\n\t\t\tfragmentShader: fragmentShader\n\t\t});\n\t}\n\n\tdispose() {\n\t\ttry {\n\t\t\tthis.fsQuad?.dispose?.();\n\t\t} catch { /* noop */ }\n\t\ttry {\n\t\t\t(this.rgbRenderTarget as any)?.dispose?.();\n\t\t\t(this.normalRenderTarget as any)?.dispose?.();\n\t\t} catch { /* noop */ }\n\t\ttry {\n\t\t\t(this.normalMaterial as any)?.dispose?.();\n\t\t} catch { /* noop */ }\n\t}\n}\n","import { Vector2, Camera, PerspectiveCamera, Vector3, Object3D, OrthographicCamera, WebGLRenderer, Scene } from 'three';\nimport { OrbitControls } from 'three/addons/controls/OrbitControls.js';\nimport { PerspectiveType, Perspectives } from './perspective';\nimport { ThirdPersonCamera } from './third-person';\nimport { Fixed2DCamera } from './fixed-2d';\nimport { EffectComposer } from 'three/examples/jsm/postprocessing/EffectComposer.js';\nimport RenderPass from '../graphics/render-pass';\nimport { StageEntity } from '../interfaces/entity';\n\n/**\n * Interface for perspective-specific camera controllers\n */\nexport interface PerspectiveController {\n\tsetup(params: { screenResolution: Vector2; renderer: WebGLRenderer; scene: Scene; camera: ZylemCamera }): void;\n\tupdate(delta: number): void;\n\tresize(width: number, height: number): void;\n}\n\nexport interface CameraDebugState {\n\tenabled: boolean;\n\tselected: string[];\n}\n\nexport interface CameraDebugDelegate {\n\tsubscribe(listener: (state: CameraDebugState) => void): () => void;\n\tresolveTarget(uuid: string): Object3D | null;\n}\n\nexport class ZylemCamera {\n\tcameraRig: Object3D;\n\tcamera: Camera;\n\tscreenResolution: Vector2;\n\trenderer: WebGLRenderer;\n\tcomposer: EffectComposer;\n\t_perspective: PerspectiveType;\n\torbitControls: OrbitControls | null = null;\n\ttarget: StageEntity | null = null;\n\tsceneRef: Scene | null = null;\n\tfrustumSize = 10;\n\n\t// Perspective controller delegation\n\tperspectiveController: PerspectiveController | null = null;\n\n\tdebugDelegate: CameraDebugDelegate | null = null;\n\tprivate debugUnsubscribe: (() => void) | null = null;\n\tprivate debugStateSnapshot: CameraDebugState = { enabled: false, selected: [] };\n\tprivate orbitTarget: Object3D | null = null;\n\tprivate orbitTargetWorldPos: Vector3 = new Vector3();\n\n\tconstructor(perspective: PerspectiveType, screenResolution: Vector2, frustumSize: number = 10) {\n\t\tthis._perspective = perspective;\n\t\tthis.screenResolution = screenResolution;\n\t\tthis.frustumSize = frustumSize;\n\t\t// Initialize renderer\n\t\tthis.renderer = new WebGLRenderer({ antialias: false, alpha: true });\n\t\tthis.renderer.setSize(screenResolution.x, screenResolution.y);\n\t\tthis.renderer.shadowMap.enabled = true;\n\n\t\t// Initialize composer\n\t\tthis.composer = new EffectComposer(this.renderer);\n\n\t\t// Create camera based on perspective\n\t\tconst aspectRatio = screenResolution.x / screenResolution.y;\n\t\tthis.camera = this.createCameraForPerspective(aspectRatio);\n\n\t\t// Setup camera rig\n\t\tthis.cameraRig = new Object3D();\n\t\tthis.cameraRig.position.set(0, 3, 10);\n\t\tthis.cameraRig.add(this.camera);\n\t\tthis.camera.lookAt(new Vector3(0, 2, 0));\n\n\t\t// Initialize perspective controller\n\t\tthis.initializePerspectiveController();\n\t}\n\n\t/**\n\t * Setup the camera with a scene\n\t */\n\tasync setup(scene: Scene) {\n\t\tthis.sceneRef = scene;\n\n\t\t// Setup orbit controls\n\t\tif (this.orbitControls === null) {\n\t\t\tthis.orbitControls = new OrbitControls(this.camera, this.renderer.domElement);\n\t\t\tthis.orbitControls.enableDamping = true;\n\t\t\tthis.orbitControls.dampingFactor = 0.05;\n\t\t\tthis.orbitControls.screenSpacePanning = false;\n\t\t\tthis.orbitControls.minDistance = 1;\n\t\t\tthis.orbitControls.maxDistance = 500;\n\t\t\tthis.orbitControls.maxPolarAngle = Math.PI / 2;\n\t\t}\n\n\t\t// Setup render pass\n\t\tlet renderResolution = this.screenResolution.clone().divideScalar(2);\n\t\trenderResolution.x |= 0;\n\t\trenderResolution.y |= 0;\n\t\tconst pass = new RenderPass(renderResolution, scene, this.camera);\n\t\tthis.composer.addPass(pass);\n\n\t\t// Setup perspective controller\n\t\tif (this.perspectiveController) {\n\t\t\tthis.perspectiveController.setup({\n\t\t\t\tscreenResolution: this.screenResolution,\n\t\t\t\trenderer: this.renderer,\n\t\t\t\tscene: scene,\n\t\t\t\tcamera: this\n\t\t\t});\n\t\t}\n\n\t\t// Start render loop\n\t\tthis.renderer.setAnimationLoop((delta) => {\n\t\t\tthis.update(delta || 0);\n\t\t});\n\t}\n\n\t/**\n\t * Update camera and render\n\t */\n\tupdate(delta: number) {\n\t\tif (this.orbitControls && this.orbitTarget) {\n\t\t\tthis.orbitTarget.getWorldPosition(this.orbitTargetWorldPos);\n\t\t\tthis.orbitControls.target.copy(this.orbitTargetWorldPos);\n\t\t}\n\t\tthis.orbitControls?.update();\n\n\t\t// Delegate to perspective controller\n\t\tif (this.perspectiveController) {\n\t\t\tthis.perspectiveController.update(delta);\n\t\t}\n\n\t\t// Render the scene\n\t\tthis.composer.render(delta);\n\t}\n\n\t/**\n\t * Dispose renderer, composer, controls, and detach from scene\n\t */\n\tdestroy() {\n\t\ttry {\n\t\t\tthis.renderer.setAnimationLoop(null as any);\n\t\t} catch { /* noop */ }\n\t\ttry {\n\t\t\tthis.disableOrbitControls();\n\t\t} catch { /* noop */ }\n\t\ttry {\n\t\t\tthis.composer?.passes?.forEach((p: any) => p.dispose?.());\n\t\t\t// @ts-ignore dispose exists on EffectComposer but not typed here\n\t\t\tthis.composer?.dispose?.();\n\t\t} catch { /* noop */ }\n\t\ttry {\n\t\t\tthis.renderer.dispose();\n\t\t} catch { /* noop */ }\n\t\tthis.detachDebugDelegate();\n\t\tthis.sceneRef = null;\n\t}\n\n\t/**\n\t * Attach a delegate to react to debug state changes.\n\t */\n\tsetDebugDelegate(delegate: CameraDebugDelegate | null) {\n\t\tif (this.debugDelegate === delegate) {\n\t\t\treturn;\n\t\t}\n\t\tthis.detachDebugDelegate();\n\t\tthis.debugDelegate = delegate;\n\t\tif (!delegate) {\n\t\t\tthis.applyDebugState({ enabled: false, selected: [] });\n\t\t\treturn;\n\t\t}\n\t\tconst unsubscribe = delegate.subscribe((state) => {\n\t\t\tthis.applyDebugState(state);\n\t\t});\n\t\tthis.debugUnsubscribe = () => {\n\t\t\tunsubscribe?.();\n\t\t};\n\t}\n\n\t/**\n\t * Resize camera and renderer\n\t */\n\tresize(width: number, height: number) {\n\t\tthis.screenResolution.set(width, height);\n\t\tthis.renderer.setSize(width, height, false);\n\t\tthis.composer.setSize(width, height);\n\n\t\tif (this.camera instanceof PerspectiveCamera) {\n\t\t\tthis.camera.aspect = width / height;\n\t\t\tthis.camera.updateProjectionMatrix();\n\t\t}\n\n\t\tif (this.perspectiveController) {\n\t\t\tthis.perspectiveController.resize(width, height);\n\t\t}\n\t}\n\n\t/**\n\t * Update renderer pixel ratio (DPR)\n\t */\n\tsetPixelRatio(dpr: number) {\n\t\tconst safe = Math.max(1, Number.isFinite(dpr) ? dpr : 1);\n\t\tthis.renderer.setPixelRatio(safe);\n\t}\n\n\t/**\n\t * Create camera based on perspective type\n\t */\n\tprivate createCameraForPerspective(aspectRatio: number): Camera {\n\t\tswitch (this._perspective) {\n\t\t\tcase Perspectives.ThirdPerson:\n\t\t\t\treturn this.createThirdPersonCamera(aspectRatio);\n\t\t\tcase Perspectives.FirstPerson:\n\t\t\t\treturn this.createFirstPersonCamera(aspectRatio);\n\t\t\tcase Perspectives.Isometric:\n\t\t\t\treturn this.createIsometricCamera(aspectRatio);\n\t\t\tcase Perspectives.Flat2D:\n\t\t\t\treturn this.createFlat2DCamera(aspectRatio);\n\t\t\tcase Perspectives.Fixed2D:\n\t\t\t\treturn this.createFixed2DCamera(aspectRatio);\n\t\t\tdefault:\n\t\t\t\treturn this.createThirdPersonCamera(aspectRatio);\n\t\t}\n\t}\n\n\t/**\n\t * Initialize perspective-specific controller\n\t */\n\tprivate initializePerspectiveController() {\n\t\tswitch (this._perspective) {\n\t\t\tcase Perspectives.ThirdPerson:\n\t\t\t\tthis.perspectiveController = new ThirdPersonCamera();\n\t\t\t\tbreak;\n\t\t\tcase Perspectives.Fixed2D:\n\t\t\t\tthis.perspectiveController = new Fixed2DCamera();\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tthis.perspectiveController = new ThirdPersonCamera();\n\t\t}\n\t}\n\n\tprivate createThirdPersonCamera(aspectRatio: number): PerspectiveCamera {\n\t\treturn new PerspectiveCamera(75, aspectRatio, 0.1, 1000);\n\t}\n\n\tprivate createFirstPersonCamera(aspectRatio: number): PerspectiveCamera {\n\t\treturn new PerspectiveCamera(75, aspectRatio, 0.1, 1000);\n\t}\n\n\tprivate createIsometricCamera(aspectRatio: number): OrthographicCamera {\n\t\treturn new OrthographicCamera(\n\t\t\tthis.frustumSize * aspectRatio / -2,\n\t\t\tthis.frustumSize * aspectRatio / 2,\n\t\t\tthis.frustumSize / 2,\n\t\t\tthis.frustumSize / -2,\n\t\t\t1,\n\t\t\t1000\n\t\t);\n\t}\n\n\tprivate createFlat2DCamera(aspectRatio: number): OrthographicCamera {\n\t\treturn new OrthographicCamera(\n\t\t\tthis.frustumSize * aspectRatio / -2,\n\t\t\tthis.frustumSize * aspectRatio / 2,\n\t\t\tthis.frustumSize / 2,\n\t\t\tthis.frustumSize / -2,\n\t\t\t1,\n\t\t\t1000\n\t\t);\n\t}\n\n\tprivate createFixed2DCamera(aspectRatio: number): OrthographicCamera {\n\t\treturn this.createFlat2DCamera(aspectRatio);\n\t}\n\n\t// Movement methods\n\tprivate moveCamera(position: Vector3) {\n\t\tif (this._perspective === Perspectives.Flat2D || this._perspective === Perspectives.Fixed2D) {\n\t\t\tthis.frustumSize = position.z;\n\t\t}\n\t\tthis.cameraRig.position.set(position.x, position.y, position.z);\n\t}\n\n\tmove(position: Vector3) {\n\t\tthis.moveCamera(position);\n\t}\n\n\trotate(pitch: number, yaw: number, roll: number) {\n\t\tthis.cameraRig.rotateX(pitch);\n\t\tthis.cameraRig.rotateY(yaw);\n\t\tthis.cameraRig.rotateZ(roll);\n\t}\n\n\t/**\n\t * Get the DOM element for the renderer\n\t */\n\tgetDomElement(): HTMLCanvasElement {\n\t\treturn this.renderer.domElement;\n\t}\n\n\tprivate applyDebugState(state: CameraDebugState) {\n\t\tthis.debugStateSnapshot = {\n\t\t\tenabled: state.enabled,\n\t\t\tselected: [...state.selected],\n\t\t};\n\t\tif (state.enabled) {\n\t\t\tthis.enableOrbitControls();\n\t\t\tthis.updateOrbitTargetFromSelection(state.selected);\n\t\t} else {\n\t\t\tthis.orbitTarget = null;\n\t\t\tthis.disableOrbitControls();\n\t\t}\n\t}\n\n\tprivate enableOrbitControls() {\n\t\tif (this.orbitControls) {\n\t\t\treturn;\n\t\t}\n\t\tthis.orbitControls = new OrbitControls(this.camera, this.renderer.domElement);\n\t\tthis.orbitControls.enableDamping = true;\n\t\tthis.orbitControls.dampingFactor = 0.05;\n\t\tthis.orbitControls.screenSpacePanning = false;\n\t\tthis.orbitControls.minDistance = 1;\n\t\tthis.orbitControls.maxDistance = 500;\n\t\tthis.orbitControls.maxPolarAngle = Math.PI / 2;\n\t}\n\n\tprivate disableOrbitControls() {\n\t\tif (!this.orbitControls) {\n\t\t\treturn;\n\t\t}\n\t\tthis.orbitControls.dispose();\n\t\tthis.orbitControls = null;\n\t}\n\n\tprivate updateOrbitTargetFromSelection(selected: string[]) {\n\t\tif (!this.debugDelegate || selected.length === 0) {\n\t\t\tthis.orbitTarget = null;\n\t\t\treturn;\n\t\t}\n\t\tfor (let i = selected.length - 1; i >= 0; i -= 1) {\n\t\t\tconst uuid = selected[i];\n\t\t\tconst targetObject = this.debugDelegate.resolveTarget(uuid);\n\t\t\tif (targetObject) {\n\t\t\t\tthis.orbitTarget = targetObject;\n\t\t\t\tif (this.orbitControls) {\n\t\t\t\t\ttargetObject.getWorldPosition(this.orbitTargetWorldPos);\n\t\t\t\t\tthis.orbitControls.target.copy(this.orbitTargetWorldPos);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tthis.orbitTarget = null;\n\t}\n\n\tprivate detachDebugDelegate() {\n\t\tif (this.debugUnsubscribe) {\n\t\t\ttry {\n\t\t\t\tthis.debugUnsubscribe();\n\t\t\t} catch { /* noop */ }\n\t\t}\n\t\tthis.debugUnsubscribe = null;\n\t\tthis.debugDelegate = null;\n\t}\n}","import { Vector2, Vector3 } from \"three\";\nimport { PerspectiveType } from \"./perspective\";\nimport { ZylemCamera } from \"./zylem-camera\";\n\nexport interface CameraOptions {\n\tperspective?: PerspectiveType;\n\tposition?: Vector3;\n\ttarget?: Vector3;\n\tzoom?: number;\n\tscreenResolution?: Vector2;\n}\n\nexport class CameraWrapper {\n\tcameraRef: ZylemCamera;\n\n\tconstructor(camera: ZylemCamera) {\n\t\tthis.cameraRef = camera;\n\t}\n}\n\nexport function camera(options: CameraOptions): CameraWrapper {\n\tconst screenResolution = options.screenResolution || new Vector2(window.innerWidth, window.innerHeight);\n\tlet frustumSize = 10;\n\tif (options.perspective === 'fixed-2d') {\n\t\tfrustumSize = options.zoom || 10;\n\t}\n\tconst zylemCamera = new ZylemCamera(options.perspective || 'third-person', screenResolution, frustumSize);\n\n\t// Set initial position and target\n\tzylemCamera.move(options.position || new Vector3(0, 0, 0));\n\tzylemCamera.camera.lookAt(options.target || new Vector3(0, 0, 0));\n\n\treturn new CameraWrapper(zylemCamera);\n}","import {\n\tBox3,\n\tBoxGeometry,\n\tColor,\n\tEdgesGeometry,\n\tGroup,\n\tLineBasicMaterial,\n\tLineSegments,\n\tMesh,\n\tMeshBasicMaterial,\n\tObject3D,\n\tScene,\n\tVector3,\n} from 'three';\n\n/**\n * Debug overlay that displays an axis-aligned bounding box around a target Object3D.\n * Shows a semi-transparent fill plus a wireframe outline. Intended for SELECT/DELETE tools.\n */\nexport class DebugEntityCursor {\n\tprivate scene: Scene;\n\tprivate container: Group;\n\tprivate fillMesh: Mesh;\n\tprivate edgeLines: LineSegments;\n\tprivate currentColor: Color = new Color(0x00ff00);\n\tprivate bbox: Box3 = new Box3();\n\tprivate size: Vector3 = new Vector3();\n\tprivate center: Vector3 = new Vector3();\n\n\tconstructor(scene: Scene) {\n\t\tthis.scene = scene;\n\n\t\tconst initialGeometry = new BoxGeometry(1, 1, 1);\n\n\t\tthis.fillMesh = new Mesh(\n\t\t\tinitialGeometry,\n\t\t\tnew MeshBasicMaterial({\n\t\t\t\tcolor: this.currentColor,\n\t\t\t\ttransparent: true,\n\t\t\t\topacity: 0.12,\n\t\t\t\tdepthWrite: false,\n\t\t\t})\n\t\t);\n\n\t\tconst edges = new EdgesGeometry(initialGeometry);\n\t\tthis.edgeLines = new LineSegments(\n\t\t\tedges,\n\t\t\tnew LineBasicMaterial({ color: this.currentColor, linewidth: 1 })\n\t\t);\n\n\t\tthis.container = new Group();\n\t\tthis.container.name = 'DebugEntityCursor';\n\t\tthis.container.add(this.fillMesh);\n\t\tthis.container.add(this.edgeLines);\n\t\tthis.container.visible = false;\n\n\t\tthis.scene.add(this.container);\n\t}\n\n\tsetColor(color: Color | number): void {\n\t\tthis.currentColor.set(color as any);\n\t\t(this.fillMesh.material as MeshBasicMaterial).color.set(this.currentColor);\n\t\t(this.edgeLines.material as LineBasicMaterial).color.set(this.currentColor);\n\t}\n\n\t/**\n\t * Update the cursor to enclose the provided Object3D using a world-space AABB.\n\t */\n\tupdateFromObject(object: Object3D | null | undefined): void {\n\t\tif (!object) {\n\t\t\tthis.hide();\n\t\t\treturn;\n\t\t}\n\n\t\tthis.bbox.setFromObject(object);\n\t\tif (!isFinite(this.bbox.min.x) || !isFinite(this.bbox.max.x)) {\n\t\t\tthis.hide();\n\t\t\treturn;\n\t\t}\n\n\t\tthis.bbox.getSize(this.size);\n\t\tthis.bbox.getCenter(this.center);\n\n\t\tconst newGeom = new BoxGeometry(\n\t\t\tMath.max(this.size.x, 1e-6),\n\t\t\tMath.max(this.size.y, 1e-6),\n\t\t\tMath.max(this.size.z, 1e-6)\n\t\t);\n\t\tthis.fillMesh.geometry.dispose();\n\t\tthis.fillMesh.geometry = newGeom;\n\n\t\tconst newEdges = new EdgesGeometry(newGeom);\n\t\tthis.edgeLines.geometry.dispose();\n\t\tthis.edgeLines.geometry = newEdges;\n\n\t\tthis.container.position.copy(this.center);\n\t\tthis.container.visible = true;\n\t}\n\n\thide(): void {\n\t\tthis.container.visible = false;\n\t}\n\n\tdispose(): void {\n\t\tthis.scene.remove(this.container);\n\t\tthis.fillMesh.geometry.dispose();\n\t\t(this.fillMesh.material as MeshBasicMaterial).dispose();\n\t\tthis.edgeLines.geometry.dispose();\n\t\t(this.edgeLines.material as LineBasicMaterial).dispose();\n\t}\n}\n\n\n","import { Ray, RayColliderToi } from '@dimforge/rapier3d-compat';\nimport { BufferAttribute, BufferGeometry, LineBasicMaterial, LineSegments, Raycaster, Vector2, Vector3 } from 'three';\nimport { ZylemStage } from './zylem-stage';\nimport { debugState, DebugTools, getDebugTool, getHoveredEntity, resetHoveredEntity, setHoveredEntity, setSelectedEntity } from '../debug/debug-state';\nimport { DebugEntityCursor } from './debug-entity-cursor';\n\nexport type AddEntityFactory = (params: { position: Vector3; normal?: Vector3 }) => Promise<any> | any;\n\nexport interface StageDebugDelegateOptions {\n\tmaxRayDistance?: number;\n\taddEntityFactory?: AddEntityFactory | null;\n}\n\nconst SELECT_TOOL_COLOR = 0x22ff22;\nconst DELETE_TOOL_COLOR = 0xff3333;\n\nexport class StageDebugDelegate {\n\tprivate stage: ZylemStage;\n\tprivate options: Required<StageDebugDelegateOptions>;\n\tprivate mouseNdc: Vector2 = new Vector2(-2, -2);\n\tprivate raycaster: Raycaster = new Raycaster();\n\tprivate isMouseDown = false;\n\tprivate disposeFns: Array<() => void> = [];\n\tprivate debugCursor: DebugEntityCursor | null = null;\n\tprivate debugLines: LineSegments | null = null;\n\n\tconstructor(stage: ZylemStage, options?: StageDebugDelegateOptions) {\n\t\tthis.stage = stage;\n\t\tthis.options = {\n\t\t\tmaxRayDistance: options?.maxRayDistance ?? 5_000,\n\t\t\taddEntityFactory: options?.addEntityFactory ?? null,\n\t\t};\n\t\tif (this.stage.scene) {\n\t\t\tthis.debugLines = new LineSegments(\n\t\t\t\tnew BufferGeometry(),\n\t\t\t\tnew LineBasicMaterial({ vertexColors: true })\n\t\t\t);\n\t\t\tthis.stage.scene.scene.add(this.debugLines);\n\t\t\tthis.debugLines.visible = true;\n\n\t\t\tthis.debugCursor = new DebugEntityCursor(this.stage.scene.scene);\n\t\t}\n\t\tthis.attachDomListeners();\n\t}\n\n\tupdate(): void {\n\t\tif (!debugState.enabled) return;\n\t\tif (!this.stage.scene || !this.stage.world || !this.stage.cameraRef) return;\n\n\t\tconst { world, cameraRef } = this.stage;\n\n\t\tif (this.debugLines) {\n\t\t\tconst { vertices, colors } = world.world.debugRender();\n\t\t\tthis.debugLines.geometry.setAttribute('position', new BufferAttribute(vertices, 3));\n\t\t\tthis.debugLines.geometry.setAttribute('color', new BufferAttribute(colors, 4));\n\t\t}\n\t\tconst tool = getDebugTool();\n\t\tconst isCursorTool = tool === 'select' || tool === 'delete';\n\n\t\tthis.raycaster.setFromCamera(this.mouseNdc, cameraRef.camera);\n\t\tconst origin = this.raycaster.ray.origin.clone();\n\t\tconst direction = this.raycaster.ray.direction.clone().normalize();\n\n\t\tconst rapierRay = new Ray(\n\t\t\t{ x: origin.x, y: origin.y, z: origin.z },\n\t\t\t{ x: direction.x, y: direction.y, z: direction.z },\n\t\t);\n\t\tconst hit: RayColliderToi | null = world.world.castRay(rapierRay, this.options.maxRayDistance, true);\n\n\t\tif (hit && isCursorTool) {\n\t\t\t// @ts-ignore - access compat object's parent userData mapping back to GameEntity\n\t\t\tconst rigidBody = hit.collider?._parent;\n\t\t\tconst hoveredUuid: string | undefined = rigidBody?.userData?.uuid;\n\t\t\tif (hoveredUuid) {\n\t\t\t\tconst entity = this.stage._debugMap.get(hoveredUuid);\n\t\t\t\tif (entity) setHoveredEntity(entity as any);\n\t\t\t} else {\n\t\t\t\tresetHoveredEntity();\n\t\t\t}\n\n\t\t\tif (this.isMouseDown) {\n\t\t\t\tthis.handleActionOnHit(hoveredUuid ?? null, origin, direction, hit.toi);\n\t\t\t}\n\t\t}\n\t\tthis.isMouseDown = false;\n\n\t\tconst hoveredUuid = getHoveredEntity();\n\t\tif (!hoveredUuid) {\n\t\t\tthis.debugCursor?.hide();\n\t\t\treturn;\n\t\t}\n\t\tconst hoveredEntity: any = this.stage._debugMap.get(`${hoveredUuid}`);\n\t\tconst targetObject = hoveredEntity?.group ?? hoveredEntity?.mesh ?? null;\n\t\tif (!targetObject) {\n\t\t\tthis.debugCursor?.hide();\n\t\t\treturn;\n\t\t}\n\t\tswitch (tool) {\n\t\t\tcase 'select':\n\t\t\t\tthis.debugCursor?.setColor(SELECT_TOOL_COLOR);\n\t\t\t\tbreak;\n\t\t\tcase 'delete':\n\t\t\t\tthis.debugCursor?.setColor(DELETE_TOOL_COLOR);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tthis.debugCursor?.setColor(0xffffff);\n\t\t\t\tbreak;\n\t\t}\n\t\tthis.debugCursor?.updateFromObject(targetObject);\n\t}\n\n\tdispose(): void {\n\t\tthis.disposeFns.forEach((fn) => fn());\n\t\tthis.disposeFns = [];\n\t\tthis.debugCursor?.dispose();\n\t\tif (this.debugLines && this.stage.scene) {\n\t\t\tthis.stage.scene.scene.remove(this.debugLines);\n\t\t\tthis.debugLines.geometry.dispose();\n\t\t\t(this.debugLines.material as LineBasicMaterial).dispose();\n\t\t\tthis.debugLines = null;\n\t\t}\n\t}\n\n\tprivate handleActionOnHit(hoveredUuid: string | null, origin: Vector3, direction: Vector3, toi: number) {\n\t\tconst tool = getDebugTool();\n\t\tswitch (tool) {\n\t\t\tcase 'select': {\n\t\t\t\tif (hoveredUuid) {\n\t\t\t\t\tconst entity = this.stage._debugMap.get(hoveredUuid);\n\t\t\t\t\tif (entity) setSelectedEntity(entity as any);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'delete': {\n\t\t\t\tif (hoveredUuid) {\n\t\t\t\t\tthis.stage.removeEntityByUuid(hoveredUuid);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'scale': {\n\t\t\t\tif (!this.options.addEntityFactory) break;\n\t\t\t\tconst hitPosition = origin.clone().add(direction.clone().multiplyScalar(toi));\n\t\t\t\tconst newNode = this.options.addEntityFactory({ position: hitPosition });\n\t\t\t\tif (newNode) {\n\t\t\t\t\tPromise.resolve(newNode).then((node) => {\n\t\t\t\t\t\tif (node) this.stage.spawnEntity(node);\n\t\t\t\t\t}).catch(() => { });\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tprivate attachDomListeners() {\n\t\tconst canvas = this.stage.cameraRef?.renderer.domElement ?? this.stage.scene?.zylemCamera.renderer.domElement;\n\t\tif (!canvas) return;\n\n\t\tconst onMouseMove = (e: MouseEvent) => {\n\t\t\tconst rect = canvas.getBoundingClientRect();\n\t\t\tconst x = ((e.clientX - rect.left) / rect.width) * 2 - 1;\n\t\t\tconst y = -(((e.clientY - rect.top) / rect.height) * 2 - 1);\n\t\t\tthis.mouseNdc.set(x, y);\n\t\t};\n\n\t\tconst onMouseDown = (e: MouseEvent) => {\n\t\t\tthis.isMouseDown = true;\n\t\t};\n\n\t\tcanvas.addEventListener('mousemove', onMouseMove);\n\t\tcanvas.addEventListener('mousedown', onMouseDown);\n\n\t\tthis.disposeFns.push(() => canvas.removeEventListener('mousemove', onMouseMove));\n\t\tthis.disposeFns.push(() => canvas.removeEventListener('mousedown', onMouseDown));\n\t}\n}\n\n\n","import { addComponent, addEntity, createWorld as createECS, removeEntity } from 'bitecs';\nimport { Color, Vector3, Vector2 } from 'three';\n\nimport { ZylemWorld } from '../collision/world';\nimport { ZylemScene } from '../graphics/zylem-scene';\nimport { resetStageVariables, setStageBackgroundColor, setStageBackgroundImage, setStageVariables, clearVariables } from './stage-state';\n\nimport { GameEntityInterface } from '../types/entity-types';\nimport { ZylemBlueColor } from '../core/utility/vector';\nimport { debugState } from '../debug/debug-state';\nimport { getGlobals } from \"../game/game-state\";\n\nimport { SetupContext, UpdateContext, DestroyContext } from '../core/base-node-life-cycle';\nimport { LifeCycleBase } from '../core/lifecycle-base';\nimport createTransformSystem, { StageSystem } from '../systems/transformable.system';\nimport { BaseNode } from '../core/base-node';\nimport { nanoid } from 'nanoid';\nimport { Stage } from './stage';\nimport { Perspectives } from '../camera/perspective';\nimport { CameraWrapper } from '../camera/camera';\nimport { StageDebugDelegate } from './stage-debug-delegate';\nimport { StageCameraDebugDelegate } from './stage-camera-debug-delegate';\nimport { GameEntity } from '../entities/entity';\nimport { BaseEntityInterface } from '../types/entity-types';\nimport { ZylemCamera } from '../camera/zylem-camera';\nimport { LoadingEvent } from '../core/interfaces';\nexport type { LoadingEvent };\n\nexport interface ZylemStageConfig {\n\tinputs: Record<string, string[]>;\n\tbackgroundColor: Color | string;\n\tbackgroundImage: string | null;\n\tgravity: Vector3;\n\tvariables: Record<string, any>;\n\tstageRef?: Stage;\n}\n\ntype NodeLike = { create: Function };\nexport type StageEntityInput = NodeLike | Promise<any> | (() => NodeLike | Promise<any>);\n\nexport type StageOptionItem = Partial<ZylemStageConfig> | CameraWrapper | StageEntityInput;\nexport type StageOptions = [] | [Partial<ZylemStageConfig>, ...StageOptionItem[]];\n\nexport type StageState = ZylemStageConfig & { entities: GameEntityInterface[] };\n\nconst STAGE_TYPE = 'Stage';\n\n/**\n * ZylemStage orchestrates scene, physics world, entities, and lifecycle.\n *\n * Responsibilities:\n * - Manage stage configuration (background, inputs, gravity, variables)\n * - Initialize and own `ZylemScene` and `ZylemWorld`\n * - Spawn, track, and remove entities; emit entity-added events\n * - Drive per-frame updates and transform system\n */\nexport class ZylemStage extends LifeCycleBase<ZylemStage> {\n\tpublic type = STAGE_TYPE;\n\n\tstate: StageState = {\n\t\tbackgroundColor: ZylemBlueColor,\n\t\tbackgroundImage: null,\n\t\tinputs: {\n\t\t\tp1: ['gamepad-1', 'keyboard'],\n\t\t\tp2: ['gamepad-2', 'keyboard'],\n\t\t},\n\t\tgravity: new Vector3(0, 0, 0),\n\t\tvariables: {},\n\t\tentities: [],\n\t};\n\tgravity: Vector3;\n\n\tworld: ZylemWorld | null;\n\tscene: ZylemScene | null;\n\n\tchildren: Array<BaseNode> = [];\n\t_childrenMap: Map<number, BaseNode> = new Map();\n\t_removalMap: Map<number, BaseNode> = new Map();\n\n\tprivate pendingEntities: StageEntityInput[] = [];\n\tprivate pendingPromises: Promise<BaseNode>[] = [];\n\tprivate isLoaded: boolean = false;\n\n\t_debugMap: Map<string, BaseNode> = new Map();\n\n\tprivate entityAddedHandlers: Array<(entity: BaseNode) => void> = [];\n\tprivate loadingHandlers: Array<(event: LoadingEvent) => void> = [];\n\n\n\tecs = createECS();\n\ttestSystem: any = null;\n\ttransformSystem: any = null;\n\tdebugDelegate: StageDebugDelegate | null = null;\n\tcameraDebugDelegate: StageCameraDebugDelegate | null = null;\n\n\tuuid: string;\n\twrapperRef: Stage | null = null;\n\tcamera?: CameraWrapper;\n\tcameraRef?: ZylemCamera | null = null;\n\n\t/**\n\t * Create a new stage.\n\t * @param options Stage options: partial config, camera, and initial entities or factories\n\t */\n\tconstructor(options: StageOptions = []) {\n\t\tsuper();\n\t\tthis.world = null;\n\t\tthis.scene = null;\n\t\tthis.uuid = nanoid();\n\n\t\t// Parse the options array to extract different types of items\n\t\tconst { config, entities, asyncEntities, camera } = this.parseOptions(options);\n\t\tthis.camera = camera;\n\t\tthis.children = entities;\n\t\tthis.pendingEntities = asyncEntities;\n\t\tthis.saveState({ ...this.state, ...config, entities: [] });\n\n\t\tthis.gravity = config.gravity ?? new Vector3(0, 0, 0);\n\n\t}\n\n\tprivate parseOptions(options: StageOptions): {\n\t\tconfig: Partial<ZylemStageConfig>;\n\t\tentities: BaseNode[];\n\t\tasyncEntities: StageEntityInput[];\n\t\tcamera?: CameraWrapper;\n\t} {\n\t\tlet config: Partial<ZylemStageConfig> = {};\n\t\tconst entities: BaseNode[] = [];\n\t\tconst asyncEntities: StageEntityInput[] = [];\n\t\tlet camera: CameraWrapper | undefined;\n\t\tfor (const item of options) {\n\t\t\tif (this.isCameraWrapper(item)) {\n\t\t\t\tcamera = item;\n\t\t\t} else if (this.isBaseNode(item)) {\n\t\t\t\tentities.push(item);\n\t\t\t} else if (this.isEntityInput(item)) {\n\t\t\t\tasyncEntities.push(item as StageEntityInput);\n\t\t\t} else if (this.isZylemStageConfig(item)) {\n\t\t\t\tconfig = { ...config, ...item };\n\t\t\t}\n\t\t}\n\n\t\treturn { config, entities, asyncEntities, camera };\n\t}\n\n\tprivate isZylemStageConfig(item: any): item is ZylemStageConfig {\n\t\treturn item && typeof item === 'object' && !(item instanceof BaseNode) && !(item instanceof CameraWrapper);\n\t}\n\n\tprivate isBaseNode(item: any): item is BaseNode {\n\t\treturn item && typeof item === 'object' && typeof item.create === 'function';\n\t}\n\n\tprivate isCameraWrapper(item: any): item is CameraWrapper {\n\t\treturn item && typeof item === 'object' && item.constructor.name === 'CameraWrapper';\n\t}\n\n\tprivate isEntityInput(item: any): item is StageEntityInput {\n\t\tif (!item) return false;\n\t\tif (this.isBaseNode(item)) return true;\n\t\tif (typeof item === 'function') return true;\n\t\tif (typeof item === 'object' && typeof (item as any).then === 'function') return true;\n\t\treturn false;\n\t}\n\n\tprivate isThenable(value: any): value is Promise<any> {\n\t\treturn !!value && typeof (value as any).then === 'function';\n\t}\n\n\tprivate handleEntityImmediatelyOrQueue(entity: BaseNode): void {\n\t\tif (this.isLoaded) {\n\t\t\tthis.spawnEntity(entity);\n\t\t} else {\n\t\t\tthis.children.push(entity);\n\t\t}\n\t}\n\n\tprivate handlePromiseWithSpawnOnResolve(promise: Promise<any>): void {\n\t\tif (this.isLoaded) {\n\t\t\tpromise\n\t\t\t\t.then((entity) => this.spawnEntity(entity))\n\t\t\t\t.catch((e) => console.error('Failed to build async entity', e));\n\t\t} else {\n\t\t\tthis.pendingPromises.push(promise as Promise<BaseNode>);\n\t\t}\n\t}\n\n\tprivate saveState(state: StageState) {\n\t\tthis.state = state;\n\t}\n\n\tprivate setState() {\n\t\tconst { backgroundColor, backgroundImage } = this.state;\n\t\tconst color = backgroundColor instanceof Color ? backgroundColor : new Color(backgroundColor);\n\t\tsetStageBackgroundColor(color);\n\t\tsetStageBackgroundImage(backgroundImage);\n\t\t// Initialize reactive stage variables on load\n\t\tsetStageVariables(this.state.variables ?? {});\n\t}\n\n\t/**\n\t * Load and initialize the stage's scene and world.\n\t * @param id DOM element id for the renderer container\n\t * @param camera Optional camera override\n\t */\n\tasync load(id: string, camera?: ZylemCamera | null) {\n\t\tthis.setState();\n\n\t\tconst zylemCamera = camera || (this.camera ? this.camera.cameraRef : this.createDefaultCamera());\n\t\tthis.cameraRef = zylemCamera;\n\t\tthis.scene = new ZylemScene(id, zylemCamera, this.state);\n\n\t\tconst physicsWorld = await ZylemWorld.loadPhysics(this.gravity ?? new Vector3(0, 0, 0));\n\t\tthis.world = new ZylemWorld(physicsWorld);\n\n\t\tthis.scene.setup();\n\n\t\tthis.emitLoading({ type: 'start', message: 'Loading stage...', progress: 0 });\n\n\t\tconst total = this.children.length + this.pendingEntities.length + this.pendingPromises.length;\n\t\tlet current = 0;\n\n\t\tfor (let child of this.children) {\n\t\t\tthis.spawnEntity(child);\n\t\t\tcurrent++;\n\t\t\tthis.emitLoading({\n\t\t\t\ttype: 'progress',\n\t\t\t\tmessage: `Loaded entity ${child.name || 'unknown'}`,\n\t\t\t\tprogress: current / total,\n\t\t\t\tcurrent,\n\t\t\t\ttotal\n\t\t\t});\n\t\t}\n\t\tif (this.pendingEntities.length) {\n\t\t\tthis.enqueue(...this.pendingEntities);\n\t\t\t// enqueue handles spawning, but we might want to track progress here if we could\n\t\t\t// For now, let's just assume they are processed\n\t\t\tcurrent += this.pendingEntities.length;\n\t\t\tthis.pendingEntities = [];\n\t\t}\n\t\tif (this.pendingPromises.length) {\n\t\t\tfor (const promise of this.pendingPromises) {\n\t\t\t\tpromise.then((entity) => {\n\t\t\t\t\tthis.spawnEntity(entity);\n\t\t\t\t\t// Note: this progress update might happen after 'complete' if we don't await, \n\t\t\t\t\t// but load is async so we should probably await if we want accurate progress?\n\t\t\t\t\t// The original code didn't await.\n\t\t\t\t}).catch((e) => console.error('Failed to resolve pending stage entity', e));\n\t\t\t}\n\t\t\t// We are not awaiting promises here in original code, so we can't accurately track their completion for \"progress\" \n\t\t\t// in a linear synchronous way. \n\t\t\t// For now, let's just increment current count as if they are \"scheduled\"\n\t\t\tcurrent += this.pendingPromises.length;\n\t\t\tthis.pendingPromises = [];\n\t\t}\n\t\tthis.transformSystem = createTransformSystem(this as unknown as StageSystem);\n\t\tthis.isLoaded = true;\n\t\tthis.emitLoading({ type: 'complete', message: 'Stage loaded', progress: 1 });\n\t}\n\n\tprivate createDefaultCamera(): ZylemCamera {\n\t\tconst width = window.innerWidth;\n\t\tconst height = window.innerHeight;\n\t\tconst screenResolution = new Vector2(width, height);\n\t\treturn new ZylemCamera(Perspectives.ThirdPerson, screenResolution);\n\t}\n\n\tprotected _setup(params: SetupContext<ZylemStage>): void {\n\t\tif (!this.scene || !this.world) {\n\t\t\tthis.logMissingEntities();\n\t\t\treturn;\n\t\t}\n\t\tif (debugState.enabled) {\n\t\t\tthis.debugDelegate = new StageDebugDelegate(this);\n\t\t}\n\t}\n\n\tprotected _update(params: UpdateContext<ZylemStage>): void {\n\t\tconst { delta } = params;\n\t\tif (!this.scene || !this.world) {\n\t\t\tthis.logMissingEntities();\n\t\t\treturn;\n\t\t}\n\t\tthis.world.update(params);\n\t\tthis.transformSystem(this.ecs);\n\t\tthis._childrenMap.forEach((child, eid) => {\n\t\t\tchild.nodeUpdate({\n\t\t\t\t...params,\n\t\t\t\tme: child,\n\t\t\t});\n\t\t\tif (child.markedForRemoval) {\n\t\t\t\tthis.removeEntityByUuid(child.uuid);\n\t\t\t}\n\t\t});\n\t\tthis.scene.update({ delta });\n\t}\n\n\tpublic outOfLoop() {\n\t\tthis.debugUpdate();\n\t}\n\n\t/** Update debug overlays and helpers if enabled. */\n\tpublic debugUpdate() {\n\t\tif (debugState.enabled) {\n\t\t\tthis.debugDelegate?.update();\n\t\t}\n\t}\n\n\t/** Cleanup owned resources when the stage is destroyed. */\n\tprotected _destroy(params: DestroyContext<ZylemStage>): void {\n\t\tthis._childrenMap.forEach((child) => {\n\t\t\ttry { child.nodeDestroy({ me: child, globals: getGlobals() }); } catch { /* noop */ }\n\t\t});\n\t\tthis._childrenMap.clear();\n\t\tthis._removalMap.clear();\n\t\tthis._debugMap.clear();\n\n\t\tthis.world?.destroy();\n\t\tthis.scene?.destroy();\n\t\tthis.debugDelegate?.dispose();\n\t\tthis.cameraRef?.setDebugDelegate(null);\n\t\tthis.cameraDebugDelegate = null;\n\n\t\tthis.isLoaded = false;\n\t\tthis.world = null as any;\n\t\tthis.scene = null as any;\n\t\tthis.cameraRef = null;\n\t\t// Clear reactive stage variables on unload\n\t\tresetStageVariables();\n\t\t// Clear object-scoped variables for this stage\n\t\tclearVariables(this);\n\t}\n\n\t/**\n\t * Create, register, and add an entity to the scene/world.\n\t * Safe to call only after `load` when scene/world exist.\n\t */\n\tasync spawnEntity(child: BaseNode) {\n\t\tif (!this.scene || !this.world) {\n\t\t\treturn;\n\t\t}\n\t\tconst entity = child.create();\n\t\tconst eid = addEntity(this.ecs);\n\t\tentity.eid = eid;\n\t\tthis.scene.addEntity(entity);\n\t\t// @ts-ignore\n\t\tif (child.behaviors) {\n\t\t\t// @ts-ignore\n\t\t\tfor (let behavior of child.behaviors) {\n\t\t\t\taddComponent(this.ecs, behavior.component, entity.eid);\n\t\t\t\tconst keys = Object.keys(behavior.values);\n\t\t\t\tfor (const key of keys) {\n\t\t\t\t\t// @ts-ignore\n\t\t\t\t\tbehavior.component[key][entity.eid] = behavior.values[key];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (entity.colliderDesc) {\n\t\t\tthis.world.addEntity(entity);\n\t\t}\n\t\tchild.nodeSetup({\n\t\t\tme: child,\n\t\t\tglobals: getGlobals(),\n\t\t\tcamera: this.scene.zylemCamera,\n\t\t});\n\t\tthis.addEntityToStage(entity);\n\t}\n\n\tbuildEntityState(child: BaseNode): Partial<BaseEntityInterface> {\n\t\tif (child instanceof GameEntity) {\n\t\t\treturn { ...child.buildInfo() } as Partial<BaseEntityInterface>;\n\t\t}\n\t\treturn {\n\t\t\tuuid: child.uuid,\n\t\t\tname: child.name,\n\t\t\teid: child.eid,\n\t\t} as Partial<BaseEntityInterface>;\n\t}\n\n\t/** Add the entity to internal maps and notify listeners. */\n\taddEntityToStage(entity: BaseNode) {\n\t\tthis._childrenMap.set(entity.eid, entity);\n\t\tif (debugState.enabled) {\n\t\t\tthis._debugMap.set(entity.uuid, entity);\n\t\t}\n\t\tfor (const handler of this.entityAddedHandlers) {\n\t\t\ttry {\n\t\t\t\thandler(entity);\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error('onEntityAdded handler failed', e);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Subscribe to entity-added events.\n\t * @param callback Invoked for each entity when added\n\t * @param options.replayExisting If true and stage already loaded, replays existing entities\n\t * @returns Unsubscribe function\n\t */\n\tonEntityAdded(callback: (entity: BaseNode) => void, options?: { replayExisting?: boolean }) {\n\t\tthis.entityAddedHandlers.push(callback);\n\t\tif (options?.replayExisting && this.isLoaded) {\n\t\t\tthis._childrenMap.forEach((entity) => {\n\t\t\t\ttry { callback(entity); } catch (e) { console.error('onEntityAdded replay failed', e); }\n\t\t\t});\n\t\t}\n\t\treturn () => {\n\t\t\tthis.entityAddedHandlers = this.entityAddedHandlers.filter((h) => h !== callback);\n\t\t};\n\t}\n\n\tonLoading(callback: (event: LoadingEvent) => void) {\n\t\tthis.loadingHandlers.push(callback);\n\t\treturn () => {\n\t\t\tthis.loadingHandlers = this.loadingHandlers.filter((h) => h !== callback);\n\t\t};\n\t}\n\n\tprivate emitLoading(event: LoadingEvent) {\n\t\tthis.loadingHandlers.forEach((h) => h(event));\n\t}\n\n\t/**\n\t * Remove an entity and its resources by its UUID.\n\t * @returns true if removed, false if not found or stage not ready\n\t */\n\tremoveEntityByUuid(uuid: string): boolean {\n\t\tif (!this.scene || !this.world) return false;\n\t\t// Try mapping via world collision map first for physics-backed entities\n\t\t// @ts-ignore - collisionMap is public Map<string, GameEntity<any>>\n\t\tconst mapEntity = this.world.collisionMap.get(uuid) as any | undefined;\n\t\tconst entity: any = mapEntity ?? this._debugMap.get(uuid);\n\t\tif (!entity) return false;\n\n\t\tthis.world.destroyEntity(entity);\n\n\t\tif (entity.group) {\n\t\t\tthis.scene.scene.remove(entity.group);\n\t\t} else if (entity.mesh) {\n\t\t\tthis.scene.scene.remove(entity.mesh);\n\t\t}\n\n\t\tremoveEntity(this.ecs, entity.eid);\n\n\t\tlet foundKey: number | null = null;\n\t\tthis._childrenMap.forEach((value, key) => {\n\t\t\tif ((value as any).uuid === uuid) {\n\t\t\t\tfoundKey = key;\n\t\t\t}\n\t\t});\n\t\tif (foundKey !== null) {\n\t\t\tthis._childrenMap.delete(foundKey);\n\t\t}\n\t\tthis._debugMap.delete(uuid);\n\t\treturn true;\n\t}\n\n\t/** Get an entity by its name; returns null if not found. */\n\tgetEntityByName(name: string) {\n\t\tconst arr = Object.entries(Object.fromEntries(this._childrenMap)).map((entry) => entry[1]);\n\t\tconst entity = arr.find((child) => child.name === name);\n\t\tif (!entity) {\n\t\t\tconsole.warn(`Entity ${name} not found`);\n\t\t}\n\t\treturn entity ?? null;\n\t}\n\n\tlogMissingEntities() {\n\t\tconsole.warn('Zylem world or scene is null');\n\t}\n\n\t/** Resize renderer viewport. */\n\tresize(width: number, height: number) {\n\t\tif (this.scene) {\n\t\t\tthis.scene.updateRenderer(width, height);\n\t\t}\n\t}\n\n\t/**\n\t * Enqueue items to be spawned. Items can be:\n\t * - BaseNode instances (immediate or deferred until load)\n\t * - Factory functions returning BaseNode or Promise<BaseNode>\n\t * - Promises resolving to BaseNode\n\t */\n\tenqueue(...items: StageEntityInput[]) {\n\t\tfor (const item of items) {\n\t\t\tif (!item) continue;\n\t\t\tif (this.isBaseNode(item)) {\n\t\t\t\tthis.handleEntityImmediatelyOrQueue(item);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (typeof item === 'function') {\n\t\t\t\ttry {\n\t\t\t\t\tconst result = (item as (() => BaseNode | Promise<any>))();\n\t\t\t\t\tif (this.isBaseNode(result)) {\n\t\t\t\t\t\tthis.handleEntityImmediatelyOrQueue(result);\n\t\t\t\t\t} else if (this.isThenable(result)) {\n\t\t\t\t\t\tthis.handlePromiseWithSpawnOnResolve(result as Promise<any>);\n\t\t\t\t\t}\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconsole.error('Error executing entity factory', error);\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (this.isThenable(item)) {\n\t\t\t\tthis.handlePromiseWithSpawnOnResolve(item as Promise<any>);\n\t\t\t}\n\t\t}\n\t}\n}\n","import { proxy } from 'valtio/vanilla';\nimport { Vector3 } from 'three';\nimport type { StageOptions, ZylemStageConfig } from './zylem-stage';\nimport { ZylemBlueColor } from '../core/utility/vector';\n\n/**\n * Reactive defaults for building `Stage` instances. These values are applied\n * automatically by the `stage()` builder and can be changed at runtime to\n * influence future stage creations.\n */\nconst initialDefaults: Partial<ZylemStageConfig> = {\n\tbackgroundColor: ZylemBlueColor,\n\tbackgroundImage: null,\n\tinputs: {\n\t\tp1: ['gamepad-1', 'keyboard'],\n\t\tp2: ['gamepad-2', 'keyboard'],\n\t},\n\tgravity: new Vector3(0, 0, 0),\n\tvariables: {},\n};\n\nconst stageDefaultsState = proxy<Partial<ZylemStageConfig>>({\n\t...initialDefaults,\n});\n\n/** Replace multiple defaults at once (shallow merge). */\nfunction setStageDefaults(partial: Partial<ZylemStageConfig>): void {\n\tObject.assign(stageDefaultsState, partial);\n}\n\n/** Reset defaults back to library defaults. */\nfunction resetStageDefaults(): void {\n\tObject.assign(stageDefaultsState, initialDefaults);\n}\n\nexport function getStageOptions(options: StageOptions): StageOptions {\n\tconst defaults = getStageDefaultConfig();\n\tlet originalConfig = {};\n\tif (typeof options[0] === 'object') {\n\t\toriginalConfig = options.shift() ?? {};\n\t}\n\tconst combinedConfig = { ...defaults, ...originalConfig };\n\treturn [combinedConfig, ...options] as StageOptions;\n}\n\n/** Get a plain object copy of the current defaults. */\nfunction getStageDefaultConfig(): Partial<ZylemStageConfig> {\n\treturn {\n\t\tbackgroundColor: stageDefaultsState.backgroundColor,\n\t\tbackgroundImage: stageDefaultsState.backgroundImage ?? null,\n\t\tinputs: stageDefaultsState.inputs ? { ...stageDefaultsState.inputs } : undefined,\n\t\tgravity: stageDefaultsState.gravity,\n\t\tvariables: stageDefaultsState.variables ? { ...stageDefaultsState.variables } : undefined,\n\t};\n}\n\n\n","import { BaseNode } from '../core/base-node';\nimport { DestroyFunction, SetupContext, SetupFunction, UpdateFunction } from '../core/base-node-life-cycle';\nimport { LoadingEvent, StageOptionItem, StageOptions, ZylemStage } from './zylem-stage';\nimport { ZylemCamera } from '../camera/zylem-camera';\nimport { CameraWrapper } from '../camera/camera';\nimport { stageState } from './stage-state';\nimport { getStageOptions } from './stage-default';\n\ntype NodeLike = { create: Function };\ntype AnyNode = NodeLike | Promise<NodeLike>;\ntype EntityInput = AnyNode | (() => AnyNode) | (() => Promise<any>);\n\nexport class Stage {\n\twrappedStage: ZylemStage | null;\n\toptions: StageOptionItem[] = [];\n\n\t// TODO: these shouldn't be here maybe more like nextFrame(stageInstance, () => {})\n\tupdate: UpdateFunction<ZylemStage> = () => { };\n\tsetup: SetupFunction<ZylemStage> = () => { };\n\tdestroy: DestroyFunction<ZylemStage> = () => { };\n\n\tconstructor(options: StageOptions) {\n\t\tthis.options = options;\n\t\tthis.wrappedStage = null;\n\t}\n\n\tasync load(id: string, camera?: ZylemCamera | CameraWrapper | null) {\n\t\tstageState.entities = [];\n\t\tthis.wrappedStage = new ZylemStage(this.options as StageOptions);\n\t\tthis.wrappedStage.wrapperRef = this;\n\n\t\tconst zylemCamera = camera instanceof CameraWrapper ? camera.cameraRef : camera;\n\t\tawait this.wrappedStage!.load(id, zylemCamera);\n\n\t\tthis.wrappedStage!.onEntityAdded((child) => {\n\t\t\tconst next = this.wrappedStage!.buildEntityState(child);\n\t\t\tstageState.entities = [...stageState.entities, next];\n\t\t}, { replayExisting: true });\n\t}\n\n\tasync addEntities(entities: BaseNode[]) {\n\t\tthis.options.push(...(entities as unknown as StageOptionItem[]));\n\t\t// TODO: this check is unnecessary\n\t\tif (!this.wrappedStage) { return; }\n\t\tthis.wrappedStage!.enqueue(...entities);\n\t}\n\n\tadd(...inputs: Array<EntityInput>) {\n\t\tthis.addToBlueprints(...inputs);\n\t\tthis.addToStage(...inputs);\n\t}\n\n\tprivate addToBlueprints(...inputs: Array<EntityInput>) {\n\t\tif (this.wrappedStage) { return; }\n\t\tthis.options.push(...(inputs as unknown as StageOptionItem[]));\n\t}\n\n\tprivate addToStage(...inputs: Array<EntityInput>) {\n\t\tif (!this.wrappedStage) { return; }\n\t\tthis.wrappedStage!.enqueue(...(inputs as any));\n\t}\n\n\tstart(params: SetupContext<ZylemStage>) {\n\t\tthis.wrappedStage?.nodeSetup(params);\n\t}\n\n\tonUpdate(...callbacks: UpdateFunction<ZylemStage>[]) {\n\t\t// TODO: this check is unnecessary\n\t\tif (!this.wrappedStage) { return; }\n\t\tthis.wrappedStage!.update = (params) => {\n\t\t\tconst extended = { ...params, stage: this } as any;\n\t\t\tcallbacks.forEach((cb) => cb(extended));\n\t\t};\n\t}\n\n\tonSetup(callback: SetupFunction<ZylemStage>) {\n\t\tthis.wrappedStage!.setup = callback;\n\t}\n\n\tonDestroy(callback: DestroyFunction<ZylemStage>) {\n\t\tthis.wrappedStage!.destroy = callback;\n\t}\n\n\tonLoading(callback: (event: LoadingEvent) => void) {\n\t\tif (!this.wrappedStage) { return () => { }; }\n\t\treturn this.wrappedStage.onLoading(callback);\n\t}\n}\n\n/**\n * Create a stage with optional camera\n */\nexport function createStage(...options: StageOptions): Stage {\n\tconst _options = getStageOptions(options);\n\treturn new Stage([..._options] as StageOptions);\n}","import { proxy } from 'valtio/vanilla';\nimport { createStage, Stage } from '../stage/stage';\nimport type { BasicTypes, BaseGlobals, ZylemGameConfig, GameInputConfig } from './game-interfaces';\n\ntype InitialDefaults = Partial<ZylemGameConfig<Stage, any, BaseGlobals>>;\n/**\n * Reactive defaults for building `Game` instances. These values are applied\n * automatically by the `game()` builder via `convertNodes` and can be changed\n * at runtime to influence future game creations.\n */\nconst initialDefaults: () => InitialDefaults = (): InitialDefaults => {\n\treturn {\n\t\tid: 'zylem',\n\t\tglobals: {} as BaseGlobals,\n\t\tstages: [createStage()],\n\t\tdebug: false,\n\t\ttime: 0,\n\t\tinput: undefined,\n\t};\n}\n\nconst gameDefaultsState = proxy<Partial<ZylemGameConfig<Stage, any, BaseGlobals>>>(\n\t{ ...initialDefaults() }\n);\n\n/**\n * Get a plain object copy of the current defaults.\n */\nexport function getGameDefaultConfig<TGlobals extends Record<string, BasicTypes> = BaseGlobals>(): {\n\tid: string;\n\tglobals: TGlobals;\n\tstages: Stage[];\n\tdebug?: boolean;\n\ttime?: number;\n\tinput?: GameInputConfig;\n} {\n\treturn {\n\t\tid: (gameDefaultsState.id as string) ?? 'zylem',\n\t\tglobals: (gameDefaultsState.globals as TGlobals) ?? ({} as unknown as TGlobals),\n\t\tstages: (gameDefaultsState.stages as Stage[]) ?? [createStage()],\n\t\tdebug: gameDefaultsState.debug,\n\t\ttime: gameDefaultsState.time,\n\t\tinput: gameDefaultsState.input,\n\t};\n}\n\n\n","import { state, setGlobal, getGlobals, initGlobals, resetGlobals } from './game-state';\n\nimport { debugState, isPaused, setDebugFlag } from '../debug/debug-state';\n\nimport { Game } from './game';\nimport { UpdateContext, SetupContext, DestroyContext } from '../core/base-node-life-cycle';\nimport { InputManager } from '../input/input-manager';\nimport { Timer } from '../core/three-addons/Timer';\nimport { ZylemCamera } from '~/lib/camera/zylem-camera';\nimport { Stage } from '../stage/stage';\nimport { BaseGlobals, ZylemGameConfig } from './game-interfaces';\nimport { GameConfig, resolveGameConfig } from './game-config';\nimport { AspectRatioDelegate } from '../device/aspect-ratio';\nimport { GameCanvas } from './game-canvas';\nimport { subscribe } from 'valtio/vanilla';\nimport Stats from 'stats.js';\nimport { ZylemStage } from '../core';\n\ntype ZylemGameOptions<TGlobals extends BaseGlobals> = ZylemGameConfig<Stage, ZylemGame<TGlobals>, TGlobals> & Partial<GameConfig>\n\nexport class ZylemGame<TGlobals extends BaseGlobals> {\n\tid: string;\n\tinitialGlobals = {} as TGlobals;\n\n\tcustomSetup: ((params: SetupContext<ZylemGame<TGlobals>, TGlobals>) => void) | null = null;\n\tcustomUpdate: ((params: UpdateContext<ZylemGame<TGlobals>, TGlobals>) => void) | null = null;\n\tcustomDestroy: ((params: DestroyContext<ZylemGame<TGlobals>, TGlobals>) => void) | null = null;\n\n\tstages: Stage[] = [];\n\tstageMap: Map<string, Stage> = new Map();\n\tcurrentStageId = '';\n\n\tpreviousTimeStamp: number = 0;\n\ttotalTime = 0;\n\n\ttimer: Timer;\n\tinputManager: InputManager;\n\n\twrapperRef: Game<TGlobals>;\n\tstatsRef: { begin: () => void, end: () => void, showPanel: (panel: number) => void, dom: HTMLElement } | null = null;\n\tdefaultCamera: ZylemCamera | null = null;\n\tcontainer: HTMLElement | null = null;\n\tcanvas: HTMLCanvasElement | null = null;\n\taspectRatioDelegate: AspectRatioDelegate | null = null;\n\tresolvedConfig: GameConfig | null = null;\n\tgameCanvas: GameCanvas | null = null;\n\tprivate animationFrameId: number | null = null;\n\tprivate isDisposed = false;\n\n\tstatic FRAME_LIMIT = 120;\n\tstatic FRAME_DURATION = 1000 / ZylemGame.FRAME_LIMIT;\n\tstatic MAX_DELTA_SECONDS = 1 / 30;\n\n\tconstructor(options: ZylemGameOptions<TGlobals>, wrapperRef: Game<TGlobals>) {\n\t\tthis.wrapperRef = wrapperRef;\n\t\tthis.inputManager = new InputManager(options.input);\n\t\tthis.timer = new Timer();\n\t\tthis.timer.connect(document);\n\t\tconst config = resolveGameConfig(options as any);\n\t\tthis.id = config.id;\n\t\tthis.stages = (config.stages as any) || [];\n\t\tthis.container = config.container;\n\t\tthis.canvas = config.canvas ?? null;\n\t\tthis.resolvedConfig = config;\n\t\tthis.loadGameCanvas(config);\n\t\tthis.loadDebugOptions(options);\n\t\tthis.setGlobals(options);\n\t}\n\n\tloadGameCanvas(config: GameConfig) {\n\t\tthis.gameCanvas = new GameCanvas({\n\t\t\tid: config.id,\n\t\t\tcontainer: config.container,\n\t\t\tcontainerId: config.containerId,\n\t\t\tcanvas: this.canvas ?? undefined,\n\t\t\tbodyBackground: config.bodyBackground,\n\t\t\tfullscreen: config.fullscreen,\n\t\t\taspectRatio: config.aspectRatio,\n\t\t});\n\t\tthis.gameCanvas.applyBodyBackground();\n\t\tthis.gameCanvas.mountCanvas();\n\t\tthis.gameCanvas.centerIfFullscreen();\n\t}\n\n\tloadDebugOptions(options: ZylemGameOptions<TGlobals>) {\n\t\tdebugState.enabled = Boolean(options.debug);\n\n\t\tif (options.debug) {\n\t\t\tthis.statsRef = new Stats();\n\t\t\tthis.statsRef.showPanel(0);\n\t\t\tthis.statsRef.dom.style.position = 'absolute'\n\t\t\tthis.statsRef.dom.style.bottom = '0';\n\t\t\tthis.statsRef.dom.style.right = '0';\n\t\t\tthis.statsRef.dom.style.top = 'auto';\n\t\t\tthis.statsRef.dom.style.left = 'auto';\n\t\t\tdocument.body.appendChild(this.statsRef.dom);\n\t\t}\n\t}\n\n\tasync loadStage(stage: Stage) {\n\t\tthis.unloadCurrentStage();\n\t\tconst config = stage.options[0] as any;\n\n\t\tawait stage.load(this.id, config?.camera as ZylemCamera | null);\n\n\t\tthis.stageMap.set(stage.wrappedStage!.uuid, stage);\n\t\tthis.currentStageId = stage.wrappedStage!.uuid;\n\t\tthis.defaultCamera = stage.wrappedStage!.cameraRef!;\n\n\t\tif (this.container && this.defaultCamera) {\n\t\t\tconst dom = this.defaultCamera.getDomElement();\n\t\t\tconst internal = this.resolvedConfig?.internalResolution;\n\t\t\tthis.gameCanvas?.mountRenderer(dom, (cssW, cssH) => {\n\t\t\t\tif (!this.defaultCamera) return;\n\t\t\t\tif (internal) {\n\t\t\t\t\tthis.defaultCamera.setPixelRatio(1);\n\t\t\t\t\tthis.defaultCamera.resize(internal.width, internal.height);\n\t\t\t\t} else {\n\t\t\t\t\tconst dpr = (window.devicePixelRatio || 1);\n\t\t\t\t\tthis.defaultCamera.setPixelRatio(dpr);\n\t\t\t\t\tthis.defaultCamera.resize(cssW, cssH);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tunloadCurrentStage() {\n\t\tif (!this.currentStageId) return;\n\t\tconst current = this.getStage(this.currentStageId);\n\t\tif (!current) return;\n\t\tif (current?.wrappedStage) {\n\t\t\ttry {\n\t\t\t\tcurrent.wrappedStage.nodeDestroy({\n\t\t\t\t\tme: current.wrappedStage,\n\t\t\t\t\tglobals: state.globals as unknown as TGlobals,\n\t\t\t\t});\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error('Failed to destroy previous stage', e);\n\t\t\t}\n\t\t}\n\t\tthis.stageMap.delete(this.currentStageId);\n\t}\n\n\tsetGlobals(options: ZylemGameConfig<Stage, ZylemGame<TGlobals>, TGlobals>) {\n\t\tthis.initialGlobals = { ...(options.globals as TGlobals) };\n\t\tfor (const variable in this.initialGlobals) {\n\t\t\tconst value = this.initialGlobals[variable];\n\t\t\tif (value === undefined) {\n\t\t\t\tconsole.error(`global ${variable} is undefined`);\n\t\t\t}\n\t\t\tsetGlobal(variable, value);\n\t\t}\n\t}\n\n\tparams(): UpdateContext<ZylemGame<TGlobals>, TGlobals> {\n\t\tconst stage = this.currentStage();\n\t\tconst delta = this.timer.getDelta();\n\t\tconst inputs = this.inputManager.getInputs(delta);\n\t\tconst camera = stage?.wrappedStage?.cameraRef || this.defaultCamera;\n\t\treturn {\n\t\t\tdelta,\n\t\t\tinputs,\n\t\t\tglobals: getGlobals<TGlobals>(),\n\t\t\tme: this,\n\t\t\tcamera: camera!,\n\t\t};\n\t}\n\n\tstart() {\n\t\tconst stage = this.currentStage();\n\t\tconst params = this.params();\n\t\tstage!.start({ ...params, me: stage!.wrappedStage as ZylemStage });\n\t\tif (this.customSetup) {\n\t\t\tthis.customSetup(params);\n\t\t}\n\t\tthis.loop(0);\n\t}\n\n\tloop(timestamp: number) {\n\t\tthis.statsRef && this.statsRef.begin();\n\t\tif (!isPaused()) {\n\t\t\tthis.timer.update(timestamp);\n\t\t\tconst stage = this.currentStage();\n\t\t\tconst params = this.params();\n\t\t\tconst clampedDelta = Math.min(Math.max(params.delta, 0), ZylemGame.MAX_DELTA_SECONDS);\n\t\t\tconst clampedParams = { ...params, delta: clampedDelta };\n\t\t\tif (this.customUpdate) {\n\t\t\t\tthis.customUpdate(clampedParams);\n\t\t\t}\n\t\t\tif (stage) {\n\t\t\t\tstage.wrappedStage!.nodeUpdate({ ...clampedParams, me: stage!.wrappedStage as ZylemStage });\n\t\t\t}\n\t\t\tthis.totalTime += clampedParams.delta;\n\t\t\tstate.time = this.totalTime;\n\t\t\tthis.previousTimeStamp = timestamp;\n\t\t}\n\t\tthis.statsRef && this.statsRef.end();\n\t\tthis.outOfLoop();\n\t\tif (!this.isDisposed) {\n\t\t\tthis.animationFrameId = requestAnimationFrame(this.loop.bind(this));\n\t\t}\n\t}\n\n\tdispose() {\n\t\tthis.isDisposed = true;\n\t\tif (this.animationFrameId !== null) {\n\t\t\tcancelAnimationFrame(this.animationFrameId);\n\t\t\tthis.animationFrameId = null;\n\t\t}\n\n\t\tthis.unloadCurrentStage();\n\n\t\tif (this.statsRef && this.statsRef.dom && this.statsRef.dom.parentNode) {\n\t\t\tthis.statsRef.dom.parentNode.removeChild(this.statsRef.dom);\n\t\t}\n\n\t\tthis.timer.dispose();\n\t\t\n\t\tif (this.customDestroy) {\n\t\t\tthis.customDestroy({\n\t\t\t\tme: this,\n\t\t\t\tglobals: state.globals as unknown as TGlobals\n\t\t\t});\n\t\t}\n\n\t\t// Clear global state\n\t\tresetGlobals();\n\t}\n\n\toutOfLoop() {\n\t\tconst currentStage = this.currentStage();\n\t\tif (!currentStage) return;\n\t\tcurrentStage.wrappedStage!.outOfLoop();\n\t}\n\n\tgetStage(id: string) {\n\t\treturn this.stageMap.get(id);\n\t}\n\n\tcurrentStage() {\n\t\treturn this.getStage(this.currentStageId);\n\t}\n\n}\n\n","import { InputProvider } from './input-provider';\nimport { AnalogState, ButtonState, InputGamepad } from './input';\n\nexport class KeyboardProvider implements InputProvider {\n\tprivate keyStates = new Map<string, boolean>();\n\tprivate keyButtonStates = new Map<string, ButtonState>();\n\tprivate mapping: Record<string, string[]> | null = null;\n\tprivate includeDefaultBase: boolean = true;\n\n\tconstructor(mapping?: Record<string, string[]>, options?: { includeDefaultBase?: boolean }) {\n\t\tthis.mapping = mapping ?? null;\n\t\tthis.includeDefaultBase = options?.includeDefaultBase ?? true;\n\t\twindow.addEventListener('keydown', ({ key }) => this.keyStates.set(key, true));\n\t\twindow.addEventListener('keyup', ({ key }) => this.keyStates.set(key, false));\n\t}\n\n\tprivate isKeyPressed(key: string): boolean {\n\t\treturn this.keyStates.get(key) || false;\n\t}\n\n\tprivate handleButtonState(key: string, delta: number): ButtonState {\n\t\tlet buttonState = this.keyButtonStates.get(key);\n\t\tconst isPressed = this.isKeyPressed(key);\n\n\t\tif (!buttonState) {\n\t\t\tbuttonState = { pressed: false, released: false, held: 0 };\n\t\t\tthis.keyButtonStates.set(key, buttonState);\n\t\t}\n\n\t\tif (isPressed) {\n\t\t\tif (buttonState.held === 0) {\n\t\t\t\tbuttonState.pressed = true;\n\t\t\t} else {\n\t\t\t\tbuttonState.pressed = false;\n\t\t\t}\n\t\t\tbuttonState.held += delta;\n\t\t\tbuttonState.released = false;\n\t\t} else {\n\t\t\tif (buttonState.held > 0) {\n\t\t\t\tbuttonState.released = true;\n\t\t\t\tbuttonState.held = 0;\n\t\t\t} else {\n\t\t\t\tbuttonState.released = false;\n\t\t\t}\n\t\t\tbuttonState.pressed = false;\n\t\t}\n\n\t\treturn buttonState;\n\t}\n\n\tprivate handleAnalogState(negativeKey: string, positiveKey: string, delta: number): AnalogState {\n\t\tconst value = this.getAxisValue(negativeKey, positiveKey);\n\t\treturn { value, held: delta };\n\t}\n\n\tprivate mergeButtonState(a: ButtonState | undefined, b: ButtonState | undefined): ButtonState {\n\t\treturn {\n\t\t\tpressed: a?.pressed || b?.pressed || false,\n\t\t\treleased: a?.released || b?.released || false,\n\t\t\theld: (a?.held || 0) + (b?.held || 0),\n\t\t};\n\t}\n\n\tprivate applyCustomMapping(input: Partial<InputGamepad>, delta: number): Partial<InputGamepad> {\n\t\tif (!this.mapping) return input;\n\t\tfor (const [key, targets] of Object.entries(this.mapping)) {\n\t\t\tif (!targets || targets.length === 0) continue;\n\t\t\tconst state = this.handleButtonState(key, delta);\n\t\t\tfor (const target of targets) {\n\t\t\t\tconst [rawCategory, rawName] = (target || '').split('.');\n\t\t\t\tif (!rawCategory || !rawName) continue;\n\t\t\t\tconst category = rawCategory.toLowerCase();\n\t\t\t\tconst nameKey = rawName.toLowerCase();\n\t\t\t\tif (category === 'buttons') {\n\t\t\t\t\tconst map: Record<string, keyof InputGamepad['buttons']> = {\n\t\t\t\t\t\t'a': 'A', 'b': 'B', 'x': 'X', 'y': 'Y',\n\t\t\t\t\t\t'start': 'Start', 'select': 'Select',\n\t\t\t\t\t\t'l': 'L', 'r': 'R',\n\t\t\t\t\t};\n\t\t\t\t\tconst prop = map[nameKey];\n\t\t\t\t\tif (!prop) continue;\n\t\t\t\t\tconst nextButtons = (input.buttons || {} as any);\n\t\t\t\t\tnextButtons[prop] = this.mergeButtonState(nextButtons[prop], state);\n\t\t\t\t\tinput.buttons = nextButtons;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (category === 'directions') {\n\t\t\t\t\tconst map: Record<string, keyof InputGamepad['directions']> = {\n\t\t\t\t\t\t'up': 'Up', 'down': 'Down', 'left': 'Left', 'right': 'Right',\n\t\t\t\t\t};\n\t\t\t\t\tconst prop = map[nameKey];\n\t\t\t\t\tif (!prop) continue;\n\t\t\t\t\tconst nextDirections = (input.directions || {} as any);\n\t\t\t\t\tnextDirections[prop] = this.mergeButtonState(nextDirections[prop], state);\n\t\t\t\t\tinput.directions = nextDirections;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (category === 'shoulders') {\n\t\t\t\t\tconst map: Record<string, keyof InputGamepad['shoulders']> = {\n\t\t\t\t\t\t'ltrigger': 'LTrigger', 'rtrigger': 'RTrigger',\n\t\t\t\t\t};\n\t\t\t\t\tconst prop = map[nameKey];\n\t\t\t\t\tif (!prop) continue;\n\t\t\t\t\tconst nextShoulders = (input.shoulders || {} as any);\n\t\t\t\t\tnextShoulders[prop] = this.mergeButtonState(nextShoulders[prop], state);\n\t\t\t\t\tinput.shoulders = nextShoulders;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn input;\n\t}\n\n\tgetInput(delta: number): Partial<InputGamepad> {\n\t\tconst base: Partial<InputGamepad> = {};\n\t\tif (this.includeDefaultBase) {\n\t\t\tbase.buttons = {\n\t\t\t\tA: this.handleButtonState('z', delta),\n\t\t\t\tB: this.handleButtonState('x', delta),\n\t\t\t\tX: this.handleButtonState('a', delta),\n\t\t\t\tY: this.handleButtonState('s', delta),\n\t\t\t\tStart: this.handleButtonState(' ', delta),\n\t\t\t\tSelect: this.handleButtonState('Enter', delta),\n\t\t\t\tL: this.handleButtonState('q', delta),\n\t\t\t\tR: this.handleButtonState('e', delta),\n\t\t\t};\n\t\t\tbase.directions = {\n\t\t\t\tUp: this.handleButtonState('ArrowUp', delta),\n\t\t\t\tDown: this.handleButtonState('ArrowDown', delta),\n\t\t\t\tLeft: this.handleButtonState('ArrowLeft', delta),\n\t\t\t\tRight: this.handleButtonState('ArrowRight', delta),\n\t\t\t};\n\t\t\tbase.axes = {\n\t\t\t\tHorizontal: this.handleAnalogState('ArrowLeft', 'ArrowRight', delta),\n\t\t\t\tVertical: this.handleAnalogState('ArrowUp', 'ArrowDown', delta),\n\t\t\t};\n\t\t\tbase.shoulders = {\n\t\t\t\tLTrigger: this.handleButtonState('Q', delta),\n\t\t\t\tRTrigger: this.handleButtonState('E', delta),\n\t\t\t};\n\t\t}\n\t\treturn this.applyCustomMapping(base, delta);\n\t}\n\n\tgetName(): string {\n\t\treturn 'keyboard';\n\t}\n\n\tprivate getAxisValue(negativeKey: string, positiveKey: string): number {\n\t\treturn (this.isKeyPressed(positiveKey) ? 1 : 0) - (this.isKeyPressed(negativeKey) ? 1 : 0);\n\t}\n\n\tisConnected(): boolean {\n\t\treturn true;\n\t}\n} ","import { InputProvider } from './input-provider';\nimport { AnalogState, ButtonState, InputGamepad } from './input';\n\nexport class GamepadProvider implements InputProvider {\n\tprivate gamepadIndex: number;\n\tprivate connected: boolean = false;\n\n\tprivate buttonStates: Record<number, ButtonState> = {};\n\n\tconstructor(gamepadIndex: number) {\n\t\tthis.gamepadIndex = gamepadIndex;\n\t\twindow.addEventListener('gamepadconnected', (e) => {\n\t\t\tif (e.gamepad.index === this.gamepadIndex) {\n\t\t\t\tthis.connected = true;\n\t\t\t}\n\t\t});\n\t\twindow.addEventListener('gamepaddisconnected', (e) => {\n\t\t\tif (e.gamepad.index === this.gamepadIndex) {\n\t\t\t\tthis.connected = false;\n\t\t\t}\n\t\t});\n\t}\n\n\tprivate handleButtonState(index: number, gamepad: Gamepad, delta: number): ButtonState {\n\t\tconst isPressed = gamepad.buttons[index].pressed;\n\t\tlet buttonState = this.buttonStates[index];\n\n\t\tif (!buttonState) {\n\t\t\tbuttonState = { pressed: false, released: false, held: 0 };\n\t\t\tthis.buttonStates[index] = buttonState;\n\t\t}\n\n\t\tif (isPressed) {\n\t\t\tif (buttonState.held === 0) {\n\t\t\t\tbuttonState.pressed = true;\n\t\t\t} else {\n\t\t\t\tbuttonState.pressed = false;\n\t\t\t}\n\t\t\tbuttonState.held += delta;\n\t\t\tbuttonState.released = false;\n\t\t} else {\n\t\t\tif (buttonState.held > 0) {\n\t\t\t\tbuttonState.released = true;\n\t\t\t\tbuttonState.held = 0;\n\t\t\t} else {\n\t\t\t\tbuttonState.released = false;\n\t\t\t}\n\t\t\tbuttonState.pressed = false;\n\t\t}\n\n\t\treturn buttonState;\n\t}\n\n\tprivate handleAnalogState(index: number, gamepad: Gamepad, delta: number): AnalogState {\n\t\tconst value = gamepad.axes[index];\n\t\treturn { value, held: delta };\n\t}\n\n\tgetInput(delta: number): Partial<InputGamepad> {\n\t\tconst gamepad = navigator.getGamepads()[this.gamepadIndex];\n\t\tif (!gamepad) return {};\n\n\t\treturn {\n\t\t\tbuttons: {\n\t\t\t\tA: this.handleButtonState(0, gamepad, delta),\n\t\t\t\tB: this.handleButtonState(1, gamepad, delta),\n\t\t\t\tX: this.handleButtonState(2, gamepad, delta),\n\t\t\t\tY: this.handleButtonState(3, gamepad, delta),\n\t\t\t\tStart: this.handleButtonState(9, gamepad, delta),\n\t\t\t\tSelect: this.handleButtonState(8, gamepad, delta),\n\t\t\t\tL: this.handleButtonState(4, gamepad, delta),\n\t\t\t\tR: this.handleButtonState(5, gamepad, delta),\n\t\t\t},\n\t\t\tdirections: {\n\t\t\t\tUp: this.handleButtonState(12, gamepad, delta),\n\t\t\t\tDown: this.handleButtonState(13, gamepad, delta),\n\t\t\t\tLeft: this.handleButtonState(14, gamepad, delta),\n\t\t\t\tRight: this.handleButtonState(15, gamepad, delta),\n\t\t\t},\n\t\t\taxes: {\n\t\t\t\tHorizontal: this.handleAnalogState(0, gamepad, delta),\n\t\t\t\tVertical: this.handleAnalogState(1, gamepad, delta),\n\t\t\t},\n\t\t\tshoulders: {\n\t\t\t\tLTrigger: this.handleButtonState(6, gamepad, delta),\n\t\t\t\tRTrigger: this.handleButtonState(7, gamepad, delta),\n\t\t\t}\n\t\t};\n\t}\n\n\tgetName(): string {\n\t\treturn `gamepad-${this.gamepadIndex + 1}`;\n\t}\n\n\tisConnected(): boolean {\n\t\treturn this.connected;\n\t}\n} ","import { InputProvider } from './input-provider';\nimport { AnalogState, ButtonState, InputGamepad, InputPlayerNumber, Inputs } from './input';\nimport { KeyboardProvider } from './keyboard-provider';\nimport { GamepadProvider } from './gamepad-provider';\nimport { GameInputConfig } from '../game/game-interfaces';\n\n\nexport class InputManager {\n\tprivate inputMap: Map<InputPlayerNumber, InputProvider[]> = new Map();\n\tprivate currentInputs: Inputs = {} as Inputs;\n\tprivate previousInputs: Inputs = {} as Inputs;\n\n\tconstructor(config?: GameInputConfig) {\n\t\tif (config?.p1?.key) {\n\t\t\tthis.addInputProvider(1, new KeyboardProvider(config.p1.key, { includeDefaultBase: false }));\n\t\t} else {\n\t\t\tthis.addInputProvider(1, new KeyboardProvider());\n\t\t}\n\t\tthis.addInputProvider(1, new GamepadProvider(0));\n\t\tif (config?.p2?.key) {\n\t\t\tthis.addInputProvider(2, new KeyboardProvider(config.p2.key, { includeDefaultBase: false }));\n\t\t}\n\t\tthis.addInputProvider(2, new GamepadProvider(1));\n\t\tif (config?.p3?.key) {\n\t\t\tthis.addInputProvider(3, new KeyboardProvider(config.p3.key, { includeDefaultBase: false }));\n\t\t}\n\t\tthis.addInputProvider(3, new GamepadProvider(2));\n\t\tif (config?.p4?.key) {\n\t\t\tthis.addInputProvider(4, new KeyboardProvider(config.p4.key, { includeDefaultBase: false }));\n\t\t}\n\t\tthis.addInputProvider(4, new GamepadProvider(3));\n\t\tif (config?.p5?.key) {\n\t\t\tthis.addInputProvider(5, new KeyboardProvider(config.p5.key, { includeDefaultBase: false }));\n\t\t}\n\t\tthis.addInputProvider(5, new GamepadProvider(4));\n\t\tif (config?.p6?.key) {\n\t\t\tthis.addInputProvider(6, new KeyboardProvider(config.p6.key, { includeDefaultBase: false }));\n\t\t}\n\t\tthis.addInputProvider(6, new GamepadProvider(5));\n\t\tif (config?.p7?.key) {\n\t\t\tthis.addInputProvider(7, new KeyboardProvider(config.p7.key, { includeDefaultBase: false }));\n\t\t}\n\t\tthis.addInputProvider(7, new GamepadProvider(6));\n\t\tif (config?.p8?.key) {\n\t\t\tthis.addInputProvider(8, new KeyboardProvider(config.p8.key, { includeDefaultBase: false }));\n\t\t}\n\t\tthis.addInputProvider(8, new GamepadProvider(7));\n\t}\n\n\taddInputProvider(playerNumber: InputPlayerNumber, provider: InputProvider) {\n\t\tif (!this.inputMap.has(playerNumber)) {\n\t\t\tthis.inputMap.set(playerNumber, []);\n\t\t}\n\t\tthis.inputMap.get(playerNumber)?.push(provider);\n\t}\n\n\tgetInputs(delta: number): Inputs {\n\t\tconst inputs = {} as Inputs;\n\t\tthis.inputMap.forEach((providers, playerNumber) => {\n\t\t\tconst playerKey = `p${playerNumber}` as const;\n\n\t\t\tconst mergedInput = providers.reduce((acc, provider) => {\n\t\t\t\tconst input = provider.getInput(delta);\n\t\t\t\treturn this.mergeInputs(acc, input);\n\t\t\t}, {} as Partial<InputGamepad>);\n\n\t\t\tinputs[playerKey] = {\n\t\t\t\tplayerNumber: playerNumber as InputPlayerNumber,\n\t\t\t\t...mergedInput\n\t\t\t} as InputGamepad;\n\t\t});\n\t\treturn inputs;\n\t}\n\n\tmergeButtonState(a: ButtonState | undefined, b: ButtonState | undefined): ButtonState {\n\t\treturn {\n\t\t\tpressed: a?.pressed || b?.pressed || false,\n\t\t\treleased: a?.released || b?.released || false,\n\t\t\theld: (a?.held || 0) + (b?.held || 0),\n\t\t};\n\t}\n\n\tmergeAnalogState(a: AnalogState | undefined, b: AnalogState | undefined): AnalogState {\n\t\treturn {\n\t\t\tvalue: (a?.value || 0) + (b?.value || 0),\n\t\t\theld: (a?.held || 0) + (b?.held || 0),\n\t\t};\n\t}\n\n\tprivate mergeInputs(a: Partial<InputGamepad>, b: Partial<InputGamepad>): Partial<InputGamepad> {\n\t\treturn {\n\t\t\tbuttons: {\n\t\t\t\tA: this.mergeButtonState(a.buttons?.A, b.buttons?.A),\n\t\t\t\tB: this.mergeButtonState(a.buttons?.B, b.buttons?.B),\n\t\t\t\tX: this.mergeButtonState(a.buttons?.X, b.buttons?.X),\n\t\t\t\tY: this.mergeButtonState(a.buttons?.Y, b.buttons?.Y),\n\t\t\t\tStart: this.mergeButtonState(a.buttons?.Start, b.buttons?.Start),\n\t\t\t\tSelect: this.mergeButtonState(a.buttons?.Select, b.buttons?.Select),\n\t\t\t\tL: this.mergeButtonState(a.buttons?.L, b.buttons?.L),\n\t\t\t\tR: this.mergeButtonState(a.buttons?.R, b.buttons?.R),\n\t\t\t},\n\t\t\tdirections: {\n\t\t\t\tUp: this.mergeButtonState(a.directions?.Up, b.directions?.Up),\n\t\t\t\tDown: this.mergeButtonState(a.directions?.Down, b.directions?.Down),\n\t\t\t\tLeft: this.mergeButtonState(a.directions?.Left, b.directions?.Left),\n\t\t\t\tRight: this.mergeButtonState(a.directions?.Right, b.directions?.Right),\n\t\t\t},\n\t\t\taxes: {\n\t\t\t\tHorizontal: this.mergeAnalogState(a.axes?.Horizontal, b.axes?.Horizontal),\n\t\t\t\tVertical: this.mergeAnalogState(a.axes?.Vertical, b.axes?.Vertical),\n\t\t\t},\n\t\t\tshoulders: {\n\t\t\t\tLTrigger: this.mergeButtonState(a.shoulders?.LTrigger, b.shoulders?.LTrigger),\n\t\t\t\tRTrigger: this.mergeButtonState(a.shoulders?.RTrigger, b.shoulders?.RTrigger),\n\t\t\t}\n\t\t};\n\t}\n} ","/**\n * This class is an alternative to {@link Clock} with a different API design and behavior.\n * The goal is to avoid the conceptual flaws that became apparent in `Clock` over time.\n *\n * - `Timer` has an `update()` method that updates its internal state. That makes it possible to\n * call `getDelta()` and `getElapsed()` multiple times per simulation step without getting different values.\n * - The class can make use of the Page Visibility API to avoid large time delta values when the app\n * is inactive (e.g. tab switched or browser hidden).\n *\n * ```js\n * const timer = new Timer();\n * timer.connect( document ); // use Page Visibility API\n * ```\n *\n * @three_import import { Timer } from 'three/addons/misc/Timer.js';\n */\nclass Timer {\n\tprotected _previousTime: number;\n\tprotected _currentTime: number;\n\tprotected _startTime: number;\n\tprotected _delta: number;\n\tprotected _elapsed: number;\n\tprotected _timescale: number;\n\tprotected _document: Document | null;\n\tprotected _pageVisibilityHandler: (() => void) | null;\n\n\t/**\n\t * Constructs a new timer.\n\t */\n\tconstructor() {\n\n\t\tthis._previousTime = 0;\n\t\tthis._currentTime = 0;\n\t\tthis._startTime = now();\n\n\t\tthis._delta = 0;\n\t\tthis._elapsed = 0;\n\n\t\tthis._timescale = 1;\n\n\t\tthis._document = null;\n\t\tthis._pageVisibilityHandler = null;\n\n\t}\n\n\t/**\n\t * Connect the timer to the given document.Calling this method is not mandatory to\n\t * use the timer but enables the usage of the Page Visibility API to avoid large time\n\t * delta values.\n\t *\n\t * @param {Document} document - The document.\n\t */\n\tconnect(document: Document): void {\n\n\t\tthis._document = document;\n\n\t\t// use Page Visibility API to avoid large time delta values\n\n\t\tif (document.hidden !== undefined) {\n\n\t\t\tthis._pageVisibilityHandler = handleVisibilityChange.bind(this);\n\n\t\t\tdocument.addEventListener('visibilitychange', this._pageVisibilityHandler, false);\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Disconnects the timer from the DOM and also disables the usage of the Page Visibility API.\n\t */\n\tdisconnect(): void {\n\n\t\tif (this._pageVisibilityHandler !== null) {\n\n\t\t\tthis._document!.removeEventListener('visibilitychange', this._pageVisibilityHandler);\n\t\t\tthis._pageVisibilityHandler = null;\n\n\t\t}\n\n\t\tthis._document = null;\n\n\t}\n\n\t/**\n\t * Returns the time delta in seconds.\n\t *\n\t * @return {number} The time delta in second.\n\t */\n\tgetDelta(): number {\n\n\t\treturn this._delta / 1000;\n\n\t}\n\n\t/**\n\t * Returns the elapsed time in seconds.\n\t *\n\t * @return {number} The elapsed time in second.\n\t */\n\tgetElapsed(): number {\n\n\t\treturn this._elapsed / 1000;\n\n\t}\n\n\t/**\n\t * Returns the timescale.\n\t *\n\t * @return {number} The timescale.\n\t */\n\tgetTimescale(): number {\n\n\t\treturn this._timescale;\n\n\t}\n\n\t/**\n\t * Sets the given timescale which scale the time delta computation\n\t * in `update()`.\n\t *\n\t * @param {number} timescale - The timescale to set.\n\t * @return {Timer} A reference to this timer.\n\t */\n\tsetTimescale(timescale: number): Timer {\n\n\t\tthis._timescale = timescale;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Resets the time computation for the current simulation step.\n\t *\n\t * @return {Timer} A reference to this timer.\n\t */\n\treset(): Timer {\n\n\t\tthis._currentTime = now() - this._startTime;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Can be used to free all internal resources. Usually called when\n\t * the timer instance isn't required anymore.\n\t */\n\tdispose(): void {\n\n\t\tthis.disconnect();\n\n\t}\n\n\t/**\n\t * Updates the internal state of the timer. This method should be called\n\t * once per simulation step and before you perform queries against the timer\n\t * (e.g. via `getDelta()`).\n\t *\n\t * @param {number} timestamp - The current time in milliseconds. Can be obtained\n\t * from the `requestAnimationFrame` callback argument. If not provided, the current\n\t * time will be determined with `performance.now`.\n\t * @return {Timer} A reference to this timer.\n\t */\n\tupdate(timestamp?: number): Timer {\n\n\t\tif (this._pageVisibilityHandler !== null && this._document!.hidden === true) {\n\n\t\t\tthis._delta = 0;\n\n\t\t} else {\n\n\t\t\tthis._previousTime = this._currentTime;\n\t\t\tthis._currentTime = (timestamp !== undefined ? timestamp : now()) - this._startTime;\n\n\t\t\tthis._delta = (this._currentTime - this._previousTime) * this._timescale;\n\t\t\tthis._elapsed += this._delta; // _elapsed is the accumulation of all previous deltas\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A special version of a timer with a fixed time delta value.\n * Can be useful for testing and debugging purposes.\n *\n * @augments Timer\n */\nclass FixedTimer extends Timer {\n\n\t/**\n\t * Constructs a new timer.\n\t *\n\t * @param {number} [fps=60] - The fixed FPS of this timer.\n\t */\n\tconstructor(fps: number = 60) {\n\n\t\tsuper();\n\t\tthis._delta = (1 / fps) * 1000;\n\n\t}\n\n\tupdate(): FixedTimer {\n\n\t\tthis._elapsed += (this._delta * this._timescale); // _elapsed is the accumulation of all previous deltas\n\n\t\treturn this;\n\n\t}\n\n}\n\nfunction now(): number {\n\n\treturn performance.now();\n\n}\n\nfunction handleVisibilityChange(this: Timer): void {\n\n\tif (this._document!.hidden === false) this.reset();\n\n}\n\nexport { Timer, };","export const AspectRatio = {\n\tFourByThree: 4 / 3,\n\tSixteenByNine: 16 / 9,\n\tTwentyOneByNine: 21 / 9,\n\tOneByOne: 1 / 1,\n} as const;\n\nexport type AspectRatioValue = (typeof AspectRatio)[keyof typeof AspectRatio] | number;\n\n/**\n * AspectRatioDelegate manages sizing a canvas to fit within a container\n * while preserving a target aspect ratio. It notifies a consumer via\n * onResize when the final width/height are applied so renderers/cameras\n * can update their viewports.\n */\nexport class AspectRatioDelegate {\n\tcontainer: HTMLElement;\n\tcanvas: HTMLCanvasElement;\n\taspectRatio: number;\n\tonResize?: (width: number, height: number) => void;\n\tprivate handleResizeBound: () => void;\n\n\tconstructor(params: {\n\t\tcontainer: HTMLElement;\n\t\tcanvas: HTMLCanvasElement;\n\t\taspectRatio: AspectRatioValue;\n\t\tonResize?: (width: number, height: number) => void;\n\t}) {\n\t\tthis.container = params.container;\n\t\tthis.canvas = params.canvas;\n\t\tthis.aspectRatio = typeof params.aspectRatio === 'number' ? params.aspectRatio : params.aspectRatio;\n\t\tthis.onResize = params.onResize;\n\t\tthis.handleResizeBound = this.apply.bind(this);\n\t}\n\n\t/** Attach window resize listener and apply once. */\n\tattach() {\n\t\twindow.addEventListener('resize', this.handleResizeBound);\n\t\tthis.apply();\n\t}\n\n\t/** Detach window resize listener. */\n\tdetach() {\n\t\twindow.removeEventListener('resize', this.handleResizeBound);\n\t}\n\n\t/** Compute the largest size that fits container while preserving aspect. */\n\tmeasure(): { width: number; height: number } {\n\t\tconst containerWidth = this.container.clientWidth || window.innerWidth;\n\t\tconst containerHeight = this.container.clientHeight || window.innerHeight;\n\n\t\tconst containerRatio = containerWidth / containerHeight;\n\t\tif (containerRatio > this.aspectRatio) {\n\t\t\t// container is wider than target; limit by height\n\t\t\tconst height = containerHeight;\n\t\t\tconst width = Math.round(height * this.aspectRatio);\n\t\t\treturn { width, height };\n\t\t} else {\n\t\t\t// container is taller/narrower; limit by width\n\t\t\tconst width = containerWidth;\n\t\t\tconst height = Math.round(width / this.aspectRatio);\n\t\t\treturn { width, height };\n\t\t}\n\t}\n\n\t/** Apply measured size to canvas and notify. */\n\tapply() {\n\t\tconst { width, height } = this.measure();\n\t\t// Apply CSS size; renderer will update internal size via onResize callback\n\t\tthis.canvas.style.width = `${width}px`;\n\t\tthis.canvas.style.height = `${height}px`;\n\t\tthis.onResize?.(width, height);\n\t}\n}","export type RetroResolution = { key: string; width: number; height: number; notes?: string };\n\nexport type RetroPreset = {\n\tdisplayAspect: number;\n\tresolutions: RetroResolution[];\n};\n\n/**\n * Retro and console display presets.\n * displayAspect represents the intended display aspect (letterboxing target),\n * not necessarily the raw pixel aspect of internal buffers.\n */\nconst RetroPresets: Record<string, RetroPreset> = {\n\tNES: {\n\t\tdisplayAspect: 4 / 3,\n\t\tresolutions: [\n\t\t\t{ key: '256x240', width: 256, height: 240, notes: 'Standard NTSC; effective 240p.' },\n\t\t],\n\t},\n\tSNES: {\n\t\tdisplayAspect: 4 / 3,\n\t\tresolutions: [\n\t\t\t{ key: '256x224', width: 256, height: 224, notes: 'Common 240p-equivalent mode.' },\n\t\t\t{ key: '512x448', width: 512, height: 448, notes: 'Hi-res interlaced (480i).' },\n\t\t],\n\t},\n\tN64: {\n\t\tdisplayAspect: 4 / 3,\n\t\tresolutions: [\n\t\t\t{ key: '320x240', width: 320, height: 240, notes: 'Common 240p mode.' },\n\t\t\t{ key: '640x480', width: 640, height: 480, notes: 'Higher resolution (480i).' },\n\t\t],\n\t},\n\tPS1: {\n\t\tdisplayAspect: 4 / 3,\n\t\tresolutions: [\n\t\t\t{ key: '320x240', width: 320, height: 240, notes: 'Progressive 240p common.' },\n\t\t\t{ key: '640x480', width: 640, height: 480, notes: 'Interlaced 480i for higher detail.' },\n\t\t],\n\t},\n\tPS2: {\n\t\tdisplayAspect: 4 / 3,\n\t\tresolutions: [\n\t\t\t{ key: '640x480', width: 640, height: 480, notes: '480i/480p baseline.' },\n\t\t\t{ key: '720x480', width: 720, height: 480, notes: '480p (widescreen capable in some titles).' },\n\t\t\t{ key: '1280x720', width: 1280, height: 720, notes: '720p (select titles).' },\n\t\t],\n\t},\n\tPS5: {\n\t\tdisplayAspect: 16 / 9,\n\t\tresolutions: [\n\t\t\t{ key: '720x480', width: 720, height: 480, notes: 'Legacy compatibility.' },\n\t\t\t{ key: '1280x720', width: 1280, height: 720, notes: '720p.' },\n\t\t\t{ key: '1920x1080', width: 1920, height: 1080, notes: '1080p.' },\n\t\t\t{ key: '2560x1440', width: 2560, height: 1440, notes: '1440p.' },\n\t\t\t{ key: '3840x2160', width: 3840, height: 2160, notes: '4K (up to 120Hz).' },\n\t\t\t{ key: '7680x4320', width: 7680, height: 4320, notes: '8K (limited).' },\n\t\t],\n\t},\n\tXboxOne: {\n\t\tdisplayAspect: 16 / 9,\n\t\tresolutions: [\n\t\t\t{ key: '1280x720', width: 1280, height: 720, notes: '720p (original).' },\n\t\t\t{ key: '1920x1080', width: 1920, height: 1080, notes: '1080p (original).' },\n\t\t\t{ key: '3840x2160', width: 3840, height: 2160, notes: '4K UHD (S/X models).' },\n\t\t],\n\t},\n};\n\nexport type RetroPresetKey = keyof typeof RetroPresets;\n\nexport function getDisplayAspect(preset: RetroPresetKey): number {\n\treturn RetroPresets[preset].displayAspect;\n}\n\nexport function getPresetResolution(preset: RetroPresetKey, key?: string): RetroResolution | undefined {\n\tconst list = RetroPresets[preset]?.resolutions || [];\n\tif (!key) return list[0];\n\tconst normalized = key.toLowerCase().replace(/\\s+/g, '').replace('×', 'x');\n\treturn list.find(r => r.key.toLowerCase() === normalized);\n}\n\nexport function parseResolution(text: string): { width: number; height: number } | null {\n\tif (!text) return null;\n\tconst normalized = String(text).toLowerCase().trim().replace(/\\s+/g, '').replace('×', 'x');\n\tconst match = normalized.match(/^(\\d+)x(\\d+)$/);\n\tif (!match) return null;\n\tconst width = parseInt(match[1], 10);\n\tconst height = parseInt(match[2], 10);\n\tif (!Number.isFinite(width) || !Number.isFinite(height)) return null;\n\treturn { width, height };\n}\n\n\n","import { StageInterface } from \"../types\";\nimport { GameInputConfig } from \"./game-interfaces\";\nimport { AspectRatio, AspectRatioValue } from \"../device/aspect-ratio\";\nimport { getDisplayAspect, getPresetResolution, parseResolution, RetroPresetKey } from \"./game-retro-resolutions\";\n\nexport type GameConfigLike = Partial<{\n\tid: string;\n\tglobals: Record<string, any>;\n\tstages: StageInterface[];\n\tdebug: boolean;\n\ttime: number;\n\tinput: GameInputConfig;\n\t/** numeric value or key in AspectRatio */\n\taspectRatio: AspectRatioValue | keyof typeof AspectRatio;\n\t/** console/display preset to derive aspect ratio */\n\tpreset: RetroPresetKey;\n\t/** lock internal render buffer to this resolution (e.g., '256x240' or { width, height }) */\n\tresolution: string | { width: number; height: number };\n\tfullscreen: boolean;\n\t/** CSS background value for document body */\n\tbodyBackground: string;\n\t/** existing container by reference */\n\tcontainer: HTMLElement;\n\t/** create/find container by id */\n\tcontainerId: string;\n\t/** optional canvas if caller wants to manage it */\n\tcanvas: HTMLCanvasElement;\n}>;\n\nexport class GameConfig {\n\tconstructor(\n\t\tpublic id: string,\n\t\tpublic globals: Record<string, any>,\n\t\tpublic stages: StageInterface[],\n\t\tpublic debug: boolean,\n\t\tpublic time: number,\n\t\tpublic input: GameInputConfig | undefined,\n\t\tpublic aspectRatio: number,\n\t\tpublic internalResolution: { width: number; height: number } | undefined,\n\t\tpublic fullscreen: boolean,\n\t\tpublic bodyBackground: string | undefined,\n\t\tpublic container: HTMLElement,\n\t\tpublic containerId?: string,\n\t\tpublic canvas?: HTMLCanvasElement,\n\t) { }\n}\n\nfunction ensureContainer(containerId?: string, existing?: HTMLElement | null): HTMLElement {\n\tif (existing) return existing;\n\tif (containerId) {\n\t\tconst found = document.getElementById(containerId);\n\t\tif (found) return found;\n\t}\n\tconst id = containerId || 'zylem-root';\n\tconst el = document.createElement('main');\n\tel.setAttribute('id', id);\n\tel.style.position = 'relative';\n\tel.style.width = '100%';\n\tel.style.height = '100%';\n\tdocument.body.appendChild(el);\n\treturn el;\n}\n\nfunction createDefaultGameConfig(base?: Partial<Pick<GameConfig, 'id' | 'debug' | 'time' | 'input'>> & { stages?: StageInterface[]; globals?: Record<string, any> }): GameConfig {\n\tconst id = base?.id ?? 'zylem';\n\tconst container = ensureContainer(id);\n\treturn new GameConfig(\n\t\tid,\n\t\t(base?.globals ?? {}) as Record<string, any>,\n\t\t(base?.stages ?? []) as StageInterface[],\n\t\tBoolean(base?.debug),\n\t\tbase?.time ?? 0,\n\t\tbase?.input,\n\t\tAspectRatio.SixteenByNine,\n\t\tundefined,\n\t\ttrue,\n\t\t'#000000',\n\t\tcontainer,\n\t\tid,\n\t\tundefined,\n\t);\n}\n\nexport function resolveGameConfig(user?: GameConfigLike): GameConfig {\n\tconst defaults = createDefaultGameConfig({\n\t\tid: user?.id ?? 'zylem',\n\t\tdebug: Boolean(user?.debug),\n\t\ttime: (user?.time as number) ?? 0,\n\t\tinput: user?.input,\n\t\tstages: (user?.stages as StageInterface[]) ?? [],\n\t\tglobals: (user?.globals as Record<string, any>) ?? {},\n\t});\n\n\t// Resolve container\n\tconst containerId = (user?.containerId as string) ?? defaults.containerId;\n\tconst container = ensureContainer(containerId, user?.container ?? null);\n\n\t// Derive aspect ratio: explicit numeric -> preset -> default\n\tconst explicitAspect = user?.aspectRatio as any;\n\tlet aspectRatio = defaults.aspectRatio;\n\tif (typeof explicitAspect === 'number' || (explicitAspect && typeof explicitAspect === 'string')) {\n\t\taspectRatio = typeof explicitAspect === 'number' ? explicitAspect : (AspectRatio as any)[explicitAspect] ?? defaults.aspectRatio;\n\t} else if (user?.preset) {\n\t\ttry {\n\t\t\taspectRatio = getDisplayAspect(user.preset as RetroPresetKey) || defaults.aspectRatio;\n\t\t} catch {\n\t\t\taspectRatio = defaults.aspectRatio;\n\t\t}\n\t}\n\n\tconst fullscreen = (user?.fullscreen as boolean) ?? defaults.fullscreen;\n\tconst bodyBackground = (user?.bodyBackground as string) ?? defaults.bodyBackground;\n\n\t// Normalize internal resolution lock\n\tlet internalResolution: { width: number; height: number } | undefined;\n\tif (user?.resolution) {\n\t\tif (typeof user.resolution === 'string') {\n\t\t\tconst parsed = parseResolution(user.resolution);\n\t\t\tif (parsed) internalResolution = parsed;\n\t\t\t// fallback: allow preset resolution keys like '256x240' under a preset\n\t\t\tif (!internalResolution && user.preset) {\n\t\t\t\tconst res = getPresetResolution(user.preset as RetroPresetKey, user.resolution);\n\t\t\t\tif (res) internalResolution = { width: res.width, height: res.height };\n\t\t\t}\n\t\t} else if (typeof user.resolution === 'object') {\n\t\t\tconst w = (user.resolution as any).width;\n\t\t\tconst h = (user.resolution as any).height;\n\t\t\tif (Number.isFinite(w) && Number.isFinite(h)) {\n\t\t\t\tinternalResolution = { width: w, height: h };\n\t\t\t}\n\t\t}\n\t}\n\n\t// Prefer provided canvas if any\n\tconst canvas = user?.canvas ?? undefined;\n\n\treturn new GameConfig(\n\t\t(user?.id as string) ?? defaults.id,\n\t\t(user?.globals as Record<string, any>) ?? defaults.globals,\n\t\t(user?.stages as StageInterface[]) ?? defaults.stages,\n\t\tBoolean(user?.debug ?? defaults.debug),\n\t\t(user?.time as number) ?? defaults.time,\n\t\tuser?.input ?? defaults.input,\n\t\taspectRatio,\n\t\tinternalResolution,\n\t\tfullscreen,\n\t\tbodyBackground,\n\t\tcontainer,\n\t\tcontainerId,\n\t\tcanvas,\n\t);\n}\n\n/**\n * Factory for authoring configuration objects in user code.\n * Returns a plain object that can be passed to `game(...)`.\n */\nexport function gameConfig(config: GameConfigLike): GameConfigLike {\n\treturn { ...config };\n}","import { AspectRatioDelegate, AspectRatioValue } from '../device/aspect-ratio';\n\nexport interface GameCanvasOptions {\n\tid: string;\n\tcontainer?: HTMLElement;\n\tcontainerId?: string;\n\tcanvas?: HTMLCanvasElement;\n\tbodyBackground?: string;\n\tfullscreen?: boolean;\n\taspectRatio: AspectRatioValue | number;\n}\n\n/**\n * GameCanvas is a DOM delegate that owns:\n * - container lookup/creation and styling (including fullscreen centering)\n * - body background application\n * - canvas mounting into container\n * - aspect ratio sizing via AspectRatioDelegate\n */\nexport class GameCanvas {\n\tid: string;\n\tcontainer!: HTMLElement;\n\tcanvas!: HTMLCanvasElement;\n\tbodyBackground?: string;\n\tfullscreen: boolean;\n\taspectRatio: number;\n\tprivate ratioDelegate: AspectRatioDelegate | null = null;\n\n\tconstructor(options: GameCanvasOptions) {\n\t\tthis.id = options.id;\n\t\tthis.container = this.ensureContainer(options.containerId ?? options.id, options.container);\n\t\tthis.canvas = options.canvas ?? document.createElement('canvas');\n\t\tthis.bodyBackground = options.bodyBackground;\n\t\tthis.fullscreen = Boolean(options.fullscreen);\n\t\tthis.aspectRatio = typeof options.aspectRatio === 'number' ? options.aspectRatio : options.aspectRatio;\n\t}\n\n\tapplyBodyBackground() {\n\t\tif (this.bodyBackground) {\n\t\t\tdocument.body.style.background = this.bodyBackground;\n\t\t}\n\t}\n\n\tmountCanvas() {\n\t\twhile (this.container.firstChild) {\n\t\t\tthis.container.removeChild(this.container.firstChild);\n\t\t}\n\t\tthis.container.appendChild(this.canvas);\n\t}\n\n\tmountRenderer(rendererDom: HTMLCanvasElement, onResize: (width: number, height: number) => void) {\n\t\twhile (this.container.firstChild) {\n\t\t\tthis.container.removeChild(this.container.firstChild);\n\t\t}\n\t\tthis.container.appendChild(rendererDom);\n\t\tthis.canvas = rendererDom;\n\t\tthis.attachAspectRatio(onResize);\n\t}\n\n\tcenterIfFullscreen() {\n\t\tif (!this.fullscreen) return;\n\t\tconst style = this.container.style;\n\t\tstyle.display = 'flex';\n\t\tstyle.alignItems = 'center';\n\t\tstyle.justifyContent = 'center';\n\t\tstyle.position = 'relative';\n\t\tstyle.inset = '0';\n\t}\n\n\tattachAspectRatio(onResize: (width: number, height: number) => void) {\n\t\tif (!this.ratioDelegate) {\n\t\t\tthis.ratioDelegate = new AspectRatioDelegate({\n\t\t\t\tcontainer: this.container,\n\t\t\t\tcanvas: this.canvas,\n\t\t\t\taspectRatio: this.aspectRatio,\n\t\t\t\tonResize\n\t\t\t});\n\t\t\tthis.ratioDelegate.attach();\n\t\t} else {\n\t\t\tthis.ratioDelegate.canvas = this.canvas;\n\t\t\tthis.ratioDelegate.onResize = onResize;\n\t\t\tthis.ratioDelegate.aspectRatio = this.aspectRatio;\n\t\t\tthis.ratioDelegate.apply();\n\t\t}\n\t}\n\n\tdestroy() {\n\t\tthis.ratioDelegate?.detach();\n\t\tthis.ratioDelegate = null;\n\t}\n\n\tprivate ensureContainer(containerId?: string, existing?: HTMLElement | null): HTMLElement {\n\t\tif (existing) return existing;\n\t\tif (containerId) {\n\t\t\tconst found = document.getElementById(containerId);\n\t\t\tif (found) return found;\n\t\t}\n\t\tconst id = containerId || this.id || 'zylem-root';\n\t\tconst el = document.createElement('main');\n\t\tel.setAttribute('id', id);\n\t\tel.style.position = 'relative';\n\t\tel.style.width = '100%';\n\t\tel.style.height = '100%';\n\t\tdocument.body.appendChild(el);\n\t\treturn el;\n\t}\n}\n","import { ZylemGame } from './zylem-game';\nimport { DestroyFunction, SetupFunction, UpdateFunction } from '../core/base-node-life-cycle';\nimport { IGame, LoadingEvent } from '../core/interfaces';\nimport { setPaused } from '../debug/debug-state';\nimport { BaseGlobals } from './game-interfaces';\nimport { convertNodes, GameOptions, hasStages, extractGlobalsFromOptions } from '../core/utility/nodes';\nimport { resolveGameConfig } from './game-config';\nimport { createStage } from '../stage/stage';\nimport { StageManager, stageState } from '../stage/stage-manager';\nimport { StageFactory } from '../stage/stage-factory';\nimport { initGlobals } from './game-state';\n\nexport class Game<TGlobals extends BaseGlobals> implements IGame<TGlobals> {\n\tprivate wrappedGame: ZylemGame<TGlobals> | null = null;\n\n\toptions: GameOptions<TGlobals>;\n\n\tupdate: UpdateFunction<ZylemGame<TGlobals>, TGlobals> = () => { };\n\tsetup: SetupFunction<ZylemGame<TGlobals>, TGlobals> = () => { };\n\tdestroy: DestroyFunction<ZylemGame<TGlobals>, TGlobals> = () => { };\n\n\trefErrorMessage = 'lost reference to game';\n\n\tconstructor(options: GameOptions<TGlobals>) {\n\t\tthis.options = options;\n\t\tif (!hasStages(options)) {\n\t\t\tthis.options.push(createStage());\n\t\t}\n\t\t// Initialize globals immediately so onGlobalChange subscriptions work\n\t\tconst globals = extractGlobalsFromOptions(options);\n\t\tif (globals) {\n\t\t\tinitGlobals(globals as Record<string, unknown>);\n\t\t}\n\t}\n\n\tasync start(): Promise<this> {\n\t\tconst game = await this.load();\n\t\tthis.wrappedGame = game;\n\t\tthis.setOverrides();\n\t\tgame.start();\n\t\treturn this;\n\t}\n\n\tprivate async load(): Promise<ZylemGame<TGlobals>> {\n\t\tconst options = await convertNodes<TGlobals>(this.options);\n\t\tconst resolved = resolveGameConfig(options as any);\n\t\tconst game = new ZylemGame<TGlobals>({\n\t\t\t...options as any,\n\t\t\t...resolved as any,\n\t\t} as any, this);\n\t\tawait game.loadStage(options.stages[0]);\n\t\treturn game;\n\t}\n\n\tsetOverrides() {\n\t\tif (!this.wrappedGame) {\n\t\t\tconsole.error(this.refErrorMessage);\n\t\t\treturn;\n\t\t}\n\t\tthis.wrappedGame.customSetup = this.setup;\n\t\tthis.wrappedGame.customUpdate = this.update;\n\t\tthis.wrappedGame.customDestroy = this.destroy;\n\t}\n\n\tasync pause() {\n\t\tsetPaused(true);\n\t}\n\n\tasync resume() {\n\t\tsetPaused(false);\n\t\tif (this.wrappedGame) {\n\t\t\tthis.wrappedGame.previousTimeStamp = 0;\n\t\t\tthis.wrappedGame.timer.reset();\n\t\t}\n\t}\n\n\tasync reset() {\n\t\tif (!this.wrappedGame) {\n\t\t\tconsole.error(this.refErrorMessage);\n\t\t\treturn;\n\t\t}\n\t\tawait this.wrappedGame.loadStage(this.wrappedGame.stages[0]);\n\t}\n\n\tasync previousStage() {\n\t\tif (!this.wrappedGame) {\n\t\t\tconsole.error(this.refErrorMessage);\n\t\t\treturn;\n\t\t}\n\t\tconst currentStageId = this.wrappedGame.currentStageId;\n\t\tconst currentIndex = this.wrappedGame.stages.findIndex((s) => s.wrappedStage!.uuid === currentStageId);\n\t\tconst previousStage = this.wrappedGame.stages[currentIndex - 1];\n\t\tif (!previousStage) {\n\t\t\tconsole.error('previous stage called on first stage');\n\t\t\treturn;\n\t\t}\n\t\tawait this.wrappedGame.loadStage(previousStage);\n\t}\n\n\tasync loadStageFromId(stageId: string) {\n\t\tif (!this.wrappedGame) {\n\t\t\tconsole.error(this.refErrorMessage);\n\t\t\treturn;\n\t\t}\n\t\ttry {\n\t\t\tconst blueprint = await StageManager.loadStageData(stageId);\n\t\t\tconst stage = await StageFactory.createFromBlueprint(blueprint);\n\t\t\tawait this.wrappedGame.loadStage(stage);\n\t\t\t\n\t\t\t// Update StageManager state\n\t\t\tstageState.current = blueprint;\n\t\t} catch (e) {\n\t\t\tconsole.error(`Failed to load stage ${stageId}`, e);\n\t\t}\n\t}\n\n\tasync nextStage() {\n\t\tif (!this.wrappedGame) {\n\t\t\tconsole.error(this.refErrorMessage);\n\t\t\treturn;\n\t\t}\n\t\t\n\t\t// Try to use StageManager first if we have a next stage in state\n\t\tif (stageState.next) {\n\t\t\tconst nextId = stageState.next.id;\n\t\t\tawait StageManager.transitionForward(nextId);\n\t\t\t// After transition, current is the new stage\n\t\t\tif (stageState.current) {\n\t\t\t\tconst stage = await StageFactory.createFromBlueprint(stageState.current);\n\t\t\t\tawait this.wrappedGame.loadStage(stage);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t// Fallback to legacy array-based navigation\n\t\tconst currentStageId = this.wrappedGame.currentStageId;\n\t\tconst currentIndex = this.wrappedGame.stages.findIndex((s) => s.wrappedStage!.uuid === currentStageId);\n\t\tconst nextStage = this.wrappedGame.stages[currentIndex + 1];\n\t\tif (!nextStage) {\n\t\t\tconsole.error('next stage called on last stage');\n\t\t\treturn;\n\t\t}\n\t\tawait this.wrappedGame.loadStage(nextStage);\n\t}\n\n\tasync goToStage() { }\n\n\tasync end() { }\n\n\tdispose() {\n\t\tif (this.wrappedGame) {\n\t\t\tthis.wrappedGame.dispose();\n\t\t}\n\t}\n\n\tonLoading(callback: (event: LoadingEvent) => void) {\n\t\t\n\t}\n}\n\n/**\n * create a new game\n * @param options GameOptions - Array of IGameOptions, Stage, GameEntity, or BaseNode objects\n * @param options.id Game name string (when using IGameOptions)\n * @param options.globals Game globals object (when using IGameOptions)\n * @param options.stages Array of stage objects (when using IGameOptions)\n * @returns Game\n */\nexport function createGame<TGlobals extends BaseGlobals>(...options: GameOptions<TGlobals>): Game<TGlobals> {\n\treturn new Game<TGlobals>(options);\n}","import { BaseNode } from '../base-node';\nimport { Stage } from '../../stage/stage';\nimport { GameEntity, GameEntityLifeCycle } from '../../entities/entity';\nimport { BaseGlobals, ZylemGameConfig } from '../../game/game-interfaces';\nimport { GameConfigLike } from '~/lib/game/game-config';\n\n// export function isStageContext(value: unknown): value is StageContext {\n// \treturn !!value && typeof value === 'object' && 'instance' in (value as any) && 'stageBlueprint' in (value as any);\n// }\n\nexport type GameOptions<TGlobals extends BaseGlobals> = Array<\n\tZylemGameConfig<Stage, any, TGlobals> |\n\tGameConfigLike |\n\tStage |\n\tGameEntityLifeCycle |\n\tBaseNode\n>;\n\nexport async function convertNodes<TGlobals extends BaseGlobals>(\n\t_options: GameOptions<TGlobals>\n): Promise<{ id: string, globals: TGlobals, stages: Stage[] }> {\n\tconst { getGameDefaultConfig } = await import('../../game/game-default');\n\tlet converted = { ...getGameDefaultConfig<TGlobals>() } as { id: string, globals: TGlobals, stages: Stage[] };\n\tconst configurations: ZylemGameConfig<Stage, any, TGlobals>[] = [];\n\tconst stages: Stage[] = [];\n\tconst entities: (BaseNode | GameEntity<any>)[] = [];\n\n\tObject.values(_options).forEach((node) => {\n\t\tif (node instanceof Stage) {\n\t\t\tstages.push(node);\n\t\t} else if (node instanceof GameEntity) {\n\t\t\tentities.push(node);\n\t\t} else if (node instanceof BaseNode) {\n\t\t\tentities.push(node);\n\t\t} else if ((node as any)?.constructor?.name === 'Object' && typeof node === 'object') {\n\t\t\tconst configuration = Object.assign({ ...getGameDefaultConfig<TGlobals>() }, { ...node });\n\t\t\tconfigurations.push(configuration as ZylemGameConfig<Stage, any, TGlobals>);\n\t\t}\n\t});\n\tconfigurations.forEach((configuration) => {\n\t\tconverted = Object.assign(converted, { ...configuration });\n\t});\n\tstages.forEach((stageInstance) => {\n\t\tstageInstance.addEntities(entities as BaseNode[]);\n\t});\n\tif (stages.length) {\n\t\tconverted.stages = stages;\n\t} else {\n\t\tconverted.stages[0].addEntities(entities as BaseNode[]);\n\t}\n\treturn converted as unknown as { id: string, globals: TGlobals, stages: Stage[] };\n}\n\nexport function hasStages<TGlobals extends BaseGlobals>(_options: GameOptions<TGlobals>): Boolean {\n\tconst stage = _options.find(option => option instanceof Stage);\n\treturn Boolean(stage);\n}\n\n/**\n * Extract globals object from game options array.\n * Used to initialize globals before game starts.\n */\nexport function extractGlobalsFromOptions<TGlobals extends BaseGlobals>(\n\t_options: GameOptions<TGlobals>\n): TGlobals | undefined {\n\tfor (const option of _options) {\n\t\tif (option && typeof option === 'object' && !(option instanceof Stage) && !(option instanceof BaseNode) && !(option instanceof GameEntity)) {\n\t\t\tconst config = option as ZylemGameConfig<Stage, any, TGlobals>;\n\t\t\tif (config.globals) {\n\t\t\t\treturn config.globals;\n\t\t\t}\n\t\t}\n\t}\n\treturn undefined;\n}","import { proxy } from 'valtio/vanilla';\nimport { get, set } from 'idb-keyval';\nimport { pack, unpack } from 'msgpackr';\nimport { StageBlueprint } from '../core/blueprints';\n\n// The State\nexport const stageState = proxy({\n previous: null as StageBlueprint | null,\n current: null as StageBlueprint | null,\n next: null as StageBlueprint | null,\n isLoading: false,\n});\n\n// The Logic\nexport const StageManager = {\n staticRegistry: new Map<string, StageBlueprint>(),\n\n registerStaticStage(id: string, blueprint: StageBlueprint) {\n this.staticRegistry.set(id, blueprint);\n },\n\n async loadStageData(stageId: string): Promise<StageBlueprint> {\n // 1. Check Local Storage (User Save)\n try {\n const saved = await get(stageId);\n if (saved) {\n // msgpackr returns a buffer, we need to unpack it\n return unpack(saved);\n }\n } catch (e) {\n console.warn(`Failed to load stage ${stageId} from storage`, e);\n }\n\n // 2. Fallback to Static File (Initial Load)\n if (this.staticRegistry.has(stageId)) {\n return this.staticRegistry.get(stageId)!;\n }\n\n // Note: This assumes a convention where stages are importable.\n // You might need a registry or a specific path structure.\n // For now, we'll assume a dynamic import from a known location or a registry.\n // Since dynamic imports with variables can be tricky in bundlers, \n // we might need a map of stage IDs to import functions if the path isn't static enough.\n \n // TODO: Implement a robust way to resolve stage paths.\n // For now, throwing an error if not found in storage, as the static loading strategy \n // depends on project structure.\n throw new Error(`Stage ${stageId} not found in storage and static loading not fully implemented.`);\n },\n\n async transitionForward(nextStageId: string, loadStaticStage?: (id: string) => Promise<StageBlueprint>) {\n if (stageState.isLoading) return;\n \n stageState.isLoading = true;\n\n try {\n // Save current state to disk before unloading\n if (stageState.current) {\n await set(stageState.current.id, pack(stageState.current));\n }\n\n // Shift Window\n stageState.previous = stageState.current;\n stageState.current = stageState.next;\n \n // If we don't have a next stage preloaded (or if we just shifted it to current),\n // we might need to load the *new* next stage. \n // But the architecture doc says \"Fetch new Next\".\n // Let's assume we want to load the requested nextStageId as the *new Current* \n // if it wasn't already in 'next'. \n // Actually, the sliding window usually implies we move towards 'next'.\n // If 'next' was already populated with nextStageId, we just move it to 'current'.\n \n if (stageState.current?.id !== nextStageId) {\n // If the shift didn't result in the desired stage (e.g. we jumped), load it directly.\n // Or if 'next' was null.\n if (loadStaticStage) {\n stageState.current = await loadStaticStage(nextStageId);\n } else {\n stageState.current = await this.loadStageData(nextStageId);\n }\n }\n\n // Ideally we would pre-fetch the stage *after* this one into 'next'.\n // But we don't know what comes after 'nextStageId' without a map.\n // For now, we leave 'next' null or let the game logic trigger a preload.\n stageState.next = null; \n \n } catch (error) {\n console.error(\"Failed to transition stage:\", error);\n } finally {\n stageState.isLoading = false;\n }\n },\n \n /**\n * Manually set the next stage to pre-load it.\n */\n async preloadNext(stageId: string, loadStaticStage?: (id: string) => Promise<StageBlueprint>) {\n if (loadStaticStage) {\n stageState.next = await loadStaticStage(stageId);\n } else {\n stageState.next = await this.loadStageData(stageId);\n }\n }\n};\n","import { StageBlueprint } from '../core/blueprints';\nimport { createStage, Stage } from './stage';\nimport { EntityFactory } from '../entities/entity-factory';\n\nexport const StageFactory = {\n async createFromBlueprint(blueprint: StageBlueprint): Promise<Stage> {\n // Create a new Stage instance\n // We might need to pass options from blueprint if StageSchema has them\n const stage = createStage({\n // Map blueprint properties to stage options if needed\n // e.g. name: blueprint.name\n });\n \n // Assign ID if possible, though Stage might generate its own UUID.\n // If we want to track it by blueprint ID, we might need to store it on the stage.\n // stage.id = blueprint.id; // Stage doesn't have public ID setter easily maybe?\n\n if (blueprint.entities) {\n for (const entityBlueprint of blueprint.entities) {\n try {\n const entity = await EntityFactory.createFromBlueprint(entityBlueprint);\n stage.add(entity);\n } catch (e) {\n console.error(`Failed to create entity ${entityBlueprint.id} for stage ${blueprint.id}`, e);\n }\n }\n }\n\n return stage;\n }\n};\n","import { Color, Group, Sprite as ThreeSprite, SpriteMaterial, CanvasTexture, LinearFilter, Vector2, PerspectiveCamera, OrthographicCamera, ClampToEdgeWrapping } from 'three';\nimport { BaseNode } from '../core/base-node';\nimport { GameEntityOptions, GameEntity } from './entity';\nimport { EntityBuilder } from './builder';\nimport { createEntity } from './create';\nimport { UpdateContext, SetupContext } from '../core/base-node-life-cycle';\nimport { ZylemCamera } from '../camera/zylem-camera';\nimport { DebugDelegate } from './delegates/debug';\n\ntype ZylemTextOptions = GameEntityOptions & {\n\ttext?: string;\n\tfontFamily?: string;\n\tfontSize?: number;\n\tfontColor?: Color | string;\n\tbackgroundColor?: Color | string | null;\n\tpadding?: number;\n\tstickToViewport?: boolean;\n\tscreenPosition?: Vector2;\n\tzDistance?: number;\n};\n\nconst textDefaults: ZylemTextOptions = {\n\tposition: undefined,\n\ttext: '',\n\tfontFamily: 'Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace',\n\tfontSize: 18,\n\tfontColor: '#FFFFFF',\n\tbackgroundColor: null,\n\tpadding: 4,\n\tstickToViewport: true,\n\tscreenPosition: new Vector2(24, 24),\n\tzDistance: 1,\n};\n\nexport class TextBuilder extends EntityBuilder<ZylemText, ZylemTextOptions> {\n\tprotected createEntity(options: Partial<ZylemTextOptions>): ZylemText {\n\t\treturn new ZylemText(options);\n\t}\n}\n\nexport const TEXT_TYPE = Symbol('Text');\n\nexport class ZylemText extends GameEntity<ZylemTextOptions> {\n\tstatic type = TEXT_TYPE;\n\n\tprivate _sprite: ThreeSprite | null = null;\n\tprivate _texture: CanvasTexture | null = null;\n\tprivate _canvas: HTMLCanvasElement | null = null;\n\tprivate _ctx: CanvasRenderingContext2D | null = null;\n\tprivate _cameraRef: ZylemCamera | null = null;\n\tprivate _lastCanvasW: number = 0;\n\tprivate _lastCanvasH: number = 0;\n\n\tconstructor(options?: ZylemTextOptions) {\n\t\tsuper();\n\t\tthis.options = { ...textDefaults, ...options } as ZylemTextOptions;\n\t\tthis.group = new Group();\n\t\tthis.createSprite();\n\t\tthis.lifeCycleDelegate = {\n\t\t\tsetup: [this.textSetup.bind(this) as any],\n\t\t\tupdate: [this.textUpdate.bind(this) as any],\n\t\t};\n\t}\n\n\tprivate createSprite() {\n\t\tthis._canvas = document.createElement('canvas');\n\t\tthis._ctx = this._canvas.getContext('2d');\n\t\tthis._texture = new CanvasTexture(this._canvas);\n\t\tthis._texture.minFilter = LinearFilter;\n\t\tthis._texture.magFilter = LinearFilter;\n\t\tconst material = new SpriteMaterial({\n\t\t\tmap: this._texture,\n\t\t\ttransparent: true,\n\t\t\tdepthTest: false,\n\t\t\tdepthWrite: false,\n\t\t\talphaTest: 0.5,\n\t\t});\n\t\tthis._sprite = new ThreeSprite(material);\n\t\tthis.group?.add(this._sprite);\n\t\tthis.redrawText(this.options.text ?? '');\n\t}\n\n\tprivate measureAndResizeCanvas(text: string, fontSize: number, fontFamily: string, padding: number) {\n\t\tif (!this._canvas || !this._ctx) return { sizeChanged: false };\n\t\tthis._ctx.font = `${fontSize}px ${fontFamily}`;\n\t\tconst metrics = this._ctx.measureText(text);\n\t\tconst textWidth = Math.ceil(metrics.width);\n\t\tconst textHeight = Math.ceil(fontSize * 1.4);\n\t\tconst nextW = Math.max(2, textWidth + padding * 2);\n\t\tconst nextH = Math.max(2, textHeight + padding * 2);\n\t\tconst sizeChanged = nextW !== this._lastCanvasW || nextH !== this._lastCanvasH;\n\t\tthis._canvas.width = nextW;\n\t\tthis._canvas.height = nextH;\n\t\tthis._lastCanvasW = nextW;\n\t\tthis._lastCanvasH = nextH;\n\t\treturn { sizeChanged };\n\t}\n\n\tprivate drawCenteredText(text: string, fontSize: number, fontFamily: string) {\n\t\tif (!this._canvas || !this._ctx) return;\n\t\tthis._ctx.font = `${fontSize}px ${fontFamily}`;\n\t\tthis._ctx.textAlign = 'center';\n\t\tthis._ctx.textBaseline = 'middle';\n\t\tthis._ctx.clearRect(0, 0, this._canvas.width, this._canvas.height);\n\t\tif (this.options.backgroundColor) {\n\t\t\tthis._ctx.fillStyle = this.toCssColor(this.options.backgroundColor);\n\t\t\tthis._ctx.fillRect(0, 0, this._canvas.width, this._canvas.height);\n\t\t}\n\t\tthis._ctx.fillStyle = this.toCssColor(this.options.fontColor ?? '#FFFFFF');\n\t\tthis._ctx.fillText(text, this._canvas.width / 2, this._canvas.height / 2);\n\t}\n\n\tprivate updateTexture(sizeChanged: boolean) {\n\t\tif (!this._texture || !this._canvas) return;\n\t\tif (sizeChanged) {\n\t\t\tthis._texture.dispose();\n\t\t\tthis._texture = new CanvasTexture(this._canvas);\n\t\t\tthis._texture.minFilter = LinearFilter;\n\t\t\tthis._texture.magFilter = LinearFilter;\n\t\t\tthis._texture.wrapS = ClampToEdgeWrapping;\n\t\t\tthis._texture.wrapT = ClampToEdgeWrapping;\n\t\t}\n\t\tthis._texture.image = this._canvas;\n\t\tthis._texture.needsUpdate = true;\n\t\tif (this._sprite && this._sprite.material) {\n\t\t\t(this._sprite.material as any).map = this._texture;\n\t\t\tthis._sprite.material.needsUpdate = true;\n\t\t}\n\t}\n\n\tprivate redrawText(_text: string) {\n\t\tif (!this._canvas || !this._ctx) return;\n\t\tconst fontSize = this.options.fontSize ?? 18;\n\t\tconst fontFamily = this.options.fontFamily ?? (textDefaults.fontFamily as string);\n\t\tconst padding = this.options.padding ?? 4;\n\n\t\tconst { sizeChanged } = this.measureAndResizeCanvas(_text, fontSize, fontFamily, padding);\n\t\tthis.drawCenteredText(_text, fontSize, fontFamily);\n\t\tthis.updateTexture(Boolean(sizeChanged));\n\n\t\tif (this.options.stickToViewport && this._cameraRef) {\n\t\t\tthis.updateStickyTransform();\n\t\t}\n\t}\n\n\tprivate toCssColor(color: Color | string): string {\n\t\tif (typeof color === 'string') return color;\n\t\tconst c = color instanceof Color ? color : new Color(color as any);\n\t\treturn `#${c.getHexString()}`;\n\t}\n\n\tprivate textSetup(params: SetupContext<ZylemTextOptions>) {\n\t\tthis._cameraRef = (params.camera as unknown) as ZylemCamera | null;\n\t\tif (this.options.stickToViewport && this._cameraRef) {\n\t\t\t(this._cameraRef.camera as any).add(this.group);\n\t\t\tthis.updateStickyTransform();\n\t\t}\n\t}\n\n\tprivate textUpdate(params: UpdateContext<ZylemTextOptions>) {\n\t\tif (!this._sprite) return;\n\t\tif (this.options.stickToViewport && this._cameraRef) {\n\t\t\tthis.updateStickyTransform();\n\t\t}\n\t}\n\n\tprivate getResolution() {\n\t\treturn {\n\t\t\twidth: this._cameraRef?.screenResolution.x ?? 1,\n\t\t\theight: this._cameraRef?.screenResolution.y ?? 1,\n\t\t};\n\t}\n\n\tprivate getScreenPixels(sp: Vector2, width: number, height: number) {\n\t\tconst isPercentX = sp.x >= 0 && sp.x <= 1;\n\t\tconst isPercentY = sp.y >= 0 && sp.y <= 1;\n\t\treturn {\n\t\t\tpx: isPercentX ? sp.x * width : sp.x,\n\t\t\tpy: isPercentY ? sp.y * height : sp.y,\n\t\t};\n\t}\n\n\tprivate computeWorldExtents(camera: PerspectiveCamera | OrthographicCamera, zDist: number) {\n\t\tlet worldHalfW = 1;\n\t\tlet worldHalfH = 1;\n\t\tif ((camera as PerspectiveCamera).isPerspectiveCamera) {\n\t\t\tconst pc = camera as PerspectiveCamera;\n\t\t\tconst halfH = Math.tan((pc.fov * Math.PI) / 180 / 2) * zDist;\n\t\t\tconst halfW = halfH * pc.aspect;\n\t\t\tworldHalfW = halfW;\n\t\t\tworldHalfH = halfH;\n\t\t} else if ((camera as OrthographicCamera).isOrthographicCamera) {\n\t\t\tconst oc = camera as OrthographicCamera;\n\t\t\tworldHalfW = (oc.right - oc.left) / 2;\n\t\t\tworldHalfH = (oc.top - oc.bottom) / 2;\n\t\t}\n\t\treturn { worldHalfW, worldHalfH };\n\t}\n\n\tprivate updateSpriteScale(worldHalfH: number, viewportHeight: number) {\n\t\tif (!this._canvas || !this._sprite) return;\n\t\tconst planeH = worldHalfH * 2;\n\t\tconst unitsPerPixel = planeH / viewportHeight;\n\t\tconst pixelH = this._canvas.height;\n\t\tconst scaleY = Math.max(0.0001, pixelH * unitsPerPixel);\n\t\tconst aspect = this._canvas.width / this._canvas.height;\n\t\tconst scaleX = scaleY * aspect;\n\t\tthis._sprite.scale.set(scaleX, scaleY, 1);\n\t}\n\n\tprivate updateStickyTransform() {\n\t\tif (!this._sprite || !this._cameraRef) return;\n\t\tconst camera = this._cameraRef.camera as PerspectiveCamera | OrthographicCamera;\n\t\tconst { width, height } = this.getResolution();\n\t\tconst sp = this.options.screenPosition ?? new Vector2(24, 24);\n\t\tconst { px, py } = this.getScreenPixels(sp, width, height);\n\t\tconst zDist = Math.max(0.001, this.options.zDistance ?? 1);\n\t\tconst { worldHalfW, worldHalfH } = this.computeWorldExtents(camera, zDist);\n\n\t\tconst ndcX = (px / width) * 2 - 1;\n\t\tconst ndcY = 1 - (py / height) * 2;\n\t\tconst localX = ndcX * worldHalfW;\n\t\tconst localY = ndcY * worldHalfH;\n\t\tthis.group?.position.set(localX, localY, -zDist);\n\t\tthis.updateSpriteScale(worldHalfH, height);\n\t}\n\n\tupdateText(_text: string) {\n\t\tthis.options.text = _text;\n\t\tthis.redrawText(_text);\n\t\tif (this.options.stickToViewport && this._cameraRef) {\n\t\t\tthis.updateStickyTransform();\n\t\t}\n\t}\n\n\tbuildInfo(): Record<string, any> {\n\t\tconst delegate = new DebugDelegate(this as any);\n\t\tconst baseInfo = delegate.buildDebugInfo();\n\n\t\treturn {\n\t\t\t...baseInfo,\n\t\t\ttype: String(ZylemText.type),\n\t\t\ttext: this.options.text ?? '',\n\t\t\tsticky: this.options.stickToViewport,\n\t\t};\n\t}\n}\n\ntype TextOptions = BaseNode | Partial<ZylemTextOptions>;\n\nexport async function text(...args: Array<TextOptions>): Promise<ZylemText> {\n\treturn createEntity<ZylemText, ZylemTextOptions>({\n\t\targs,\n\t\tdefaultConfig: { ...textDefaults },\n\t\tEntityClass: ZylemText,\n\t\tBuilderClass: TextBuilder,\n\t\tentityType: ZylemText.type,\n\t});\n}\n\n\n","import { GameEntity, GameEntityOptions } from '../entity';\nimport { MeshStandardMaterial, MeshBasicMaterial, MeshPhongMaterial } from 'three';\n\n/**\n * Interface for entities that provide custom debug information\n */\nexport interface DebugInfoProvider {\n\tgetDebugInfo(): Record<string, any>;\n}\n\n/**\n * Helper to check if an object implements DebugInfoProvider\n */\nfunction hasDebugInfo(obj: any): obj is DebugInfoProvider {\n\treturn obj && typeof obj.getDebugInfo === 'function';\n}\n\n/**\n * Debug delegate that provides debug information for entities\n */\nexport class DebugDelegate {\n\tprivate entity: GameEntity<any>;\n\n\tconstructor(entity: GameEntity<any>) {\n\t\tthis.entity = entity;\n\t}\n\n\t/**\n\t * Get formatted position string\n\t */\n\tprivate getPositionString(): string {\n\t\tif (this.entity.mesh) {\n\t\t\tconst { x, y, z } = this.entity.mesh.position;\n\t\t\treturn `${x.toFixed(2)}, ${y.toFixed(2)}, ${z.toFixed(2)}`;\n\t\t}\n\t\tconst { x, y, z } = this.entity.options.position || { x: 0, y: 0, z: 0 };\n\t\treturn `${x.toFixed(2)}, ${y.toFixed(2)}, ${z.toFixed(2)}`;\n\t}\n\n\t/**\n\t * Get formatted rotation string (in degrees)\n\t */\n\tprivate getRotationString(): string {\n\t\tif (this.entity.mesh) {\n\t\t\tconst { x, y, z } = this.entity.mesh.rotation;\n\t\t\tconst toDeg = (rad: number) => (rad * 180 / Math.PI).toFixed(1);\n\t\t\treturn `${toDeg(x)}°, ${toDeg(y)}°, ${toDeg(z)}°`;\n\t\t}\n\t\tconst { x, y, z } = this.entity.options.rotation || { x: 0, y: 0, z: 0 };\n\t\tconst toDeg = (rad: number) => (rad * 180 / Math.PI).toFixed(1);\n\t\treturn `${toDeg(x)}°, ${toDeg(y)}°, ${toDeg(z)}°`;\n\t}\n\n\t/**\n\t * Get material information\n\t */\n\tprivate getMaterialInfo(): Record<string, any> {\n\t\tif (!this.entity.mesh || !this.entity.mesh.material) {\n\t\t\treturn { type: 'none' };\n\t\t}\n\n\t\tconst material = Array.isArray(this.entity.mesh.material)\n\t\t\t? this.entity.mesh.material[0]\n\t\t\t: this.entity.mesh.material;\n\n\t\tconst info: Record<string, any> = {\n\t\t\ttype: material.type\n\t\t};\n\n\t\tif (material instanceof MeshStandardMaterial ||\n\t\t\tmaterial instanceof MeshBasicMaterial ||\n\t\t\tmaterial instanceof MeshPhongMaterial) {\n\t\t\tinfo.color = `#${material.color.getHexString()}`;\n\t\t\tinfo.opacity = material.opacity;\n\t\t\tinfo.transparent = material.transparent;\n\t\t}\n\n\t\tif ('roughness' in material) {\n\t\t\tinfo.roughness = material.roughness;\n\t\t}\n\n\t\tif ('metalness' in material) {\n\t\t\tinfo.metalness = material.metalness;\n\t\t}\n\n\t\treturn info;\n\t}\n\n\tprivate getPhysicsInfo(): Record<string, any> | null {\n\t\tif (!this.entity.body) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst info: Record<string, any> = {\n\t\t\ttype: this.entity.body.bodyType(),\n\t\t\tmass: this.entity.body.mass(),\n\t\t\tisEnabled: this.entity.body.isEnabled(),\n\t\t\tisSleeping: this.entity.body.isSleeping()\n\t\t};\n\n\t\tconst velocity = this.entity.body.linvel();\n\t\tinfo.velocity = `${velocity.x.toFixed(2)}, ${velocity.y.toFixed(2)}, ${velocity.z.toFixed(2)}`;\n\n\t\treturn info;\n\t}\n\n\tpublic buildDebugInfo(): Record<string, any> {\n\t\tconst defaultInfo: Record<string, any> = {\n\t\t\tname: this.entity.name || this.entity.uuid,\n\t\t\tuuid: this.entity.uuid,\n\t\t\tposition: this.getPositionString(),\n\t\t\trotation: this.getRotationString(),\n\t\t\tmaterial: this.getMaterialInfo()\n\t\t};\n\n\t\tconst physicsInfo = this.getPhysicsInfo();\n\t\tif (physicsInfo) {\n\t\t\tdefaultInfo.physics = physicsInfo;\n\t\t}\n\n\t\tif (this.entity.behaviors.length > 0) {\n\t\t\tdefaultInfo.behaviors = this.entity.behaviors.map(b => b.constructor.name);\n\t\t}\n\n\t\tif (hasDebugInfo(this.entity)) {\n\t\t\tconst customInfo = this.entity.getDebugInfo();\n\t\t\treturn { ...defaultInfo, ...customInfo };\n\t\t}\n\n\t\treturn defaultInfo;\n\t}\n}\n\nclass EnhancedDebugInfoBuilder {\n\tprivate customBuilder?: (options: GameEntityOptions) => Record<string, any>;\n\n\tconstructor(customBuilder?: (options: GameEntityOptions) => Record<string, any>) {\n\t\tthis.customBuilder = customBuilder;\n\t}\n\n\tbuildInfo(options: GameEntityOptions, entity?: GameEntity<any>): Record<string, any> {\n\t\tif (this.customBuilder) {\n\t\t\treturn this.customBuilder(options);\n\t\t}\n\n\t\tif (entity) {\n\t\t\tconst delegate = new DebugDelegate(entity);\n\t\t\treturn delegate.buildDebugInfo();\n\t\t}\n\n\t\tconst { x, y, z } = options.position || { x: 0, y: 0, z: 0 };\n\t\treturn {\n\t\t\tname: (options as any).name || 'unnamed',\n\t\t\tposition: `${x.toFixed(2)}, ${y.toFixed(2)}, ${z.toFixed(2)}`\n\t\t};\n\t}\n}\n","import { ColliderDesc } from '@dimforge/rapier3d-compat';\nimport { Color, Euler, Group, Quaternion, Vector3 } from 'three';\nimport {\n\tTextureLoader,\n\tSpriteMaterial,\n\tSprite as ThreeSprite,\n} from 'three';\nimport { BaseNode } from '../core/base-node';\nimport { GameEntityOptions, GameEntity } from './entity';\nimport { EntityBuilder } from './builder';\nimport { EntityCollisionBuilder } from './builder';\nimport { createEntity } from './create';\nimport { DestroyContext, DestroyFunction, UpdateContext, UpdateFunction } from '../core/base-node-life-cycle';\nimport { DebugDelegate } from './delegates/debug';\n\nexport type SpriteImage = { name: string; file: string };\nexport type SpriteAnimation = {\n\tname: string;\n\tframes: string[];\n\tspeed: number | number[];\n\tloop: boolean;\n};\n\ntype ZylemSpriteOptions = GameEntityOptions & {\n\timages?: SpriteImage[];\n\tanimations?: SpriteAnimation[];\n\tsize?: Vector3;\n\tcollisionSize?: Vector3;\n};\n\nconst spriteDefaults: ZylemSpriteOptions = {\n\tsize: new Vector3(1, 1, 1),\n\tposition: new Vector3(0, 0, 0),\n\tcollision: {\n\t\tstatic: false,\n\t},\n\tmaterial: {\n\t\tcolor: new Color('#ffffff'),\n\t\tshader: 'standard'\n\t},\n\timages: [],\n\tanimations: [],\n};\n\nexport class SpriteCollisionBuilder extends EntityCollisionBuilder {\n\tcollider(options: ZylemSpriteOptions): ColliderDesc {\n\t\tconst size = options.collisionSize || options.size || new Vector3(1, 1, 1);\n\t\tconst half = { x: size.x / 2, y: size.y / 2, z: size.z / 2 };\n\t\tlet colliderDesc = ColliderDesc.cuboid(half.x, half.y, half.z);\n\t\treturn colliderDesc;\n\t}\n}\n\nexport class SpriteBuilder extends EntityBuilder<ZylemSprite, ZylemSpriteOptions> {\n\tprotected createEntity(options: Partial<ZylemSpriteOptions>): ZylemSprite {\n\t\treturn new ZylemSprite(options);\n\t}\n}\n\nexport const SPRITE_TYPE = Symbol('Sprite');\n\nexport class ZylemSprite extends GameEntity<ZylemSpriteOptions> {\n\tstatic type = SPRITE_TYPE;\n\n\tprotected sprites: ThreeSprite[] = [];\n\tprotected spriteMap: Map<string, number> = new Map();\n\tprotected currentSpriteIndex: number = 0;\n\tprotected animations: Map<string, any> = new Map();\n\tprotected currentAnimation: any = null;\n\tprotected currentAnimationFrame: string = '';\n\tprotected currentAnimationIndex: number = 0;\n\tprotected currentAnimationTime: number = 0;\n\n\tconstructor(options?: ZylemSpriteOptions) {\n\t\tsuper();\n\t\tthis.options = { ...spriteDefaults, ...options };\n\t\tthis.createSpritesFromImages(options?.images || []);\n\t\tthis.createAnimations(options?.animations || []);\n\t\tthis.lifeCycleDelegate = {\n\t\t\tupdate: [this.spriteUpdate.bind(this) as UpdateFunction<ZylemSpriteOptions>],\n\t\t\tdestroy: [this.spriteDestroy.bind(this) as DestroyFunction<ZylemSpriteOptions>],\n\t\t};\n\t}\n\n\tprotected createSpritesFromImages(images: SpriteImage[]) {\n\t\tconst textureLoader = new TextureLoader();\n\t\timages.forEach((image, index) => {\n\t\t\tconst spriteMap = textureLoader.load(image.file);\n\t\t\tconst material = new SpriteMaterial({\n\t\t\t\tmap: spriteMap,\n\t\t\t\ttransparent: true,\n\t\t\t});\n\t\t\tconst _sprite = new ThreeSprite(material);\n\t\t\t_sprite.position.normalize();\n\t\t\tthis.sprites.push(_sprite);\n\t\t\tthis.spriteMap.set(image.name, index);\n\t\t});\n\t\tthis.group = new Group();\n\t\tthis.group.add(...this.sprites);\n\t}\n\n\tprotected createAnimations(animations: SpriteAnimation[]) {\n\t\tanimations.forEach(animation => {\n\t\t\tconst { name, frames, loop = false, speed = 1 } = animation;\n\t\t\tconst internalAnimation = {\n\t\t\t\tframes: frames.map((frame, index) => ({\n\t\t\t\t\tkey: frame,\n\t\t\t\t\tindex,\n\t\t\t\t\ttime: (typeof speed === 'number' ? speed : speed[index]) * (index + 1),\n\t\t\t\t\tduration: typeof speed === 'number' ? speed : speed[index]\n\t\t\t\t})),\n\t\t\t\tloop,\n\t\t\t};\n\t\t\tthis.animations.set(name, internalAnimation);\n\t\t});\n\t}\n\n\tsetSprite(key: string) {\n\t\tconst spriteIndex = this.spriteMap.get(key);\n\t\tconst useIndex = spriteIndex ?? 0;\n\t\tthis.currentSpriteIndex = useIndex;\n\t\tthis.sprites.forEach((_sprite, i) => {\n\t\t\t_sprite.visible = this.currentSpriteIndex === i;\n\t\t});\n\t}\n\n\tsetAnimation(name: string, delta: number) {\n\t\tconst animation = this.animations.get(name);\n\t\tif (!animation) return;\n\n\t\tconst { loop, frames } = animation;\n\t\tconst frame = frames[this.currentAnimationIndex];\n\n\t\tif (name === this.currentAnimation) {\n\t\t\tthis.currentAnimationFrame = frame.key;\n\t\t\tthis.currentAnimationTime += delta;\n\t\t\tthis.setSprite(this.currentAnimationFrame);\n\t\t} else {\n\t\t\tthis.currentAnimation = name;\n\t\t}\n\n\t\tif (this.currentAnimationTime > frame.time) {\n\t\t\tthis.currentAnimationIndex++;\n\t\t}\n\n\t\tif (this.currentAnimationIndex >= frames.length) {\n\t\t\tif (loop) {\n\t\t\t\tthis.currentAnimationIndex = 0;\n\t\t\t\tthis.currentAnimationTime = 0;\n\t\t\t} else {\n\t\t\t\tthis.currentAnimationTime = frames[this.currentAnimationIndex].time;\n\t\t\t}\n\t\t}\n\t}\n\n\tasync spriteUpdate(params: UpdateContext<ZylemSpriteOptions>): Promise<void> {\n\t\tthis.sprites.forEach(_sprite => {\n\t\t\tif (_sprite.material) {\n\t\t\t\tconst q = this.body?.rotation();\n\t\t\t\tif (q) {\n\t\t\t\t\tconst quat = new Quaternion(q.x, q.y, q.z, q.w);\n\t\t\t\t\tconst euler = new Euler().setFromQuaternion(quat, 'XYZ');\n\t\t\t\t\t_sprite.material.rotation = euler.z;\n\t\t\t\t}\n\t\t\t\t_sprite.scale.set(this.options.size?.x ?? 1, this.options.size?.y ?? 1, this.options.size?.z ?? 1);\n\t\t\t}\n\t\t});\n\t}\n\n\tasync spriteDestroy(params: DestroyContext<ZylemSpriteOptions>): Promise<void> {\n\t\tthis.sprites.forEach(_sprite => {\n\t\t\t_sprite.removeFromParent();\n\t\t});\n\t\tthis.group?.remove(...this.sprites);\n\t\tthis.group?.removeFromParent();\n\t}\n\n\tbuildInfo(): Record<string, any> {\n\t\tconst delegate = new DebugDelegate(this as any);\n\t\tconst baseInfo = delegate.buildDebugInfo();\n\t\treturn {\n\t\t\t...baseInfo,\n\t\t\ttype: String(ZylemSprite.type),\n\t\t};\n\t}\n}\n\ntype SpriteOptions = BaseNode | Partial<ZylemSpriteOptions>;\n\nexport async function sprite(...args: Array<SpriteOptions>): Promise<ZylemSprite> {\n\treturn createEntity<ZylemSprite, ZylemSpriteOptions>({\n\t\targs,\n\t\tdefaultConfig: spriteDefaults,\n\t\tEntityClass: ZylemSprite,\n\t\tBuilderClass: SpriteBuilder,\n\t\tCollisionBuilderClass: SpriteCollisionBuilder,\n\t\tentityType: ZylemSprite.type\n\t});\n}","import { EntityBlueprint } from '../core/blueprints';\nimport { GameEntity, GameEntityOptions } from './entity';\nimport { text } from './text';\nimport { sprite } from './sprite';\n\ntype EntityCreator = (options: any) => Promise<GameEntity<any>>;\n\nexport const EntityFactory = {\n registry: new Map<string, EntityCreator>(),\n\n register(type: string, creator: EntityCreator) {\n this.registry.set(type, creator);\n },\n\n async createFromBlueprint(blueprint: EntityBlueprint): Promise<GameEntity<any>> {\n const creator = this.registry.get(blueprint.type);\n if (!creator) {\n throw new Error(`Unknown entity type: ${blueprint.type}`);\n }\n\n const options: GameEntityOptions = {\n ...blueprint.data,\n position: blueprint.position ? { x: blueprint.position[0], y: blueprint.position[1], z: 0 } : undefined,\n name: blueprint.id,\n };\n\n const entity = await creator(options);\n \n return entity;\n }\n};\n\nEntityFactory.register('text', async (opts) => await text(opts) as unknown as GameEntity<any>);\nEntityFactory.register('sprite', async (opts) => await sprite(opts) as unknown as GameEntity<any>);\n","import { BaseNode } from './base-node';\nimport {\n\tSetupContext,\n\tUpdateContext,\n\tDestroyContext,\n\tLoadedContext,\n\tCleanupContext,\n} from './base-node-life-cycle';\n\nconst VESSEL_TYPE = Symbol('vessel');\n\nexport class Vessel extends BaseNode<{}, Vessel> {\n\tstatic type = VESSEL_TYPE;\n\n\tprotected _setup(_params: SetupContext<this>): void { }\n\n\tprotected async _loaded(_params: LoadedContext<this>): Promise<void> { }\n\n\tprotected _update(_params: UpdateContext<this>): void { }\n\n\tprotected _destroy(_params: DestroyContext<this>): void { }\n\n\tprotected async _cleanup(_params: CleanupContext<this>): Promise<void> { }\n\n\tpublic create(): this {\n\t\treturn this;\n\t}\n}\n\nexport function vessel(...args: Array<BaseNode>): BaseNode<{}, Vessel> {\n\tconst instance = new Vessel();\n\targs.forEach(arg => instance.add(arg));\n\treturn instance as unknown as BaseNode<{}, Vessel>;\n}\n","import { UpdateContext } from \"../core/base-node-life-cycle\";\n\n/**\n * Listen for a single global key change inside an onUpdate pipeline.\n * Usage: onUpdate(globalChange('p1Score', (value) => { ... }))\n */\nexport function globalChange<T = any>(\n\tkey: string,\n\tcallback: (value: T, ctx: UpdateContext<any>) => void\n) {\n\tlet previousValue: T | undefined = undefined;\n\treturn (ctx: UpdateContext<any>) => {\n\t\tconst currentValue = ctx.globals?.[key] as T;\n\t\tif (previousValue !== currentValue) {\n\t\t\t// Ignore the very first undefined->value transition only if both are undefined\n\t\t\tif (!(previousValue === undefined && currentValue === undefined)) {\n\t\t\t\tcallback(currentValue, ctx);\n\t\t\t}\n\t\t\tpreviousValue = currentValue;\n\t\t}\n\t};\n}\n\n/**\n * Listen for multiple global key changes inside an onUpdate pipeline.\n * Calls back when any of the provided keys changes.\n * Usage: onUpdate(globalChanges(['p1Score','p2Score'], ([p1,p2]) => { ... }))\n */\nexport function globalChanges<T = any>(\n\tkeys: string[],\n\tcallback: (values: T[], ctx: UpdateContext<any>) => void\n) {\n\tlet previousValues: (T | undefined)[] = new Array(keys.length).fill(undefined);\n\treturn (ctx: UpdateContext<any>) => {\n\t\tconst currentValues = keys.map((k) => ctx.globals?.[k] as T);\n\t\tconst hasAnyChange = currentValues.some((val, idx) => previousValues[idx] !== val);\n\t\tif (hasAnyChange) {\n\t\t\t// Ignore initial all-undefined state\n\t\t\tconst allPrevUndef = previousValues.every((v) => v === undefined);\n\t\t\tconst allCurrUndef = currentValues.every((v) => v === undefined);\n\t\t\tif (!(allPrevUndef && allCurrUndef)) {\n\t\t\t\tcallback(currentValues as T[], ctx);\n\t\t\t}\n\t\t\tpreviousValues = currentValues;\n\t\t}\n\t};\n}\n\n\n/**\n * Listen for a single stage variable change inside an onUpdate pipeline.\n * Usage: onUpdate(variableChange('score', (value, ctx) => { ... }))\n */\nexport function variableChange<T = any>(\n\tkey: string,\n\tcallback: (value: T, ctx: UpdateContext<any>) => void\n) {\n\tlet previousValue: T | undefined = undefined;\n\treturn (ctx: UpdateContext<any>) => {\n\t\t// @ts-ignore - stage is optional on UpdateContext\n\t\tconst currentValue = (ctx.stage?.getVariable?.(key) ?? undefined) as T;\n\t\tif (previousValue !== currentValue) {\n\t\t\tif (!(previousValue === undefined && currentValue === undefined)) {\n\t\t\t\tcallback(currentValue, ctx);\n\t\t\t}\n\t\t\tpreviousValue = currentValue;\n\t\t}\n\t};\n}\n\n/**\n * Listen for multiple stage variable changes; fires when any changes.\n * Usage: onUpdate(variableChanges(['a','b'], ([a,b], ctx) => { ... }))\n */\nexport function variableChanges<T = any>(\n\tkeys: string[],\n\tcallback: (values: T[], ctx: UpdateContext<any>) => void\n) {\n\tlet previousValues: (T | undefined)[] = new Array(keys.length).fill(undefined);\n\treturn (ctx: UpdateContext<any>) => {\n\t\t// @ts-ignore - stage is optional on UpdateContext\n\t\tconst reader = (k: string) => ctx.stage?.getVariable?.(k) as T;\n\t\tconst currentValues = keys.map(reader);\n\t\tconst hasAnyChange = currentValues.some((val, idx) => previousValues[idx] !== val);\n\t\tif (hasAnyChange) {\n\t\t\tconst allPrevUndef = previousValues.every((v) => v === undefined);\n\t\t\tconst allCurrUndef = currentValues.every((v) => v === undefined);\n\t\t\tif (!(allPrevUndef && allCurrUndef)) {\n\t\t\t\tcallback(currentValues as T[], ctx);\n\t\t\t}\n\t\t\tpreviousValues = currentValues;\n\t\t}\n\t};\n}\n\n\n"],"mappings":"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","names":["proxy","debug_default","init_debug","init_debug","debug_default","Color","ShaderMaterial","Vector3","Mesh","Color","ActiveCollisionTypes","ColliderDesc","Group","Vector3","Color","Vector3","TextureLoader","state","position","Color","Vector3","proxy","subscribe","Color","Vector3","Vector3","standard_default","init_standard","init_standard","standard_default","Vector3","Object3D","WebGLRenderer","state","position","Vector2","Vector3","Color","Group","Mesh","Vector3","BufferGeometry","LineBasicMaterial","LineSegments","Vector2","hoveredUuid","Color","Vector3","Vector2","nanoid","state","proxy","Vector3","proxy","initialDefaults","state","document","text","getGameDefaultConfig","proxy","stageState","Color","Group","Vector2","MeshStandardMaterial","MeshBasicMaterial","MeshPhongMaterial","x","y","z","toDeg","Vector2","Group","text","Color","ColliderDesc","Color","Group","Quaternion","Vector3","TextureLoader","SpriteMaterial","ThreeSprite","Vector3","Color","ColliderDesc","TextureLoader","SpriteMaterial","ThreeSprite","Group","Quaternion","stageState"]}
|