murow 0.0.70 → 0.0.71
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 +52 -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-2d-renderer.js +1 -0
- package/dist/cjs/renderer/base-3d-renderer.js +1 -0
- package/dist/cjs/renderer/base-renderer.js +1 -0
- package/dist/cjs/renderer/index.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-2d-renderer.js +1 -0
- package/dist/esm/renderer/base-3d-renderer.js +1 -0
- package/dist/esm/renderer/base-renderer.js +1 -0
- package/dist/esm/renderer/index.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-2d-renderer.d.ts +13 -0
- package/dist/types/renderer/base-3d-renderer.d.ts +10 -0
- package/dist/types/renderer/base-renderer.d.ts +21 -0
- package/dist/types/renderer/index.d.ts +4 -0
- package/dist/types/renderer/types.d.ts +79 -0
- package/dist/webgpu/cjs/index.js +6004 -0
- package/dist/webgpu/esm/index.js +5972 -0
- package/dist/webgpu/types/2d/animation.d.ts +97 -0
- package/dist/webgpu/types/2d/renderer.d.ts +55 -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/gltf-skin-parser.d.ts +101 -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 +216 -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 +8 -0
- package/dist/webgpu/types/3d/skeletal-animation-compute/packer.d.ts +32 -0
- package/dist/webgpu/types/3d/skeletal-animation.d.ts +90 -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/math.d.ts +37 -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 +32 -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 +57 -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
package/src/core/lerp/README.md
DELETED
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
# lerp
|
|
2
|
-
|
|
3
|
-
A simple utility function for linear interpolation between two numeric values. Perfect for smooth animations, transitions, and value easing in game development.
|
|
4
|
-
|
|
5
|
-
## Features
|
|
6
|
-
|
|
7
|
-
- Clean linear interpolation implementation.
|
|
8
|
-
- Unclamped by design - allows extrapolation when t is outside [0, 1].
|
|
9
|
-
- Zero dependencies.
|
|
10
|
-
- Works in browsers and Node.js.
|
|
11
|
-
- TypeScript support with proper type definitions.
|
|
12
|
-
|
|
13
|
-
## Usage
|
|
14
|
-
|
|
15
|
-
```typescript
|
|
16
|
-
import { lerp } from './lerp';
|
|
17
|
-
|
|
18
|
-
// Basic interpolation
|
|
19
|
-
const value = lerp(0, 100, 0.5); // Returns 50
|
|
20
|
-
|
|
21
|
-
// Animation example
|
|
22
|
-
const startPos = 0;
|
|
23
|
-
const endPos = 100;
|
|
24
|
-
const progress = 0.75;
|
|
25
|
-
const currentPos = lerp(startPos, endPos, progress); // Returns 75
|
|
26
|
-
|
|
27
|
-
// Smooth camera movement
|
|
28
|
-
function updateCamera(deltaTime: number) {
|
|
29
|
-
const t = deltaTime * smoothingFactor;
|
|
30
|
-
camera.x = lerp(camera.x, target.x, t);
|
|
31
|
-
camera.y = lerp(camera.y, target.y, t);
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
// Color transitions
|
|
35
|
-
const r = lerp(startColor.r, endColor.r, progress);
|
|
36
|
-
const g = lerp(startColor.g, endColor.g, progress);
|
|
37
|
-
const b = lerp(startColor.b, endColor.b, progress);
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
## Parameters
|
|
41
|
-
|
|
42
|
-
- `start` (number): The starting value (returned when t = 0)
|
|
43
|
-
- `end` (number): The ending value (returned when t = 1)
|
|
44
|
-
- `t` (number): The interpolation factor, typically in range [0, 1]
|
|
45
|
-
|
|
46
|
-
## Returns
|
|
47
|
-
|
|
48
|
-
`number` - The interpolated value between start and end.
|
|
49
|
-
|
|
50
|
-
## Extrapolation
|
|
51
|
-
|
|
52
|
-
The function does not clamp the `t` parameter, allowing extrapolation:
|
|
53
|
-
|
|
54
|
-
```typescript
|
|
55
|
-
lerp(0, 100, 1.5); // Returns 150 (extrapolated beyond end)
|
|
56
|
-
lerp(0, 100, -0.5); // Returns -50 (extrapolated before start)
|
|
57
|
-
```
|
|
58
|
-
|
|
59
|
-
If you need clamped interpolation, combine with a clamp function:
|
|
60
|
-
|
|
61
|
-
```typescript
|
|
62
|
-
function clampedLerp(start: number, end: number, t: number): number {
|
|
63
|
-
const clampedT = Math.max(0, Math.min(1, t));
|
|
64
|
-
return lerp(start, end, clampedT);
|
|
65
|
-
}
|
|
66
|
-
```
|
|
67
|
-
|
|
68
|
-
## Common Use Cases
|
|
69
|
-
|
|
70
|
-
- **Smooth animations**: Interpolate position, rotation, scale over time
|
|
71
|
-
- **Camera movement**: Create smooth camera following behavior
|
|
72
|
-
- **UI transitions**: Fade effects, sliding panels, progress bars
|
|
73
|
-
- **Color blending**: Transition between colors smoothly
|
|
74
|
-
- **Value easing**: Gradually approach target values
|
|
75
|
-
- **Physics simulations**: Interpolate between physics states for rendering
|
|
76
|
-
|
|
77
|
-
---
|
|
78
|
-
|
|
79
|
-
`lerp` provides a foundational building block for smooth, continuous value transitions in game development and interactive applications.
|
package/src/core/lerp/index.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export * from './lerp';
|
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
import { describe, expect, test } from "bun:test";
|
|
2
|
-
import { lerp } from "./lerp";
|
|
3
|
-
|
|
4
|
-
describe("lerp", () => {
|
|
5
|
-
test("should return start value when t is 0", () => {
|
|
6
|
-
expect(lerp(0, 100, 0)).toBe(0);
|
|
7
|
-
expect(lerp(50, 200, 0)).toBe(50);
|
|
8
|
-
expect(lerp(-10, 10, 0)).toBe(-10);
|
|
9
|
-
});
|
|
10
|
-
|
|
11
|
-
test("should return end value when t is 1", () => {
|
|
12
|
-
expect(lerp(0, 100, 1)).toBe(100);
|
|
13
|
-
expect(lerp(50, 200, 1)).toBe(200);
|
|
14
|
-
expect(lerp(-10, 10, 1)).toBe(10);
|
|
15
|
-
});
|
|
16
|
-
|
|
17
|
-
test("should return midpoint when t is 0.5", () => {
|
|
18
|
-
expect(lerp(0, 100, 0.5)).toBe(50);
|
|
19
|
-
expect(lerp(50, 150, 0.5)).toBe(100);
|
|
20
|
-
expect(lerp(-10, 10, 0.5)).toBe(0);
|
|
21
|
-
});
|
|
22
|
-
|
|
23
|
-
test("should interpolate between positive values", () => {
|
|
24
|
-
expect(lerp(0, 100, 0.25)).toBe(25);
|
|
25
|
-
expect(lerp(0, 100, 0.75)).toBe(75);
|
|
26
|
-
expect(lerp(10, 20, 0.3)).toBeCloseTo(13, 5);
|
|
27
|
-
});
|
|
28
|
-
|
|
29
|
-
test("should interpolate between negative values", () => {
|
|
30
|
-
expect(lerp(-100, -50, 0.5)).toBe(-75);
|
|
31
|
-
expect(lerp(-10, -5, 0.2)).toBe(-9);
|
|
32
|
-
});
|
|
33
|
-
|
|
34
|
-
test("should interpolate from negative to positive", () => {
|
|
35
|
-
expect(lerp(-50, 50, 0.5)).toBe(0);
|
|
36
|
-
expect(lerp(-10, 10, 0.25)).toBe(-5);
|
|
37
|
-
expect(lerp(-10, 10, 0.75)).toBe(5);
|
|
38
|
-
});
|
|
39
|
-
|
|
40
|
-
test("should handle extrapolation when t > 1", () => {
|
|
41
|
-
expect(lerp(0, 100, 1.5)).toBe(150);
|
|
42
|
-
expect(lerp(0, 100, 2)).toBe(200);
|
|
43
|
-
expect(lerp(10, 20, 1.1)).toBeCloseTo(21, 5);
|
|
44
|
-
});
|
|
45
|
-
|
|
46
|
-
test("should handle extrapolation when t < 0", () => {
|
|
47
|
-
expect(lerp(0, 100, -0.5)).toBe(-50);
|
|
48
|
-
expect(lerp(0, 100, -1)).toBe(-100);
|
|
49
|
-
expect(lerp(10, 20, -0.1)).toBeCloseTo(9, 5);
|
|
50
|
-
});
|
|
51
|
-
|
|
52
|
-
test("should handle same start and end values", () => {
|
|
53
|
-
expect(lerp(50, 50, 0)).toBe(50);
|
|
54
|
-
expect(lerp(50, 50, 0.5)).toBe(50);
|
|
55
|
-
expect(lerp(50, 50, 1)).toBe(50);
|
|
56
|
-
expect(lerp(50, 50, 2)).toBe(50);
|
|
57
|
-
});
|
|
58
|
-
|
|
59
|
-
test("should handle floating point values", () => {
|
|
60
|
-
expect(lerp(0.1, 0.9, 0.5)).toBeCloseTo(0.5, 10);
|
|
61
|
-
expect(lerp(1.5, 2.5, 0.3)).toBeCloseTo(1.8, 10);
|
|
62
|
-
});
|
|
63
|
-
|
|
64
|
-
test("should be commutative with inverted t", () => {
|
|
65
|
-
const start = 10;
|
|
66
|
-
const end = 20;
|
|
67
|
-
expect(lerp(start, end, 0.3)).toBeCloseTo(lerp(end, start, 0.7), 10);
|
|
68
|
-
});
|
|
69
|
-
|
|
70
|
-
test("should handle very small differences", () => {
|
|
71
|
-
expect(lerp(1.0, 1.0001, 0.5)).toBeCloseTo(1.00005, 10);
|
|
72
|
-
});
|
|
73
|
-
|
|
74
|
-
test("should handle very large values", () => {
|
|
75
|
-
expect(lerp(1e10, 2e10, 0.5)).toBe(1.5e10);
|
|
76
|
-
});
|
|
77
|
-
|
|
78
|
-
test("should be linear (no easing)", () => {
|
|
79
|
-
const start = 0;
|
|
80
|
-
const end = 100;
|
|
81
|
-
const step = 0.1;
|
|
82
|
-
const expectedDiff = 10;
|
|
83
|
-
|
|
84
|
-
for (let t = 0; t < 1; t += step) {
|
|
85
|
-
const val1 = lerp(start, end, t);
|
|
86
|
-
const val2 = lerp(start, end, t + step);
|
|
87
|
-
expect(val2 - val1).toBeCloseTo(expectedDiff, 5);
|
|
88
|
-
}
|
|
89
|
-
});
|
|
90
|
-
});
|
package/src/core/lerp/lerp.ts
DELETED
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @description
|
|
3
|
-
* Performs linear interpolation between two values.
|
|
4
|
-
*
|
|
5
|
-
* Linear interpolation (lerp) calculates a value between a start and end point
|
|
6
|
-
* based on a normalized interpolation factor (t). When t = 0, the result equals
|
|
7
|
-
* the start value; when t = 1, the result equals the end value. Values of t
|
|
8
|
-
* between 0 and 1 produce intermediate results.
|
|
9
|
-
*
|
|
10
|
-
* @remarks
|
|
11
|
-
* - This function does not clamp the interpolation factor. Values of t outside
|
|
12
|
-
* the range [0, 1] will extrapolate beyond the start and end values.
|
|
13
|
-
* - For clamped interpolation, combine with a clamp function on the t parameter.
|
|
14
|
-
* - Commonly used for smooth animations, camera movements, and value transitions.
|
|
15
|
-
*
|
|
16
|
-
* @param start - The starting value (when t = 0)
|
|
17
|
-
* @param end - The ending value (when t = 1)
|
|
18
|
-
* @param t - The interpolation factor, typically in the range [0, 1]
|
|
19
|
-
*
|
|
20
|
-
* @returns {number} The interpolated value between start and end
|
|
21
|
-
*
|
|
22
|
-
* @example
|
|
23
|
-
* ```typescript
|
|
24
|
-
* // Basic interpolation
|
|
25
|
-
* lerp(0, 100, 0.5); // Returns 50
|
|
26
|
-
* lerp(0, 100, 0); // Returns 0
|
|
27
|
-
* lerp(0, 100, 1); // Returns 100
|
|
28
|
-
*
|
|
29
|
-
* // Animation example
|
|
30
|
-
* const startPos = 0;
|
|
31
|
-
* const endPos = 100;
|
|
32
|
-
* const progress = 0.75;
|
|
33
|
-
* const currentPos = lerp(startPos, endPos, progress); // Returns 75
|
|
34
|
-
*
|
|
35
|
-
* // Extrapolation (t outside [0, 1])
|
|
36
|
-
* lerp(0, 100, 1.5); // Returns 150
|
|
37
|
-
* lerp(0, 100, -0.5); // Returns -50
|
|
38
|
-
* ```
|
|
39
|
-
*/
|
|
40
|
-
export function lerp(start: number, end: number, t: number): number {
|
|
41
|
-
return start + (end - start) * t;
|
|
42
|
-
}
|
|
@@ -1,164 +0,0 @@
|
|
|
1
|
-
# NavMesh / Pathfinding Utility
|
|
2
|
-
|
|
3
|
-
A lightweight navigation system for grid-based and hybrid games.
|
|
4
|
-
|
|
5
|
-
Supports:
|
|
6
|
-
|
|
7
|
-
* **Grid A*** pathfinding
|
|
8
|
-
* **Line-of-sight graph navigation**
|
|
9
|
-
* **Dynamic obstacles**
|
|
10
|
-
* **Spatial hashing for fast queries**
|
|
11
|
-
* **Circle / Rect / Polygon obstacles**
|
|
12
|
-
* **Zero rebuilds unless data changes**
|
|
13
|
-
|
|
14
|
-
Designed for **games**, not CAD-grade geometry.
|
|
15
|
-
|
|
16
|
-
---
|
|
17
|
-
|
|
18
|
-
## Features
|
|
19
|
-
|
|
20
|
-
* ⚡ **Fast obstacle queries** via spatial hash
|
|
21
|
-
* 🧠 **Smart rebuilds** (version-based, no unnecessary work)
|
|
22
|
-
* 🧩 **Multiple obstacle types**
|
|
23
|
-
* 🧭 **A*** with binary heap
|
|
24
|
-
* 🧱 **Grid or graph navigation**
|
|
25
|
-
* 🔁 Dynamic obstacle add / move / remove
|
|
26
|
-
* 🧪 Deterministic & allocation-safe
|
|
27
|
-
|
|
28
|
-
---
|
|
29
|
-
|
|
30
|
-
## Usage
|
|
31
|
-
|
|
32
|
-
### Create navmesh
|
|
33
|
-
|
|
34
|
-
```ts
|
|
35
|
-
const nav = new NavMesh('grid'); // or 'graph'
|
|
36
|
-
```
|
|
37
|
-
|
|
38
|
-
### Add obstacles
|
|
39
|
-
|
|
40
|
-
```ts
|
|
41
|
-
nav.addObstacle({
|
|
42
|
-
type: 'circle',
|
|
43
|
-
pos: { x: 5, y: 5 },
|
|
44
|
-
radius: 2
|
|
45
|
-
});
|
|
46
|
-
```
|
|
47
|
-
|
|
48
|
-
```ts
|
|
49
|
-
nav.addObstacle({
|
|
50
|
-
type: 'rect',
|
|
51
|
-
pos: { x: 2, y: 3 },
|
|
52
|
-
size: { x: 4, y: 2 },
|
|
53
|
-
});
|
|
54
|
-
```
|
|
55
|
-
|
|
56
|
-
```ts
|
|
57
|
-
nav.addObstacle({
|
|
58
|
-
type: 'polygon',
|
|
59
|
-
pos: { x: 10, y: 5 },
|
|
60
|
-
points: [
|
|
61
|
-
{ x: 0, y: 0 },
|
|
62
|
-
{ x: 2, y: 0 },
|
|
63
|
-
{ x: 1, y: 2 },
|
|
64
|
-
],
|
|
65
|
-
});
|
|
66
|
-
```
|
|
67
|
-
|
|
68
|
-
### Move / remove
|
|
69
|
-
|
|
70
|
-
```ts
|
|
71
|
-
nav.moveObstacle(id, { x: 8, y: 4 });
|
|
72
|
-
nav.removeObstacle(id);
|
|
73
|
-
```
|
|
74
|
-
|
|
75
|
-
### Find path
|
|
76
|
-
|
|
77
|
-
```ts
|
|
78
|
-
const path = nav.findPath({
|
|
79
|
-
from: { x: 1, y: 1 },
|
|
80
|
-
to: { x: 10, y: 8 }
|
|
81
|
-
});
|
|
82
|
-
```
|
|
83
|
-
|
|
84
|
-
---
|
|
85
|
-
|
|
86
|
-
## Web Workers (Optional)
|
|
87
|
-
|
|
88
|
-
For games with many concurrent pathfinding requests (20+ units), enable workers for parallel processing:
|
|
89
|
-
|
|
90
|
-
### Modes
|
|
91
|
-
|
|
92
|
-
```ts
|
|
93
|
-
// Default: synchronous (workers: false)
|
|
94
|
-
const nav = new NavMesh('grid'); // Returns Vec2[]
|
|
95
|
-
const path = nav.findPath({ from, to });
|
|
96
|
-
|
|
97
|
-
// Always use workers (workers: true)
|
|
98
|
-
const nav = new NavMesh('grid', { workers: true }); // Returns Promise<Vec2[]>
|
|
99
|
-
const path = await nav.findPath({ from, to });
|
|
100
|
-
|
|
101
|
-
// Auto mode (workers: 'auto')
|
|
102
|
-
const nav = new NavMesh('grid', { workers: 'auto' }); // Returns Vec2[] | Promise<Vec2[]>
|
|
103
|
-
const result = nav.findPath({ from, to });
|
|
104
|
-
const path = result instanceof Promise ? await result : result;
|
|
105
|
-
```
|
|
106
|
-
|
|
107
|
-
### Performance
|
|
108
|
-
|
|
109
|
-
- **Single path**: Sync mode faster (no worker overhead)
|
|
110
|
-
- **20+ parallel paths**: Workers ~3x faster
|
|
111
|
-
- **30+ unit RTS**: Workers ~4.5x faster (35 FPS → 162 FPS)
|
|
112
|
-
|
|
113
|
-
Use workers for RTS/strategy games with many simultaneous pathfinding requests.
|
|
114
|
-
|
|
115
|
-
```ts
|
|
116
|
-
// Custom pool size (default: 4)
|
|
117
|
-
const nav = new NavMesh('grid', {
|
|
118
|
-
workers: true,
|
|
119
|
-
workerPoolSize: 8,
|
|
120
|
-
workerPath: './custom-worker.js'
|
|
121
|
-
});
|
|
122
|
-
```
|
|
123
|
-
|
|
124
|
-
---
|
|
125
|
-
|
|
126
|
-
## Navigation Modes
|
|
127
|
-
|
|
128
|
-
### `grid`
|
|
129
|
-
|
|
130
|
-
* A* over grid cells
|
|
131
|
-
* Accurate
|
|
132
|
-
* Best for RTS / tactics / tile games
|
|
133
|
-
|
|
134
|
-
### `graph`
|
|
135
|
-
|
|
136
|
-
* Line-of-sight check
|
|
137
|
-
* Falls back to grid if blocked
|
|
138
|
-
* Faster for open maps
|
|
139
|
-
|
|
140
|
-
---
|
|
141
|
-
|
|
142
|
-
## Performance
|
|
143
|
-
|
|
144
|
-
| Feature | Cost |
|
|
145
|
-
| -------------- | --------------------------------- |
|
|
146
|
-
| Obstacle query | **O(1)** avg |
|
|
147
|
-
| Grid rebuild | O(n × area) |
|
|
148
|
-
| Pathfinding | O(bᵈ log n) |
|
|
149
|
-
| Memory | Minimal, no allocations per frame |
|
|
150
|
-
|
|
151
|
-
Handles:
|
|
152
|
-
|
|
153
|
-
* 1k+ obstacles
|
|
154
|
-
* 10k+ A* nodes
|
|
155
|
-
* Real-time updates
|
|
156
|
-
|
|
157
|
-
---
|
|
158
|
-
|
|
159
|
-
## Notes
|
|
160
|
-
|
|
161
|
-
* Polygon points **must be local (0,0-based)**
|
|
162
|
-
* Rotation is supported for rects & polygons
|
|
163
|
-
* All math is deterministic
|
|
164
|
-
* No dependencies
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export * from './navmesh';
|
|
@@ -1,236 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* NavMesh Worker Pool - Manages multiple workers for parallel pathfinding
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
import { ObstacleInput } from './navmesh';
|
|
6
|
-
|
|
7
|
-
interface Vec2 {
|
|
8
|
-
x: number;
|
|
9
|
-
y: number;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
interface PathRequest {
|
|
13
|
-
id: number;
|
|
14
|
-
from: Vec2;
|
|
15
|
-
to: Vec2;
|
|
16
|
-
resolve: (path: Vec2[]) => void;
|
|
17
|
-
reject: (error: Error) => void;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
interface PathResultMessage {
|
|
21
|
-
type: 'PATH_RESULT';
|
|
22
|
-
id: number;
|
|
23
|
-
path: Vec2[];
|
|
24
|
-
duration: number;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
interface ErrorMessage {
|
|
28
|
-
type: 'ERROR';
|
|
29
|
-
error: string;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
type WorkerResponse = PathResultMessage | ErrorMessage;
|
|
33
|
-
|
|
34
|
-
export class NavMeshWorkerPool {
|
|
35
|
-
private workers: Worker[] = [];
|
|
36
|
-
private nextWorkerIndex = 0;
|
|
37
|
-
private requestId = 0;
|
|
38
|
-
private pendingRequests = new Map<number, PathRequest>();
|
|
39
|
-
private initialized = false;
|
|
40
|
-
|
|
41
|
-
constructor(
|
|
42
|
-
private poolSize: number,
|
|
43
|
-
private workerPath: string,
|
|
44
|
-
private navType: 'grid' | 'graph' = 'grid',
|
|
45
|
-
private obstacles: ObstacleInput[] = []
|
|
46
|
-
) {}
|
|
47
|
-
|
|
48
|
-
/**
|
|
49
|
-
* Initialize all workers in the pool
|
|
50
|
-
*/
|
|
51
|
-
async init(): Promise<void> {
|
|
52
|
-
if (this.initialized) return;
|
|
53
|
-
|
|
54
|
-
const initPromises: Promise<void>[] = [];
|
|
55
|
-
|
|
56
|
-
for (let i = 0; i < this.poolSize; i++) {
|
|
57
|
-
const worker = new Worker(this.workerPath, { type: 'module' });
|
|
58
|
-
|
|
59
|
-
// Set up message handler
|
|
60
|
-
worker.onmessage = (e: MessageEvent<WorkerResponse>) => {
|
|
61
|
-
const msg = e.data;
|
|
62
|
-
|
|
63
|
-
if (msg.type === 'PATH_RESULT') {
|
|
64
|
-
const request = this.pendingRequests.get(msg.id);
|
|
65
|
-
if (request) {
|
|
66
|
-
request.resolve(msg.path);
|
|
67
|
-
this.pendingRequests.delete(msg.id);
|
|
68
|
-
}
|
|
69
|
-
} else if (msg.type === 'ERROR') {
|
|
70
|
-
// Reject all pending requests for this worker
|
|
71
|
-
for (const [id, request] of this.pendingRequests.entries()) {
|
|
72
|
-
request.reject(new Error(msg.error));
|
|
73
|
-
this.pendingRequests.delete(id);
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
};
|
|
77
|
-
|
|
78
|
-
worker.onerror = (error) => {
|
|
79
|
-
console.error('Worker error:', error);
|
|
80
|
-
// Reject all pending requests for this worker
|
|
81
|
-
for (const [id, request] of this.pendingRequests.entries()) {
|
|
82
|
-
request.reject(new Error('Worker error'));
|
|
83
|
-
this.pendingRequests.delete(id);
|
|
84
|
-
}
|
|
85
|
-
};
|
|
86
|
-
|
|
87
|
-
this.workers.push(worker);
|
|
88
|
-
|
|
89
|
-
// Initialize worker
|
|
90
|
-
const readyPromise = new Promise<void>((resolve) => {
|
|
91
|
-
const onReady = (e: MessageEvent) => {
|
|
92
|
-
if (e.data.type === 'READY') {
|
|
93
|
-
worker.removeEventListener('message', onReady);
|
|
94
|
-
resolve();
|
|
95
|
-
}
|
|
96
|
-
};
|
|
97
|
-
worker.addEventListener('message', onReady);
|
|
98
|
-
});
|
|
99
|
-
|
|
100
|
-
worker.postMessage({
|
|
101
|
-
type: 'INIT',
|
|
102
|
-
navType: this.navType,
|
|
103
|
-
obstacles: this.obstacles,
|
|
104
|
-
});
|
|
105
|
-
|
|
106
|
-
initPromises.push(readyPromise);
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
await Promise.all(initPromises);
|
|
110
|
-
this.initialized = true;
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
/**
|
|
114
|
-
* Find a path using the next available worker (round-robin)
|
|
115
|
-
*/
|
|
116
|
-
async findPath(from: Vec2, to: Vec2): Promise<Vec2[]> {
|
|
117
|
-
if (!this.initialized) {
|
|
118
|
-
throw new Error('Worker pool not initialized. Call init() first.');
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
const id = this.requestId++;
|
|
122
|
-
const worker = this.workers[this.nextWorkerIndex];
|
|
123
|
-
this.nextWorkerIndex = (this.nextWorkerIndex + 1) % this.workers.length;
|
|
124
|
-
|
|
125
|
-
return new Promise<Vec2[]>((resolve, reject) => {
|
|
126
|
-
this.pendingRequests.set(id, { id, from, to, resolve, reject });
|
|
127
|
-
|
|
128
|
-
worker.postMessage({
|
|
129
|
-
type: 'FIND_PATH',
|
|
130
|
-
id,
|
|
131
|
-
from,
|
|
132
|
-
to,
|
|
133
|
-
});
|
|
134
|
-
});
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
/**
|
|
138
|
-
* Add an obstacle to all workers
|
|
139
|
-
*/
|
|
140
|
-
async addObstacle(obstacle: ObstacleInput): Promise<number> {
|
|
141
|
-
if (!this.initialized) {
|
|
142
|
-
throw new Error('Worker pool not initialized. Call init() first.');
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
// Add to all workers
|
|
146
|
-
const promises = this.workers.map((worker) => {
|
|
147
|
-
return new Promise<number>((resolve) => {
|
|
148
|
-
const onAdded = (e: MessageEvent) => {
|
|
149
|
-
if (e.data.type === 'OBSTACLE_ADDED') {
|
|
150
|
-
worker.removeEventListener('message', onAdded);
|
|
151
|
-
resolve(e.data.obstacleId);
|
|
152
|
-
}
|
|
153
|
-
};
|
|
154
|
-
worker.addEventListener('message', onAdded);
|
|
155
|
-
worker.postMessage({ type: 'ADD_OBSTACLE', obstacle });
|
|
156
|
-
});
|
|
157
|
-
});
|
|
158
|
-
|
|
159
|
-
const ids = await Promise.all(promises);
|
|
160
|
-
return ids[0]; // All workers should return the same ID
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
/**
|
|
164
|
-
* Remove an obstacle from all workers
|
|
165
|
-
*/
|
|
166
|
-
async removeObstacle(obstacleId: number): Promise<void> {
|
|
167
|
-
if (!this.initialized) {
|
|
168
|
-
throw new Error('Worker pool not initialized. Call init() first.');
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
const promises = this.workers.map((worker) => {
|
|
172
|
-
return new Promise<void>((resolve) => {
|
|
173
|
-
const onRemoved = (e: MessageEvent) => {
|
|
174
|
-
if (e.data.type === 'OBSTACLE_REMOVED') {
|
|
175
|
-
worker.removeEventListener('message', onRemoved);
|
|
176
|
-
resolve();
|
|
177
|
-
}
|
|
178
|
-
};
|
|
179
|
-
worker.addEventListener('message', onRemoved);
|
|
180
|
-
worker.postMessage({ type: 'REMOVE_OBSTACLE', obstacleId });
|
|
181
|
-
});
|
|
182
|
-
});
|
|
183
|
-
|
|
184
|
-
await Promise.all(promises);
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
/**
|
|
188
|
-
* Move an obstacle in all workers
|
|
189
|
-
*/
|
|
190
|
-
async moveObstacle(obstacleId: number, pos: Vec2): Promise<void> {
|
|
191
|
-
if (!this.initialized) {
|
|
192
|
-
throw new Error('Worker pool not initialized. Call init() first.');
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
const promises = this.workers.map((worker) => {
|
|
196
|
-
return new Promise<void>((resolve) => {
|
|
197
|
-
const onMoved = (e: MessageEvent) => {
|
|
198
|
-
if (e.data.type === 'OBSTACLE_MOVED') {
|
|
199
|
-
worker.removeEventListener('message', onMoved);
|
|
200
|
-
resolve();
|
|
201
|
-
}
|
|
202
|
-
};
|
|
203
|
-
worker.addEventListener('message', onMoved);
|
|
204
|
-
worker.postMessage({ type: 'MOVE_OBSTACLE', obstacleId, pos });
|
|
205
|
-
});
|
|
206
|
-
});
|
|
207
|
-
|
|
208
|
-
await Promise.all(promises);
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
/**
|
|
212
|
-
* Terminate all workers
|
|
213
|
-
*/
|
|
214
|
-
terminate() {
|
|
215
|
-
for (const worker of this.workers) {
|
|
216
|
-
worker.terminate();
|
|
217
|
-
}
|
|
218
|
-
this.workers = [];
|
|
219
|
-
this.pendingRequests.clear();
|
|
220
|
-
this.initialized = false;
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
/**
|
|
224
|
-
* Get the number of pending requests
|
|
225
|
-
*/
|
|
226
|
-
get pendingCount(): number {
|
|
227
|
-
return this.pendingRequests.size;
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
/**
|
|
231
|
-
* Get the pool size
|
|
232
|
-
*/
|
|
233
|
-
get size(): number {
|
|
234
|
-
return this.workers.length;
|
|
235
|
-
}
|
|
236
|
-
}
|