@rapierphysicsplugin/server 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 (78) hide show
  1. package/dist/__tests__/input-buffer.test.d.ts +2 -0
  2. package/dist/__tests__/input-buffer.test.d.ts.map +1 -0
  3. package/dist/__tests__/input-buffer.test.js +53 -0
  4. package/dist/__tests__/input-buffer.test.js.map +1 -0
  5. package/dist/__tests__/integration.test.d.ts +2 -0
  6. package/dist/__tests__/integration.test.d.ts.map +1 -0
  7. package/dist/__tests__/integration.test.js +182 -0
  8. package/dist/__tests__/integration.test.js.map +1 -0
  9. package/dist/__tests__/physics-world-collisions.test.d.ts +2 -0
  10. package/dist/__tests__/physics-world-collisions.test.d.ts.map +1 -0
  11. package/dist/__tests__/physics-world-collisions.test.js +129 -0
  12. package/dist/__tests__/physics-world-collisions.test.js.map +1 -0
  13. package/dist/__tests__/physics-world.test.d.ts +2 -0
  14. package/dist/__tests__/physics-world.test.d.ts.map +1 -0
  15. package/dist/__tests__/physics-world.test.js +164 -0
  16. package/dist/__tests__/physics-world.test.js.map +1 -0
  17. package/dist/__tests__/room.test.d.ts +2 -0
  18. package/dist/__tests__/room.test.d.ts.map +1 -0
  19. package/dist/__tests__/room.test.js +189 -0
  20. package/dist/__tests__/room.test.js.map +1 -0
  21. package/dist/__tests__/state-manager.test.d.ts +2 -0
  22. package/dist/__tests__/state-manager.test.d.ts.map +1 -0
  23. package/dist/__tests__/state-manager.test.js +122 -0
  24. package/dist/__tests__/state-manager.test.js.map +1 -0
  25. package/dist/client-connection.d.ts +18 -0
  26. package/dist/client-connection.d.ts.map +1 -0
  27. package/dist/client-connection.js +41 -0
  28. package/dist/client-connection.js.map +1 -0
  29. package/dist/clock-sync.d.ts +4 -0
  30. package/dist/clock-sync.d.ts.map +1 -0
  31. package/dist/clock-sync.js +10 -0
  32. package/dist/clock-sync.js.map +1 -0
  33. package/dist/index.d.ts +8 -0
  34. package/dist/index.d.ts.map +1 -0
  35. package/dist/index.js +35 -0
  36. package/dist/index.js.map +1 -0
  37. package/dist/input-buffer.d.ts +11 -0
  38. package/dist/input-buffer.d.ts.map +1 -0
  39. package/dist/input-buffer.js +40 -0
  40. package/dist/input-buffer.js.map +1 -0
  41. package/dist/physics-world.d.ts +33 -0
  42. package/dist/physics-world.d.ts.map +1 -0
  43. package/dist/physics-world.js +326 -0
  44. package/dist/physics-world.js.map +1 -0
  45. package/dist/room.d.ts +60 -0
  46. package/dist/room.d.ts.map +1 -0
  47. package/dist/room.js +393 -0
  48. package/dist/room.js.map +1 -0
  49. package/dist/server.d.ts +17 -0
  50. package/dist/server.d.ts.map +1 -0
  51. package/dist/server.js +268 -0
  52. package/dist/server.js.map +1 -0
  53. package/dist/simulation-loop.d.ts +14 -0
  54. package/dist/simulation-loop.d.ts.map +1 -0
  55. package/dist/simulation-loop.js +42 -0
  56. package/dist/simulation-loop.js.map +1 -0
  57. package/dist/state-manager.d.ts +20 -0
  58. package/dist/state-manager.d.ts.map +1 -0
  59. package/dist/state-manager.js +120 -0
  60. package/dist/state-manager.js.map +1 -0
  61. package/package.json +24 -0
  62. package/src/__tests__/input-buffer.test.ts +64 -0
  63. package/src/__tests__/integration.test.ts +227 -0
  64. package/src/__tests__/physics-world-collisions.test.ts +155 -0
  65. package/src/__tests__/physics-world.test.ts +197 -0
  66. package/src/__tests__/room.test.ts +232 -0
  67. package/src/__tests__/state-manager.test.ts +152 -0
  68. package/src/client-connection.ts +52 -0
  69. package/src/clock-sync.ts +16 -0
  70. package/src/index.ts +40 -0
  71. package/src/input-buffer.ts +46 -0
  72. package/src/physics-world.ts +400 -0
  73. package/src/room.ts +487 -0
  74. package/src/server.ts +312 -0
  75. package/src/simulation-loop.ts +48 -0
  76. package/src/state-manager.ts +136 -0
  77. package/tsconfig.json +11 -0
  78. package/tsconfig.tsbuildinfo +1 -0
