murow 0.0.60 → 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/loop → types/core/driver}/drivers/immediate.d.ts +1 -1
- package/dist/{core/loop → types/core/driver}/drivers/raf.d.ts +1 -1
- package/dist/{core/loop → types/core/driver}/drivers/timeout.d.ts +1 -1
- package/dist/{core/loop → types/core/driver}/index.d.ts +1 -1
- package/dist/{core → types/core}/events/event-system.d.ts +14 -33
- package/dist/{core → types/core}/fixed-ticker/fixed-ticker.d.ts +1 -1
- 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 +7 -1
- package/dist/types/core/input/index.d.ts +3 -0
- package/dist/types/core/input/manager.d.ts +56 -0
- package/dist/types/core/input/sources/browser.d.ts +9 -0
- package/dist/types/core/input/sources/index.d.ts +1 -0
- package/dist/types/core/input/types.d.ts +36 -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}/system-builder.d.ts +20 -9
- package/dist/{ecs → types/ecs}/world.d.ts +11 -0
- package/dist/types/game/index.d.ts +1 -0
- package/dist/types/game/loop/index.d.ts +1 -0
- package/dist/types/game/loop/loop.d.ts +175 -0
- package/dist/{index.d.ts → types/index.d.ts} +2 -0
- package/dist/{net → types/net}/index.d.ts +2 -2
- package/dist/{net → types/net}/server.d.ts +39 -19
- package/dist/{protocol → types/protocol}/intent/define-intent.d.ts +15 -0
- package/dist/{protocol → types/protocol}/intent/index.d.ts +1 -1
- 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/2d/sprite-accessor.test.d.ts +1 -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/events/event-system.js +0 -88
- package/dist/core/events/index.js +0 -1
- package/dist/core/fixed-ticker/fixed-ticker.js +0 -101
- 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 -9
- package/dist/core/lerp/index.js +0 -1
- package/dist/core/lerp/lerp.js +0 -42
- package/dist/core/loop/drivers/immediate.js +0 -61
- package/dist/core/loop/drivers/index.js +0 -3
- package/dist/core/loop/drivers/raf.js +0 -62
- package/dist/core/loop/drivers/timeout.js +0 -71
- package/dist/core/loop/index.js +0 -2
- package/dist/core/loop/loop.js +0 -47
- 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 -180
- package/dist/ecs/system.d.ts +0 -63
- package/dist/ecs/system.js +0 -92
- package/dist/ecs/world-systems.js +0 -79
- package/dist/ecs/world.js +0 -684
- package/dist/index.js +0 -24
- 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 -938
- 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/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 -169
- 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 -9
- 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/loop/README.md +0 -97
- package/src/core/loop/drivers/immediate.ts +0 -66
- package/src/core/loop/drivers/index.ts +0 -3
- package/src/core/loop/drivers/raf.ts +0 -67
- package/src/core/loop/drivers/timeout.ts +0 -77
- package/src/core/loop/index.ts +0 -2
- package/src/core/loop/loop.test.ts +0 -414
- package/src/core/loop/loop.ts +0 -71
- 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 -309
- package/src/ecs/system.ts +0 -111
- package/src/ecs/world-systems.ts +0 -83
- package/src/ecs/world.test.ts +0 -310
- package/src/ecs/world.ts +0 -828
- package/src/index.ts +0 -28
- 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 -1116
- 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 -182
- 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/loop/loop.d.ts → types/core/driver/driver.d.ts} +0 -0
- /package/dist/{core/loop → types/core/driver}/drivers/index.d.ts +0 -0
- /package/dist/{core → types/core}/events/index.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}/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}/world-systems.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}/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/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/{protocol/intent/intent.js → webgpu/types/2d/animation.test.d.ts} +0 -0
|
@@ -1,169 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @description
|
|
3
|
-
* A utility class for managing fixed-rate update ticks, useful for deterministic behaviour
|
|
4
|
-
* in both client and server.
|
|
5
|
-
*
|
|
6
|
-
* The `FixedTicker` accumulates elapsed time and determines how many fixed-interval "ticks"
|
|
7
|
-
* should be processed based on a specified tick rate. It also limits the maximum number of
|
|
8
|
-
* ticks per frame to prevent runaway update loops when frame times are long.
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* @remarks
|
|
12
|
-
* - The `tick` method should be called once per frame, passing the elapsed time in seconds.
|
|
13
|
-
* - The class ensures that no more than a safe number of ticks are processed per frame.
|
|
14
|
-
*/
|
|
15
|
-
export class FixedTicker {
|
|
16
|
-
/**
|
|
17
|
-
* @description Accumulator for the time passed since the last tick
|
|
18
|
-
*/
|
|
19
|
-
private accumulator = 0;
|
|
20
|
-
|
|
21
|
-
/**
|
|
22
|
-
* @description Rate of ticks per second
|
|
23
|
-
*/
|
|
24
|
-
rate: number;
|
|
25
|
-
|
|
26
|
-
/**
|
|
27
|
-
* @description
|
|
28
|
-
* Interval in milliseconds per tick
|
|
29
|
-
*/
|
|
30
|
-
intervalMs: number;
|
|
31
|
-
|
|
32
|
-
/**
|
|
33
|
-
* @description
|
|
34
|
-
* Maximum amount of ticks to run per frame, to avoid
|
|
35
|
-
* running too many ticks in a single frame.
|
|
36
|
-
*/
|
|
37
|
-
private maxTicksPerFrame: number;
|
|
38
|
-
|
|
39
|
-
/**
|
|
40
|
-
* @description
|
|
41
|
-
* Callback to execute on each tick
|
|
42
|
-
*/
|
|
43
|
-
private onTick: (deltaTime: number, tick?: number) => void;
|
|
44
|
-
|
|
45
|
-
/**
|
|
46
|
-
* @description
|
|
47
|
-
* Optional callback to execute when ticks are skipped due to high delta time.
|
|
48
|
-
* This can be useful for debugging or logging purposes.
|
|
49
|
-
*/
|
|
50
|
-
private onTickSkipped?: (skippedTicks: number) => void;
|
|
51
|
-
|
|
52
|
-
/**
|
|
53
|
-
* @description
|
|
54
|
-
* Internal counter for the number of ticks processed.
|
|
55
|
-
*/
|
|
56
|
-
private _tickCount = 0;
|
|
57
|
-
|
|
58
|
-
constructor({ rate, onTick }: FixedTickerProps) {
|
|
59
|
-
this.rate = rate;
|
|
60
|
-
this.intervalMs = 1000 / this.rate;
|
|
61
|
-
this.onTick = onTick;
|
|
62
|
-
|
|
63
|
-
// Allow up to rate/2 ticks per frame, but at least 1.
|
|
64
|
-
// Prevents runaway loops if delta is too large.
|
|
65
|
-
this.maxTicksPerFrame = Math.max(1, Math.floor(rate / 2));
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
/**
|
|
69
|
-
* @description
|
|
70
|
-
* Returns how many ticks to run.
|
|
71
|
-
*
|
|
72
|
-
* @param deltaTime Delta time in seconds
|
|
73
|
-
* @returns {number} Amount of ticks to run
|
|
74
|
-
*/
|
|
75
|
-
private getTicks(deltaTime: number): number {
|
|
76
|
-
this.accumulator += deltaTime * 1000;
|
|
77
|
-
|
|
78
|
-
let ticks = 0;
|
|
79
|
-
|
|
80
|
-
while (
|
|
81
|
-
this.accumulator >= this.intervalMs &&
|
|
82
|
-
ticks < this.maxTicksPerFrame
|
|
83
|
-
) {
|
|
84
|
-
this.accumulator -= this.intervalMs;
|
|
85
|
-
ticks++;
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
const skippedTicks = Math.floor(this.accumulator / this.intervalMs);
|
|
89
|
-
if (skippedTicks > 0 && this.onTickSkipped) {
|
|
90
|
-
this.onTickSkipped(skippedTicks);
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
return ticks;
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
/**
|
|
97
|
-
* @description
|
|
98
|
-
* Processes the ticks based on the elapsed time.
|
|
99
|
-
*
|
|
100
|
-
* @param deltaTime Delta time in seconds
|
|
101
|
-
*/
|
|
102
|
-
tick(deltaTime: number): void {
|
|
103
|
-
const ticks = this.getTicks(deltaTime);
|
|
104
|
-
|
|
105
|
-
for (let i = 0; i < ticks; i++) {
|
|
106
|
-
this.onTick(1 / this.rate, this._tickCount++);
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
/**
|
|
111
|
-
* @description
|
|
112
|
-
* Returns the number of ticks processed since the last reset.
|
|
113
|
-
*
|
|
114
|
-
* @returns {number} Number of ticks processed
|
|
115
|
-
*/
|
|
116
|
-
get tickCount(): number {
|
|
117
|
-
return this._tickCount;
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
/**
|
|
121
|
-
* @description
|
|
122
|
-
* Resets the tick count to zero.
|
|
123
|
-
*/
|
|
124
|
-
resetTickCount(): void {
|
|
125
|
-
this._tickCount = 0;
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
/**
|
|
129
|
-
* @description
|
|
130
|
-
* Returns the accumulated time in seconds, useful for interpolation.
|
|
131
|
-
*
|
|
132
|
-
* @returns {number} Accumulated time in seconds
|
|
133
|
-
*/
|
|
134
|
-
get accumulatedTime(): number {
|
|
135
|
-
return this.accumulator / 1000; // Convert to seconds
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
/**
|
|
139
|
-
* @description
|
|
140
|
-
* Returns the interpolation factor between 0 and 1 for smooth rendering between ticks.
|
|
141
|
-
* Clamped to prevent extrapolation when ticks are skipped.
|
|
142
|
-
*
|
|
143
|
-
* @returns {number} Alpha value between 0 and 1
|
|
144
|
-
*/
|
|
145
|
-
get alpha(): number {
|
|
146
|
-
return Math.min(this.accumulatedTime / (1 / this.rate), 1.0);
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
interface FixedTickerProps {
|
|
151
|
-
/**
|
|
152
|
-
* @description
|
|
153
|
-
* Rate of ticks per second
|
|
154
|
-
*/
|
|
155
|
-
rate: number;
|
|
156
|
-
|
|
157
|
-
/**
|
|
158
|
-
* @description
|
|
159
|
-
* Callback to execute on each tick
|
|
160
|
-
*/
|
|
161
|
-
onTick: (deltaTime: number, tick?: number) => void;
|
|
162
|
-
|
|
163
|
-
/**
|
|
164
|
-
* @description
|
|
165
|
-
* Optional callback to execute when ticks are skipped due to high delta time.
|
|
166
|
-
* This can be useful for debugging or logging purposes.
|
|
167
|
-
*/
|
|
168
|
-
onTickSkipped?: (skippedTicks: number) => void
|
|
169
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export * from './fixed-ticker';
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
# generateId
|
|
2
|
-
|
|
3
|
-
A simple utility function to generate unique 64-bit identifiers using the Web Crypto API.
|
|
4
|
-
The IDs are returned as hexadecimal strings and work in both modern browsers and Node.js (v15+).
|
|
5
|
-
|
|
6
|
-
## Features
|
|
7
|
-
|
|
8
|
-
- Generates cryptographically strong 64-bit IDs.
|
|
9
|
-
- Returns hexadecimal strings (always padded to 16 characters).
|
|
10
|
-
- Works in browsers and Node ≥15 without any imports.
|
|
11
|
-
- Fast and clean using BigInt arithmetic.
|
|
12
|
-
|
|
13
|
-
## Usage
|
|
14
|
-
|
|
15
|
-
```typescript
|
|
16
|
-
import { generateId } from './generate-id';
|
|
17
|
-
const id = generateId(); // akwats 16-character hex string
|
|
18
|
-
```
|
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
import { describe, expect, test } from "bun:test";
|
|
2
|
-
import { generateId } from "./generate-id";
|
|
3
|
-
|
|
4
|
-
describe("generateId", () => {
|
|
5
|
-
test("should generate an ID with default length of 16", () => {
|
|
6
|
-
const id = generateId();
|
|
7
|
-
expect(id.length).toBe(16);
|
|
8
|
-
});
|
|
9
|
-
|
|
10
|
-
test("should generate a hexadecimal string", () => {
|
|
11
|
-
const id = generateId();
|
|
12
|
-
expect(id).toMatch(/^[0-9a-f]+$/);
|
|
13
|
-
});
|
|
14
|
-
|
|
15
|
-
test("should generate unique IDs", () => {
|
|
16
|
-
const ids = new Set();
|
|
17
|
-
for (let i = 0; i < 1000; i++) {
|
|
18
|
-
ids.add(generateId());
|
|
19
|
-
}
|
|
20
|
-
expect(ids.size).toBe(1000);
|
|
21
|
-
});
|
|
22
|
-
|
|
23
|
-
test("should include prefix when provided", () => {
|
|
24
|
-
const prefix = "user_";
|
|
25
|
-
const id = generateId({ prefix });
|
|
26
|
-
expect(id.startsWith(prefix)).toBe(true);
|
|
27
|
-
});
|
|
28
|
-
|
|
29
|
-
test("should maintain total size including prefix", () => {
|
|
30
|
-
const prefix = "user_";
|
|
31
|
-
const size = 20;
|
|
32
|
-
const id = generateId({ prefix, size });
|
|
33
|
-
expect(id.length).toBe(size);
|
|
34
|
-
expect(id.startsWith(prefix)).toBe(true);
|
|
35
|
-
});
|
|
36
|
-
|
|
37
|
-
test("should generate custom size without prefix", () => {
|
|
38
|
-
const size = 32;
|
|
39
|
-
const id = generateId({ size });
|
|
40
|
-
expect(id.length).toBe(size);
|
|
41
|
-
});
|
|
42
|
-
|
|
43
|
-
test("should enforce minimum of 8 hex characters", () => {
|
|
44
|
-
const prefix = "verylongprefix_";
|
|
45
|
-
const size = 10; // shorter than prefix + 8
|
|
46
|
-
const id = generateId({ prefix, size });
|
|
47
|
-
// Should be prefix + at least 8 hex chars
|
|
48
|
-
expect(id.length).toBeGreaterThanOrEqual(prefix.length + 8);
|
|
49
|
-
});
|
|
50
|
-
|
|
51
|
-
test("should pad ID to desired length", () => {
|
|
52
|
-
const size = 24;
|
|
53
|
-
const id = generateId({ size });
|
|
54
|
-
expect(id.length).toBe(size);
|
|
55
|
-
});
|
|
56
|
-
|
|
57
|
-
test("should generate different IDs on consecutive calls", () => {
|
|
58
|
-
const id1 = generateId();
|
|
59
|
-
const id2 = generateId();
|
|
60
|
-
expect(id1).not.toBe(id2);
|
|
61
|
-
});
|
|
62
|
-
|
|
63
|
-
test("should work with various prefix lengths", () => {
|
|
64
|
-
const prefixes = ["a", "ab", "abc", "player_", "super_long_prefix_"];
|
|
65
|
-
prefixes.forEach((prefix) => {
|
|
66
|
-
const id = generateId({ prefix });
|
|
67
|
-
expect(id.startsWith(prefix)).toBe(true);
|
|
68
|
-
});
|
|
69
|
-
});
|
|
70
|
-
|
|
71
|
-
test("should generate valid hex with leading zeros preserved", () => {
|
|
72
|
-
// Generate many IDs to ensure padding works correctly
|
|
73
|
-
for (let i = 0; i < 100; i++) {
|
|
74
|
-
const id = generateId({ size: 16 });
|
|
75
|
-
expect(id.length).toBe(16);
|
|
76
|
-
expect(id).toMatch(/^[0-9a-f]{16}$/);
|
|
77
|
-
}
|
|
78
|
-
});
|
|
79
|
-
});
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
interface GenerateIdOptions {
|
|
2
|
-
/** Optional prefix to prepend to the ID */
|
|
3
|
-
prefix?: string;
|
|
4
|
-
/** Total length of the returned ID including prefix (default 16) */
|
|
5
|
-
size?: number;
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* @description
|
|
10
|
-
* Generates a unique identifier as a hexadecimal string.
|
|
11
|
-
* Can include a prefix and a custom total length.
|
|
12
|
-
*
|
|
13
|
-
* @param options Optional configuration: prefix and total size
|
|
14
|
-
* @returns A unique identifier string
|
|
15
|
-
*
|
|
16
|
-
* @example
|
|
17
|
-
* generateId(); // "f3a2b1c4d5e67890"
|
|
18
|
-
* generateId({ prefix: 'user_' }); // "user_f3a2b1c4d5e67890"
|
|
19
|
-
* generateId({ prefix: 'user_', size: 24 }); // "user_00f3a2b1c4d5e67890"
|
|
20
|
-
*/
|
|
21
|
-
export function generateId(options: GenerateIdOptions = {}): string {
|
|
22
|
-
const { prefix = "", size = 16 } = options;
|
|
23
|
-
|
|
24
|
-
// compute number of hex characters to generate (subtract prefix length)
|
|
25
|
-
const hexLength = Math.max(size - prefix.length, 8); // min 8 hex chars
|
|
26
|
-
|
|
27
|
-
// number of 32-bit integers needed to cover the hexLength
|
|
28
|
-
const numInts = Math.ceil(hexLength / 8);
|
|
29
|
-
|
|
30
|
-
const arr = crypto.getRandomValues(new Uint32Array(numInts));
|
|
31
|
-
let id = arr.reduce((acc, val) => acc + val.toString(16).padStart(8, "0"), "");
|
|
32
|
-
|
|
33
|
-
// truncate/pad to desired length
|
|
34
|
-
id = id.slice(0, hexLength).padStart(hexLength, "0");
|
|
35
|
-
|
|
36
|
-
return `${prefix}${id}`;
|
|
37
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export * from './generate-id';
|
package/src/core/index.ts
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
export * from './binary-codec';
|
|
2
|
-
export * from './events';
|
|
3
|
-
export * from './fixed-ticker';
|
|
4
|
-
export * from './generate-id';
|
|
5
|
-
export * from './lerp';
|
|
6
|
-
export * from './loop';
|
|
7
|
-
export * from './navmesh';
|
|
8
|
-
export * from './pooled-codec';
|
|
9
|
-
export * from './prediction';
|
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
|
-
}
|
package/src/core/loop/README.md
DELETED
|
@@ -1,97 +0,0 @@
|
|
|
1
|
-
# Loop
|
|
2
|
-
|
|
3
|
-
Environment-aware game loop drivers for client (browser) and server (Node.js).
|
|
4
|
-
Provides variable delta time that should be consumed by `FixedTicker` for deterministic game logic.
|
|
5
|
-
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
## Features
|
|
9
|
-
|
|
10
|
-
- **Environment-Specific**: Uses `requestAnimationFrame` (client) or `setImmediate` (server)
|
|
11
|
-
- **Automatic Delta Time**: Calculates delta in seconds between frames
|
|
12
|
-
- **Simple API**: Start and stop with a single method call
|
|
13
|
-
- **Designed for FixedTicker**: Provides variable dt that FixedTicker converts to fixed timesteps
|
|
14
|
-
|
|
15
|
-
---
|
|
16
|
-
|
|
17
|
-
## Usage
|
|
18
|
-
|
|
19
|
-
### Recommended: With FixedTicker
|
|
20
|
-
|
|
21
|
-
```typescript
|
|
22
|
-
import { createDriver } from '@/core/loop';
|
|
23
|
-
import { FixedTicker } from '@/core/fixed-ticker';
|
|
24
|
-
|
|
25
|
-
const ticker = new FixedTicker({
|
|
26
|
-
rate: 30,
|
|
27
|
-
onTick: (fixedDt, tick) => {
|
|
28
|
-
world.update(fixedDt);
|
|
29
|
-
applyInputs(tick);
|
|
30
|
-
}
|
|
31
|
-
});
|
|
32
|
-
|
|
33
|
-
// Client: RAF driver with interpolation
|
|
34
|
-
const clientDriver = createDriver('client', (dt) => {
|
|
35
|
-
ticker.tick(dt);
|
|
36
|
-
render(ticker.alpha); // Smooth 60 FPS rendering of 30 TPS simulation
|
|
37
|
-
});
|
|
38
|
-
clientDriver.start();
|
|
39
|
-
|
|
40
|
-
// Server: Immediate driver for high-frequency updates
|
|
41
|
-
const serverDriver = createDriver('server', (dt) => {
|
|
42
|
-
ticker.tick(dt);
|
|
43
|
-
broadcastState();
|
|
44
|
-
});
|
|
45
|
-
serverDriver.start();
|
|
46
|
-
```
|
|
47
|
-
|
|
48
|
-
### Direct Usage (Single-player only)
|
|
49
|
-
|
|
50
|
-
```typescript
|
|
51
|
-
import { createDriver } from '@/core/loop';
|
|
52
|
-
|
|
53
|
-
// ⚠️ Variable delta time - not suitable for multiplayer
|
|
54
|
-
const driver = createDriver('client', (dt) => {
|
|
55
|
-
player.update(dt);
|
|
56
|
-
renderer.render();
|
|
57
|
-
});
|
|
58
|
-
driver.start();
|
|
59
|
-
```
|
|
60
|
-
|
|
61
|
-
---
|
|
62
|
-
|
|
63
|
-
## Drivers
|
|
64
|
-
|
|
65
|
-
### `RafDriver` (Client)
|
|
66
|
-
- Uses `requestAnimationFrame`
|
|
67
|
-
- Syncs with display refresh rate (~60 FPS)
|
|
68
|
-
- Automatic throttling when tab not visible
|
|
69
|
-
|
|
70
|
-
### `ImmediateDriver` (Server)
|
|
71
|
-
- Uses `setImmediate` (Node.js only)
|
|
72
|
-
- Runs as fast as possible without blocking event loop
|
|
73
|
-
- Suitable for server simulations
|
|
74
|
-
|
|
75
|
-
---
|
|
76
|
-
|
|
77
|
-
## API
|
|
78
|
-
|
|
79
|
-
```typescript
|
|
80
|
-
createDriver(type: 'client' | 'server', update: (dt: number) => void): LoopDriver
|
|
81
|
-
```
|
|
82
|
-
|
|
83
|
-
```typescript
|
|
84
|
-
interface LoopDriver {
|
|
85
|
-
start(): void; // Start the loop
|
|
86
|
-
stop(): void; // Stop the loop
|
|
87
|
-
}
|
|
88
|
-
```
|
|
89
|
-
|
|
90
|
-
---
|
|
91
|
-
|
|
92
|
-
## Notes
|
|
93
|
-
|
|
94
|
-
- Delta time (`dt`) is always in **seconds**, not milliseconds
|
|
95
|
-
- **Always use with FixedTicker** for multiplayer/deterministic games
|
|
96
|
-
- Direct usage without FixedTicker only suitable for single-player scenarios
|
|
97
|
-
- `ImmediateDriver` requires Node.js (uses `setImmediate`)
|
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
import { LoopDriver } from "../loop";
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Server-side game loop driver using setImmediate.
|
|
5
|
-
*
|
|
6
|
-
* This driver runs the game loop as fast as possible without blocking the event loop,
|
|
7
|
-
* making it suitable for Node.js server environments where high tick rates are desired.
|
|
8
|
-
*
|
|
9
|
-
* Delta time is automatically calculated between iterations and passed to the update callback in seconds.
|
|
10
|
-
*
|
|
11
|
-
* **Note:** This driver requires Node.js as it uses `setImmediate` which is not available in browsers.
|
|
12
|
-
*
|
|
13
|
-
* @example
|
|
14
|
-
* ```typescript
|
|
15
|
-
* const driver = new ImmediateDriver((dt) => {
|
|
16
|
-
* world.tick(dt);
|
|
17
|
-
* broadcastState();
|
|
18
|
-
* });
|
|
19
|
-
* driver.start();
|
|
20
|
-
* ```
|
|
21
|
-
*/
|
|
22
|
-
export class ImmediateDriver implements LoopDriver {
|
|
23
|
-
/**
|
|
24
|
-
* @param update - Callback invoked each tick with delta time in seconds
|
|
25
|
-
*/
|
|
26
|
-
constructor(public update: (dt: number) => void) { }
|
|
27
|
-
|
|
28
|
-
private last = performance.now();
|
|
29
|
-
private running = false;
|
|
30
|
-
|
|
31
|
-
/**
|
|
32
|
-
* Starts the game loop using setImmediate.
|
|
33
|
-
*
|
|
34
|
-
* Resets timing to prevent large initial delta.
|
|
35
|
-
*/
|
|
36
|
-
start() {
|
|
37
|
-
this.running = true;
|
|
38
|
-
this.last = performance.now();
|
|
39
|
-
this.loop();
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
/**
|
|
43
|
-
* Stops the game loop.
|
|
44
|
-
*
|
|
45
|
-
* Note: Does not cancel already queued setImmediate callbacks.
|
|
46
|
-
*/
|
|
47
|
-
stop() {
|
|
48
|
-
this.running = false;
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
/**
|
|
52
|
-
* Internal loop method that calculates delta time and schedules the next iteration.
|
|
53
|
-
*
|
|
54
|
-
* Delta time is provided in seconds.
|
|
55
|
-
*/
|
|
56
|
-
loop = () => {
|
|
57
|
-
if (!this.running) return;
|
|
58
|
-
|
|
59
|
-
const now = performance.now();
|
|
60
|
-
const dt = (now - this.last) / 1000;
|
|
61
|
-
this.last = now;
|
|
62
|
-
|
|
63
|
-
this.update(dt);
|
|
64
|
-
setImmediate(this.loop);
|
|
65
|
-
};
|
|
66
|
-
}
|