@lagless/physics3d 0.0.38
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 +232 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/collider-entity-map-3d.d.ts +2 -0
- package/dist/lib/collider-entity-map-3d.d.ts.map +1 -0
- package/dist/lib/collider-entity-map-3d.js +3 -0
- package/dist/lib/collider-entity-map-3d.js.map +1 -0
- package/dist/lib/collision-events-3d.d.ts +6 -0
- package/dist/lib/collision-events-3d.d.ts.map +1 -0
- package/dist/lib/collision-events-3d.js +8 -0
- package/dist/lib/collision-events-3d.js.map +1 -0
- package/dist/lib/collision-layers-3d.d.ts +2 -0
- package/dist/lib/collision-layers-3d.d.ts.map +1 -0
- package/dist/lib/collision-layers-3d.js +3 -0
- package/dist/lib/collision-layers-3d.js.map +1 -0
- package/dist/lib/physics-config-3d.d.ts +10 -0
- package/dist/lib/physics-config-3d.d.ts.map +1 -0
- package/dist/lib/physics-config-3d.js +15 -0
- package/dist/lib/physics-config-3d.js.map +1 -0
- package/dist/lib/physics-runner-3d.d.ts +17 -0
- package/dist/lib/physics-runner-3d.d.ts.map +1 -0
- package/dist/lib/physics-runner-3d.js +47 -0
- package/dist/lib/physics-runner-3d.js.map +1 -0
- package/dist/lib/physics-simulation-3d.d.ts +7 -0
- package/dist/lib/physics-simulation-3d.d.ts.map +1 -0
- package/dist/lib/physics-simulation-3d.js +8 -0
- package/dist/lib/physics-simulation-3d.js.map +1 -0
- package/dist/lib/physics-step-sync-3d.d.ts +67 -0
- package/dist/lib/physics-step-sync-3d.d.ts.map +1 -0
- package/dist/lib/physics-step-sync-3d.js +63 -0
- package/dist/lib/physics-step-sync-3d.js.map +1 -0
- package/dist/lib/physics-world-manager-3d.d.ts +45 -0
- package/dist/lib/physics-world-manager-3d.d.ts.map +1 -0
- package/dist/lib/physics-world-manager-3d.js +145 -0
- package/dist/lib/physics-world-manager-3d.js.map +1 -0
- package/dist/lib/rapier-types.d.ts +156 -0
- package/dist/lib/rapier-types.d.ts.map +1 -0
- package/dist/lib/rapier-types.js +7 -0
- package/dist/lib/rapier-types.js.map +1 -0
- package/dist/tsconfig.lib.tsbuildinfo +1 -0
- package/package.json +60 -0
package/README.md
ADDED
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
# @lagless/physics3d
|
|
2
|
+
|
|
3
|
+
Rapier 3D physics integration for the lagless ECS framework. Deterministic stepping, snapshot/rollback, collision events, and DI-ready runner.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
pnpm add @lagless/physics3d @dimforge/rapier3d-compat
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
Peer dependency: `@dimforge/rapier3d-compat >= 0.14.0`
|
|
12
|
+
|
|
13
|
+
## Architecture
|
|
14
|
+
|
|
15
|
+
```
|
|
16
|
+
@lagless/physics-shared (BodyType, ColliderEntityMap, CollisionLayers, CollisionEventsBase, PhysicsSimulationBase)
|
|
17
|
+
│
|
|
18
|
+
▼
|
|
19
|
+
@lagless/physics3d (3D wrappers: PhysicsWorldManager3d, PhysicsStepSync3d, PhysicsRunner3d, ...)
|
|
20
|
+
│
|
|
21
|
+
└── peer: @dimforge/rapier3d-compat
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## ECS Schema (codegen)
|
|
25
|
+
|
|
26
|
+
Set `simulationType: 'physics3d'` in your `ecs.yaml`. Codegen auto-prepends:
|
|
27
|
+
|
|
28
|
+
- **Transform3d** — 14 float32 fields: `positionX/Y/Z`, `rotationX/Y/Z/W` (quaternion), `prevPositionX/Y/Z`, `prevRotationX/Y/Z/W`
|
|
29
|
+
- **PhysicsRefs** — `bodyHandle: float64`, `colliderHandle: float64`, `bodyType: uint8`, `collisionLayer: uint16`
|
|
30
|
+
- **PhysicsRefsFilter** — filter matching `[PhysicsRefs, Transform3d]`
|
|
31
|
+
|
|
32
|
+
```yaml
|
|
33
|
+
simulationType: physics3d
|
|
34
|
+
|
|
35
|
+
components:
|
|
36
|
+
Velocity:
|
|
37
|
+
x: float32
|
|
38
|
+
y: float32
|
|
39
|
+
z: float32
|
|
40
|
+
|
|
41
|
+
Health:
|
|
42
|
+
value: uint16
|
|
43
|
+
|
|
44
|
+
singletons:
|
|
45
|
+
GameState:
|
|
46
|
+
phase: uint8
|
|
47
|
+
|
|
48
|
+
filters:
|
|
49
|
+
VelocityFilter:
|
|
50
|
+
include: [Velocity, Transform3d]
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
## Usage
|
|
54
|
+
|
|
55
|
+
### Runner Setup
|
|
56
|
+
|
|
57
|
+
```typescript
|
|
58
|
+
import RAPIER from '@dimforge/rapier3d-compat';
|
|
59
|
+
import { PhysicsConfig3d } from '@lagless/physics3d';
|
|
60
|
+
import { MyGameRunner } from './code-gen/my-game.runner.js';
|
|
61
|
+
|
|
62
|
+
await RAPIER.init();
|
|
63
|
+
|
|
64
|
+
const runner = new MyGameRunner(
|
|
65
|
+
ecsConfig,
|
|
66
|
+
inputProvider,
|
|
67
|
+
[PhysicsSystem, MovementSystem],
|
|
68
|
+
[HitSignal],
|
|
69
|
+
RAPIER,
|
|
70
|
+
new PhysicsConfig3d({ gravityY: -9.81, substeps: 2 }),
|
|
71
|
+
);
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### Physics System Pattern
|
|
75
|
+
|
|
76
|
+
```typescript
|
|
77
|
+
@ECSSystem()
|
|
78
|
+
class PhysicsSystem implements IECSSystem {
|
|
79
|
+
constructor(
|
|
80
|
+
private readonly _transform: Transform3d,
|
|
81
|
+
private readonly _physicsRefs: PhysicsRefs,
|
|
82
|
+
private readonly _filter: PhysicsRefsFilter,
|
|
83
|
+
private readonly _worldManager: PhysicsWorldManager3d,
|
|
84
|
+
private readonly _physicsConfig: PhysicsConfig3d,
|
|
85
|
+
) {}
|
|
86
|
+
|
|
87
|
+
update(tick: number): void {
|
|
88
|
+
// 1. Save previous transforms (for interpolation)
|
|
89
|
+
PhysicsStepSync3d.savePrevTransforms(this._filter, this._transform);
|
|
90
|
+
|
|
91
|
+
// 2. Push kinematic bodies from ECS → Rapier
|
|
92
|
+
PhysicsStepSync3d.syncKinematicToRapier(
|
|
93
|
+
this._filter, this._physicsRefs, this._transform, this._worldManager,
|
|
94
|
+
);
|
|
95
|
+
|
|
96
|
+
// 3. Step physics
|
|
97
|
+
this._worldManager.step();
|
|
98
|
+
|
|
99
|
+
// 4. Pull dynamic bodies from Rapier → ECS
|
|
100
|
+
PhysicsStepSync3d.syncDynamicFromRapier(
|
|
101
|
+
this._filter, this._physicsRefs, this._transform, this._worldManager,
|
|
102
|
+
);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
### Spawning a Physics Entity
|
|
108
|
+
|
|
109
|
+
```typescript
|
|
110
|
+
@ECSSystem()
|
|
111
|
+
class SpawnSystem implements IECSSystem {
|
|
112
|
+
constructor(
|
|
113
|
+
private readonly _entities: EntitiesManager,
|
|
114
|
+
private readonly _transform: Transform3d,
|
|
115
|
+
private readonly _physicsRefs: PhysicsRefs,
|
|
116
|
+
private readonly _worldManager: PhysicsWorldManager3d,
|
|
117
|
+
) {}
|
|
118
|
+
|
|
119
|
+
spawnBall(x: number, y: number, z: number, radius: number): number {
|
|
120
|
+
const entity = this._entities.create();
|
|
121
|
+
|
|
122
|
+
// Create Rapier body + collider
|
|
123
|
+
const body = this._worldManager.createDynamicBody();
|
|
124
|
+
body.setTranslation({ x, y, z }, true);
|
|
125
|
+
const collider = this._worldManager.createBallCollider(radius, body);
|
|
126
|
+
|
|
127
|
+
// Write to ECS components
|
|
128
|
+
this._physicsRefs.bodyHandle.set(entity, body.handle);
|
|
129
|
+
this._physicsRefs.colliderHandle.set(entity, collider.handle);
|
|
130
|
+
this._physicsRefs.bodyType.set(entity, BodyType.DYNAMIC);
|
|
131
|
+
|
|
132
|
+
this._transform.positionX.set(entity, x);
|
|
133
|
+
this._transform.positionY.set(entity, y);
|
|
134
|
+
this._transform.positionZ.set(entity, z);
|
|
135
|
+
// Always set prev = current to avoid interpolation jump
|
|
136
|
+
this._transform.prevPositionX.set(entity, x);
|
|
137
|
+
this._transform.prevPositionY.set(entity, y);
|
|
138
|
+
this._transform.prevPositionZ.set(entity, z);
|
|
139
|
+
this._transform.rotationW.set(entity, 1); // identity quaternion
|
|
140
|
+
this._transform.prevRotationW.set(entity, 1);
|
|
141
|
+
|
|
142
|
+
this._worldManager.registerCollider(collider.handle, entity);
|
|
143
|
+
return entity;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
## PhysicsConfig3d
|
|
149
|
+
|
|
150
|
+
| Property | Type | Default | Description |
|
|
151
|
+
|----------|------|---------|-------------|
|
|
152
|
+
| `gravityX` | `number` | `0` | Gravity X component |
|
|
153
|
+
| `gravityY` | `number` | `-9.81` | Gravity Y component |
|
|
154
|
+
| `gravityZ` | `number` | `0` | Gravity Z component |
|
|
155
|
+
| `substeps` | `number` | `1` | Physics substeps per frame |
|
|
156
|
+
| `substepDt` | `number` | (derived) | `frameDt / substeps` |
|
|
157
|
+
|
|
158
|
+
## Collision Layers
|
|
159
|
+
|
|
160
|
+
```typescript
|
|
161
|
+
import { CollisionLayers } from '@lagless/physics3d';
|
|
162
|
+
|
|
163
|
+
const layers = new CollisionLayers();
|
|
164
|
+
const PLAYER = layers.layer('player');
|
|
165
|
+
const GROUND = layers.layer('ground');
|
|
166
|
+
const PROJECTILE = layers.layer('projectile');
|
|
167
|
+
|
|
168
|
+
layers
|
|
169
|
+
.pair('player', 'ground')
|
|
170
|
+
.pair('player', 'projectile')
|
|
171
|
+
.selfPair('projectile');
|
|
172
|
+
|
|
173
|
+
// Use when creating colliders:
|
|
174
|
+
const groups = layers.groups('player');
|
|
175
|
+
worldManager.createBallCollider(0.5, body, groups, RAPIER.ActiveEvents.COLLISION_EVENTS);
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
Max 16 named layers.
|
|
179
|
+
|
|
180
|
+
## Collision Events
|
|
181
|
+
|
|
182
|
+
Enable by passing `collisionLayers` to the runner constructor. Then inject `CollisionEvents3d` in your system:
|
|
183
|
+
|
|
184
|
+
```typescript
|
|
185
|
+
@ECSSystem()
|
|
186
|
+
class DamageSystem implements IECSSystem {
|
|
187
|
+
constructor(private readonly _events: CollisionEvents3d) {}
|
|
188
|
+
|
|
189
|
+
update(tick: number): void {
|
|
190
|
+
for (let i = 0; i < this._events.collisionEnterCount; i++) {
|
|
191
|
+
const entityA = this._events.collisionEnterEntityA(i);
|
|
192
|
+
const entityB = this._events.collisionEnterEntityB(i);
|
|
193
|
+
// handle collision...
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
Event types: `collisionEnter/Exit`, `sensorEnter/Exit`, `contactForce` (with magnitude).
|
|
200
|
+
|
|
201
|
+
Events are ephemeral — cleared each tick, regenerated on rollback re-simulation. Zero-allocation SoA buffers.
|
|
202
|
+
|
|
203
|
+
## Snapshot/Rollback
|
|
204
|
+
|
|
205
|
+
`PhysicsSimulation3d` automatically maintains parallel snapshot histories for both ECS (ArrayBuffer) and Rapier (binary). On rollback, both are restored in sync. No manual intervention needed.
|
|
206
|
+
|
|
207
|
+
## Body Types
|
|
208
|
+
|
|
209
|
+
| Constant | Value | Description |
|
|
210
|
+
|----------|-------|-------------|
|
|
211
|
+
| `BodyType.DYNAMIC` | `0` | Physics-simulated |
|
|
212
|
+
| `BodyType.FIXED` | `1` | Static, immovable |
|
|
213
|
+
| `BodyType.KINEMATIC_POSITION` | `2` | ECS-driven position |
|
|
214
|
+
| `BodyType.KINEMATIC_VELOCITY` | `3` | ECS-driven velocity |
|
|
215
|
+
|
|
216
|
+
## API Reference
|
|
217
|
+
|
|
218
|
+
### PhysicsWorldManager3d
|
|
219
|
+
|
|
220
|
+
**Body factories:** `createDynamicBody()`, `createFixedBody()`, `createKinematicPositionBody()`, `createKinematicVelocityBody()`, `createBodyFromDesc(desc)`
|
|
221
|
+
|
|
222
|
+
**Collider factories:** `createBallCollider(r, parent?, groups?, events?)`, `createCuboidCollider(hx, hy, hz, parent?, groups?, events?)`, `createCapsuleCollider(halfH, r, parent?, groups?, events?)`, `createTrimeshCollider(vertices, indices, parent?)`, `createColliderFromDesc(desc, parent?)`
|
|
223
|
+
|
|
224
|
+
**Accessors:** `getBody(handle)`, `getCollider(handle)`, `world`, `substeps`, `colliderEntityMap`, `rapier`
|
|
225
|
+
|
|
226
|
+
**Lifecycle:** `step()`, `takeSnapshot()`, `restoreSnapshot(data)`, `registerCollider(handle, entity)`, `unregisterCollider(handle)`, `enableCollisionEvents(events)`, `dispose()`
|
|
227
|
+
|
|
228
|
+
### PhysicsStepSync3d (static)
|
|
229
|
+
|
|
230
|
+
- `savePrevTransforms(filter, transform)` — copy current → prev fields
|
|
231
|
+
- `syncKinematicToRapier(filter, physicsRefs, transform, worldManager)` — ECS → Rapier for kinematic bodies
|
|
232
|
+
- `syncDynamicFromRapier(filter, physicsRefs, transform, worldManager)` — Rapier → ECS for dynamic bodies
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export * from './lib/rapier-types.js';
|
|
2
|
+
export * from './lib/physics-config-3d.js';
|
|
3
|
+
export * from './lib/physics-world-manager-3d.js';
|
|
4
|
+
export * from './lib/physics-simulation-3d.js';
|
|
5
|
+
export * from './lib/physics-runner-3d.js';
|
|
6
|
+
export * from './lib/physics-step-sync-3d.js';
|
|
7
|
+
export * from './lib/collision-layers-3d.js';
|
|
8
|
+
export * from './lib/collision-events-3d.js';
|
|
9
|
+
export * from './lib/collider-entity-map-3d.js';
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AACtC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,mCAAmC,CAAC;AAClD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,iCAAiC,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export * from './lib/rapier-types.js';
|
|
2
|
+
export * from './lib/physics-config-3d.js';
|
|
3
|
+
export * from './lib/physics-world-manager-3d.js';
|
|
4
|
+
export * from './lib/physics-simulation-3d.js';
|
|
5
|
+
export * from './lib/physics-runner-3d.js';
|
|
6
|
+
export * from './lib/physics-step-sync-3d.js';
|
|
7
|
+
export * from './lib/collision-layers-3d.js';
|
|
8
|
+
export * from './lib/collision-events-3d.js';
|
|
9
|
+
export * from './lib/collider-entity-map-3d.js';
|
|
10
|
+
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["export * from './lib/rapier-types.js';\nexport * from './lib/physics-config-3d.js';\nexport * from './lib/physics-world-manager-3d.js';\nexport * from './lib/physics-simulation-3d.js';\nexport * from './lib/physics-runner-3d.js';\nexport * from './lib/physics-step-sync-3d.js';\nexport * from './lib/collision-layers-3d.js';\nexport * from './lib/collision-events-3d.js';\nexport * from './lib/collider-entity-map-3d.js';\n"],"names":[],"rangeMappings":";;;;;;;;","mappings":"AAAA,cAAc,wBAAwB;AACtC,cAAc,6BAA6B;AAC3C,cAAc,oCAAoC;AAClD,cAAc,iCAAiC;AAC/C,cAAc,6BAA6B;AAC3C,cAAc,gCAAgC;AAC9C,cAAc,+BAA+B;AAC7C,cAAc,+BAA+B;AAC7C,cAAc,kCAAkC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collider-entity-map-3d.d.ts","sourceRoot":"","sources":["../../src/lib/collider-entity-map-3d.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,IAAI,mBAAmB,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/lib/collider-entity-map-3d.ts"],"sourcesContent":["export { ColliderEntityMap as ColliderEntityMap3d, handleToIndex } from '@lagless/physics-shared';\n"],"names":["ColliderEntityMap","ColliderEntityMap3d","handleToIndex"],"rangeMappings":"","mappings":"AAAA,SAASA,qBAAqBC,mBAAmB,EAAEC,aAAa,QAAQ,0BAA0B"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { CollisionEventsBase } from '@lagless/physics-shared';
|
|
2
|
+
import type { RapierModule3d } from './rapier-types.js';
|
|
3
|
+
export declare class CollisionEvents3d extends CollisionEventsBase {
|
|
4
|
+
constructor(rapier: RapierModule3d, initialCapacity?: number);
|
|
5
|
+
}
|
|
6
|
+
//# sourceMappingURL=collision-events-3d.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collision-events-3d.d.ts","sourceRoot":"","sources":["../../src/lib/collision-events-3d.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAExD,qBAAa,iBAAkB,SAAQ,mBAAmB;gBAC5C,MAAM,EAAE,cAAc,EAAE,eAAe,CAAC,EAAE,MAAM;CAG7D"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { CollisionEventsBase } from '@lagless/physics-shared';
|
|
2
|
+
export class CollisionEvents3d extends CollisionEventsBase {
|
|
3
|
+
constructor(rapier, initialCapacity){
|
|
4
|
+
super(rapier.EventQueue, initialCapacity);
|
|
5
|
+
}
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
//# sourceMappingURL=collision-events-3d.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/lib/collision-events-3d.ts"],"sourcesContent":["import { CollisionEventsBase } from '@lagless/physics-shared';\nimport type { RapierModule3d } from './rapier-types.js';\n\nexport class CollisionEvents3d extends CollisionEventsBase {\n constructor(rapier: RapierModule3d, initialCapacity?: number) {\n super(rapier.EventQueue, initialCapacity);\n }\n}\n"],"names":["CollisionEventsBase","CollisionEvents3d","constructor","rapier","initialCapacity","EventQueue"],"rangeMappings":";;;;;","mappings":"AAAA,SAASA,mBAAmB,QAAQ,0BAA0B;AAG9D,OAAO,MAAMC,0BAA0BD;IACrCE,YAAYC,MAAsB,EAAEC,eAAwB,CAAE;QAC5D,KAAK,CAACD,OAAOE,UAAU,EAAED;IAC3B;AACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collision-layers-3d.d.ts","sourceRoot":"","sources":["../../src/lib/collision-layers-3d.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,IAAI,iBAAiB,EAAE,MAAM,yBAAyB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/lib/collision-layers-3d.ts"],"sourcesContent":["export { CollisionLayers as CollisionLayers3d } from '@lagless/physics-shared';\n"],"names":["CollisionLayers","CollisionLayers3d"],"rangeMappings":"","mappings":"AAAA,SAASA,mBAAmBC,iBAAiB,QAAQ,0BAA0B"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export declare class PhysicsConfig3d {
|
|
2
|
+
readonly gravityX: number;
|
|
3
|
+
readonly gravityY: number;
|
|
4
|
+
readonly gravityZ: number;
|
|
5
|
+
readonly substeps: number;
|
|
6
|
+
/** Per-substep dt in seconds, derived from frameDt / substeps */
|
|
7
|
+
readonly substepDt: number;
|
|
8
|
+
constructor(options?: Partial<Pick<PhysicsConfig3d, 'gravityX' | 'gravityY' | 'gravityZ' | 'substeps'>>, frameDt?: number);
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=physics-config-3d.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"physics-config-3d.d.ts","sourceRoot":"","sources":["../../src/lib/physics-config-3d.ts"],"names":[],"mappings":"AAAA,qBAAa,eAAe;IAC1B,SAAgB,QAAQ,EAAE,MAAM,CAAC;IACjC,SAAgB,QAAQ,EAAE,MAAM,CAAC;IACjC,SAAgB,QAAQ,EAAE,MAAM,CAAC;IACjC,SAAgB,QAAQ,EAAE,MAAM,CAAC;IACjC,iEAAiE;IACjE,SAAgB,SAAS,EAAE,MAAM,CAAC;gBAGhC,OAAO,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,eAAe,EAAE,UAAU,GAAG,UAAU,GAAG,UAAU,GAAG,UAAU,CAAC,CAAC,EAC3F,OAAO,GAAE,MAAe;CAQ3B"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export class PhysicsConfig3d {
|
|
2
|
+
constructor(options, frameDt = 1 / 60){
|
|
3
|
+
var _options_gravityX;
|
|
4
|
+
this.gravityX = (_options_gravityX = options == null ? void 0 : options.gravityX) != null ? _options_gravityX : 0;
|
|
5
|
+
var _options_gravityY;
|
|
6
|
+
this.gravityY = (_options_gravityY = options == null ? void 0 : options.gravityY) != null ? _options_gravityY : -9.81;
|
|
7
|
+
var _options_gravityZ;
|
|
8
|
+
this.gravityZ = (_options_gravityZ = options == null ? void 0 : options.gravityZ) != null ? _options_gravityZ : 0;
|
|
9
|
+
var _options_substeps;
|
|
10
|
+
this.substeps = (_options_substeps = options == null ? void 0 : options.substeps) != null ? _options_substeps : 1;
|
|
11
|
+
this.substepDt = frameDt / this.substeps;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
//# sourceMappingURL=physics-config-3d.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/lib/physics-config-3d.ts"],"sourcesContent":["export class PhysicsConfig3d {\n public readonly gravityX: number;\n public readonly gravityY: number;\n public readonly gravityZ: number;\n public readonly substeps: number;\n /** Per-substep dt in seconds, derived from frameDt / substeps */\n public readonly substepDt: number;\n\n constructor(\n options?: Partial<Pick<PhysicsConfig3d, 'gravityX' | 'gravityY' | 'gravityZ' | 'substeps'>>,\n frameDt: number = 1 / 60,\n ) {\n this.gravityX = options?.gravityX ?? 0;\n this.gravityY = options?.gravityY ?? -9.81;\n this.gravityZ = options?.gravityZ ?? 0;\n this.substeps = options?.substeps ?? 1;\n this.substepDt = frameDt / this.substeps;\n }\n}\n"],"names":["PhysicsConfig3d","constructor","options","frameDt","gravityX","gravityY","gravityZ","substeps","substepDt"],"rangeMappings":";;;;;;;;;;;;","mappings":"AAAA,OAAO,MAAMA;IAQXC,YACEC,OAA2F,EAC3FC,UAAkB,IAAI,EAAE,CACxB;YACgBD;QAAhB,IAAI,CAACE,QAAQ,GAAGF,CAAAA,oBAAAA,2BAAAA,QAASE,QAAQ,YAAjBF,oBAAqB;YACrBA;QAAhB,IAAI,CAACG,QAAQ,GAAGH,CAAAA,oBAAAA,2BAAAA,QAASG,QAAQ,YAAjBH,oBAAqB,CAAC;YACtBA;QAAhB,IAAI,CAACI,QAAQ,GAAGJ,CAAAA,oBAAAA,2BAAAA,QAASI,QAAQ,YAAjBJ,oBAAqB;YACrBA;QAAhB,IAAI,CAACK,QAAQ,GAAGL,CAAAA,oBAAAA,2BAAAA,QAASK,QAAQ,YAAjBL,oBAAqB;QACrC,IAAI,CAACM,SAAS,GAAGL,UAAU,IAAI,CAACI,QAAQ;IAC1C;AACF"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { AbstractInputProvider, ECSConfig, ECSRunner, ECSDeps, IECSSystemConstructor } from '@lagless/core';
|
|
2
|
+
import { ISignalConstructor } from '@lagless/core';
|
|
3
|
+
import { CollisionLayers } from '@lagless/physics-shared';
|
|
4
|
+
import { CollisionEvents3d } from './collision-events-3d.js';
|
|
5
|
+
import { PhysicsConfig3d } from './physics-config-3d.js';
|
|
6
|
+
import { PhysicsSimulation3d } from './physics-simulation-3d.js';
|
|
7
|
+
import { PhysicsWorldManager3d } from './physics-world-manager-3d.js';
|
|
8
|
+
import { RapierModule3d } from './rapier-types.js';
|
|
9
|
+
export declare abstract class PhysicsRunner3d extends ECSRunner {
|
|
10
|
+
readonly PhysicsWorldManager: PhysicsWorldManager3d;
|
|
11
|
+
readonly PhysicsConfig: PhysicsConfig3d;
|
|
12
|
+
readonly CollisionEvents: CollisionEvents3d;
|
|
13
|
+
readonly Simulation: PhysicsSimulation3d;
|
|
14
|
+
protected constructor(Config: ECSConfig, InputProviderInstance: AbstractInputProvider, Systems: Array<IECSSystemConstructor>, Signals: Array<ISignalConstructor>, Deps: ECSDeps, rapier: RapierModule3d, physicsConfig?: PhysicsConfig3d, collisionLayers?: CollisionLayers, extraRegistrations?: Array<[unknown, unknown]>);
|
|
15
|
+
dispose(): void;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=physics-runner-3d.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"physics-runner-3d.d.ts","sourceRoot":"","sources":["../../src/lib/physics-runner-3d.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAC5G,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,8BAAsB,eAAgB,SAAQ,SAAS;IACrD,SAAgB,mBAAmB,EAAE,qBAAqB,CAAC;IAC3D,SAAgB,aAAa,EAAE,eAAe,CAAC;IAC/C,SAAgB,eAAe,EAAE,iBAAiB,CAAC;IACnD,SAAyB,UAAU,EAAE,mBAAmB,CAAC;IAEzD,SAAS,aACP,MAAM,EAAE,SAAS,EACjB,qBAAqB,EAAE,qBAAqB,EAC5C,OAAO,EAAE,KAAK,CAAC,qBAAqB,CAAC,EACrC,OAAO,EAAE,KAAK,CAAC,kBAAkB,CAAC,EAClC,IAAI,EAAE,OAAO,EACb,MAAM,EAAE,cAAc,EACtB,aAAa,CAAC,EAAE,eAAe,EAC/B,eAAe,CAAC,EAAE,eAAe,EACjC,kBAAkB,CAAC,EAAE,KAAK,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IA0BhC,OAAO,IAAI,IAAI;CAIhC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { ECSRunner } from '@lagless/core';
|
|
2
|
+
import { CollisionLayers } from '@lagless/physics-shared';
|
|
3
|
+
import { CollisionEvents3d } from './collision-events-3d.js';
|
|
4
|
+
import { PhysicsConfig3d } from './physics-config-3d.js';
|
|
5
|
+
import { PhysicsSimulation3d } from './physics-simulation-3d.js';
|
|
6
|
+
import { PhysicsWorldManager3d } from './physics-world-manager-3d.js';
|
|
7
|
+
export class PhysicsRunner3d extends ECSRunner {
|
|
8
|
+
dispose() {
|
|
9
|
+
super.dispose();
|
|
10
|
+
this.PhysicsWorldManager.dispose();
|
|
11
|
+
}
|
|
12
|
+
constructor(Config, InputProviderInstance, Systems, Signals, Deps, rapier, physicsConfig, collisionLayers, extraRegistrations){
|
|
13
|
+
const config = physicsConfig != null ? physicsConfig : new PhysicsConfig3d();
|
|
14
|
+
const worldManager = new PhysicsWorldManager3d(rapier, config, Config.frameLength);
|
|
15
|
+
const simulation = new PhysicsSimulation3d(Config, Deps, InputProviderInstance, worldManager);
|
|
16
|
+
const extraRegs = [
|
|
17
|
+
[
|
|
18
|
+
PhysicsWorldManager3d,
|
|
19
|
+
worldManager
|
|
20
|
+
],
|
|
21
|
+
[
|
|
22
|
+
PhysicsConfig3d,
|
|
23
|
+
config
|
|
24
|
+
],
|
|
25
|
+
[
|
|
26
|
+
CollisionEvents3d,
|
|
27
|
+
worldManager.collisionEvents
|
|
28
|
+
]
|
|
29
|
+
];
|
|
30
|
+
if (collisionLayers) {
|
|
31
|
+
extraRegs.push([
|
|
32
|
+
CollisionLayers,
|
|
33
|
+
collisionLayers
|
|
34
|
+
]);
|
|
35
|
+
}
|
|
36
|
+
if (extraRegistrations) {
|
|
37
|
+
extraRegs.push(...extraRegistrations);
|
|
38
|
+
}
|
|
39
|
+
super(Config, InputProviderInstance, Systems, Signals, Deps, simulation, extraRegs);
|
|
40
|
+
this.PhysicsWorldManager = worldManager;
|
|
41
|
+
this.PhysicsConfig = config;
|
|
42
|
+
this.Simulation = simulation;
|
|
43
|
+
this.CollisionEvents = worldManager.collisionEvents;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
//# sourceMappingURL=physics-runner-3d.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/lib/physics-runner-3d.ts"],"sourcesContent":["import { AbstractInputProvider, ECSConfig, ECSRunner, ECSDeps, IECSSystemConstructor } from '@lagless/core';\nimport { ISignalConstructor } from '@lagless/core';\nimport { CollisionLayers } from '@lagless/physics-shared';\nimport { CollisionEvents3d } from './collision-events-3d.js';\nimport { PhysicsConfig3d } from './physics-config-3d.js';\nimport { PhysicsSimulation3d } from './physics-simulation-3d.js';\nimport { PhysicsWorldManager3d } from './physics-world-manager-3d.js';\nimport { RapierModule3d } from './rapier-types.js';\n\nexport abstract class PhysicsRunner3d extends ECSRunner {\n public readonly PhysicsWorldManager: PhysicsWorldManager3d;\n public readonly PhysicsConfig: PhysicsConfig3d;\n public readonly CollisionEvents: CollisionEvents3d;\n public override readonly Simulation: PhysicsSimulation3d;\n\n protected constructor(\n Config: ECSConfig,\n InputProviderInstance: AbstractInputProvider,\n Systems: Array<IECSSystemConstructor>,\n Signals: Array<ISignalConstructor>,\n Deps: ECSDeps,\n rapier: RapierModule3d,\n physicsConfig?: PhysicsConfig3d,\n collisionLayers?: CollisionLayers,\n extraRegistrations?: Array<[unknown, unknown]>,\n ) {\n const config = physicsConfig ?? new PhysicsConfig3d();\n const worldManager = new PhysicsWorldManager3d(rapier, config, Config.frameLength);\n const simulation = new PhysicsSimulation3d(Config, Deps, InputProviderInstance, worldManager);\n\n const extraRegs: Array<[unknown, unknown]> = [\n [PhysicsWorldManager3d, worldManager],\n [PhysicsConfig3d, config],\n [CollisionEvents3d, worldManager.collisionEvents],\n ];\n if (collisionLayers) {\n extraRegs.push([CollisionLayers, collisionLayers]);\n }\n if (extraRegistrations) {\n extraRegs.push(...extraRegistrations);\n }\n\n super(Config, InputProviderInstance, Systems, Signals, Deps, simulation, extraRegs);\n\n this.PhysicsWorldManager = worldManager;\n this.PhysicsConfig = config;\n this.Simulation = simulation;\n this.CollisionEvents = worldManager.collisionEvents;\n }\n\n public override dispose(): void {\n super.dispose();\n this.PhysicsWorldManager.dispose();\n }\n}\n"],"names":["ECSRunner","CollisionLayers","CollisionEvents3d","PhysicsConfig3d","PhysicsSimulation3d","PhysicsWorldManager3d","PhysicsRunner3d","dispose","PhysicsWorldManager","Config","InputProviderInstance","Systems","Signals","Deps","rapier","physicsConfig","collisionLayers","extraRegistrations","config","worldManager","frameLength","simulation","extraRegs","collisionEvents","push","PhysicsConfig","Simulation","CollisionEvents"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"AAAA,SAA2CA,SAAS,QAAwC,gBAAgB;AAE5G,SAASC,eAAe,QAAQ,0BAA0B;AAC1D,SAASC,iBAAiB,QAAQ,2BAA2B;AAC7D,SAASC,eAAe,QAAQ,yBAAyB;AACzD,SAASC,mBAAmB,QAAQ,6BAA6B;AACjE,SAASC,qBAAqB,QAAQ,gCAAgC;AAGtE,OAAO,MAAeC,wBAAwBN;IAyC5BO,UAAgB;QAC9B,KAAK,CAACA;QACN,IAAI,CAACC,mBAAmB,CAACD,OAAO;IAClC;IAtCA,YACEE,MAAiB,EACjBC,qBAA4C,EAC5CC,OAAqC,EACrCC,OAAkC,EAClCC,IAAa,EACbC,MAAsB,EACtBC,aAA+B,EAC/BC,eAAiC,EACjCC,kBAA8C,CAC9C;QACA,MAAMC,SAASH,wBAAAA,gBAAiB,IAAIZ;QACpC,MAAMgB,eAAe,IAAId,sBAAsBS,QAAQI,QAAQT,OAAOW,WAAW;QACjF,MAAMC,aAAa,IAAIjB,oBAAoBK,QAAQI,MAAMH,uBAAuBS;QAEhF,MAAMG,YAAuC;YAC3C;gBAACjB;gBAAuBc;aAAa;YACrC;gBAAChB;gBAAiBe;aAAO;YACzB;gBAAChB;gBAAmBiB,aAAaI,eAAe;aAAC;SAClD;QACD,IAAIP,iBAAiB;YACnBM,UAAUE,IAAI,CAAC;gBAACvB;gBAAiBe;aAAgB;QACnD;QACA,IAAIC,oBAAoB;YACtBK,UAAUE,IAAI,IAAIP;QACpB;QAEA,KAAK,CAACR,QAAQC,uBAAuBC,SAASC,SAASC,MAAMQ,YAAYC;QAEzE,IAAI,CAACd,mBAAmB,GAAGW;QAC3B,IAAI,CAACM,aAAa,GAAGP;QACrB,IAAI,CAACQ,UAAU,GAAGL;QAClB,IAAI,CAACM,eAAe,GAAGR,aAAaI,eAAe;IACrD;AAMF"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { ECSConfig, AbstractInputProvider, ECSDeps } from '@lagless/core';
|
|
2
|
+
import { PhysicsSimulationBase } from '@lagless/physics-shared';
|
|
3
|
+
import { PhysicsWorldManager3d } from './physics-world-manager-3d.js';
|
|
4
|
+
export declare class PhysicsSimulation3d extends PhysicsSimulationBase {
|
|
5
|
+
constructor(config: ECSConfig, deps: ECSDeps, inputProvider: AbstractInputProvider, physicsWorldManager: PhysicsWorldManager3d);
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=physics-simulation-3d.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"physics-simulation-3d.d.ts","sourceRoot":"","sources":["../../src/lib/physics-simulation-3d.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,qBAAqB,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC1E,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAEtE,qBAAa,mBAAoB,SAAQ,qBAAqB;gBAE1D,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE,OAAO,EACb,aAAa,EAAE,qBAAqB,EACpC,mBAAmB,EAAE,qBAAqB;CAI7C"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { PhysicsSimulationBase } from '@lagless/physics-shared';
|
|
2
|
+
export class PhysicsSimulation3d extends PhysicsSimulationBase {
|
|
3
|
+
constructor(config, deps, inputProvider, physicsWorldManager){
|
|
4
|
+
super(config, deps, inputProvider, physicsWorldManager);
|
|
5
|
+
}
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
//# sourceMappingURL=physics-simulation-3d.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/lib/physics-simulation-3d.ts"],"sourcesContent":["import { ECSConfig, AbstractInputProvider, ECSDeps } from '@lagless/core';\nimport { PhysicsSimulationBase } from '@lagless/physics-shared';\nimport { PhysicsWorldManager3d } from './physics-world-manager-3d.js';\n\nexport class PhysicsSimulation3d extends PhysicsSimulationBase {\n constructor(\n config: ECSConfig,\n deps: ECSDeps,\n inputProvider: AbstractInputProvider,\n physicsWorldManager: PhysicsWorldManager3d,\n ) {\n super(config, deps, inputProvider, physicsWorldManager);\n }\n}\n"],"names":["PhysicsSimulationBase","PhysicsSimulation3d","constructor","config","deps","inputProvider","physicsWorldManager"],"rangeMappings":";;;;;","mappings":"AACA,SAASA,qBAAqB,QAAQ,0BAA0B;AAGhE,OAAO,MAAMC,4BAA4BD;IACvCE,YACEC,MAAiB,EACjBC,IAAa,EACbC,aAAoC,EACpCC,mBAA0C,CAC1C;QACA,KAAK,CAACH,QAAQC,MAAMC,eAAeC;IACrC;AACF"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { PhysicsWorldManager3d } from './physics-world-manager-3d.js';
|
|
2
|
+
export type { IPhysicsRefsComponent, IFilter } from '@lagless/physics-shared';
|
|
3
|
+
export { BodyType as BodyType3d } from '@lagless/physics-shared';
|
|
4
|
+
export interface ITransform3dComponent {
|
|
5
|
+
positionX: {
|
|
6
|
+
get(entity: number): number;
|
|
7
|
+
set(entity: number, v: number): void;
|
|
8
|
+
};
|
|
9
|
+
positionY: {
|
|
10
|
+
get(entity: number): number;
|
|
11
|
+
set(entity: number, v: number): void;
|
|
12
|
+
};
|
|
13
|
+
positionZ: {
|
|
14
|
+
get(entity: number): number;
|
|
15
|
+
set(entity: number, v: number): void;
|
|
16
|
+
};
|
|
17
|
+
rotationX: {
|
|
18
|
+
get(entity: number): number;
|
|
19
|
+
set(entity: number, v: number): void;
|
|
20
|
+
};
|
|
21
|
+
rotationY: {
|
|
22
|
+
get(entity: number): number;
|
|
23
|
+
set(entity: number, v: number): void;
|
|
24
|
+
};
|
|
25
|
+
rotationZ: {
|
|
26
|
+
get(entity: number): number;
|
|
27
|
+
set(entity: number, v: number): void;
|
|
28
|
+
};
|
|
29
|
+
rotationW: {
|
|
30
|
+
get(entity: number): number;
|
|
31
|
+
set(entity: number, v: number): void;
|
|
32
|
+
};
|
|
33
|
+
prevPositionX: {
|
|
34
|
+
get(entity: number): number;
|
|
35
|
+
set(entity: number, v: number): void;
|
|
36
|
+
};
|
|
37
|
+
prevPositionY: {
|
|
38
|
+
get(entity: number): number;
|
|
39
|
+
set(entity: number, v: number): void;
|
|
40
|
+
};
|
|
41
|
+
prevPositionZ: {
|
|
42
|
+
get(entity: number): number;
|
|
43
|
+
set(entity: number, v: number): void;
|
|
44
|
+
};
|
|
45
|
+
prevRotationX: {
|
|
46
|
+
get(entity: number): number;
|
|
47
|
+
set(entity: number, v: number): void;
|
|
48
|
+
};
|
|
49
|
+
prevRotationY: {
|
|
50
|
+
get(entity: number): number;
|
|
51
|
+
set(entity: number, v: number): void;
|
|
52
|
+
};
|
|
53
|
+
prevRotationZ: {
|
|
54
|
+
get(entity: number): number;
|
|
55
|
+
set(entity: number, v: number): void;
|
|
56
|
+
};
|
|
57
|
+
prevRotationW: {
|
|
58
|
+
get(entity: number): number;
|
|
59
|
+
set(entity: number, v: number): void;
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
export declare class PhysicsStepSync3d {
|
|
63
|
+
static savePrevTransforms(filter: import('@lagless/physics-shared').IFilter, transform: ITransform3dComponent): void;
|
|
64
|
+
static syncKinematicToRapier(filter: import('@lagless/physics-shared').IFilter, physicsRefs: import('@lagless/physics-shared').IPhysicsRefsComponent, transform: ITransform3dComponent, worldManager: PhysicsWorldManager3d): void;
|
|
65
|
+
static syncDynamicFromRapier(filter: import('@lagless/physics-shared').IFilter, physicsRefs: import('@lagless/physics-shared').IPhysicsRefsComponent, transform: ITransform3dComponent, worldManager: PhysicsWorldManager3d): void;
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=physics-step-sync-3d.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"physics-step-sync-3d.d.ts","sourceRoot":"","sources":["../../src/lib/physics-step-sync-3d.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAEtE,YAAY,EAAE,qBAAqB,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAC9E,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAEjE,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE;QAAE,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;QAAC,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IACjF,SAAS,EAAE;QAAE,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;QAAC,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IACjF,SAAS,EAAE;QAAE,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;QAAC,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IACjF,SAAS,EAAE;QAAE,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;QAAC,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IACjF,SAAS,EAAE;QAAE,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;QAAC,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IACjF,SAAS,EAAE;QAAE,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;QAAC,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IACjF,SAAS,EAAE;QAAE,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;QAAC,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IACjF,aAAa,EAAE;QAAE,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;QAAC,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IACrF,aAAa,EAAE;QAAE,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;QAAC,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IACrF,aAAa,EAAE;QAAE,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;QAAC,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IACrF,aAAa,EAAE;QAAE,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;QAAC,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IACrF,aAAa,EAAE;QAAE,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;QAAC,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IACrF,aAAa,EAAE;QAAE,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;QAAC,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IACrF,aAAa,EAAE;QAAE,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;QAAC,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;CACtF;AAKD,qBAAa,iBAAiB;IAC5B,MAAM,CAAC,kBAAkB,CAAC,MAAM,EAAE,OAAO,yBAAyB,EAAE,OAAO,EAAE,SAAS,EAAE,qBAAqB,GAAG,IAAI;IAapH,MAAM,CAAC,qBAAqB,CAC1B,MAAM,EAAE,OAAO,yBAAyB,EAAE,OAAO,EACjD,WAAW,EAAE,OAAO,yBAAyB,EAAE,qBAAqB,EACpE,SAAS,EAAE,qBAAqB,EAChC,YAAY,EAAE,qBAAqB,GAClC,IAAI;IAmBP,MAAM,CAAC,qBAAqB,CAC1B,MAAM,EAAE,OAAO,yBAAyB,EAAE,OAAO,EACjD,WAAW,EAAE,OAAO,yBAAyB,EAAE,qBAAqB,EACpE,SAAS,EAAE,qBAAqB,EAChC,YAAY,EAAE,qBAAqB,GAClC,IAAI;CAmBR"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { BodyType } from '@lagless/physics-shared';
|
|
2
|
+
export { BodyType as BodyType3d } from '@lagless/physics-shared';
|
|
3
|
+
const _vec3 = {
|
|
4
|
+
x: 0,
|
|
5
|
+
y: 0,
|
|
6
|
+
z: 0
|
|
7
|
+
};
|
|
8
|
+
const _quat = {
|
|
9
|
+
x: 0,
|
|
10
|
+
y: 0,
|
|
11
|
+
z: 0,
|
|
12
|
+
w: 1
|
|
13
|
+
};
|
|
14
|
+
export class PhysicsStepSync3d {
|
|
15
|
+
static savePrevTransforms(filter, transform) {
|
|
16
|
+
for(let i = 0; i < filter.length; i++){
|
|
17
|
+
const e = filter.entities(i);
|
|
18
|
+
transform.prevPositionX.set(e, transform.positionX.get(e));
|
|
19
|
+
transform.prevPositionY.set(e, transform.positionY.get(e));
|
|
20
|
+
transform.prevPositionZ.set(e, transform.positionZ.get(e));
|
|
21
|
+
transform.prevRotationX.set(e, transform.rotationX.get(e));
|
|
22
|
+
transform.prevRotationY.set(e, transform.rotationY.get(e));
|
|
23
|
+
transform.prevRotationZ.set(e, transform.rotationZ.get(e));
|
|
24
|
+
transform.prevRotationW.set(e, transform.rotationW.get(e));
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
static syncKinematicToRapier(filter, physicsRefs, transform, worldManager) {
|
|
28
|
+
for(let i = 0; i < filter.length; i++){
|
|
29
|
+
const e = filter.entities(i);
|
|
30
|
+
const type = physicsRefs.bodyType.get(e);
|
|
31
|
+
if (type !== BodyType.KINEMATIC_POSITION && type !== BodyType.KINEMATIC_VELOCITY) continue;
|
|
32
|
+
const body = worldManager.getBody(physicsRefs.bodyHandle.get(e));
|
|
33
|
+
_vec3.x = transform.positionX.get(e);
|
|
34
|
+
_vec3.y = transform.positionY.get(e);
|
|
35
|
+
_vec3.z = transform.positionZ.get(e);
|
|
36
|
+
body.setNextKinematicTranslation(_vec3);
|
|
37
|
+
_quat.x = transform.rotationX.get(e);
|
|
38
|
+
_quat.y = transform.rotationY.get(e);
|
|
39
|
+
_quat.z = transform.rotationZ.get(e);
|
|
40
|
+
_quat.w = transform.rotationW.get(e);
|
|
41
|
+
body.setNextKinematicRotation(_quat);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
static syncDynamicFromRapier(filter, physicsRefs, transform, worldManager) {
|
|
45
|
+
for(let i = 0; i < filter.length; i++){
|
|
46
|
+
const e = filter.entities(i);
|
|
47
|
+
const type = physicsRefs.bodyType.get(e);
|
|
48
|
+
if (type !== BodyType.DYNAMIC) continue;
|
|
49
|
+
const body = worldManager.getBody(physicsRefs.bodyHandle.get(e));
|
|
50
|
+
const pos = body.translation();
|
|
51
|
+
const rot = body.rotation();
|
|
52
|
+
transform.positionX.set(e, pos.x);
|
|
53
|
+
transform.positionY.set(e, pos.y);
|
|
54
|
+
transform.positionZ.set(e, pos.z);
|
|
55
|
+
transform.rotationX.set(e, rot.x);
|
|
56
|
+
transform.rotationY.set(e, rot.y);
|
|
57
|
+
transform.rotationZ.set(e, rot.z);
|
|
58
|
+
transform.rotationW.set(e, rot.w);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
//# sourceMappingURL=physics-step-sync-3d.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/lib/physics-step-sync-3d.ts"],"sourcesContent":["import { BodyType } from '@lagless/physics-shared';\nimport { PhysicsWorldManager3d } from './physics-world-manager-3d.js';\n\nexport type { IPhysicsRefsComponent, IFilter } from '@lagless/physics-shared';\nexport { BodyType as BodyType3d } from '@lagless/physics-shared';\n\nexport interface ITransform3dComponent {\n positionX: { get(entity: number): number; set(entity: number, v: number): void };\n positionY: { get(entity: number): number; set(entity: number, v: number): void };\n positionZ: { get(entity: number): number; set(entity: number, v: number): void };\n rotationX: { get(entity: number): number; set(entity: number, v: number): void };\n rotationY: { get(entity: number): number; set(entity: number, v: number): void };\n rotationZ: { get(entity: number): number; set(entity: number, v: number): void };\n rotationW: { get(entity: number): number; set(entity: number, v: number): void };\n prevPositionX: { get(entity: number): number; set(entity: number, v: number): void };\n prevPositionY: { get(entity: number): number; set(entity: number, v: number): void };\n prevPositionZ: { get(entity: number): number; set(entity: number, v: number): void };\n prevRotationX: { get(entity: number): number; set(entity: number, v: number): void };\n prevRotationY: { get(entity: number): number; set(entity: number, v: number): void };\n prevRotationZ: { get(entity: number): number; set(entity: number, v: number): void };\n prevRotationW: { get(entity: number): number; set(entity: number, v: number): void };\n}\n\nconst _vec3 = { x: 0, y: 0, z: 0 };\nconst _quat = { x: 0, y: 0, z: 0, w: 1 };\n\nexport class PhysicsStepSync3d {\n static savePrevTransforms(filter: import('@lagless/physics-shared').IFilter, transform: ITransform3dComponent): void {\n for (let i = 0; i < filter.length; i++) {\n const e = filter.entities(i);\n transform.prevPositionX.set(e, transform.positionX.get(e));\n transform.prevPositionY.set(e, transform.positionY.get(e));\n transform.prevPositionZ.set(e, transform.positionZ.get(e));\n transform.prevRotationX.set(e, transform.rotationX.get(e));\n transform.prevRotationY.set(e, transform.rotationY.get(e));\n transform.prevRotationZ.set(e, transform.rotationZ.get(e));\n transform.prevRotationW.set(e, transform.rotationW.get(e));\n }\n }\n\n static syncKinematicToRapier(\n filter: import('@lagless/physics-shared').IFilter,\n physicsRefs: import('@lagless/physics-shared').IPhysicsRefsComponent,\n transform: ITransform3dComponent,\n worldManager: PhysicsWorldManager3d,\n ): void {\n for (let i = 0; i < filter.length; i++) {\n const e = filter.entities(i);\n const type = physicsRefs.bodyType.get(e);\n if (type !== BodyType.KINEMATIC_POSITION && type !== BodyType.KINEMATIC_VELOCITY) continue;\n\n const body = worldManager.getBody(physicsRefs.bodyHandle.get(e));\n _vec3.x = transform.positionX.get(e);\n _vec3.y = transform.positionY.get(e);\n _vec3.z = transform.positionZ.get(e);\n body.setNextKinematicTranslation(_vec3);\n _quat.x = transform.rotationX.get(e);\n _quat.y = transform.rotationY.get(e);\n _quat.z = transform.rotationZ.get(e);\n _quat.w = transform.rotationW.get(e);\n body.setNextKinematicRotation(_quat);\n }\n }\n\n static syncDynamicFromRapier(\n filter: import('@lagless/physics-shared').IFilter,\n physicsRefs: import('@lagless/physics-shared').IPhysicsRefsComponent,\n transform: ITransform3dComponent,\n worldManager: PhysicsWorldManager3d,\n ): void {\n for (let i = 0; i < filter.length; i++) {\n const e = filter.entities(i);\n const type = physicsRefs.bodyType.get(e);\n if (type !== BodyType.DYNAMIC) continue;\n\n const body = worldManager.getBody(physicsRefs.bodyHandle.get(e));\n const pos = body.translation();\n const rot = body.rotation();\n\n transform.positionX.set(e, pos.x);\n transform.positionY.set(e, pos.y);\n transform.positionZ.set(e, pos.z);\n transform.rotationX.set(e, rot.x);\n transform.rotationY.set(e, rot.y);\n transform.rotationZ.set(e, rot.z);\n transform.rotationW.set(e, rot.w);\n }\n }\n}\n"],"names":["BodyType","BodyType3d","_vec3","x","y","z","_quat","w","PhysicsStepSync3d","savePrevTransforms","filter","transform","i","length","e","entities","prevPositionX","set","positionX","get","prevPositionY","positionY","prevPositionZ","positionZ","prevRotationX","rotationX","prevRotationY","rotationY","prevRotationZ","rotationZ","prevRotationW","rotationW","syncKinematicToRapier","physicsRefs","worldManager","type","bodyType","KINEMATIC_POSITION","KINEMATIC_VELOCITY","body","getBody","bodyHandle","setNextKinematicTranslation","setNextKinematicRotation","syncDynamicFromRapier","DYNAMIC","pos","translation","rot","rotation"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { ColliderEntityMap } from '@lagless/physics-shared';
|
|
2
|
+
import { CollisionEvents3d } from './collision-events-3d.js';
|
|
3
|
+
import { PhysicsConfig3d } from './physics-config-3d.js';
|
|
4
|
+
import { RapierCollider3d, RapierColliderDesc, RapierModule3d, RapierRigidBody3d, RapierRigidBodyDesc, RapierWorld3d } from './rapier-types.js';
|
|
5
|
+
export declare class PhysicsWorldManager3d {
|
|
6
|
+
private readonly _rapier;
|
|
7
|
+
private readonly _config;
|
|
8
|
+
private _world;
|
|
9
|
+
private readonly _substeps;
|
|
10
|
+
private readonly _substepDt;
|
|
11
|
+
private readonly _collisionEvents;
|
|
12
|
+
private readonly _colliderEntityMap;
|
|
13
|
+
get world(): RapierWorld3d;
|
|
14
|
+
get substeps(): number;
|
|
15
|
+
get colliderEntityMap(): ColliderEntityMap;
|
|
16
|
+
get collisionEvents(): CollisionEvents3d;
|
|
17
|
+
constructor(_rapier: RapierModule3d, _config: PhysicsConfig3d, frameLengthMs: number);
|
|
18
|
+
/**
|
|
19
|
+
* Step the physics world for one ECS frame.
|
|
20
|
+
* Executes `substeps` Rapier steps, each with a fixed dt derived from frameLength / substeps.
|
|
21
|
+
* When collision events are enabled, drains the event queue after all substeps.
|
|
22
|
+
*/
|
|
23
|
+
step(): void;
|
|
24
|
+
takeSnapshot(): Uint8Array;
|
|
25
|
+
restoreSnapshot(data: Uint8Array): void;
|
|
26
|
+
registerCollider(colliderHandle: number, entity: number): void;
|
|
27
|
+
unregisterCollider(colliderHandle: number): void;
|
|
28
|
+
createDynamicBody(): RapierRigidBody3d;
|
|
29
|
+
createFixedBody(): RapierRigidBody3d;
|
|
30
|
+
createKinematicPositionBody(): RapierRigidBody3d;
|
|
31
|
+
createKinematicVelocityBody(): RapierRigidBody3d;
|
|
32
|
+
createBodyFromDesc(desc: RapierRigidBodyDesc): RapierRigidBody3d;
|
|
33
|
+
createBallCollider(radius: number, parent?: RapierRigidBody3d, groups?: number, activeEvents?: number): RapierCollider3d;
|
|
34
|
+
createCuboidCollider(hx: number, hy: number, hz: number, parent?: RapierRigidBody3d, groups?: number, activeEvents?: number): RapierCollider3d;
|
|
35
|
+
createCapsuleCollider(halfHeight: number, radius: number, parent?: RapierRigidBody3d, groups?: number, activeEvents?: number): RapierCollider3d;
|
|
36
|
+
createTrimeshCollider(vertices: Float32Array, indices: Uint32Array, parent?: RapierRigidBody3d): RapierCollider3d;
|
|
37
|
+
createColliderFromDesc(desc: RapierColliderDesc, parent?: RapierRigidBody3d): RapierCollider3d;
|
|
38
|
+
getBody(handle: number): RapierRigidBody3d;
|
|
39
|
+
getCollider(handle: number): RapierCollider3d;
|
|
40
|
+
removeBody(handle: number): void;
|
|
41
|
+
removeCollider(handle: number, wakeUp?: boolean): void;
|
|
42
|
+
get rapier(): RapierModule3d;
|
|
43
|
+
dispose(): void;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=physics-world-manager-3d.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"physics-world-manager-3d.d.ts","sourceRoot":"","sources":["../../src/lib/physics-world-manager-3d.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAElB,cAAc,EACd,iBAAiB,EACjB,mBAAmB,EACnB,aAAa,EACd,MAAM,mBAAmB,CAAC;AAI3B,qBAAa,qBAAqB;IAwB9B,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAxB1B,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAoB;IACrD,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAA2B;IAE9D,IAAW,KAAK,IAAI,aAAa,CAEhC;IAED,IAAW,QAAQ,IAAI,MAAM,CAE5B;IAED,IAAW,iBAAiB,IAAI,iBAAiB,CAEhD;IAED,IAAW,eAAe,IAAI,iBAAiB,CAE9C;gBAGkB,OAAO,EAAE,cAAc,EACvB,OAAO,EAAE,eAAe,EACzC,aAAa,EAAE,MAAM;IAcvB;;;;OAIG;IACI,IAAI,IAAI,IAAI;IAQZ,YAAY,IAAI,UAAU;IAI1B,eAAe,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI;IAsBvC,gBAAgB,CAAC,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAI9D,kBAAkB,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI;IAKhD,iBAAiB,IAAI,iBAAiB;IAKtC,eAAe,IAAI,iBAAiB;IAKpC,2BAA2B,IAAI,iBAAiB;IAKhD,2BAA2B,IAAI,iBAAiB;IAKhD,kBAAkB,CAAC,IAAI,EAAE,mBAAmB,GAAG,iBAAiB;IAKhE,kBAAkB,CACvB,MAAM,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,iBAAiB,EAC1B,MAAM,CAAC,EAAE,MAAM,EACf,YAAY,CAAC,EAAE,MAAM,GACpB,gBAAgB;IAOZ,oBAAoB,CACzB,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAClC,MAAM,CAAC,EAAE,iBAAiB,EAC1B,MAAM,CAAC,EAAE,MAAM,EACf,YAAY,CAAC,EAAE,MAAM,GACpB,gBAAgB;IAOZ,qBAAqB,CAC1B,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAClC,MAAM,CAAC,EAAE,iBAAiB,EAC1B,MAAM,CAAC,EAAE,MAAM,EACf,YAAY,CAAC,EAAE,MAAM,GACpB,gBAAgB;IAOZ,qBAAqB,CAC1B,QAAQ,EAAE,YAAY,EACtB,OAAO,EAAE,WAAW,EACpB,MAAM,CAAC,EAAE,iBAAiB,GACzB,gBAAgB;IAKZ,sBAAsB,CAAC,IAAI,EAAE,kBAAkB,EAAE,MAAM,CAAC,EAAE,iBAAiB,GAAG,gBAAgB;IAK9F,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,iBAAiB;IAI1C,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,gBAAgB;IAK7C,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAKhC,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,UAAO,GAAG,IAAI;IAM1D,IAAW,MAAM,IAAI,cAAc,CAElC;IAEM,OAAO,IAAI,IAAI;CAIvB"}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import { createLogger } from '@lagless/misc';
|
|
2
|
+
import { ColliderEntityMap } from '@lagless/physics-shared';
|
|
3
|
+
import { CollisionEvents3d } from './collision-events-3d.js';
|
|
4
|
+
const log = createLogger('PhysicsWorldManager3d');
|
|
5
|
+
export class PhysicsWorldManager3d {
|
|
6
|
+
get world() {
|
|
7
|
+
return this._world;
|
|
8
|
+
}
|
|
9
|
+
get substeps() {
|
|
10
|
+
return this._substeps;
|
|
11
|
+
}
|
|
12
|
+
get colliderEntityMap() {
|
|
13
|
+
return this._colliderEntityMap;
|
|
14
|
+
}
|
|
15
|
+
get collisionEvents() {
|
|
16
|
+
return this._collisionEvents;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Step the physics world for one ECS frame.
|
|
20
|
+
* Executes `substeps` Rapier steps, each with a fixed dt derived from frameLength / substeps.
|
|
21
|
+
* When collision events are enabled, drains the event queue after all substeps.
|
|
22
|
+
*/ step() {
|
|
23
|
+
const eq = this._collisionEvents.eventQueue;
|
|
24
|
+
for(let i = 0; i < this._substeps; i++){
|
|
25
|
+
this._world.step(eq);
|
|
26
|
+
}
|
|
27
|
+
this._collisionEvents.drain(this._colliderEntityMap, this._world);
|
|
28
|
+
}
|
|
29
|
+
takeSnapshot() {
|
|
30
|
+
return this._world.takeSnapshot();
|
|
31
|
+
}
|
|
32
|
+
restoreSnapshot(data) {
|
|
33
|
+
this._world.free();
|
|
34
|
+
const restored = this._rapier.World.restoreSnapshot(data);
|
|
35
|
+
if (!restored) {
|
|
36
|
+
log.warn('Failed to restore Rapier snapshot, recreating world');
|
|
37
|
+
this._world = new this._rapier.World({
|
|
38
|
+
x: this._config.gravityX,
|
|
39
|
+
y: this._config.gravityY,
|
|
40
|
+
z: this._config.gravityZ
|
|
41
|
+
});
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
this._world = restored;
|
|
45
|
+
// CRITICAL: QueryPipeline is NOT included in the Rapier snapshot format.
|
|
46
|
+
// After restoreSnapshot(), the world has a fresh empty QueryPipeline.
|
|
47
|
+
// computeColliderMovement() queries the QueryPipeline, so if we don't rebuild it
|
|
48
|
+
// here, KCC will detect no collisions on the first tick after rollback,
|
|
49
|
+
// causing non-deterministic movement and client divergence.
|
|
50
|
+
this._world.updateSceneQueries();
|
|
51
|
+
}
|
|
52
|
+
// Entity-collider mapping
|
|
53
|
+
registerCollider(colliderHandle, entity) {
|
|
54
|
+
this._colliderEntityMap.set(colliderHandle, entity);
|
|
55
|
+
}
|
|
56
|
+
unregisterCollider(colliderHandle) {
|
|
57
|
+
this._colliderEntityMap.delete(colliderHandle);
|
|
58
|
+
}
|
|
59
|
+
// Body factories
|
|
60
|
+
createDynamicBody() {
|
|
61
|
+
const desc = this._rapier.RigidBodyDesc.dynamic();
|
|
62
|
+
return this._world.createRigidBody(desc);
|
|
63
|
+
}
|
|
64
|
+
createFixedBody() {
|
|
65
|
+
const desc = this._rapier.RigidBodyDesc.fixed();
|
|
66
|
+
return this._world.createRigidBody(desc);
|
|
67
|
+
}
|
|
68
|
+
createKinematicPositionBody() {
|
|
69
|
+
const desc = this._rapier.RigidBodyDesc.kinematicPositionBased();
|
|
70
|
+
return this._world.createRigidBody(desc);
|
|
71
|
+
}
|
|
72
|
+
createKinematicVelocityBody() {
|
|
73
|
+
const desc = this._rapier.RigidBodyDesc.kinematicVelocityBased();
|
|
74
|
+
return this._world.createRigidBody(desc);
|
|
75
|
+
}
|
|
76
|
+
createBodyFromDesc(desc) {
|
|
77
|
+
return this._world.createRigidBody(desc);
|
|
78
|
+
}
|
|
79
|
+
// Collider factories (with optional collision groups and active events)
|
|
80
|
+
createBallCollider(radius, parent, groups, activeEvents) {
|
|
81
|
+
const desc = this._rapier.ColliderDesc.ball(radius);
|
|
82
|
+
if (groups !== undefined) desc.setCollisionGroups(groups);
|
|
83
|
+
if (activeEvents !== undefined) desc.setActiveEvents(activeEvents);
|
|
84
|
+
return this._world.createCollider(desc, parent);
|
|
85
|
+
}
|
|
86
|
+
createCuboidCollider(hx, hy, hz, parent, groups, activeEvents) {
|
|
87
|
+
const desc = this._rapier.ColliderDesc.cuboid(hx, hy, hz);
|
|
88
|
+
if (groups !== undefined) desc.setCollisionGroups(groups);
|
|
89
|
+
if (activeEvents !== undefined) desc.setActiveEvents(activeEvents);
|
|
90
|
+
return this._world.createCollider(desc, parent);
|
|
91
|
+
}
|
|
92
|
+
createCapsuleCollider(halfHeight, radius, parent, groups, activeEvents) {
|
|
93
|
+
const desc = this._rapier.ColliderDesc.capsule(halfHeight, radius);
|
|
94
|
+
if (groups !== undefined) desc.setCollisionGroups(groups);
|
|
95
|
+
if (activeEvents !== undefined) desc.setActiveEvents(activeEvents);
|
|
96
|
+
return this._world.createCollider(desc, parent);
|
|
97
|
+
}
|
|
98
|
+
createTrimeshCollider(vertices, indices, parent) {
|
|
99
|
+
const desc = this._rapier.ColliderDesc.trimesh(vertices, indices);
|
|
100
|
+
return this._world.createCollider(desc, parent);
|
|
101
|
+
}
|
|
102
|
+
createColliderFromDesc(desc, parent) {
|
|
103
|
+
return this._world.createCollider(desc, parent);
|
|
104
|
+
}
|
|
105
|
+
// Accessors
|
|
106
|
+
getBody(handle) {
|
|
107
|
+
return this._world.getRigidBody(handle);
|
|
108
|
+
}
|
|
109
|
+
getCollider(handle) {
|
|
110
|
+
return this._world.getCollider(handle);
|
|
111
|
+
}
|
|
112
|
+
// Removal
|
|
113
|
+
removeBody(handle) {
|
|
114
|
+
const body = this._world.getRigidBody(handle);
|
|
115
|
+
this._world.removeRigidBody(body);
|
|
116
|
+
}
|
|
117
|
+
removeCollider(handle, wakeUp = true) {
|
|
118
|
+
const collider = this._world.getCollider(handle);
|
|
119
|
+
this._world.removeCollider(collider, wakeUp);
|
|
120
|
+
}
|
|
121
|
+
// Rapier module access (for creating descs in game code)
|
|
122
|
+
get rapier() {
|
|
123
|
+
return this._rapier;
|
|
124
|
+
}
|
|
125
|
+
dispose() {
|
|
126
|
+
this._collisionEvents.dispose();
|
|
127
|
+
this._world.free();
|
|
128
|
+
}
|
|
129
|
+
constructor(_rapier, _config, frameLengthMs){
|
|
130
|
+
this._rapier = _rapier;
|
|
131
|
+
this._config = _config;
|
|
132
|
+
this._colliderEntityMap = new ColliderEntityMap();
|
|
133
|
+
this._world = new _rapier.World({
|
|
134
|
+
x: _config.gravityX,
|
|
135
|
+
y: _config.gravityY,
|
|
136
|
+
z: _config.gravityZ
|
|
137
|
+
});
|
|
138
|
+
this._substeps = _config.substeps;
|
|
139
|
+
this._substepDt = frameLengthMs / 1000 / this._substeps;
|
|
140
|
+
this._world.timestep = this._substepDt;
|
|
141
|
+
this._collisionEvents = new CollisionEvents3d(_rapier);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
//# sourceMappingURL=physics-world-manager-3d.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/lib/physics-world-manager-3d.ts"],"sourcesContent":["import { createLogger } from '@lagless/misc';\nimport { ColliderEntityMap } from '@lagless/physics-shared';\nimport { CollisionEvents3d } from './collision-events-3d.js';\nimport { PhysicsConfig3d } from './physics-config-3d.js';\nimport {\n RapierCollider3d,\n RapierColliderDesc,\n RapierEventQueue,\n RapierModule3d,\n RapierRigidBody3d,\n RapierRigidBodyDesc,\n RapierWorld3d,\n} from './rapier-types.js';\n\nconst log = createLogger('PhysicsWorldManager3d');\n\nexport class PhysicsWorldManager3d {\n private _world: RapierWorld3d;\n private readonly _substeps: number;\n private readonly _substepDt: number;\n private readonly _collisionEvents: CollisionEvents3d;\n private readonly _colliderEntityMap = new ColliderEntityMap();\n\n public get world(): RapierWorld3d {\n return this._world;\n }\n\n public get substeps(): number {\n return this._substeps;\n }\n\n public get colliderEntityMap(): ColliderEntityMap {\n return this._colliderEntityMap;\n }\n\n public get collisionEvents(): CollisionEvents3d {\n return this._collisionEvents;\n }\n\n constructor(\n private readonly _rapier: RapierModule3d,\n private readonly _config: PhysicsConfig3d,\n frameLengthMs: number,\n ) {\n this._world = new _rapier.World({\n x: _config.gravityX,\n y: _config.gravityY,\n z: _config.gravityZ,\n });\n\n this._substeps = _config.substeps;\n this._substepDt = (frameLengthMs / 1000) / this._substeps;\n this._world.timestep = this._substepDt;\n this._collisionEvents = new CollisionEvents3d(_rapier);\n }\n\n /**\n * Step the physics world for one ECS frame.\n * Executes `substeps` Rapier steps, each with a fixed dt derived from frameLength / substeps.\n * When collision events are enabled, drains the event queue after all substeps.\n */\n public step(): void {\n const eq = this._collisionEvents.eventQueue as RapierEventQueue;\n for (let i = 0; i < this._substeps; i++) {\n this._world.step(eq);\n }\n this._collisionEvents.drain(this._colliderEntityMap, this._world);\n }\n\n public takeSnapshot(): Uint8Array {\n return this._world.takeSnapshot();\n }\n\n public restoreSnapshot(data: Uint8Array): void {\n this._world.free();\n const restored = this._rapier.World.restoreSnapshot(data);\n if (!restored) {\n log.warn('Failed to restore Rapier snapshot, recreating world');\n this._world = new this._rapier.World({\n x: this._config.gravityX,\n y: this._config.gravityY,\n z: this._config.gravityZ,\n });\n return;\n }\n this._world = restored;\n // CRITICAL: QueryPipeline is NOT included in the Rapier snapshot format.\n // After restoreSnapshot(), the world has a fresh empty QueryPipeline.\n // computeColliderMovement() queries the QueryPipeline, so if we don't rebuild it\n // here, KCC will detect no collisions on the first tick after rollback,\n // causing non-deterministic movement and client divergence.\n this._world.updateSceneQueries();\n }\n\n // Entity-collider mapping\n public registerCollider(colliderHandle: number, entity: number): void {\n this._colliderEntityMap.set(colliderHandle, entity);\n }\n\n public unregisterCollider(colliderHandle: number): void {\n this._colliderEntityMap.delete(colliderHandle);\n }\n\n // Body factories\n public createDynamicBody(): RapierRigidBody3d {\n const desc = this._rapier.RigidBodyDesc.dynamic();\n return this._world.createRigidBody(desc);\n }\n\n public createFixedBody(): RapierRigidBody3d {\n const desc = this._rapier.RigidBodyDesc.fixed();\n return this._world.createRigidBody(desc);\n }\n\n public createKinematicPositionBody(): RapierRigidBody3d {\n const desc = this._rapier.RigidBodyDesc.kinematicPositionBased();\n return this._world.createRigidBody(desc);\n }\n\n public createKinematicVelocityBody(): RapierRigidBody3d {\n const desc = this._rapier.RigidBodyDesc.kinematicVelocityBased();\n return this._world.createRigidBody(desc);\n }\n\n public createBodyFromDesc(desc: RapierRigidBodyDesc): RapierRigidBody3d {\n return this._world.createRigidBody(desc);\n }\n\n // Collider factories (with optional collision groups and active events)\n public createBallCollider(\n radius: number,\n parent?: RapierRigidBody3d,\n groups?: number,\n activeEvents?: number,\n ): RapierCollider3d {\n const desc = this._rapier.ColliderDesc.ball(radius);\n if (groups !== undefined) desc.setCollisionGroups(groups);\n if (activeEvents !== undefined) desc.setActiveEvents(activeEvents);\n return this._world.createCollider(desc, parent);\n }\n\n public createCuboidCollider(\n hx: number, hy: number, hz: number,\n parent?: RapierRigidBody3d,\n groups?: number,\n activeEvents?: number,\n ): RapierCollider3d {\n const desc = this._rapier.ColliderDesc.cuboid(hx, hy, hz);\n if (groups !== undefined) desc.setCollisionGroups(groups);\n if (activeEvents !== undefined) desc.setActiveEvents(activeEvents);\n return this._world.createCollider(desc, parent);\n }\n\n public createCapsuleCollider(\n halfHeight: number, radius: number,\n parent?: RapierRigidBody3d,\n groups?: number,\n activeEvents?: number,\n ): RapierCollider3d {\n const desc = this._rapier.ColliderDesc.capsule(halfHeight, radius);\n if (groups !== undefined) desc.setCollisionGroups(groups);\n if (activeEvents !== undefined) desc.setActiveEvents(activeEvents);\n return this._world.createCollider(desc, parent);\n }\n\n public createTrimeshCollider(\n vertices: Float32Array,\n indices: Uint32Array,\n parent?: RapierRigidBody3d,\n ): RapierCollider3d {\n const desc = this._rapier.ColliderDesc.trimesh(vertices, indices);\n return this._world.createCollider(desc, parent);\n }\n\n public createColliderFromDesc(desc: RapierColliderDesc, parent?: RapierRigidBody3d): RapierCollider3d {\n return this._world.createCollider(desc, parent);\n }\n\n // Accessors\n public getBody(handle: number): RapierRigidBody3d {\n return this._world.getRigidBody(handle);\n }\n\n public getCollider(handle: number): RapierCollider3d {\n return this._world.getCollider(handle);\n }\n\n // Removal\n public removeBody(handle: number): void {\n const body = this._world.getRigidBody(handle);\n this._world.removeRigidBody(body);\n }\n\n public removeCollider(handle: number, wakeUp = true): void {\n const collider = this._world.getCollider(handle);\n this._world.removeCollider(collider, wakeUp);\n }\n\n // Rapier module access (for creating descs in game code)\n public get rapier(): RapierModule3d {\n return this._rapier;\n }\n\n public dispose(): void {\n this._collisionEvents.dispose();\n this._world.free();\n }\n}\n"],"names":["createLogger","ColliderEntityMap","CollisionEvents3d","log","PhysicsWorldManager3d","world","_world","substeps","_substeps","colliderEntityMap","_colliderEntityMap","collisionEvents","_collisionEvents","step","eq","eventQueue","i","drain","takeSnapshot","restoreSnapshot","data","free","restored","_rapier","World","warn","x","_config","gravityX","y","gravityY","z","gravityZ","updateSceneQueries","registerCollider","colliderHandle","entity","set","unregisterCollider","delete","createDynamicBody","desc","RigidBodyDesc","dynamic","createRigidBody","createFixedBody","fixed","createKinematicPositionBody","kinematicPositionBased","createKinematicVelocityBody","kinematicVelocityBased","createBodyFromDesc","createBallCollider","radius","parent","groups","activeEvents","ColliderDesc","ball","undefined","setCollisionGroups","setActiveEvents","createCollider","createCuboidCollider","hx","hy","hz","cuboid","createCapsuleCollider","halfHeight","capsule","createTrimeshCollider","vertices","indices","trimesh","createColliderFromDesc","getBody","handle","getRigidBody","getCollider","removeBody","body","removeRigidBody","removeCollider","wakeUp","collider","rapier","dispose","constructor","frameLengthMs","_substepDt","timestep"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal type abstractions for Rapier 3D API.
|
|
3
|
+
* Works with both @dimforge/rapier3d and @dimforge/rapier3d-compat.
|
|
4
|
+
* The consumer project injects the actual RAPIER module at runtime.
|
|
5
|
+
*/
|
|
6
|
+
export interface RapierVector3 {
|
|
7
|
+
x: number;
|
|
8
|
+
y: number;
|
|
9
|
+
z: number;
|
|
10
|
+
}
|
|
11
|
+
export interface RapierQuaternion {
|
|
12
|
+
x: number;
|
|
13
|
+
y: number;
|
|
14
|
+
z: number;
|
|
15
|
+
w: number;
|
|
16
|
+
}
|
|
17
|
+
export interface RapierRigidBody3d {
|
|
18
|
+
handle: number;
|
|
19
|
+
translation(): RapierVector3;
|
|
20
|
+
rotation(): RapierQuaternion;
|
|
21
|
+
linvel(): RapierVector3;
|
|
22
|
+
angvel(): RapierVector3;
|
|
23
|
+
setTranslation(translation: RapierVector3, wakeUp: boolean): void;
|
|
24
|
+
setRotation(rotation: RapierQuaternion, wakeUp: boolean): void;
|
|
25
|
+
setLinvel(linvel: RapierVector3, wakeUp: boolean): void;
|
|
26
|
+
setAngvel(angvel: RapierVector3, wakeUp: boolean): void;
|
|
27
|
+
setLinearDamping(damping: number): void;
|
|
28
|
+
setAngularDamping(damping: number): void;
|
|
29
|
+
setAdditionalMass(mass: number): void;
|
|
30
|
+
isKinematic(): boolean;
|
|
31
|
+
isDynamic(): boolean;
|
|
32
|
+
isFixed(): boolean;
|
|
33
|
+
setNextKinematicTranslation(translation: RapierVector3): void;
|
|
34
|
+
setNextKinematicRotation(rotation: RapierQuaternion): void;
|
|
35
|
+
}
|
|
36
|
+
export interface RapierCollider3d {
|
|
37
|
+
handle: number;
|
|
38
|
+
parent(): RapierRigidBody3d | null;
|
|
39
|
+
isSensor(): boolean;
|
|
40
|
+
collisionGroups(): number;
|
|
41
|
+
setCollisionGroups(groups: number): void;
|
|
42
|
+
setActiveEvents(events: number): void;
|
|
43
|
+
setSensor(isSensor: boolean): void;
|
|
44
|
+
}
|
|
45
|
+
export interface RapierRigidBodyDesc {
|
|
46
|
+
setTranslation(x: number, y: number, z: number): RapierRigidBodyDesc;
|
|
47
|
+
setRotation(rotation: RapierQuaternion): RapierRigidBodyDesc;
|
|
48
|
+
setLinearDamping(damping: number): RapierRigidBodyDesc;
|
|
49
|
+
setAngularDamping(damping: number): RapierRigidBodyDesc;
|
|
50
|
+
setAdditionalMass(mass: number): RapierRigidBodyDesc;
|
|
51
|
+
}
|
|
52
|
+
export interface RapierColliderDesc {
|
|
53
|
+
setTranslation(x: number, y: number, z: number): RapierColliderDesc;
|
|
54
|
+
setRotation(rotation: RapierQuaternion): RapierColliderDesc;
|
|
55
|
+
setRestitution(restitution: number): RapierColliderDesc;
|
|
56
|
+
setFriction(friction: number): RapierColliderDesc;
|
|
57
|
+
setDensity(density: number): RapierColliderDesc;
|
|
58
|
+
setMass(mass: number): RapierColliderDesc;
|
|
59
|
+
setSensor(isSensor: boolean): RapierColliderDesc;
|
|
60
|
+
setCollisionGroups(groups: number): RapierColliderDesc;
|
|
61
|
+
setActiveEvents(events: number): RapierColliderDesc;
|
|
62
|
+
}
|
|
63
|
+
export interface RapierEventQueue {
|
|
64
|
+
free(): void;
|
|
65
|
+
drainCollisionEvents(f: (h1: number, h2: number, started: boolean) => void): void;
|
|
66
|
+
drainContactForceEvents(f: (event: RapierTempContactForceEvent) => void): void;
|
|
67
|
+
clear(): void;
|
|
68
|
+
}
|
|
69
|
+
export interface RapierTempContactForceEvent {
|
|
70
|
+
collider1(): number;
|
|
71
|
+
collider2(): number;
|
|
72
|
+
totalForceMagnitude(): number;
|
|
73
|
+
maxForceMagnitude(): number;
|
|
74
|
+
maxForceDirection(): RapierVector3;
|
|
75
|
+
}
|
|
76
|
+
export interface RapierWorld3d {
|
|
77
|
+
timestep: number;
|
|
78
|
+
step(eventQueue?: RapierEventQueue): void;
|
|
79
|
+
free(): void;
|
|
80
|
+
takeSnapshot(): Uint8Array;
|
|
81
|
+
getRigidBody(handle: number): RapierRigidBody3d;
|
|
82
|
+
getCollider(handle: number): RapierCollider3d;
|
|
83
|
+
createRigidBody(desc: RapierRigidBodyDesc): RapierRigidBody3d;
|
|
84
|
+
createCollider(desc: RapierColliderDesc, parent?: RapierRigidBody3d): RapierCollider3d;
|
|
85
|
+
removeRigidBody(body: RapierRigidBody3d): void;
|
|
86
|
+
removeCollider(collider: RapierCollider3d, wakeUp: boolean): void;
|
|
87
|
+
createCharacterController(offset: number): RapierKinematicCharacterController;
|
|
88
|
+
/** Rebuilds the query pipeline (BVH) from current collider positions. Must be called after restoreSnapshot(). */
|
|
89
|
+
updateSceneQueries(): void;
|
|
90
|
+
}
|
|
91
|
+
export interface RapierCharacterCollision {
|
|
92
|
+
toi: number;
|
|
93
|
+
witness1: RapierVector3;
|
|
94
|
+
witness2: RapierVector3;
|
|
95
|
+
normal1: RapierVector3;
|
|
96
|
+
normal2: RapierVector3;
|
|
97
|
+
translationDeltaApplied: RapierVector3;
|
|
98
|
+
translationDeltaRemaining: RapierVector3;
|
|
99
|
+
}
|
|
100
|
+
export interface RapierKinematicCharacterController {
|
|
101
|
+
setUp(up: RapierVector3): void;
|
|
102
|
+
setMaxSlopeClimbAngle(angle: number): void;
|
|
103
|
+
setMinSlopeSlideAngle(angle: number): void;
|
|
104
|
+
enableAutostep(maxHeight: number, minWidth: number, includeDynamicBodies: boolean): void;
|
|
105
|
+
disableAutostep(): void;
|
|
106
|
+
enableSnapToGround(distance: number): void;
|
|
107
|
+
disableSnapToGround(): void;
|
|
108
|
+
setSlideEnabled(enabled: boolean): void;
|
|
109
|
+
setCharacterMass(mass: number): void;
|
|
110
|
+
setApplyImpulsesToDynamicBodies(apply: boolean): void;
|
|
111
|
+
computeColliderMovement(collider: RapierCollider3d, desiredTranslation: RapierVector3, filterFlags?: number, filterGroups?: number): void;
|
|
112
|
+
computedMovement(): RapierVector3;
|
|
113
|
+
computedGrounded(): boolean;
|
|
114
|
+
numComputedCollisions(): number;
|
|
115
|
+
computedCollision(index: number): RapierCharacterCollision | null;
|
|
116
|
+
free(): void;
|
|
117
|
+
}
|
|
118
|
+
export interface RapierModule3d {
|
|
119
|
+
World: {
|
|
120
|
+
new (gravity: RapierVector3): RapierWorld3d;
|
|
121
|
+
restoreSnapshot(data: Uint8Array): RapierWorld3d | null;
|
|
122
|
+
};
|
|
123
|
+
RigidBodyDesc: {
|
|
124
|
+
dynamic(): RapierRigidBodyDesc;
|
|
125
|
+
fixed(): RapierRigidBodyDesc;
|
|
126
|
+
kinematicPositionBased(): RapierRigidBodyDesc;
|
|
127
|
+
kinematicVelocityBased(): RapierRigidBodyDesc;
|
|
128
|
+
};
|
|
129
|
+
ColliderDesc: {
|
|
130
|
+
ball(radius: number): RapierColliderDesc;
|
|
131
|
+
cuboid(hx: number, hy: number, hz: number): RapierColliderDesc;
|
|
132
|
+
capsule(halfHeight: number, radius: number): RapierColliderDesc;
|
|
133
|
+
trimesh(vertices: Float32Array, indices: Uint32Array): RapierColliderDesc;
|
|
134
|
+
cylinder(halfHeight: number, radius: number): RapierColliderDesc;
|
|
135
|
+
cone(halfHeight: number, radius: number): RapierColliderDesc;
|
|
136
|
+
};
|
|
137
|
+
EventQueue: {
|
|
138
|
+
new (autoDrain: boolean): RapierEventQueue;
|
|
139
|
+
};
|
|
140
|
+
ActiveEvents: {
|
|
141
|
+
NONE: number;
|
|
142
|
+
COLLISION_EVENTS: number;
|
|
143
|
+
CONTACT_FORCE_EVENTS: number;
|
|
144
|
+
};
|
|
145
|
+
QueryFilterFlags: {
|
|
146
|
+
ONLY_DYNAMIC: number;
|
|
147
|
+
ONLY_KINEMATIC: number;
|
|
148
|
+
ONLY_FIXED: number;
|
|
149
|
+
EXCLUDE_DYNAMIC: number;
|
|
150
|
+
EXCLUDE_KINEMATIC: number;
|
|
151
|
+
EXCLUDE_FIXED: number;
|
|
152
|
+
EXCLUDE_SENSORS: number;
|
|
153
|
+
EXCLUDE_SOLIDS: number;
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=rapier-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rapier-types.d.ts","sourceRoot":"","sources":["../../src/lib/rapier-types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,aAAa;IAC5B,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAED,MAAM,WAAW,gBAAgB;IAC/B,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,IAAI,aAAa,CAAC;IAC7B,QAAQ,IAAI,gBAAgB,CAAC;IAC7B,MAAM,IAAI,aAAa,CAAC;IACxB,MAAM,IAAI,aAAa,CAAC;IACxB,cAAc,CAAC,WAAW,EAAE,aAAa,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI,CAAC;IAClE,WAAW,CAAC,QAAQ,EAAE,gBAAgB,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI,CAAC;IAC/D,SAAS,CAAC,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI,CAAC;IACxD,SAAS,CAAC,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI,CAAC;IACxD,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACzC,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,WAAW,IAAI,OAAO,CAAC;IACvB,SAAS,IAAI,OAAO,CAAC;IACrB,OAAO,IAAI,OAAO,CAAC;IACnB,2BAA2B,CAAC,WAAW,EAAE,aAAa,GAAG,IAAI,CAAC;IAC9D,wBAAwB,CAAC,QAAQ,EAAE,gBAAgB,GAAG,IAAI,CAAC;CAC5D;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,IAAI,iBAAiB,GAAG,IAAI,CAAC;IACnC,QAAQ,IAAI,OAAO,CAAC;IACpB,eAAe,IAAI,MAAM,CAAC;IAC1B,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACzC,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,SAAS,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAAC;CACpC;AAED,MAAM,WAAW,mBAAmB;IAClC,cAAc,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,mBAAmB,CAAC;IACrE,WAAW,CAAC,QAAQ,EAAE,gBAAgB,GAAG,mBAAmB,CAAC;IAC7D,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,mBAAmB,CAAC;IACvD,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,mBAAmB,CAAC;IACxD,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,mBAAmB,CAAC;CACtD;AAED,MAAM,WAAW,kBAAkB;IACjC,cAAc,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,kBAAkB,CAAC;IACpE,WAAW,CAAC,QAAQ,EAAE,gBAAgB,GAAG,kBAAkB,CAAC;IAC5D,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,kBAAkB,CAAC;IACxD,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,kBAAkB,CAAC;IAClD,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,kBAAkB,CAAC;IAChD,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,kBAAkB,CAAC;IAC1C,SAAS,CAAC,QAAQ,EAAE,OAAO,GAAG,kBAAkB,CAAC;IACjD,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,kBAAkB,CAAC;IACvD,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,kBAAkB,CAAC;CACrD;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,IAAI,IAAI,CAAC;IACb,oBAAoB,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,GAAG,IAAI,CAAC;IAClF,uBAAuB,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE,2BAA2B,KAAK,IAAI,GAAG,IAAI,CAAC;IAC/E,KAAK,IAAI,IAAI,CAAC;CACf;AAED,MAAM,WAAW,2BAA2B;IAC1C,SAAS,IAAI,MAAM,CAAC;IACpB,SAAS,IAAI,MAAM,CAAC;IACpB,mBAAmB,IAAI,MAAM,CAAC;IAC9B,iBAAiB,IAAI,MAAM,CAAC;IAC5B,iBAAiB,IAAI,aAAa,CAAC;CACpC;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,UAAU,CAAC,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAC1C,IAAI,IAAI,IAAI,CAAC;IACb,YAAY,IAAI,UAAU,CAAC;IAC3B,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,iBAAiB,CAAC;IAChD,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,gBAAgB,CAAC;IAC9C,eAAe,CAAC,IAAI,EAAE,mBAAmB,GAAG,iBAAiB,CAAC;IAC9D,cAAc,CAAC,IAAI,EAAE,kBAAkB,EAAE,MAAM,CAAC,EAAE,iBAAiB,GAAG,gBAAgB,CAAC;IACvF,eAAe,CAAC,IAAI,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAC/C,cAAc,CAAC,QAAQ,EAAE,gBAAgB,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI,CAAC;IAClE,yBAAyB,CAAC,MAAM,EAAE,MAAM,GAAG,kCAAkC,CAAC;IAC9E,iHAAiH;IACjH,kBAAkB,IAAI,IAAI,CAAC;CAC5B;AAID,MAAM,WAAW,wBAAwB;IACvC,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,aAAa,CAAC;IACxB,QAAQ,EAAE,aAAa,CAAC;IACxB,OAAO,EAAE,aAAa,CAAC;IACvB,OAAO,EAAE,aAAa,CAAC;IACvB,uBAAuB,EAAE,aAAa,CAAC;IACvC,yBAAyB,EAAE,aAAa,CAAC;CAC1C;AAED,MAAM,WAAW,kCAAkC;IACjD,KAAK,CAAC,EAAE,EAAE,aAAa,GAAG,IAAI,CAAC;IAC/B,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3C,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3C,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,oBAAoB,EAAE,OAAO,GAAG,IAAI,CAAC;IACzF,eAAe,IAAI,IAAI,CAAC;IACxB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3C,mBAAmB,IAAI,IAAI,CAAC;IAC5B,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IACxC,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,+BAA+B,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;IACtD,uBAAuB,CACrB,QAAQ,EAAE,gBAAgB,EAC1B,kBAAkB,EAAE,aAAa,EACjC,WAAW,CAAC,EAAE,MAAM,EACpB,YAAY,CAAC,EAAE,MAAM,GACpB,IAAI,CAAC;IACR,gBAAgB,IAAI,aAAa,CAAC;IAClC,gBAAgB,IAAI,OAAO,CAAC;IAC5B,qBAAqB,IAAI,MAAM,CAAC;IAChC,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,wBAAwB,GAAG,IAAI,CAAC;IAClE,IAAI,IAAI,IAAI,CAAC;CACd;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE;QACL,KAAK,OAAO,EAAE,aAAa,GAAG,aAAa,CAAC;QAC5C,eAAe,CAAC,IAAI,EAAE,UAAU,GAAG,aAAa,GAAG,IAAI,CAAC;KACzD,CAAC;IACF,aAAa,EAAE;QACb,OAAO,IAAI,mBAAmB,CAAC;QAC/B,KAAK,IAAI,mBAAmB,CAAC;QAC7B,sBAAsB,IAAI,mBAAmB,CAAC;QAC9C,sBAAsB,IAAI,mBAAmB,CAAC;KAC/C,CAAC;IACF,YAAY,EAAE;QACZ,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,kBAAkB,CAAC;QACzC,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,kBAAkB,CAAC;QAC/D,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,kBAAkB,CAAC;QAChE,OAAO,CAAC,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE,WAAW,GAAG,kBAAkB,CAAC;QAC1E,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,kBAAkB,CAAC;QACjE,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,kBAAkB,CAAC;KAC9D,CAAC;IACF,UAAU,EAAE;QACV,KAAK,SAAS,EAAE,OAAO,GAAG,gBAAgB,CAAC;KAC5C,CAAC;IACF,YAAY,EAAE;QACZ,IAAI,EAAE,MAAM,CAAC;QACb,gBAAgB,EAAE,MAAM,CAAC;QACzB,oBAAoB,EAAE,MAAM,CAAC;KAC9B,CAAC;IACF,gBAAgB,EAAE;QAChB,YAAY,EAAE,MAAM,CAAC;QACrB,cAAc,EAAE,MAAM,CAAC;QACvB,UAAU,EAAE,MAAM,CAAC;QACnB,eAAe,EAAE,MAAM,CAAC;QACxB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,aAAa,EAAE,MAAM,CAAC;QACtB,eAAe,EAAE,MAAM,CAAC;QACxB,cAAc,EAAE,MAAM,CAAC;KACxB,CAAC;CACH"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/lib/rapier-types.ts"],"sourcesContent":["/**\n * Minimal type abstractions for Rapier 3D API.\n * Works with both @dimforge/rapier3d and @dimforge/rapier3d-compat.\n * The consumer project injects the actual RAPIER module at runtime.\n */\n\nexport interface RapierVector3 {\n x: number;\n y: number;\n z: number;\n}\n\nexport interface RapierQuaternion {\n x: number;\n y: number;\n z: number;\n w: number;\n}\n\nexport interface RapierRigidBody3d {\n handle: number;\n translation(): RapierVector3;\n rotation(): RapierQuaternion;\n linvel(): RapierVector3;\n angvel(): RapierVector3;\n setTranslation(translation: RapierVector3, wakeUp: boolean): void;\n setRotation(rotation: RapierQuaternion, wakeUp: boolean): void;\n setLinvel(linvel: RapierVector3, wakeUp: boolean): void;\n setAngvel(angvel: RapierVector3, wakeUp: boolean): void;\n setLinearDamping(damping: number): void;\n setAngularDamping(damping: number): void;\n setAdditionalMass(mass: number): void;\n isKinematic(): boolean;\n isDynamic(): boolean;\n isFixed(): boolean;\n setNextKinematicTranslation(translation: RapierVector3): void;\n setNextKinematicRotation(rotation: RapierQuaternion): void;\n}\n\nexport interface RapierCollider3d {\n handle: number;\n parent(): RapierRigidBody3d | null;\n isSensor(): boolean;\n collisionGroups(): number;\n setCollisionGroups(groups: number): void;\n setActiveEvents(events: number): void;\n setSensor(isSensor: boolean): void;\n}\n\nexport interface RapierRigidBodyDesc {\n setTranslation(x: number, y: number, z: number): RapierRigidBodyDesc;\n setRotation(rotation: RapierQuaternion): RapierRigidBodyDesc;\n setLinearDamping(damping: number): RapierRigidBodyDesc;\n setAngularDamping(damping: number): RapierRigidBodyDesc;\n setAdditionalMass(mass: number): RapierRigidBodyDesc;\n}\n\nexport interface RapierColliderDesc {\n setTranslation(x: number, y: number, z: number): RapierColliderDesc;\n setRotation(rotation: RapierQuaternion): RapierColliderDesc;\n setRestitution(restitution: number): RapierColliderDesc;\n setFriction(friction: number): RapierColliderDesc;\n setDensity(density: number): RapierColliderDesc;\n setMass(mass: number): RapierColliderDesc;\n setSensor(isSensor: boolean): RapierColliderDesc;\n setCollisionGroups(groups: number): RapierColliderDesc;\n setActiveEvents(events: number): RapierColliderDesc;\n}\n\nexport interface RapierEventQueue {\n free(): void;\n drainCollisionEvents(f: (h1: number, h2: number, started: boolean) => void): void;\n drainContactForceEvents(f: (event: RapierTempContactForceEvent) => void): void;\n clear(): void;\n}\n\nexport interface RapierTempContactForceEvent {\n collider1(): number;\n collider2(): number;\n totalForceMagnitude(): number;\n maxForceMagnitude(): number;\n maxForceDirection(): RapierVector3;\n}\n\nexport interface RapierWorld3d {\n timestep: number;\n step(eventQueue?: RapierEventQueue): void;\n free(): void;\n takeSnapshot(): Uint8Array;\n getRigidBody(handle: number): RapierRigidBody3d;\n getCollider(handle: number): RapierCollider3d;\n createRigidBody(desc: RapierRigidBodyDesc): RapierRigidBody3d;\n createCollider(desc: RapierColliderDesc, parent?: RapierRigidBody3d): RapierCollider3d;\n removeRigidBody(body: RapierRigidBody3d): void;\n removeCollider(collider: RapierCollider3d, wakeUp: boolean): void;\n createCharacterController(offset: number): RapierKinematicCharacterController;\n /** Rebuilds the query pipeline (BVH) from current collider positions. Must be called after restoreSnapshot(). */\n updateSceneQueries(): void;\n}\n\n// ─── Kinematic Character Controller ────────────────────────\n\nexport interface RapierCharacterCollision {\n toi: number;\n witness1: RapierVector3;\n witness2: RapierVector3;\n normal1: RapierVector3;\n normal2: RapierVector3;\n translationDeltaApplied: RapierVector3;\n translationDeltaRemaining: RapierVector3;\n}\n\nexport interface RapierKinematicCharacterController {\n setUp(up: RapierVector3): void;\n setMaxSlopeClimbAngle(angle: number): void;\n setMinSlopeSlideAngle(angle: number): void;\n enableAutostep(maxHeight: number, minWidth: number, includeDynamicBodies: boolean): void;\n disableAutostep(): void;\n enableSnapToGround(distance: number): void;\n disableSnapToGround(): void;\n setSlideEnabled(enabled: boolean): void;\n setCharacterMass(mass: number): void;\n setApplyImpulsesToDynamicBodies(apply: boolean): void;\n computeColliderMovement(\n collider: RapierCollider3d,\n desiredTranslation: RapierVector3,\n filterFlags?: number,\n filterGroups?: number,\n ): void;\n computedMovement(): RapierVector3;\n computedGrounded(): boolean;\n numComputedCollisions(): number;\n computedCollision(index: number): RapierCharacterCollision | null;\n free(): void;\n}\n\nexport interface RapierModule3d {\n World: {\n new (gravity: RapierVector3): RapierWorld3d;\n restoreSnapshot(data: Uint8Array): RapierWorld3d | null;\n };\n RigidBodyDesc: {\n dynamic(): RapierRigidBodyDesc;\n fixed(): RapierRigidBodyDesc;\n kinematicPositionBased(): RapierRigidBodyDesc;\n kinematicVelocityBased(): RapierRigidBodyDesc;\n };\n ColliderDesc: {\n ball(radius: number): RapierColliderDesc;\n cuboid(hx: number, hy: number, hz: number): RapierColliderDesc;\n capsule(halfHeight: number, radius: number): RapierColliderDesc;\n trimesh(vertices: Float32Array, indices: Uint32Array): RapierColliderDesc;\n cylinder(halfHeight: number, radius: number): RapierColliderDesc;\n cone(halfHeight: number, radius: number): RapierColliderDesc;\n };\n EventQueue: {\n new (autoDrain: boolean): RapierEventQueue;\n };\n ActiveEvents: {\n NONE: number;\n COLLISION_EVENTS: number;\n CONTACT_FORCE_EVENTS: number;\n };\n QueryFilterFlags: {\n ONLY_DYNAMIC: number;\n ONLY_KINEMATIC: number;\n ONLY_FIXED: number;\n EXCLUDE_DYNAMIC: number;\n EXCLUDE_KINEMATIC: number;\n EXCLUDE_FIXED: number;\n EXCLUDE_SENSORS: number;\n EXCLUDE_SOLIDS: number;\n };\n}\n"],"names":[],"rangeMappings":";;;;","mappings":"AAAA;;;;CAIC,GAoID,WAqCC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":"5.9.3"}
|
package/package.json
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@lagless/physics3d",
|
|
3
|
+
"version": "0.0.38",
|
|
4
|
+
"license": "MIT",
|
|
5
|
+
"repository": {
|
|
6
|
+
"type": "git",
|
|
7
|
+
"url": "https://github.com/GbGr/lagless",
|
|
8
|
+
"directory": "libs/physics3d"
|
|
9
|
+
},
|
|
10
|
+
"type": "module",
|
|
11
|
+
"main": "./dist/index.js",
|
|
12
|
+
"module": "./dist/index.js",
|
|
13
|
+
"types": "./dist/index.d.ts",
|
|
14
|
+
"exports": {
|
|
15
|
+
"./package.json": "./package.json",
|
|
16
|
+
".": {
|
|
17
|
+
"@lagless/source": "./src/index.ts",
|
|
18
|
+
"types": "./dist/index.d.ts",
|
|
19
|
+
"import": "./dist/index.js",
|
|
20
|
+
"default": "./dist/index.js"
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
"nx": {
|
|
24
|
+
"sourceRoot": "libs/physics3d/src",
|
|
25
|
+
"targets": {
|
|
26
|
+
"build": {
|
|
27
|
+
"executor": "@nx/js:swc",
|
|
28
|
+
"outputs": [
|
|
29
|
+
"{options.outputPath}"
|
|
30
|
+
],
|
|
31
|
+
"options": {
|
|
32
|
+
"outputPath": "libs/physics3d/dist",
|
|
33
|
+
"main": "libs/physics3d/src/index.ts",
|
|
34
|
+
"tsConfig": "libs/physics3d/tsconfig.lib.json",
|
|
35
|
+
"stripLeadingPaths": true
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
"dependencies": {
|
|
41
|
+
"@swc/helpers": "~0.5.11",
|
|
42
|
+
"@lagless/core": "0.0.38",
|
|
43
|
+
"@lagless/physics-shared": "0.0.38",
|
|
44
|
+
"@lagless/misc": "0.0.38"
|
|
45
|
+
},
|
|
46
|
+
"peerDependencies": {
|
|
47
|
+
"@dimforge/rapier3d-compat": ">=0.14.0"
|
|
48
|
+
},
|
|
49
|
+
"devDependencies": {
|
|
50
|
+
"@dimforge/rapier3d-compat": "^0.14.0",
|
|
51
|
+
"unplugin-swc": "^1.5.7"
|
|
52
|
+
},
|
|
53
|
+
"files": [
|
|
54
|
+
"dist",
|
|
55
|
+
"README.md"
|
|
56
|
+
],
|
|
57
|
+
"publishConfig": {
|
|
58
|
+
"access": "public"
|
|
59
|
+
}
|
|
60
|
+
}
|