murow 0.0.70 → 0.0.72
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 +54 -37
- package/dist/cjs/core/binary-codec/binary-codec.js +1 -0
- package/dist/cjs/core/binary-codec/index.js +1 -0
- package/dist/cjs/core/driver/driver.js +1 -0
- package/dist/cjs/core/driver/drivers/immediate.js +1 -0
- package/dist/cjs/core/driver/drivers/index.js +1 -0
- package/dist/cjs/core/driver/drivers/raf.js +1 -0
- package/dist/cjs/core/driver/drivers/timeout.js +1 -0
- package/dist/cjs/core/driver/index.js +1 -0
- package/dist/cjs/core/events/event-system.js +1 -0
- package/dist/cjs/core/events/index.js +1 -0
- package/dist/cjs/core/fixed-ticker/fixed-ticker.js +1 -0
- package/dist/cjs/core/fixed-ticker/index.js +1 -0
- package/dist/cjs/core/free-list/free-list.js +1 -0
- package/dist/cjs/core/free-list/index.js +1 -0
- package/dist/cjs/core/generate-id/generate-id.js +1 -0
- package/dist/cjs/core/generate-id/index.js +1 -0
- package/dist/cjs/core/index.js +1 -0
- package/dist/cjs/core/input/index.js +1 -0
- package/dist/cjs/core/input/manager.js +1 -0
- package/dist/cjs/core/input/sources/browser.js +1 -0
- package/dist/cjs/core/input/sources/index.js +1 -0
- package/dist/cjs/core/input/types.js +1 -0
- package/dist/cjs/core/lerp/index.js +1 -0
- package/dist/cjs/core/lerp/lerp.js +1 -0
- package/dist/cjs/core/navmesh/index.js +1 -0
- package/dist/cjs/core/navmesh/navmesh-worker-pool.js +1 -0
- package/dist/cjs/core/navmesh/navmesh.js +1 -0
- package/dist/cjs/core/navmesh/navmesh.worker.js +1 -0
- package/dist/cjs/core/pooled-codec/index.js +1 -0
- package/dist/cjs/core/pooled-codec/pooled-codec.js +1 -0
- package/dist/cjs/core/prediction/index.js +1 -0
- package/dist/cjs/core/prediction/prediction.js +1 -0
- package/dist/cjs/core/ray/index.js +1 -0
- package/dist/cjs/core/ray/ray-2d.js +1 -0
- package/dist/cjs/core/ray/ray-3d.js +1 -0
- package/dist/cjs/core/simple-rng/index.js +1 -0
- package/dist/cjs/core/simple-rng/simple-rng.js +1 -0
- package/dist/cjs/core/sparse-batcher/index.js +1 -0
- package/dist/cjs/core/sparse-batcher/sparse-batcher.js +1 -0
- package/dist/cjs/ecs/component-store.js +1 -0
- package/dist/cjs/ecs/component.js +1 -0
- package/dist/cjs/ecs/entity-handle.js +1 -0
- package/dist/cjs/ecs/index.js +1 -0
- package/dist/cjs/ecs/system-builder.js +1 -0
- package/dist/cjs/ecs/world-systems.js +1 -0
- package/dist/cjs/ecs/world.js +1 -0
- package/dist/cjs/game/index.js +1 -0
- package/dist/cjs/game/loop/index.js +1 -0
- package/dist/cjs/game/loop/loop.js +1 -0
- package/dist/cjs/index.js +1 -0
- package/dist/cjs/net/adapters/browser-websocket.js +1 -0
- package/dist/cjs/net/adapters/bun-websocket.js +1 -0
- package/dist/cjs/net/buffer-pool.js +1 -0
- package/dist/cjs/net/client.js +1 -0
- package/dist/cjs/net/index.js +1 -0
- package/dist/cjs/net/server.js +1 -0
- package/dist/cjs/net/types.js +1 -0
- package/dist/cjs/net/validators.js +1 -0
- package/dist/cjs/protocol/index.js +1 -0
- package/dist/cjs/protocol/intent/define-intent.js +1 -0
- package/dist/cjs/protocol/intent/index.js +1 -0
- package/dist/cjs/protocol/intent/intent-registry.js +1 -0
- package/dist/cjs/protocol/intent/intent.js +1 -0
- package/dist/cjs/protocol/rpc/define-rpc.js +1 -0
- package/dist/cjs/protocol/rpc/index.js +1 -0
- package/dist/cjs/protocol/rpc/rpc-registry.js +1 -0
- package/dist/cjs/protocol/rpc/rpc.js +1 -0
- package/dist/cjs/protocol/snapshot/index.js +1 -0
- package/dist/cjs/protocol/snapshot/snapshot-codec.js +1 -0
- package/dist/cjs/protocol/snapshot/snapshot-registry.js +1 -0
- package/dist/cjs/protocol/snapshot/snapshot.js +1 -0
- package/dist/cjs/renderer/base/renderer-2d.js +1 -0
- package/dist/cjs/renderer/base/renderer-3d.js +1 -0
- package/dist/cjs/renderer/base/renderer.js +1 -0
- package/dist/cjs/renderer/gltf/helpers.js +1 -0
- package/dist/cjs/renderer/gltf/parser.js +1 -0
- package/dist/cjs/renderer/gltf/skeletal-animation.js +1 -0
- package/dist/cjs/renderer/gltf/skin-parser.js +1 -0
- package/dist/cjs/renderer/index.js +1 -0
- package/dist/cjs/renderer/math.js +1 -0
- package/dist/cjs/renderer/prefab-bucket/concrete.js +1 -0
- package/dist/cjs/renderer/prefab-bucket/index.js +1 -0
- package/dist/cjs/renderer/prefab-bucket/parsers.js +1 -0
- package/dist/cjs/renderer/prefab-bucket/specs.js +1 -0
- package/dist/cjs/renderer/spritesheet/helpers.js +1 -0
- package/dist/cjs/renderer/spritesheet/parser.js +1 -0
- package/dist/cjs/renderer/types.js +1 -0
- package/dist/esm/core/binary-codec/binary-codec.js +1 -0
- package/dist/esm/core/binary-codec/index.js +1 -0
- package/dist/esm/core/driver/driver.js +1 -0
- package/dist/esm/core/driver/drivers/immediate.js +1 -0
- package/dist/esm/core/driver/drivers/index.js +1 -0
- package/dist/esm/core/driver/drivers/raf.js +1 -0
- package/dist/esm/core/driver/drivers/timeout.js +1 -0
- package/dist/esm/core/driver/index.js +1 -0
- package/dist/esm/core/events/event-system.js +1 -0
- package/dist/esm/core/events/index.js +1 -0
- package/dist/esm/core/fixed-ticker/fixed-ticker.js +1 -0
- package/dist/esm/core/fixed-ticker/index.js +1 -0
- package/dist/esm/core/free-list/free-list.js +1 -0
- package/dist/esm/core/free-list/index.js +1 -0
- package/dist/esm/core/generate-id/generate-id.js +1 -0
- package/dist/esm/core/generate-id/index.js +1 -0
- package/dist/esm/core/index.js +1 -0
- package/dist/esm/core/input/index.js +1 -0
- package/dist/esm/core/input/manager.js +1 -0
- package/dist/esm/core/input/sources/browser.js +1 -0
- package/dist/esm/core/input/sources/index.js +1 -0
- package/dist/esm/core/input/types.js +0 -0
- package/dist/esm/core/lerp/index.js +1 -0
- package/dist/esm/core/lerp/lerp.js +1 -0
- package/dist/esm/core/navmesh/index.js +1 -0
- package/dist/esm/core/navmesh/navmesh-worker-pool.js +1 -0
- package/dist/esm/core/navmesh/navmesh.js +1 -0
- package/dist/esm/core/navmesh/navmesh.worker.js +1 -0
- package/dist/esm/core/pooled-codec/index.js +1 -0
- package/dist/esm/core/pooled-codec/pooled-codec.js +1 -0
- package/dist/esm/core/prediction/index.js +1 -0
- package/dist/esm/core/prediction/prediction.js +1 -0
- package/dist/esm/core/ray/index.js +1 -0
- package/dist/esm/core/ray/ray-2d.js +1 -0
- package/dist/esm/core/ray/ray-3d.js +1 -0
- package/dist/esm/core/simple-rng/index.js +1 -0
- package/dist/esm/core/simple-rng/simple-rng.js +1 -0
- package/dist/esm/core/sparse-batcher/index.js +1 -0
- package/dist/esm/core/sparse-batcher/sparse-batcher.js +1 -0
- package/dist/esm/ecs/component-store.js +1 -0
- package/dist/esm/ecs/component.js +1 -0
- package/dist/esm/ecs/entity-handle.js +1 -0
- package/dist/esm/ecs/index.js +1 -0
- package/dist/esm/ecs/system-builder.js +1 -0
- package/dist/esm/ecs/world-systems.js +1 -0
- package/dist/esm/ecs/world.js +1 -0
- package/dist/esm/game/index.js +1 -0
- package/dist/esm/game/loop/index.js +1 -0
- package/dist/esm/game/loop/loop.js +1 -0
- package/dist/esm/index.js +1 -0
- package/dist/esm/net/adapters/browser-websocket.js +1 -0
- package/dist/esm/net/adapters/bun-websocket.js +1 -0
- package/dist/esm/net/buffer-pool.js +1 -0
- package/dist/esm/net/client.js +1 -0
- package/dist/esm/net/index.js +1 -0
- package/dist/esm/net/server.js +1 -0
- package/dist/esm/net/types.js +1 -0
- package/dist/esm/net/validators.js +1 -0
- package/dist/esm/protocol/index.js +1 -0
- package/dist/esm/protocol/intent/define-intent.js +1 -0
- package/dist/esm/protocol/intent/index.js +1 -0
- package/dist/esm/protocol/intent/intent-registry.js +1 -0
- package/dist/esm/protocol/intent/intent.js +0 -0
- package/dist/esm/protocol/rpc/define-rpc.js +1 -0
- package/dist/esm/protocol/rpc/index.js +1 -0
- package/dist/esm/protocol/rpc/rpc-registry.js +1 -0
- package/dist/esm/protocol/rpc/rpc.js +0 -0
- package/dist/esm/protocol/snapshot/index.js +1 -0
- package/dist/esm/protocol/snapshot/snapshot-codec.js +1 -0
- package/dist/esm/protocol/snapshot/snapshot-registry.js +1 -0
- package/dist/esm/protocol/snapshot/snapshot.js +1 -0
- package/dist/esm/renderer/base/renderer-2d.js +1 -0
- package/dist/esm/renderer/base/renderer-3d.js +1 -0
- package/dist/esm/renderer/base/renderer.js +1 -0
- package/dist/esm/renderer/gltf/helpers.js +1 -0
- package/dist/esm/renderer/gltf/parser.js +1 -0
- package/dist/esm/renderer/gltf/skeletal-animation.js +1 -0
- package/dist/esm/renderer/gltf/skin-parser.js +1 -0
- package/dist/esm/renderer/index.js +1 -0
- package/dist/esm/renderer/math.js +1 -0
- package/dist/esm/renderer/prefab-bucket/concrete.js +1 -0
- package/dist/esm/renderer/prefab-bucket/index.js +1 -0
- package/dist/esm/renderer/prefab-bucket/parsers.js +1 -0
- package/dist/esm/renderer/prefab-bucket/specs.js +0 -0
- package/dist/esm/renderer/spritesheet/helpers.js +1 -0
- package/dist/esm/renderer/spritesheet/parser.js +1 -0
- package/dist/esm/renderer/types.js +0 -0
- package/dist/{core → types/core}/binary-codec/binary-codec.d.ts +4 -0
- package/dist/{core → types/core}/events/event-system.d.ts +14 -33
- package/dist/types/core/free-list/free-list.d.ts +31 -0
- package/dist/types/core/free-list/index.d.ts +1 -0
- package/dist/{core → types/core}/index.d.ts +5 -0
- package/dist/{core → types/core}/input/index.d.ts +1 -0
- package/dist/{core → types/core}/input/manager.d.ts +2 -0
- package/dist/{core → types/core}/navmesh/navmesh.d.ts +1 -21
- package/dist/types/core/ray/index.d.ts +2 -0
- package/dist/types/core/ray/ray-2d.d.ts +37 -0
- package/dist/types/core/ray/ray-3d.d.ts +42 -0
- package/dist/types/core/simple-rng/index.d.ts +1 -0
- package/dist/types/core/simple-rng/simple-rng.d.ts +36 -0
- package/dist/types/core/sparse-batcher/index.d.ts +1 -0
- package/dist/types/core/sparse-batcher/sparse-batcher.d.ts +55 -0
- package/dist/{ecs → types/ecs}/world.d.ts +11 -0
- package/dist/{game → types/game}/loop/loop.d.ts +33 -29
- package/dist/{index.d.ts → types/index.d.ts} +1 -0
- package/dist/{net → types/net}/index.d.ts +2 -2
- package/dist/types/renderer/base/renderer-2d.d.ts +13 -0
- package/dist/types/renderer/base/renderer-3d.d.ts +10 -0
- package/dist/types/renderer/base/renderer.d.ts +21 -0
- package/dist/types/renderer/gltf/helpers.d.ts +43 -0
- package/dist/types/renderer/gltf/parser.d.ts +49 -0
- package/dist/types/renderer/gltf/skeletal-animation.d.ts +96 -0
- package/dist/types/renderer/gltf/skin-parser.d.ts +107 -0
- package/dist/types/renderer/index.d.ts +15 -0
- package/dist/types/renderer/math.d.ts +37 -0
- package/dist/types/renderer/prefab-bucket/concrete.d.ts +55 -0
- package/dist/types/renderer/prefab-bucket/index.d.ts +113 -0
- package/dist/types/renderer/prefab-bucket/parsers.d.ts +8 -0
- package/dist/types/renderer/prefab-bucket/specs.d.ts +166 -0
- package/dist/types/renderer/spritesheet/helpers.d.ts +38 -0
- package/dist/types/renderer/spritesheet/parser.d.ts +21 -0
- package/dist/types/renderer/types.d.ts +89 -0
- package/dist/webgpu/cjs/index.js +5401 -0
- package/dist/webgpu/esm/index.js +5378 -0
- package/dist/webgpu/types/2d/animation.d.ts +97 -0
- package/dist/webgpu/types/2d/renderer.d.ts +86 -0
- package/dist/webgpu/types/2d/shader.d.ts +61 -0
- package/dist/webgpu/types/2d/sprite-accessor.d.ts +47 -0
- package/dist/webgpu/types/3d/clip-resync-coordinator.d.ts +20 -0
- package/dist/webgpu/types/3d/morph-animation.d.ts +69 -0
- package/dist/webgpu/types/3d/morph-animation.test.d.ts +1 -0
- package/dist/webgpu/types/3d/renderer.d.ts +266 -0
- package/dist/webgpu/types/3d/shader.d.ts +136 -0
- package/dist/webgpu/types/3d/skeletal-animation-compute/index.d.ts +2 -0
- package/dist/webgpu/types/3d/skeletal-animation-compute/kernel.d.ts +25 -0
- package/dist/webgpu/types/3d/skeletal-animation-compute/packer.d.ts +32 -0
- package/dist/webgpu/types/camera/camera-2d.d.ts +53 -0
- package/dist/webgpu/types/camera/camera-2d.test.d.ts +1 -0
- package/dist/webgpu/types/camera/camera-3d.d.ts +81 -0
- package/dist/webgpu/types/camera/camera-3d.test.d.ts +1 -0
- package/dist/webgpu/types/camera/index.d.ts +2 -0
- package/dist/webgpu/types/compute/compute-builder.d.ts +123 -0
- package/dist/webgpu/types/compute/compute-builder.test.d.ts +1 -0
- package/dist/webgpu/types/core/constants.d.ts +59 -0
- package/dist/webgpu/types/core/constants.test.d.ts +1 -0
- package/dist/webgpu/types/core/index.d.ts +2 -0
- package/dist/webgpu/types/core/types.d.ts +125 -0
- package/dist/webgpu/types/core/types.test.d.ts +1 -0
- package/dist/webgpu/types/geometry/built-in.d.ts +58 -0
- package/dist/webgpu/types/geometry/built-in.test.d.ts +1 -0
- package/dist/webgpu/types/geometry/geometry-builder.d.ts +281 -0
- package/dist/webgpu/types/geometry/geometry-builder.test.d.ts +1 -0
- package/dist/webgpu/types/geometry/index.d.ts +2 -0
- package/dist/webgpu/types/index.d.ts +35 -0
- package/dist/webgpu/types/particle/emitter.d.ts +36 -0
- package/dist/webgpu/types/shaders/index.d.ts +2 -0
- package/dist/webgpu/types/shaders/runtime-transpile.d.ts +18 -0
- package/dist/webgpu/types/shaders/sprite-2d.wgsl.d.ts +10 -0
- package/dist/webgpu/types/shaders/typegpu.d.ts +9 -0
- package/dist/webgpu/types/shaders/utils.d.ts +28 -0
- package/dist/webgpu/types/shaders/utils.test.d.ts +1 -0
- package/dist/webgpu/types/spritesheet/index.d.ts +1 -0
- package/dist/webgpu/types/spritesheet/spritesheet.d.ts +28 -0
- package/dist/webgpu/types/spritesheet/spritesheet.test.d.ts +1 -0
- package/package.json +96 -26
- package/dist/core/binary-codec/binary-codec.js +0 -354
- package/dist/core/binary-codec/index.js +0 -1
- package/dist/core/driver/driver.js +0 -47
- package/dist/core/driver/drivers/immediate.js +0 -61
- package/dist/core/driver/drivers/index.js +0 -3
- package/dist/core/driver/drivers/raf.js +0 -62
- package/dist/core/driver/drivers/timeout.js +0 -71
- package/dist/core/driver/index.js +0 -2
- package/dist/core/events/event-system.js +0 -88
- package/dist/core/events/index.js +0 -1
- package/dist/core/fixed-ticker/fixed-ticker.js +0 -105
- package/dist/core/fixed-ticker/index.js +0 -1
- package/dist/core/generate-id/generate-id.js +0 -25
- package/dist/core/generate-id/index.js +0 -1
- package/dist/core/index.js +0 -10
- package/dist/core/input/index.js +0 -2
- package/dist/core/input/manager.js +0 -211
- package/dist/core/input/sources/browser.js +0 -29
- package/dist/core/input/sources/index.js +0 -1
- package/dist/core/lerp/index.js +0 -1
- package/dist/core/lerp/lerp.js +0 -42
- package/dist/core/navmesh/index.js +0 -1
- package/dist/core/navmesh/navmesh-worker-pool.js +0 -180
- package/dist/core/navmesh/navmesh.js +0 -799
- package/dist/core/navmesh/navmesh.worker.js +0 -79
- package/dist/core/pooled-codec/index.js +0 -1
- package/dist/core/pooled-codec/pooled-codec.js +0 -410
- package/dist/core/prediction/index.js +0 -1
- package/dist/core/prediction/prediction.js +0 -99
- package/dist/core.esm.js +0 -1
- package/dist/core.js +0 -1
- package/dist/ecs/component-store.js +0 -175
- package/dist/ecs/component.js +0 -43
- package/dist/ecs/entity-handle.js +0 -515
- package/dist/ecs/example.js +0 -125
- package/dist/ecs/index.js +0 -4
- package/dist/ecs/system-builder.js +0 -249
- package/dist/ecs/world-systems.js +0 -79
- package/dist/ecs/world.js +0 -767
- package/dist/game/index.js +0 -1
- package/dist/game/loop/index.js +0 -1
- package/dist/game/loop/loop.js +0 -108
- package/dist/index.js +0 -26
- package/dist/net/adapters/browser-websocket.js +0 -74
- package/dist/net/adapters/bun-websocket.js +0 -245
- package/dist/net/buffer-pool.js +0 -89
- package/dist/net/client.js +0 -586
- package/dist/net/index.js +0 -58
- package/dist/net/server.js +0 -974
- package/dist/net/types.js +0 -31
- package/dist/net/validators.js +0 -88
- package/dist/protocol/index.js +0 -92
- package/dist/protocol/intent/define-intent.js +0 -125
- package/dist/protocol/intent/index.js +0 -91
- package/dist/protocol/intent/intent-registry.js +0 -91
- package/dist/protocol/rpc/define-rpc.js +0 -84
- package/dist/protocol/rpc/index.js +0 -3
- package/dist/protocol/rpc/rpc-registry.js +0 -159
- package/dist/protocol/rpc/rpc.js +0 -12
- package/dist/protocol/snapshot/index.js +0 -43
- package/dist/protocol/snapshot/snapshot-codec.js +0 -67
- package/dist/protocol/snapshot/snapshot-registry.js +0 -168
- package/dist/protocol/snapshot/snapshot.js +0 -30
- package/src/core/binary-codec/README.md +0 -60
- package/src/core/binary-codec/binary-codec.test.ts +0 -300
- package/src/core/binary-codec/binary-codec.ts +0 -448
- package/src/core/binary-codec/index.ts +0 -1
- package/src/core/driver/README.md +0 -97
- package/src/core/driver/driver.test.ts +0 -414
- package/src/core/driver/driver.ts +0 -71
- package/src/core/driver/drivers/immediate.ts +0 -66
- package/src/core/driver/drivers/index.ts +0 -3
- package/src/core/driver/drivers/raf.ts +0 -67
- package/src/core/driver/drivers/timeout.ts +0 -77
- package/src/core/driver/index.ts +0 -2
- package/src/core/events/README.md +0 -47
- package/src/core/events/event-system.test.ts +0 -243
- package/src/core/events/event-system.ts +0 -140
- package/src/core/events/index.ts +0 -1
- package/src/core/fixed-ticker/README.md +0 -77
- package/src/core/fixed-ticker/fixed-ticker.test.ts +0 -151
- package/src/core/fixed-ticker/fixed-ticker.ts +0 -174
- package/src/core/fixed-ticker/index.ts +0 -1
- package/src/core/generate-id/README.md +0 -18
- package/src/core/generate-id/generate-id.test.ts +0 -79
- package/src/core/generate-id/generate-id.ts +0 -37
- package/src/core/generate-id/index.ts +0 -1
- package/src/core/index.ts +0 -10
- package/src/core/input/README.md +0 -24
- package/src/core/input/index.ts +0 -2
- package/src/core/input/manager.ts +0 -259
- package/src/core/input/sources/browser.ts +0 -39
- package/src/core/input/sources/index.ts +0 -1
- package/src/core/input/types.ts +0 -40
- package/src/core/lerp/README.md +0 -79
- package/src/core/lerp/index.ts +0 -1
- package/src/core/lerp/lerp.test.ts +0 -90
- package/src/core/lerp/lerp.ts +0 -42
- package/src/core/navmesh/README.md +0 -164
- package/src/core/navmesh/index.ts +0 -1
- package/src/core/navmesh/navmesh-worker-pool.ts +0 -236
- package/src/core/navmesh/navmesh-workers.test.ts +0 -356
- package/src/core/navmesh/navmesh.test.ts +0 -344
- package/src/core/navmesh/navmesh.ts +0 -1047
- package/src/core/navmesh/navmesh.worker.ts +0 -147
- package/src/core/pooled-codec/README.md +0 -70
- package/src/core/pooled-codec/index.ts +0 -1
- package/src/core/pooled-codec/pooled-codec.test.ts +0 -862
- package/src/core/pooled-codec/pooled-codec.ts +0 -504
- package/src/core/prediction/README.md +0 -64
- package/src/core/prediction/index.ts +0 -1
- package/src/core/prediction/prediction.test.ts +0 -423
- package/src/core/prediction/prediction.ts +0 -112
- package/src/ecs/README.md +0 -427
- package/src/ecs/benchmark.test.ts +0 -1645
- package/src/ecs/component-store.ts +0 -198
- package/src/ecs/component.ts +0 -90
- package/src/ecs/entity-handle.test.ts +0 -393
- package/src/ecs/entity-handle.ts +0 -563
- package/src/ecs/example.ts +0 -152
- package/src/ecs/index.ts +0 -4
- package/src/ecs/system-builder.ts +0 -404
- package/src/ecs/world-systems.ts +0 -83
- package/src/ecs/world.test.ts +0 -310
- package/src/ecs/world.ts +0 -904
- package/src/game/index.ts +0 -1
- package/src/game/loop/README.md +0 -32
- package/src/game/loop/index.ts +0 -1
- package/src/game/loop/loop.ts +0 -236
- package/src/index.ts +0 -32
- package/src/net/README.md +0 -474
- package/src/net/adapters/browser-websocket.ts +0 -86
- package/src/net/adapters/bun-websocket.ts +0 -292
- package/src/net/buffer-pool.ts +0 -106
- package/src/net/client.test.ts +0 -807
- package/src/net/client.ts +0 -695
- package/src/net/index.ts +0 -60
- package/src/net/server.test.ts +0 -799
- package/src/net/server.ts +0 -1152
- package/src/net/types.ts +0 -228
- package/src/net/validators.ts +0 -104
- package/src/protocol/README.md +0 -469
- package/src/protocol/index.ts +0 -93
- package/src/protocol/intent/define-intent.test.ts +0 -397
- package/src/protocol/intent/define-intent.ts +0 -201
- package/src/protocol/intent/index.ts +0 -94
- package/src/protocol/intent/intent-registry.test.ts +0 -198
- package/src/protocol/intent/intent-registry.ts +0 -112
- package/src/protocol/intent/intent.ts +0 -12
- package/src/protocol/rpc/define-rpc.test.ts +0 -141
- package/src/protocol/rpc/define-rpc.ts +0 -113
- package/src/protocol/rpc/index.ts +0 -3
- package/src/protocol/rpc/rpc-registry.test.ts +0 -168
- package/src/protocol/rpc/rpc-registry.ts +0 -176
- package/src/protocol/rpc/rpc.ts +0 -37
- package/src/protocol/snapshot/index.ts +0 -45
- package/src/protocol/snapshot/snapshot-codec.test.ts +0 -138
- package/src/protocol/snapshot/snapshot-codec.ts +0 -87
- package/src/protocol/snapshot/snapshot-registry.test.ts +0 -310
- package/src/protocol/snapshot/snapshot-registry.ts +0 -201
- package/src/protocol/snapshot/snapshot.test.ts +0 -76
- package/src/protocol/snapshot/snapshot.ts +0 -41
- /package/dist/{core → types/core}/binary-codec/index.d.ts +0 -0
- /package/dist/{core → types/core}/driver/driver.d.ts +0 -0
- /package/dist/{core → types/core}/driver/drivers/immediate.d.ts +0 -0
- /package/dist/{core → types/core}/driver/drivers/index.d.ts +0 -0
- /package/dist/{core → types/core}/driver/drivers/raf.d.ts +0 -0
- /package/dist/{core → types/core}/driver/drivers/timeout.d.ts +0 -0
- /package/dist/{core → types/core}/driver/index.d.ts +0 -0
- /package/dist/{core → types/core}/events/index.d.ts +0 -0
- /package/dist/{core → types/core}/fixed-ticker/fixed-ticker.d.ts +0 -0
- /package/dist/{core → types/core}/fixed-ticker/index.d.ts +0 -0
- /package/dist/{core → types/core}/generate-id/generate-id.d.ts +0 -0
- /package/dist/{core → types/core}/generate-id/index.d.ts +0 -0
- /package/dist/{core → types/core}/input/sources/browser.d.ts +0 -0
- /package/dist/{core → types/core}/input/sources/index.d.ts +0 -0
- /package/dist/{core → types/core}/input/types.d.ts +0 -0
- /package/dist/{core → types/core}/lerp/index.d.ts +0 -0
- /package/dist/{core → types/core}/lerp/lerp.d.ts +0 -0
- /package/dist/{core → types/core}/navmesh/index.d.ts +0 -0
- /package/dist/{core → types/core}/navmesh/navmesh-worker-pool.d.ts +0 -0
- /package/dist/{core → types/core}/navmesh/navmesh.worker.d.ts +0 -0
- /package/dist/{core → types/core}/pooled-codec/index.d.ts +0 -0
- /package/dist/{core → types/core}/pooled-codec/pooled-codec.d.ts +0 -0
- /package/dist/{core → types/core}/prediction/index.d.ts +0 -0
- /package/dist/{core → types/core}/prediction/prediction.d.ts +0 -0
- /package/dist/{ecs → types/ecs}/component-store.d.ts +0 -0
- /package/dist/{ecs → types/ecs}/component.d.ts +0 -0
- /package/dist/{ecs → types/ecs}/entity-handle.d.ts +0 -0
- /package/dist/{ecs → types/ecs}/example.d.ts +0 -0
- /package/dist/{ecs → types/ecs}/index.d.ts +0 -0
- /package/dist/{ecs → types/ecs}/system-builder.d.ts +0 -0
- /package/dist/{ecs → types/ecs}/world-systems.d.ts +0 -0
- /package/dist/{game → types/game}/index.d.ts +0 -0
- /package/dist/{game → types/game}/loop/index.d.ts +0 -0
- /package/dist/{net → types/net}/adapters/browser-websocket.d.ts +0 -0
- /package/dist/{net → types/net}/adapters/bun-websocket.d.ts +0 -0
- /package/dist/{net → types/net}/buffer-pool.d.ts +0 -0
- /package/dist/{net → types/net}/client.d.ts +0 -0
- /package/dist/{net → types/net}/server.d.ts +0 -0
- /package/dist/{net → types/net}/types.d.ts +0 -0
- /package/dist/{net → types/net}/validators.d.ts +0 -0
- /package/dist/{protocol → types/protocol}/index.d.ts +0 -0
- /package/dist/{protocol → types/protocol}/intent/define-intent.d.ts +0 -0
- /package/dist/{protocol → types/protocol}/intent/index.d.ts +0 -0
- /package/dist/{protocol → types/protocol}/intent/intent-registry.d.ts +0 -0
- /package/dist/{protocol → types/protocol}/intent/intent.d.ts +0 -0
- /package/dist/{protocol → types/protocol}/rpc/define-rpc.d.ts +0 -0
- /package/dist/{protocol → types/protocol}/rpc/index.d.ts +0 -0
- /package/dist/{protocol → types/protocol}/rpc/rpc-registry.d.ts +0 -0
- /package/dist/{protocol → types/protocol}/rpc/rpc.d.ts +0 -0
- /package/dist/{protocol → types/protocol}/snapshot/index.d.ts +0 -0
- /package/dist/{protocol → types/protocol}/snapshot/snapshot-codec.d.ts +0 -0
- /package/dist/{protocol → types/protocol}/snapshot/snapshot-registry.d.ts +0 -0
- /package/dist/{protocol → types/protocol}/snapshot/snapshot.d.ts +0 -0
- /package/dist/{core/input/types.js → webgpu/types/2d/animation.test.d.ts} +0 -0
- /package/dist/{protocol/intent/intent.js → webgpu/types/2d/sprite-accessor.test.d.ts} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var i=Object.defineProperty;var c=Object.getOwnPropertyDescriptor;var k=Object.getOwnPropertyNames;var m=Object.prototype.hasOwnProperty;var u=(n,e,b,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of k(e))!m.call(n,t)&&t!==b&&i(n,t,{get:()=>e[t],enumerable:!(r=c(e,t))||r.enumerable});return n};var a=n=>u(i({},"__esModule",{value:!0}),n);var d={};module.exports=a(d);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var r=Object.defineProperty;var p=Object.getOwnPropertyDescriptor;var a=Object.getOwnPropertyNames;var i=Object.prototype.hasOwnProperty;var d=(c,e)=>{for(var t in e)r(c,t,{get:e[t],enumerable:!0})},y=(c,e,t,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of a(e))!i.call(c,n)&&n!==t&&r(c,n,{get:()=>e[n],enumerable:!(o=p(e,n))||o.enumerable});return c};var m=c=>y(r({},"__esModule",{value:!0}),c);var h={};d(h,{defineRPC:()=>R});module.exports=m(h);var s=require("../../core/binary-codec");class f{constructor(e){this.schema=e}encode(e){return s.BinaryCodec.encode(this.schema,e)}decode(e){const t={};for(const o of Object.keys(this.schema)){const n=this.schema[o];t[o]=n.toNil()}return s.BinaryCodec.decode(this.schema,e,t)}}function R(c){const e=c.schema,t=new f(e);return{method:c.method,codec:t,type:void 0}}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var a=Object.defineProperty;var b=Object.getOwnPropertyDescriptor;var c=Object.getOwnPropertyNames;var d=Object.prototype.hasOwnProperty;var t=(f,r,p,x)=>{if(r&&typeof r=="object"||typeof r=="function")for(let m of c(r))!d.call(f,m)&&m!==p&&a(f,m,{get:()=>r[m],enumerable:!(x=b(r,m))||x.enumerable});return f},e=(f,r,p)=>(t(f,r,"default"),p&&t(p,r,"default"));var g=f=>t(a({},"__esModule",{value:!0}),f);var o={};module.exports=g(o);e(o,require("./rpc"),module.exports);e(o,require("./define-rpc"),module.exports);e(o,require("./rpc-registry"),module.exports);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var i=Object.defineProperty;var c=Object.getOwnPropertyDescriptor;var h=Object.getOwnPropertyNames;var a=Object.prototype.hasOwnProperty;var m=(r,e)=>{for(var o in e)i(r,o,{get:e[o],enumerable:!0})},g=(r,e,o,t)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of h(e))!a.call(r,n)&&n!==o&&i(r,n,{get:()=>e[n],enumerable:!(t=c(e,n))||t.enumerable});return r};var w=r=>g(i({},"__esModule",{value:!0}),r);var y={};m(y,{RpcRegistry:()=>f});module.exports=w(y);class f{constructor(){this.codecs=new Map;this.methodToId=new Map;this.idToMethod=new Map;this.nextId=0}register(e){if(this.codecs.has(e.method))throw new Error(`RPC "${e.method}" is already registered`);const o=this.nextId++;this.codecs.set(e.method,e.codec),this.methodToId.set(e.method,o),this.idToMethod.set(o,e.method)}encode(e,o){const t=this.codecs.get(e.method);if(!t)throw new Error(`RPC "${e.method}" is not registered`);const n=this.methodToId.get(e.method),s=t.encode(o),d=new Uint8Array(2+s.byteLength);return new DataView(d.buffer).setUint16(0,n,!0),d.set(new Uint8Array(s),2),d}decode(e){if(e.byteLength<2)throw new Error("Buffer too small for RPC message");const t=new DataView(e.buffer,e.byteOffset).getUint16(0,!0),n=this.idToMethod.get(t);if(!n)throw new Error(`Unknown RPC method ID: ${t}`);const d=this.codecs.get(n).decode(e.slice(2));return{method:n,data:d}}has(e){return this.codecs.has(e)}getMethods(){return Array.from(this.codecs.keys())}getMethodId(e){return this.methodToId.get(e)}release(e,o){const t=this.codecs.get(e);if(!t)throw new Error(`RPC "${e}" is not registered`);"release"in t&&typeof t.release=="function"&&t.release(o)}}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var r=Object.defineProperty;var d=Object.getOwnPropertyDescriptor;var o=Object.getOwnPropertyNames;var i=Object.prototype.hasOwnProperty;var T=(t,e,a,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let c of o(e))!i.call(t,c)&&c!==a&&r(t,c,{get:()=>e[c],enumerable:!(n=d(e,c))||n.enumerable});return t};var p=t=>T(r({},"__esModule",{value:!0}),t);var f={};module.exports=p(f);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var e=Object.defineProperty;var f=Object.getOwnPropertyDescriptor;var m=Object.getOwnPropertyNames;var x=Object.prototype.hasOwnProperty;var S=(p,o)=>{for(var r in o)e(p,r,{get:o[r],enumerable:!0})},y=(p,o,r,s)=>{if(o&&typeof o=="object"||typeof o=="function")for(let t of m(o))!x.call(p,t)&&t!==r&&e(p,t,{get:()=>o[t],enumerable:!(s=f(o,t))||s.enumerable});return p};var c=p=>y(e({},"__esModule",{value:!0}),p);var d={};S(d,{SnapshotCodec:()=>h.SnapshotCodec,SnapshotRegistry:()=>n.SnapshotRegistry,applySnapshot:()=>a.applySnapshot});module.exports=c(d);var a=require("./snapshot"),h=require("./snapshot-codec"),n=require("./snapshot-registry");
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var o=Object.defineProperty;var d=Object.getOwnPropertyDescriptor;var s=Object.getOwnPropertyNames;var u=Object.prototype.hasOwnProperty;var i=(n,e)=>{for(var t in e)o(n,t,{get:e[t],enumerable:!0})},p=(n,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of s(e))!u.call(n,a)&&a!==t&&o(n,a,{get:()=>e[a],enumerable:!(r=d(e,a))||r.enumerable});return n};var f=n=>p(o({},"__esModule",{value:!0}),n);var y={};i(y,{SnapshotCodec:()=>l});module.exports=f(y);class l{constructor(e){this.updatesCodec=e}encode(e){if(this.updatesCodec.calculateSize&&this.updatesCodec.encodeInto){const a=this.updatesCodec.calculateSize(e.updates),c=new Uint8Array(4+a);return new DataView(c.buffer).setUint32(0,e.tick,!0),this.updatesCodec.encodeInto(e.updates,c,4),c}const t=this.updatesCodec.encode(e.updates),r=new Uint8Array(4+t.length);return new DataView(r.buffer).setUint32(0,e.tick,!0),r.set(t,4),r}decode(e){const t=new DataView(e.buffer,e.byteOffset).getUint32(0,!0),r=e.subarray(4),a=this.updatesCodec.decode(r);return{tick:t,updates:a}}}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var d=Object.defineProperty;var p=Object.getOwnPropertyDescriptor;var u=Object.getOwnPropertyNames;var h=Object.prototype.hasOwnProperty;var f=(n,e)=>{for(var r in e)d(n,r,{get:e[r],enumerable:!0})},y=(n,e,r,t)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of u(e))!h.call(n,s)&&s!==r&&d(n,s,{get:()=>e[s],enumerable:!(t=p(e,s))||t.enumerable});return n};var g=n=>y(d({},"__esModule",{value:!0}),n);var w={};f(w,{SnapshotRegistry:()=>l});module.exports=g(w);class l{constructor(){this.codecs=new Map;this.typeIds=new Map;this.idToType=new Map;this.nextId=0}register(e,r){if(this.codecs.has(e))throw new Error(`Snapshot type "${e}" is already registered`);const t=this.nextId++;this.codecs.set(e,r),this.typeIds.set(e,t),this.idToType.set(t,e)}encode(e,r){const t=this.codecs.get(e),s=this.typeIds.get(e);if(!t||s===void 0)throw new Error(`No codec registered for snapshot type "${e}"`);if(t.calculateSize&&t.encodeInto){const c=t.calculateSize(r.updates),a=new Uint8Array(5+c);return a[0]=s,new DataView(a.buffer).setUint32(1,r.tick,!0),t.encodeInto(r.updates,a,5),a}const i=t.encode(r.updates),o=new Uint8Array(5+i.length);return o[0]=s,new DataView(o.buffer).setUint32(1,r.tick,!0),o.set(i,5),o}decode(e){const r=e[0],t=this.idToType.get(r);if(!t)throw new Error(`Unknown snapshot type ID: ${r}`);const s=this.codecs.get(t);if(!s)throw new Error(`No codec registered for snapshot type "${t}"`);const i=new DataView(e.buffer,e.byteOffset+1).getUint32(0,!0),o=e.subarray(5),c=s.decode(o);return{type:t,snapshot:{tick:i,updates:c}}}has(e){return this.codecs.has(e)}getTypes(){return Array.from(this.codecs.keys())}release(e,r){const t=this.codecs.get(e);if(!t)throw new Error(`No codec registered for snapshot type "${e}"`);"release"in t&&typeof t.release=="function"&&t.release(r)}}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var s=Object.defineProperty;var r=Object.getOwnPropertyDescriptor;var c=Object.getOwnPropertyNames;var f=Object.prototype.hasOwnProperty;var p=(t,e)=>{for(var a in e)s(t,a,{get:e[a],enumerable:!0})},T=(t,e,a,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of c(e))!f.call(t,o)&&o!==a&&s(t,o,{get:()=>e[o],enumerable:!(n=r(e,o))||n.enumerable});return t};var y=t=>T(s({},"__esModule",{value:!0}),t);var u={};p(u,{applySnapshot:()=>l});module.exports=y(u);function l(t,e){i(t,e.updates)}function i(t,e){for(const a in e){if(!Object.prototype.hasOwnProperty.call(e,a))continue;const n=e[a],o=t[a];n==null||Array.isArray(n)?t[a]=n:typeof n=="object"&&typeof o=="object"?i(o,n):t[a]=n}}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var s=Object.defineProperty;var n=Object.getOwnPropertyDescriptor;var o=Object.getOwnPropertyNames;var S=Object.prototype.hasOwnProperty;var d=(r,e)=>{for(var t in e)s(r,t,{get:e[t],enumerable:!0})},m=(r,e,t,p)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of o(e))!S.call(r,a)&&a!==t&&s(r,a,{get:()=>e[a],enumerable:!(p=n(e,a))||p.enumerable});return r};var c=r=>m(s({},"__esModule",{value:!0}),r);var b={};d(b,{Base2DRenderer:()=>l});module.exports=c(b);var i=require("./renderer");class l extends i.BaseRenderer{constructor(e,t){super(e,t),this.maxSprites=t.maxSprites??1024}}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var s=Object.defineProperty;var m=Object.getOwnPropertyDescriptor;var d=Object.getOwnPropertyNames;var p=Object.prototype.hasOwnProperty;var l=(r,e)=>{for(var a in e)s(r,a,{get:e[a],enumerable:!0})},c=(r,e,a,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of d(e))!p.call(r,t)&&t!==a&&s(r,t,{get:()=>e[t],enumerable:!(n=m(e,t))||n.enumerable});return r};var D=r=>c(s({},"__esModule",{value:!0}),r);var x={};l(x,{Base3DRenderer:()=>i});module.exports=D(x);var o=require("./renderer");class i extends o.BaseRenderer{constructor(e,a){super(e,a),this.maxModels=a.maxModels??32}}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var i=Object.defineProperty;var n=Object.getOwnPropertyDescriptor;var l=Object.getOwnPropertyNames;var s=Object.prototype.hasOwnProperty;var d=(r,e)=>{for(var t in e)i(r,t,{get:e[t],enumerable:!0})},c=(r,e,t,a)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of l(e))!s.call(r,o)&&o!==t&&i(r,o,{get:()=>e[o],enumerable:!(a=n(e,o))||a.enumerable});return r};var h=r=>c(i({},"__esModule",{value:!0}),r);var C={};d(C,{BaseRenderer:()=>p});module.exports=h(C);class p{constructor(e,t){this._width=0;this._height=0;this._initialized=!1;this.canvas=e,this.options=t,this._clearColor=t.clearColor??[0,0,0,1]}get clearColor(){return this._clearColor}set clearColor(e){this._clearColor=e}get width(){return this._width}get height(){return this._height}get initialized(){return this._initialized}}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var g=Object.defineProperty;var k=Object.getOwnPropertyDescriptor;var p=Object.getOwnPropertyNames;var C=Object.prototype.hasOwnProperty;var U=(n,t)=>{for(var e in t)g(n,e,{get:t[e],enumerable:!0})},j=(n,t,e,c)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of p(t))!C.call(n,i)&&i!==e&&g(n,i,{get:()=>t[i],enumerable:!(c=k(t,i))||c.enumerable});return n};var N=n=>j(g({},"__esModule",{value:!0}),n);var R={};U(R,{bakeTransformIntoVertices:()=>B,decodeGltfContainer:()=>I,extractPrimitiveAttributes:()=>J,remapSkinAttributes:()=>$,validateAndBuildSkinRemaps:()=>S});module.exports=N(R);const M=F("glTF"),O=F("JSON"),T=F("BIN\0"),x=65535;function I(n,t){if(new Uint32Array(n,0,1)[0]!==M)return{gltf:JSON.parse(new TextDecoder().decode(n)),glbBinaryChunk:null};let c,i=null,r=12;for(;r<n.byteLength;){const s=new Uint32Array(n,r,1)[0],u=new Uint32Array(n,r+4,1)[0];if(r+=8,u===O){const o=new Uint8Array(n,r,s);c=JSON.parse(new TextDecoder().decode(o))}else u===T&&(i=n.slice(r,r+s));r+=s}if(!c)throw new Error(`Invalid GLB: no JSON chunk in ${t}`);return{gltf:c,glbBinaryChunk:i}}function S(n,t,e,c,i){const r=new Map;for(let o=0;o<e.jointCount;o++)r.set(e.jointNodeIndices[o],o);const s=e.inverseBindMatrices,u=new Set;for(const o of n.nodes)o.mesh!==void 0&&o.skin!==void 0&&u.add(o.skin);for(const o of u){if(o===t)continue;const l=n.skins[o];if(!l)continue;const d=l.joints;if(d.length!==e.jointCount)throw new Error(`glTF has incompatible skins (skin ${o} has ${d.length} joints, canonical skin ${t} has ${e.jointCount}). Multi-skeleton models are not supported yet.`);const f=new Uint16Array(d.length);for(let a=0;a<d.length;a++){const b=r.get(d[a]);if(b===void 0)throw new Error(`glTF skin ${o} references node ${d[a]} which is not a joint in canonical skin ${t}. Multi-skeleton models are not supported yet.`);f[a]=b}const A=i(l.inverseBindMatrices).data,h=1e-4;for(let a=0;a<d.length;a++){const b=f[a];for(let w=0;w<16;w++)if(Math.abs(A[a*16+w]-s[b*16+w])>h)throw new Error(`glTF skin ${o} has different inverse bind matrices than canonical skin ${t}. Multi-skeleton models are not supported yet.`)}c.set(o,f)}}function $(n,t,e,c){const i=t!==e?c.get(t):void 0;if(!i)return n;const r=new Uint16Array(n.joints.length);for(let s=0;s<n.joints.length;s++)r[s]=i[n.joints[s]];return{joints:r,weights:n.weights}}function J(n,t){const e=new Float32Array(t(n.attributes.POSITION).data),c=n.attributes.NORMAL!==void 0?new Float32Array(t(n.attributes.NORMAL).data):void 0,i=n.attributes.TEXCOORD_0!==void 0?new Float32Array(t(n.attributes.TEXCOORD_0).data):void 0;let r;if(n.indices!==void 0){const s=t(n.indices);r=s.data.length>x?new Uint32Array(s.data):new Uint16Array(s.data)}return{positions:e,normals:c,uvs:i,indices:r}}function B(n,t,e){const c=n.length/3;for(let i=0;i<c;i++){const r=i*3,s=n[r],u=n[r+1],o=n[r+2];if(n[r]=e[0]*s+e[4]*u+e[8]*o+e[12],n[r+1]=e[1]*s+e[5]*u+e[9]*o+e[13],n[r+2]=e[2]*s+e[6]*u+e[10]*o+e[14],t){const l=t[r],d=t[r+1],f=t[r+2],y=e[0]*l+e[4]*d+e[8]*f,A=e[1]*l+e[5]*d+e[9]*f,h=e[2]*l+e[6]*d+e[10]*f,a=Math.sqrt(y*y+A*A+h*h);a>0&&(t[r]=y/a,t[r+1]=A/a,t[r+2]=h/a)}}}function F(n){return n.charCodeAt(0)|n.charCodeAt(1)<<8|n.charCodeAt(2)<<16|n.charCodeAt(3)<<24}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var D=Object.defineProperty;var _=Object.getOwnPropertyDescriptor;var W=Object.getOwnPropertyNames;var j=Object.prototype.hasOwnProperty;var q=(s,a)=>{for(var b in a)D(s,b,{get:a[b],enumerable:!0})},H=(s,a,b,h)=>{if(a&&typeof a=="object"||typeof a=="function")for(let p of W(a))!j.call(s,p)&&p!==b&&D(s,p,{get:()=>a[p],enumerable:!(h=_(a,p))||h.enumerable});return s};var K=s=>H(D({},"__esModule",{value:!0}),s);var X={};q(X,{parseGltf:()=>Q});module.exports=K(X);var $=require("../math"),c=require("./skin-parser"),u=require("./helpers");async function Q(s,a){const b=await fetch(s),h=s.substring(0,s.lastIndexOf("/")+1),p=await b.arrayBuffer(),{gltf:t,glbBinaryChunk:V}=(0,u.decodeGltfContainer)(p,s);if(!t.meshes?.length)throw new Error(`No meshes found in ${s}`);const T=[];for(let e=0;e<(t.buffers?.length??0);e++){const n=t.buffers[e];if(V&&(!n.uri||n.uri===""))T.push(V);else if(n.uri){const i=await fetch(h+n.uri);T.push(await i.arrayBuffer())}}const y=e=>{const n=t.accessors[e],i=t.bufferViews[n.bufferView],r=T[i.buffer],o={5120:Int8Array,5121:Uint8Array,5122:Int16Array,5123:Uint16Array,5125:Uint32Array,5126:Float32Array},d={5120:1,5121:1,5122:2,5123:2,5125:4,5126:4},f={SCALAR:1,VEC2:2,VEC3:3,VEC4:4,MAT2:4,MAT3:9,MAT4:16},g=o[n.componentType],w=d[n.componentType],l=f[n.type]??1,B=(i.byteOffset??0)+(n.byteOffset??0),x=i.byteStride??w*l,A=w*l;if(x===A)return{data:new g(r,B,n.count*l),count:n.count,elementSize:l};const S=new g(n.count*l),P=new Uint8Array(r),v=new Uint8Array(S.buffer);for(let C=0;C<n.count;C++){const J=B+C*x,L=C*A;for(let G=0;G<A;G++)v[L+G]=P[J+G]}return{data:S,count:n.count,elementSize:l}},M=new Map,z=async e=>{if(M.has(e))return M.get(e);const n=t.images?.[e];if(!n)return;let i;if(n.bufferView!==void 0){const r=t.bufferViews[n.bufferView],o=T[r.buffer],d=new Uint8Array(o,r.byteOffset??0,r.byteLength);i=new Blob([d],{type:n.mimeType??"image/png"})}else if(n.uri){const r=n.uri.startsWith("data:")?n.uri:h+n.uri;i=await(await fetch(r)).blob()}if(i){const r=await createImageBitmap(i);return M.set(e,r),r}},O=t.nodes?.findIndex(e=>e.mesh!==void 0&&e.skin!==void 0)??-1,k=O!==-1?t.nodes[O].skin:void 0;let m=null,I=[];const R=new Map;k!==void 0&&t.skins?.[k]&&(m=(0,c.parseSkin)(t,k,y),I=(0,c.parseAnimations)(t,m,y),a?.animations&&(I=I.filter(e=>a.animations.includes(e.name))),(0,u.validateAndBuildSkinRemaps)(t,k,m,R,y));const U=[];for(let e=0;e<t.nodes.length;e++)t.nodes[e].mesh!==void 0&&U.push(e);const E=U.length>0?U.map(e=>t.nodes[e].mesh):[0],F=[];for(const e of E){const n=t.meshes[e];if(!n)continue;const i=t.nodes.find(f=>f.mesh===e),r=i?.skin,o=m!==null&&r!==void 0;let d=null;i&&!o&&(i.scale||i.rotation||i.translation||i.matrix)&&(d=(0,$.nodeToMat4)(i));for(const f of n.primitives){const{positions:g,normals:w,uvs:l,indices:B}=(0,u.extractPrimitiveAttributes)(f,y);d&&!o&&(0,u.bakeTransformIntoVertices)(g,w,d);let x;if(f.material!==void 0){const v=t.materials?.[f.material]?.pbrMetallicRoughness?.baseColorTexture?.index;v!==void 0&&t.textures?.[v]&&(x=await z(t.textures[v].source))}let A,S=!1;if(o){const P=(0,c.parsePrimitiveSkinAttributes)(f,y);P&&(A=(0,u.remapSkinAttributes)(P,r,k,R),S=!0)}F.push({positions:g,normals:w,uvs:l,indices:B,texture:x,skinAttrs:A,skinned:S})}}let N=null;if(!a?.freezeAnimations&&m){const e=t.animations??[],n=e.map((r,o)=>r.name??`animation_${o}`),i=(0,c.buildNodeToJointMap)(m);N={availableAnimations:n,decodeAnimation(r){const o=e.findIndex((d,f)=>(d.name??`animation_${f}`)===r);if(o<0)throw new Error(`glTF ${s} has no animation named '${r}'`);return(0,c.decodeAnimationClip)(e[o],`animation_${o}`,i,y)}}}return{src:s,primitives:F,skin:m?{data:m,animClips:I}:null,source:N}}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var C=Object.defineProperty;var A=Object.getOwnPropertyDescriptor;var S=Object.getOwnPropertyNames;var k=Object.prototype.hasOwnProperty;var I=(b,e)=>{for(var r in e)C(b,r,{get:e[r],enumerable:!0})},M=(b,e,r,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of S(e))!k.call(b,i)&&i!==r&&C(b,i,{get:()=>e[i],enumerable:!(n=A(e,i))||n.enumerable});return b};var w=b=>M(C({},"__esModule",{value:!0}),b);var F={};I(F,{SkeletalAnimation:()=>R});module.exports=w(F);var f=require("../math"),g=require("../../core/lerp");class R{constructor(e,r){this.clips=[];this.clipsByName=new Map;this._scratchVec3=new Float32Array(3);this._scratchQuat=new Float32Array(4);this.skinData=e;const n=e.jointCount;this.localMatrices=new Float32Array(n*16),this.worldMatrices=new Float32Array(n*16),this.blendScratch=new Float32Array(n*16),this.originalRestPoseTRS=new Float32Array(e.restPoseTRS),this.currentTRS=new Float32Array(n*10),this.skelRootMat=new Float32Array(16),e.skeletonRootMatrix?this.skelRootMat.set(e.skeletonRootMatrix):(this.skelRootMat[0]=1,this.skelRootMat[5]=1,this.skelRootMat[10]=1,this.skelRootMat[15]=1),this.topoOrder=new Uint16Array(n);const i=new Uint8Array(n);let s=0;const t=o=>{if(i[o])return;i[o]=1;const d=e.parentJointIndices[o];d!==-1&&t(d),this.topoOrder[s++]=o};for(let o=0;o<n;o++)t(o);for(const o of r)this.loadClip(o)}loadClip(e,r=!0){const n=this.clips.length;return this.clips.push({id:n,name:e.name,duration:e.duration,channels:e.channels,loop:r}),this.clipsByName.set(e.name,n),n}replaceClips(e,r=!0){const n=new Map(this.clipsByName),i=this.clips.length;this.clips=[],this.clipsByName.clear();for(const t of e)this.loadClip(t,r);const s=new Int32Array(i).fill(-1);for(const[t,o]of n){const d=this.clipsByName.get(t);d!==void 0&&(s[o]=d)}return s}getClipId(e){const r=this.clipsByName.get(e);if(r===void 0)throw new Error(`Skeletal clip "${e}" not found`);return r}getClipNames(){return this.clips.map(e=>e.name)}getClip(e){return this.clips[e]??null}get clipCount(){return this.clips.length}createState(e,r=1,n=!0){return{clipId:typeof e=="string"?this.getClipId(e):e,time:0,speed:r,playing:n,loop:!0,prevClipId:-1,prevTime:0,prevSpeed:1,blendWeight:1,blendDuration:0,onEnd:()=>null}}play(e,r,n){const i=typeof r=="string"?this.getClipId(r):r,s=n?.crossfade??0;s>0&&e.playing?(e.prevClipId=e.clipId,e.prevTime=e.time,e.prevSpeed=e.speed,e.blendWeight=0,e.blendDuration=s):(e.prevClipId=-1,e.blendWeight=1,e.blendDuration=0),e.onEnd=n?.onEnd??(()=>null),e.loop=n?.loop??!0,e.clipId=i,e.time=0,e.playing=!0,n?.speed!==void 0&&(e.speed=n.speed)}stop(e){e.playing=!1}resume(e){e.playing=!0}update(e,r,n,i=0){const s=this.skinData.jointCount;e.playing&&this.advanceTime(e,r);const t=e.prevClipId!==-1&&e.blendDuration>0&&e.blendWeight<1;if(t&&(e.blendWeight+=r/e.blendDuration,e.blendWeight>=1&&(e.blendWeight=1,e.prevClipId=-1,e.blendDuration=0)),t&&e.prevClipId!==-1){const o=this.clips[e.prevClipId];o&&(e.prevTime+=r*e.prevSpeed,o.loop&&e.prevTime>=o.duration&&(e.prevTime%=o.duration)),this.evaluateClip(e.prevClipId,e.prevTime,this.blendScratch,0),this.evaluateClip(e.clipId,e.time,n,i);const d=e.blendWeight,m=this.blendScratch,l=s*16;for(let a=0;a<l;a++)n[i+a]=(0,g.lerp)(m[a],n[i+a],d)}else this.evaluateClip(e.clipId,e.time,n,i)}advanceTime(e,r){const n=this.clips[e.clipId];!n||n.duration<=0||(e.time+=r*e.speed,e.time>=n.duration&&(n.loop?e.time%=n.duration:(e.time=n.duration-1e-4,e.playing=!1)),e.time<0&&(n.loop?e.time=n.duration+e.time%n.duration:(e.time=0,e.playing=!1)))}evaluateClip(e,r,n,i){const s=this.clips[e];if(!s)return;const t=this.skinData,o=t.jointCount,d=this.localMatrices,m=this.worldMatrices,l=this.currentTRS;l.set(this.originalRestPoseTRS);for(const p of s.channels){const u=p.jointIndex;if(u>=o)continue;const h=u*10,y=this.sampleChannel(p,r);p.path==="translation"?(l[h]=y[0],l[h+1]=y[1],l[h+2]=y[2]):p.path==="rotation"?(l[h+3]=y[0],l[h+4]=y[1],l[h+5]=y[2],l[h+6]=y[3]):p.path==="scale"&&(l[h+7]=y[0],l[h+8]=y[1],l[h+9]=y[2])}for(let p=0;p<o;p++){const u=p*10;(0,f.trsToMat4)(l[u],l[u+1],l[u+2],l[u+3],l[u+4],l[u+5],l[u+6],l[u+7],l[u+8],l[u+9],d,p*16)}const a=this.topoOrder,c=this.skelRootMat;for(let p=0;p<o;p++){const u=a[p],h=t.parentJointIndices[u];h===-1?(0,f.mat4Mul)(c,0,d,u*16,m,u*16):(0,f.mat4Mul)(m,h*16,d,u*16,m,u*16)}const v=t.inverseBindMatrices;for(let p=0;p<o;p++)(0,f.mat4Mul)(m,p*16,v,p*16,n,i+p*16)}computeRestPose(e,r=0){const n=this.skinData,i=n.jointCount,s=this.localMatrices,t=this.worldMatrices,o=this.originalRestPoseTRS;for(let a=0;a<i;a++){const c=a*10;(0,f.trsToMat4)(o[c],o[c+1],o[c+2],o[c+3],o[c+4],o[c+5],o[c+6],o[c+7],o[c+8],o[c+9],s,a*16)}const d=this.topoOrder,m=this.skelRootMat;for(let a=0;a<i;a++){const c=d[a],v=n.parentJointIndices[c];v===-1?(0,f.mat4Mul)(m,0,s,c*16,t,c*16):(0,f.mat4Mul)(t,v*16,s,c*16,t,c*16)}const l=n.inverseBindMatrices;for(let a=0;a<i;a++)(0,f.mat4Mul)(t,a*16,l,a*16,e,r+a*16)}sampleChannel(e,r){const n=e.timestamps,i=e.values,s=e.path==="rotation"?4:3;if(r<=n[0])return i.subarray(0,s);if(r>=n[n.length-1])return i.subarray((n.length-1)*s,n.length*s);let t=0,o=n.length-1;for(;t<o-1;){const p=t+o>>1;n[p]<=r?t=p:o=p}if(e.interpolation==="STEP")return i.subarray(t*s,t*s+s);const d=n[t],m=n[o],l=m>d?(r-d)/(m-d):0,a=t*s,c=o*s;if(e.path==="rotation")return this.nlerpQuat(i,a,i,c,l);const v=this._scratchVec3;return v[0]=(0,g.lerp)(i[a],i[c],l),v[1]=(0,g.lerp)(i[a+1],i[c+1],l),v[2]=(0,g.lerp)(i[a+2],i[c+2],l),v}nlerpQuat(e,r,n,i,s){const t=this._scratchQuat,d=e[r]*n[i]+e[r+1]*n[i+1]+e[r+2]*n[i+2]+e[r+3]*n[i+3]<0?-1:1,m=1-s;t[0]=m*e[r]+s*n[i]*d,t[1]=m*e[r+1]+s*n[i+1]*d,t[2]=m*e[r+2]+s*n[i+2]*d,t[3]=m*e[r+3]+s*n[i+3]*d;const l=Math.sqrt(t[0]*t[0]+t[1]*t[1]+t[2]*t[2]+t[3]*t[3]);if(l>0){const a=1/l;t[0]*=a,t[1]*=a,t[2]*=a,t[3]*=a}return t}}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var R=Object.defineProperty;var w=Object.getOwnPropertyDescriptor;var P=Object.getOwnPropertyNames;var v=Object.prototype.hasOwnProperty;var U=(n,t)=>{for(var o in t)R(n,o,{get:t[o],enumerable:!0})},D=(n,t,o,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of P(t))!v.call(n,r)&&r!==o&&R(n,r,{get:()=>t[r],enumerable:!(i=w(t,r))||i.enumerable});return n};var J=n=>D(R({},"__esModule",{value:!0}),n);var H={};U(H,{buildNodeToJointMap:()=>T,createPackedAnimationData:()=>z,decodeAnimationClip:()=>M,getNodeTRS:()=>F,packSkinAndAnimations:()=>G,parseAnimations:()=>E,parsePrimitiveSkinAttributes:()=>W,parseSkin:()=>L});module.exports=J(H);var j=require("../math");function L(n,t,o){const i=n.skins[t],r=i.joints,l=r.length,m=o(i.inverseBindMatrices),x=new Float32Array(m.data),y=new Uint16Array(r),f=new Map;for(let a=0;a<l;a++)f.set(r[a],a);const c=new Map;for(let a=0;a<n.nodes.length;a++){const e=n.nodes[a].children;if(e)for(const s of e)c.set(s,a)}const p=new Int16Array(l).fill(-1);for(let a=0;a<l;a++){let e=c.get(r[a]);for(;e!==void 0;){const s=f.get(e);if(s!==void 0){p[a]=s;break}e=c.get(e)}}let A=null;for(let a=0;a<l;a++){if(p[a]!==-1)continue;let e=c.get(r[a]);const s=[];for(;e!==void 0&&!f.has(e);)s.push(e),e=c.get(e);if(s.length>0){A=(0,j.mat4IdentityNew)();for(let d=s.length-1;d>=0;d--){const g=(0,j.nodeToMat4)(n.nodes[s[d]]);A=(0,j.mat4MulNew)(A,g)}}break}const h=new Float32Array(l*10);for(let a=0;a<l;a++){const e=F(n.nodes[r[a]]);h.set(e,a*10)}return{jointCount:l,jointNodeIndices:y,inverseBindMatrices:x,parentJointIndices:p,skeletonRootMatrix:A,restPoseTRS:h}}function M(n,t,o,i){const r=[];let l=0;for(const m of n.channels){const x=m.target.node,y=o.get(x);if(y===void 0)continue;const f=m.target.path;if(f!=="translation"&&f!=="rotation"&&f!=="scale")continue;const c=n.samplers[m.sampler],p=c.interpolation??"LINEAR";if(p!=="LINEAR"&&p!=="STEP")continue;const A=i(c.input),h=new Float32Array(A.data),a=i(c.output),e=new Float32Array(a.data);if(h.length>0){const s=h[h.length-1];s>l&&(l=s)}r.push({jointIndex:y,path:f,timestamps:h,values:e,interpolation:p})}return r.length===0?null:{name:n.name??t,duration:l,channels:r}}function T(n){const t=new Map;for(let o=0;o<n.jointCount;o++)t.set(n.jointNodeIndices[o],o);return t}function E(n,t,o){if(!n.animations?.length)return[];const i=T(t),r=[];for(let l=0;l<n.animations.length;l++){const m=M(n.animations[l],`animation_${r.length}`,i,o);m&&r.push(m)}return r}function B(n){if(n instanceof Uint8Array){const t=new Float32Array(n.length);for(let o=0;o<n.length;o++)t[o]=n[o]/255;return t}if(n instanceof Uint16Array){const t=new Float32Array(n.length);for(let o=0;o<n.length;o++)t[o]=n[o]/65535;return t}return new Float32Array(n)}function _(n){const t=n.length/4;for(let o=0;o<t;o++){const i=o*4,r=n[i]+n[i+1]+n[i+2]+n[i+3];if(r>0&&Math.abs(r-1)>1e-5){const l=1/r;n[i]*=l,n[i+1]*=l,n[i+2]*=l,n[i+3]*=l}}}function W(n,t){if(n.attributes.JOINTS_0===void 0||n.attributes.WEIGHTS_0===void 0)return null;const o=t(n.attributes.JOINTS_0),i=t(n.attributes.WEIGHTS_0),r=o.data instanceof Uint16Array?o.data:new Uint16Array(o.data),l=B(i.data);return _(l),{joints:r,weights:l}}function F(n){const t=new Float32Array(10);if(n.matrix)return t[0]=n.matrix[12],t[1]=n.matrix[13],t[2]=n.matrix[14],t[3]=0,t[4]=0,t[5]=0,t[6]=1,t[7]=1,t[8]=1,t[9]=1,t;const o=n.translation??[0,0,0],i=n.rotation??[0,0,0,1],r=n.scale??[1,1,1];return t[0]=o[0],t[1]=o[1],t[2]=o[2],t[3]=i[0],t[4]=i[1],t[5]=i[2],t[6]=i[3],t[7]=r[0],t[8]=r[1],t[9]=r[2],t}function z(){return{channels:[],keyframeData:[],clips:[],skins:[],parentIndices:[],topoOrder:[],ibmData:[],restTRS:[],skelRootMats:[],jointChannelLookup:[]}}function G(n,t,o){const i=n.skins.length,r=t.jointCount,l=n.parentIndices.length,m=n.topoOrder.length,x=n.ibmData.length/16,y=n.restTRS.length/10,f=n.skelRootMats.length/16;for(let e=0;e<r;e++)n.parentIndices.push(t.parentJointIndices[e]);const c=new Uint8Array(r),p=e=>{if(c[e])return;c[e]=1;const s=t.parentJointIndices[e];s!==-1&&p(s),n.topoOrder.push(e)};for(let e=0;e<r;e++)p(e);for(let e=0;e<t.inverseBindMatrices.length;e++)n.ibmData.push(t.inverseBindMatrices[e]);for(let e=0;e<r;e++)for(let s=0;s<10;s++)n.restTRS.push(t.restPoseTRS[e*10+s]);if(t.skeletonRootMatrix)for(let e=0;e<16;e++)n.skelRootMats.push(t.skeletonRootMatrix[e]);else{const e=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1];for(let s=0;s<16;s++)n.skelRootMats.push(e[s])}const A=n.clips.length,h=n.jointChannelLookup.length;n.skins.push({jointCount:r,parentOffset:l,topoOffset:m,ibmOffset:x,restTRSOffset:y,skelRootMatIndex:f,clipOffset:A,jointLookupStart:h});const a=new Map;for(let e=0;e<r;e++)a.set(t.jointNodeIndices[e],e);for(const e of o){const s=n.channels.length,d=[...e.channels].sort((u,I)=>u.jointIndex-I.jointIndex);for(const u of d){const I=u.path==="translation"?0:u.path==="rotation"?1:2,k=u.interpolation==="STEP"?4:0,O=n.keyframeData.length,C=u.timestamps.length,N=u.path==="rotation"?4:3;for(let b=0;b<C;b++)n.keyframeData.push(u.timestamps[b]);for(let b=0;b<C*N;b++)n.keyframeData.push(u.values[b]);n.channels.push({jointIndex:u.jointIndex,pathAndInterp:I|k,keyframeCount:C,dataOffset:O})}const g=d.length;let S=0;for(let u=0;u<r;u++){const I=S;for(;S<g&&d[S].jointIndex===u;)S++;n.jointChannelLookup.push(s+I),n.jointChannelLookup.push(S-I)}n.clips.push({channelStart:s,channelCount:g,duration:e.duration,looping:1})}return i}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var x=Object.defineProperty;var i=Object.getOwnPropertyDescriptor;var n=Object.getOwnPropertyNames;var c=Object.prototype.hasOwnProperty;var b=(t,o)=>{for(var f in o)x(t,f,{get:o[f],enumerable:!0})},m=(t,o,f,a)=>{if(o&&typeof o=="object"||typeof o=="function")for(let p of n(o))!c.call(t,p)&&p!==f&&x(t,p,{get:()=>o[p],enumerable:!(a=i(o,p))||a.enumerable});return t},r=(t,o,f)=>(m(t,o,"default"),f&&m(f,o,"default"));var u=t=>m(x({},"__esModule",{value:!0}),t);var e={};b(e,{PrefabBucket:()=>k.PrefabBucket,SkeletalAnimation:()=>l.SkeletalAnimation});module.exports=u(e);r(e,require("./types"),module.exports);r(e,require("./base/renderer"),module.exports);r(e,require("./base/renderer-2d"),module.exports);r(e,require("./base/renderer-3d"),module.exports);r(e,require("./math"),module.exports);r(e,require("./gltf/skin-parser"),module.exports);r(e,require("./gltf/parser"),module.exports);var l=require("./gltf/skeletal-animation");r(e,require("./spritesheet/helpers"),module.exports);r(e,require("./spritesheet/parser"),module.exports);r(e,require("./prefab-bucket"),module.exports);r(e,require("./prefab-bucket/specs"),module.exports);var k=require("./prefab-bucket/concrete");
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var e=Object.defineProperty;var _=Object.getOwnPropertyDescriptor;var g=Object.getOwnPropertyNames;var h=Object.prototype.hasOwnProperty;var k=(r,n)=>{for(var m in n)e(r,m,{get:n[m],enumerable:!0})},B=(r,n,m,a)=>{if(n&&typeof n=="object"||typeof n=="function")for(let u of g(n))!h.call(r,u)&&u!==m&&e(r,u,{get:()=>n[u],enumerable:!(a=_(n,u))||a.enumerable});return r};var C=r=>B(e({},"__esModule",{value:!0}),r);var K={};k(K,{mat4Identity:()=>D,mat4IdentityNew:()=>E,mat4Mul:()=>H,mat4MulNew:()=>J,nodeToMat4:()=>G,trsToMat4:()=>N});module.exports=C(K);function D(r,n){r[n]=1,r[n+1]=0,r[n+2]=0,r[n+3]=0,r[n+4]=0,r[n+5]=1,r[n+6]=0,r[n+7]=0,r[n+8]=0,r[n+9]=0,r[n+10]=1,r[n+11]=0,r[n+12]=0,r[n+13]=0,r[n+14]=0,r[n+15]=1}function E(){const r=new Float32Array(16);return r[0]=1,r[5]=1,r[10]=1,r[15]=1,r}function N(r,n,m,a,u,y,o,c,A,F,l,i){const b=a*a,t=u*u,x=y*y,p=a*u,w=a*y,M=u*y,v=o*a,T=o*u,j=o*y;l[i]=(1-2*(t+x))*c,l[i+1]=2*(p+j)*c,l[i+2]=2*(w-T)*c,l[i+3]=0,l[i+4]=2*(p-j)*A,l[i+5]=(1-2*(b+x))*A,l[i+6]=2*(M+v)*A,l[i+7]=0,l[i+8]=2*(w+T)*F,l[i+9]=2*(M-v)*F,l[i+10]=(1-2*(b+t))*F,l[i+11]=0,l[i+12]=r,l[i+13]=n,l[i+14]=m,l[i+15]=1}function G(r){const n=new Float32Array(16);if(r.matrix)return n.set(r.matrix),n;const m=r.translation??[0,0,0],a=r.rotation??[0,0,0,1],u=r.scale??[1,1,1];return N(m[0],m[1],m[2],a[0],a[1],a[2],a[3],u[0],u[1],u[2],n,0),n}const I=new Float32Array(16);function H(r,n,m,a,u,y){for(let o=0;o<4;o++)for(let c=0;c<4;c++)I[c*4+o]=r[n+o]*m[a+c*4]+r[n+4+o]*m[a+c*4+1]+r[n+8+o]*m[a+c*4+2]+r[n+12+o]*m[a+c*4+3];u.set(I,y)}function J(r,n){const m=new Float32Array(16);for(let a=0;a<4;a++)for(let u=0;u<4;u++)m[u*4+a]=r[a]*n[u*4]+r[4+a]*n[u*4+1]+r[8+a]*n[u*4+2]+r[12+a]*n[u*4+3];return m}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var a=Object.defineProperty;var S=Object.getOwnPropertyDescriptor;var n=Object.getOwnPropertyNames;var o=Object.prototype.hasOwnProperty;var f=(r,e)=>{for(var s in e)a(r,s,{get:e[s],enumerable:!0})},b=(r,e,s,c)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of n(e))!o.call(r,t)&&t!==s&&a(r,t,{get:()=>e[t],enumerable:!(c=S(e,t))||c.enumerable});return r};var P=r=>b(a({},"__esModule",{value:!0}),r);var u={};f(u,{PrefabBucket:()=>i});module.exports=P(u);var d=require("./index"),p=require("./parsers");class i extends d.BasePrefabBucket{constructor(e){const s=e==="3d"?p.parsers3d:p.parsers2d;super(e,s)}add(e){return super.add(e)}addAll(e){return super.addAll(e)}get(e){return super.get(e)}}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var n=Object.defineProperty;var o=Object.getOwnPropertyDescriptor;var d=Object.getOwnPropertyNames;var p=Object.prototype.hasOwnProperty;var b=(s,e)=>{for(var r in e)n(s,r,{get:e[r],enumerable:!0})},c=(s,e,r,t)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of d(e))!p.call(s,a)&&a!==r&&n(s,a,{get:()=>e[a],enumerable:!(t=o(e,a))||t.enumerable});return s};var P=s=>c(n({},"__esModule",{value:!0}),s);var h={};b(h,{BasePrefabBucket:()=>u});module.exports=P(h);var f=require("../../core/events");class u{constructor(e,r={}){this.pending=[];this.pendingIds=new Set;this.prefabs=null;this.mode=e,this.parsers=r,this.events=new f.EventSystem({events:["clips-changed"]})}add(e){if(this.prefabs)throw new Error("PrefabBucket: cannot add after load() \u2014 bucket is frozen");if(this.pendingIds.has(e.id))throw new Error(`PrefabBucket: duplicate id '${e.id}'`);return this.pending.push(e),this.pendingIds.add(e.id),this}addAll(e){if(this.prefabs)throw new Error("PrefabBucket: cannot add after load() \u2014 bucket is frozen");const r=new Set;for(const t of e){if(this.pendingIds.has(t.id)||r.has(t.id))throw new Error(`PrefabBucket: duplicate id '${t.id}'`);r.add(t.id)}for(const t of e)this.pending.push(t),this.pendingIds.add(t.id);return this}async load(){if(this.prefabs)return;const e={events:this.events},r=await Promise.all(this.pending.map(a=>{const i=this.parsers[a.type];if(!i)throw new Error(`PrefabBucket: no parser registered for type '${a.type}'`);return i(a,e)})),t=new Map;for(const a of r)t.set(a.id,a);this.prefabs=t,this.pending=[],this.pendingIds.clear()}get(e){if(!this.prefabs)throw new Error(`PrefabBucket: get('${e}') called before load()`);const r=this.prefabs.get(e);if(!r)throw new Error(`PrefabBucket: unknown prefab id '${e}'`);return r}get loaded(){return this.prefabs!==null}get size(){return this.prefabs?this.prefabs.size:this.pending.length}entries(){if(!this.prefabs)throw new Error("PrefabBucket: entries() called before load()");return Array.from(this.prefabs.values())}getAllByType(e){if(!this.prefabs)throw new Error(`PrefabBucket: getAllByType('${e}') called before load()`);const r=[];for(const t of this.prefabs.values())t.type===e&&r.push(t);return r}resetAnimations(){if(this.prefabs)for(const e of this.prefabs.values())e.resetAnimations?.()}}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var u=Object.defineProperty;var b=Object.getOwnPropertyDescriptor;var v=Object.getOwnPropertyNames;var k=Object.prototype.hasOwnProperty;var C=(n,e)=>{for(var i in e)u(n,i,{get:e[i],enumerable:!0})},A=(n,e,i,h)=>{if(e&&typeof e=="object"||typeof e=="function")for(let p of v(e))!k.call(n,p)&&p!==i&&u(n,p,{get:()=>e[p],enumerable:!(h=b(e,p))||h.enumerable});return n};var D=n=>A(u({},"__esModule",{value:!0}),n);var x={};C(x,{parsers2d:()=>z,parsers3d:()=>S});module.exports=D(x);var y=require("../gltf/parser"),P=require("../spritesheet/parser");const S={gltf:async(n,e)=>{if(n.type!=="gltf")throw new Error("gltf parser given non-gltf spec");const i=await(0,y.parseGltf)(n.src,{animations:n.animations!==void 0?[...n.animations]:void 0,freezeAnimations:n.freezeAnimations===!0}),h=i.primitives.filter(d=>d.skinned).length,p=i.skin?.data.jointCount??0;let w=0;for(const d of i.primitives)w+=d.positions.length/3;const t={type:"gltf",id:n.id,parsed:i,skinnedPartCount:h,jointCount:p,totalVertexCount:w,metadata:n.metadata??{}},g=n.animations!==void 0?[...n.animations]:i.skin?.animClips.map(d=>d.name)??[];if(g.length>0){const d={};for(const f of g)d[f]=f;t.animations=d,t.animationList=g}if(n.freezeAnimations!==!0){t.loadAnimations=async f=>{const r=i.skin,m=i.source;if(!r||!m)throw new Error(`loadAnimations: prefab '${n.id}' has no source \u2014 was the model skinned and not frozen?`);const l=new Set(r.animClips.map(s=>s.name)),a=[];for(const s of f){if(l.has(s))continue;const o=m.decodeAnimation(s);o&&(r.animClips.push(o),l.add(s),a.push(s))}if(a.length>0){t.animationList||(t.animationList=[]),t.animations||(t.animations={});const s=t.animationList,o=t.animations;for(const c of a)s.push(c),o[c]=c;e.events.emit("clips-changed",{prefabId:n.id,added:a,removed:[]})}},t.unloadAnimations=f=>{const r=i.skin;if(!r)return;const m=new Set(f),l=[];if(r.animClips=r.animClips.filter(a=>m.has(a.name)?(l.push(a.name),!1):!0),l.length>0){const a=t.animationList;if(a)for(let o=a.length-1;o>=0;o--)m.has(a[o])&&a.splice(o,1);const s=t.animations;if(s)for(const o of l)delete s[o];e.events.emit("clips-changed",{prefabId:n.id,added:[],removed:l})}};const d=new Set(g);t.resetAnimations=()=>{const f=i.skin;if(!f)return;const r=[];for(const m of f.animClips)d.has(m.name)||r.push(m.name);r.length>0&&t.unloadAnimations(r)}}return t},grid:n=>{if(n.type!=="grid")throw new Error("grid parser given non-grid spec");return{type:"grid",id:n.id,size:n.size,step:n.step,lineWidth:n.lineWidth,metadata:n.metadata??{}}}},z={spritesheet:async(n,e)=>{if(n.type!=="spritesheet")throw new Error("spritesheet parser given non-spritesheet spec");const i=await(0,P.parseSpritesheet)({image:n.src,frameWidth:n.frameWidth,frameHeight:n.frameHeight,data:n.data});return{type:"spritesheet",id:n.id,parsed:i,frameCount:i.uvs.length,width:i.width,height:i.height,metadata:n.metadata??{}}}};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var a=Object.defineProperty;var o=Object.getOwnPropertyDescriptor;var d=Object.getOwnPropertyNames;var s=Object.prototype.hasOwnProperty;var l=(n,e,i,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of d(e))!s.call(n,t)&&t!==i&&a(n,t,{get:()=>e[t],enumerable:!(r=o(e,t))||r.enumerable});return n};var p=n=>l(a({},"__esModule",{value:!0}),n);var y={};module.exports=p(y);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var u=Object.defineProperty;var i=Object.getOwnPropertyDescriptor;var p=Object.getOwnPropertyNames;var f=Object.prototype.hasOwnProperty;var b=(e,r)=>{for(var t in r)u(e,t,{get:r[t],enumerable:!0})},x=(e,r,t,n)=>{if(r&&typeof r=="object"||typeof r=="function")for(let o of p(r))!f.call(e,o)&&o!==t&&u(e,o,{get:()=>r[o],enumerable:!(n=i(r,o))||n.enumerable});return e};var l=e=>x(u({},"__esModule",{value:!0}),e);var k={};b(k,{computeGridUVs:()=>w,computeTexturePackerUVs:()=>y,loadImage:()=>h});module.exports=l(k);function w(e,r,t,n){const o=Math.floor(e/t),m=Math.floor(r/n),c=[];for(let a=0;a<m;a++)for(let s=0;s<o;s++)c.push({minX:s*t/e,minY:a*n/r,maxX:(s+1)*t/e,maxY:(a+1)*n/r});return c}function y(e){const{w:r,h:t}=e.meta.size,n=[];for(const o of Object.keys(e.frames)){const m=e.frames[o].frame;n.push({minX:m.x/r,minY:m.y/t,maxX:(m.x+m.w)/r,maxY:(m.y+m.h)/t})}return n}async function h(e){const t=await(await fetch(e)).blob();return createImageBitmap(t)}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var p=Object.defineProperty;var h=Object.getOwnPropertyDescriptor;var s=Object.getOwnPropertyNames;var n=Object.prototype.hasOwnProperty;var d=(e,t)=>{for(var i in t)p(e,i,{get:t[i],enumerable:!0})},o=(e,t,i,m)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of s(t))!n.call(e,a)&&a!==i&&p(e,a,{get:()=>t[a],enumerable:!(m=h(t,a))||m.enumerable});return e};var f=e=>o(p({},"__esModule",{value:!0}),e);var g={};d(g,{parseSpritesheet:()=>S});module.exports=f(g);var r=require("./helpers");async function S(e){const t=await(0,r.loadImage)(e.image);let i;if(e.data){const a=await(await fetch(e.data)).json();i=(0,r.computeTexturePackerUVs)(a)}else e.frameWidth&&e.frameHeight?i=(0,r.computeGridUVs)(t.width,t.height,e.frameWidth,e.frameHeight):i=[{minX:0,minY:0,maxX:1,maxY:1}];return{bitmap:t,uvs:i,width:t.width,height:t.height}}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var o=Object.defineProperty;var b=Object.getOwnPropertyDescriptor;var u=Object.getOwnPropertyNames;var a=Object.prototype.hasOwnProperty;var i=(r,e,t,m)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of u(e))!a.call(r,n)&&n!==t&&o(r,n,{get:()=>e[n],enumerable:!(m=b(e,n))||m.enumerable});return r};var p=r=>i(o({},"__esModule",{value:!0}),r);var l={};module.exports=p(l);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const f=Symbol("schemaSize");function y(u){const t=u[f];if(t!==void 0)return t;let e=0;for(const r of Object.keys(u))e+=u[r].size;return u[f]=e,e}class g{static encodeInto(t,e){const r=y(t),a=new ArrayBuffer(r),s=new DataView(a);let n=0;for(const i of Object.keys(t)){const o=t[i];o.write(s,n,e[i]),n+=o.size}return new Uint8Array(a)}static decodeInto(t,e,r){const a=y(t);if(e.byteLength<a)throw new RangeError(`Buffer too small: expected ${a} bytes, got ${e.byteLength}`);const s=new DataView(e.buffer,e.byteOffset,e.byteLength);let n=0;for(const i of Object.keys(t)){const o=t[i];r[i]=o.read(s,n),n+=o.size}return r}}class l{static{this.u8={size:1,write:(t,e,r)=>t.setUint8(e,r),read:(t,e)=>t.getUint8(e),toNil:()=>0}}static{this.u16={size:2,write:(t,e,r)=>t.setUint16(e,r,!1),read:(t,e)=>t.getUint16(e,!1),toNil:()=>0}}static{this.u32={size:4,write:(t,e,r)=>t.setUint32(e,r,!1),read:(t,e)=>t.getUint32(e,!1),toNil:()=>0}}static{this.i8={size:1,write:(t,e,r)=>t.setInt8(e,r),read:(t,e)=>t.getInt8(e),toNil:()=>0}}static{this.i16={size:2,write:(t,e,r)=>t.setInt16(e,r,!1),read:(t,e)=>t.getInt16(e,!1),toNil:()=>0}}static{this.i32={size:4,write:(t,e,r)=>t.setInt32(e,r,!1),read:(t,e)=>t.getInt32(e,!1),toNil:()=>0}}static{this.f16={size:2,write:(t,e,r)=>{const a=new Float32Array(1),s=new Uint32Array(a.buffer);a[0]=r;const n=s[0],i=n>>>31&1;let o=n>>>23&255,d=n&8388607,c;if(o===255)c=i<<15|31744|(d?512:0);else if(o===0)c=i<<15;else{const F=o-127+15;if(F>=31)c=i<<15|31744;else if(F<=0)c=i<<15;else{const b=d>>>13;c=i<<15|F<<10|b}}t.setUint16(e,c,!1)},read:(t,e)=>{const r=t.getUint16(e,!1),a=r>>>15&1,s=r>>>10&31,n=r&1023;let i;if(s===0)i=a<<31;else if(s===31)i=a<<31|255<<23|(n?n<<13:0);else{const c=s-15+127;i=a<<31|c<<23|n<<13}const o=new Uint32Array([i]);return new Float32Array(o.buffer)[0]},toNil:()=>0}}static{this.f32={size:4,write:(t,e,r)=>t.setFloat32(e,r,!1),read:(t,e)=>t.getFloat32(e,!1),toNil:()=>0}}static{this.f64={size:8,write:(t,e,r)=>t.setFloat64(e,r,!1),read:(t,e)=>t.getFloat64(e,!1),toNil:()=>0}}static{this.bool={size:1,write:(t,e,r)=>t.setUint8(e,r?1:0),read:(t,e)=>t.getUint8(e)!==0,toNil:()=>!1}}static string(t){return{size:t+2,write(e,r,a){const n=new TextEncoder().encode(a);if(n.length>t)throw new RangeError(`String too long, max ${t} bytes`);e.setUint16(r,n.length,!1);for(let i=0;i<n.length;i++)e.setUint8(r+2+i,n[i]);for(let i=n.length;i<t;i++)e.setUint8(r+2+i,0)},read(e,r){const a=e.getUint16(r,!1),s=new Uint8Array(a);for(let n=0;n<a;n++)s[n]=e.getUint8(r+2+n);return new TextDecoder().decode(s)},toNil:()=>""}}static{this.vec2={size:8,write(t,e,r){t.setFloat32(e,r.x,!1),t.setFloat32(e+4,r.y,!1)},read(t,e){return{x:t.getFloat32(e,!1),y:t.getFloat32(e+4,!1)}},toNil:()=>({x:0,y:0})}}static{this.vec3={size:12,write(t,e,r){t.setFloat32(e,r.x,!1),t.setFloat32(e+4,r.y,!1),t.setFloat32(e+8,r.z,!1)},read(t,e){return{x:t.getFloat32(e,!1),y:t.getFloat32(e+4,!1),z:t.getFloat32(e+8,!1)}},toNil:()=>({x:0,y:0,z:0})}}static{this.color={size:4,write(t,e,r){t.setUint8(e,r.r),t.setUint8(e+1,r.g),t.setUint8(e+2,r.b),t.setUint8(e+3,r.a)},read(t,e){return{r:t.getUint8(e),g:t.getUint8(e+1),b:t.getUint8(e+2),a:t.getUint8(e+3)}},toNil:()=>({r:0,g:0,b:0,a:0})}}static{this.f32_le={size:4,write:(t,e,r)=>t.setFloat32(e,r,!0),read:(t,e)=>t.getFloat32(e,!0),toNil:()=>0}}static{this.f64_le={size:8,write:(t,e,r)=>t.setFloat64(e,r,!0),read:(t,e)=>t.getFloat64(e,!0),toNil:()=>0}}static{this.u16_le={size:2,write:(t,e,r)=>t.setUint16(e,r,!0),read:(t,e)=>t.getUint16(e,!0),toNil:()=>0}}static{this.u32_le={size:4,write:(t,e,r)=>t.setUint32(e,r,!0),read:(t,e)=>t.getUint32(e,!0),toNil:()=>0}}static{this.i16_le={size:2,write:(t,e,r)=>t.setInt16(e,r,!0),read:(t,e)=>t.getInt16(e,!0),toNil:()=>0}}static{this.i32_le={size:4,write:(t,e,r)=>t.setInt32(e,r,!0),read:(t,e)=>t.getInt32(e,!0),toNil:()=>0}}static{this.vec2_le={size:8,write:(t,e,r)=>{t.setFloat32(e,r[0],!0),t.setFloat32(e+4,r[1],!0)},read:(t,e)=>[t.getFloat32(e,!0),t.getFloat32(e+4,!0)],toNil:()=>[0,0]}}static{this.vec3_le={size:12,write:(t,e,r)=>{t.setFloat32(e,r[0],!0),t.setFloat32(e+4,r[1],!0),t.setFloat32(e+8,r[2],!0)},read:(t,e)=>[t.getFloat32(e,!0),t.getFloat32(e+4,!0),t.getFloat32(e+8,!0)],toNil:()=>[0,0,0]}}static{this.vec4_le={size:16,write:(t,e,r)=>{t.setFloat32(e,r[0],!0),t.setFloat32(e+4,r[1],!0),t.setFloat32(e+8,r[2],!0),t.setFloat32(e+12,r[3],!0)},read:(t,e)=>[t.getFloat32(e,!0),t.getFloat32(e+4,!0),t.getFloat32(e+8,!0),t.getFloat32(e+12,!0)],toNil:()=>[0,0,0,0]}}}class w extends g{static{this.u8=l.u8}static{this.u16=l.u16}static{this.u32=l.u32}static{this.i8=l.i8}static{this.i16=l.i16}static{this.i32=l.i32}static{this.f16=l.f16}static{this.f32=l.f32}static{this.bool=l.bool}static{this.string=l.string}static{this.vec2=l.vec2}static{this.vec3=l.vec3}static{this.color=l.color}static encode(t,e){return this.encodeInto(t,e)}static decode(t,e,r){return this.decodeInto(t,e,r)}}export{g as BaseBinaryCodec,w as BinaryCodec,l as BinaryPrimitives};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export*from"./binary-codec";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{ImmediateDriver as i,RafDriver as t,TimeoutDriver as o}from"./drivers";function m(r,e){return r==="server-immediate"?new i(e):r==="server-timeout"?new o(e):new t(e)}export{i as ImmediateDriver,t as RafDriver,o as TimeoutDriver,m as createDriver};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
class n{constructor(t){this.update=t;this.last=performance.now();this.running=!1;this.loop=()=>{if(!this.running)return;const t=performance.now(),r=(t-this.last)/1e3;this.last=t,this.update(r),setImmediate(this.loop)}}start(){this.running=!0,this.last=performance.now(),this.loop()}stop(){this.running=!1}}export{n as ImmediateDriver};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export*from"./immediate";export*from"./raf";export*from"./timeout";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
class a{constructor(t){this.update=t;this.last=performance.now();this.running=!1;this.rafId=null;this.loop=()=>{if(!this.running)return;const t=performance.now(),r=(t-this.last)/1e3;this.last=t,this.update(r),requestAnimationFrame(this.loop)}}start(){this.running=!0,this.last=performance.now(),this.rafId=requestAnimationFrame(this.loop)}stop(){this.running=!1,this.rafId!==null&&(cancelAnimationFrame(this.rafId),this.rafId=null)}}export{a as RafDriver};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const r=1;class e{constructor(t){this.update=t;this.last=performance.now();this.running=!1;this.loop=()=>{if(!this.running)return;const t=performance.now(),o=(t-this.last)/1e3;this.last=t,this.update(o),setTimeout(this.loop,r)}}start(){this.running=!0,this.last=performance.now(),this.loop()}stop(){this.running=!1}}export{e as TimeoutDriver};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export*from"./driver";export*from"./drivers";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
class o{constructor({events:n}){this.emitting=-1;this.events=n,this.eventIndex={},this.callbackArrays=new Array(this.events.length),this.callbackCounts=new Array(this.events.length).fill(0);for(let t=0;t<this.events.length;t++)this.eventIndex[this.events[t]]=t,this.callbackArrays[t]=[]}on(n,t){const e=this.eventIndex[n];if(e===void 0)return console.warn(`Event "${n}" does not exist.`);const a=this.callbackArrays[e],s=this.callbackCounts[e];for(let l=0;l<s;l++)if(a[l]===t)return;a[s]=t,this.callbackCounts[e]++}once(n,t){const e=a=>{t(a),this.off(n,e)};this.on(n,e)}emit(n,t){const e=this.eventIndex[n];if(e===void 0)return console.warn(`Event "${n}" does not exist.`);const a=this.callbackArrays[e],s=this.callbackCounts[e];this.emitting=e;for(let l=0;l<s;l++){const r=a[l];r!==null&&r(t)}this.emitting=-1,this.compact(e)}off(n,t){const e=this.eventIndex[n];if(e===void 0)return console.warn(`Event "${n}" does not exist.`);const a=this.callbackArrays[e],s=this.callbackCounts[e];for(let l=0;l<s;l++)if(a[l]===t){this.emitting===e?a[l]=null:(a[l]=a[s-1],a[s-1]=null,this.callbackCounts[e]--);return}}clear(n){if(!n){for(let e=0;e<this.callbackArrays.length;e++)this.callbackArrays[e].length=0,this.callbackCounts[e]=0;return}const t=this.eventIndex[n];if(t===void 0)return console.warn(`Event "${n}" does not exist.`);this.callbackArrays[t].length=0,this.callbackCounts[t]=0}compact(n){const t=this.callbackArrays[n];let e=0;const a=this.callbackCounts[n];for(let s=0;s<a;s++)t[s]!==null&&(t[e++]=t[s]);for(let s=e;s<a;s++)t[s]=null;this.callbackCounts[n]=e}}export{o as EventSystem};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export*from"./event-system";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
class s{constructor({rate:t,onTick:i}){this.accumulator=0;this._tickCount=0;this.rate=t,this.intervalMs=1e3/this.rate,this.onTick=i,this.maxTicksPerFrame=Math.max(1,Math.floor(t/2))}getTicks(t){this.accumulator+=t*1e3;let i=0;const e=this.intervalMs*.001;for(;this.accumulator>=this.intervalMs-e&&i<this.maxTicksPerFrame;)this.accumulator-=this.intervalMs,i++;const r=Math.floor(this.accumulator/this.intervalMs);return r>0&&this.onTickSkipped&&this.onTickSkipped(r),i}tick(t){const i=this.getTicks(t);for(let e=0;e<i;e++)this.onTick(1/this.rate,this._tickCount++)}get tickCount(){return this._tickCount}resetTickCount(){this._tickCount=0,this.accumulator=0}get accumulatedTime(){return this.accumulator/1e3}get alpha(){return Math.min(this.accumulatedTime/(1/this.rate),1)}}export{s as FixedTicker};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export*from"./fixed-ticker";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
class i{constructor(e){this.capacity=e,this.freeList=new Uint32Array(e);for(let t=0;t<e;t++)this.freeList[t]=t;this.freeCount=e}allocate(){return this.freeCount===0?-1:this.freeList[--this.freeCount]}free(e){if(this.freeCount>=this.capacity)throw new Error("Double free detected!");this.freeList[this.freeCount++]=e}hasAvailable(){return this.freeCount>0}getAvailableCount(){return this.freeCount}getAllocatedCount(){return this.capacity-this.freeCount}}export{i as FreeList};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export*from"./free-list";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
function d(r={}){const{prefix:n="",size:a=16}=r,t=Math.max(a-n.length,8),i=Math.ceil(t/8);let e=crypto.getRandomValues(new Uint32Array(i)).reduce((s,o)=>s+o.toString(16).padStart(8,"0"),"");return e=e.slice(0,t).padStart(t,"0"),`${n}${e}`}export{d as generateId};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export*from"./generate-id";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export*from"./binary-codec";export*from"./events";export*from"./fixed-ticker";export*from"./generate-id";export*from"./lerp";export*from"./driver";export*from"./navmesh";export*from"./pooled-codec";export*from"./prediction";export*from"./input";export*from"./free-list";export*from"./sparse-batcher";export*from"./simple-rng";export*from"./ray";export*from"../renderer";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export*from"./manager";export*from"./sources";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
class c{constructor(){this.keys=Object.create(null);this.prevKeys=Object.create(null);this.mouse={x:0,y:0,dx:0,dy:0,left:!1,right:!1,middle:!1,scrollX:0,scrollY:0};this.lastClientX=null;this.lastClientY=null;this.prevMouse={left:!1,right:!1,middle:!1};this.snapshotFlip=!1;this.handlers={keydown:t=>this.onKeyDown(t),keyup:t=>this.onKeyUp(t),mousemove:t=>this.onMouseMove(t),mousedown:t=>this.onMouseDown(t),mouseup:t=>this.onMouseUp(t),wheel:t=>this.onMouseWheel(t),swipe:t=>this.onSwipe(t),pinch:t=>this.onPinch(t)};this.snapshotA=r(),this.snapshotB=r()}peek(){const t=this.snapshotFlip?this.snapshotA:this.snapshotB;return d(t,this.keys,this.mouse),t}snapshot(){const t=this.snapshotFlip?this.snapshotA:this.snapshotB;return this.snapshotFlip=!this.snapshotFlip,p(t,this.keys,this.prevKeys,this.mouse,this.prevMouse),this.mouse.dx=0,this.mouse.dy=0,this.mouse.scrollX=0,this.mouse.scrollY=0,this.prevMouse.left=this.mouse.left,this.prevMouse.right=this.mouse.right,this.prevMouse.middle=this.mouse.middle,t}listen(t){this.inputSource&&this.inputSource.detach(),this.inputSource=t,t.attach(this.handlers)}unlisten(){this.inputSource&&this.inputSource.detach()}onKeyDown(t){const s=this.keys[t.code]??={down:!1,hit:!1,released:!1};s.down=!0}onKeyUp(t){const s=this.keys[t.code]??={down:!1,hit:!1,released:!1};s.down=!1}onMouseMove(t){const s=t.target.getBoundingClientRect(),o=t.clientX-s.left,i=t.clientY-s.top;typeof document<"u"&&document.pointerLockElement===t.target?(this.mouse.dx+=t.movementX,this.mouse.dy+=t.movementY):this.lastClientX!==null&&this.lastClientY!==null&&(this.mouse.dx+=t.clientX-this.lastClientX,this.mouse.dy+=t.clientY-this.lastClientY),this.lastClientX=t.clientX,this.lastClientY=t.clientY,this.mouse.x=o,this.mouse.y=i}onMouseDown(t){t.button===0&&(this.mouse.left=!0),t.button===1&&(this.mouse.middle=!0),t.button===2&&(this.mouse.right=!0)}onMouseUp(t){t.button===0&&(this.mouse.left=!1),t.button===1&&(this.mouse.middle=!1),t.button===2&&(this.mouse.right=!1),this.lastClientX=null,this.lastClientY=null}onMouseWheel(t){this.mouse.scrollX+=t.deltaX,this.mouse.scrollY+=t.deltaY}onSwipe(t){}onPinch(t){}}function r(){return{mouse:{position:{x:0,y:0},delta:{position:{x:0,y:0},scroll:{x:0,y:0}},left:{down:!1,hit:!1,released:!1},right:{down:!1,hit:!1,released:!1},middle:{down:!1,hit:!1,released:!1}},keys:Object.create(null)}}function d(e,t,s){for(const o in t){const i=e.keys[o]??={down:!1,hit:!1,released:!1};i.down=t[o].down,i.hit=!1,i.released=!1}e.mouse.position.x=s.x,e.mouse.position.y=s.y,e.mouse.delta.position.x=s.dx,e.mouse.delta.position.y=s.dy,e.mouse.delta.scroll.x=s.scrollX,e.mouse.delta.scroll.y=s.scrollY,e.mouse.left.down=s.left,e.mouse.right.down=s.right,e.mouse.middle.down=s.middle,e.mouse.left.hit=e.mouse.left.released=!1,e.mouse.right.hit=e.mouse.right.released=!1,e.mouse.middle.hit=e.mouse.middle.released=!1}function p(e,t,s,o,i){for(const l in t){const n=t[l].down,h=s[l]??!1,a=e.keys[l]??={down:!1,hit:!1,released:!1};a.down=n,a.hit=n&&!h,a.released=!n&&h,s[l]=n}e.mouse.position.x=o.x,e.mouse.position.y=o.y,e.mouse.delta.position.x=o.dx,e.mouse.delta.position.y=o.dy,e.mouse.delta.scroll.x=o.scrollX,e.mouse.delta.scroll.y=o.scrollY,u(e.mouse.left,o.left,i.left),u(e.mouse.right,o.right,i.right),u(e.mouse.middle,o.middle,i.middle)}function u(e,t,s){e.down=t,e.hit=t&&!s,e.released=!t&&s}export{c as InputManager};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
class i{constructor(e,r){this.keyboardTarget=e;this.mouseTarget=r}attach(e){this.handlers&&this.detach(),this.handlers=e,this.keyboardTarget.addEventListener("keydown",e.keydown),this.keyboardTarget.addEventListener("keyup",e.keyup),this.mouseTarget.addEventListener("pointermove",e.mousemove),this.mouseTarget.addEventListener("pointerdown",e.mousedown),this.mouseTarget.addEventListener("pointerup",e.mouseup),this.mouseTarget.addEventListener("pointercancel",e.mouseup),this.mouseTarget.addEventListener("wheel",e.wheel)}detach(){const e=this.handlers;e&&(this.keyboardTarget.removeEventListener("keydown",e.keydown),this.keyboardTarget.removeEventListener("keyup",e.keyup),this.mouseTarget.removeEventListener("pointermove",e.mousemove),this.mouseTarget.removeEventListener("pointerdown",e.mousedown),this.mouseTarget.removeEventListener("pointerup",e.mouseup),this.mouseTarget.removeEventListener("pointercancel",e.mouseup),this.mouseTarget.removeEventListener("wheel",e.wheel))}}export{i as BrowserInputSource};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export*from"./browser";
|
|
File without changes
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export*from"./lerp";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
function u(e,n,r){return e+(n-e)*r}export{u as lerp};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export*from"./navmesh";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
class m{constructor(s,o,t="grid",r=[]){this.poolSize=s;this.workerPath=o;this.navType=t;this.obstacles=r;this.workers=[];this.nextWorkerIndex=0;this.requestId=0;this.pendingRequests=new Map;this.initialized=!1}async init(){if(this.initialized)return;const s=[];for(let o=0;o<this.poolSize;o++){const t=new Worker(this.workerPath,{type:"module"});t.onmessage=i=>{const e=i.data;if(e.type==="PATH_RESULT"){const n=this.pendingRequests.get(e.id);n&&(n.resolve(e.path),this.pendingRequests.delete(e.id))}else if(e.type==="ERROR")for(const[n,a]of this.pendingRequests.entries())a.reject(new Error(e.error)),this.pendingRequests.delete(n)},t.onerror=i=>{console.error("Worker error:",i);for(const[e,n]of this.pendingRequests.entries())n.reject(new Error("Worker error")),this.pendingRequests.delete(e)},this.workers.push(t);const r=new Promise(i=>{const e=n=>{n.data.type==="READY"&&(t.removeEventListener("message",e),i())};t.addEventListener("message",e)});t.postMessage({type:"INIT",navType:this.navType,obstacles:this.obstacles}),s.push(r)}await Promise.all(s),this.initialized=!0}async findPath(s,o){if(!this.initialized)throw new Error("Worker pool not initialized. Call init() first.");const t=this.requestId++,r=this.workers[this.nextWorkerIndex];return this.nextWorkerIndex=(this.nextWorkerIndex+1)%this.workers.length,new Promise((i,e)=>{this.pendingRequests.set(t,{id:t,from:s,to:o,resolve:i,reject:e}),r.postMessage({type:"FIND_PATH",id:t,from:s,to:o})})}async addObstacle(s){if(!this.initialized)throw new Error("Worker pool not initialized. Call init() first.");const o=this.workers.map(r=>new Promise(i=>{const e=n=>{n.data.type==="OBSTACLE_ADDED"&&(r.removeEventListener("message",e),i(n.data.obstacleId))};r.addEventListener("message",e),r.postMessage({type:"ADD_OBSTACLE",obstacle:s})}));return(await Promise.all(o))[0]}async removeObstacle(s){if(!this.initialized)throw new Error("Worker pool not initialized. Call init() first.");const o=this.workers.map(t=>new Promise(r=>{const i=e=>{e.data.type==="OBSTACLE_REMOVED"&&(t.removeEventListener("message",i),r())};t.addEventListener("message",i),t.postMessage({type:"REMOVE_OBSTACLE",obstacleId:s})}));await Promise.all(o)}async moveObstacle(s,o){if(!this.initialized)throw new Error("Worker pool not initialized. Call init() first.");const t=this.workers.map(r=>new Promise(i=>{const e=n=>{n.data.type==="OBSTACLE_MOVED"&&(r.removeEventListener("message",e),i())};r.addEventListener("message",e),r.postMessage({type:"MOVE_OBSTACLE",obstacleId:s,pos:o})}));await Promise.all(t)}terminate(){for(const s of this.workers)s.terminate();this.workers=[],this.pendingRequests.clear(),this.initialized=!1}get pendingCount(){return this.pendingRequests.size}get size(){return this.workers.length}}export{m as NavMeshWorkerPool};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{Ray2D as z}from"../ray/ray-2d";const V=[{x:1,y:0},{x:-1,y:0},{x:0,y:1},{x:0,y:-1}],x=l=>({x:Math.floor(l.x),y:Math.floor(l.y)}),O=l=>({x:l.x+.5,y:l.y+.5}),d=(l,t)=>l&65535|(t&65535)<<16,g=l=>({x:l<<16>>16,y:l>>16});class I{constructor(t){this.scoreFn=t;this.heap=[]}push(t){this.heap.push(t),this.bubbleUp(this.heap.length-1)}pop(){const t=this.heap[0],e=this.heap.pop();return this.heap.length>0&&e!==void 0&&(this.heap[0]=e,this.sinkDown(0)),t}get size(){return this.heap.length}clear(){this.heap.length=0}bubbleUp(t){const e=this.heap[t],s=this.scoreFn(e);for(;t>0;){const i=(t+1>>1)-1,r=this.heap[i];if(s>=this.scoreFn(r))break;this.heap[i]=e,this.heap[t]=r,t=i}}sinkDown(t){const e=this.heap.length,s=this.heap[t],i=this.scoreFn(s);for(;;){const r=t+1<<1,a=r-1;let o=null,n;if(a<e){const c=this.heap[a];n=this.scoreFn(c),n<i&&(o=a)}if(r<e){const c=this.heap[r];this.scoreFn(c)<(o===null?i:n)&&(o=r)}if(o===null)break;this.heap[t]=this.heap[o],this.heap[o]=s,t=o}}}class X{constructor(t=1){this.grid=new Map;this.obstacleCells=new Map;this.cellSize=t}hash(t,e){const s=Math.floor(t/this.cellSize),i=Math.floor(e/this.cellSize);return d(s,i)}add(t,e){const s=this.getCellsForObstacle(e);for(const i of s)this.grid.has(i)||this.grid.set(i,new Set),this.grid.get(i).add(t);this.obstacleCells.set(t,s)}remove(t){const e=this.obstacleCells.get(t);if(e){for(const s of e){const i=this.grid.get(s);i&&(i.delete(t),i.size===0&&this.grid.delete(s))}this.obstacleCells.delete(t)}}query(t){const e=this.hash(t.x,t.y);return this.grid.get(e)||new Set}queryRay(t,e,s,i,r){const a=new Set,o=this.cellSize;let n=Math.floor(t/o),c=Math.floor(e/o);const h=s>=0?1:-1,p=i>=0?1:-1,u=Math.abs(s)<1e-10?1/0:o/Math.abs(s),f=Math.abs(i)<1e-10?1/0:o/Math.abs(i);let b=Math.abs(s)<1e-10?1/0:s>0?((n+1)*o-t)/s:(t-n*o)/-s,y=Math.abs(i)<1e-10?1/0:i>0?((c+1)*o-e)/i:(e-c*o)/-i;for(;;){const m=this.grid.get(d(n,c));if(m)for(const S of m)a.add(S);if((b<y?b:y)>r)break;b<=y?(b+=u,n+=h):(y+=f,c+=p)}return a}clear(){this.grid.clear(),this.obstacleCells.clear()}getCellsForObstacle(t){const e=[];if(t.type==="circle"){const s=t.radius,i=Math.floor((t.pos.x-s)/this.cellSize),r=Math.floor((t.pos.x+s)/this.cellSize),a=Math.floor((t.pos.y-s)/this.cellSize),o=Math.floor((t.pos.y+s)/this.cellSize);for(let n=i;n<=r;n++)for(let c=a;c<=o;c++)e.push(d(n,c))}else if(t.type==="rect"){const s=t.pos.x+t.size.x/2,i=t.pos.y+t.size.y/2,r=t.size.x/2,a=t.size.y/2,o=Math.sqrt(r*r+a*a),n=Math.floor((s-o)/this.cellSize),c=Math.floor((s+o)/this.cellSize),h=Math.floor((i-o)/this.cellSize),p=Math.floor((i+o)/this.cellSize);for(let u=n;u<=c;u++)for(let f=h;f<=p;f++)e.push(d(u,f))}else if(t.type==="polygon"){const s=M(t),i=Math.floor(s.minX/this.cellSize),r=Math.floor(s.maxX/this.cellSize),a=Math.floor(s.minY/this.cellSize),o=Math.floor(s.maxY/this.cellSize);for(let n=i;n<=r;n++)for(let c=a;c<=o;c++)e.push(d(n,c))}return e}}function v(l,t){const e=l.x-t.pos.x,s=l.y-t.pos.y;return e*e+s*s<=t.radius*t.radius}function w(l,t){const e=t.pos.x+t.size.x/2,s=t.pos.y+t.size.y/2;if(t.rotation){const i=Math.cos(-t.rotation),r=Math.sin(-t.rotation),a=l.x-e,o=l.y-s,n=a*i-o*r,c=a*r+o*i;return Math.abs(n)<=t.size.x/2&&Math.abs(c)<=t.size.y/2}return l.x>=t.pos.x&&l.y>=t.pos.y&&l.x<=t.pos.x+t.size.x&&l.y<=t.pos.y+t.size.y}function k(l,t){let e=!1;const s=t.points,i=t.rotation?Math.cos(t.rotation):1,r=t.rotation?Math.sin(t.rotation):0;for(let a=0,o=s.length-1;a<s.length;o=a++){let n=s[a].x,c=s[a].y,h=s[o].x,p=s[o].y;if(t.rotation){const f=n*i-c*r,b=n*r+c*i,y=h*i-p*r,m=h*r+p*i;n=f,c=b,h=y,p=m}n+=t.pos.x,c+=t.pos.y,h+=t.pos.x,p+=t.pos.y,c>l.y!=p>l.y&&l.x<(h-n)*(l.y-c)/(p-c)+n&&(e=!e)}return e}function M(l){let t=1/0,e=1/0,s=-1/0,i=-1/0;const r=l.rotation?Math.cos(l.rotation):1,a=l.rotation?Math.sin(l.rotation):0;for(const o of l.points){let n=o.x,c=o.y;if(l.rotation){const h=n*r-c*a,p=n*a+c*r;n=h,c=p}n+=l.pos.x,c+=l.pos.y,t=Math.min(t,n),e=Math.min(e,c),s=Math.max(s,n),i=Math.max(i,c)}return{minX:t,minY:e,maxX:s,maxY:i}}class Y{constructor(){this.items=new Map;this.spatial=new X(1);this._cachedItems=[];this.nextId=1;this.dirty=!0;this.version=0}add(t){const e=this.nextId++,s={...t,id:e};return this.items.set(e,s),this.spatial.add(e,s),this.dirty=!0,this.version++,e}move(t,e){const s=this.items.get(t);if(!s)return;this.spatial.remove(t);const i={...s,pos:{...e}};this.items.set(t,i),this.spatial.add(t,i),this.dirty=!0,this.version++}remove(t){this.spatial.remove(t),this.items.delete(t),this.dirty=!0,this.version++}at(t){const e=this.spatial.query(t);for(const s of e){const i=this.items.get(s);if(!(!i||i.solid===!1)&&(i.type==="circle"&&v(t,i)||i.type==="rect"&&w(t,i)||i.type==="polygon"&&k(t,i)))return i}}get(t){return this.items.get(t)}queryRay(t,e){return this.spatial.queryRay(t.origin[0],t.origin[1],t.direction[0],t.direction[1],e)}get values(){return this.dirty?(this._cachedItems=[...this.items.values()],this.dirty=!1,this._cachedItems):this._cachedItems}}class P{constructor(){this.cameFrom=new Map;this.g=new Map;this.closed=new Set;this.openSet=new Set;this.goalX=0;this.goalY=0;this.open=new I(t=>{const e=g(t);return(this.g.get(t)??0)+Math.abs(e.x-this.goalX)+Math.abs(e.y-this.goalY)})}run(t,e,s){this.goalX=e.x,this.goalY=e.y,this.cameFrom.clear(),this.g.clear(),this.closed.clear(),this.openSet.clear(),this.open.clear();const i=d(t.x,t.y);for(this.g.set(i,0),this.open.push(i),this.openSet.add(i);this.open.size>0;){const r=this.open.pop();this.openSet.delete(r);const a=g(r);if(a.x===e.x&&a.y===e.y)return W(this.cameFrom,a);this.closed.add(r);for(const o of V){const n=a.x+o.x,c=a.y+o.y;if(!s(n,c))continue;const h=d(n,c);if(this.closed.has(h))continue;const p=this.g.get(r)+1;p<(this.g.get(h)??1/0)&&(this.g.set(h,p),this.cameFrom.set(h,r),this.openSet.has(h)||(this.open.push(h),this.openSet.add(h)))}}return[]}}class C{constructor(t){this.obstacles=t;this.blocked=new Set;this.astar=new P;this.pathCache=new Map;this.pathCacheVersion=-1}rebuild(){this.blocked.clear();for(const t of this.obstacles.values)if(t.solid!==!1){if(t.type==="circle"){const e=Math.ceil(t.radius),s=Math.floor(t.pos.x),i=Math.floor(t.pos.y);for(let r=-e;r<=e;r++)for(let a=-e;a<=e;a++){const o=s+r,n=i+a,c={x:o+.5,y:n+.5};v(c,t)&&this.blocked.add(d(o,n))}}else if(t.type==="rect"){const e=t.pos.x+t.size.x/2,s=t.pos.y+t.size.y/2,i=t.size.x/2,r=t.size.y/2,a=Math.sqrt(i*i+r*r),o=Math.floor(e-a),n=Math.ceil(e+a),c=Math.floor(s-a),h=Math.ceil(s+a);for(let p=o;p<=n;p++)for(let u=c;u<=h;u++){const f={x:p+.5,y:u+.5};w(f,t)&&this.blocked.add(d(p,u))}}else if(t.type==="polygon"){const e=M(t),s=Math.floor(e.minX),i=Math.ceil(e.maxX),r=Math.floor(e.minY),a=Math.ceil(e.maxY);for(let o=s;o<=i;o++)for(let n=r;n<=a;n++){const c={x:o+.5,y:n+.5};k(c,t)&&this.blocked.add(d(o,n))}}}}findPath(t,e){const s=x(t),i=x(e),r=`${d(s.x,s.y)}|${d(i.x,i.y)}`;this.obstacles.version!==this.pathCacheVersion&&(this.pathCache.clear(),this.pathCacheVersion=this.obstacles.version);const a=this.pathCache.get(r);if(a)return a;const o=this.astar.run(s,i,(n,c)=>!this.blocked.has(d(n,c))).map(O);return this.pathCache.set(r,o),o}}function T(l,t,e){if(t.solid===!1)return!1;if(t.type==="circle"){const s=l.intersectsCircle(t.pos.x,t.pos.y,t.radius);return s!==null&&s<=e}if(t.type==="rect"){if(!t.rotation){const h=l.intersectsAABB(t.pos.x,t.pos.y,t.pos.x+t.size.x,t.pos.y+t.size.y);return h!==null&&h<=e}const s=t.pos.x+t.size.x/2,i=t.pos.y+t.size.y/2,r=t.size.x/2,a=t.size.y/2,o=Math.cos(t.rotation),n=Math.sin(t.rotation),c=[[s+r*o-a*n,i+r*n+a*o],[s-r*o-a*n,i-r*n+a*o],[s-r*o+a*n,i-r*n-a*o],[s+r*o+a*n,i+r*n-a*o]];for(let h=0;h<4;h++){const[p,u]=c[h],[f,b]=c[(h+1)%4],y=l.intersectsSegment(p,u,f,b);if(y!==null&&y<=e)return!0}return!1}if(t.type==="polygon"){const s=t.points,i=t.rotation?Math.cos(t.rotation):1,r=t.rotation?Math.sin(t.rotation):0;for(let a=0;a<s.length;a++){const o=(a+1)%s.length;let n=s[a].x,c=s[a].y,h=s[o].x,p=s[o].y;if(t.rotation){const f=n*i-c*r;c=n*r+c*i,n=f;const b=h*i-p*r;p=h*r+p*i,h=b}n+=t.pos.x,c+=t.pos.y,h+=t.pos.x,p+=t.pos.y;const u=l.intersectsSegment(n,c,h,p);if(u!==null&&u<=e)return!0}return!1}return!1}class R{constructor(t){this.obstacles=t;this.astar=new P}rebuild(){}findPath(t,e){const s=e.x-t.x,i=e.y-t.y,r=Math.hypot(s,i);if(r>0){const a=new z;a.set(t.x,t.y,s,i);const o=this.obstacles.queryRay(a,r);for(const n of o){const c=this.obstacles.get(n);if(c&&T(a,c,r))return this.astar.run(x(t),x(e),(h,p)=>!this.obstacles.at({x:h+.5,y:p+.5})).map(O)}}return[t,e]}}class j{constructor(t,e){this.type=t;this.lastVersion=-1;this.pendingPaths=0;this.AUTO_WORKER_THRESHOLD=20;this.obstacles=new Y,this.options={workers:e?.workers??!1,workerPoolSize:e?.workerPoolSize??4,workerPath:e?.workerPath??"./navmesh.worker.js"},t==="grid"&&(this.grid=new C(this.obstacles)),t==="graph"&&(this.graph=new R(this.obstacles)),this.options.workers===!0&&this.initWorkerPool()}async initWorkerPool(){if(!this.workerPool)try{const{NavMeshWorkerPool:t}=await import("./navmesh-worker-pool");this.workerPool=new t(this.options.workerPoolSize,this.options.workerPath,this.type,this.obstacles.values),await this.workerPool.init()}catch(t){console.warn("Failed to initialize worker pool, falling back to sync:",t),this.options.workers=!1}}shouldUseWorkers(){return this.options.workers===!1?!1:this.options.workers===!0?!0:this.pendingPaths>=this.AUTO_WORKER_THRESHOLD}addObstacle(t){return this.obstacles.add(t)}moveObstacle(t,e){this.obstacles.move(t,e)}removeObstacle(t){this.obstacles.remove(t)}getObstacles(){return this.obstacles.values}findPath({from:t,to:e}){return this.shouldUseWorkers()&&this.workerPool?(this.pendingPaths++,this.findPathAsync(t,e).finally(()=>{this.pendingPaths--})):(this.rebuild(),this.type==="grid"?this.grid.findPath(t,e):this.graph.findPath(t,e))}async findPathAsync(t,e){return this.options.workers==="auto"&&!this.workerPool&&await this.initWorkerPool(),this.workerPool?this.workerPool.findPath(t,e):(this.rebuild(),this.type==="grid"?this.grid.findPath(t,e):this.graph.findPath(t,e))}rebuild(){this.lastVersion!==this.obstacles.version&&(this.grid?.rebuild(),this.graph?.rebuild(),this.lastVersion=this.obstacles.version)}dispose(){this.workerPool&&(this.workerPool.terminate(),this.workerPool=void 0)}getWorkerStatus(){return{workersEnabled:this.options.workers,workerPoolActive:!!this.workerPool,pendingPaths:this.pendingPaths,usingWorkersNow:this.shouldUseWorkers()}}}function W(l,t){const e=[t];let s=d(t.x,t.y);for(;l.has(s);)s=l.get(s),e.push(g(s));return e.reverse()}export{j as NavMesh};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{NavMesh as c}from"./navmesh";let s=null;self.onmessage=o=>{const e=o.data;try{switch(e.type){case"INIT":{if(s=new c(e.navType),e.obstacles)for(const t of e.obstacles)s.addObstacle(t);self.postMessage({type:"READY"});break}case"FIND_PATH":{if(!s)throw new Error("NavMesh not initialized");const t=performance.now(),a=s.findPath({from:e.from,to:e.to}),r=performance.now()-t,n={type:"PATH_RESULT",id:e.id,path:a,duration:r};self.postMessage(n);break}case"ADD_OBSTACLE":{if(!s)throw new Error("NavMesh not initialized");const a={type:"OBSTACLE_ADDED",obstacleId:s.addObstacle(e.obstacle)};self.postMessage(a);break}case"REMOVE_OBSTACLE":{if(!s)throw new Error("NavMesh not initialized");s.removeObstacle(e.obstacleId),self.postMessage({type:"OBSTACLE_REMOVED"});break}case"MOVE_OBSTACLE":{if(!s)throw new Error("NavMesh not initialized");s.moveObstacle(e.obstacleId,e.pos),self.postMessage({type:"OBSTACLE_MOVED"});break}}}catch(t){self.postMessage({type:"ERROR",error:t instanceof Error?t.message:String(t)})}};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export*from"./pooled-codec";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{BinaryCodec as T}from"../binary-codec";class b{constructor(e){this.factory=e;this.pool=[]}acquire(){return this.pool.pop()??this.factory()}release(e){this.pool.push(e)}releaseAll(e){this.pool.push(...e)}}class U{constructor(e){this.schema=e;this.pool=new b(()=>this.createNil())}createNil(){const e={};for(const t of Object.keys(this.schema)){const o=this.schema[t];e[t]="toNil"in o?o.toNil():void 0}return e}decode(e){const t=this.pool.acquire();return this.decodeInto(e,t),t}decodeInto(e,t){let o=0;for(const a of Object.keys(this.schema)){const s=this.schema[a];if("decodeAll"in s){const n=s.decodeAll(e.subarray(o));t[a]=n.value,o+=n.bytesRead}else if("decodeField"in s){const n=s.decodeField(e.subarray(o));t[a]=n.value,o+=n.bytesRead}else if("decode"in s){const n=s.decode(e.subarray(o));t[a]=n.value,o+=n.bytesRead}else{const n=s.size||0,i=e.subarray(o,o+n);T.decodeInto({[a]:s},i,t),o+=n}}}release(e){this.pool.release(e)}}class S{constructor(e){this.pooledDecoder=new U(e)}decodeAll(e){return e.map(t=>this.pooledDecoder.decode(t))}releaseAll(e){e.forEach(t=>this.pooledDecoder.release(t))}}class A{constructor(e,t=1024){this.schema=e;this.bufferSize=t;this.pool=new b(()=>new Uint8Array(t))}encode(e){const t=this.pool.acquire();let o=0;for(const a of Object.keys(this.schema)){const s=this.schema[a];if("encode"in s){const n=s.encode(e[a]);t.set(n,o),o+=n.length}else if("encodeAll"in s){const n=s.encodeAll(e[a]);let i=0;for(const r of n)t.set(r,o+i),i+=r.length;o+=i}else{const n=T.encode({[a]:s},{[a]:e[a]});t.set(n,o),o+=n.length}}return t.subarray(0,o)}release(e){this.pool.release(e)}}class O{constructor(e){this.schema=e;this.encoder=new A(e),this.decoder=new U(e)}calculateSize(e){let t=0;for(const o of Object.keys(this.schema)){const a=this.schema[o];"size"in a?t+=a.size:"calculateSize"in a&&(t+=a.calculateSize(e[o]))}return t}encodeInto(e,t,o){const a=new DataView(t.buffer,t.byteOffset);let s=o;for(const n of Object.keys(this.schema)){const i=this.schema[n];if("write"in i)i.write(a,s,e[n]),s+=i.size;else if("encodeInto"in i){const r=i.encodeInto(e[n],t,s);s+=r}else if("encode"in i){const r=i.encode(e[n]);t.set(r,s),s+=r.length}}return s-o}encode(e){return this.encoder.encode(e)}decode(e){return this.decoder.decode(e)}release(e){this.decoder.release(e)}static array(e){let t=0;for(const r of Object.keys(e)){const l=e[r];t+=l.size||0}const o=new b(()=>new Uint8Array(16384)),a=new b(()=>{const r={};for(const l of Object.keys(e)){const c=e[l];r[l]="toNil"in c?c.toNil():void 0}return r}),s=new b(()=>[]);let n=null,i=null;return{__arrayType:void 0,calculateSize(r){return 2+r.length*t},encodeInto(r,l,c){const d=new DataView(l.buffer,l.byteOffset);d.setUint16(c,r.length,!1);let y=c+2;for(const h of r)for(const f of Object.keys(e)){const u=e[f];u.write(d,y,h[f]),y+=u.size}return y-c},encode(r){const l=2+r.length*t;let c=o.acquire();c.length<l&&(o.release(c),c=new Uint8Array(Math.max(l,c.length*2))),(!n||n.buffer!==c.buffer)&&(n=new DataView(c.buffer,c.byteOffset)),n.setUint16(0,r.length,!1);let d=2;for(const h of r)for(const f of Object.keys(e)){const u=e[f];u.write(n,d,h[f]),d+=u.size}const y=new Uint8Array(d);return y.set(c.subarray(0,d)),o.release(c),y},decodeField(r){const l=r[0]<<8|r[1],c=s.acquire();c.length=l,(!i||i.buffer!==r.buffer||i.byteOffset!==r.byteOffset)&&(i=new DataView(r.buffer,r.byteOffset));let d=2;for(let y=0;y<l;y++){const h=a.acquire();for(const f of Object.keys(e)){const u=e[f];h[f]=u.read(i,d),d+=u.size}c[y]=h}return{value:c,bytesRead:d}},decode(r){return this.decodeField(r).value},toNil(){return[]}}}}export{b as ObjectPool,S as PooledArrayDecoder,O as PooledCodec,U as PooledDecoder,A as PooledEncoder};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export*from"./prediction";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
class s{constructor(){this.tracker=new Map}get size(){return this.tracker.size}track(t,r){return this.tracker.has(t)||this.tracker.set(t,[]),this.tracker.get(t).push(r),r}dropUpTo(t){const r=[];for(const[e,n]of this.tracker)e<=t?this.tracker.delete(e):r.push([e,n]);return r.sort(([e],[n])=>e-n),r.map(([e,n])=>n).flat()}values(){return Array.from(this.tracker.entries()).sort(([t],[r])=>t-r).map(([t,r])=>r).flat()}}class o{constructor(t){this.options=t;this.tracker=new s}trackIntent(t,r){this.tracker.track(t,r)}onSnapshot(t){this.options.onLoadState(t.state);const r=this.tracker.dropUpTo(t.tick);r.length>0&&this.options.onReplay(r)}replay(t){this.options.onReplay(t)}}export{s as IntentTracker,o as Reconciliator};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export*from"./ray-2d";export*from"./ray-3d";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
class g{constructor(){this.origin=[0,0];this.direction=[1,0];this._point=[0,0]}set(e,c,o,s){this.origin[0]=e,this.origin[1]=c;const i=Math.sqrt(o*o+s*s);i>0&&(this.direction[0]=o/i,this.direction[1]=s/i)}at(e){return this._point[0]=this.origin[0]+this.direction[0]*e,this._point[1]=this.origin[1]+this.direction[1]*e,this._point}intersectsSegment(e,c,o,s){const i=this.direction[0],n=this.direction[1],u=o-e,r=s-c,t=i*r-n*u;if(Math.abs(t)<1e-10)return null;const h=e-this.origin[0],b=c-this.origin[1],l=(h*r-b*u)/t,m=(h*n-b*i)/t;return l<0||m<0||m>1?null:l}intersectsCircle(e,c,o){const s=this.origin[0]-e,i=this.origin[1]-c,n=2*(s*this.direction[0]+i*this.direction[1]),u=s*s+i*i-o*o,r=n*n-4*u;if(r<0)return null;const t=Math.sqrt(r),h=(-n-t)/2,b=(-n+t)/2;return h>=0?h:b>=0?b:null}intersectsAABB(e,c,o,s){let i=-1/0,n=1/0;if(Math.abs(this.direction[0])<1e-10){if(this.origin[0]<e||this.origin[0]>o)return null}else{const u=1/this.direction[0];let r=(e-this.origin[0])*u,t=(o-this.origin[0])*u;if(r>t){const h=r;r=t,t=h}i=Math.max(i,r),n=Math.min(n,t)}if(Math.abs(this.direction[1])<1e-10){if(this.origin[1]<c||this.origin[1]>s)return null}else{const u=1/this.direction[1];let r=(c-this.origin[1])*u,t=(s-this.origin[1])*u;if(r>t){const h=r;r=t,t=h}i=Math.max(i,r),n=Math.min(n,t)}return i>n||n<0?null:i>=0?i:n}}export{g as Ray2D};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
class j{constructor(){this.origin=[0,0,0];this.direction=[0,0,1];this._point=[0,0,0]}set(n,e,s,o,t,r){this.origin[0]=n,this.origin[1]=e,this.origin[2]=s;const i=Math.sqrt(o*o+t*t+r*r);i>0&&(this.direction[0]=o/i,this.direction[1]=t/i,this.direction[2]=r/i)}at(n){return this._point[0]=this.origin[0]+this.direction[0]*n,this._point[1]=this.origin[1]+this.direction[1]*n,this._point[2]=this.origin[2]+this.direction[2]*n,this._point}intersectsPlane(n,e,s,o){const t=n*this.direction[0]+e*this.direction[1]+s*this.direction[2];if(Math.abs(t)<1e-10)return null;const r=(o-(n*this.origin[0]+e*this.origin[1]+s*this.origin[2]))/t;return r>=0?r:null}intersectsSphere(n,e,s,o){const t=this.origin[0]-n,r=this.origin[1]-e,i=this.origin[2]-s,u=2*(t*this.direction[0]+r*this.direction[1]+i*this.direction[2]),g=t*t+r*r+i*i-o*o,m=u*u-4*g;if(m<0)return null;const c=Math.sqrt(m),b=(-u-c)/2,h=(-u+c)/2;return b>=0?b:h>=0?h:null}intersectsAABB(n,e,s,o,t,r){let i=-1/0,u=1/0;const g=[[this.direction[0],this.origin[0],n,o,0],[this.direction[1],this.origin[1],e,t,1],[this.direction[2],this.origin[2],s,r,2]];for(const[m,c,b,h]of g){if(Math.abs(m)<1e-10){if(c<b||c>h)return null}else{const d=1/m;let l=(b-c)*d,f=(h-c)*d;if(l>f){const a=l;l=f,f=a}i=Math.max(i,l),u=Math.min(u,f)}if(i>u)return null}return u<0?null:i>=0?i:u}intersectsTriangle(n,e,s,o,t,r,i,u,g){const m=o-n,c=t-e,b=r-s,h=i-n,d=u-e,l=g-s,f=this.direction[0],a=this.direction[1],p=this.direction[2],v=a*l-p*d,z=p*h-f*l,A=f*d-a*h,B=m*v+c*z+b*A;if(Math.abs(B)<1e-10)return null;const M=1/B,x=this.origin[0]-n,q=this.origin[1]-e,y=this.origin[2]-s,_=M*(x*v+q*z+y*A);if(_<0||_>1)return null;const D=q*b-y*c,I=y*m-x*b,P=x*c-q*m,R=M*(f*D+a*I+p*P);if(R<0||_+R>1)return null;const S=M*(h*D+d*I+l*P);return S>=0?S:null}}export{j as Ray3D};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export*from"./simple-rng";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
class s{constructor(t){this.state=(t??Math.random()*2147483647)|0,this.state===0&&(this.state=1)}rand(){return this.state=this.state*1664525+1013904223&2147483647,this.state/2147483647}range(t,e){return t+this.rand()*(e-t)}int(t,e){return t+(this.rand()*(e-t+1)|0)}chance(t){return this.rand()<t}pick(t){return t[this.rand()*t.length|0]}seed(t){this.state=t|0,this.state===0&&(this.state=1)}}export{s as SimpleRNG};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export*from"./sparse-batcher";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
class n{constructor(i){this.BUCKET_INITIAL_SIZE=256;this.buckets=new Map;this.bucketSizes=new Uint32Array(n.MAX_BUCKETS);this.activeBuckets=new Uint16Array(n.MAX_BUCKETS);this.sortBuffer=new Uint16Array(n.MAX_BUCKETS);this.activeCount=0;this.capacity=i}static{this.MAX_LAYERS=256}static{this.MAX_SHEETS=64}static{this.MAX_BUCKETS=n.MAX_LAYERS*n.MAX_SHEETS}key(i,e){return i*n.MAX_SHEETS+e}add(i,e,r){const t=this.key(i,e);this.buckets.has(t)||(this.buckets.set(t,new Uint32Array(this.BUCKET_INITIAL_SIZE)),this.activeBuckets[this.activeCount++]=t);const u=this.buckets.get(t);if(this.bucketSizes[t]>=u.length){const s=new Uint32Array(u.length*2);s.set(u),this.buckets.set(t,s)}this.buckets.get(t)[this.bucketSizes[t]++]=r}remove(i,e,r){const t=this.key(i,e),u=this.bucketSizes[t];if(u===0)return;const c=this.buckets.get(t);for(let s=0;s<u;s++)if(c[s]===r){c[s]=c[u-1],this.bucketSizes[t]--;break}if(this.bucketSizes[t]===0){for(let s=0;s<this.activeCount;s++)if(this.activeBuckets[s]===t){this.activeBuckets[s]=this.activeBuckets[--this.activeCount];break}}}each(i){this.sortBuffer.set(this.activeBuckets.subarray(0,this.activeCount));for(let e=1;e<this.activeCount;e++){const r=this.sortBuffer[e];let t=e-1;for(;t>=0&&this.sortBuffer[t]>r;)this.sortBuffer[t+1]=this.sortBuffer[t--];this.sortBuffer[t+1]=r}for(let e=0;e<this.activeCount;e++){const r=this.sortBuffer[e],t=r%n.MAX_SHEETS,u=this.bucketSizes[r];i(t,this.buckets.get(r).subarray(0,u),u)}}getActiveCount(){return this.activeCount}getTotalCount(){let i=0;for(let e=0;e<this.activeCount;e++)i+=this.bucketSizes[this.activeBuckets[e]];return i}clear(){this.buckets.clear(),this.bucketSizes.fill(0),this.activeCount=0}}export{n as SparseBatcher};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
class l{constructor(e,s){this.component=e,this.maxEntities=s,this.stride=e.size,this.fieldKeys=e.fieldNames,this.fields=[],this.fieldIndexMap={},this.arrays=[];for(let r=0;r<this.fieldKeys.length;r++){const a=this.fieldKeys[r],i=e.schema[a];switch(this.fields.push(i),this.fieldIndexMap[a]=r,i.size){case 4:i.read.toString().includes("getFloat32")?this.arrays.push(new Float32Array(s)):i.read.toString().includes("getInt32")?this.arrays.push(new Int32Array(s)):this.arrays.push(new Uint32Array(s));break;case 2:this.arrays.push(new Uint16Array(s));break;case 1:this.arrays.push(new Uint8Array(s));break;default:this.arrays.push(new Uint8Array(s*i.size))}}this.reusableObject={};for(let r=0;r<this.fieldKeys.length;r++)this.reusableObject[this.fieldKeys[r]]=this.fields[r].toNil()}get(e){const s=this.fields.length;if(s===2)this.reusableObject[this.fieldKeys[0]]=this.arrays[0][e],this.reusableObject[this.fieldKeys[1]]=this.arrays[1][e];else if(s===3)this.reusableObject[this.fieldKeys[0]]=this.arrays[0][e],this.reusableObject[this.fieldKeys[1]]=this.arrays[1][e],this.reusableObject[this.fieldKeys[2]]=this.arrays[2][e];else if(s===4)this.reusableObject[this.fieldKeys[0]]=this.arrays[0][e],this.reusableObject[this.fieldKeys[1]]=this.arrays[1][e],this.reusableObject[this.fieldKeys[2]]=this.arrays[2][e],this.reusableObject[this.fieldKeys[3]]=this.arrays[3][e];else for(let r=0;r<s;r++)this.reusableObject[this.fieldKeys[r]]=this.arrays[r][e];return this.reusableObject}getMutable(e){const s={};return this.copyTo(e,s),s}copyTo(e,s){for(let r=0;r<this.fields.length;r++)s[this.fieldKeys[r]]=this.arrays[r][e]}set(e,s){const r=this.fields.length;if(r===2)this.arrays[0][e]=s[this.fieldKeys[0]],this.arrays[1][e]=s[this.fieldKeys[1]];else if(r===3)this.arrays[0][e]=s[this.fieldKeys[0]],this.arrays[1][e]=s[this.fieldKeys[1]],this.arrays[2][e]=s[this.fieldKeys[2]];else if(r===4)this.arrays[0][e]=s[this.fieldKeys[0]],this.arrays[1][e]=s[this.fieldKeys[1]],this.arrays[2][e]=s[this.fieldKeys[2]],this.arrays[3][e]=s[this.fieldKeys[3]];else for(let a=0;a<r;a++)this.arrays[a][e]=s[this.fieldKeys[a]]}update(e,s){for(const r in s){const a=this.fieldIndexMap[r];this.arrays[a][e]=s[r]}}clear(e){for(let s=0;s<this.fields.length;s++)this.arrays[s][e]=this.fields[s].toNil()}getRawArrays(){return this.arrays}getFieldArray(e){const s=this.fieldIndexMap[e];return this.arrays[s]}getStride(){return this.stride}}export{l as ComponentStore};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{PooledCodec as c}from"../core/pooled-codec";function i(n){let e=0;for(const o of Object.keys(n))e+=n[o].size;return e}function p(n,e){const o=i(e),t=Object.keys(e),r=t.length,a=c.array(e);return{name:n,schema:e,size:o,fieldCount:r,fieldNames:t,arrayCodec:a}}export{p as defineComponent};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
class s{constructor(t,e){this.world=t;this._id=e;this.isBatching=!1}static{this.batchArrays=[]}static{this.batchIndices=[]}static{this.batchValues=[]}static{this.batchLength=0}static{this.preparedComponents=[]}static{this.preparedCount=0}_reset(t){this._id=t}getComponentIndex(t){let e=t.__cachedIndex;return e===void 0&&(e=t.__worldIndex,t.__cachedIndex=e),e}field(t,e){const n=`__fieldCache_${String(e)}`;let r=t[n];if(r===void 0){const i=this.getComponentIndex(t);r=this.world.componentStoresArray[i].getFieldArray(e),t[n]=r}return r}add(t,e){return this.world.add(this._id,t,e),this}get(t){if(this.isBatching){const n=t.__batchCache;if(n!==void 0)return n}const e=this.getComponentIndex(t);return this.world.componentStoresArray[e].get(this._id)}prepare(...t){if(this.isBatching){const e=s.preparedComponents;let n=s.preparedCount;for(let r=0;r<t.length;r++){const i=t[r],a=this.getComponentIndex(i),o=this.world.componentStoresArray[a].get(this._id);i.__batchCache=o,n<e.length?e[n]=i:e.push(i),n++}s.preparedCount=n}return this}update(t,e){const n=this.getComponentIndex(t);return this.world.componentStoresArray[n].update(this._id,e),this}setFields(t,e){const n=this.getComponentIndex(t),r=this.world.componentStoresArray[n],i=r.getMutable(this._id);return e(i),r.set(this._id,i),this}setField(t,e,n){const r=this.getComponentIndex(t),a=this.world.componentStoresArray[r].getFieldArray(e);if(this.isBatching){const o=s.batchLength;s.batchArrays[o]=a,s.batchIndices[o]=this._id,s.batchValues[o]=n,s.batchLength++}else a[this._id]=n;return this}getField(t,e){const n=this.getComponentIndex(t);return this.world.componentStoresArray[n].getFieldArray(e)[this._id]}set(t,e){const n=this.getComponentIndex(t);return this.world.componentStoresArray[n].set(this._id,e),this}has(t){return this.world.has(this._id,t)}remove(t){return this.world.remove(this._id,t),this}despawn(){this.world.despawn(this._id)}isAlive(){return this.world.isAlive(this._id)}get id(){return this._id}getMutable(t){const e=this.getComponentIndex(t);return this.world.componentStoresArray[e].getMutable(this._id)}beginUpdate(){return this.isBatching=!0,s.batchLength=0,this}flush(){const t=s.batchArrays,e=s.batchIndices,n=s.batchValues,r=s.batchLength;for(let o=0;o<r;o++)t[o][e[o]]=n[o];const i=s.preparedComponents,a=s.preparedCount;for(let o=0;o<a;o++){const h=i[o];h.__batchCache=void 0}return this.isBatching=!1,s.batchLength=0,s.preparedCount=0,this}}export{s as EntityHandle};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{defineComponent as t}from"./component";import{ComponentStore as p}from"./component-store";import{World as m}from"./world";import{EntityHandle as f}from"./entity-handle";export{p as ComponentStore,f as EntityHandle,m as World,t as defineComponent};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
class y{constructor(t,n,s,r,e){this.world=t;this.components=n;this.fieldMappings=s;this.userCallback=r;this.conditionPredicate=e}query(...t){return new y(this.world,t,this.fieldMappings,this.userCallback,this.conditionPredicate)}fields(t){return new y(this.world,this.components,t,this.userCallback,this.conditionPredicate)}when(t){if(!this.fieldMappings)throw new Error("Must call .fields() before .when()");const n={};for(let e=0;e<this.components.length;e++){const o=this.components[e],i=this.fieldMappings[e];if(!i)continue;const a=Object.keys(i)[0],x=i[a];for(const f of x){const m=`${a}_${f}`,d=this.world.getFieldArray(o,f);n[m]=d}}const s={eid:0};for(const e in n){const o=n[e];Object.defineProperty(s,e,{get(){return o[this.eid]},set(i){o[this.eid]=i},enumerable:!0,configurable:!1}),s[`${e}_array`]=o}Object.seal(s);const r=t;return new y(this.world,this.components,this.fieldMappings,this.userCallback,r)}run(t){return new y(this.world,this.components,this.fieldMappings,t,this.conditionPredicate).buildAndRegister()}buildAndRegister(){if(!this.userCallback)throw new Error("System callback must be set");if(!this.fieldMappings)throw new Error("Field mappings must be set");const t=this.world,n=this.components,s=this.fieldMappings,r=this.userCallback,e={},o={},i=[];for(let d=0;d<n.length;d++){const p=n[d],l=s[d];if(!l)continue;const c=Object.keys(l)[0],g=l[c];i.push(c),o[c]=p,e[c]={};for(const u of g){const C=t.getFieldArray(p,u);e[c][u]=C}}const a=[];for(const d of i){const p=e[d];for(const l in p)a.push({prop:`${d}_${l}`,array:p[l]})}t.query(...n);const x=t._getQueryMaskKey(n),f=t.getQueryMask(n),m=new h(t,n,r,a,x,f,this.conditionPredicate);return t._registerSystem(m),m}}class h{constructor(t,n,s,r,e,o,i){this.world=t;this.components=n;this.userCallback=s;this.fieldDescs=r;this.queryMaskKey=e;this.queryMask=o;this.conditionPredicate=i;this.proxyEntity=this.createProxyEntity()}execute(t){const n=this.world._queryByMaskKey(this.queryMaskKey,this.queryMask),s=this.userCallback,r=this.world,e=this.proxyEntity,o=n.length;if(this.conditionPredicate){const i=this.conditionPredicate;for(let a=0;a<o;a++)e.eid=n[a],i(e)&&s(e,t,r)}else for(let i=0;i<o;i++)e.eid=n[i],s(e,t,r)}createProxyEntity(){const t=this.world,n={eid:0,despawn(){t.despawn(this.eid)}};for(let s=0;s<this.fieldDescs.length;s++){const{prop:r,array:e}=this.fieldDescs[s];n[`${r}_array`]=e,Object.defineProperty(n,r,{get(){return e[this.eid]},set(o){e[this.eid]=o},enumerable:!0,configurable:!1})}return Object.seal(n),Object.preventExtensions(n),n}getComponents(){return this.components}}export{h as ExecutableSystem,y as SystemBuilder};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{SystemBuilder as t}from"./system-builder";class S{constructor(){this.registeredSystems=[]}addSystem(){return new t(this,[],void 0,void 0)}runSystems(e){for(let s=0;s<this.registeredSystems.length;s++)this.registeredSystems[s].execute(e)}_registerSystem(e){this.registeredSystems.push(e)}}export{S as WorldSystems};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{generateId as E}from"../core/generate-id";import{ComponentStore as v}from"./component-store";import{EntityHandle as C}from"./entity-handle";import{WorldSystems as g}from"./world-systems";class B extends g{constructor(t){super();this.nextEntityId=0;this.freeEntityHead=0;this.freeEntityTail=0;this.freeEntityCount=0;this.freeEntityMask=0;this.aliveEntitiesArray=[];this.numMaskWords=0;this.components=[];this.queryResultBuffers={};this.archetypeVersion=0;this.queryCacheVersions={};this.queryMaskCache={};this.despawnedCount=0;this.worldId=E({prefix:"world_"});this.maxEntities=t.maxEntities??1e4,this.numMaskWords=Math.ceil(t.components.length/32),this.componentMasks=[];for(let n=0;n<this.numMaskWords;n++)this.componentMasks.push(new Uint32Array(this.maxEntities));this.numMaskWords>0&&(this.componentMasks0=this.componentMasks[0]);const e=Math.pow(2,Math.ceil(Math.log2(this.maxEntities)));this.freeEntityIds=new Uint32Array(e),this.freeEntityMask=e-1,this.aliveEntitiesIndices=new Uint32Array(this.maxEntities),this.aliveEntityFlags=new Uint8Array(this.maxEntities),this.despawnedBuffer=new Uint32Array(this.maxEntities),this.componentStoresArray=new Array(t.components.length),t.components.forEach((n,s)=>{this.components.push(n),n.__worldIndex=s;const c=new v(n,this.maxEntities);this.componentStoresArray[s]=c})}getComponentIndex(t){const e=t.__worldIndex;if(e===void 0){const n=this.components.map(s=>s.name).join(", ");throw new Error(`Component ${t.name} not registered in World[${this.worldId}]. Registered components: [${n}]. Did you forget to include it in the WorldConfig?`)}return e}setComponentBit(t,e){const n=e>>>5,s=e&31;this.componentMasks[n][t]|=1<<s}clearComponentBit(t,e){const n=e>>>5,s=e&31;this.componentMasks[n][t]&=~(1<<s)}hasComponentBit(t,e){const n=e>>>5,s=e&31;return(this.componentMasks[n][t]&1<<s)!==0}clearAllComponentBits(t){if(this.numMaskWords===1)this.componentMasks0[t]=0;else if(this.numMaskWords===2)this.componentMasks0[t]=0,this.componentMasks[1][t]=0;else if(this.numMaskWords===3)this.componentMasks0[t]=0,this.componentMasks[1][t]=0,this.componentMasks[2][t]=0;else for(let e=0;e<this.numMaskWords;e++)this.componentMasks[e][t]=0}matchesComponentMask(t,e){const n=e.length;if(n===1)return(this.componentMasks0[t]&e[0])===e[0];if(n===2)return(this.componentMasks0[t]&e[0])===e[0]&&(this.componentMasks[1][t]&e[1])===e[1];if(n===3)return(this.componentMasks0[t]&e[0])===e[0]&&(this.componentMasks[1][t]&e[1])===e[1]&&(this.componentMasks[2][t]&e[2])===e[2];if(n===4)return(this.componentMasks0[t]&e[0])===e[0]&&(this.componentMasks[1][t]&e[1])===e[1]&&(this.componentMasks[2][t]&e[2])===e[2]&&(this.componentMasks[3][t]&e[3])===e[3];for(let s=0;s<n;s++)if((this.componentMasks[s][t]&e[s])!==e[s])return!1;return!0}getQueryMask(t){const e=t.map(i=>i.name).sort().join(","),n=this.queryMaskCache[e];if(n)return n;let s=-1;const c=[];for(const i of t){const o=i.__worldIndex;if(o===void 0)return null;c.push(o),o>s&&(s=o)}const h=Math.floor(s/32)+1,p=new Array(h).fill(0);for(const i of c){const o=i>>>5,r=i&31;p[o]|=1<<r}return this.queryMaskCache[e]=p,p}maskToKey(t){let e="";for(let n=0;n<t.length;n++)t[n]!==0&&(e+=`${n}:${t[n].toString(36)},`);return e}_getQueryMaskKey(t){const e=this.getQueryMask(t);return e?this.maskToKey(e):""}_queryByMaskKey(t,e){let n=this.queryResultBuffers[t];if(n||(n=[],this.queryResultBuffers[t]=n),this.queryCacheVersions[t]===this.archetypeVersion)return n;const s=this.aliveEntitiesArray,c=s.length,h=e.length;let p=0;if(h===1){const i=e[0],o=this.componentMasks0;for(let r=0;r<c;r++){const a=s[r];(o[a]&i)===i&&(n[p++]=a)}}else if(h===2){const i=e[0],o=e[1],r=this.componentMasks0,a=this.componentMasks[1];for(let m=0;m<c;m++){const l=s[m];(r[l]&i)===i&&(a[l]&o)===o&&(n[p++]=l)}}else if(h===3){const i=e[0],o=e[1],r=e[2],a=this.componentMasks0,m=this.componentMasks[1],l=this.componentMasks[2];for(let y=0;y<c;y++){const d=s[y];(a[d]&i)===i&&(m[d]&o)===o&&(l[d]&r)===r&&(n[p++]=d)}}else if(h===4){const i=e[0],o=e[1],r=e[2],a=e[3],m=this.componentMasks0,l=this.componentMasks[1],y=this.componentMasks[2],d=this.componentMasks[3];for(let f=0;f<c;f++){const u=s[f];(m[u]&i)===i&&(l[u]&o)===o&&(y[u]&r)===r&&(d[u]&a)===a&&(n[p++]=u)}}else{const i=this.componentMasks;t:for(let o=0;o<c;o++){const r=s[o];for(let a=0;a<h;a++)if((i[a][r]&e[a])!==e[a])continue t;n[p++]=r}}return n.length=p,this.queryCacheVersions[t]=this.archetypeVersion,n}spawn(){let t=this.nextEntityId;if(this.freeEntityCount>0?(t=this.freeEntityIds[this.freeEntityTail],this.freeEntityTail=this.freeEntityTail+1&this.freeEntityMask,this.freeEntityCount--):this.nextEntityId++,t>=this.maxEntities)throw new Error(`Maximum entities (${this.maxEntities}) reached. Current alive: ${this.aliveEntitiesArray.length}, Free list: ${this.freeEntityCount}`);return this.aliveEntityFlags[t]=1,this.aliveEntitiesIndices[t]=this.aliveEntitiesArray.length,this.aliveEntitiesArray.push(t),this.clearAllComponentBits(t),this.invalidateQueryCache(),t}despawn(t){if(this.aliveEntityFlags[t]===0)return;this.despawnedBuffer[this.despawnedCount++]=t,this.aliveEntityFlags[t]=0;const e=this.aliveEntitiesIndices[t],n=this.aliveEntitiesArray.length-1;if(e!==n){const h=this.aliveEntitiesArray[n];this.aliveEntitiesArray[e]=h,this.aliveEntitiesIndices[h]=e}this.aliveEntitiesArray.pop();const s=this.componentStoresArray,c=this.components.length;for(let h=0;h<c;h++)this.hasComponentBit(t,h)&&s[h].clear(t);this.clearAllComponentBits(t),this.freeEntityIds[this.freeEntityHead]=t,this.freeEntityHead=this.freeEntityHead+1&this.freeEntityMask,this.freeEntityCount++,this.invalidateQueryCache()}isAlive(t){return this.aliveEntityFlags[t]===1}getDespawned(){return this.despawnedBuffer.subarray(0,this.despawnedCount)}flushDespawned(){this.despawnedCount=0}invalidateQueryCache(){this.archetypeVersion++}add(t,e,n){if(this.aliveEntityFlags[t]===0)throw new Error(`Cannot add component ${e.name} to entity ${t}: entity is not alive (was it despawned?). Current alive entities: ${this.aliveEntitiesArray.length}`);const s=this.getComponentIndex(e),c=this.componentStoresArray[s];this.setComponentBit(t,s),c.set(t,n),this.invalidateQueryCache()}remove(t,e){const n=e.__worldIndex;if(n===void 0)return;this.clearComponentBit(t,n);const s=this.componentStoresArray[n];s&&s.clear(t),this.invalidateQueryCache()}has(t,e){const n=e.__worldIndex;return n===void 0?!1:this.hasComponentBit(t,n)}get(t,e){const n=this.getComponentIndex(e);if(!this.hasComponentBit(t,n)){const s=this.getEntityComponentNames(t);throw new Error(`Cannot get component ${e.name} from entity ${t}: entity does not have this component. Entity has: [${s.join(", ")}]. Did you forget to call world.add()?`)}return this.componentStoresArray[n].get(t)}getMutable(t,e){const n=this.getComponentIndex(e);if(!this.hasComponentBit(t,n))throw new Error(`Entity ${t} does not have component ${e.name}`);return this.componentStoresArray[n].getMutable(t)}set(t,e,n){const s=this.getComponentIndex(e);if(!this.hasComponentBit(t,s))throw new Error(`Cannot set component ${e.name} on entity ${t}: entity does not have this component. Use add() first.`);this.componentStoresArray[s].set(t,n)}update(t,e,n){const s=this.getComponentIndex(e);if(!this.hasComponentBit(t,s))throw new Error(`Entity ${t} does not have component ${e.name}`);this.componentStoresArray[s].update(t,n)}query(...t){const e=this.getQueryMask(t);if(e===null)return[];const n=this.maskToKey(e);let s=this.queryResultBuffers[n];if(s||(s=[],this.queryResultBuffers[n]=s),this.queryCacheVersions[n]===this.archetypeVersion)return s;const c=this.aliveEntitiesArray,h=c.length,p=e.length;let i=0;if(p===1){const o=e[0],r=this.componentMasks0;for(let a=0;a<h;a++){const m=c[a];(r[m]&o)===o&&(s[i++]=m)}}else for(let o=0;o<h;o++){const r=c[o];this.matchesComponentMask(r,e)&&(s[i++]=r)}return s.length=i,this.queryCacheVersions[n]=this.archetypeVersion,s}getEntities(){return this.aliveEntitiesArray}getEntityCount(){return this.aliveEntitiesArray.length}getMaxEntities(){return this.maxEntities}getComponents(){return this.components}getEntityComponentNames(t){const e=[];for(let n=0;n<this.components.length;n++)this.hasComponentBit(t,n)&&e.push(this.components[n].name);return e}serialize(t,e){const n=e??Array.from(this.aliveEntitiesArray),s=[];for(const i of t){const o=i.__worldIndex;if(o===void 0)continue;const r=this.componentStoresArray[o];if(!r)continue;const a=[];for(const m of n)this.has(m,i)&&a.push({entity:m,...r.getMutable(m)});if(a.length>0){const m=i.arrayCodec.encode(a);s.push(m)}}const c=s.reduce((i,o)=>i+o.length,0),h=new Uint8Array(c);let p=0;for(const i of s)h.set(i,p),p+=i.length;return h}deserialize(t,e){throw new Error("Deserialization not yet implemented")}getFieldArray(t,e){const n=this.getComponentIndex(t);return this.componentStoresArray[n].getFieldArray(e)}entity(t){return new C(this,t)}}export{B as World};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export*from"./loop";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export*from"./loop";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{createDriver as d,EventSystem as T,FixedTicker as _}from"../../core";import{InputManager as y,BrowserInputSource as E}from"../../core/input";class C{constructor(e){this.options=e;this.fps=0;this.status="stopped";this._tickData={deltaTime:0,tick:0,input:null};this._skipData={ticks:0};this._renderData={deltaTime:0,alpha:0,input:null};const a=new Set(["client","manual-client"]),r=new Set(["manual-client","manual-server"]);this._isClient=a.has(this.options.type),this._isManual=r.has(this.options.type);const c=["pre-tick","tick","post-tick","skip","start","stop","toggle-pause"];this._isClient&&c.push("render"),this.events=new T({events:c}),this._input=new y;const p=this.events;if(this.ticker=new _({rate:this.options.tickRate,onTick:(t,s=0)=>{const i=this._input.snapshot();this._tickData.deltaTime=t,this._tickData.tick=s,this._tickData.input=i,p.emit("pre-tick",this._tickData),this.options.onTick?.(t,s,i),p.emit("tick",this._tickData),p.emit("post-tick",this._tickData)},onTickSkipped:t=>{this._skipData.ticks=t,p.emit("skip",this._skipData)}}),this._isManual||(this._driver=d(this.options.type,t=>{this.step(t)})),this._isClient){const t=this.events,s=Math.round(this.options.tickRate/2),i=new Array(s).fill(0);let u=0,h=performance.now(),l=0,o=0;t.on("tick",()=>{l=(l+1)%s;const m=performance.now(),v=m-h;if(v>0){const n=u*1e3/v;i[l]=n,o<s&&o++}u=0,h=m;let k=0;for(let n=0;n<o;n++)k+=i[n];this.fps=Math.round(k/o)}),t.on("render",()=>{u++})}}step(e){if(this.ticker.tick(e),this._isClient){const a=this._input.peek(),r=this.ticker.alpha;this.options.onRender?.(e,r,a),this._renderData.deltaTime=e,this._renderData.alpha=r,this._renderData.input=a,this.events.emit("render",this._renderData)}}pause(){this._driver&&this._driver.stop(),this.status="paused",this.events.emit("toggle-pause",{paused:!0,lastToggledAt:Date.now(),lastToggleTick:this.ticker.tickCount})}resume(){this._driver&&this._driver.start(),this.status="running",this.events.emit("toggle-pause",{paused:!1,lastToggledAt:Date.now(),lastToggleTick:this.ticker.tickCount})}start(){if(this._driver&&this._driver.start(),this.status="running",this.events.emit("start",{startedAt:Date.now()}),this._isClient){const e=new E(document,document.body);this._input.listen(e)}}stop(){this._driver&&this._driver.stop(),this.ticker.resetTickCount(),this.status="stopped",this.events.emit("stop",{stoppedAt:Date.now()}),this._isClient&&this._input.unlisten()}}export{C as GameLoop};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export*from"./core";export*from"./protocol";export*from"./net";export*from"./ecs";export*from"./game";export*from"./renderer";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
class i{constructor(e){this.openHandler=null;this.messageHandler=null;this.closeHandler=null;this.errorHandler=null;this.isOpen=!1;this.pendingMessages=[];this.ws=new WebSocket(e),this.ws.binaryType="arraybuffer",this.ws.onopen=()=>{this.isOpen=!0;for(const s of this.pendingMessages)this.ws.send(s);this.pendingMessages=[],this.openHandler&&this.openHandler()},this.ws.onmessage=s=>{this.messageHandler&&s.data instanceof ArrayBuffer&&this.messageHandler(new Uint8Array(s.data))},this.ws.onclose=()=>{this.isOpen=!1,this.closeHandler&&this.closeHandler()},this.ws.onerror=()=>{this.errorHandler&&this.errorHandler(new Error("WebSocket error"))}}send(e){this.isOpen&&this.ws.readyState===WebSocket.OPEN?this.ws.send(e):this.ws.readyState===WebSocket.CONNECTING&&this.pendingMessages.push(e)}onMessage(e){this.messageHandler=e}onOpen(e){this.openHandler=e}onClose(e){this.closeHandler=e}onError(e){this.errorHandler=e}close(){this.ws.close()}}export{i as BrowserWebSocketClientTransport};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{generateId as c}from"../../core/generate-id/generate-id";class a{constructor(e){this.messageHandlers=[];this.closeHandlers=[];this.errorHandlers=[];this.socket=e,this.setupHandlers()}send(e){this.socket.readyState===WebSocket.OPEN&&this.socket.send(e)}onMessage(e){this.messageHandlers.push(e)}onClose(e){this.closeHandlers.push(e)}onError(e){this.errorHandlers.push(e)}close(){this.socket.close()}setupHandlers(){this.socket.binaryType="arraybuffer",this.socket.addEventListener("message",e=>{if(e.data instanceof ArrayBuffer){const r=new Uint8Array(e.data);for(const t of this.messageHandlers)t(r)}else{const r=new Error(`Unexpected message type: ${typeof e.data}`);for(const t of this.errorHandlers)t(r)}}),this.socket.addEventListener("close",()=>{for(const e of this.closeHandlers)e()}),this.socket.addEventListener("error",()=>{const e=new Error("WebSocket error");for(const r of this.errorHandlers)r(e)})}static connect(e){return new Promise((r,t)=>{const o=new WebSocket(e),s=new a(o);o.addEventListener("open",()=>{r(s)}),o.addEventListener("error",n=>{t(n)})})}}class p{constructor(e){this.messageHandlers=[];this.closeHandlers=[];this.errorHandlers=[];this.socket=e}send(e){this.socket.send(e)}onMessage(e){this.messageHandlers.push(e)}onClose(e){this.closeHandlers.push(e)}onError(e){this.errorHandlers.push(e)}close(){this.socket.close()}_handleOpen(){}_handleMessage(e){for(const r of this.messageHandlers)r(e)}_handleClose(){for(const e of this.closeHandlers)e()}_handleError(e){for(const r of this.errorHandlers)r(e)}}class d{constructor(e){this.peers=new Map;this.connectionHandlers=[];this.disconnectionHandlers=[];this.server=e}onConnection(e){this.connectionHandlers.push(e)}onDisconnection(e){this.disconnectionHandlers.push(e)}getPeer(e){return this.peers.get(e)}getPeerIds(){return Array.from(this.peers.keys())}close(){this.server.stop(),this.peers.clear()}_registerPeer(e){const r=c({prefix:"peer_"}),t=new p(e);this.peers.set(r,t);for(const o of this.connectionHandlers)o(t,r);return r}_handlePeerMessage(e,r){const t=this.peers.get(e);t&&t._handleMessage(r)}_handlePeerDisconnection(e){const r=this.peers.get(e);if(r){r._handleClose(),this.peers.delete(e);for(const t of this.disconnectionHandlers)t(e)}}_handlePeerConnection(e){const r=this.peers.get(e);if(r)for(const t of this.connectionHandlers)t(r,e)}static create(e){const r=new WeakMap;let t;const o=Bun.serve({port:e,fetch(s,n){if(!n.upgrade(s))return new Response("Expected WebSocket connection",{status:400})},websocket:{open(s){const n=t._registerPeer(s);r.set(s,n),t._handlePeerConnection(n),t.connectionHandlers.forEach(i=>i(t.getPeer(n),n))},message(s,n){const i=r.get(s);i&&n instanceof Uint8Array?t._handlePeerMessage(i,n):i&&n instanceof ArrayBuffer&&t._handlePeerMessage(i,new Uint8Array(n))},close(s){const n=r.get(s);n&&(t._handlePeerDisconnection(n),r.delete(s))}}});return t=new d(o),t}}export{a as BunWebSocketClientTransport,p as BunWebSocketPeerTransport,d as BunWebSocketServerTransport};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{ObjectPool as l}from"../core/pooled-codec/pooled-codec";class f{constructor(s=256,e=!1){this.pools=new Map;this.sizeClass=s,this.zeroBuffersOnRelease=e}wrap(s,e){const o=1+e.byteLength,r=Math.ceil(o/this.sizeClass)*this.sizeClass;let t=this.pools.get(r);t||(t=new l(()=>new Uint8Array(r)),this.pools.set(r,t));const i=t.acquire();return i[0]=s,i.set(e,1),i.subarray(0,o)}release(s){const e=s.buffer.byteLength;if(e%this.sizeClass!==0)return;const o=this.pools.get(e);if(!o)return;const r=new Uint8Array(s.buffer);this.zeroBuffersOnRelease&&r.fill(0),o.release(r)}getStats(){return{poolSizes:Array.from(this.pools.keys()).sort((s,e)=>s-e)}}clear(){this.pools.clear()}}export{f as MessageWrapperPool};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{MessageType as i}from"./types";class d{constructor(t){this.snapshotHandlers=new Map;this.rpcHandlers=new Map;this.connectHandlers=[];this.disconnectHandlers=[];this.errorHandlers=[];this.connected=!1;this.lastSentIntents=new Map;this.messageCount=0;this.messageCountWindow=Date.now();this.heartbeatTimer=null;this.lastMessageReceivedAt=Date.now();this.transport=t.transport,this.intentRegistry=t.intentRegistry,this.snapshotRegistry=t.snapshotRegistry,this.rpcRegistry=t.rpcRegistry,this.config={maxMessageSize:t.config?.maxMessageSize??65536,debug:t.config?.debug??!1,enableBufferPooling:t.config?.enableBufferPooling??!0,maxMessagesPerSecond:t.config?.maxMessagesPerSecond??60,maxSendQueueSize:t.config?.maxSendQueueSize??100,heartbeatInterval:t.config?.heartbeatInterval??3e4,heartbeatTimeout:t.config?.heartbeatTimeout??6e4,lagSimulation:t.config?.lagSimulation},this.lagSimulation=t.config?.lagSimulation,this.setupTransportHandlers(),this.setupHeartbeat()}hasIntentChanged(t,e){const r=this.lastSentIntents.get(t.kind);if(!r)return!0;if(e)return e(r,t);const{tick:s,...n}=r,{tick:h,...o}=t;return JSON.stringify(n)!==JSON.stringify(o)}sendIntent(t){if(!this.connected){this.log("Cannot send intent: not connected");return}if(!this.checkRateLimit()){this.log("Rate limit exceeded, dropping intent");return}try{const e=this.intentRegistry.encode(t),r=new Uint8Array(1+e.byteLength);r[0]=i.INTENT,r.set(e,1),this.transport.send(r),this.lastSentIntents.set(t.kind,{...t}),this.log(`Sent intent (kind: ${t.kind}, tick: ${t.tick})`)}catch(e){this.log(`Failed to send intent: ${e}`)}}onSnapshot(t,e){let r=this.snapshotHandlers.get(t);return r||(r=[],this.snapshotHandlers.set(t,r)),r.push(e),()=>{const s=this.snapshotHandlers.get(t);if(s){const n=s.indexOf(e);n>-1&&s.splice(n,1)}}}sendRPC(t,e){if(!this.rpcRegistry)throw new Error("RpcRegistry not configured. Pass rpcRegistry to ClientNetworkConfig.");if(!this.connected){this.log("Cannot send RPC: not connected");return}if(!this.checkRateLimit()){this.log("Rate limit exceeded, dropping RPC");return}try{const r=this.rpcRegistry.encode(t,e),s=new Uint8Array(1+r.byteLength);s[0]=i.CUSTOM,s.set(r,1),this.transport.send(s),this.log(`Sent RPC (method: ${t.method})`)}catch(r){this.log(`Failed to send RPC: ${r}`)}}onRPC(t,e){if(!this.rpcRegistry)throw new Error("RpcRegistry not configured. Pass rpcRegistry to ClientNetworkConfig.");let r=this.rpcHandlers.get(t.method);return r||(r=[],this.rpcHandlers.set(t.method,r)),r.push(e),()=>{const s=this.rpcHandlers.get(t.method);if(s){const n=s.indexOf(e);n>-1&&s.splice(n,1)}}}onConnect(t){return this.connectHandlers.push(t),()=>{const e=this.connectHandlers.indexOf(t);e>-1&&this.connectHandlers.splice(e,1)}}onDisconnect(t){return this.disconnectHandlers.push(t),()=>{const e=this.disconnectHandlers.indexOf(t);e>-1&&this.disconnectHandlers.splice(e,1)}}onError(t){return this.errorHandlers.push(t),()=>{const e=this.errorHandlers.indexOf(t);e>-1&&this.errorHandlers.splice(e,1)}}isConnected(){return this.connected}disconnect(){return this.log("Disconnecting..."),this.heartbeatTimer&&(clearInterval(this.heartbeatTimer),this.heartbeatTimer=null),this.transport.close()}setupTransportHandlers(){this.transport.onOpen?this.transport.onOpen(()=>{this.log("Connected to server"),this.connected=!0,this.lastMessageReceivedAt=Date.now(),this.notifyConnectHandlers()}):(this.connected=!0,this.lastMessageReceivedAt=Date.now()),this.transport.onMessage(t=>{const e=this.getLagDelay();if(e>0){const r=new Uint8Array(t);setTimeout(()=>{this.handleMessage(r)},e)}else this.handleMessage(t)}),this.transport.onClose(()=>{this.handleDisconnection()}),this.transport.onError&&this.transport.onError(t=>{this.handleError(t)})}setupHeartbeat(){this.config.heartbeatInterval!==0&&(this.heartbeatTimer=setInterval(()=>{this.checkHeartbeat()},this.config.heartbeatInterval))}checkHeartbeat(){const e=Date.now()-this.lastMessageReceivedAt;if(e>this.config.heartbeatTimeout){this.log(`Server timed out (no message for ${e}ms)`),this.disconnect();return}try{const r=new Uint8Array([i.HEARTBEAT]);this.transport.send(r)}catch(r){this.log(`Failed to send heartbeat: ${r}`)}}handleMessage(t){if(this.lastMessageReceivedAt=Date.now(),t.byteLength===0){this.log("Received empty message from server");return}if(t.byteLength>this.config.maxMessageSize){this.log(`Message exceeds max size: ${t.byteLength} > ${this.config.maxMessageSize}`);return}const e=t[0],r=t.subarray(1);switch(e){case i.SNAPSHOT:this.handleSnapshot(r);break;case i.HEARTBEAT:this.log("Received heartbeat from server");break;case i.CUSTOM:this.handleRPC(r);break;default:this.log(`Unknown message type: ${e}`)}}handleSnapshot(t){try{const e=this.snapshotRegistry.decode(t);this.log(`Received snapshot (type: ${e.type}, tick: ${e.snapshot.tick})`);const r=this.snapshotHandlers.get(e.type);if(r&&r.length>0)for(const s of r)try{s(e.snapshot)}catch(n){this.log(`Error in snapshot handler: ${n}`)}else this.log(`No handler registered for snapshot type: ${e.type}`);this.snapshotRegistry.release(e.type,e.snapshot.updates)}catch(e){this.log(`Failed to decode snapshot: ${e}`)}}handleRPC(t){if(!this.rpcRegistry){this.log("Received RPC but RpcRegistry not configured");return}try{const e=this.rpcRegistry.decode(t);this.log(`Received RPC (method: ${e.method})`);const r=this.rpcHandlers.get(e.method);if(r&&r.length>0)for(const s of r)try{s(e.data)}catch(n){this.log(`Error in RPC handler: ${n}`)}else this.log(`No handler registered for RPC method: ${e.method}`);this.rpcRegistry.release(e.method,e.data)}catch(e){this.log(`Failed to decode RPC: ${e}`)}}handleDisconnection(){this.log("Disconnected from server"),this.connected=!1,this.heartbeatTimer&&(clearInterval(this.heartbeatTimer),this.heartbeatTimer=null),this.notifyDisconnectHandlers()}notifyConnectHandlers(){for(const t of this.connectHandlers)try{t()}catch(e){this.config.debug&&console.error(`[ClientNetwork] Error in connect handler: ${e}`)}}notifyDisconnectHandlers(){for(const t of this.disconnectHandlers)try{t()}catch(e){this.config.debug&&console.error(`[ClientNetwork] Error in disconnect handler: ${e}`)}}handleError(t){this.log(`Transport error: ${t.message}`),this.notifyErrorHandlers(t)}notifyErrorHandlers(t){for(const e of this.errorHandlers)try{e(t)}catch(r){this.log(`Error in error handler: ${r}`)}}checkRateLimit(){if(this.config.maxMessagesPerSecond===0)return!0;const t=Date.now(),e=Math.floor(t/1e3)*1e3;return this.messageCountWindow!==e&&(this.messageCountWindow=e,this.messageCount=0),this.messageCount>=this.config.maxMessagesPerSecond?!1:(this.messageCount++,!0)}getLagDelay(){if(!this.lagSimulation)return 0;if(typeof this.lagSimulation=="number")return this.lagSimulation;const{min:t,max:e}=this.lagSimulation;return t+Math.random()*(e-t)}log(t){this.config.debug&&console.log(`[ClientNetwork] ${t}`)}}export{d as ClientNetwork};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export*from"./types";export*from"./server";export*from"./client";export*from"./adapters/bun-websocket";export*from"./buffer-pool";export*from"./validators";import{MessageType as s,MessagePriority as a}from"./types";export{a as MessagePriority,s as MessageType};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{MessageType as h,MessagePriority as g}from"./types";import{MessageWrapperPool as u}from"./buffer-pool";class T{constructor(e){this.peers=new Map;this.peerSnapshotRegistries=new Map;this.lastProcessedClientTick=new Map;this.lastSnapshotHashes=new Map;this.intentHandlers=new Map;this.anyIntentHandlers=[];this.rpcHandlers=new Map;this.connectionHandlers=[];this.disconnectionHandlers=[];this.messagePool=null;this.heartbeatTimer=null;this.transport=e.transport,this.intentRegistry=e.intentRegistry,this.createPeerSnapshotRegistry=e.createPeerSnapshotRegistry,this.rpcRegistry=e.rpcRegistry,this.config={maxMessageSize:e.config?.maxMessageSize??65536,debug:e.config?.debug??!1,maxMessagesPerSecond:e.config?.maxMessagesPerSecond??100,maxSendQueueSize:e.config?.maxSendQueueSize??100,enableBufferPooling:e.config?.enableBufferPooling??!0,heartbeatInterval:e.config?.heartbeatInterval??3e4,heartbeatTimeout:e.config?.heartbeatTimeout??6e4,lagSimulation:e.config?.lagSimulation??0},this.config.enableBufferPooling&&(this.messagePool=new u),this.setupTransportHandlers(),this.setupHeartbeat()}getPeerSnapshotRegistry(e){return this.peerSnapshotRegistries.get(e)}onIntent(e,t,s){let r=this.intentHandlers.get(e.kind);r||(r=[],this.intentHandlers.set(e.kind,r));const n=(i,o)=>{if(s&&!s(i,o)){this.log(`Intent validation failed for peer ${i}, kind ${o.kind}`);return}let a=this.lastProcessedClientTick.get(i);a||(a=new Map,this.lastProcessedClientTick.set(i,a)),a.set(o.kind,o.tick),t(i,o)};return r.push(n),()=>{const i=this.intentHandlers.get(e.kind);if(i){const o=i.indexOf(n);o>-1&&i.splice(o,1)}}}onAnyIntent(e){return this.anyIntentHandlers.push(e),()=>{const t=this.anyIntentHandlers.indexOf(e);t>-1&&this.anyIntentHandlers.splice(t,1)}}onConnection(e){this.connectionHandlers.push(e)}onDisconnection(e){this.disconnectionHandlers.push(e)}sendRPC(e,t,s,r=g.NORMAL){if(!this.rpcRegistry)throw new Error("RpcRegistry not configured. Pass rpcRegistry to ServerNetworkConfig.");const n=this.peers.get(e);if(!n){this.log(`Cannot send RPC to unknown peer: ${e}`);return}try{const i=this.rpcRegistry.encode(t,s);let o;if(this.messagePool?o=this.messagePool.wrap(h.CUSTOM,i):(o=new Uint8Array(1+i.byteLength),o[0]=h.CUSTOM,o.set(i,1)),n.isBackpressured||n.sendQueue.length>0){this.queueMessage(n,o,r),this.messagePool&&this.messagePool.release(o);return}this.sendMessageToPeer(n,o),this.messagePool&&this.messagePool.release(o),this.log(`Sent RPC (method: ${t.method}) to peer: ${e}`)}catch(i){this.log(`Failed to send RPC to peer ${e}: ${i}`)}}sendRpcBroadcast(e,t,s=g.NORMAL){for(const r of this.getPeerIds())this.sendRPC(r,e,t,s)}onRPC(e,t){if(!this.rpcRegistry)throw new Error("RpcRegistry not configured. Pass rpcRegistry to ServerNetworkConfig.");let s=this.rpcHandlers.get(e.method);return s||(s=[],this.rpcHandlers.set(e.method,s)),s.push(t),()=>{const r=this.rpcHandlers.get(e.method);if(r){const n=r.indexOf(t);n>-1&&r.splice(n,1)}}}sendSnapshotToPeer(e,t,s,r=g.NORMAL){const n=this.peers.get(e);if(!n){this.log(`Cannot send snapshot to unknown peer: ${e}`);return}const i=this.peerSnapshotRegistries.get(e);if(!i)throw new Error(`No snapshot registry registered for peer: ${e}`);const o=i.encode(t,s);let a;if(this.messagePool?a=this.messagePool.wrap(h.SNAPSHOT,o):(a=new Uint8Array(1+o.byteLength),a[0]=h.SNAPSHOT,a.set(o,1)),n.isBackpressured||n.sendQueue.length>0){this.queueMessage(n,a,r),this.messagePool&&this.messagePool.release(a);return}this.sendMessageToPeer(n,a),n.lastSentTick=s.tick,this.log(`Sent snapshot (type: ${t}, tick: ${s.tick}) to peer ${e}`)}sendSnapshotToPeerIfChanged(e,t,s,r=g.NORMAL){const n=this.peers.get(e);if(!n)return this.log(`Cannot send snapshot to unknown peer: ${e}`),!1;const i=this.peerSnapshotRegistries.get(e);if(!i)throw new Error(`No snapshot registry registered for peer: ${e}`);const o=i.encode(t,s);let a=this.lastSnapshotHashes.get(e);a||(a=new Map,this.lastSnapshotHashes.set(e,a));const p=o.subarray(5),c=this.hashBinary(p),l=a.get(t);if(l===void 0||c!==l){let d;return this.messagePool?d=this.messagePool.wrap(h.SNAPSHOT,o):(d=new Uint8Array(1+o.byteLength),d[0]=h.SNAPSHOT,d.set(o,1)),n.isBackpressured||n.sendQueue.length>0?(this.queueMessage(n,d,r),this.messagePool&&this.messagePool.release(d)):this.sendMessageToPeer(n,d),n.lastSentTick=s.tick,a.set(t,c),this.log(`Sent snapshot (type: ${t}, tick: ${s.tick}) to peer ${e}`),!0}return this.log(`Skipped snapshot (type: ${t}) to peer ${e} - no change detected`),!1}hashBinary(e){let t=2166136261;for(let s=0;s<e.length;s++)t^=e[s],t=Math.imul(t,16777619);return t>>>0}queueMessage(e,t,s){const r={data:new Uint8Array(t),priority:s,timestamp:Date.now()};if(e.sendQueue.length>=this.config.maxSendQueueSize){e.sendQueue.sort((o,a)=>o.priority-a.priority);const i=e.sendQueue.shift();this.log(`Send queue full for peer ${e.peerId}, dropping ${g[i.priority]} priority message`)}let n=e.sendQueue.length;for(let i=0;i<e.sendQueue.length;i++)if(r.priority>e.sendQueue[i].priority){n=i;break}e.sendQueue.splice(n,0,r)}sendMessageToPeer(e,t){this.trackBandwidth(e,t.byteLength);const s=e.transport.send(t);this.messagePool?s instanceof Promise?s.then(()=>{this.messagePool.release(t),this.flushSendQueue(e.peerId)}).catch(()=>{e.isBackpressured=!0,this.messagePool.release(t),this.log(`Send failed for peer ${e.peerId}, marking as backpressured`)}):this.messagePool.release(t):s instanceof Promise&&s.catch(()=>{e.isBackpressured=!0,this.log(`Send failed for peer ${e.peerId}, marking as backpressured`)})}flushSendQueue(e){const t=this.peers.get(e);if(!t||t.sendQueue.length===0)return;t.isBackpressured=!1;const s=10;let r=0;for(;t.sendQueue.length>0&&r<s;){const n=t.sendQueue.shift();if(this.sendMessageToPeer(t,n.data),r++,t.isBackpressured)break}t.sendQueue.length>0&&this.log(`Peer ${e} still has ${t.sendQueue.length} queued messages`)}trackBandwidth(e,t){const s=Date.now(),r=Math.floor(s/1e3)*1e3;e.bandwidthWindow!==r&&(e.bandwidthWindow=r,e.bytesSent=0),e.bytesSent+=t}broadcastSnapshot(e,t,s,r=g.NORMAL){for(const n of this.peers.keys())s&&!s(n)||this.sendSnapshotToPeer(n,e,t,r)}broadcastSnapshotWithCustomization(e,t,s,r=g.NORMAL){for(const n of this.peers.keys()){const i=s(n,t);this.sendSnapshotToPeer(n,e,i,r)}}getPeerIds(){return Array.from(this.peers.keys())}getPeerState(e){return this.peers.get(e)}setPeerMetadata(e,t,s){const r=this.peers.get(e);r&&(r.metadata[t]=s)}getPeerBandwidth(e){const t=this.peers.get(e);return t?t.bytesSent:0}getTotalBandwidth(){let e=0;for(const t of this.peers.values())e+=t.bytesSent;return e}isPeerBackpressured(e){const t=this.peers.get(e);return t?t.isBackpressured||t.sendQueue.length>0:!1}getConfirmedClientTick(e,t){const s=this.lastProcessedClientTick.get(e);return s?s.get(t)??0:0}setConfirmedClientTick(e,t,s){let r=this.lastProcessedClientTick.get(e);r||(r=new Map,this.lastProcessedClientTick.set(e,r)),r.set(t,s)}close(){return this.log("Closing server..."),this.heartbeatTimer&&(clearInterval(this.heartbeatTimer),this.heartbeatTimer=null),this.transport.close()}setupTransportHandlers(){this.transport.onConnection((e,t)=>{this.handleConnection(e,t)}),this.transport.onDisconnection(e=>{this.handleDisconnection(e)})}setupHeartbeat(){this.config.heartbeatInterval!==0&&(this.heartbeatTimer=setInterval(()=>{this.checkHeartbeats()},this.config.heartbeatInterval))}checkHeartbeats(){const e=Date.now(),t=new Uint8Array([h.HEARTBEAT]);for(const[s,r]of this.peers.entries()){const n=e-r.lastMessageReceivedAt;if(n>this.config.heartbeatTimeout){this.log(`Peer ${s} timed out (no message for ${n}ms)`),r.transport.close();continue}try{r.transport.send(t),this.trackBandwidth(r,t.byteLength)}catch(i){this.log(`Failed to send heartbeat to peer ${s}: ${i}`)}}}handleConnection(e,t){this.log(`Peer connected: ${t}`);const s=Date.now(),r={peerId:t,transport:e,lastSentTick:0,connectedAt:s,metadata:{},messageCount:0,messageCountWindow:s,sendQueue:[],bytesSent:0,bandwidthWindow:s,isBackpressured:!1,lastMessageReceivedAt:s};this.peers.set(t,r);const n=this.createPeerSnapshotRegistry();this.peerSnapshotRegistries.set(t,n),this.lastProcessedClientTick.set(t,new Map),e.onMessage(i=>{this.handlePeerMessage(t,i)});for(const i of this.connectionHandlers)try{i(t)}catch(o){this.config.debug&&console.error(`[ServerNetwork] Error in connection handler: ${o}`)}}handleDisconnection(e){this.log(`Peer disconnected: ${e}`),this.peers.delete(e),this.peerSnapshotRegistries.delete(e),this.lastProcessedClientTick.delete(e),this.lastSnapshotHashes.delete(e);for(const t of this.disconnectionHandlers)try{t(e)}catch(s){this.config.debug&&console.error(`[ServerNetwork] Error in disconnection handler: ${s}`)}}handlePeerMessage(e,t){const s=this.peers.get(e);if(s&&(s.lastMessageReceivedAt=Date.now()),t.byteLength===0){this.log(`Received empty message from peer ${e}`);return}if(t.byteLength>this.config.maxMessageSize){this.log(`Message from peer ${e} exceeds max size: ${t.byteLength} > ${this.config.maxMessageSize}`);return}const r=t[0],n=t.subarray(1);switch(r){case h.INTENT:this.handleIntent(e,n);break;case h.HEARTBEAT:this.log(`Received heartbeat from peer ${e}`);break;case h.CUSTOM:this.handleRPC(e,n);break;default:this.log(`Unknown message type ${r} from peer ${e}`)}}handleIntent(e,t){if(!this.checkRateLimit(e)){this.log(`Rate limit exceeded for peer ${e}, dropping intent`);return}try{const s=this.intentRegistry.decode(t);this.log(`Received intent (kind: ${s.kind}) from peer ${e}`);for(const n of this.anyIntentHandlers)try{n(e,s)}catch(i){this.log(`Error in global intent handler: ${i}`)}const r=this.intentHandlers.get(s.kind);if(r&&r.length>0)for(const n of r)try{n(e,s)}catch(i){this.log(`Error in intent handler: ${i}`)}else this.log(`No handler registered for intent kind: ${s.kind}`)}catch(s){this.log(`Failed to decode intent from peer ${e}: ${s}`)}}handleRPC(e,t){if(!this.rpcRegistry){this.log("Received RPC but RpcRegistry not configured");return}if(!this.checkRateLimit(e)){this.log(`Rate limit exceeded for peer ${e}, dropping RPC`);return}try{const s=this.rpcRegistry.decode(t);this.log(`Received RPC (method: ${s.method}) from peer ${e}`);const r=this.rpcHandlers.get(s.method);if(r&&r.length>0)for(const n of r)try{n(e,s.data)}catch(i){this.log(`Error in RPC handler: ${i}`)}else this.log(`No handler registered for RPC method: ${s.method}`)}catch(s){this.log(`Failed to decode RPC from peer ${e}: ${s}`)}}checkRateLimit(e){if(this.config.maxMessagesPerSecond===0)return!0;const t=this.peers.get(e);if(!t)return!1;const s=Date.now(),r=Math.floor(s/1e3)*1e3;return t.messageCountWindow!==r&&(t.messageCountWindow=r,t.messageCount=0),t.messageCount>=this.config.maxMessagesPerSecond?!1:(t.messageCount++,!0)}log(e){this.config.debug&&console.log(`[ServerNetwork] ${e}`)}}export{T as ServerNetwork};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var n=(e=>(e[e.INTENT=1]="INTENT",e[e.SNAPSHOT=2]="SNAPSHOT",e[e.HEARTBEAT=3]="HEARTBEAT",e[e.CUSTOM=255]="CUSTOM",e))(n||{}),r=(e=>(e[e.LOW=0]="LOW",e[e.NORMAL=1]="NORMAL",e[e.HIGH=2]="HIGH",e[e.CRITICAL=3]="CRITICAL",e))(r||{});export{r as MessagePriority,n as MessageType};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
function u(e,n=10){return(r,t)=>t.tick>=e-n}function a(e,n=5){return(r,t)=>t.tick<=e+n}function s(e,n=10,r=5){return(t,o)=>o.tick>=e-n&&o.tick<=e+r}function l(...e){return(n,r)=>{for(const t of e)if(!t(n,r))return!1;return!0}}function d(e,n,r){return(t,o)=>{const i=o[e];return typeof i!="number"?!1:i>=n&&i<=r}}function b(e,n){return(r,t)=>typeof t[e]===n}export{l as combineValidators,b as validateFieldType,d as validateRange,a as validateTickNotTooFuture,u as validateTickNotTooOld,s as validateTickRange};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export*from"./intent";export*from"./snapshot";export*from"./rpc";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{BinaryCodec as n}from"../../core/binary-codec";class o{constructor(e){this.schema=e}encode(e){return n.encode(this.schema,e)}decode(e){const r={};for(const i of Object.keys(this.schema)){const c=this.schema[i];r[i]=c.toNil()}return n.decode(this.schema,e,r)}}function s(t){const e={kind:n.u8,tick:n.u32,...t.schema};return{type:void 0,codec:new o(e),kind:t.kind}}export{s as defineIntent};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{IntentRegistry as n}from"./intent-registry";import{defineIntent as f}from"./define-intent";export{n as IntentRegistry,f as defineIntent};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
class c{constructor(){this.codecs=new Map}register(e){if(this.codecs.has(e.kind))throw new Error(`Intent kind ${e.kind} is already registered`);this.codecs.set(e.kind,e.codec)}encode(e){const r=this.codecs.get(e.kind);if(!r)throw new Error(`No codec registered for intent kind ${e.kind}`);return r.encode(e)}decode(e){if(e.byteLength===0)throw new Error("Cannot decode empty buffer");const r=e[0],n=this.codecs.get(r);if(!n)throw new Error(`No codec registered for intent kind ${r}`);return n.decode(e)}decodeWithKnownKind(e,r){const n=this.codecs.get(e);if(!n)throw new Error(`No codec registered for intent kind ${e}`);return n.decode(r)}has(e){return this.codecs.has(e)}unregister(e){return this.codecs.delete(e)}clear(){this.codecs.clear()}getKinds(){return Array.from(this.codecs.keys())}}export{c as IntentRegistry};
|