@lagless/physics-shared 0.0.46 → 0.0.48

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.
@@ -7,7 +7,7 @@ export interface IPhysicsWorldManagerBase {
7
7
  export declare class PhysicsSimulationBase extends ECSSimulation {
8
8
  private readonly _physicsWorldManager;
9
9
  private _rapierSnapshotHistory;
10
- private readonly _initialRapierSnapshot;
10
+ private _initialRapierSnapshot;
11
11
  private _colliderEntityMapRebuildFn;
12
12
  constructor(config: ECSConfig, deps: ECSDeps, inputProvider: AbstractInputProvider, _physicsWorldManager: IPhysicsWorldManagerBase);
13
13
  /**
@@ -15,6 +15,11 @@ export declare class PhysicsSimulationBase extends ECSSimulation {
15
15
  * Called automatically after rollback and state transfer to keep the map in sync.
16
16
  */
17
17
  setColliderEntityMapRebuild(fn: () => void): void;
18
+ /**
19
+ * Re-capture initial ECS and Rapier snapshots after pre-start setup.
20
+ * Call AFTER creating pre-start bodies (e.g. tree colliders) and BEFORE start().
21
+ */
22
+ capturePreStartState(): void;
18
23
  protected saveSnapshot(tick: number): void;
19
24
  protected rollback(tick: number): void;
20
25
  applyExternalState(state: ArrayBuffer, tick: number): void;
@@ -1 +1 @@
1
- {"version":3,"file":"physics-simulation-base.d.ts","sourceRoot":"","sources":["../../src/lib/physics-simulation-base.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,qBAAqB,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAKzF,oFAAoF;AACpF,MAAM,WAAW,wBAAwB;IACvC,YAAY,IAAI,UAAU,CAAC;IAC3B,eAAe,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,CAAC;CACzC;AAED,qBAAa,qBAAsB,SAAQ,aAAa;IASpD,OAAO,CAAC,QAAQ,CAAC,oBAAoB;IARvC,OAAO,CAAC,sBAAsB,CAA8B;IAC5D,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAa;IACpD,OAAO,CAAC,2BAA2B,CAA6B;gBAG9D,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE,OAAO,EACb,aAAa,EAAE,qBAAqB,EACnB,oBAAoB,EAAE,wBAAwB;IAOjE;;;OAGG;IACI,2BAA2B,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,IAAI;cAIrC,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;cAKhC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAmB/B,kBAAkB,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAQ1E;;OAEG;IACI,yBAAyB,CAAC,cAAc,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAQhF;;OAEG;IACI,qBAAqB,IAAI,UAAU;IAI1C;;;OAGG;IACa,sBAAsB,IAAI,WAAW;IAcrD;;;OAGG;IACa,sBAAsB,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;CAqB9E"}
1
+ {"version":3,"file":"physics-simulation-base.d.ts","sourceRoot":"","sources":["../../src/lib/physics-simulation-base.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,qBAAqB,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAKzF,oFAAoF;AACpF,MAAM,WAAW,wBAAwB;IACvC,YAAY,IAAI,UAAU,CAAC;IAC3B,eAAe,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,CAAC;CACzC;AAED,qBAAa,qBAAsB,SAAQ,aAAa;IASpD,OAAO,CAAC,QAAQ,CAAC,oBAAoB;IARvC,OAAO,CAAC,sBAAsB,CAA8B;IAC5D,OAAO,CAAC,sBAAsB,CAAa;IAC3C,OAAO,CAAC,2BAA2B,CAA6B;gBAG9D,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE,OAAO,EACb,aAAa,EAAE,qBAAqB,EACnB,oBAAoB,EAAE,wBAAwB;IAOjE;;;OAGG;IACI,2BAA2B,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,IAAI;IAIxD;;;OAGG;IACI,oBAAoB,IAAI,IAAI;cAKhB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;cAMhC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAmB/B,kBAAkB,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAQ1E;;OAEG;IACI,yBAAyB,CAAC,cAAc,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAQhF;;OAEG;IACI,qBAAqB,IAAI,UAAU;IAI1C;;;OAGG;IACa,sBAAsB,IAAI,WAAW;IAcrD;;;OAGG;IACa,sBAAsB,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;CAqB9E"}
@@ -8,9 +8,17 @@ export class PhysicsSimulationBase extends ECSSimulation {
8
8
  */ setColliderEntityMapRebuild(fn) {
9
9
  this._colliderEntityMapRebuildFn = fn;
10
10
  }
11
+ /**
12
+ * Re-capture initial ECS and Rapier snapshots after pre-start setup.
13
+ * Call AFTER creating pre-start bodies (e.g. tree colliders) and BEFORE start().
14
+ */ capturePreStartState() {
15
+ this._initialSnapshot = this.mem.exportSnapshot();
16
+ this._initialRapierSnapshot = this._physicsWorldManager.takeSnapshot();
17
+ }
11
18
  saveSnapshot(tick) {
12
19
  super.saveSnapshot(tick);
13
- this._rapierSnapshotHistory.set(tick, this._physicsWorldManager.takeSnapshot());
20
+ const rapierSnap = this._physicsWorldManager.takeSnapshot();
21
+ this._rapierSnapshotHistory.set(tick, rapierSnap);
14
22
  }
15
23
  rollback(tick) {
16
24
  // Rollback ECS state first (calls super which restores ArrayBuffer)
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/lib/physics-simulation-base.ts"],"sourcesContent":["import { ECSConfig, ECSSimulation, AbstractInputProvider, ECSDeps } from '@lagless/core';\nimport { SnapshotHistory, createLogger } from '@lagless/misc';\n\nconst log = createLogger('PhysicsSimulationBase');\n\n/** Minimal interface for a physics world manager that supports snapshot/restore. */\nexport interface IPhysicsWorldManagerBase {\n takeSnapshot(): Uint8Array;\n restoreSnapshot(data: Uint8Array): void;\n}\n\nexport class PhysicsSimulationBase extends ECSSimulation {\n private _rapierSnapshotHistory: SnapshotHistory<Uint8Array>;\n private readonly _initialRapierSnapshot: Uint8Array;\n private _colliderEntityMapRebuildFn: (() => void) | null = null;\n\n constructor(\n config: ECSConfig,\n deps: ECSDeps,\n inputProvider: AbstractInputProvider,\n private readonly _physicsWorldManager: IPhysicsWorldManagerBase,\n ) {\n super(config, deps, inputProvider);\n this._rapierSnapshotHistory = new SnapshotHistory<Uint8Array>(config.snapshotHistorySize);\n this._initialRapierSnapshot = this._physicsWorldManager.takeSnapshot();\n }\n\n /**\n * Register a callback that rebuilds the ColliderEntityMap from ECS state.\n * Called automatically after rollback and state transfer to keep the map in sync.\n */\n public setColliderEntityMapRebuild(fn: () => void): void {\n this._colliderEntityMapRebuildFn = fn;\n }\n\n protected override saveSnapshot(tick: number): void {\n super.saveSnapshot(tick);\n this._rapierSnapshotHistory.set(tick, this._physicsWorldManager.takeSnapshot());\n }\n\n protected override rollback(tick: number): void {\n // Rollback ECS state first (calls super which restores ArrayBuffer)\n super.rollback(tick);\n\n // Rollback Rapier world\n let rapierSnapshot: Uint8Array;\n try {\n rapierSnapshot = this._rapierSnapshotHistory.getNearest(tick);\n log.warn(`Rapier rollback to tick ${tick} succeeded`);\n } catch {\n rapierSnapshot = this._initialRapierSnapshot;\n log.warn(`Rapier rollback to tick ${tick} failed, using initial snapshot`);\n }\n\n this._physicsWorldManager.restoreSnapshot(rapierSnapshot);\n this._rapierSnapshotHistory.rollback(this.mem.tickManager.tick);\n this._colliderEntityMapRebuildFn?.();\n }\n\n public override applyExternalState(state: ArrayBuffer, tick: number): void {\n // Reset rapier snapshot history BEFORE super call — super.applyExternalState()\n // calls this.saveSnapshot(tick), which writes to _rapierSnapshotHistory.\n // If we reset after, the old _lastTick causes \"Ticks must be non-decreasing\".\n this._rapierSnapshotHistory = new SnapshotHistory<Uint8Array>(this._ECSConfig.snapshotHistorySize);\n super.applyExternalState(state, tick);\n }\n\n /**\n * Apply an external Rapier snapshot (e.g. from late-join state transfer).\n */\n public applyExternalPhysicsState(rapierSnapshot: Uint8Array, tick: number): void {\n log.info(`Applying external physics state at tick ${tick} (${rapierSnapshot.byteLength} bytes)`);\n this._physicsWorldManager.restoreSnapshot(rapierSnapshot);\n this._rapierSnapshotHistory = new SnapshotHistory<Uint8Array>(this._ECSConfig.snapshotHistorySize);\n this._rapierSnapshotHistory.set(tick, this._physicsWorldManager.takeSnapshot());\n this._colliderEntityMapRebuildFn?.();\n }\n\n /**\n * Export current Rapier world snapshot for state transfer.\n */\n public exportPhysicsSnapshot(): Uint8Array {\n return this._physicsWorldManager.takeSnapshot();\n }\n\n /**\n * Export combined ECS + Rapier state for network transfer.\n * Format: [ecsLength:u32LE][ecsBytes][rapierBytes]\n */\n public override exportStateForTransfer(): ArrayBuffer {\n const ecsSnapshot = this.mem.exportSnapshot();\n const rapierSnapshot = this._physicsWorldManager.takeSnapshot();\n\n const blob = new ArrayBuffer(4 + ecsSnapshot.byteLength + rapierSnapshot.byteLength);\n const view = new DataView(blob);\n view.setUint32(0, ecsSnapshot.byteLength, true);\n new Uint8Array(blob, 4, ecsSnapshot.byteLength).set(new Uint8Array(ecsSnapshot));\n new Uint8Array(blob, 4 + ecsSnapshot.byteLength).set(rapierSnapshot);\n\n log.info(`exportStateForTransfer: ecs=${ecsSnapshot.byteLength} rapier=${rapierSnapshot.byteLength} total=${blob.byteLength}`);\n return blob;\n }\n\n /**\n * Apply combined ECS + Rapier state from network transfer.\n * Splits the blob, applies ECS state, restores Rapier world, saves snapshot.\n */\n public override applyStateFromTransfer(blob: ArrayBuffer, tick: number): void {\n const view = new DataView(blob);\n const ecsLength = view.getUint32(0, true);\n const ecsState = blob.slice(4, 4 + ecsLength);\n const rapierBytes = new Uint8Array(blob, 4 + ecsLength);\n\n log.info(`applyStateFromTransfer: tick=${tick} ecs=${ecsLength} rapier=${rapierBytes.byteLength}`);\n\n // Apply ECS state (calls applyExternalState → saveSnapshot)\n this.applyExternalState(ecsState, tick);\n\n // Restore Rapier world from transferred snapshot\n this._physicsWorldManager.restoreSnapshot(rapierBytes);\n\n // Save rapier snapshot at this tick (overwrite the empty one saved by applyExternalState)\n this._rapierSnapshotHistory = new SnapshotHistory<Uint8Array>(this._ECSConfig.snapshotHistorySize);\n this._rapierSnapshotHistory.set(tick, this._physicsWorldManager.takeSnapshot());\n\n this._colliderEntityMapRebuildFn?.();\n this.notifyStateTransferHandlers(tick);\n }\n}\n"],"names":["ECSSimulation","SnapshotHistory","createLogger","log","PhysicsSimulationBase","setColliderEntityMapRebuild","fn","_colliderEntityMapRebuildFn","saveSnapshot","tick","_rapierSnapshotHistory","set","_physicsWorldManager","takeSnapshot","rollback","rapierSnapshot","getNearest","warn","_initialRapierSnapshot","restoreSnapshot","mem","tickManager","applyExternalState","state","_ECSConfig","snapshotHistorySize","applyExternalPhysicsState","info","byteLength","exportPhysicsSnapshot","exportStateForTransfer","ecsSnapshot","exportSnapshot","blob","ArrayBuffer","view","DataView","setUint32","Uint8Array","applyStateFromTransfer","ecsLength","getUint32","ecsState","slice","rapierBytes","notifyStateTransferHandlers","constructor","config","deps","inputProvider"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
1
+ {"version":3,"sources":["../../src/lib/physics-simulation-base.ts"],"sourcesContent":["import { ECSConfig, ECSSimulation, AbstractInputProvider, ECSDeps } from '@lagless/core';\nimport { SnapshotHistory, createLogger } from '@lagless/misc';\n\nconst log = createLogger('PhysicsSimulationBase');\n\n/** Minimal interface for a physics world manager that supports snapshot/restore. */\nexport interface IPhysicsWorldManagerBase {\n takeSnapshot(): Uint8Array;\n restoreSnapshot(data: Uint8Array): void;\n}\n\nexport class PhysicsSimulationBase extends ECSSimulation {\n private _rapierSnapshotHistory: SnapshotHistory<Uint8Array>;\n private _initialRapierSnapshot: Uint8Array;\n private _colliderEntityMapRebuildFn: (() => void) | null = null;\n\n constructor(\n config: ECSConfig,\n deps: ECSDeps,\n inputProvider: AbstractInputProvider,\n private readonly _physicsWorldManager: IPhysicsWorldManagerBase,\n ) {\n super(config, deps, inputProvider);\n this._rapierSnapshotHistory = new SnapshotHistory<Uint8Array>(config.snapshotHistorySize);\n this._initialRapierSnapshot = this._physicsWorldManager.takeSnapshot();\n }\n\n /**\n * Register a callback that rebuilds the ColliderEntityMap from ECS state.\n * Called automatically after rollback and state transfer to keep the map in sync.\n */\n public setColliderEntityMapRebuild(fn: () => void): void {\n this._colliderEntityMapRebuildFn = fn;\n }\n\n /**\n * Re-capture initial ECS and Rapier snapshots after pre-start setup.\n * Call AFTER creating pre-start bodies (e.g. tree colliders) and BEFORE start().\n */\n public capturePreStartState(): void {\n this._initialSnapshot = this.mem.exportSnapshot();\n this._initialRapierSnapshot = this._physicsWorldManager.takeSnapshot();\n }\n\n protected override saveSnapshot(tick: number): void {\n super.saveSnapshot(tick);\n const rapierSnap = this._physicsWorldManager.takeSnapshot();\n this._rapierSnapshotHistory.set(tick, rapierSnap);\n }\n\n protected override rollback(tick: number): void {\n // Rollback ECS state first (calls super which restores ArrayBuffer)\n super.rollback(tick);\n\n // Rollback Rapier world\n let rapierSnapshot: Uint8Array;\n try {\n rapierSnapshot = this._rapierSnapshotHistory.getNearest(tick);\n log.warn(`Rapier rollback to tick ${tick} succeeded`);\n } catch {\n rapierSnapshot = this._initialRapierSnapshot;\n log.warn(`Rapier rollback to tick ${tick} failed, using initial snapshot`);\n }\n\n this._physicsWorldManager.restoreSnapshot(rapierSnapshot);\n this._rapierSnapshotHistory.rollback(this.mem.tickManager.tick);\n this._colliderEntityMapRebuildFn?.();\n }\n\n public override applyExternalState(state: ArrayBuffer, tick: number): void {\n // Reset rapier snapshot history BEFORE super call — super.applyExternalState()\n // calls this.saveSnapshot(tick), which writes to _rapierSnapshotHistory.\n // If we reset after, the old _lastTick causes \"Ticks must be non-decreasing\".\n this._rapierSnapshotHistory = new SnapshotHistory<Uint8Array>(this._ECSConfig.snapshotHistorySize);\n super.applyExternalState(state, tick);\n }\n\n /**\n * Apply an external Rapier snapshot (e.g. from late-join state transfer).\n */\n public applyExternalPhysicsState(rapierSnapshot: Uint8Array, tick: number): void {\n log.info(`Applying external physics state at tick ${tick} (${rapierSnapshot.byteLength} bytes)`);\n this._physicsWorldManager.restoreSnapshot(rapierSnapshot);\n this._rapierSnapshotHistory = new SnapshotHistory<Uint8Array>(this._ECSConfig.snapshotHistorySize);\n this._rapierSnapshotHistory.set(tick, this._physicsWorldManager.takeSnapshot());\n this._colliderEntityMapRebuildFn?.();\n }\n\n /**\n * Export current Rapier world snapshot for state transfer.\n */\n public exportPhysicsSnapshot(): Uint8Array {\n return this._physicsWorldManager.takeSnapshot();\n }\n\n /**\n * Export combined ECS + Rapier state for network transfer.\n * Format: [ecsLength:u32LE][ecsBytes][rapierBytes]\n */\n public override exportStateForTransfer(): ArrayBuffer {\n const ecsSnapshot = this.mem.exportSnapshot();\n const rapierSnapshot = this._physicsWorldManager.takeSnapshot();\n\n const blob = new ArrayBuffer(4 + ecsSnapshot.byteLength + rapierSnapshot.byteLength);\n const view = new DataView(blob);\n view.setUint32(0, ecsSnapshot.byteLength, true);\n new Uint8Array(blob, 4, ecsSnapshot.byteLength).set(new Uint8Array(ecsSnapshot));\n new Uint8Array(blob, 4 + ecsSnapshot.byteLength).set(rapierSnapshot);\n\n log.info(`exportStateForTransfer: ecs=${ecsSnapshot.byteLength} rapier=${rapierSnapshot.byteLength} total=${blob.byteLength}`);\n return blob;\n }\n\n /**\n * Apply combined ECS + Rapier state from network transfer.\n * Splits the blob, applies ECS state, restores Rapier world, saves snapshot.\n */\n public override applyStateFromTransfer(blob: ArrayBuffer, tick: number): void {\n const view = new DataView(blob);\n const ecsLength = view.getUint32(0, true);\n const ecsState = blob.slice(4, 4 + ecsLength);\n const rapierBytes = new Uint8Array(blob, 4 + ecsLength);\n\n log.info(`applyStateFromTransfer: tick=${tick} ecs=${ecsLength} rapier=${rapierBytes.byteLength}`);\n\n // Apply ECS state (calls applyExternalState → saveSnapshot)\n this.applyExternalState(ecsState, tick);\n\n // Restore Rapier world from transferred snapshot\n this._physicsWorldManager.restoreSnapshot(rapierBytes);\n\n // Save rapier snapshot at this tick (overwrite the empty one saved by applyExternalState)\n this._rapierSnapshotHistory = new SnapshotHistory<Uint8Array>(this._ECSConfig.snapshotHistorySize);\n this._rapierSnapshotHistory.set(tick, this._physicsWorldManager.takeSnapshot());\n\n this._colliderEntityMapRebuildFn?.();\n this.notifyStateTransferHandlers(tick);\n }\n}\n"],"names":["ECSSimulation","SnapshotHistory","createLogger","log","PhysicsSimulationBase","setColliderEntityMapRebuild","fn","_colliderEntityMapRebuildFn","capturePreStartState","_initialSnapshot","mem","exportSnapshot","_initialRapierSnapshot","_physicsWorldManager","takeSnapshot","saveSnapshot","tick","rapierSnap","_rapierSnapshotHistory","set","rollback","rapierSnapshot","getNearest","warn","restoreSnapshot","tickManager","applyExternalState","state","_ECSConfig","snapshotHistorySize","applyExternalPhysicsState","info","byteLength","exportPhysicsSnapshot","exportStateForTransfer","ecsSnapshot","blob","ArrayBuffer","view","DataView","setUint32","Uint8Array","applyStateFromTransfer","ecsLength","getUint32","ecsState","slice","rapierBytes","notifyStateTransferHandlers","constructor","config","deps","inputProvider"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lagless/physics-shared",
3
- "version": "0.0.46",
3
+ "version": "0.0.48",
4
4
  "license": "CC-BY-NC-4.0",
5
5
  "repository": {
6
6
  "type": "git",
@@ -39,8 +39,8 @@
39
39
  },
40
40
  "dependencies": {
41
41
  "@swc/helpers": "~0.5.11",
42
- "@lagless/core": "0.0.46",
43
- "@lagless/misc": "0.0.46"
42
+ "@lagless/core": "0.0.48",
43
+ "@lagless/misc": "0.0.48"
44
44
  },
45
45
  "devDependencies": {
46
46
  "unplugin-swc": "^1.5.7"