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
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* NavMesh Worker - Offloads pathfinding to background thread
|
|
3
|
-
*
|
|
4
|
-
* Message Protocol:
|
|
5
|
-
* - INIT: Initialize NavMesh with obstacles
|
|
6
|
-
* - FIND_PATH: Request pathfinding (from, to)
|
|
7
|
-
* - ADD_OBSTACLE: Add obstacle dynamically
|
|
8
|
-
* - REMOVE_OBSTACLE: Remove obstacle dynamically
|
|
9
|
-
* - MOVE_OBSTACLE: Move obstacle
|
|
10
|
-
*/
|
|
11
|
-
import { NavMesh } from './navmesh';
|
|
12
|
-
let navmesh = null;
|
|
13
|
-
self.onmessage = (e) => {
|
|
14
|
-
const msg = e.data;
|
|
15
|
-
try {
|
|
16
|
-
switch (msg.type) {
|
|
17
|
-
case 'INIT': {
|
|
18
|
-
navmesh = new NavMesh(msg.navType);
|
|
19
|
-
if (msg.obstacles) {
|
|
20
|
-
for (const obstacle of msg.obstacles) {
|
|
21
|
-
navmesh.addObstacle(obstacle);
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
self.postMessage({ type: 'READY' });
|
|
25
|
-
break;
|
|
26
|
-
}
|
|
27
|
-
case 'FIND_PATH': {
|
|
28
|
-
if (!navmesh) {
|
|
29
|
-
throw new Error('NavMesh not initialized');
|
|
30
|
-
}
|
|
31
|
-
const start = performance.now();
|
|
32
|
-
const path = navmesh.findPath({ from: msg.from, to: msg.to });
|
|
33
|
-
const duration = performance.now() - start;
|
|
34
|
-
const result = {
|
|
35
|
-
type: 'PATH_RESULT',
|
|
36
|
-
id: msg.id,
|
|
37
|
-
path,
|
|
38
|
-
duration,
|
|
39
|
-
};
|
|
40
|
-
self.postMessage(result);
|
|
41
|
-
break;
|
|
42
|
-
}
|
|
43
|
-
case 'ADD_OBSTACLE': {
|
|
44
|
-
if (!navmesh) {
|
|
45
|
-
throw new Error('NavMesh not initialized');
|
|
46
|
-
}
|
|
47
|
-
const obstacleId = navmesh.addObstacle(msg.obstacle);
|
|
48
|
-
const result = {
|
|
49
|
-
type: 'OBSTACLE_ADDED',
|
|
50
|
-
obstacleId,
|
|
51
|
-
};
|
|
52
|
-
self.postMessage(result);
|
|
53
|
-
break;
|
|
54
|
-
}
|
|
55
|
-
case 'REMOVE_OBSTACLE': {
|
|
56
|
-
if (!navmesh) {
|
|
57
|
-
throw new Error('NavMesh not initialized');
|
|
58
|
-
}
|
|
59
|
-
navmesh.removeObstacle(msg.obstacleId);
|
|
60
|
-
self.postMessage({ type: 'OBSTACLE_REMOVED' });
|
|
61
|
-
break;
|
|
62
|
-
}
|
|
63
|
-
case 'MOVE_OBSTACLE': {
|
|
64
|
-
if (!navmesh) {
|
|
65
|
-
throw new Error('NavMesh not initialized');
|
|
66
|
-
}
|
|
67
|
-
navmesh.moveObstacle(msg.obstacleId, msg.pos);
|
|
68
|
-
self.postMessage({ type: 'OBSTACLE_MOVED' });
|
|
69
|
-
break;
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
catch (error) {
|
|
74
|
-
self.postMessage({
|
|
75
|
-
type: 'ERROR',
|
|
76
|
-
error: error instanceof Error ? error.message : String(error)
|
|
77
|
-
});
|
|
78
|
-
}
|
|
79
|
-
};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export * from './pooled-codec';
|
|
@@ -1,410 +0,0 @@
|
|
|
1
|
-
import { BinaryCodec } from "../binary-codec";
|
|
2
|
-
/**
|
|
3
|
-
* Generic object pool for reusing objects and minimizing allocations.
|
|
4
|
-
* @template T Type of objects stored in the pool.
|
|
5
|
-
*/
|
|
6
|
-
export class ObjectPool {
|
|
7
|
-
/**
|
|
8
|
-
* @param factory Function to create a new instance when the pool is empty.
|
|
9
|
-
*/
|
|
10
|
-
constructor(factory) {
|
|
11
|
-
this.factory = factory;
|
|
12
|
-
this.pool = [];
|
|
13
|
-
}
|
|
14
|
-
/**
|
|
15
|
-
* Acquire an object from the pool, or create a new one if empty.
|
|
16
|
-
* @returns {T} The acquired object.
|
|
17
|
-
*/
|
|
18
|
-
acquire() {
|
|
19
|
-
return this.pool.pop() ?? this.factory();
|
|
20
|
-
}
|
|
21
|
-
/**
|
|
22
|
-
* Return an object to the pool for reuse.
|
|
23
|
-
* @param {T} obj Object to release.
|
|
24
|
-
*/
|
|
25
|
-
release(obj) {
|
|
26
|
-
this.pool.push(obj);
|
|
27
|
-
}
|
|
28
|
-
/**
|
|
29
|
-
* Return multiple objects to the pool at once.
|
|
30
|
-
* @param {T[]} objs Array of objects to release.
|
|
31
|
-
*/
|
|
32
|
-
releaseAll(objs) {
|
|
33
|
-
this.pool.push(...objs);
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
/**
|
|
37
|
-
* Pooled decoder for single objects or nested schemas.
|
|
38
|
-
* @template T Type of object to decode.
|
|
39
|
-
*/
|
|
40
|
-
export class PooledDecoder {
|
|
41
|
-
/**
|
|
42
|
-
* @param schema Schema or record describing the object structure.
|
|
43
|
-
* @param initial Initial object used as template for pooling.
|
|
44
|
-
*/
|
|
45
|
-
constructor(schema) {
|
|
46
|
-
this.schema = schema;
|
|
47
|
-
this.pool = new ObjectPool(() => this.createNil());
|
|
48
|
-
}
|
|
49
|
-
createNil() {
|
|
50
|
-
const obj = {};
|
|
51
|
-
for (const key of Object.keys(this.schema)) {
|
|
52
|
-
const field = this.schema[key];
|
|
53
|
-
obj[key] = "toNil" in field ? field.toNil() : undefined;
|
|
54
|
-
}
|
|
55
|
-
return obj;
|
|
56
|
-
}
|
|
57
|
-
/**
|
|
58
|
-
* Decode a buffer into a pooled object.
|
|
59
|
-
* @param {Uint8Array} buf Buffer to decode.
|
|
60
|
-
* @returns {T} Decoded object.
|
|
61
|
-
*/
|
|
62
|
-
decode(buf) {
|
|
63
|
-
const obj = this.pool.acquire();
|
|
64
|
-
this.decodeInto(buf, obj);
|
|
65
|
-
return obj;
|
|
66
|
-
}
|
|
67
|
-
/**
|
|
68
|
-
* Decode a buffer into a provided target object.
|
|
69
|
-
* @param {Uint8Array} buf Buffer to decode.
|
|
70
|
-
* @param {T} target Object to write decoded data into.
|
|
71
|
-
*/
|
|
72
|
-
decodeInto(buf, target) {
|
|
73
|
-
let offset = 0;
|
|
74
|
-
for (const key of Object.keys(this.schema)) {
|
|
75
|
-
const field = this.schema[key];
|
|
76
|
-
if ("decodeAll" in field) {
|
|
77
|
-
const result = field.decodeAll(buf.subarray(offset));
|
|
78
|
-
target[key] = result.value;
|
|
79
|
-
offset += result.bytesRead;
|
|
80
|
-
}
|
|
81
|
-
else if ("decodeField" in field) {
|
|
82
|
-
// Use decodeField for ArrayField (returns { value, bytesRead })
|
|
83
|
-
const result = field.decodeField(buf.subarray(offset));
|
|
84
|
-
target[key] = result.value;
|
|
85
|
-
offset += result.bytesRead;
|
|
86
|
-
}
|
|
87
|
-
else if ("decode" in field) {
|
|
88
|
-
const result = field.decode(buf.subarray(offset));
|
|
89
|
-
target[key] = result.value;
|
|
90
|
-
offset += result.bytesRead;
|
|
91
|
-
}
|
|
92
|
-
else {
|
|
93
|
-
// For primitive fields, calculate size and decode
|
|
94
|
-
const fieldSize = field.size || 0;
|
|
95
|
-
const fieldBuf = buf.subarray(offset, offset + fieldSize);
|
|
96
|
-
BinaryCodec.decodeInto({ [key]: field }, fieldBuf, target);
|
|
97
|
-
offset += fieldSize;
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
/**
|
|
102
|
-
* Release a decoded object back to the pool.
|
|
103
|
-
* @param {T} obj Object to release.
|
|
104
|
-
*/
|
|
105
|
-
release(obj) {
|
|
106
|
-
this.pool.release(obj);
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
/**
|
|
110
|
-
* Pooled decoder for arrays of objects.
|
|
111
|
-
* @template T Type of object to decode.
|
|
112
|
-
*/
|
|
113
|
-
export class PooledArrayDecoder {
|
|
114
|
-
/**
|
|
115
|
-
* @param schema Schema or record describing object structure.
|
|
116
|
-
* @param initial Initial object used as template for pooling.
|
|
117
|
-
*/
|
|
118
|
-
constructor(schema) {
|
|
119
|
-
this.pooledDecoder = new PooledDecoder(schema);
|
|
120
|
-
}
|
|
121
|
-
/**
|
|
122
|
-
* Decode multiple buffers into pooled objects.
|
|
123
|
-
* @param {Uint8Array[]} buffers Array of buffers to decode.
|
|
124
|
-
* @returns {T[]} Array of decoded objects.
|
|
125
|
-
*/
|
|
126
|
-
decodeAll(buffers) {
|
|
127
|
-
return buffers.map((b) => this.pooledDecoder.decode(b));
|
|
128
|
-
}
|
|
129
|
-
/**
|
|
130
|
-
* Release multiple decoded objects back to the pool.
|
|
131
|
-
* @param {T[]} objs Array of objects to release.
|
|
132
|
-
*/
|
|
133
|
-
releaseAll(objs) {
|
|
134
|
-
objs.forEach((o) => this.pooledDecoder.release(o));
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
/**
|
|
138
|
-
* Pooled encoder for single objects or nested schemas.
|
|
139
|
-
* @template T Type of object to encode.
|
|
140
|
-
*/
|
|
141
|
-
export class PooledEncoder {
|
|
142
|
-
/**
|
|
143
|
-
* @param schema Schema or record describing object structure.
|
|
144
|
-
* @param bufferSize Size of buffer to allocate per encoding (default: 1024).
|
|
145
|
-
*/
|
|
146
|
-
constructor(schema, bufferSize = 1024) {
|
|
147
|
-
this.schema = schema;
|
|
148
|
-
this.bufferSize = bufferSize;
|
|
149
|
-
this.pool = new ObjectPool(() => new Uint8Array(bufferSize));
|
|
150
|
-
}
|
|
151
|
-
/**
|
|
152
|
-
* Encode an object into a pooled buffer.
|
|
153
|
-
* @param {T} obj Object to encode.
|
|
154
|
-
* @returns {Uint8Array} Encoded buffer.
|
|
155
|
-
*/
|
|
156
|
-
encode(obj) {
|
|
157
|
-
const buf = this.pool.acquire();
|
|
158
|
-
let offset = 0;
|
|
159
|
-
for (const key of Object.keys(this.schema)) {
|
|
160
|
-
const field = this.schema[key];
|
|
161
|
-
if ("encode" in field) {
|
|
162
|
-
const nested = field.encode(obj[key]);
|
|
163
|
-
buf.set(nested, offset);
|
|
164
|
-
offset += nested.length;
|
|
165
|
-
}
|
|
166
|
-
else if ("encodeAll" in field) {
|
|
167
|
-
const nestedArr = field.encodeAll(obj[key]);
|
|
168
|
-
let arrOffset = 0;
|
|
169
|
-
for (const item of nestedArr) {
|
|
170
|
-
buf.set(item, offset + arrOffset);
|
|
171
|
-
arrOffset += item.length;
|
|
172
|
-
}
|
|
173
|
-
offset += arrOffset;
|
|
174
|
-
}
|
|
175
|
-
else {
|
|
176
|
-
const tmp = BinaryCodec.encode({ [key]: field }, { [key]: obj[key] });
|
|
177
|
-
buf.set(tmp, offset);
|
|
178
|
-
offset += tmp.length;
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
return buf.subarray(0, offset);
|
|
182
|
-
}
|
|
183
|
-
/**
|
|
184
|
-
* Release a buffer back to the pool.
|
|
185
|
-
* @param {Uint8Array} buf Buffer to release.
|
|
186
|
-
*/
|
|
187
|
-
release(buf) {
|
|
188
|
-
this.pool.release(buf);
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
/**
|
|
192
|
-
* Combined pooled encoder and decoder for a single schema.
|
|
193
|
-
* Provides a convenient wrapper around PooledEncoder and PooledDecoder.
|
|
194
|
-
* @template S Schema type
|
|
195
|
-
*/
|
|
196
|
-
export class PooledCodec {
|
|
197
|
-
/**
|
|
198
|
-
* @param schema Schema describing the object structure.
|
|
199
|
-
*/
|
|
200
|
-
constructor(schema) {
|
|
201
|
-
this.schema = schema;
|
|
202
|
-
this.encoder = new PooledEncoder(schema);
|
|
203
|
-
this.decoder = new PooledDecoder(schema);
|
|
204
|
-
}
|
|
205
|
-
/**
|
|
206
|
-
* Calculate the size in bytes needed to encode the data.
|
|
207
|
-
* @param data Object to calculate size for.
|
|
208
|
-
* @returns Size in bytes.
|
|
209
|
-
*/
|
|
210
|
-
calculateSize(data) {
|
|
211
|
-
let size = 0;
|
|
212
|
-
for (const key of Object.keys(this.schema)) {
|
|
213
|
-
const field = this.schema[key];
|
|
214
|
-
if ("size" in field) {
|
|
215
|
-
// Fixed-size primitive field
|
|
216
|
-
size += field.size;
|
|
217
|
-
}
|
|
218
|
-
else if ("calculateSize" in field) {
|
|
219
|
-
// Variable-size field (like arrays)
|
|
220
|
-
size += field.calculateSize(data[key]);
|
|
221
|
-
}
|
|
222
|
-
}
|
|
223
|
-
return size;
|
|
224
|
-
}
|
|
225
|
-
/**
|
|
226
|
-
* Encode an object directly into a target buffer at the given offset.
|
|
227
|
-
* This is a zero-copy operation - no intermediate buffers are allocated.
|
|
228
|
-
* @param data Object to encode.
|
|
229
|
-
* @param buffer Target buffer to write into.
|
|
230
|
-
* @param offset Byte offset in the buffer to start writing.
|
|
231
|
-
* @returns Number of bytes written.
|
|
232
|
-
*/
|
|
233
|
-
encodeInto(data, buffer, offset) {
|
|
234
|
-
const view = new DataView(buffer.buffer, buffer.byteOffset);
|
|
235
|
-
let currentOffset = offset;
|
|
236
|
-
for (const key of Object.keys(this.schema)) {
|
|
237
|
-
const field = this.schema[key];
|
|
238
|
-
if ("write" in field) {
|
|
239
|
-
// Primitive field - direct write
|
|
240
|
-
field.write(view, currentOffset, data[key]);
|
|
241
|
-
currentOffset += field.size;
|
|
242
|
-
}
|
|
243
|
-
else if ("encodeInto" in field) {
|
|
244
|
-
// Array or nested field - delegate to its encodeInto
|
|
245
|
-
const bytesWritten = field.encodeInto(data[key], buffer, currentOffset);
|
|
246
|
-
currentOffset += bytesWritten;
|
|
247
|
-
}
|
|
248
|
-
else if ("encode" in field) {
|
|
249
|
-
// Fallback for fields that only have encode()
|
|
250
|
-
const nested = field.encode(data[key]);
|
|
251
|
-
buffer.set(nested, currentOffset);
|
|
252
|
-
currentOffset += nested.length;
|
|
253
|
-
}
|
|
254
|
-
}
|
|
255
|
-
return currentOffset - offset; // bytes written
|
|
256
|
-
}
|
|
257
|
-
/**
|
|
258
|
-
* Encode an object into a pooled buffer.
|
|
259
|
-
* @param data Object to encode.
|
|
260
|
-
* @returns Encoded buffer.
|
|
261
|
-
*/
|
|
262
|
-
encode(data) {
|
|
263
|
-
return this.encoder.encode(data);
|
|
264
|
-
}
|
|
265
|
-
/**
|
|
266
|
-
* Decode a buffer into a pooled object.
|
|
267
|
-
* @param buf Buffer to decode.
|
|
268
|
-
* @returns Decoded object.
|
|
269
|
-
*/
|
|
270
|
-
decode(buf) {
|
|
271
|
-
return this.decoder.decode(buf);
|
|
272
|
-
}
|
|
273
|
-
/**
|
|
274
|
-
* Release a decoded object back to the pool.
|
|
275
|
-
* @param obj Object to release.
|
|
276
|
-
*/
|
|
277
|
-
release(obj) {
|
|
278
|
-
this.decoder.release(obj);
|
|
279
|
-
}
|
|
280
|
-
/**
|
|
281
|
-
* Creates an array field descriptor for use in schemas.
|
|
282
|
-
* Encodes array length as u16 followed by each item.
|
|
283
|
-
*
|
|
284
|
-
* @template U Type of items in the array
|
|
285
|
-
* @param itemSchema Schema for individual array items
|
|
286
|
-
* @returns An array field descriptor that can be used in PooledCodec schemas
|
|
287
|
-
*
|
|
288
|
-
* @example
|
|
289
|
-
* ```ts
|
|
290
|
-
* const PlayerSchema = {
|
|
291
|
-
* entityId: BinaryPrimitives.u32,
|
|
292
|
-
* x: BinaryPrimitives.f32,
|
|
293
|
-
* y: BinaryPrimitives.f32,
|
|
294
|
-
* };
|
|
295
|
-
*
|
|
296
|
-
* const UpdateSchema = {
|
|
297
|
-
* tick: BinaryPrimitives.u32,
|
|
298
|
-
* players: PooledCodec.array(PlayerSchema),
|
|
299
|
-
* };
|
|
300
|
-
*
|
|
301
|
-
* const codec = new PooledCodec(UpdateSchema);
|
|
302
|
-
* ```
|
|
303
|
-
*/
|
|
304
|
-
static array(itemSchema) {
|
|
305
|
-
// Calculate item size once
|
|
306
|
-
let itemSize = 0;
|
|
307
|
-
for (const key of Object.keys(itemSchema)) {
|
|
308
|
-
const field = itemSchema[key];
|
|
309
|
-
itemSize += field.size || 0;
|
|
310
|
-
}
|
|
311
|
-
// Pool for encoding buffers (larger initial size to avoid allocations)
|
|
312
|
-
const bufferPool = new ObjectPool(() => new Uint8Array(16384));
|
|
313
|
-
// Pool for decoded objects to avoid allocations
|
|
314
|
-
const objectPool = new ObjectPool(() => {
|
|
315
|
-
const obj = {};
|
|
316
|
-
for (const key of Object.keys(itemSchema)) {
|
|
317
|
-
const field = itemSchema[key];
|
|
318
|
-
obj[key] = ("toNil" in field ? field.toNil() : undefined);
|
|
319
|
-
}
|
|
320
|
-
return obj;
|
|
321
|
-
});
|
|
322
|
-
// Pool for result arrays to avoid allocations
|
|
323
|
-
const arrayPool = new ObjectPool(() => []);
|
|
324
|
-
// Reusable DataView for encoding
|
|
325
|
-
let encodeView = null;
|
|
326
|
-
// Reusable DataView for decoding
|
|
327
|
-
let decodeView = null;
|
|
328
|
-
return {
|
|
329
|
-
__arrayType: undefined,
|
|
330
|
-
calculateSize(items) {
|
|
331
|
-
return 2 + (items.length * itemSize);
|
|
332
|
-
},
|
|
333
|
-
encodeInto(items, buffer, offset) {
|
|
334
|
-
const view = new DataView(buffer.buffer, buffer.byteOffset);
|
|
335
|
-
// Write array length
|
|
336
|
-
view.setUint16(offset, items.length, false);
|
|
337
|
-
let currentOffset = offset + 2;
|
|
338
|
-
// Write each item directly into buffer
|
|
339
|
-
for (const item of items) {
|
|
340
|
-
for (const key of Object.keys(itemSchema)) {
|
|
341
|
-
const field = itemSchema[key];
|
|
342
|
-
field.write(view, currentOffset, item[key]);
|
|
343
|
-
currentOffset += field.size;
|
|
344
|
-
}
|
|
345
|
-
}
|
|
346
|
-
return currentOffset - offset; // bytes written
|
|
347
|
-
},
|
|
348
|
-
encode(items) {
|
|
349
|
-
const totalSize = 2 + (items.length * itemSize);
|
|
350
|
-
let buffer = bufferPool.acquire();
|
|
351
|
-
// Grow buffer pool if needed (but keep the undersized buffer for next time)
|
|
352
|
-
if (buffer.length < totalSize) {
|
|
353
|
-
bufferPool.release(buffer);
|
|
354
|
-
buffer = new Uint8Array(Math.max(totalSize, buffer.length * 2));
|
|
355
|
-
}
|
|
356
|
-
// Create or reuse DataView for this buffer
|
|
357
|
-
if (!encodeView || encodeView.buffer !== buffer.buffer) {
|
|
358
|
-
encodeView = new DataView(buffer.buffer, buffer.byteOffset);
|
|
359
|
-
}
|
|
360
|
-
// Write array length
|
|
361
|
-
encodeView.setUint16(0, items.length, false);
|
|
362
|
-
// Write each item directly into buffer (zero intermediate allocations)
|
|
363
|
-
let offset = 2;
|
|
364
|
-
for (const item of items) {
|
|
365
|
-
for (const key of Object.keys(itemSchema)) {
|
|
366
|
-
const field = itemSchema[key];
|
|
367
|
-
field.write(encodeView, offset, item[key]);
|
|
368
|
-
offset += field.size;
|
|
369
|
-
}
|
|
370
|
-
}
|
|
371
|
-
// Create a copy to return (caller owns this memory)
|
|
372
|
-
const result = new Uint8Array(offset);
|
|
373
|
-
result.set(buffer.subarray(0, offset));
|
|
374
|
-
// Return buffer to pool
|
|
375
|
-
bufferPool.release(buffer);
|
|
376
|
-
return result;
|
|
377
|
-
},
|
|
378
|
-
decodeField(buf) {
|
|
379
|
-
// Read array length directly from buffer
|
|
380
|
-
const length = (buf[0] << 8) | buf[1];
|
|
381
|
-
// Acquire pooled array and resize if needed
|
|
382
|
-
const items = arrayPool.acquire();
|
|
383
|
-
items.length = length;
|
|
384
|
-
// Create or reuse DataView for reading
|
|
385
|
-
if (!decodeView || decodeView.buffer !== buf.buffer || decodeView.byteOffset !== buf.byteOffset) {
|
|
386
|
-
decodeView = new DataView(buf.buffer, buf.byteOffset);
|
|
387
|
-
}
|
|
388
|
-
// Read each item using pooled objects
|
|
389
|
-
let offset = 2;
|
|
390
|
-
for (let i = 0; i < length; i++) {
|
|
391
|
-
const item = objectPool.acquire();
|
|
392
|
-
// Decode directly into pooled object
|
|
393
|
-
for (const key of Object.keys(itemSchema)) {
|
|
394
|
-
const field = itemSchema[key];
|
|
395
|
-
item[key] = field.read(decodeView, offset);
|
|
396
|
-
offset += field.size;
|
|
397
|
-
}
|
|
398
|
-
items[i] = item;
|
|
399
|
-
}
|
|
400
|
-
return { value: items, bytesRead: offset };
|
|
401
|
-
},
|
|
402
|
-
decode(buf) {
|
|
403
|
-
return this.decodeField(buf).value;
|
|
404
|
-
},
|
|
405
|
-
toNil() {
|
|
406
|
-
return [];
|
|
407
|
-
}
|
|
408
|
-
};
|
|
409
|
-
}
|
|
410
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export * from './prediction';
|
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @template T
|
|
3
|
-
* @description
|
|
4
|
-
* Tracks client-side intents that have been sent to the server but not yet confirmed.
|
|
5
|
-
* Used for prediction and reconciliation in a server-authoritative architecture.
|
|
6
|
-
*/
|
|
7
|
-
export class IntentTracker {
|
|
8
|
-
constructor() {
|
|
9
|
-
this.tracker = new Map();
|
|
10
|
-
}
|
|
11
|
-
get size() {
|
|
12
|
-
return this.tracker.size;
|
|
13
|
-
}
|
|
14
|
-
/**
|
|
15
|
-
* Adds a new intent for a specific tick.
|
|
16
|
-
* @param {number} tick - The tick number associated with the intent.
|
|
17
|
-
* @param {T} intent - The intent data.
|
|
18
|
-
*/
|
|
19
|
-
track(tick, intent) {
|
|
20
|
-
if (!this.tracker.has(tick)) {
|
|
21
|
-
this.tracker.set(tick, []);
|
|
22
|
-
}
|
|
23
|
-
this.tracker.get(tick).push(intent);
|
|
24
|
-
return intent;
|
|
25
|
-
}
|
|
26
|
-
/**
|
|
27
|
-
* Removes all intents up to and including a given tick.
|
|
28
|
-
* Returns the remaining intents in ascending tick order.
|
|
29
|
-
* @param {number} tick - The tick up to which intents should be dropped.
|
|
30
|
-
* @returns {T[]} Array of remaining intents.
|
|
31
|
-
*/
|
|
32
|
-
dropUpTo(tick) {
|
|
33
|
-
const remaining = [];
|
|
34
|
-
for (const [t, intents] of this.tracker) {
|
|
35
|
-
if (t <= tick)
|
|
36
|
-
this.tracker.delete(t);
|
|
37
|
-
else
|
|
38
|
-
remaining.push([t, intents]);
|
|
39
|
-
}
|
|
40
|
-
// sort by tick ascending
|
|
41
|
-
remaining.sort(([a], [b]) => a - b);
|
|
42
|
-
return remaining.map(([_, intents]) => intents).flat();
|
|
43
|
-
}
|
|
44
|
-
/**
|
|
45
|
-
* Returns all currently tracked intents in ascending tick order.
|
|
46
|
-
* @returns {T[]}
|
|
47
|
-
*/
|
|
48
|
-
values() {
|
|
49
|
-
return Array.from(this.tracker.entries())
|
|
50
|
-
.sort(([a], [b]) => a - b)
|
|
51
|
-
.map(([_, intents]) => intents)
|
|
52
|
-
.flat();
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
/**
|
|
56
|
-
* @template T,U
|
|
57
|
-
* @description
|
|
58
|
-
* Handles client-side reconciliation of authoritative snapshots with unconfirmed intents.
|
|
59
|
-
* Used for prediction correction in server-authoritative multiplayer games.
|
|
60
|
-
*/
|
|
61
|
-
export class Reconciliator {
|
|
62
|
-
/**
|
|
63
|
-
* @param {Object} options - Callbacks for applying snapshot state and replaying intents.
|
|
64
|
-
* @param {(snapshotState: U) => void} options.onLoadState - Called to load authoritative snapshot state.
|
|
65
|
-
* @param {(remainingIntents: T[]) => void} options.onReplay - Called to reapply remaining intents for prediction.
|
|
66
|
-
*/
|
|
67
|
-
constructor(options) {
|
|
68
|
-
this.options = options;
|
|
69
|
-
this.tracker = new IntentTracker();
|
|
70
|
-
}
|
|
71
|
-
/**
|
|
72
|
-
* Adds a new intent to the tracker.
|
|
73
|
-
* @param {number} tick - Tick number associated with the intent.
|
|
74
|
-
* @param {T} intent - The intent data.
|
|
75
|
-
*/
|
|
76
|
-
trackIntent(tick, intent) {
|
|
77
|
-
this.tracker.track(tick, intent);
|
|
78
|
-
}
|
|
79
|
-
/**
|
|
80
|
-
* Called when an authoritative snapshot is received from the server.
|
|
81
|
-
* Resets client state and replays unconfirmed intents.
|
|
82
|
-
* @param {Object} snapshot - The snapshot from the server.
|
|
83
|
-
* @param {number} snapshot.tick - Tick number of the snapshot.
|
|
84
|
-
* @param {U} snapshot.state - The authoritative state.
|
|
85
|
-
*/
|
|
86
|
-
onSnapshot(snapshot) {
|
|
87
|
-
// 1. Load authoritative state
|
|
88
|
-
this.options.onLoadState(snapshot.state);
|
|
89
|
-
// 2. Remove confirmed intents and get remaining
|
|
90
|
-
const remainingIntents = this.tracker.dropUpTo(snapshot.tick);
|
|
91
|
-
// 3. Only replay if there are actually remaining intents
|
|
92
|
-
if (remainingIntents.length > 0) {
|
|
93
|
-
this.options.onReplay(remainingIntents);
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
replay(intents) {
|
|
97
|
-
this.options.onReplay(intents);
|
|
98
|
-
}
|
|
99
|
-
}
|
package/dist/core.esm.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
var se=Object.defineProperty;var re=(n,e)=>()=>(n&&(e=n(n=0)),e);var oe=(n,e)=>{for(var t in e)se(n,t,{get:e[t],enumerable:!0})};var _={};oe(_,{NavMeshWorkerPool:()=>O});var O,j=re(()=>{O=class{constructor(e,t,s="grid",r=[]){this.poolSize=e;this.workerPath=t;this.navType=s;this.obstacles=r;this.workers=[];this.nextWorkerIndex=0;this.requestId=0;this.pendingRequests=new Map;this.initialized=!1}async init(){if(this.initialized)return;let e=[];for(let t=0;t<this.poolSize;t++){let s=new Worker(this.workerPath,{type:"module"});s.onmessage=a=>{let o=a.data;if(o.type==="PATH_RESULT"){let i=this.pendingRequests.get(o.id);i&&(i.resolve(o.path),this.pendingRequests.delete(o.id))}else if(o.type==="ERROR")for(let[i,l]of this.pendingRequests.entries())l.reject(new Error(o.error)),this.pendingRequests.delete(i)},s.onerror=a=>{console.error("Worker error:",a);for(let[o,i]of this.pendingRequests.entries())i.reject(new Error("Worker error")),this.pendingRequests.delete(o)},this.workers.push(s);let r=new Promise(a=>{let o=i=>{i.data.type==="READY"&&(s.removeEventListener("message",o),a())};s.addEventListener("message",o)});s.postMessage({type:"INIT",navType:this.navType,obstacles:this.obstacles}),e.push(r)}await Promise.all(e),this.initialized=!0}async findPath(e,t){if(!this.initialized)throw new Error("Worker pool not initialized. Call init() first.");let s=this.requestId++,r=this.workers[this.nextWorkerIndex];return this.nextWorkerIndex=(this.nextWorkerIndex+1)%this.workers.length,new Promise((a,o)=>{this.pendingRequests.set(s,{id:s,from:e,to:t,resolve:a,reject:o}),r.postMessage({type:"FIND_PATH",id:s,from:e,to:t})})}async addObstacle(e){if(!this.initialized)throw new Error("Worker pool not initialized. Call init() first.");let t=this.workers.map(r=>new Promise(a=>{let o=i=>{i.data.type==="OBSTACLE_ADDED"&&(r.removeEventListener("message",o),a(i.data.obstacleId))};r.addEventListener("message",o),r.postMessage({type:"ADD_OBSTACLE",obstacle:e})}));return(await Promise.all(t))[0]}async removeObstacle(e){if(!this.initialized)throw new Error("Worker pool not initialized. Call init() first.");let t=this.workers.map(s=>new Promise(r=>{let a=o=>{o.data.type==="OBSTACLE_REMOVED"&&(s.removeEventListener("message",a),r())};s.addEventListener("message",a),s.postMessage({type:"REMOVE_OBSTACLE",obstacleId:e})}));await Promise.all(t)}async moveObstacle(e,t){if(!this.initialized)throw new Error("Worker pool not initialized. Call init() first.");let s=this.workers.map(r=>new Promise(a=>{let o=i=>{i.data.type==="OBSTACLE_MOVED"&&(r.removeEventListener("message",o),a())};r.addEventListener("message",o),r.postMessage({type:"MOVE_OBSTACLE",obstacleId:e,pos:t})}));await Promise.all(s)}terminate(){for(let e of this.workers)e.terminate();this.workers=[],this.pendingRequests.clear(),this.initialized=!1}get pendingCount(){return this.pendingRequests.size}get size(){return this.workers.length}}});var C=Symbol("schemaSize");function D(n){let e=n[C];if(e!==void 0)return e;let t=0;for(let s of Object.keys(n))t+=n[s].size;return n[C]=t,t}var M=class{static encodeInto(e,t){let s=D(e),r=new ArrayBuffer(s),a=new DataView(r),o=0;for(let i of Object.keys(e)){let l=e[i];l.write(a,o,t[i]),o+=l.size}return new Uint8Array(r)}static decodeInto(e,t,s){let r=D(e);if(t.byteLength<r)throw new RangeError(`Buffer too small: expected ${r} bytes, got ${t.byteLength}`);let a=new DataView(t.buffer,t.byteOffset,t.byteLength),o=0;for(let i of Object.keys(e)){let l=e[i];s[i]=l.read(a,o),o+=l.size}return s}},y=class{static{this.u8={size:1,write:(e,t,s)=>e.setUint8(t,s),read:(e,t)=>e.getUint8(t),toNil:()=>0}}static{this.u16={size:2,write:(e,t,s)=>e.setUint16(t,s,!1),read:(e,t)=>e.getUint16(t,!1),toNil:()=>0}}static{this.u32={size:4,write:(e,t,s)=>e.setUint32(t,s,!1),read:(e,t)=>e.getUint32(t,!1),toNil:()=>0}}static{this.i8={size:1,write:(e,t,s)=>e.setInt8(t,s),read:(e,t)=>e.getInt8(t),toNil:()=>0}}static{this.i16={size:2,write:(e,t,s)=>e.setInt16(t,s,!1),read:(e,t)=>e.getInt16(t,!1),toNil:()=>0}}static{this.i32={size:4,write:(e,t,s)=>e.setInt32(t,s,!1),read:(e,t)=>e.getInt32(t,!1),toNil:()=>0}}static{this.f32={size:4,write:(e,t,s)=>e.setFloat32(t,s,!1),read:(e,t)=>e.getFloat32(t,!1),toNil:()=>0}}static{this.f64={size:8,write:(e,t,s)=>e.setFloat64(t,s,!1),read:(e,t)=>e.getFloat64(t,!1),toNil:()=>0}}static{this.bool={size:1,write:(e,t,s)=>e.setUint8(t,s?1:0),read:(e,t)=>e.getUint8(t)!==0,toNil:()=>!1}}static string(e){return{size:e+2,write(t,s,r){let o=new TextEncoder().encode(r);if(o.length>e)throw new RangeError(`String too long, max ${e} bytes`);t.setUint16(s,o.length,!1);for(let i=0;i<o.length;i++)t.setUint8(s+2+i,o[i]);for(let i=o.length;i<e;i++)t.setUint8(s+2+i,0)},read(t,s){let r=t.getUint16(s,!1),a=new Uint8Array(r);for(let o=0;o<r;o++)a[o]=t.getUint8(s+2+o);return new TextDecoder().decode(a)},toNil:()=>""}}static{this.vec2={size:8,write(e,t,s){e.setFloat32(t,s.x,!1),e.setFloat32(t+4,s.y,!1)},read(e,t){return{x:e.getFloat32(t,!1),y:e.getFloat32(t+4,!1)}},toNil:()=>({x:0,y:0})}}static{this.vec3={size:12,write(e,t,s){e.setFloat32(t,s.x,!1),e.setFloat32(t+4,s.y,!1),e.setFloat32(t+8,s.z,!1)},read(e,t){return{x:e.getFloat32(t,!1),y:e.getFloat32(t+4,!1),z:e.getFloat32(t+8,!1)}},toNil:()=>({x:0,y:0,z:0})}}static{this.color={size:4,write(e,t,s){e.setUint8(t,s.r),e.setUint8(t+1,s.g),e.setUint8(t+2,s.b),e.setUint8(t+3,s.a)},read(e,t){return{r:e.getUint8(t),g:e.getUint8(t+1),b:e.getUint8(t+2),a:e.getUint8(t+3)}},toNil:()=>({r:0,g:0,b:0,a:0})}}static{this.f32_le={size:4,write:(e,t,s)=>e.setFloat32(t,s,!0),read:(e,t)=>e.getFloat32(t,!0),toNil:()=>0}}static{this.f64_le={size:8,write:(e,t,s)=>e.setFloat64(t,s,!0),read:(e,t)=>e.getFloat64(t,!0),toNil:()=>0}}static{this.u16_le={size:2,write:(e,t,s)=>e.setUint16(t,s,!0),read:(e,t)=>e.getUint16(t,!0),toNil:()=>0}}static{this.u32_le={size:4,write:(e,t,s)=>e.setUint32(t,s,!0),read:(e,t)=>e.getUint32(t,!0),toNil:()=>0}}static{this.i16_le={size:2,write:(e,t,s)=>e.setInt16(t,s,!0),read:(e,t)=>e.getInt16(t,!0),toNil:()=>0}}static{this.i32_le={size:4,write:(e,t,s)=>e.setInt32(t,s,!0),read:(e,t)=>e.getInt32(t,!0),toNil:()=>0}}static{this.vec2_le={size:8,write:(e,t,s)=>{e.setFloat32(t,s[0],!0),e.setFloat32(t+4,s[1],!0)},read:(e,t)=>[e.getFloat32(t,!0),e.getFloat32(t+4,!0)],toNil:()=>[0,0]}}static{this.vec3_le={size:12,write:(e,t,s)=>{e.setFloat32(t,s[0],!0),e.setFloat32(t+4,s[1],!0),e.setFloat32(t+8,s[2],!0)},read:(e,t)=>[e.getFloat32(t,!0),e.getFloat32(t+4,!0),e.getFloat32(t+8,!0)],toNil:()=>[0,0,0]}}static{this.vec4_le={size:16,write:(e,t,s)=>{e.setFloat32(t,s[0],!0),e.setFloat32(t+4,s[1],!0),e.setFloat32(t+8,s[2],!0),e.setFloat32(t+12,s[3],!0)},read:(e,t)=>[e.getFloat32(t,!0),e.getFloat32(t+4,!0),e.getFloat32(t+8,!0),e.getFloat32(t+12,!0)],toNil:()=>[0,0,0,0]}}},v=class extends M{static{this.u8=y.u8}static{this.u16=y.u16}static{this.u32=y.u32}static{this.i8=y.i8}static{this.i16=y.i16}static{this.i32=y.i32}static{this.f32=y.f32}static{this.bool=y.bool}static{this.string=y.string}static{this.vec2=y.vec2}static{this.vec3=y.vec3}static{this.color=y.color}static encode(e,t){return this.encodeInto(e,t)}static decode(e,t,s){return this.decodeInto(e,t,s)}};var L=class{constructor({events:e}){this.callbacks=new Map,this.events=e;for(let t of this.events)this.callbacks.set(t,new Set)}on(e,t){let s=this.callbacks.get(e);if(!s)return console.warn(`Event "${e}" does not exist.`);s.add(t)}once(e,t){let s=r=>{t(r),this.off(e,s)};this.on(e,s)}emit(e,t){let s=this.callbacks.get(e);if(!s)return console.warn(`Event "${e}" does not exist.`);for(let r of s)r(t)}off(e,t){let s=this.callbacks.get(e);if(!s)return console.warn(`Event "${e}" does not exist.`);s.delete(t)}clear(e){if(!e){this.callbacks.clear();for(let s of this.events)this.callbacks.set(s,new Set);return}let t=this.callbacks.get(e);if(!t)return console.warn(`Event "${e}" does not exist.`);t.clear()}};var W=class{constructor({rate:e,onTick:t}){this.accumulator=0;this._tickCount=0;this.rate=e,this.intervalMs=1e3/this.rate,this.onTick=t,this.maxTicksPerFrame=Math.max(1,Math.floor(e/2))}getTicks(e){this.accumulator+=e*1e3;let t=0,s=this.intervalMs*.001;for(;this.accumulator>=this.intervalMs-s&&t<this.maxTicksPerFrame;)this.accumulator-=this.intervalMs,t++;let r=Math.floor(this.accumulator/this.intervalMs);return r>0&&this.onTickSkipped&&this.onTickSkipped(r),t}tick(e){let t=this.getTicks(e);for(let s=0;s<t;s++)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)}};function we(n={}){let{prefix:e="",size:t=16}=n,s=Math.max(t-e.length,8),r=Math.ceil(s/8),o=crypto.getRandomValues(new Uint32Array(r)).reduce((i,l)=>i+l.toString(16).padStart(8,"0"),"");return o=o.slice(0,s).padStart(s,"0"),`${e}${o}`}function Ee(n,e,t){return n+(e-n)*t}var w=class{constructor(e){this.update=e;this.last=performance.now();this.running=!1;this.loop=()=>{if(!this.running)return;let e=performance.now(),t=(e-this.last)/1e3;this.last=e,this.update(t),setImmediate(this.loop)}}start(){this.running=!0,this.last=performance.now(),this.loop()}stop(){this.running=!1}};var k=class{constructor(e){this.update=e;this.last=performance.now();this.running=!1;this.rafId=null;this.loop=()=>{if(!this.running)return;let e=performance.now(),t=(e-this.last)/1e3;this.last=e,this.update(t),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)}};var ne=1,T=class{constructor(e){this.update=e;this.last=performance.now();this.running=!1;this.loop=()=>{if(!this.running)return;let e=performance.now(),t=(e-this.last)/1e3;this.last=e,this.update(t),setTimeout(this.loop,ne)}}start(){this.running=!0,this.last=performance.now(),this.loop()}stop(){this.running=!1}};function Ce(n,e){return n==="server-immediate"?new w(e):n==="server-timeout"?new T(e):new k(e)}var ie=[{x:1,y:0},{x:-1,y:0},{x:0,y:1},{x:0,y:-1}],S=n=>({x:Math.floor(n.x),y:Math.floor(n.y)}),q=n=>({x:n.x+.5,y:n.y+.5}),ae=(()=>{let n=1;return()=>n++})(),b=(n,e)=>n&65535|(e&65535)<<16,z=n=>({x:n<<16>>16,y:n>>16}),F=class{constructor(e){this.scoreFn=e;this.heap=[]}push(e){this.heap.push(e),this.bubbleUp(this.heap.length-1)}pop(){let e=this.heap[0],t=this.heap.pop();return this.heap.length>0&&t!==void 0&&(this.heap[0]=t,this.sinkDown(0)),e}get size(){return this.heap.length}bubbleUp(e){let t=this.heap[e],s=this.scoreFn(t);for(;e>0;){let r=(e+1>>1)-1,a=this.heap[r];if(s>=this.scoreFn(a))break;this.heap[r]=t,this.heap[e]=a,e=r}}sinkDown(e){let t=this.heap.length,s=this.heap[e],r=this.scoreFn(s);for(;;){let a=e+1<<1,o=a-1,i=null,l;if(o<t){let c=this.heap[o];l=this.scoreFn(c),l<r&&(i=o)}if(a<t){let c=this.heap[a];this.scoreFn(c)<(i===null?r:l)&&(i=a)}if(i===null)break;this.heap[e]=this.heap[i],this.heap[i]=s,e=i}}},I=class{constructor(e=1){this.grid=new Map;this.obstacleCells=new Map;this.cellSize=e}hash(e,t){let s=Math.floor(e/this.cellSize),r=Math.floor(t/this.cellSize);return b(s,r)}add(e,t){let s=this.getCellsForObstacle(t);for(let r of s)this.grid.has(r)||this.grid.set(r,new Set),this.grid.get(r).add(e);this.obstacleCells.set(e,s)}remove(e){let t=this.obstacleCells.get(e);if(t){for(let s of t){let r=this.grid.get(s);r&&(r.delete(e),r.size===0&&this.grid.delete(s))}this.obstacleCells.delete(e)}}query(e){let t=this.hash(e.x,e.y);return this.grid.get(t)||new Set}clear(){this.grid.clear(),this.obstacleCells.clear()}getCellsForObstacle(e){let t=new Set;if(e.type==="circle"){let s=e.radius,r=Math.floor((e.pos.x-s)/this.cellSize),a=Math.floor((e.pos.x+s)/this.cellSize),o=Math.floor((e.pos.y-s)/this.cellSize),i=Math.floor((e.pos.y+s)/this.cellSize);for(let l=r;l<=a;l++)for(let c=o;c<=i;c++)t.add(b(l,c))}else if(e.type==="rect"){let s=e.pos.x+e.size.x/2,r=e.pos.y+e.size.y/2,a=e.size.x/2,o=e.size.y/2,i=Math.sqrt(a*a+o*o),l=Math.floor((s-i)/this.cellSize),c=Math.floor((s+i)/this.cellSize),d=Math.floor((r-i)/this.cellSize),u=Math.floor((r+i)/this.cellSize);for(let h=l;h<=c;h++)for(let f=d;f<=u;f++)t.add(b(h,f))}else if(e.type==="polygon"){let s=H(e),r=Math.floor(s.minX/this.cellSize),a=Math.floor(s.maxX/this.cellSize),o=Math.floor(s.minY/this.cellSize),i=Math.floor(s.maxY/this.cellSize);for(let l=r;l<=a;l++)for(let c=o;c<=i;c++)t.add(b(l,c))}return t}};function X(n,e){let t=n.x-e.pos.x,s=n.y-e.pos.y;return t*t+s*s<=e.radius*e.radius}function K(n,e){let t=e.pos.x+e.size.x/2,s=e.pos.y+e.size.y/2;if(e.rotation){let r=Math.cos(-e.rotation),a=Math.sin(-e.rotation),o=n.x-t,i=n.y-s,l=o*r-i*a,c=o*a+i*r;return Math.abs(l)<=e.size.x/2&&Math.abs(c)<=e.size.y/2}return n.x>=e.pos.x&&n.y>=e.pos.y&&n.x<=e.pos.x+e.size.x&&n.y<=e.pos.y+e.size.y}function B(n,e){let t=!1,s=e.points,r=e.rotation?Math.cos(e.rotation):1,a=e.rotation?Math.sin(e.rotation):0;for(let o=0,i=s.length-1;o<s.length;i=o++){let l=s[o].x,c=s[o].y,d=s[i].x,u=s[i].y;if(e.rotation){let f=l*r-c*a,m=l*a+c*r,p=d*r-u*a,x=d*a+u*r;l=f,c=m,d=p,u=x}l+=e.pos.x,c+=e.pos.y,d+=e.pos.x,u+=e.pos.y,c>n.y!=u>n.y&&n.x<(d-l)*(n.y-c)/(u-c)+l&&(t=!t)}return t}function H(n){let e=1/0,t=1/0,s=-1/0,r=-1/0,a=n.rotation?Math.cos(n.rotation):1,o=n.rotation?Math.sin(n.rotation):0;for(let i of n.points){let l=i.x,c=i.y;if(n.rotation){let d=l*a-c*o,u=l*o+c*a;l=d,c=u}l+=n.pos.x,c+=n.pos.y,e=Math.min(e,l),t=Math.min(t,c),s=Math.max(s,l),r=Math.max(r,c)}return{minX:e,minY:t,maxX:s,maxY:r}}var P=class{constructor(){this.items=new Map;this.spatial=new I(1);this._cachedItems=[];this.dirty=!0;this.version=0}add(e){let t=ae(),s={...e,id:t};return this.items.set(t,s),this.spatial.add(t,s),this.dirty=!0,this.version++,t}move(e,t){let s=this.items.get(e);if(!s)return;this.spatial.remove(e);let r={...s,pos:{...t}};this.items.set(e,r),this.spatial.add(e,r),this.dirty=!0,this.version++}remove(e){this.spatial.remove(e),this.items.delete(e),this.dirty=!0,this.version++}at(e){let t=this.spatial.query(e);for(let s of t){let r=this.items.get(s);if(!(!r||r.solid===!1)&&(r.type==="circle"&&X(e,r)||r.type==="rect"&&K(e,r)||r.type==="polygon"&&B(e,r)))return r}}get values(){return this.dirty?(this._cachedItems=[...this.items.values()],this.dirty=!1,this._cachedItems):this._cachedItems}},U=class{constructor(e){this.obstacles=e;this.blocked=new Set}rebuild(){this.blocked.clear();for(let e of this.obstacles.values)if(e.solid!==!1){if(e.type==="circle"){let t=Math.ceil(e.radius),s=Math.floor(e.pos.x),r=Math.floor(e.pos.y);for(let a=-t;a<=t;a++)for(let o=-t;o<=t;o++){let i=s+a,l=r+o,c={x:i+.5,y:l+.5};X(c,e)&&this.blocked.add(b(i,l))}}else if(e.type==="rect"){let t=e.pos.x+e.size.x/2,s=e.pos.y+e.size.y/2,r=e.size.x/2,a=e.size.y/2,o=Math.sqrt(r*r+a*a),i=Math.floor(t-o),l=Math.ceil(t+o),c=Math.floor(s-o),d=Math.ceil(s+o);for(let u=i;u<=l;u++)for(let h=c;h<=d;h++){let f={x:u+.5,y:h+.5};K(f,e)&&this.blocked.add(b(u,h))}}else if(e.type==="polygon"){let t=H(e),s=Math.floor(t.minX),r=Math.ceil(t.maxX),a=Math.floor(t.minY),o=Math.ceil(t.maxY);for(let i=s;i<=r;i++)for(let l=a;l<=o;l++){let c={x:i+.5,y:l+.5};B(c,e)&&this.blocked.add(b(i,l))}}}}findPath(e,t){return $(S(e),S(t),(s,r)=>!this.blocked.has(b(s,r))).map(q)}},V=class{constructor(e){this.obstacles=e}rebuild(){}findPath(e,t){let s=Math.ceil(Math.hypot(t.x-e.x,t.y-e.y)*2),r=!1;for(let o=1;o<=s;o++){let i=o/s,l={x:e.x+(t.x-e.x)*i,y:e.y+(t.y-e.y)*i};if(this.obstacles.at(l)){r=!0;break}}return r?$(S(e),S(t),(o,i)=>{let l={x:o+.5,y:i+.5};return!this.obstacles.at(l)}).map(q):[e,t]}},Y=class{constructor(e,t){this.type=e;this.lastVersion=-1;this.pendingPaths=0;this.AUTO_WORKER_THRESHOLD=20;this.obstacles=new P,this.options={workers:t?.workers??!1,workerPoolSize:t?.workerPoolSize??4,workerPath:t?.workerPath??"./navmesh.worker.js"},e==="grid"&&(this.grid=new U(this.obstacles)),e==="graph"&&(this.graph=new V(this.obstacles)),this.options.workers===!0&&this.initWorkerPool()}async initWorkerPool(){if(!this.workerPool)try{let{NavMeshWorkerPool:e}=await Promise.resolve().then(()=>(j(),_));this.workerPool=new e(this.options.workerPoolSize,this.options.workerPath,this.type,this.obstacles.values),await this.workerPool.init()}catch(e){console.warn("Failed to initialize worker pool, falling back to sync:",e),this.options.workers=!1}}shouldUseWorkers(){return this.options.workers===!1?!1:this.options.workers===!0?!0:this.pendingPaths>=this.AUTO_WORKER_THRESHOLD}addObstacle(e){return this.obstacles.add(e)}moveObstacle(e,t){this.obstacles.move(e,t)}removeObstacle(e){this.obstacles.remove(e)}getObstacles(){return this.obstacles.values}findPath({from:e,to:t}){return this.shouldUseWorkers()&&this.workerPool?(this.pendingPaths++,this.findPathAsync(e,t).finally(()=>{this.pendingPaths--})):(this.rebuild(),this.type==="grid"?this.grid.findPath(e,t):this.graph.findPath(e,t))}async findPathAsync(e,t){return this.options.workers==="auto"&&!this.workerPool&&await this.initWorkerPool(),this.workerPool?this.workerPool.findPath(e,t):(this.rebuild(),this.type==="grid"?this.grid.findPath(e,t):this.graph.findPath(e,t))}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 $(n,e,t){let s=new Map,r=new Map,a=new Set,o=new Set,i=u=>b(u.x,u.y),l=(u,h)=>Math.abs(u.x-h.x)+Math.abs(u.y-h.y),c=new F(u=>{let h=z(u);return r.get(u)+l(h,e)}),d=i(n);for(r.set(d,0),c.push(d),o.add(d);c.size>0;){let u=c.pop();o.delete(u);let h=z(u);if(h.x===e.x&&h.y===e.y)return le(s,h);a.add(u);for(let f of ie){let m={x:h.x+f.x,y:h.y+f.y};if(!t(m.x,m.y))continue;let p=i(m);if(a.has(p))continue;let x=r.get(u)+1;x<(r.get(p)??1/0)&&(r.set(p,x),s.set(p,u),o.has(p)||(c.push(p),o.add(p)))}}return[]}function le(n,e){let t=[e],s=b(e.x,e.y);for(;n.has(s);)s=n.get(s),t.push(z(s));return t.reverse()}var g=class{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)}},E=class{constructor(e){this.schema=e;this.pool=new g(()=>this.createNil())}createNil(){let e={};for(let t of Object.keys(this.schema)){let s=this.schema[t];e[t]="toNil"in s?s.toNil():void 0}return e}decode(e){let t=this.pool.acquire();return this.decodeInto(e,t),t}decodeInto(e,t){let s=0;for(let r of Object.keys(this.schema)){let a=this.schema[r];if("decodeAll"in a){let o=a.decodeAll(e.subarray(s));t[r]=o.value,s+=o.bytesRead}else if("decodeField"in a){let o=a.decodeField(e.subarray(s));t[r]=o.value,s+=o.bytesRead}else if("decode"in a){let o=a.decode(e.subarray(s));t[r]=o.value,s+=o.bytesRead}else{let o=a.size||0,i=e.subarray(s,s+o);v.decodeInto({[r]:a},i,t),s+=o}}}release(e){this.pool.release(e)}},G=class{constructor(e){this.pooledDecoder=new E(e)}decodeAll(e){return e.map(t=>this.pooledDecoder.decode(t))}releaseAll(e){e.forEach(t=>this.pooledDecoder.release(t))}},A=class{constructor(e,t=1024){this.schema=e;this.bufferSize=t;this.pool=new g(()=>new Uint8Array(t))}encode(e){let t=this.pool.acquire(),s=0;for(let r of Object.keys(this.schema)){let a=this.schema[r];if("encode"in a){let o=a.encode(e[r]);t.set(o,s),s+=o.length}else if("encodeAll"in a){let o=a.encodeAll(e[r]),i=0;for(let l of o)t.set(l,s+i),i+=l.length;s+=i}else{let o=v.encode({[r]:a},{[r]:e[r]});t.set(o,s),s+=o.length}}return t.subarray(0,s)}release(e){this.pool.release(e)}},Z=class{constructor(e){this.schema=e;this.encoder=new A(e),this.decoder=new E(e)}calculateSize(e){let t=0;for(let s of Object.keys(this.schema)){let r=this.schema[s];"size"in r?t+=r.size:"calculateSize"in r&&(t+=r.calculateSize(e[s]))}return t}encodeInto(e,t,s){let r=new DataView(t.buffer,t.byteOffset),a=s;for(let o of Object.keys(this.schema)){let i=this.schema[o];if("write"in i)i.write(r,a,e[o]),a+=i.size;else if("encodeInto"in i){let l=i.encodeInto(e[o],t,a);a+=l}else if("encode"in i){let l=i.encode(e[o]);t.set(l,a),a+=l.length}}return a-s}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(let l of Object.keys(e)){let c=e[l];t+=c.size||0}let s=new g(()=>new Uint8Array(16384)),r=new g(()=>{let l={};for(let c of Object.keys(e)){let d=e[c];l[c]="toNil"in d?d.toNil():void 0}return l}),a=new g(()=>[]),o=null,i=null;return{__arrayType:void 0,calculateSize(l){return 2+l.length*t},encodeInto(l,c,d){let u=new DataView(c.buffer,c.byteOffset);u.setUint16(d,l.length,!1);let h=d+2;for(let f of l)for(let m of Object.keys(e)){let p=e[m];p.write(u,h,f[m]),h+=p.size}return h-d},encode(l){let c=2+l.length*t,d=s.acquire();d.length<c&&(s.release(d),d=new Uint8Array(Math.max(c,d.length*2))),(!o||o.buffer!==d.buffer)&&(o=new DataView(d.buffer,d.byteOffset)),o.setUint16(0,l.length,!1);let u=2;for(let f of l)for(let m of Object.keys(e)){let p=e[m];p.write(o,u,f[m]),u+=p.size}let h=new Uint8Array(u);return h.set(d.subarray(0,u)),s.release(d),h},decodeField(l){let c=l[0]<<8|l[1],d=a.acquire();d.length=c,(!i||i.buffer!==l.buffer||i.byteOffset!==l.byteOffset)&&(i=new DataView(l.buffer,l.byteOffset));let u=2;for(let h=0;h<c;h++){let f=r.acquire();for(let m of Object.keys(e)){let p=e[m];f[m]=p.read(i,u),u+=p.size}d[h]=f}return{value:d,bytesRead:u}},decode(l){return this.decodeField(l).value},toNil(){return[]}}}};var R=class{constructor(){this.tracker=new Map}get size(){return this.tracker.size}track(e,t){return this.tracker.has(e)||this.tracker.set(e,[]),this.tracker.get(e).push(t),t}dropUpTo(e){let t=[];for(let[s,r]of this.tracker)s<=e?this.tracker.delete(s):t.push([s,r]);return t.sort(([s],[r])=>s-r),t.map(([s,r])=>r).flat()}values(){return Array.from(this.tracker.entries()).sort(([e],[t])=>e-t).map(([e,t])=>t).flat()}},J=class{constructor(e){this.options=e;this.tracker=new R}trackIntent(e,t){this.tracker.track(e,t)}onSnapshot(e){this.options.onLoadState(e.state);let t=this.tracker.dropUpTo(e.tick);t.length>0&&this.options.onReplay(t)}replay(e){this.options.onReplay(e)}};var Q=class{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.prevMouse={left:!1,right:!1,middle:!1};this.snapshotFlip=!1;this.handlers={keydown:e=>this.onKeyDown(e),keyup:e=>this.onKeyUp(e),mousemove:e=>this.onMouseMove(e),mousedown:e=>this.onMouseDown(e),mouseup:e=>this.onMouseUp(e),wheel:e=>this.onMouseWheel(e),swipe:e=>this.onSwipe(e),pinch:e=>this.onPinch(e)};this.snapshotA=ee(),this.snapshotB=ee()}peek(){let e=this.snapshotFlip?this.snapshotA:this.snapshotB;return ce(e,this.keys,this.mouse),e}snapshot(){let e=this.snapshotFlip?this.snapshotA:this.snapshotB;return this.snapshotFlip=!this.snapshotFlip,ue(e,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,e}listen(e){this.inputSource&&this.inputSource.detach(),this.inputSource=e,e.attach(this.handlers)}unlisten(){this.inputSource&&this.inputSource.detach()}onKeyDown(e){let t=this.keys[e.code]??={down:!1,hit:!1,released:!1};t.down=!0}onKeyUp(e){let t=this.keys[e.code]??={down:!1,hit:!1,released:!1};t.down=!1}onMouseMove(e){let t=e.target.getBoundingClientRect(),s=e.clientX-t.left,r=e.clientY-t.top;this.mouse.dx+=s-this.mouse.x,this.mouse.dy+=r-this.mouse.y,this.mouse.x=s,this.mouse.y=r}onMouseDown(e){e.button===0&&(this.mouse.left=!0),e.button===1&&(this.mouse.middle=!0),e.button===2&&(this.mouse.right=!0)}onMouseUp(e){e.button===0&&(this.mouse.left=!1),e.button===1&&(this.mouse.middle=!1),e.button===2&&(this.mouse.right=!1)}onMouseWheel(e){this.mouse.scrollX+=e.deltaX,this.mouse.scrollY+=e.deltaY}onSwipe(e){}onPinch(e){}};function ee(){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 ce(n,e,t){for(let s in e){let r=n.keys[s]??={down:!1,hit:!1,released:!1};r.down=e[s].down,r.hit=!1,r.released=!1}n.mouse.position.x=t.x,n.mouse.position.y=t.y,n.mouse.delta.position.x=t.dx,n.mouse.delta.position.y=t.dy,n.mouse.delta.scroll.x=t.scrollX,n.mouse.delta.scroll.y=t.scrollY,n.mouse.left.down=t.left,n.mouse.right.down=t.right,n.mouse.middle.down=t.middle,n.mouse.left.hit=n.mouse.left.released=!1,n.mouse.right.hit=n.mouse.right.released=!1,n.mouse.middle.hit=n.mouse.middle.released=!1}function ue(n,e,t,s,r){for(let a in e){let o=e[a].down,i=t[a]??!1,l=n.keys[a]??={down:!1,hit:!1,released:!1};l.down=o,l.hit=o&&!i,l.released=!o&&i,t[a]=o}n.mouse.position.x=s.x,n.mouse.position.y=s.y,n.mouse.delta.position.x=s.dx,n.mouse.delta.position.y=s.dy,n.mouse.delta.scroll.x=s.scrollX,n.mouse.delta.scroll.y=s.scrollY,N(n.mouse.left,s.left,r.left),N(n.mouse.right,s.right,r.right),N(n.mouse.middle,s.middle,r.middle)}function N(n,e,t){n.down=e,n.hit=e&&!t,n.released=!e&&t}var te=class{constructor(e,t){this.keyboardTarget=e;this.mouseTarget=t}attach(e){this.handlers&&this.detach(),this.handlers=e,this.keyboardTarget.addEventListener("keydown",e.keydown),this.keyboardTarget.addEventListener("keyup",e.keyup),this.mouseTarget.addEventListener("mousemove",e.mousemove),this.mouseTarget.addEventListener("mousedown",e.mousedown),this.mouseTarget.addEventListener("mouseup",e.mouseup),this.mouseTarget.addEventListener("wheel",e.wheel)}detach(){let e=this.handlers;e&&(this.keyboardTarget.removeEventListener("keydown",e.keydown),this.keyboardTarget.removeEventListener("keyup",e.keyup),this.mouseTarget.removeEventListener("mousemove",e.mousemove),this.mouseTarget.removeEventListener("mousedown",e.mousedown),this.mouseTarget.removeEventListener("mouseup",e.mouseup),this.mouseTarget.removeEventListener("wheel",e.wheel))}};export{M as BaseBinaryCodec,v as BinaryCodec,y as BinaryPrimitives,te as BrowserInputSource,L as EventSystem,W as FixedTicker,w as ImmediateDriver,Q as InputManager,R as IntentTracker,Y as NavMesh,g as ObjectPool,G as PooledArrayDecoder,Z as PooledCodec,E as PooledDecoder,A as PooledEncoder,k as RafDriver,J as Reconciliator,T as TimeoutDriver,Ce as createDriver,we as generateId,Ee as lerp};
|