@rapierphysicsplugin/client 1.0.0

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.
Files changed (83) hide show
  1. package/dist/__tests__/clock-sync.test.d.ts +2 -0
  2. package/dist/__tests__/clock-sync.test.d.ts.map +1 -0
  3. package/dist/__tests__/clock-sync.test.js +63 -0
  4. package/dist/__tests__/clock-sync.test.js.map +1 -0
  5. package/dist/__tests__/interpolator.test.d.ts +2 -0
  6. package/dist/__tests__/interpolator.test.d.ts.map +1 -0
  7. package/dist/__tests__/interpolator.test.js +82 -0
  8. package/dist/__tests__/interpolator.test.js.map +1 -0
  9. package/dist/__tests__/state-reconciler.test.d.ts +2 -0
  10. package/dist/__tests__/state-reconciler.test.d.ts.map +1 -0
  11. package/dist/__tests__/state-reconciler.test.js +86 -0
  12. package/dist/__tests__/state-reconciler.test.js.map +1 -0
  13. package/dist/clock-sync.d.ts +17 -0
  14. package/dist/clock-sync.d.ts.map +1 -0
  15. package/dist/clock-sync.js +63 -0
  16. package/dist/clock-sync.js.map +1 -0
  17. package/dist/index.d.ts +10 -0
  18. package/dist/index.d.ts.map +1 -0
  19. package/dist/index.js +8 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/input-manager.d.ts +18 -0
  22. package/dist/input-manager.d.ts.map +1 -0
  23. package/dist/input-manager.js +62 -0
  24. package/dist/input-manager.js.map +1 -0
  25. package/dist/interpolator.d.ts +35 -0
  26. package/dist/interpolator.d.ts.map +1 -0
  27. package/dist/interpolator.js +198 -0
  28. package/dist/interpolator.js.map +1 -0
  29. package/dist/networked-rapier-plugin.d.ts +82 -0
  30. package/dist/networked-rapier-plugin.d.ts.map +1 -0
  31. package/dist/networked-rapier-plugin.js +698 -0
  32. package/dist/networked-rapier-plugin.js.map +1 -0
  33. package/dist/rapier-body-ops.d.ts +27 -0
  34. package/dist/rapier-body-ops.d.ts.map +1 -0
  35. package/dist/rapier-body-ops.js +208 -0
  36. package/dist/rapier-body-ops.js.map +1 -0
  37. package/dist/rapier-collision-ops.d.ts +6 -0
  38. package/dist/rapier-collision-ops.d.ts.map +1 -0
  39. package/dist/rapier-collision-ops.js +200 -0
  40. package/dist/rapier-collision-ops.js.map +1 -0
  41. package/dist/rapier-constraint-ops.d.ts +29 -0
  42. package/dist/rapier-constraint-ops.d.ts.map +1 -0
  43. package/dist/rapier-constraint-ops.js +286 -0
  44. package/dist/rapier-constraint-ops.js.map +1 -0
  45. package/dist/rapier-plugin.d.ts +145 -0
  46. package/dist/rapier-plugin.d.ts.map +1 -0
  47. package/dist/rapier-plugin.js +263 -0
  48. package/dist/rapier-plugin.js.map +1 -0
  49. package/dist/rapier-shape-ops.d.ts +21 -0
  50. package/dist/rapier-shape-ops.d.ts.map +1 -0
  51. package/dist/rapier-shape-ops.js +314 -0
  52. package/dist/rapier-shape-ops.js.map +1 -0
  53. package/dist/rapier-types.d.ts +58 -0
  54. package/dist/rapier-types.d.ts.map +1 -0
  55. package/dist/rapier-types.js +4 -0
  56. package/dist/rapier-types.js.map +1 -0
  57. package/dist/state-reconciler.d.ts +28 -0
  58. package/dist/state-reconciler.d.ts.map +1 -0
  59. package/dist/state-reconciler.js +119 -0
  60. package/dist/state-reconciler.js.map +1 -0
  61. package/dist/sync-client.d.ts +110 -0
  62. package/dist/sync-client.d.ts.map +1 -0
  63. package/dist/sync-client.js +514 -0
  64. package/dist/sync-client.js.map +1 -0
  65. package/package.json +21 -0
  66. package/src/__tests__/clock-sync.test.ts +72 -0
  67. package/src/__tests__/interpolator.test.ts +98 -0
  68. package/src/__tests__/state-reconciler.test.ts +102 -0
  69. package/src/clock-sync.ts +77 -0
  70. package/src/index.ts +9 -0
  71. package/src/input-manager.ts +72 -0
  72. package/src/interpolator.ts +256 -0
  73. package/src/networked-rapier-plugin.ts +909 -0
  74. package/src/rapier-body-ops.ts +251 -0
  75. package/src/rapier-collision-ops.ts +229 -0
  76. package/src/rapier-constraint-ops.ts +327 -0
  77. package/src/rapier-plugin.ts +364 -0
  78. package/src/rapier-shape-ops.ts +369 -0
  79. package/src/rapier-types.ts +60 -0
  80. package/src/state-reconciler.ts +151 -0
  81. package/src/sync-client.ts +640 -0
  82. package/tsconfig.json +12 -0
  83. package/tsconfig.tsbuildinfo +1 -0