@@ -0,0 +1,326 @@
1
+ import { FIXED_TIMESTEP, createJointData } from '@rapierphysicsplugin/shared';
2
+ export class PhysicsWorld {
3
+ constructor(rapier, gravity = { x: 0, y: -9.81, z: 0 }) {
4
+ this.bodyMap = new Map();
5
+ this.colliderMap = new Map();
6
+ this.colliderHandleToBodyId = new Map();
7
+ this.constraintMap = new Map();
8
+ this.rapier = rapier;
9
+ this.world = new rapier.World({ x: gravity.x, y: gravity.y, z: gravity.z });
10
+ this.world.timestep = FIXED_TIMESTEP;
11
+ this.eventQueue = new rapier.EventQueue(true);
12
+ }
13
+ addBody(descriptor) {
14
+ const { rapier, world } = this;
15
+ const { id, shape, motionType, position, rotation, mass, centerOfMass, restitution, friction, isTrigger } = descriptor;
16
+ if (this.bodyMap.has(id)) {
17
+ throw new Error(`Body with id "${id}" already exists`);
18
+ }
19
+ // Create rigid body description
20
+ let bodyDesc;
21
+ switch (motionType) {
22
+ case 'dynamic':
23
+ bodyDesc = rapier.RigidBodyDesc.dynamic();
24
+ break;
25
+ case 'static':
26
+ bodyDesc = rapier.RigidBodyDesc.fixed();
27
+ break;
28
+ case 'kinematic':
29
+ bodyDesc = rapier.RigidBodyDesc.kinematicPositionBased();
30
+ break;
31
+ }
32
+ bodyDesc.setTranslation(position.x, position.y, position.z);
33
+ bodyDesc.setRotation(new rapier.Quaternion(rotation.x, rotation.y, rotation.z, rotation.w));
34
+ const rigidBody = world.createRigidBody(bodyDesc);
35
+ // Create collider
36
+ let colliderDesc;
37
+ switch (shape.type) {
38
+ case 'box': {
39
+ const p = shape.params;
40
+ colliderDesc = rapier.ColliderDesc.cuboid(p.halfExtents.x, p.halfExtents.y, p.halfExtents.z);
41
+ break;
42
+ }
43
+ case 'sphere': {
44
+ const p = shape.params;
45
+ colliderDesc = rapier.ColliderDesc.ball(p.radius);
46
+ break;
47
+ }
48
+ case 'capsule': {
49
+ const p = shape.params;
50
+ colliderDesc = rapier.ColliderDesc.capsule(p.halfHeight, p.radius);
51
+ break;
52
+ }
53
+ case 'mesh': {
54
+ const p = shape.params;
55
+ colliderDesc = rapier.ColliderDesc.trimesh(p.vertices, p.indices);
56
+ break;
57
+ }
58
+ }
59
+ if (centerOfMass !== undefined && motionType === 'dynamic') {
60
+ const m = mass ?? 1.0;
61
+ colliderDesc.setMassProperties(m, { x: centerOfMass.x, y: centerOfMass.y, z: centerOfMass.z }, { x: m / 6, y: m / 6, z: m / 6 }, { x: 0, y: 0, z: 0, w: 1 });
62
+ }
63
+ else if (mass !== undefined && motionType === 'dynamic') {
64
+ colliderDesc.setMass(mass);
65
+ }
66
+ if (restitution !== undefined) {
67
+ colliderDesc.setRestitution(restitution);
68
+ }
69
+ if (friction !== undefined) {
70
+ colliderDesc.setFriction(friction);
71
+ }
72
+ if (isTrigger) {
73
+ colliderDesc.setSensor(true);
74
+ }
75
+ colliderDesc.setActiveEvents(rapier.ActiveEvents.COLLISION_EVENTS);
76
+ const collider = world.createCollider(colliderDesc, rigidBody);
77
+ this.bodyMap.set(id, rigidBody);
78
+ this.colliderMap.set(id, collider);
79
+ this.colliderHandleToBodyId.set(collider.handle, id);
80
+ return id;
81
+ }
82
+ removeBody(id) {
83
+ const body = this.bodyMap.get(id);
84
+ if (!body)
85
+ return;
86
+ const collider = this.colliderMap.get(id);
87
+ if (collider) {
88
+ this.colliderHandleToBodyId.delete(collider.handle);
89
+ }
90
+ this.world.removeRigidBody(body);
91
+ this.bodyMap.delete(id);
92
+ this.colliderMap.delete(id);
93
+ }
94
+ applyForce(id, force, point) {
95
+ const body = this.bodyMap.get(id);
96
+ if (!body)
97
+ return;
98
+ if (point) {
99
+ body.addForceAtPoint(new this.rapier.Vector3(force.x, force.y, force.z), new this.rapier.Vector3(point.x, point.y, point.z), true);
100
+ }
101
+ else {
102
+ body.addForce(new this.rapier.Vector3(force.x, force.y, force.z), true);
103
+ }
104
+ }
105
+ applyImpulse(id, impulse, point) {
106
+ const body = this.bodyMap.get(id);
107
+ if (!body)
108
+ return;
109
+ if (point) {
110
+ body.applyImpulseAtPoint(new this.rapier.Vector3(impulse.x, impulse.y, impulse.z), new this.rapier.Vector3(point.x, point.y, point.z), true);
111
+ }
112
+ else {
113
+ body.applyImpulse(new this.rapier.Vector3(impulse.x, impulse.y, impulse.z), true);
114
+ }
115
+ }
116
+ setBodyVelocity(id, linVel, angVel) {
117
+ const body = this.bodyMap.get(id);
118
+ if (!body)
119
+ return;
120
+ body.setLinvel(new this.rapier.Vector3(linVel.x, linVel.y, linVel.z), true);
121
+ if (angVel) {
122
+ body.setAngvel(new this.rapier.Vector3(angVel.x, angVel.y, angVel.z), true);
123
+ }
124
+ }
125
+ setBodyPosition(id, position) {
126
+ const body = this.bodyMap.get(id);
127
+ if (!body)
128
+ return;
129
+ body.setTranslation(new this.rapier.Vector3(position.x, position.y, position.z), true);
130
+ }
131
+ setBodyRotation(id, rotation) {
132
+ const body = this.bodyMap.get(id);
133
+ if (!body)
134
+ return;
135
+ body.setRotation(new this.rapier.Quaternion(rotation.x, rotation.y, rotation.z, rotation.w), true);
136
+ }
137
+ applyInput(action) {
138
+ switch (action.type) {
139
+ case 'applyForce':
140
+ if (action.data.force) {
141
+ this.applyForce(action.bodyId, action.data.force, action.data.point);
142
+ }
143
+ break;
144
+ case 'applyImpulse':
145
+ if (action.data.impulse) {
146
+ this.applyImpulse(action.bodyId, action.data.impulse, action.data.point);
147
+ }
148
+ break;
149
+ case 'setVelocity':
150
+ if (action.data.linVel) {
151
+ this.setBodyVelocity(action.bodyId, action.data.linVel, action.data.angVel);
152
+ }
153
+ break;
154
+ case 'setAngularVelocity':
155
+ if (action.data.angVel) {
156
+ const body = this.bodyMap.get(action.bodyId);
157
+ if (body) {
158
+ body.setAngvel(new this.rapier.Vector3(action.data.angVel.x, action.data.angVel.y, action.data.angVel.z), true);
159
+ }
160
+ }
161
+ break;
162
+ case 'setPosition':
163
+ if (action.data.position) {
164
+ this.setBodyPosition(action.bodyId, action.data.position);
165
+ }
166
+ break;
167
+ case 'setRotation':
168
+ if (action.data.rotation) {
169
+ this.setBodyRotation(action.bodyId, action.data.rotation);
170
+ }
171
+ break;
172
+ }
173
+ }
174
+ addConstraint(descriptor) {
175
+ const { id, bodyIdA, bodyIdB } = descriptor;
176
+ if (this.constraintMap.has(id)) {
177
+ throw new Error(`Constraint with id "${id}" already exists`);
178
+ }
179
+ const rbA = this.bodyMap.get(bodyIdA);
180
+ const rbB = this.bodyMap.get(bodyIdB);
181
+ if (!rbA)
182
+ throw new Error(`Body "${bodyIdA}" not found for constraint "${id}"`);
183
+ if (!rbB)
184
+ throw new Error(`Body "${bodyIdB}" not found for constraint "${id}"`);
185
+ const jointData = createJointData(this.rapier, descriptor);
186
+ const joint = this.world.createImpulseJoint(jointData, rbA, rbB, true);
187
+ if (descriptor.collision === false) {
188
+ joint.setContactsEnabled(false);
189
+ }
190
+ this.constraintMap.set(id, joint);
191
+ return id;
192
+ }
193
+ removeConstraint(id) {
194
+ const joint = this.constraintMap.get(id);
195
+ if (!joint)
196
+ return;
197
+ this.world.removeImpulseJoint(joint, true);
198
+ this.constraintMap.delete(id);
199
+ }
200
+ hasConstraint(id) {
201
+ return this.constraintMap.has(id);
202
+ }
203
+ step() {
204
+ this.world.step(this.eventQueue);
205
+ const events = [];
206
+ this.eventQueue.drainCollisionEvents((handle1, handle2, started) => {
207
+ const bodyIdA = this.colliderHandleToBodyId.get(handle1);
208
+ const bodyIdB = this.colliderHandleToBodyId.get(handle2);
209
+ if (!bodyIdA || !bodyIdB)
210
+ return;
211
+ const collider1 = this.world.getCollider(handle1);
212
+ const collider2 = this.world.getCollider(handle2);
213
+ if (!collider1 || !collider2)
214
+ return;
215
+ const isSensor = collider1.isSensor() || collider2.isSensor();
216
+ let type;
217
+ if (isSensor) {
218
+ type = started ? 'TRIGGER_ENTERED' : 'TRIGGER_EXITED';
219
+ }
220
+ else {
221
+ type = started ? 'COLLISION_STARTED' : 'COLLISION_FINISHED';
222
+ }
223
+ let point = null;
224
+ let normal = null;
225
+ let impulse = 0;
226
+ if (started && !isSensor) {
227
+ this.world.contactPair(collider1, collider2, (manifold, flipped) => {
228
+ const cp = manifold.localContactPoint1(0);
229
+ if (cp) {
230
+ point = { x: cp.x, y: cp.y, z: cp.z };
231
+ }
232
+ const n = manifold.localNormal1();
233
+ if (n) {
234
+ normal = flipped
235
+ ? { x: -n.x, y: -n.y, z: -n.z }
236
+ : { x: n.x, y: n.y, z: n.z };
237
+ }
238
+ impulse = manifold.contactImpulse(0) ?? 0;
239
+ });
240
+ }
241
+ events.push({ bodyIdA, bodyIdB, type, point, normal, impulse });
242
+ });
243
+ return events;
244
+ }
245
+ getSnapshot(skipSleeping = false) {
246
+ const states = [];
247
+ for (const [id, body] of this.bodyMap) {
248
+ if (skipSleeping && body.isSleeping())
249
+ continue;
250
+ const pos = body.translation();
251
+ const rot = body.rotation();
252
+ const linVel = body.linvel();
253
+ const angVel = body.angvel();
254
+ states.push({
255
+ id,
256
+ position: { x: pos.x, y: pos.y, z: pos.z },
257
+ rotation: { x: rot.x, y: rot.y, z: rot.z, w: rot.w },
258
+ linVel: { x: linVel.x, y: linVel.y, z: linVel.z },
259
+ angVel: { x: angVel.x, y: angVel.y, z: angVel.z },
260
+ });
261
+ }
262
+ return states;
263
+ }
264
+ isBodySleeping(id) {
265
+ const body = this.bodyMap.get(id);
266
+ return body ? body.isSleeping() : false;
267
+ }
268
+ getBodyState(id) {
269
+ const body = this.bodyMap.get(id);
270
+ if (!body)
271
+ return null;
272
+ const pos = body.translation();
273
+ const rot = body.rotation();
274
+ const linVel = body.linvel();
275
+ const angVel = body.angvel();
276
+ return {
277
+ id,
278
+ position: { x: pos.x, y: pos.y, z: pos.z },
279
+ rotation: { x: rot.x, y: rot.y, z: rot.z, w: rot.w },
280
+ linVel: { x: linVel.x, y: linVel.y, z: linVel.z },
281
+ angVel: { x: angVel.x, y: angVel.y, z: angVel.z },
282
+ };
283
+ }
284
+ loadState(bodies) {
285
+ for (const body of bodies) {
286
+ this.addBody(body);
287
+ }
288
+ }
289
+ reset(bodies, constraints) {
290
+ // Remove all existing constraints first (joints reference bodies)
291
+ for (const [, joint] of this.constraintMap) {
292
+ this.world.removeImpulseJoint(joint, true);
293
+ }
294
+ this.constraintMap.clear();
295
+ // Remove all existing bodies
296
+ for (const [, body] of this.bodyMap) {
297
+ this.world.removeRigidBody(body);
298
+ }
299
+ this.bodyMap.clear();
300
+ this.colliderMap.clear();
301
+ this.colliderHandleToBodyId.clear();
302
+ // Reload from descriptors
303
+ this.loadState(bodies);
304
+ // Re-create constraints
305
+ if (constraints) {
306
+ for (const c of constraints) {
307
+ this.addConstraint(c);
308
+ }
309
+ }
310
+ }
311
+ hasBody(id) {
312
+ return this.bodyMap.has(id);
313
+ }
314
+ get bodyCount() {
315
+ return this.bodyMap.size;
316
+ }
317
+ destroy() {
318
+ this.constraintMap.clear();
319
+ this.eventQueue.free();
320
+ this.world.free();
321
+ this.bodyMap.clear();
322
+ this.colliderMap.clear();
323
+ this.colliderHandleToBodyId.clear();
324
+ }
325
+ }
326
+ //# sourceMappingURL=physics-world.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"physics-world.js","sourceRoot":"","sources":["../src/physics-world.ts"],"names":[],"mappings":"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"}
package/dist/room.d.ts ADDED
@@ -0,0 +1,60 @@
1
+ import type RAPIER from '@dimforge/rapier3d-compat';
2
+ import type { BodyDescriptor, ConstraintDescriptor, RoomSnapshot, Vec3 } from '@rapierphysicsplugin/shared';
3
+ import { PhysicsWorld } from './physics-world.js';
4
+ import type { ClientConnection } from './client-connection.js';
5
+ export declare class Room {
6
+ readonly id: string;
7
+ readonly physicsWorld: PhysicsWorld;
8
+ private simulationLoop;
9
+ private stateManager;
10
+ private clients;
11
+ private inputBuffers;
12
+ private initialBodies;
13
+ private initialConstraints;
14
+ private activeConstraints;
15
+ private activeBodies;
16
+ private meshBinaryStore;
17
+ private geometryStore;
18
+ private meshRefStore;
19
+ private geometryRefCount;
20
+ private materialStore;
21
+ private textureStore;
22
+ private materialRefCount;
23
+ private currentTick;
24
+ private ticksSinceLastBroadcast;
25
+ private pendingCollisionEvents;
26
+ constructor(id: string, rapier: typeof RAPIER, gravity?: Vec3);
27
+ loadInitialState(bodies: BodyDescriptor[], constraints?: ConstraintDescriptor[]): void;
28
+ addClient(conn: ClientConnection): void;
29
+ removeClient(conn: ClientConnection): void;
30
+ addBody(descriptor: BodyDescriptor): string;
31
+ removeBody(bodyId: string): void;
32
+ addConstraint(descriptor: ConstraintDescriptor): string;
33
+ removeConstraint(constraintId: string): void;
34
+ relayMeshBinary(senderId: string, data: Uint8Array): void;
35
+ relayTextureDef(senderId: string, data: Uint8Array): void;
36
+ relayMaterialDef(senderId: string, data: Uint8Array): void;
37
+ relayGeometryDef(senderId: string, data: Uint8Array): void;
38
+ relayMeshRef(senderId: string, data: Uint8Array): void;
39
+ bufferInput(clientId: string, input: import('@rapierphysicsplugin/shared').ClientInput): void;
40
+ tick(): void;
41
+ private broadcastState;
42
+ private broadcast;
43
+ getSnapshot(): RoomSnapshot;
44
+ startSimulation(): void;
45
+ get isSimulationRunning(): boolean;
46
+ get clientCount(): number;
47
+ get tickNumber(): number;
48
+ destroy(): void;
49
+ }
50
+ export declare class RoomManager {
51
+ private rooms;
52
+ private rapier;
53
+ constructor(rapier: typeof RAPIER);
54
+ createRoom(roomId: string, initialBodies?: BodyDescriptor[], gravity?: Vec3, initialConstraints?: ConstraintDescriptor[]): Room;
55
+ getRoom(roomId: string): Room | undefined;
56
+ destroyRoom(roomId: string): void;
57
+ get roomCount(): number;
58
+ getAllRoomIds(): string[];
59
+ }
60
+ //# sourceMappingURL=room.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"room.d.ts","sourceRoot":"","sources":["../src/room.ts"],"names":[],"mappings":"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"}