@aura3d/physics 1.0.6
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 +26 -0
- package/dist/CharacterController.d.ts +52 -0
- package/dist/CharacterController.d.ts.map +1 -0
- package/dist/CharacterController.js +146 -0
- package/dist/CharacterController.js.map +1 -0
- package/dist/ClothFixtures.d.ts +87 -0
- package/dist/ClothFixtures.d.ts.map +1 -0
- package/dist/ClothFixtures.js +264 -0
- package/dist/ClothFixtures.js.map +1 -0
- package/dist/Collider.d.ts +27 -0
- package/dist/Collider.d.ts.map +1 -0
- package/dist/Collider.js +45 -0
- package/dist/Collider.js.map +1 -0
- package/dist/CollisionEvents.d.ts +26 -0
- package/dist/CollisionEvents.d.ts.map +1 -0
- package/dist/CollisionEvents.js +46 -0
- package/dist/CollisionEvents.js.map +1 -0
- package/dist/CollisionVolumes.d.ts +57 -0
- package/dist/CollisionVolumes.d.ts.map +1 -0
- package/dist/CollisionVolumes.js +159 -0
- package/dist/CollisionVolumes.js.map +1 -0
- package/dist/Constraint.d.ts +31 -0
- package/dist/Constraint.d.ts.map +1 -0
- package/dist/Constraint.js +103 -0
- package/dist/Constraint.js.map +1 -0
- package/dist/Constraints.d.ts +2 -0
- package/dist/Constraints.d.ts.map +1 -0
- package/dist/Constraints.js +2 -0
- package/dist/Constraints.js.map +1 -0
- package/dist/Crowd.d.ts +64 -0
- package/dist/Crowd.d.ts.map +1 -0
- package/dist/Crowd.js +209 -0
- package/dist/Crowd.js.map +1 -0
- package/dist/ECSPhysicsBridge.d.ts +17 -0
- package/dist/ECSPhysicsBridge.d.ts.map +1 -0
- package/dist/ECSPhysicsBridge.js +37 -0
- package/dist/ECSPhysicsBridge.js.map +1 -0
- package/dist/FireSmokeFixtures.d.ts +103 -0
- package/dist/FireSmokeFixtures.d.ts.map +1 -0
- package/dist/FireSmokeFixtures.js +271 -0
- package/dist/FireSmokeFixtures.js.map +1 -0
- package/dist/FluidFixtures.d.ts +75 -0
- package/dist/FluidFixtures.d.ts.map +1 -0
- package/dist/FluidFixtures.js +219 -0
- package/dist/FluidFixtures.js.map +1 -0
- package/dist/FractureFixtures.d.ts +68 -0
- package/dist/FractureFixtures.d.ts.map +1 -0
- package/dist/FractureFixtures.js +199 -0
- package/dist/FractureFixtures.js.map +1 -0
- package/dist/HitboxWorld.d.ts +250 -0
- package/dist/HitboxWorld.d.ts.map +1 -0
- package/dist/HitboxWorld.js +771 -0
- package/dist/HitboxWorld.js.map +1 -0
- package/dist/KinematicBody.d.ts +157 -0
- package/dist/KinematicBody.d.ts.map +1 -0
- package/dist/KinematicBody.js +405 -0
- package/dist/KinematicBody.js.map +1 -0
- package/dist/KinematicWorld.d.ts +58 -0
- package/dist/KinematicWorld.d.ts.map +1 -0
- package/dist/KinematicWorld.js +246 -0
- package/dist/KinematicWorld.js.map +1 -0
- package/dist/Navigation.d.ts +67 -0
- package/dist/Navigation.d.ts.map +1 -0
- package/dist/Navigation.js +261 -0
- package/dist/Navigation.js.map +1 -0
- package/dist/PhysicsDebugDraw.d.ts +11 -0
- package/dist/PhysicsDebugDraw.d.ts.map +1 -0
- package/dist/PhysicsDebugDraw.js +64 -0
- package/dist/PhysicsDebugDraw.js.map +1 -0
- package/dist/PhysicsSandboxFixtures.d.ts +53 -0
- package/dist/PhysicsSandboxFixtures.d.ts.map +1 -0
- package/dist/PhysicsSandboxFixtures.js +280 -0
- package/dist/PhysicsSandboxFixtures.js.map +1 -0
- package/dist/PhysicsStepper.d.ts +15 -0
- package/dist/PhysicsStepper.d.ts.map +1 -0
- package/dist/PhysicsStepper.js +37 -0
- package/dist/PhysicsStepper.js.map +1 -0
- package/dist/PhysicsWorld.d.ts +101 -0
- package/dist/PhysicsWorld.d.ts.map +1 -0
- package/dist/PhysicsWorld.js +868 -0
- package/dist/PhysicsWorld.js.map +1 -0
- package/dist/PlatformerFixtures.d.ts +70 -0
- package/dist/PlatformerFixtures.d.ts.map +1 -0
- package/dist/PlatformerFixtures.js +120 -0
- package/dist/PlatformerFixtures.js.map +1 -0
- package/dist/Raycast.d.ts +23 -0
- package/dist/Raycast.d.ts.map +1 -0
- package/dist/Raycast.js +271 -0
- package/dist/Raycast.js.map +1 -0
- package/dist/RigidBody.d.ts +69 -0
- package/dist/RigidBody.d.ts.map +1 -0
- package/dist/RigidBody.js +255 -0
- package/dist/RigidBody.js.map +1 -0
- package/dist/ScenePhysicsBridge.d.ts +42 -0
- package/dist/ScenePhysicsBridge.d.ts.map +1 -0
- package/dist/ScenePhysicsBridge.js +168 -0
- package/dist/ScenePhysicsBridge.js.map +1 -0
- package/dist/Shape.d.ts +50 -0
- package/dist/Shape.d.ts.map +1 -0
- package/dist/Shape.js +128 -0
- package/dist/Shape.js.map +1 -0
- package/dist/SoftBodyFixtures.d.ts +70 -0
- package/dist/SoftBodyFixtures.d.ts.map +1 -0
- package/dist/SoftBodyFixtures.js +272 -0
- package/dist/SoftBodyFixtures.js.map +1 -0
- package/dist/Steering.d.ts +161 -0
- package/dist/Steering.d.ts.map +1 -0
- package/dist/Steering.js +347 -0
- package/dist/Steering.js.map +1 -0
- package/dist/VehicleDynamics.d.ts +152 -0
- package/dist/VehicleDynamics.d.ts.map +1 -0
- package/dist/VehicleDynamics.js +335 -0
- package/dist/VehicleDynamics.js.map +1 -0
- package/dist/index.d.ts +29 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +29 -0
- package/dist/index.js.map +1 -0
- package/package.json +17 -0
- package/src/CharacterController.ts +184 -0
- package/src/ClothFixtures.ts +359 -0
- package/src/Collider.ts +67 -0
- package/src/CollisionEvents.ts +70 -0
- package/src/CollisionVolumes.ts +218 -0
- package/src/Constraint.ts +120 -0
- package/src/Constraints.ts +1 -0
- package/src/Crowd.ts +283 -0
- package/src/ECSPhysicsBridge.ts +53 -0
- package/src/FireSmokeFixtures.ts +382 -0
- package/src/FluidFixtures.ts +301 -0
- package/src/FractureFixtures.ts +277 -0
- package/src/HitboxWorld.ts +1179 -0
- package/src/KinematicBody.ts +553 -0
- package/src/KinematicWorld.ts +310 -0
- package/src/Navigation.ts +321 -0
- package/src/PhysicsDebugDraw.ts +71 -0
- package/src/PhysicsSandboxFixtures.ts +394 -0
- package/src/PhysicsStepper.ts +47 -0
- package/src/PhysicsWorld.ts +986 -0
- package/src/PlatformerFixtures.ts +205 -0
- package/src/Raycast.ts +315 -0
- package/src/RigidBody.ts +311 -0
- package/src/ScenePhysicsBridge.ts +207 -0
- package/src/Shape.ts +182 -0
- package/src/SoftBodyFixtures.ts +363 -0
- package/src/Steering.ts +531 -0
- package/src/VehicleDynamics.ts +524 -0
- package/src/index.ts +28 -0
package/dist/Collider.js
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { Shape } from "./Shape.js";
|
|
2
|
+
export class Collider {
|
|
3
|
+
id;
|
|
4
|
+
bodyId;
|
|
5
|
+
shape;
|
|
6
|
+
sensor;
|
|
7
|
+
filter;
|
|
8
|
+
material;
|
|
9
|
+
constructor(id, bodyId, descriptor) {
|
|
10
|
+
if (!Number.isInteger(id) || id <= 0) {
|
|
11
|
+
throw new Error("Collider id must be a positive integer.");
|
|
12
|
+
}
|
|
13
|
+
if (!Number.isInteger(bodyId) || bodyId <= 0) {
|
|
14
|
+
throw new Error("Collider body id must be a positive integer.");
|
|
15
|
+
}
|
|
16
|
+
this.id = id;
|
|
17
|
+
this.bodyId = bodyId;
|
|
18
|
+
this.shape = descriptor.shape;
|
|
19
|
+
this.sensor = descriptor.sensor ?? false;
|
|
20
|
+
this.filter = {
|
|
21
|
+
layer: descriptor.filter?.layer ?? 1,
|
|
22
|
+
mask: descriptor.filter?.mask ?? 0xffffffff
|
|
23
|
+
};
|
|
24
|
+
this.material = {
|
|
25
|
+
restitution: descriptor.material?.restitution ?? 0,
|
|
26
|
+
friction: descriptor.material?.friction ?? 0.5
|
|
27
|
+
};
|
|
28
|
+
if (this.filter.layer < 0 || this.filter.mask < 0) {
|
|
29
|
+
throw new Error("Collider filter layer and mask must be non-negative bit masks.");
|
|
30
|
+
}
|
|
31
|
+
if (!Number.isFinite(this.material.restitution) ||
|
|
32
|
+
!Number.isFinite(this.material.friction) ||
|
|
33
|
+
this.material.restitution < 0 ||
|
|
34
|
+
this.material.friction < 0) {
|
|
35
|
+
throw new Error("Collider material values must be finite and non-negative.");
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
canCollideWith(other) {
|
|
39
|
+
return (this.filter.mask & other.filter.layer) !== 0 && (other.filter.mask & this.filter.layer) !== 0;
|
|
40
|
+
}
|
|
41
|
+
bounds(position) {
|
|
42
|
+
return Shape.bounds(this.shape, position);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=Collider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Collider.js","sourceRoot":"","sources":["../../../../packages/physics/src/Collider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAA6C,MAAM,YAAY,CAAC;AAmB9E,MAAM,OAAO,QAAQ;IACV,EAAE,CAAS;IACX,MAAM,CAAS;IACf,KAAK,CAAe;IACpB,MAAM,CAAU;IAChB,MAAM,CAAkB;IACxB,QAAQ,CAAmB;IAEpC,YAAY,EAAU,EAAE,MAAc,EAAE,UAA8B;QACpE,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;YACrC,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;QAC7D,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,MAAM,IAAI,CAAC,EAAE,CAAC;YAC7C,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;QAClE,CAAC;QACD,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC;QAC9B,IAAI,CAAC,MAAM,GAAG,UAAU,CAAC,MAAM,IAAI,KAAK,CAAC;QACzC,IAAI,CAAC,MAAM,GAAG;YACZ,KAAK,EAAE,UAAU,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC;YACpC,IAAI,EAAE,UAAU,CAAC,MAAM,EAAE,IAAI,IAAI,UAAU;SAC5C,CAAC;QACF,IAAI,CAAC,QAAQ,GAAG;YACd,WAAW,EAAE,UAAU,CAAC,QAAQ,EAAE,WAAW,IAAI,CAAC;YAClD,QAAQ,EAAE,UAAU,CAAC,QAAQ,EAAE,QAAQ,IAAI,GAAG;SAC/C,CAAC;QACF,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;YAClD,MAAM,IAAI,KAAK,CAAC,gEAAgE,CAAC,CAAC;QACpF,CAAC;QACD,IACE,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC;YAC3C,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;YACxC,IAAI,CAAC,QAAQ,CAAC,WAAW,GAAG,CAAC;YAC7B,IAAI,CAAC,QAAQ,CAAC,QAAQ,GAAG,CAAC,EAC1B,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;QAC/E,CAAC;IACH,CAAC;IAED,cAAc,CAAC,KAAe;QAC5B,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACxG,CAAC;IAED,MAAM,CAAC,QAAc;QACnB,OAAO,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAC5C,CAAC;CACF"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { Vec3 } from "./Shape.js";
|
|
2
|
+
export type Contact = {
|
|
3
|
+
readonly colliderA: number;
|
|
4
|
+
readonly colliderB: number;
|
|
5
|
+
readonly bodyA: number;
|
|
6
|
+
readonly bodyB: number;
|
|
7
|
+
readonly normal: Vec3;
|
|
8
|
+
readonly penetration: number;
|
|
9
|
+
readonly sensor: boolean;
|
|
10
|
+
};
|
|
11
|
+
export type CollisionEventType = "begin" | "stay" | "end";
|
|
12
|
+
export type CollisionEvent = {
|
|
13
|
+
readonly type: CollisionEventType;
|
|
14
|
+
readonly pairKey: string;
|
|
15
|
+
readonly contact: Contact;
|
|
16
|
+
};
|
|
17
|
+
export declare function contactPairKey(colliderA: number, colliderB: number): string;
|
|
18
|
+
export declare class CollisionEventQueue {
|
|
19
|
+
private previousContacts;
|
|
20
|
+
private events;
|
|
21
|
+
update(currentContacts: readonly Contact[]): readonly CollisionEvent[];
|
|
22
|
+
removeCollider(colliderId: number): readonly CollisionEvent[];
|
|
23
|
+
drain(): readonly CollisionEvent[];
|
|
24
|
+
snapshotContacts(): readonly Contact[];
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=CollisionEvents.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CollisionEvents.d.ts","sourceRoot":"","sources":["../../../../packages/physics/src/CollisionEvents.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAEvC,MAAM,MAAM,OAAO,GAAG;IACpB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG,OAAO,GAAG,MAAM,GAAG,KAAK,CAAC;AAE1D,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC;IAClC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B,CAAC;AAEF,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAE3E;AAED,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,gBAAgB,CAA8B;IACtD,OAAO,CAAC,MAAM,CAAwB;IAEtC,MAAM,CAAC,eAAe,EAAE,SAAS,OAAO,EAAE,GAAG,SAAS,cAAc,EAAE;IAmBtE,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,cAAc,EAAE;IAa7D,KAAK,IAAI,SAAS,cAAc,EAAE;IAMlC,gBAAgB,IAAI,SAAS,OAAO,EAAE;CAGvC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
export function contactPairKey(colliderA, colliderB) {
|
|
2
|
+
return colliderA < colliderB ? `${colliderA}:${colliderB}` : `${colliderB}:${colliderA}`;
|
|
3
|
+
}
|
|
4
|
+
export class CollisionEventQueue {
|
|
5
|
+
previousContacts = new Map();
|
|
6
|
+
events = [];
|
|
7
|
+
update(currentContacts) {
|
|
8
|
+
const next = new Map();
|
|
9
|
+
const events = [];
|
|
10
|
+
for (const contact of currentContacts) {
|
|
11
|
+
const pairKey = contactPairKey(contact.colliderA, contact.colliderB);
|
|
12
|
+
next.set(pairKey, contact);
|
|
13
|
+
events.push({ type: this.previousContacts.has(pairKey) ? "stay" : "begin", pairKey, contact });
|
|
14
|
+
}
|
|
15
|
+
for (const [pairKey, contact] of this.previousContacts) {
|
|
16
|
+
if (!next.has(pairKey)) {
|
|
17
|
+
events.push({ type: "end", pairKey, contact });
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
events.sort((a, b) => a.pairKey.localeCompare(b.pairKey) || a.type.localeCompare(b.type));
|
|
21
|
+
this.previousContacts = next;
|
|
22
|
+
this.events = events;
|
|
23
|
+
return this.drain();
|
|
24
|
+
}
|
|
25
|
+
removeCollider(colliderId) {
|
|
26
|
+
const removedEvents = [];
|
|
27
|
+
for (const [pairKey, contact] of this.previousContacts) {
|
|
28
|
+
if (contact.colliderA === colliderId || contact.colliderB === colliderId) {
|
|
29
|
+
const event = { type: "end", pairKey, contact };
|
|
30
|
+
this.events.push(event);
|
|
31
|
+
removedEvents.push(event);
|
|
32
|
+
this.previousContacts.delete(pairKey);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return removedEvents;
|
|
36
|
+
}
|
|
37
|
+
drain() {
|
|
38
|
+
const events = this.events;
|
|
39
|
+
this.events = [];
|
|
40
|
+
return events;
|
|
41
|
+
}
|
|
42
|
+
snapshotContacts() {
|
|
43
|
+
return Array.from(this.previousContacts.values());
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=CollisionEvents.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CollisionEvents.js","sourceRoot":"","sources":["../../../../packages/physics/src/CollisionEvents.ts"],"names":[],"mappings":"AAoBA,MAAM,UAAU,cAAc,CAAC,SAAiB,EAAE,SAAiB;IACjE,OAAO,SAAS,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,IAAI,SAAS,EAAE,CAAC,CAAC,CAAC,GAAG,SAAS,IAAI,SAAS,EAAE,CAAC;AAC3F,CAAC;AAED,MAAM,OAAO,mBAAmB;IACtB,gBAAgB,GAAG,IAAI,GAAG,EAAmB,CAAC;IAC9C,MAAM,GAAqB,EAAE,CAAC;IAEtC,MAAM,CAAC,eAAmC;QACxC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAmB,CAAC;QACxC,MAAM,MAAM,GAAqB,EAAE,CAAC;QACpC,KAAK,MAAM,OAAO,IAAI,eAAe,EAAE,CAAC;YACtC,MAAM,OAAO,GAAG,cAAc,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;YACrE,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC3B,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QACjG,CAAC;QACD,KAAK,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACvD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;gBACvB,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;YACjD,CAAC;QACH,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAC1F,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAC7B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC;IACtB,CAAC;IAED,cAAc,CAAC,UAAkB;QAC/B,MAAM,aAAa,GAAqB,EAAE,CAAC;QAC3C,KAAK,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACvD,IAAI,OAAO,CAAC,SAAS,KAAK,UAAU,IAAI,OAAO,CAAC,SAAS,KAAK,UAAU,EAAE,CAAC;gBACzE,MAAM,KAAK,GAAG,EAAE,IAAI,EAAE,KAAc,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;gBACzD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACxB,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAC1B,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACxC,CAAC;QACH,CAAC;QACD,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,KAAK;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC3B,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;QACjB,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,gBAAgB;QACd,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,CAAC,CAAC;IACpD,CAAC;CACF"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { type Bounds, type Vec3 } from "./Shape.js";
|
|
2
|
+
export type CombatFacing = -1 | 1;
|
|
3
|
+
export type CollisionOwnerId = string | number;
|
|
4
|
+
export type CollisionVolumeKind = "hitbox" | "hurtbox" | "pushbox" | "guardbox";
|
|
5
|
+
export type CollisionVolumeDescriptor = {
|
|
6
|
+
readonly id?: string;
|
|
7
|
+
readonly ownerId?: CollisionOwnerId;
|
|
8
|
+
readonly offset?: Vec3;
|
|
9
|
+
readonly halfExtents: Vec3;
|
|
10
|
+
readonly enabled?: boolean;
|
|
11
|
+
readonly tags?: readonly string[];
|
|
12
|
+
readonly metadata?: Readonly<Record<string, unknown>>;
|
|
13
|
+
};
|
|
14
|
+
export type CollisionVolume = {
|
|
15
|
+
readonly id: string;
|
|
16
|
+
readonly kind: CollisionVolumeKind;
|
|
17
|
+
readonly offset: Vec3;
|
|
18
|
+
readonly halfExtents: Vec3;
|
|
19
|
+
readonly enabled: boolean;
|
|
20
|
+
readonly tags: readonly string[];
|
|
21
|
+
readonly ownerId?: CollisionOwnerId;
|
|
22
|
+
readonly metadata?: Readonly<Record<string, unknown>>;
|
|
23
|
+
};
|
|
24
|
+
export type ResolvedCollisionVolume = CollisionVolume & {
|
|
25
|
+
readonly center: Vec3;
|
|
26
|
+
readonly facing: CombatFacing;
|
|
27
|
+
readonly bounds: Bounds;
|
|
28
|
+
};
|
|
29
|
+
export type CollisionPenetration = {
|
|
30
|
+
readonly normal: Vec3;
|
|
31
|
+
readonly depth: number;
|
|
32
|
+
readonly axis: 0 | 1 | 2;
|
|
33
|
+
readonly overlap: Vec3;
|
|
34
|
+
};
|
|
35
|
+
export declare function collisionVolume(kind: CollisionVolumeKind, descriptor: CollisionVolumeDescriptor): CollisionVolume;
|
|
36
|
+
export declare function hitbox(descriptor: CollisionVolumeDescriptor): CollisionVolume;
|
|
37
|
+
export declare function hurtbox(descriptor: CollisionVolumeDescriptor): CollisionVolume;
|
|
38
|
+
export declare function pushbox(descriptor: CollisionVolumeDescriptor): CollisionVolume;
|
|
39
|
+
export declare function guardbox(descriptor: CollisionVolumeDescriptor): CollisionVolume;
|
|
40
|
+
export declare const createHitbox: typeof hitbox;
|
|
41
|
+
export declare const createHurtbox: typeof hurtbox;
|
|
42
|
+
export declare const createPushbox: typeof pushbox;
|
|
43
|
+
export declare const createGuardbox: typeof guardbox;
|
|
44
|
+
export declare const createGuardBox: typeof guardbox;
|
|
45
|
+
export declare function cloneCollisionVolume(volume: CollisionVolume): CollisionVolume;
|
|
46
|
+
export declare function withVolumeOwner(volume: CollisionVolume, ownerId: CollisionOwnerId): CollisionVolume;
|
|
47
|
+
export declare function resolveCollisionVolume(volume: CollisionVolume, ownerPosition: Vec3, facing?: CombatFacing): ResolvedCollisionVolume;
|
|
48
|
+
export declare function aabbFromCenter(center: Vec3, halfExtents: Vec3): Bounds;
|
|
49
|
+
export declare function boundsCenter(bounds: Bounds): Vec3;
|
|
50
|
+
export declare function boundsHalfExtents(bounds: Bounds): Vec3;
|
|
51
|
+
export declare function overlapsAabb(a: Bounds, b: Bounds): boolean;
|
|
52
|
+
export declare function overlapsVolume(a: ResolvedCollisionVolume, b: ResolvedCollisionVolume): boolean;
|
|
53
|
+
export declare function aabbPenetration(a: Bounds, b: Bounds): CollisionPenetration | null;
|
|
54
|
+
export declare function volumePairKey(a: CollisionVolume | ResolvedCollisionVolume, b: CollisionVolume | ResolvedCollisionVolume): string;
|
|
55
|
+
export declare function normalizeFacing(value: number): CombatFacing;
|
|
56
|
+
export declare function validateBounds(bounds: Bounds, name: string): void;
|
|
57
|
+
//# sourceMappingURL=CollisionVolumes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CollisionVolumes.d.ts","sourceRoot":"","sources":["../../../../packages/physics/src/CollisionVolumes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import { cloneVec3, validateFiniteVec3 } from "./Shape.js";
|
|
2
|
+
export function collisionVolume(kind, descriptor) {
|
|
3
|
+
validateHalfExtents(descriptor.halfExtents, `${kind} halfExtents`);
|
|
4
|
+
const volume = {
|
|
5
|
+
id: descriptor.id ?? kind,
|
|
6
|
+
kind,
|
|
7
|
+
offset: cloneVec3(descriptor.offset ?? [0, 0, 0]),
|
|
8
|
+
halfExtents: cloneVec3(descriptor.halfExtents),
|
|
9
|
+
enabled: descriptor.enabled ?? true,
|
|
10
|
+
tags: [...(descriptor.tags ?? [])],
|
|
11
|
+
...(descriptor.ownerId === undefined ? {} : { ownerId: descriptor.ownerId }),
|
|
12
|
+
...(descriptor.metadata === undefined ? {} : { metadata: { ...descriptor.metadata } })
|
|
13
|
+
};
|
|
14
|
+
validateFiniteVec3(volume.offset, `${kind} offset`);
|
|
15
|
+
return volume;
|
|
16
|
+
}
|
|
17
|
+
export function hitbox(descriptor) {
|
|
18
|
+
return collisionVolume("hitbox", descriptor);
|
|
19
|
+
}
|
|
20
|
+
export function hurtbox(descriptor) {
|
|
21
|
+
return collisionVolume("hurtbox", descriptor);
|
|
22
|
+
}
|
|
23
|
+
export function pushbox(descriptor) {
|
|
24
|
+
return collisionVolume("pushbox", descriptor);
|
|
25
|
+
}
|
|
26
|
+
export function guardbox(descriptor) {
|
|
27
|
+
return collisionVolume("guardbox", descriptor);
|
|
28
|
+
}
|
|
29
|
+
export const createHitbox = hitbox;
|
|
30
|
+
export const createHurtbox = hurtbox;
|
|
31
|
+
export const createPushbox = pushbox;
|
|
32
|
+
export const createGuardbox = guardbox;
|
|
33
|
+
export const createGuardBox = guardbox;
|
|
34
|
+
export function cloneCollisionVolume(volume) {
|
|
35
|
+
return {
|
|
36
|
+
id: volume.id,
|
|
37
|
+
kind: volume.kind,
|
|
38
|
+
offset: cloneVec3(volume.offset),
|
|
39
|
+
halfExtents: cloneVec3(volume.halfExtents),
|
|
40
|
+
enabled: volume.enabled,
|
|
41
|
+
tags: [...volume.tags],
|
|
42
|
+
...(volume.ownerId === undefined ? {} : { ownerId: volume.ownerId }),
|
|
43
|
+
...(volume.metadata === undefined ? {} : { metadata: { ...volume.metadata } })
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
export function withVolumeOwner(volume, ownerId) {
|
|
47
|
+
return {
|
|
48
|
+
...cloneCollisionVolume(volume),
|
|
49
|
+
ownerId
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
export function resolveCollisionVolume(volume, ownerPosition, facing = 1) {
|
|
53
|
+
validateFiniteVec3(ownerPosition, "volume owner position");
|
|
54
|
+
const resolvedFacing = normalizeFacing(facing);
|
|
55
|
+
const center = [
|
|
56
|
+
ownerPosition[0] + volume.offset[0] * resolvedFacing,
|
|
57
|
+
ownerPosition[1] + volume.offset[1],
|
|
58
|
+
ownerPosition[2] + volume.offset[2]
|
|
59
|
+
];
|
|
60
|
+
return {
|
|
61
|
+
...cloneCollisionVolume(volume),
|
|
62
|
+
center,
|
|
63
|
+
facing: resolvedFacing,
|
|
64
|
+
bounds: aabbFromCenter(center, volume.halfExtents)
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
export function aabbFromCenter(center, halfExtents) {
|
|
68
|
+
validateFiniteVec3(center, "aabb center");
|
|
69
|
+
validateHalfExtents(halfExtents, "aabb halfExtents");
|
|
70
|
+
return {
|
|
71
|
+
min: [center[0] - halfExtents[0], center[1] - halfExtents[1], center[2] - halfExtents[2]],
|
|
72
|
+
max: [center[0] + halfExtents[0], center[1] + halfExtents[1], center[2] + halfExtents[2]]
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
export function boundsCenter(bounds) {
|
|
76
|
+
validateBounds(bounds, "bounds");
|
|
77
|
+
return [
|
|
78
|
+
(bounds.min[0] + bounds.max[0]) * 0.5,
|
|
79
|
+
(bounds.min[1] + bounds.max[1]) * 0.5,
|
|
80
|
+
(bounds.min[2] + bounds.max[2]) * 0.5
|
|
81
|
+
];
|
|
82
|
+
}
|
|
83
|
+
export function boundsHalfExtents(bounds) {
|
|
84
|
+
validateBounds(bounds, "bounds");
|
|
85
|
+
return [
|
|
86
|
+
(bounds.max[0] - bounds.min[0]) * 0.5,
|
|
87
|
+
(bounds.max[1] - bounds.min[1]) * 0.5,
|
|
88
|
+
(bounds.max[2] - bounds.min[2]) * 0.5
|
|
89
|
+
];
|
|
90
|
+
}
|
|
91
|
+
export function overlapsAabb(a, b) {
|
|
92
|
+
validateBounds(a, "a bounds");
|
|
93
|
+
validateBounds(b, "b bounds");
|
|
94
|
+
return (a.min[0] < b.max[0] &&
|
|
95
|
+
a.max[0] > b.min[0] &&
|
|
96
|
+
a.min[1] < b.max[1] &&
|
|
97
|
+
a.max[1] > b.min[1] &&
|
|
98
|
+
a.min[2] < b.max[2] &&
|
|
99
|
+
a.max[2] > b.min[2]);
|
|
100
|
+
}
|
|
101
|
+
export function overlapsVolume(a, b) {
|
|
102
|
+
if (!a.enabled || !b.enabled) {
|
|
103
|
+
return false;
|
|
104
|
+
}
|
|
105
|
+
return overlapsAabb(a.bounds, b.bounds);
|
|
106
|
+
}
|
|
107
|
+
export function aabbPenetration(a, b) {
|
|
108
|
+
if (!overlapsAabb(a, b)) {
|
|
109
|
+
return null;
|
|
110
|
+
}
|
|
111
|
+
const overlap = [
|
|
112
|
+
Math.min(a.max[0] - b.min[0], b.max[0] - a.min[0]),
|
|
113
|
+
Math.min(a.max[1] - b.min[1], b.max[1] - a.min[1]),
|
|
114
|
+
Math.min(a.max[2] - b.min[2], b.max[2] - a.min[2])
|
|
115
|
+
];
|
|
116
|
+
let axis = 0;
|
|
117
|
+
if (overlap[1] < overlap[axis]) {
|
|
118
|
+
axis = 1;
|
|
119
|
+
}
|
|
120
|
+
if (overlap[2] < overlap[axis]) {
|
|
121
|
+
axis = 2;
|
|
122
|
+
}
|
|
123
|
+
const centerA = boundsCenter(a);
|
|
124
|
+
const centerB = boundsCenter(b);
|
|
125
|
+
const normal = [0, 0, 0];
|
|
126
|
+
normal[axis] = centerA[axis] <= centerB[axis] ? -1 : 1;
|
|
127
|
+
return {
|
|
128
|
+
normal,
|
|
129
|
+
depth: overlap[axis],
|
|
130
|
+
axis,
|
|
131
|
+
overlap
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
export function volumePairKey(a, b) {
|
|
135
|
+
const keyA = volumeKey(a);
|
|
136
|
+
const keyB = volumeKey(b);
|
|
137
|
+
return keyA < keyB ? `${keyA}:${keyB}` : `${keyB}:${keyA}`;
|
|
138
|
+
}
|
|
139
|
+
export function normalizeFacing(value) {
|
|
140
|
+
return value < 0 ? -1 : 1;
|
|
141
|
+
}
|
|
142
|
+
export function validateBounds(bounds, name) {
|
|
143
|
+
validateFiniteVec3(bounds.min, `${name} min`);
|
|
144
|
+
validateFiniteVec3(bounds.max, `${name} max`);
|
|
145
|
+
if (bounds.min[0] > bounds.max[0] || bounds.min[1] > bounds.max[1] || bounds.min[2] > bounds.max[2]) {
|
|
146
|
+
throw new Error(`${name} min values must be less than or equal to max values.`);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
function validateHalfExtents(value, name) {
|
|
150
|
+
validateFiniteVec3(value, name);
|
|
151
|
+
if (value[0] <= 0 || value[1] <= 0 || value[2] <= 0) {
|
|
152
|
+
throw new Error(`${name} must contain finite positive values.`);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
function volumeKey(volume) {
|
|
156
|
+
const owner = volume.ownerId === undefined ? "none" : String(volume.ownerId);
|
|
157
|
+
return `${owner}/${volume.kind}/${volume.id}`;
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=CollisionVolumes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CollisionVolumes.js","sourceRoot":"","sources":["../../../../packages/physics/src/CollisionVolumes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { type Vec3 } from "./Shape.js";
|
|
2
|
+
import type { RigidBody } from "./RigidBody.js";
|
|
3
|
+
export type ConstraintType = "fixed" | "hinge" | "slider" | "spring";
|
|
4
|
+
export type ConstraintDescriptor = {
|
|
5
|
+
readonly type: ConstraintType;
|
|
6
|
+
readonly bodyA: RigidBody;
|
|
7
|
+
readonly bodyB: RigidBody;
|
|
8
|
+
readonly localAnchorA?: Vec3;
|
|
9
|
+
readonly localAnchorB?: Vec3;
|
|
10
|
+
readonly restLength?: number;
|
|
11
|
+
readonly stiffness?: number;
|
|
12
|
+
readonly axis?: Vec3;
|
|
13
|
+
};
|
|
14
|
+
export declare class Constraint {
|
|
15
|
+
readonly type: ConstraintType;
|
|
16
|
+
readonly bodyA: RigidBody;
|
|
17
|
+
readonly bodyB: RigidBody;
|
|
18
|
+
readonly localAnchorA: Vec3;
|
|
19
|
+
readonly localAnchorB: Vec3;
|
|
20
|
+
readonly restOffset: Vec3;
|
|
21
|
+
readonly restLength: number;
|
|
22
|
+
readonly stiffness: number;
|
|
23
|
+
readonly axis: Vec3;
|
|
24
|
+
constructor(descriptor: ConstraintDescriptor);
|
|
25
|
+
solve(): void;
|
|
26
|
+
private anchorAWorld;
|
|
27
|
+
private anchorBWorld;
|
|
28
|
+
private applyError;
|
|
29
|
+
private applyVelocityError;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=Constraint.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Constraint.d.ts","sourceRoot":"","sources":["../../../../packages/physics/src/Constraint.ts"],"names":[],"mappings":"AAAA,OAAO,EAA2E,KAAK,IAAI,EAAE,MAAM,YAAY,CAAC;AAChH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAErE,MAAM,MAAM,oBAAoB,GAAG;IACjC,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAC9B,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAC1B,QAAQ,CAAC,YAAY,CAAC,EAAE,IAAI,CAAC;IAC7B,QAAQ,CAAC,YAAY,CAAC,EAAE,IAAI,CAAC;IAC7B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC;CACtB,CAAC;AAEF,qBAAa,UAAU;IACrB,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAC9B,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAC1B,QAAQ,CAAC,YAAY,EAAE,IAAI,CAAC;IAC5B,QAAQ,CAAC,YAAY,EAAE,IAAI,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,IAAI,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;gBAER,UAAU,EAAE,oBAAoB;IAyB5C,KAAK,IAAI,IAAI;IAgCb,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,UAAU;IAclB,OAAO,CAAC,kBAAkB;CAa3B"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { addVec3, dotVec3, normalizeVec3, scaleVec3, subVec3, validateFiniteVec3 } from "./Shape.js";
|
|
2
|
+
export class Constraint {
|
|
3
|
+
type;
|
|
4
|
+
bodyA;
|
|
5
|
+
bodyB;
|
|
6
|
+
localAnchorA;
|
|
7
|
+
localAnchorB;
|
|
8
|
+
restOffset;
|
|
9
|
+
restLength;
|
|
10
|
+
stiffness;
|
|
11
|
+
axis;
|
|
12
|
+
constructor(descriptor) {
|
|
13
|
+
if (descriptor.bodyA.id === descriptor.bodyB.id) {
|
|
14
|
+
throw new Error("Constraint requires two different bodies.");
|
|
15
|
+
}
|
|
16
|
+
this.localAnchorA = descriptor.localAnchorA ?? [0, 0, 0];
|
|
17
|
+
this.localAnchorB = descriptor.localAnchorB ?? [0, 0, 0];
|
|
18
|
+
validateFiniteVec3(this.localAnchorA, "constraint localAnchorA");
|
|
19
|
+
validateFiniteVec3(this.localAnchorB, "constraint localAnchorB");
|
|
20
|
+
this.axis = normalizeVec3(descriptor.axis ?? [1, 0, 0]);
|
|
21
|
+
this.type = descriptor.type;
|
|
22
|
+
this.bodyA = descriptor.bodyA;
|
|
23
|
+
this.bodyB = descriptor.bodyB;
|
|
24
|
+
const anchorA = this.anchorAWorld();
|
|
25
|
+
const anchorB = this.anchorBWorld();
|
|
26
|
+
this.restOffset = subVec3(anchorB, anchorA);
|
|
27
|
+
this.restLength = descriptor.restLength ?? Math.hypot(this.restOffset[0], this.restOffset[1], this.restOffset[2]);
|
|
28
|
+
this.stiffness = descriptor.stiffness ?? 1;
|
|
29
|
+
if (!Number.isFinite(this.restLength) || this.restLength < 0) {
|
|
30
|
+
throw new Error("Constraint restLength must be finite and non-negative.");
|
|
31
|
+
}
|
|
32
|
+
if (!Number.isFinite(this.stiffness) || this.stiffness < 0 || this.stiffness > 1) {
|
|
33
|
+
throw new Error("Constraint stiffness must be in the [0, 1] range.");
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
solve() {
|
|
37
|
+
if (this.stiffness === 0) {
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
if (this.type === "fixed") {
|
|
41
|
+
const currentOffset = subVec3(this.anchorBWorld(), this.anchorAWorld());
|
|
42
|
+
this.applyError(subVec3(currentOffset, this.restOffset));
|
|
43
|
+
this.applyVelocityError(subVec3(this.bodyB.velocity, this.bodyA.velocity));
|
|
44
|
+
}
|
|
45
|
+
else if (this.type === "hinge") {
|
|
46
|
+
this.applyError(subVec3(this.anchorBWorld(), this.anchorAWorld()));
|
|
47
|
+
this.applyVelocityError(subVec3(this.bodyB.velocity, this.bodyA.velocity));
|
|
48
|
+
}
|
|
49
|
+
else if (this.type === "slider") {
|
|
50
|
+
const currentOffset = subVec3(this.anchorBWorld(), this.anchorAWorld());
|
|
51
|
+
const projected = scaleVec3(this.axis, dotVec3(currentOffset, this.axis));
|
|
52
|
+
this.applyError(subVec3(currentOffset, projected));
|
|
53
|
+
const relativeVelocity = subVec3(this.bodyB.velocity, this.bodyA.velocity);
|
|
54
|
+
const projectedVelocity = scaleVec3(this.axis, dotVec3(relativeVelocity, this.axis));
|
|
55
|
+
this.applyVelocityError(subVec3(relativeVelocity, projectedVelocity));
|
|
56
|
+
}
|
|
57
|
+
else if (this.type === "spring") {
|
|
58
|
+
const currentOffset = subVec3(this.anchorBWorld(), this.anchorAWorld());
|
|
59
|
+
const currentLength = Math.hypot(currentOffset[0], currentOffset[1], currentOffset[2]);
|
|
60
|
+
if (currentLength <= 1e-9) {
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
const lengthError = currentLength - this.restLength;
|
|
64
|
+
this.applyError(scaleVec3(currentOffset, lengthError / currentLength));
|
|
65
|
+
const relativeVelocity = subVec3(this.bodyB.velocity, this.bodyA.velocity);
|
|
66
|
+
const axis = scaleVec3(currentOffset, 1 / currentLength);
|
|
67
|
+
this.applyVelocityError(scaleVec3(axis, dotVec3(relativeVelocity, axis) * Math.min(1, this.stiffness)));
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
anchorAWorld() {
|
|
71
|
+
return addVec3(this.bodyA.position, this.localAnchorA);
|
|
72
|
+
}
|
|
73
|
+
anchorBWorld() {
|
|
74
|
+
return addVec3(this.bodyB.position, this.localAnchorB);
|
|
75
|
+
}
|
|
76
|
+
applyError(error) {
|
|
77
|
+
const inverseMassSum = this.bodyA.inverseMass + this.bodyB.inverseMass;
|
|
78
|
+
if (inverseMassSum <= 0) {
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
const weightedError = scaleVec3(error, this.stiffness);
|
|
82
|
+
if (this.bodyA.inverseMass > 0) {
|
|
83
|
+
this.bodyA.setPosition(addVec3(this.bodyA.position, scaleVec3(weightedError, this.bodyA.inverseMass / inverseMassSum)));
|
|
84
|
+
}
|
|
85
|
+
if (this.bodyB.inverseMass > 0) {
|
|
86
|
+
this.bodyB.setPosition(subVec3(this.bodyB.position, scaleVec3(weightedError, this.bodyB.inverseMass / inverseMassSum)));
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
applyVelocityError(errorVelocity) {
|
|
90
|
+
const inverseMassSum = this.bodyA.inverseMass + this.bodyB.inverseMass;
|
|
91
|
+
if (inverseMassSum <= 0) {
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
const correctionImpulse = scaleVec3(errorVelocity, -this.stiffness / inverseMassSum);
|
|
95
|
+
if (this.bodyA.inverseMass > 0) {
|
|
96
|
+
this.bodyA.applyImpulse(scaleVec3(correctionImpulse, -1));
|
|
97
|
+
}
|
|
98
|
+
if (this.bodyB.inverseMass > 0) {
|
|
99
|
+
this.bodyB.applyImpulse(correctionImpulse);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=Constraint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Constraint.js","sourceRoot":"","sources":["../../../../packages/physics/src/Constraint.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Constraints.d.ts","sourceRoot":"","sources":["../../../../packages/physics/src/Constraints.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Constraints.js","sourceRoot":"","sources":["../../../../packages/physics/src/Constraints.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC"}
|
package/dist/Crowd.d.ts
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { type SteeringPoint, type SteeringVector } from "./Steering";
|
|
2
|
+
export type CrowdFormationType = "line" | "wedge" | "column" | "circle";
|
|
3
|
+
export interface CrowdAgentOptions {
|
|
4
|
+
readonly id: string;
|
|
5
|
+
readonly position: SteeringPoint;
|
|
6
|
+
readonly velocity?: SteeringVector;
|
|
7
|
+
readonly radius?: number;
|
|
8
|
+
readonly maxSpeed?: number;
|
|
9
|
+
readonly priority?: number;
|
|
10
|
+
}
|
|
11
|
+
export interface CrowdSimulationOptions {
|
|
12
|
+
readonly neighborRadius?: number;
|
|
13
|
+
readonly maxNeighbors?: number;
|
|
14
|
+
readonly separationWeight?: number;
|
|
15
|
+
readonly alignmentWeight?: number;
|
|
16
|
+
readonly cohesionWeight?: number;
|
|
17
|
+
readonly formationWeight?: number;
|
|
18
|
+
readonly maxForce?: number;
|
|
19
|
+
}
|
|
20
|
+
export interface CrowdFormationOptions {
|
|
21
|
+
readonly type: CrowdFormationType;
|
|
22
|
+
readonly center: SteeringPoint;
|
|
23
|
+
readonly forward?: SteeringVector;
|
|
24
|
+
readonly spacing?: number;
|
|
25
|
+
}
|
|
26
|
+
export interface CrowdAgentSnapshot {
|
|
27
|
+
readonly id: string;
|
|
28
|
+
readonly position: SteeringPoint;
|
|
29
|
+
readonly velocity: SteeringVector;
|
|
30
|
+
readonly speed: number;
|
|
31
|
+
readonly neighborCount: number;
|
|
32
|
+
readonly formationSlot: SteeringPoint;
|
|
33
|
+
}
|
|
34
|
+
export interface CrowdSimulationSnapshot {
|
|
35
|
+
readonly agentCount: number;
|
|
36
|
+
readonly neighborPairs: number;
|
|
37
|
+
readonly averageNeighbors: number;
|
|
38
|
+
readonly averageSpeed: number;
|
|
39
|
+
readonly maxSpeed: number;
|
|
40
|
+
readonly formationType: CrowdFormationType | "none";
|
|
41
|
+
readonly center: SteeringPoint;
|
|
42
|
+
readonly agents: readonly CrowdAgentSnapshot[];
|
|
43
|
+
}
|
|
44
|
+
export declare class CrowdSimulation {
|
|
45
|
+
private readonly agents;
|
|
46
|
+
private readonly neighborRadius;
|
|
47
|
+
private readonly maxNeighbors;
|
|
48
|
+
private readonly separationWeight;
|
|
49
|
+
private readonly alignmentWeight;
|
|
50
|
+
private readonly cohesionWeight;
|
|
51
|
+
private readonly formationWeight;
|
|
52
|
+
private readonly maxForce;
|
|
53
|
+
private formation;
|
|
54
|
+
private lastNeighbors;
|
|
55
|
+
private lastSlots;
|
|
56
|
+
constructor(options?: CrowdSimulationOptions);
|
|
57
|
+
addAgent(options: CrowdAgentOptions): void;
|
|
58
|
+
removeAgent(id: string): boolean;
|
|
59
|
+
setFormation(options: CrowdFormationOptions | undefined): void;
|
|
60
|
+
update(deltaSeconds: number): CrowdSimulationSnapshot;
|
|
61
|
+
snapshot(): CrowdSimulationSnapshot;
|
|
62
|
+
private neighborsFor;
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=Crowd.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Crowd.d.ts","sourceRoot":"","sources":["../../../../packages/physics/src/Crowd.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,KAAK,aAAa,EAAE,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC;AAErF,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAExE,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;IACjC,QAAQ,CAAC,QAAQ,CAAC,EAAE,cAAc,CAAC;IACnC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC;IAClC,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,QAAQ,CAAC,OAAO,CAAC,EAAE,cAAc,CAAC;IAClC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;IACjC,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;IAClC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC;CACvC;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,aAAa,EAAE,kBAAkB,GAAG,MAAM,CAAC;IACpD,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,QAAQ,CAAC,MAAM,EAAE,SAAS,kBAAkB,EAAE,CAAC;CAChD;AAWD,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAyB;IAChD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IACzC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IACzC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,SAAS,CAAoC;IACrD,OAAO,CAAC,aAAa,CAAiD;IACtE,OAAO,CAAC,SAAS,CAAoC;gBAEzC,OAAO,GAAE,sBAA2B;IAUhD,QAAQ,CAAC,OAAO,EAAE,iBAAiB,GAAG,IAAI;IAY1C,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAShC,YAAY,CAAC,OAAO,EAAE,qBAAqB,GAAG,SAAS,GAAG,IAAI;IAI9D,MAAM,CAAC,YAAY,EAAE,MAAM,GAAG,uBAAuB;IAgCrD,QAAQ,IAAI,uBAAuB;IA4BnC,OAAO,CAAC,YAAY;CAMrB"}
|