@@ -0,0 +1,198 @@
1
+ import { INTERPOLATION_BUFFER_SIZE, BROADCAST_RATE } from '@rapierphysicsplugin/shared';
2
+ export class Interpolator {
3
+ constructor(renderDelayMs) {
4
+ this.buffers = new Map();
5
+ this._stats = this._emptyStats();
6
+ // Default render delay: ~3x broadcast interval to absorb jitter
7
+ this.renderDelay = renderDelayMs ?? (3 * (1000 / BROADCAST_RATE));
8
+ }
9
+ _emptyStats() {
10
+ return {
11
+ interpolatedCount: 0,
12
+ extrapolatedCount: 0,
13
+ staleCount: 0,
14
+ emptyCount: 0,
15
+ renderDelay: this?.renderDelay ?? 0,
16
+ sampleBodyId: null,
17
+ sampleBufferLen: 0,
18
+ sampleRenderTime: 0,
19
+ sampleBufferOldest: 0,
20
+ sampleBufferNewest: 0,
21
+ sampleT: 0,
22
+ };
23
+ }
24
+ /** Reset stats at the start of each render frame, then call getInterpolatedState per body */
25
+ resetStats() {
26
+ this._stats = this._emptyStats();
27
+ this._stats.renderDelay = this.renderDelay;
28
+ }
29
+ getStats() {
30
+ return this._stats;
31
+ }
32
+ addSnapshot(bodyId, state, timestamp) {
33
+ if (!this.buffers.has(bodyId)) {
34
+ this.buffers.set(bodyId, []);
35
+ }
36
+ const buffer = this.buffers.get(bodyId);
37
+ // Guard against duplicate or out-of-order timestamps (TCP can burst after stalls)
38
+ if (buffer.length > 0 && timestamp <= buffer[buffer.length - 1].timestamp) {
39
+ return;
40
+ }
41
+ buffer.push({ timestamp, state });
42
+ // Keep buffer limited
43
+ while (buffer.length > INTERPOLATION_BUFFER_SIZE + 1) {
44
+ buffer.shift();
45
+ }
46
+ }
47
+ getInterpolatedState(bodyId, currentTime) {
48
+ const buffer = this.buffers.get(bodyId);
49
+ if (!buffer || buffer.length === 0) {
50
+ this._stats.emptyCount++;
51
+ return null;
52
+ }
53
+ // Render time is behind real time by renderDelay
54
+ const renderTime = currentTime - this.renderDelay;
55
+ // Capture sample diagnostics for the first body we see with data
56
+ if (!this._stats.sampleBodyId) {
57
+ this._stats.sampleBodyId = bodyId;
58
+ this._stats.sampleBufferLen = buffer.length;
59
+ this._stats.sampleRenderTime = renderTime;
60
+ this._stats.sampleBufferOldest = buffer[0].timestamp;
61
+ this._stats.sampleBufferNewest = buffer[buffer.length - 1].timestamp;
62
+ }
63
+ // Find the two snapshots to interpolate between
64
+ let older = null;
65
+ let newer = null;
66
+ for (let i = 0; i < buffer.length - 1; i++) {
67
+ if (buffer[i].timestamp <= renderTime && buffer[i + 1].timestamp >= renderTime) {
68
+ older = buffer[i];
69
+ newer = buffer[i + 1];
70
+ break;
71
+ }
72
+ }
73
+ // If we have two bracketing snapshots, interpolate
74
+ if (older && newer) {
75
+ const dtMs = newer.timestamp - older.timestamp;
76
+ const t = (renderTime - older.timestamp) / dtMs;
77
+ const dtSec = dtMs / 1000;
78
+ this._stats.interpolatedCount++;
79
+ if (this._stats.sampleBodyId === bodyId) {
80
+ this._stats.sampleT = t;
81
+ }
82
+ return interpolateBodyState(older.state, newer.state, t, dtSec);
83
+ }
84
+ // If render time is past all snapshots, extrapolate from last
85
+ const last = buffer[buffer.length - 1];
86
+ if (renderTime > last.timestamp) {
87
+ const dt = (renderTime - last.timestamp) / 1000;
88
+ this._stats.extrapolatedCount++;
89
+ return extrapolateBodyState(last.state, dt);
90
+ }
91
+ // If render time is before all snapshots, return earliest
92
+ this._stats.staleCount++;
93
+ return buffer[0].state;
94
+ }
95
+ removeBody(bodyId) {
96
+ this.buffers.delete(bodyId);
97
+ }
98
+ clear() {
99
+ this.buffers.clear();
100
+ }
101
+ }
102
+ function interpolateBodyState(a, b, t, dtSec) {
103
+ // Scale velocity tangents by dt so they match the Hermite parameter space (t: 0→1)
104
+ // Raw velocities are in units/second; tangents need to be in units/interval
105
+ const scaledVelA = { x: a.linVel.x * dtSec, y: a.linVel.y * dtSec, z: a.linVel.z * dtSec };
106
+ const scaledVelB = { x: b.linVel.x * dtSec, y: b.linVel.y * dtSec, z: b.linVel.z * dtSec };
107
+ return {
108
+ id: a.id,
109
+ position: hermiteInterpolateVec3(a.position, scaledVelA, b.position, scaledVelB, t),
110
+ rotation: slerpQuat(a.rotation, b.rotation, t),
111
+ linVel: lerpVec3(a.linVel, b.linVel, t),
112
+ angVel: lerpVec3(a.angVel, b.angVel, t),
113
+ };
114
+ }
115
+ function extrapolateBodyState(state, dt) {
116
+ // Simple linear extrapolation with velocity decay
117
+ const decay = Math.max(0, 1 - dt * 2); // Decay over 0.5 seconds
118
+ return {
119
+ id: state.id,
120
+ position: {
121
+ x: state.position.x + state.linVel.x * dt * decay,
122
+ y: state.position.y + state.linVel.y * dt * decay,
123
+ z: state.position.z + state.linVel.z * dt * decay,
124
+ },
125
+ rotation: state.rotation, // Don't extrapolate rotation
126
+ linVel: {
127
+ x: state.linVel.x * decay,
128
+ y: state.linVel.y * decay,
129
+ z: state.linVel.z * decay,
130
+ },
131
+ angVel: {
132
+ x: state.angVel.x * decay,
133
+ y: state.angVel.y * decay,
134
+ z: state.angVel.z * decay,
135
+ },
136
+ };
137
+ }
138
+ function hermiteInterpolateVec3(p0, v0, p1, v1, t) {
139
+ // Hermite basis functions
140
+ const t2 = t * t;
141
+ const t3 = t2 * t;
142
+ const h00 = 2 * t3 - 3 * t2 + 1;
143
+ const h10 = t3 - 2 * t2 + t;
144
+ const h01 = -2 * t3 + 3 * t2;
145
+ const h11 = t3 - t2;
146
+ return {
147
+ x: h00 * p0.x + h10 * v0.x + h01 * p1.x + h11 * v1.x,
148
+ y: h00 * p0.y + h10 * v0.y + h01 * p1.y + h11 * v1.y,
149
+ z: h00 * p0.z + h10 * v0.z + h01 * p1.z + h11 * v1.z,
150
+ };
151
+ }
152
+ function lerpVec3(a, b, t) {
153
+ return {
154
+ x: a.x + (b.x - a.x) * t,
155
+ y: a.y + (b.y - a.y) * t,
156
+ z: a.z + (b.z - a.z) * t,
157
+ };
158
+ }
159
+ function slerpQuat(a, b, t) {
160
+ let dot = a.x * b.x + a.y * b.y + a.z * b.z + a.w * b.w;
161
+ // If dot is negative, negate one quaternion to take the shorter path
162
+ let bx = b.x, by = b.y, bz = b.z, bw = b.w;
163
+ if (dot < 0) {
164
+ dot = -dot;
165
+ bx = -bx;
166
+ by = -by;
167
+ bz = -bz;
168
+ bw = -bw;
169
+ }
170
+ // If quaternions are very close, use linear interpolation
171
+ if (dot > 0.9995) {
172
+ return normalizeQuat({
173
+ x: a.x + (bx - a.x) * t,
174
+ y: a.y + (by - a.y) * t,
175
+ z: a.z + (bz - a.z) * t,
176
+ w: a.w + (bw - a.w) * t,
177
+ });
178
+ }
179
+ const theta0 = Math.acos(dot);
180
+ const theta = theta0 * t;
181
+ const sinTheta = Math.sin(theta);
182
+ const sinTheta0 = Math.sin(theta0);
183
+ const s0 = Math.cos(theta) - dot * sinTheta / sinTheta0;
184
+ const s1 = sinTheta / sinTheta0;
185
+ return {
186
+ x: s0 * a.x + s1 * bx,
187
+ y: s0 * a.y + s1 * by,
188
+ z: s0 * a.z + s1 * bz,
189
+ w: s0 * a.w + s1 * bw,
190
+ };
191
+ }
192
+ function normalizeQuat(q) {
193
+ const len = Math.sqrt(q.x * q.x + q.y * q.y + q.z * q.z + q.w * q.w);
194
+ if (len === 0)
195
+ return { x: 0, y: 0, z: 0, w: 1 };
196
+ return { x: q.x / len, y: q.y / len, z: q.z / len, w: q.w / len };
197
+ }
198
+ //# sourceMappingURL=interpolator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interpolator.js","sourceRoot":"","sources":["../src/interpolator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,82 @@
1
+ import type RAPIER from '@dimforge/rapier3d-compat';
2
+ import { Vector3, Quaternion, PhysicsMotionType, PhysicsShapeType, PhysicsBody, PhysicsShape } from '@babylonjs/core';
3
+ import type { PhysicsShapeParameters, PhysicsMaterial } from '@babylonjs/core';
4
+ import type { Scene, Nullable } from '@babylonjs/core';
5
+ import type { InputAction, CollisionEventData, RoomSnapshot, ComputeConfig } from '@rapierphysicsplugin/shared';
6
+ import { RapierPlugin } from './rapier-plugin.js';
7
+ import { PhysicsSyncClient } from './sync-client.js';
8
+ export interface NetworkedRapierPluginConfig {
9
+ serverUrl: string;
10
+ roomId: string;
11
+ compute?: ComputeConfig;
12
+ }
13
+ export declare class NetworkedRapierPlugin extends RapierPlugin {
14
+ private syncClient;
15
+ private scene;
16
+ private bodyToId;
17
+ private idToBody;
18
+ private pendingBodies;
19
+ private shapeParamsCache;
20
+ private pendingDescriptors;
21
+ private remoteBodyCreationIds;
22
+ private remoteBodies;
23
+ private geometryCache;
24
+ private sentGeometryHashes;
25
+ private materialCache;
26
+ private textureCache;
27
+ private sentMaterialHashes;
28
+ private sentTextureHashes;
29
+ private textureObjectUrls;
30
+ private collisionCount;
31
+ private config;
32
+ private simulationResetCallbacks;
33
+ private stateUpdateCallbacks;
34
+ constructor(rapier: typeof RAPIER, gravity: Vector3, config: NetworkedRapierPluginConfig);
35
+ /**
36
+ * Connect to the physics server and join the configured room.
37
+ * Optionally pass the scene for remote body mesh creation.
38
+ */
39
+ connect(scene?: Scene): Promise<RoomSnapshot>;
40
+ initBody(body: PhysicsBody, motionType: PhysicsMotionType, position: Vector3, orientation: Quaternion): void;
41
+ initShape(shape: PhysicsShape, type: PhysicsShapeType, options: PhysicsShapeParameters): void;
42
+ setShape(body: PhysicsBody, shape: Nullable<PhysicsShape>): void;
43
+ setMaterial(shape: PhysicsShape, material: PhysicsMaterial): void;
44
+ executeStep(delta: number, bodies: Array<PhysicsBody>): void;
45
+ sync(body: PhysicsBody): void;
46
+ removeBody(body: PhysicsBody): void;
47
+ private handleBodyAdded;
48
+ private createRemoteBody;
49
+ private handleBodyRemoved;
50
+ private handleSimulationStarted;
51
+ private buildDescriptor;
52
+ private shapeInfoToDescriptor;
53
+ private sendMeshBinaryForBody;
54
+ private handleMeshBinaryReceived;
55
+ private handleGeometryDefReceived;
56
+ private handleMeshRefReceived;
57
+ private handleMaterialDefReceived;
58
+ private handleTextureDefReceived;
59
+ private extractAndSendTexture;
60
+ private createTextureFromCache;
61
+ private createMeshFromDescriptor;
62
+ private createShapeFromDescriptor;
63
+ private motionTypeToWire;
64
+ private motionTypeFromWire;
65
+ startSimulation(): void;
66
+ sendInput(actions: InputAction[]): void;
67
+ onCollisionEvents(callback: (events: CollisionEventData[]) => void): void;
68
+ onSimulationReset(callback: () => void): void;
69
+ onStateUpdate(callback: (state: RoomSnapshot) => void): void;
70
+ getSyncClient(): PhysicsSyncClient;
71
+ getClientId(): string | null;
72
+ get simulationRunning(): boolean;
73
+ get totalBodyCount(): number;
74
+ get bytesSent(): number;
75
+ get bytesReceived(): number;
76
+ get collisionEventCount(): number;
77
+ /** Access the underlying reconciler for debug stats */
78
+ getReconciler(): import("./state-reconciler.js").StateReconciler;
79
+ /** Access the clock sync for debug stats */
80
+ getClockSync(): import("./clock-sync.js").ClockSyncClient;
81
+ }
82
+ //# sourceMappingURL=networked-rapier-plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"networked-rapier-plugin.d.ts","sourceRoot":"","sources":["../src/networked-rapier-plugin.ts"],"names":[],"mappings":"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"}