@aura3d/physics 1.5.2 → 2.0.1
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/dist/ArcadeCharacterController.d.ts +53 -0
- package/dist/ArcadeCharacterController.d.ts.map +1 -0
- package/dist/ArcadeCharacterController.js +98 -0
- package/dist/ArcadeCharacterController.js.map +1 -0
- package/dist/{VehicleDynamics.d.ts → ArcadeVehicleTelemetry.d.ts} +14 -4
- package/dist/ArcadeVehicleTelemetry.d.ts.map +1 -0
- package/dist/{VehicleDynamics.js → ArcadeVehicleTelemetry.js} +37 -9
- package/dist/ArcadeVehicleTelemetry.js.map +1 -0
- package/dist/Constraint.d.ts +20 -4
- package/dist/Constraint.d.ts.map +1 -1
- package/dist/Constraint.js +34 -60
- package/dist/Constraint.js.map +1 -1
- package/dist/FightingCharacterController.d.ts +32 -0
- package/dist/FightingCharacterController.d.ts.map +1 -0
- package/dist/FightingCharacterController.js +76 -0
- package/dist/FightingCharacterController.js.map +1 -0
- package/dist/MeshBVH.d.ts +72 -0
- package/dist/MeshBVH.d.ts.map +1 -0
- package/dist/MeshBVH.js +244 -0
- package/dist/MeshBVH.js.map +1 -0
- package/dist/PhysicsDebugDraw.d.ts +40 -1
- package/dist/PhysicsDebugDraw.d.ts.map +1 -1
- package/dist/PhysicsDebugDraw.js +87 -17
- package/dist/PhysicsDebugDraw.js.map +1 -1
- package/dist/PhysicsWorld.d.ts +37 -18
- package/dist/PhysicsWorld.d.ts.map +1 -1
- package/dist/PhysicsWorld.js +231 -630
- package/dist/PhysicsWorld.js.map +1 -1
- package/dist/Raycast.d.ts +11 -0
- package/dist/Raycast.d.ts.map +1 -1
- package/dist/Raycast.js +62 -8
- package/dist/Raycast.js.map +1 -1
- package/dist/RigidBody.d.ts +16 -9
- package/dist/RigidBody.d.ts.map +1 -1
- package/dist/RigidBody.js +23 -75
- package/dist/RigidBody.js.map +1 -1
- package/dist/SurfaceQuery.d.ts +72 -0
- package/dist/SurfaceQuery.d.ts.map +1 -0
- package/dist/SurfaceQuery.js +89 -0
- package/dist/SurfaceQuery.js.map +1 -0
- package/dist/index.d.ts +62 -17
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +70 -17
- package/dist/index.js.map +1 -1
- package/dist/solverless.d.ts +37 -0
- package/dist/solverless.d.ts.map +1 -0
- package/dist/solverless.js +36 -0
- package/dist/solverless.js.map +1 -0
- package/dist/world.d.ts +18 -0
- package/dist/world.d.ts.map +1 -0
- package/dist/world.js +17 -0
- package/dist/world.js.map +1 -0
- package/package.json +10 -2
- package/dist/CharacterController.d.ts +0 -83
- package/dist/CharacterController.d.ts.map +0 -1
- package/dist/CharacterController.js +0 -236
- package/dist/CharacterController.js.map +0 -1
- package/dist/ClothFixtures.d.ts +0 -87
- package/dist/ClothFixtures.d.ts.map +0 -1
- package/dist/ClothFixtures.js +0 -264
- package/dist/ClothFixtures.js.map +0 -1
- package/dist/Crowd.d.ts +0 -64
- package/dist/Crowd.d.ts.map +0 -1
- package/dist/Crowd.js +0 -209
- package/dist/Crowd.js.map +0 -1
- package/dist/FireSmokeFixtures.d.ts +0 -103
- package/dist/FireSmokeFixtures.d.ts.map +0 -1
- package/dist/FireSmokeFixtures.js +0 -271
- package/dist/FireSmokeFixtures.js.map +0 -1
- package/dist/FluidFixtures.d.ts +0 -75
- package/dist/FluidFixtures.d.ts.map +0 -1
- package/dist/FluidFixtures.js +0 -219
- package/dist/FluidFixtures.js.map +0 -1
- package/dist/FractureFixtures.d.ts +0 -68
- package/dist/FractureFixtures.d.ts.map +0 -1
- package/dist/FractureFixtures.js +0 -199
- package/dist/FractureFixtures.js.map +0 -1
- package/dist/NarrowPhase.d.ts +0 -11
- package/dist/NarrowPhase.d.ts.map +0 -1
- package/dist/NarrowPhase.js +0 -565
- package/dist/NarrowPhase.js.map +0 -1
- package/dist/Navigation.d.ts +0 -67
- package/dist/Navigation.d.ts.map +0 -1
- package/dist/Navigation.js +0 -261
- package/dist/Navigation.js.map +0 -1
- package/dist/PhysicsSandboxFixtures.d.ts +0 -53
- package/dist/PhysicsSandboxFixtures.d.ts.map +0 -1
- package/dist/PhysicsSandboxFixtures.js +0 -280
- package/dist/PhysicsSandboxFixtures.js.map +0 -1
- package/dist/PlatformerFixtures.d.ts +0 -70
- package/dist/PlatformerFixtures.d.ts.map +0 -1
- package/dist/PlatformerFixtures.js +0 -120
- package/dist/PlatformerFixtures.js.map +0 -1
- package/dist/SoftBodyFixtures.d.ts +0 -70
- package/dist/SoftBodyFixtures.d.ts.map +0 -1
- package/dist/SoftBodyFixtures.js +0 -272
- package/dist/SoftBodyFixtures.js.map +0 -1
- package/dist/Steering.d.ts +0 -161
- package/dist/Steering.d.ts.map +0 -1
- package/dist/Steering.js +0 -347
- package/dist/Steering.js.map +0 -1
- package/dist/VehicleDynamics.d.ts.map +0 -1
- package/dist/VehicleDynamics.js.map +0 -1
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import type { Collider } from "./Collider.js";
|
|
2
|
+
import { KinematicBody } from "./KinematicBody.js";
|
|
3
|
+
import type { PhysicsWorld } from "./PhysicsWorld.js";
|
|
4
|
+
import type { RigidBody } from "./RigidBody.js";
|
|
5
|
+
import { type Vec3 } from "./Shape.js";
|
|
6
|
+
export interface ArcadeCharacterControllerDescriptor {
|
|
7
|
+
readonly position?: Vec3;
|
|
8
|
+
readonly radius?: number;
|
|
9
|
+
readonly halfHeight?: number;
|
|
10
|
+
readonly maxSpeed?: number;
|
|
11
|
+
readonly acceleration?: number;
|
|
12
|
+
readonly jumpSpeed?: number;
|
|
13
|
+
readonly gravity?: number;
|
|
14
|
+
readonly groundY?: number;
|
|
15
|
+
}
|
|
16
|
+
export interface ArcadeCharacterControllerState {
|
|
17
|
+
readonly grounded: boolean;
|
|
18
|
+
readonly groundNormal: Vec3;
|
|
19
|
+
readonly groundColliderId: number | null;
|
|
20
|
+
readonly desiredVelocity: Vec3;
|
|
21
|
+
readonly velocity: Vec3;
|
|
22
|
+
readonly speed: number;
|
|
23
|
+
readonly jumpedThisFrame: boolean;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Authored-unit deterministic movement with a kinematic trigger proxy.
|
|
27
|
+
*
|
|
28
|
+
* This is deliberately not a rigid-body character controller. Physical slope,
|
|
29
|
+
* step, contact, and depenetration ownership belongs to the selected optional
|
|
30
|
+
* Rapier adapter. The proxy exists so arcade routes can reuse trigger/raycast
|
|
31
|
+
* plumbing without importing or pretending to be physical simulation.
|
|
32
|
+
*/
|
|
33
|
+
export declare class ArcadeCharacterController {
|
|
34
|
+
#private;
|
|
35
|
+
readonly body: RigidBody;
|
|
36
|
+
readonly collider: Collider;
|
|
37
|
+
readonly radius: number;
|
|
38
|
+
readonly halfHeight: number;
|
|
39
|
+
readonly maxSpeed: number;
|
|
40
|
+
readonly acceleration: number;
|
|
41
|
+
readonly jumpSpeed: number;
|
|
42
|
+
readonly motion: KinematicBody;
|
|
43
|
+
constructor(world: PhysicsWorld, descriptor?: ArcadeCharacterControllerDescriptor);
|
|
44
|
+
setMoveInput(input: {
|
|
45
|
+
readonly x: number;
|
|
46
|
+
readonly z?: number;
|
|
47
|
+
}): void;
|
|
48
|
+
jump(): void;
|
|
49
|
+
teleport(position: Vec3): void;
|
|
50
|
+
step(dt: number): ArcadeCharacterControllerState;
|
|
51
|
+
snapshot(): ArcadeCharacterControllerState;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=ArcadeCharacterController.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ArcadeCharacterController.d.ts","sourceRoot":"","sources":["../../../../packages/physics/src/ArcadeCharacterController.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,aAAa,EAA8B,MAAM,oBAAoB,CAAC;AAC/E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAS,KAAK,IAAI,EAAE,MAAM,YAAY,CAAC;AAE9C,MAAM,WAAW,mCAAmC;IAClD,QAAQ,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,YAAY,EAAE,IAAI,CAAC;IAC5B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IACzC,QAAQ,CAAC,eAAe,EAAE,IAAI,CAAC;IAC/B,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;CACnC;AAED;;;;;;;GAOG;AACH,qBAAa,yBAAyB;;IACpC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;gBAGnB,KAAK,EAAE,YAAY,EAAE,UAAU,GAAE,mCAAwC;IA4BrF,YAAY,CAAC,KAAK,EAAE;QAAE,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAItE,IAAI,IAAI,IAAI;IAKZ,QAAQ,CAAC,QAAQ,EAAE,IAAI,GAAG,IAAI;IAQ9B,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,8BAA8B;IAShD,QAAQ,IAAI,8BAA8B;CAQ3C"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { KinematicBody } from "./KinematicBody.js";
|
|
2
|
+
import { Shape } from "./Shape.js";
|
|
3
|
+
/**
|
|
4
|
+
* Authored-unit deterministic movement with a kinematic trigger proxy.
|
|
5
|
+
*
|
|
6
|
+
* This is deliberately not a rigid-body character controller. Physical slope,
|
|
7
|
+
* step, contact, and depenetration ownership belongs to the selected optional
|
|
8
|
+
* Rapier adapter. The proxy exists so arcade routes can reuse trigger/raycast
|
|
9
|
+
* plumbing without importing or pretending to be physical simulation.
|
|
10
|
+
*/
|
|
11
|
+
export class ArcadeCharacterController {
|
|
12
|
+
body;
|
|
13
|
+
collider;
|
|
14
|
+
radius;
|
|
15
|
+
halfHeight;
|
|
16
|
+
maxSpeed;
|
|
17
|
+
acceleration;
|
|
18
|
+
jumpSpeed;
|
|
19
|
+
motion;
|
|
20
|
+
#jumpQueued = false;
|
|
21
|
+
constructor(world, descriptor = {}) {
|
|
22
|
+
this.radius = positive(descriptor.radius ?? 0.24, "arcade character radius");
|
|
23
|
+
this.halfHeight = positive(descriptor.halfHeight ?? 0.38, "arcade character halfHeight");
|
|
24
|
+
this.maxSpeed = positive(descriptor.maxSpeed ?? 3.5, "arcade character maxSpeed");
|
|
25
|
+
this.acceleration = positive(descriptor.acceleration ?? 32, "arcade character acceleration");
|
|
26
|
+
this.jumpSpeed = positive(descriptor.jumpSpeed ?? 4.2, "arcade character jumpSpeed");
|
|
27
|
+
const position = descriptor.position ?? [0, this.halfHeight + this.radius, 0];
|
|
28
|
+
const groundY = descriptor.groundY ?? position[1] - this.halfHeight - this.radius;
|
|
29
|
+
this.motion = new KinematicBody({
|
|
30
|
+
id: "arcade-character",
|
|
31
|
+
position,
|
|
32
|
+
halfExtents: [this.radius, this.halfHeight + this.radius, this.radius],
|
|
33
|
+
maxSpeed: this.maxSpeed,
|
|
34
|
+
acceleration: this.acceleration,
|
|
35
|
+
airAcceleration: this.acceleration * 0.65,
|
|
36
|
+
jumpSpeed: this.jumpSpeed,
|
|
37
|
+
gravity: descriptor.gravity ?? 9.81,
|
|
38
|
+
groundY,
|
|
39
|
+
groundSnapDistance: 0.08,
|
|
40
|
+
lockDepth: false
|
|
41
|
+
});
|
|
42
|
+
this.body = world.createRigidBody({ type: "kinematic", position });
|
|
43
|
+
this.collider = world.createCollider(this.body, {
|
|
44
|
+
shape: Shape.capsule(this.radius, this.halfHeight),
|
|
45
|
+
sensor: true
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
setMoveInput(input) {
|
|
49
|
+
this.motion.setMoveInput({ x: finiteOrZero(input.x), z: finiteOrZero(input.z ?? 0) });
|
|
50
|
+
}
|
|
51
|
+
jump() {
|
|
52
|
+
this.#jumpQueued = true;
|
|
53
|
+
this.motion.jump();
|
|
54
|
+
}
|
|
55
|
+
teleport(position) {
|
|
56
|
+
this.motion.position = [...position];
|
|
57
|
+
this.motion.previousPosition = [...position];
|
|
58
|
+
this.motion.velocity = [0, 0, 0];
|
|
59
|
+
this.motion.grounded = false;
|
|
60
|
+
this.#syncProxy();
|
|
61
|
+
}
|
|
62
|
+
step(dt) {
|
|
63
|
+
const events = this.motion.step(dt);
|
|
64
|
+
this.#syncProxy();
|
|
65
|
+
const snapshot = this.motion.snapshot();
|
|
66
|
+
const jumpedThisFrame = this.#jumpQueued && events.some((event) => event.type === "jump");
|
|
67
|
+
this.#jumpQueued = false;
|
|
68
|
+
return stateFromSnapshot(snapshot, jumpedThisFrame);
|
|
69
|
+
}
|
|
70
|
+
snapshot() {
|
|
71
|
+
return stateFromSnapshot(this.motion.snapshot(), false);
|
|
72
|
+
}
|
|
73
|
+
#syncProxy() {
|
|
74
|
+
this.body.setPosition(this.motion.position);
|
|
75
|
+
this.body.setVelocity([0, 0, 0]);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
function stateFromSnapshot(snapshot, jumpedThisFrame) {
|
|
79
|
+
const speed = Math.hypot(snapshot.velocity[0], snapshot.velocity[2]);
|
|
80
|
+
return {
|
|
81
|
+
grounded: snapshot.grounded,
|
|
82
|
+
groundNormal: [0, 1, 0],
|
|
83
|
+
groundColliderId: null,
|
|
84
|
+
desiredVelocity: [snapshot.moveInput[0] * speed, snapshot.velocity[1], snapshot.moveInput[2] * speed],
|
|
85
|
+
velocity: snapshot.velocity,
|
|
86
|
+
speed,
|
|
87
|
+
jumpedThisFrame
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
function positive(value, label) {
|
|
91
|
+
if (!Number.isFinite(value) || value <= 0)
|
|
92
|
+
throw new RangeError(`${label} must be finite and positive.`);
|
|
93
|
+
return value;
|
|
94
|
+
}
|
|
95
|
+
function finiteOrZero(value) {
|
|
96
|
+
return Number.isFinite(value) ? value : 0;
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=ArcadeCharacterController.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ArcadeCharacterController.js","sourceRoot":"","sources":["../../../../packages/physics/src/ArcadeCharacterController.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export interface
|
|
1
|
+
export interface ArcadeVehicleTelemetryInput {
|
|
2
2
|
readonly elapsedSeconds: number;
|
|
3
3
|
readonly throttle?: number;
|
|
4
4
|
readonly brake?: number;
|
|
@@ -11,7 +11,7 @@ export interface ArcadeVehicleDynamicsInput {
|
|
|
11
11
|
readonly gripFactor?: number;
|
|
12
12
|
readonly driftFactor?: number;
|
|
13
13
|
}
|
|
14
|
-
export interface
|
|
14
|
+
export interface ArcadeVehicleTelemetrySample {
|
|
15
15
|
readonly speedKph: number;
|
|
16
16
|
readonly rpm: number;
|
|
17
17
|
readonly nitro: number;
|
|
@@ -143,10 +143,20 @@ export interface VehicleDamageSample {
|
|
|
143
143
|
readonly visualDamageLevel: "none" | "scratched" | "dented" | "critical";
|
|
144
144
|
readonly disabled: boolean;
|
|
145
145
|
}
|
|
146
|
-
export declare function
|
|
146
|
+
export declare function sampleArcadeVehicleTelemetry(input: ArcadeVehicleTelemetryInput): ArcadeVehicleTelemetrySample;
|
|
147
147
|
export declare function sampleVehicleDamage(input: VehicleDamageInput): VehicleDamageSample;
|
|
148
148
|
export declare function sampleVehicleEffectEmitters(input: VehicleEffectEmitterInput): VehicleEffectEmitterSample;
|
|
149
149
|
export declare function sampleVehicleDrivetrain(input: VehicleDrivetrainInput): VehicleDrivetrainSample;
|
|
150
150
|
export declare function sampleRacingAiDriver(input: RacingAiDriverInput): RacingAiDriverSample;
|
|
151
|
+
/**
|
|
152
|
+
* Peak lateral cornering stiffness of a tyre preset, per newton of vertical load.
|
|
153
|
+
*
|
|
154
|
+
* This is the initial slope of the Magic Formula lateral curve, `d * c * b`, in units of
|
|
155
|
+
* force per radian of slip per newton of load. An integrator needs it to size a stable
|
|
156
|
+
* timestep: the tyre is the stiffest spring in a vehicle model, so it sets the step, and
|
|
157
|
+
* assuming a fixed 1/60 s regardless of tyre, mass and wheelbase is what let the vehicle
|
|
158
|
+
* integrator go unstable and produce yaw opposing its own steering input.
|
|
159
|
+
*/
|
|
160
|
+
export declare function tirePeakCorneringStiffness(tire: PacejkaTireCoefficients | PacejkaTirePreset): number;
|
|
151
161
|
export declare function samplePacejkaTireForces(input: PacejkaTireForceInput): PacejkaTireForceSample;
|
|
152
|
-
//# sourceMappingURL=
|
|
162
|
+
//# sourceMappingURL=ArcadeVehicleTelemetry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ArcadeVehicleTelemetry.d.ts","sourceRoot":"","sources":["../../../../packages/physics/src/ArcadeVehicleTelemetry.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,qBAAqB,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;CAC3E;AAED,MAAM,MAAM,iBAAiB,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,CAAC;AAC1E,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,CAAC;AAC5D,MAAM,MAAM,sBAAsB,GAAG,MAAM,GAAG,cAAc,GAAG,QAAQ,GAAG,YAAY,CAAC;AAEvF,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;IACtC,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,YAAY,CAAC,EAAE,uBAAuB,GAAG,iBAAiB,CAAC;IACpE,QAAQ,CAAC,OAAO,CAAC,EAAE,uBAAuB,GAAG,iBAAiB,CAAC;CAChE;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,MAAM,EAAE;QACf,QAAQ,CAAC,YAAY,EAAE,iBAAiB,GAAG,QAAQ,CAAC;QACpD,QAAQ,CAAC,OAAO,EAAE,iBAAiB,GAAG,QAAQ,CAAC;KAChD,CAAC;CACH;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,UAAU,CAAC,EAAE,kBAAkB,CAAC;IACzC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;IACjC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;CACpC;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,UAAU,EAAE,kBAAkB,CAAC;IACxC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;CAClC;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACxC,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,YAAY,CAAC,EAAE,sBAAsB,CAAC;IAC/C,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,oBAAoB,CAAC,EAAE,MAAM,CAAC;CACxC;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,WAAW,CAAC;IACtD,QAAQ,CAAC,YAAY,EAAE,sBAAsB,CAAC;CAC/C;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,aAAa,CAAC,EAAE,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;CACxE;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,cAAc,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACnE,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC;IACvC,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,WAAW,GAAG,kBAAkB,GAAG,kBAAkB,CAAC;CACtF;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,iBAAiB,EAAE,MAAM,GAAG,WAAW,GAAG,QAAQ,GAAG,UAAU,CAAC;IACzE,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;CAC5B;AAED,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,2BAA2B,GAAG,4BAA4B,CAoC7G;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,kBAAkB,GAAG,mBAAmB,CAelF;AAED,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,yBAAyB,GAAG,0BAA0B,CA0BxG;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,sBAAsB,GAAG,uBAAuB,CAuD9F;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,mBAAmB,GAAG,oBAAoB,CAgCrF;AAED;;;;;;;;GAQG;AACH,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,uBAAuB,GAAG,iBAAiB,GAAG,MAAM,CAGpG;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,qBAAqB,GAAG,sBAAsB,CAoE5F"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export function
|
|
1
|
+
export function sampleArcadeVehicleTelemetry(input) {
|
|
2
2
|
const elapsed = finiteNonNegative(input.elapsedSeconds, "elapsedSeconds");
|
|
3
3
|
const throttle = clamp(input.throttle ?? 1, -1, 1);
|
|
4
4
|
const brake = clamp(input.brake ?? 0, 0, 1);
|
|
@@ -167,6 +167,19 @@ export function sampleRacingAiDriver(input) {
|
|
|
167
167
|
rubberbandBoost: Number(rubberbandBoost.toFixed(4))
|
|
168
168
|
};
|
|
169
169
|
}
|
|
170
|
+
/**
|
|
171
|
+
* Peak lateral cornering stiffness of a tyre preset, per newton of vertical load.
|
|
172
|
+
*
|
|
173
|
+
* This is the initial slope of the Magic Formula lateral curve, `d * c * b`, in units of
|
|
174
|
+
* force per radian of slip per newton of load. An integrator needs it to size a stable
|
|
175
|
+
* timestep: the tyre is the stiffest spring in a vehicle model, so it sets the step, and
|
|
176
|
+
* assuming a fixed 1/60 s regardless of tyre, mass and wheelbase is what let the vehicle
|
|
177
|
+
* integrator go unstable and produce yaw opposing its own steering input.
|
|
178
|
+
*/
|
|
179
|
+
export function tirePeakCorneringStiffness(tire) {
|
|
180
|
+
const { value } = coefficients(tire);
|
|
181
|
+
return value.d * value.c * value.b;
|
|
182
|
+
}
|
|
170
183
|
export function samplePacejkaTireForces(input) {
|
|
171
184
|
const normalForce = finiteNonNegative(input.normalForce, "normalForce");
|
|
172
185
|
const longitudinalVelocity = finite(input.longitudinalVelocity, "longitudinalVelocity");
|
|
@@ -200,14 +213,28 @@ export function samplePacejkaTireForces(input) {
|
|
|
200
213
|
const camberGrip = clamp(1 - Math.abs(camberAngle) * 0.1, 0.75, 1.08);
|
|
201
214
|
const longitudinalPure = pacejka(slipRatio, longitudinal.value) * normalForce * loadFactor * camberGrip
|
|
202
215
|
- Math.sign(longitudinalVelocity) * normalForce * rollingResistance;
|
|
203
|
-
|
|
216
|
+
/*
|
|
217
|
+
* Slip angle stays in radians.
|
|
218
|
+
*
|
|
219
|
+
* The lateral presets use stiffness factors around b=10..14, which is the radian
|
|
220
|
+
* convention for the Magic Formula. (The degree convention runs b=0.2..0.3.) Feeding
|
|
221
|
+
* degrees into radian coefficients moved the grip peak from ~6.9 degrees of slip to
|
|
222
|
+
* ~0.08 degrees, so every physically real cornering slip angle landed far down the
|
|
223
|
+
* falloff: at 19 degrees of slip the model returned mu=0.20 instead of mu=1.21.
|
|
224
|
+
*
|
|
225
|
+
* A tyre that loses 85% of its grip the instant it is asked to corner cannot hold a
|
|
226
|
+
* line, and it makes tiny near-zero slip angles produce enormous force swings, which
|
|
227
|
+
* showed up as yaw-rate chatter. Verified in `tyre-slip-curve.test.ts`.
|
|
228
|
+
*/
|
|
229
|
+
const lateralPure = pacejka(slipAngle, lateral.value) * normalForce * loadFactor * clamp(1 + camberAngle * 0.1, 0.75, 1.15);
|
|
204
230
|
const slipMagnitude = Math.hypot(Math.abs(slipRatio), Math.abs(slipAngle));
|
|
205
231
|
const longitudinalScale = slipMagnitude < 0.001 ? 1 : Math.sqrt(Math.max(0, 1 - Math.pow((Math.abs(slipAngle) / slipMagnitude) * 0.9, 2)));
|
|
206
232
|
const lateralScale = slipMagnitude < 0.001 ? 1 : Math.sqrt(Math.max(0, 1 - Math.pow((Math.abs(slipRatio) / slipMagnitude) * 0.9, 2)));
|
|
207
233
|
const longitudinalForce = longitudinalPure * longitudinalScale;
|
|
208
234
|
const lateralForce = lateralPure * lateralScale;
|
|
209
235
|
const pneumaticTrail = width * 0.5;
|
|
210
|
-
|
|
236
|
+
// Pneumatic trail collapses as the tyre saturates; 20 degrees expressed in radians.
|
|
237
|
+
const torqueCoeff = -pneumaticTrail * clamp(1 - Math.abs(slipAngle) / (20 * Math.PI / 180), 0, 1);
|
|
211
238
|
const aligningTorque = clamp(lateralForce * torqueCoeff, -normalForce * width, normalForce * width);
|
|
212
239
|
return {
|
|
213
240
|
longitudinalForce: Number(longitudinalForce.toFixed(3)),
|
|
@@ -223,7 +250,7 @@ export function samplePacejkaTireForces(input) {
|
|
|
223
250
|
}
|
|
224
251
|
function validateGearRatios(values) {
|
|
225
252
|
if (values.length === 0) {
|
|
226
|
-
throw new RangeError("
|
|
253
|
+
throw new RangeError("Arcade vehicle telemetry gearRatios must contain at least one ratio.");
|
|
227
254
|
}
|
|
228
255
|
return values.map((value, index) => positive(value, `gearRatios[${index}]`));
|
|
229
256
|
}
|
|
@@ -277,19 +304,19 @@ function suspensionFor(steer, speedRatio, driftSlip) {
|
|
|
277
304
|
}
|
|
278
305
|
function finite(value, label) {
|
|
279
306
|
if (!Number.isFinite(value)) {
|
|
280
|
-
throw new RangeError(`
|
|
307
|
+
throw new RangeError(`Arcade vehicle telemetry ${label} must be finite.`);
|
|
281
308
|
}
|
|
282
309
|
return value;
|
|
283
310
|
}
|
|
284
311
|
function finiteNonNegative(value, label) {
|
|
285
312
|
if (!Number.isFinite(value) || value < 0) {
|
|
286
|
-
throw new RangeError(`
|
|
313
|
+
throw new RangeError(`Arcade vehicle telemetry ${label} must be finite and non-negative.`);
|
|
287
314
|
}
|
|
288
315
|
return value;
|
|
289
316
|
}
|
|
290
317
|
function positive(value, label) {
|
|
291
318
|
if (!Number.isFinite(value) || value <= 0) {
|
|
292
|
-
throw new RangeError(`
|
|
319
|
+
throw new RangeError(`Arcade vehicle telemetry ${label} must be finite and positive.`);
|
|
293
320
|
}
|
|
294
321
|
return value;
|
|
295
322
|
}
|
|
@@ -327,9 +354,10 @@ function optimalSlipRatio(coeff) {
|
|
|
327
354
|
return Math.min(Math.tan(Math.PI / (2 * coeff.c)) / coeff.b, 0.2);
|
|
328
355
|
}
|
|
329
356
|
function optimalSlipAngle(coeff) {
|
|
330
|
-
|
|
357
|
+
// Radians, matching the units the lateral curve is now evaluated in.
|
|
358
|
+
return Math.min(Math.tan(Math.PI / (2 * coeff.c)) / coeff.b, 0.3);
|
|
331
359
|
}
|
|
332
360
|
function clamp(value, min, max) {
|
|
333
361
|
return Math.max(min, Math.min(max, value));
|
|
334
362
|
}
|
|
335
|
-
//# sourceMappingURL=
|
|
363
|
+
//# sourceMappingURL=ArcadeVehicleTelemetry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ArcadeVehicleTelemetry.js","sourceRoot":"","sources":["../../../../packages/physics/src/ArcadeVehicleTelemetry.ts"],"names":[],"mappings":"AA+JA,MAAM,UAAU,4BAA4B,CAAC,KAAkC;IAC7E,MAAM,OAAO,GAAG,iBAAiB,CAAC,KAAK,CAAC,cAAc,EAAE,gBAAgB,CAAC,CAAC;IAC1E,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,QAAQ,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACnD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5C,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC7C,MAAM,WAAW,GAAG,QAAQ,CAAC,KAAK,CAAC,WAAW,IAAI,GAAG,EAAE,aAAa,CAAC,CAAC;IACtE,MAAM,YAAY,GAAG,QAAQ,CAAC,KAAK,CAAC,YAAY,IAAI,GAAG,EAAE,cAAc,CAAC,CAAC;IACzE,MAAM,UAAU,GAAG,QAAQ,CAAC,KAAK,CAAC,UAAU,IAAI,EAAE,EAAE,YAAY,CAAC,CAAC;IAClE,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,UAAU,IAAI,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACzD,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,WAAW,IAAI,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC3D,MAAM,WAAW,GAAG,WAAW,GAAG,GAAG,CAAC;IACtC,MAAM,iBAAiB,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,GAAG,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC;IAC3F,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,UAAU,GAAG,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;IACjF,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,GAAG,OAAO,GAAG,IAAI,CAAC,CAAC;IACzD,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,KAAK,IAAI,IAAI,cAAc,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACzE,MAAM,cAAc,GAAG,KAAK,CAAC,CAAC,WAAW,GAAG,iBAAiB,GAAG,QAAQ,GAAG,UAAU,CAAC,GAAG,OAAO,EAAE,CAAC,WAAW,GAAG,IAAI,EAAE,WAAW,GAAG,UAAU,CAAC,CAAC;IACjJ,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,GAAG,WAAW,CAAC,CAAC;IACvE,MAAM,mBAAmB,GAAG,CAAC,GAAG,UAAU,GAAG,IAAI,CAAC;IAClD,MAAM,UAAU,GAAG,KAAK,GAAG,IAAI,GAAG,mBAAmB,CAAC;IACtD,MAAM,aAAa,GAAG,KAAK,CAAC,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,WAAW,GAAG,CAAC,IAAI,GAAG,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9F,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,UAAU,GAAG,CAAC,CAAC,GAAG,UAAU,CAAC,GAAG,IAAI,CAAC;IAC5E,MAAM,SAAS,GAAG,KAAK,CAAC,aAAa,GAAG,YAAY,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5D,MAAM,IAAI,GAAG,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,GAAG,SAAS,GAAG,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9D,MAAM,GAAG,GAAG,IAAI,GAAG,UAAU,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,GAAG,GAAG,CAAC;IAC1F,MAAM,SAAS,GAAG,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,GAAG,SAAS,GAAG,GAAG,CAAC,CAAC;IAC7E,MAAM,qBAAqB,GAAG,aAAa,CAAC,KAAK,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;IAC1E,OAAO;QACL,QAAQ,EAAE,MAAM,CAAC,CAAC,cAAc,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACnD,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC3B,KAAK,EAAE,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACxC,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACzC,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACvC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC7B,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACvC,qBAAqB;KACtB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAAyB;IAC3D,MAAM,MAAM,GAAG,KAAK,CAAC,iBAAiB,CAAC,KAAK,CAAC,MAAM,IAAI,GAAG,EAAE,QAAQ,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;IAC/E,MAAM,cAAc,GAAG,iBAAiB,CAAC,KAAK,CAAC,cAAc,IAAI,CAAC,EAAE,gBAAgB,CAAC,CAAC;IACtF,MAAM,iBAAiB,GAAG,KAAK,CAAC,KAAK,CAAC,iBAAiB,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACpE,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;IAChD,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,cAAc,GAAG,EAAE,CAAC,GAAG,IAAI,GAAG,iBAAiB,CAAC,CAAC;IACnF,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,GAAG,YAAY,GAAG,MAAM,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;IACjE,MAAM,MAAM,GAAG,GAAG,GAAG,UAAU,CAAC;IAChC,OAAO;QACL,MAAM,EAAE,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACrC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACjC,YAAY,EAAE,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC7C,iBAAiB,EAAE,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM;QAC1G,QAAQ,EAAE,UAAU,IAAI,CAAC;KAC1B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,KAAgC;IAC1E,MAAM,QAAQ,GAAG,iBAAiB,CAAC,KAAK,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IAC/D,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,QAAQ,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACnD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC7C,MAAM,aAAa,GAAG,KAAK,CAAC,aAAa,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACtE,MAAM,WAAW,GAAG,KAAK,CAAC,SAAS,KAAK,IAAI;QAC1C,CAAC,CAAC,WAAW;QACb,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,GAAG,IAAI,QAAQ,GAAG,EAAE;YACzC,CAAC,CAAC,kBAAkB;YACpB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,QAAQ,GAAG,EAAE;gBACtC,CAAC,CAAC,kBAAkB;gBACpB,CAAC,CAAC,MAAM,CAAC;IACf,MAAM,aAAa,GAAG,WAAW,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,KAAK,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,KAAK,kBAAkB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACnI,MAAM,cAAc,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE;QAC3D,MAAM,QAAQ,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;QAC1C,OAAO,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,aAAa,GAAG,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACtE,CAAC,CAAqC,CAAC;IACvC,MAAM,cAAc,GAAG,KAAK,CAAC,WAAW,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3G,MAAM,kBAAkB,GAAG,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IAClG,OAAO;QACL,cAAc;QACd,kBAAkB;QAClB,cAAc;QACd,qBAAqB,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACtG,WAAW;KACZ,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,KAA6B;IACnE,MAAM,QAAQ,GAAG,iBAAiB,CAAC,KAAK,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IAC/D,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,QAAQ,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAClD,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9C,MAAM,UAAU,GAAG,kBAAkB,CAAC,KAAK,CAAC,UAAU,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;IAChG,MAAM,eAAe,GAAG,QAAQ,CAAC,KAAK,CAAC,eAAe,IAAI,IAAI,EAAE,iBAAiB,CAAC,CAAC;IACnF,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,OAAO,IAAI,GAAG,EAAE,SAAS,CAAC,CAAC;IAC1D,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,MAAM,IAAI,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC/E,MAAM,UAAU,GAAG,QAAQ,CAAC,KAAK,CAAC,UAAU,IAAI,GAAG,EAAE,YAAY,CAAC,CAAC;IACnE,MAAM,aAAa,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,aAAa,IAAI,IAAI,EAAE,eAAe,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IACrG,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,UAAU,IAAI,MAAM,GAAG,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IAC7E,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC,YAAY,IAAI,aAAa,GAAG,IAAI,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;IAC5F,MAAM,YAAY,GAAG,KAAK,CAAC,YAAY,IAAI,cAAc,CAAC;IAC1D,MAAM,cAAc,GAAG,KAAK,CAAC,KAAK,CAAC,cAAc,IAAI,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACjE,MAAM,aAAa,GAAG,KAAK,CAAC,KAAK,CAAC,aAAa,IAAI,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/D,MAAM,eAAe,GAAG,QAAQ,CAAC,KAAK,CAAC,eAAe,IAAI,IAAI,EAAE,iBAAiB,CAAC,CAAC;IACnF,MAAM,WAAW,GAAG,QAAQ,CAAC,KAAK,CAAC,WAAW,IAAI,GAAG,EAAE,aAAa,CAAC,CAAC;IACtE,MAAM,oBAAoB,GAAG,iBAAiB,CAAC,KAAK,CAAC,oBAAoB,IAAI,IAAI,EAAE,sBAAsB,CAAC,CAAC;IAC3G,MAAM,QAAQ,GAAG,QAAQ,GAAG,GAAG,CAAC;IAChC,MAAM,WAAW,GAAG,IAAI,CAAC;IACzB,MAAM,QAAQ,GAAG,QAAQ,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,GAAG,WAAW,CAAC,CAAC,GAAG,EAAE,CAAC;IACnF,MAAM,QAAQ,GAAG,mBAAmB,CAAC,UAAU,EAAE,QAAQ,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC;IACvH,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,QAAQ,GAAG,QAAQ,CAAC,KAAK,GAAG,eAAe,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IACzG,MAAM,YAAY,GAAG,cAAc,CAAC,SAAS,EAAE,UAAU,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,CAAC,GAAG,QAAQ,CAAC;IACtG,MAAM,sBAAsB,GAAG,YAAY,KAAK,MAAM;QACpD,CAAC,CAAC,IAAI;QACN,CAAC,CAAC,YAAY,KAAK,cAAc;YAC/B,CAAC,CAAC,IAAI,GAAG,aAAa,GAAG,KAAK;YAC9B,CAAC,CAAC,YAAY,KAAK,QAAQ;gBACzB,CAAC,CAAC,IAAI,GAAG,aAAa,GAAG,IAAI;gBAC7B,CAAC,CAAC,IAAI,GAAG,aAAa,GAAG,IAAI,CAAC;IACpC,MAAM,WAAW,GAAG,YAAY,GAAG,QAAQ,CAAC,KAAK,GAAG,eAAe,GAAG,MAAM,GAAG,sBAAsB,CAAC;IACtG,MAAM,UAAU,GAAG,YAAY,KAAK,MAAM;QACxC,CAAC,CAAC,CAAC;QACH,CAAC,CAAC,YAAY,KAAK,cAAc;YAC/B,CAAC,CAAC,aAAa,GAAG,IAAI;YACtB,CAAC,CAAC,YAAY,KAAK,QAAQ;gBACzB,CAAC,CAAC,aAAa,GAAG,IAAI;gBACtB,CAAC,CAAC,aAAa,GAAG,IAAI,CAAC;IAC7B,MAAM,UAAU,GAAG,KAAK,CAAC,cAAc,GAAG,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5D,MAAM,SAAS,GAAG,GAAG,GAAG,KAAK,GAAG,eAAe,GAAG,WAAW,GAAG,QAAQ,GAAG,QAAQ,CAAC;IACpF,MAAM,SAAS,GAAG,GAAG,GAAG,KAAK,GAAG,oBAAoB,GAAG,WAAW,GAAG,QAAQ,GAAG,QAAQ,CAAC;IACzF,OAAO;QACL,IAAI,EAAE,QAAQ,CAAC,IAAI;QACnB,SAAS,EAAE,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC5C,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACvC,YAAY,EAAE,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC7C,WAAW,EAAE,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC3C,WAAW,EAAE,MAAM,CAAC,CAAC,WAAW,GAAG,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC1D,UAAU,EAAE,MAAM,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC/D,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACvC,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACvC,UAAU,EAAE,QAAQ,CAAC,UAAU;QAC/B,YAAY;KACb,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,KAA0B;IAC7D,MAAM,OAAO,GAAG,iBAAiB,CAAC,KAAK,CAAC,cAAc,EAAE,gBAAgB,CAAC,CAAC;IAC1E,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,UAAU,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACjE,MAAM,QAAQ,GAAG,iBAAiB,CAAC,KAAK,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IAC/D,MAAM,cAAc,GAAG,QAAQ,CAAC,KAAK,CAAC,cAAc,IAAI,GAAG,EAAE,gBAAgB,CAAC,CAAC;IAC/E,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,cAAc,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC1D,MAAM,gBAAgB,GAAG,KAAK,CAAC,gBAAgB,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC,iBAAiB,CAAC,KAAK,CAAC,gBAAgB,EAAE,kBAAkB,CAAC,CAAC;IACzJ,MAAM,gBAAgB,GAAG,MAAM,CAAC,KAAK,CAAC,gBAAgB,IAAI,CAAC,EAAE,kBAAkB,CAAC,CAAC;IACjF,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,IAAI,QAAQ,CAAC;IAChD,MAAM,QAAQ,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC;IAC9C,MAAM,eAAe,GAAG,KAAK,CAAC,CAAC,CAAC,gBAAgB,CAAC,GAAG,QAAQ,CAAC,kBAAkB,GAAG,IAAI,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACrG,MAAM,YAAY,GAAG,cAAc,GAAG,QAAQ,CAAC,iBAAiB,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,eAAe,CAAC,CAAC;IAC5H,MAAM,UAAU,GAAG,YAAY,GAAG,QAAQ,CAAC;IAC3C,MAAM,UAAU,GAAG,KAAK,CAAC,aAAa,KAAK,IAAI,IAAI,gBAAgB,GAAG,EAAE,IAAI,QAAQ,CAAC,cAAc,IAAI,IAAI,CAAC;IAC5G,MAAM,iBAAiB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,GAAG,OAAO,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5F,MAAM,cAAc,GAAG,UAAU,CAAC,CAAC,CAAC,iBAAiB,GAAG,CAAC,IAAI,GAAG,QAAQ,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpG,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,IAAI,GAAG,SAAS,GAAG,IAAI,CAAC;IACnF,MAAM,QAAQ,GAAG,eAAe,GAAG,cAAc,CAAC;IAClD,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/D,OAAO;QACL,UAAU;QACV,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,UAAU,GAAG,EAAE,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC/D,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,UAAU,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACpF,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC/B,cAAc,EAAE,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC/C,iBAAiB,EAAE,MAAM,CAAC,CAAC,EAAE,GAAG,QAAQ,GAAG,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAClF,YAAY,EAAE,QAAQ,CAAC,YAAY;QACnC,cAAc,EAAE,QAAQ,CAAC,cAAc;QACvC,UAAU;QACV,cAAc,EAAE,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACjD,eAAe,EAAE,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;KACpD,CAAC;AACJ,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,0BAA0B,CAAC,IAAiD;IAC1F,MAAM,EAAE,KAAK,EAAE,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IACrC,OAAO,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,KAA4B;IAClE,MAAM,WAAW,GAAG,iBAAiB,CAAC,KAAK,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;IACxE,MAAM,oBAAoB,GAAG,MAAM,CAAC,KAAK,CAAC,oBAAoB,EAAE,sBAAsB,CAAC,CAAC;IACxF,MAAM,eAAe,GAAG,MAAM,CAAC,KAAK,CAAC,eAAe,IAAI,CAAC,EAAE,iBAAiB,CAAC,CAAC;IAC9E,MAAM,eAAe,GAAG,MAAM,CAAC,KAAK,CAAC,eAAe,EAAE,iBAAiB,CAAC,CAAC;IACzE,MAAM,aAAa,GAAG,MAAM,CAAC,KAAK,CAAC,aAAa,IAAI,CAAC,EAAE,eAAe,CAAC,CAAC;IACxE,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,WAAW,IAAI,CAAC,EAAE,aAAa,CAAC,CAAC;IAClE,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,IAAI,IAAI,EAAE,QAAQ,CAAC,CAAC;IACxD,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,IAAI,KAAK,EAAE,OAAO,CAAC,CAAC;IACtD,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,OAAO,IAAI,IAAI,EAAE,SAAS,CAAC,CAAC;IAC3D,MAAM,eAAe,GAAG,QAAQ,CAAC,KAAK,CAAC,eAAe,IAAI,CAAC,EAAE,iBAAiB,CAAC,CAAC;IAChF,MAAM,iBAAiB,GAAG,KAAK,CAAC,KAAK,CAAC,iBAAiB,IAAI,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACxE,MAAM,YAAY,GAAG,YAAY,CAAC,KAAK,CAAC,YAAY,IAAI,OAAO,CAAC,CAAC;IACjE,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,CAAC,OAAO,IAAI,OAAO,CAAC,CAAC;IACvD,IAAI,WAAW,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO;YACL,iBAAiB,EAAE,CAAC;YACpB,YAAY,EAAE,CAAC;YACf,aAAa,EAAE,CAAC;YAChB,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE,CAAC;YACZ,cAAc,EAAE,CAAC;YACjB,gBAAgB,EAAE,gBAAgB,CAAC,YAAY,CAAC,KAAK,CAAC;YACtD,gBAAgB,EAAE,gBAAgB,CAAC,OAAO,CAAC,KAAK,CAAC;YACjD,MAAM,EAAE,EAAE,YAAY,EAAE,YAAY,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,EAAE;SACvE,CAAC;IACJ,CAAC;IAED,MAAM,SAAS,GAAG,aAAa,CAAC,oBAAoB,EAAE,eAAe,EAAE,MAAM,CAAC,CAAC;IAC/E,MAAM,SAAS,GAAG,aAAa,CAAC,oBAAoB,EAAE,eAAe,EAAE,aAAa,CAAC,CAAC;IACtF,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,GAAG,OAAO,EAAE,eAAe,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;IACrF,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACtE,MAAM,gBAAgB,GAAG,OAAO,CAAC,SAAS,EAAE,YAAY,CAAC,KAAK,CAAC,GAAG,WAAW,GAAG,UAAU,GAAG,UAAU;UACnG,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,GAAG,WAAW,GAAG,iBAAiB,CAAC;IACtE;;;;;;;;;;;;OAYG;IACH,MAAM,WAAW,GAAG,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,WAAW,GAAG,UAAU,GAAG,KAAK,CAAC,CAAC,GAAG,WAAW,GAAG,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAC5H,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;IAC3E,MAAM,iBAAiB,GAAG,aAAa,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,aAAa,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3I,MAAM,YAAY,GAAG,aAAa,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,aAAa,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACtI,MAAM,iBAAiB,GAAG,gBAAgB,GAAG,iBAAiB,CAAC;IAC/D,MAAM,YAAY,GAAG,WAAW,GAAG,YAAY,CAAC;IAChD,MAAM,cAAc,GAAG,KAAK,GAAG,GAAG,CAAC;IACnC,oFAAoF;IACpF,MAAM,WAAW,GAAG,CAAC,cAAc,GAAG,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAClG,MAAM,cAAc,GAAG,KAAK,CAAC,YAAY,GAAG,WAAW,EAAE,CAAC,WAAW,GAAG,KAAK,EAAE,WAAW,GAAG,KAAK,CAAC,CAAC;IACpG,OAAO;QACL,iBAAiB,EAAE,MAAM,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACvD,YAAY,EAAE,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC7C,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,iBAAiB,EAAE,YAAY,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC7E,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACvC,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACvC,cAAc,EAAE,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACjD,gBAAgB,EAAE,MAAM,CAAC,gBAAgB,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACzE,gBAAgB,EAAE,MAAM,CAAC,gBAAgB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACpE,MAAM,EAAE,EAAE,YAAY,EAAE,YAAY,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,EAAE;KACvE,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB,CAAC,MAAyB;IACnD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,UAAU,CAAC,sEAAsE,CAAC,CAAC;IAC/F,CAAC;IACD,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,EAAE,cAAc,KAAK,GAAG,CAAC,CAAC,CAAC;AAC/E,CAAC;AAED,SAAS,mBAAmB,CAC1B,UAA6B,EAC7B,QAAgB,EAChB,eAAuB,EACvB,OAAe,EACf,MAAc,EACd,UAAkB,EAClB,YAAoB;IAEpB,IAAI,QAAQ,IAAI,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC;IACrF,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,GAAG,GAAG,QAAQ,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,GAAG,eAAe,CAAC;IACpE,OAAO,SAAS,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,IAAI,GAAG,GAAG,UAAU,EAAE,CAAC;QAC7D,SAAS,IAAI,CAAC,CAAC;QACf,GAAG,GAAG,QAAQ,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,GAAG,eAAe,CAAC;IAClE,CAAC;IACD,OAAO,SAAS,GAAG,CAAC,IAAI,GAAG,GAAG,YAAY,EAAE,CAAC;QAC3C,SAAS,IAAI,CAAC,CAAC;QACf,GAAG,GAAG,QAAQ,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,GAAG,eAAe,CAAC;IAClE,CAAC;IACD,MAAM,UAAU,GAAG,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IAC/C,OAAO;QACL,IAAI,EAAE,SAAS,GAAG,CAAC;QACnB,KAAK,EAAE,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC;QACjC,UAAU,EAAE,UAAU,IAAI,UAAU,IAAI,SAAS,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,IAAI,YAAY,IAAI,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM;KAC3J,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,SAAiB,EAAE,UAAkB,EAAE,aAAqB,EAAE,OAAe,EAAE,MAAc;IACnH,IAAI,SAAS,IAAI,aAAa,EAAE,CAAC;QAC/B,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,SAAS,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACpF,OAAO,UAAU,GAAG,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC;IACtC,CAAC;IACD,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,SAAS,GAAG,aAAa,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,GAAG,aAAa,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACzF,OAAO,UAAU,GAAG,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC;AACpC,CAAC;AAED,SAAS,gBAAgB,CAAC,UAA8B;IAOtD,QAAQ,UAAU,EAAE,CAAC;QACnB,KAAK,MAAM;YACT,OAAO,EAAE,iBAAiB,EAAE,GAAG,EAAE,cAAc,EAAE,GAAG,EAAE,YAAY,EAAE,GAAG,EAAE,cAAc,EAAE,GAAG,EAAE,kBAAkB,EAAE,GAAG,EAAE,CAAC;QAC1H,KAAK,MAAM;YACT,OAAO,EAAE,iBAAiB,EAAE,IAAI,EAAE,cAAc,EAAE,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE,cAAc,EAAE,GAAG,EAAE,kBAAkB,EAAE,GAAG,EAAE,CAAC;QAC5H,KAAK,QAAQ;YACX,OAAO,EAAE,iBAAiB,EAAE,IAAI,EAAE,cAAc,EAAE,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE,cAAc,EAAE,GAAG,EAAE,kBAAkB,EAAE,GAAG,EAAE,CAAC;IAC9H,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,KAAa,EAAE,UAAkB,EAAE,SAAiB;IACzE,MAAM,YAAY,GAAG,KAAK,GAAG,UAAU,GAAG,IAAI,CAAC;IAC/C,MAAM,SAAS,GAAG,SAAS,GAAG,IAAI,CAAC;IACnC,OAAO;QACL,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,GAAG,YAAY,GAAG,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACjE,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,GAAG,YAAY,GAAG,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACjE,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,GAAG,YAAY,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAC5D,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,GAAG,YAAY,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;KAC7D,CAAC;AACJ,CAAC;AAED,SAAS,MAAM,CAAC,KAAa,EAAE,KAAa;IAC1C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,UAAU,CAAC,4BAA4B,KAAK,kBAAkB,CAAC,CAAC;IAC5E,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAa,EAAE,KAAa;IACrD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QACzC,MAAM,IAAI,UAAU,CAAC,4BAA4B,KAAK,mCAAmC,CAAC,CAAC;IAC7F,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,QAAQ,CAAC,KAAa,EAAE,KAAa;IAC5C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QAC1C,MAAM,IAAI,UAAU,CAAC,4BAA4B,KAAK,+BAA+B,CAAC,CAAC;IACzF,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,YAAY,CAAC,KAAkD;IACtE,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IAClE,QAAQ,KAAK,EAAE,CAAC;QACd,KAAK,QAAQ;YACX,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC;QACpE,KAAK,OAAO;YACV,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC;QACpE,KAAK,QAAQ;YACX,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC;QACrE,KAAK,SAAS;YACZ,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;IACpE,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,oBAA4B,EAAE,eAAuB,EAAE,MAAc;IAC1F,MAAM,aAAa,GAAG,eAAe,GAAG,MAAM,CAAC;IAC/C,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC,CAAC;IACtF,IAAI,WAAW,GAAG,GAAG;QAAE,OAAO,CAAC,CAAC;IAChC,OAAO,KAAK,CAAC,CAAC,aAAa,GAAG,oBAAoB,CAAC,GAAG,WAAW,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC5E,CAAC;AAED,SAAS,aAAa,CAAC,oBAA4B,EAAE,eAAuB,EAAE,aAAqB;IACjG,IAAI,IAAI,CAAC,GAAG,CAAC,oBAAoB,CAAC,GAAG,GAAG;QAAE,OAAO,CAAC,CAAC;IACnD,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE,oBAAoB,CAAC,GAAG,aAAa,EAAE,CAAC,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC;AACjH,CAAC;AAED,SAAS,OAAO,CAAC,IAAY,EAAE,KAA8B;IAC3D,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC;IAC1B,OAAO,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AACtF,CAAC;AAED,SAAS,gBAAgB,CAAC,KAA8B;IACtD,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AACpE,CAAC;AAED,SAAS,gBAAgB,CAAC,KAA8B;IACtD,qEAAqE;IACrE,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AACpE,CAAC;AAED,SAAS,KAAK,CAAC,KAAa,EAAE,GAAW,EAAE,GAAW;IACpD,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;AAC7C,CAAC"}
|
package/dist/Constraint.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { type Vec3 } from "./Shape.js";
|
|
2
2
|
import type { RigidBody } from "./RigidBody.js";
|
|
3
|
-
export type ConstraintType = "fixed" | "hinge" | "slider" | "spring";
|
|
3
|
+
export type ConstraintType = "fixed" | "hinge" | "slider" | "spring" | "ball-socket" | "motorised-hinge";
|
|
4
4
|
export type ConstraintDescriptor = {
|
|
5
5
|
readonly type: ConstraintType;
|
|
6
6
|
readonly bodyA: RigidBody;
|
|
@@ -10,6 +10,14 @@ export type ConstraintDescriptor = {
|
|
|
10
10
|
readonly restLength?: number;
|
|
11
11
|
readonly stiffness?: number;
|
|
12
12
|
readonly axis?: Vec3;
|
|
13
|
+
/** Spring damping ratio, `spring` only. */
|
|
14
|
+
readonly damping?: number;
|
|
15
|
+
/** Target angular speed in rad/s, `motorised-hinge` only. */
|
|
16
|
+
readonly motorSpeed?: number;
|
|
17
|
+
/** Maximum torque the motor may apply, `motorised-hinge` only. */
|
|
18
|
+
readonly maxMotorTorque?: number;
|
|
19
|
+
/** Angular limits in radians, hinge kinds only. */
|
|
20
|
+
readonly limits?: readonly [number, number];
|
|
13
21
|
};
|
|
14
22
|
export declare class Constraint {
|
|
15
23
|
readonly type: ConstraintType;
|
|
@@ -21,11 +29,19 @@ export declare class Constraint {
|
|
|
21
29
|
readonly restLength: number;
|
|
22
30
|
readonly stiffness: number;
|
|
23
31
|
readonly axis: Vec3;
|
|
32
|
+
readonly damping: number;
|
|
33
|
+
readonly maxMotorTorque: number;
|
|
34
|
+
readonly limits: readonly [number, number] | undefined;
|
|
35
|
+
private motorSpeedValue;
|
|
36
|
+
private enabled;
|
|
24
37
|
constructor(descriptor: ConstraintDescriptor);
|
|
25
|
-
|
|
38
|
+
/** `motorised-hinge` only: change the driven speed at runtime. */
|
|
39
|
+
setMotorSpeed(speed: number): void;
|
|
40
|
+
motorSpeed(): number;
|
|
41
|
+
/** Turn the constraint off without destroying it. */
|
|
42
|
+
setEnabled(enabled: boolean): void;
|
|
43
|
+
isEnabled(): boolean;
|
|
26
44
|
private anchorAWorld;
|
|
27
45
|
private anchorBWorld;
|
|
28
|
-
private applyError;
|
|
29
|
-
private applyVelocityError;
|
|
30
46
|
}
|
|
31
47
|
//# sourceMappingURL=Constraint.d.ts.map
|
package/dist/Constraint.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Constraint.d.ts","sourceRoot":"","sources":["../../../../packages/physics/src/Constraint.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"Constraint.d.ts","sourceRoot":"","sources":["../../../../packages/physics/src/Constraint.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyE,KAAK,IAAI,EAAE,MAAM,YAAY,CAAC;AAC9G,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,aAAa,GAAG,iBAAiB,CAAC;AAEzG,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;IACrB,2CAA2C;IAC3C,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,6DAA6D;IAC7D,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,kEAAkE;IAClE,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,mDAAmD;IACnD,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC7C,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;IACpB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;IACvD,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,OAAO,CAAQ;gBAEX,UAAU,EAAE,oBAAoB;IAsC5C,kEAAkE;IAClE,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAKlC,UAAU,IAAI,MAAM;IAIpB,qDAAqD;IACrD,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAIlC,SAAS,IAAI,OAAO;IAIpB,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,YAAY;CAGrB"}
|
package/dist/Constraint.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { addVec3,
|
|
1
|
+
import { addVec3, normalizeVec3, rotateVec3ByQuat, subVec3, validateFiniteVec3 } from "./Shape.js";
|
|
2
2
|
export class Constraint {
|
|
3
3
|
type;
|
|
4
4
|
bodyA;
|
|
@@ -9,6 +9,11 @@ export class Constraint {
|
|
|
9
9
|
restLength;
|
|
10
10
|
stiffness;
|
|
11
11
|
axis;
|
|
12
|
+
damping;
|
|
13
|
+
maxMotorTorque;
|
|
14
|
+
limits;
|
|
15
|
+
motorSpeedValue;
|
|
16
|
+
enabled = true;
|
|
12
17
|
constructor(descriptor) {
|
|
13
18
|
if (descriptor.bodyA.id === descriptor.bodyB.id) {
|
|
14
19
|
throw new Error("Constraint requires two different bodies.");
|
|
@@ -26,6 +31,19 @@ export class Constraint {
|
|
|
26
31
|
this.restOffset = subVec3(anchorB, anchorA);
|
|
27
32
|
this.restLength = descriptor.restLength ?? Math.hypot(this.restOffset[0], this.restOffset[1], this.restOffset[2]);
|
|
28
33
|
this.stiffness = descriptor.stiffness ?? 1;
|
|
34
|
+
this.damping = descriptor.damping ?? 0;
|
|
35
|
+
this.motorSpeedValue = descriptor.motorSpeed ?? 0;
|
|
36
|
+
this.maxMotorTorque = descriptor.maxMotorTorque ?? Infinity;
|
|
37
|
+
this.limits = descriptor.limits;
|
|
38
|
+
if (this.limits && !(this.limits[0] <= this.limits[1])) {
|
|
39
|
+
throw new Error("Constraint limits must be ordered [lower, upper].");
|
|
40
|
+
}
|
|
41
|
+
if (descriptor.type === "motorised-hinge" && descriptor.motorSpeed === undefined) {
|
|
42
|
+
throw new Error("A motorised-hinge constraint requires motorSpeed.");
|
|
43
|
+
}
|
|
44
|
+
if (!Number.isFinite(this.damping) || this.damping < 0) {
|
|
45
|
+
throw new Error("Constraint damping must be finite and non-negative.");
|
|
46
|
+
}
|
|
29
47
|
if (!Number.isFinite(this.restLength) || this.restLength < 0) {
|
|
30
48
|
throw new Error("Constraint restLength must be finite and non-negative.");
|
|
31
49
|
}
|
|
@@ -33,39 +51,21 @@ export class Constraint {
|
|
|
33
51
|
throw new Error("Constraint stiffness must be in the [0, 1] range.");
|
|
34
52
|
}
|
|
35
53
|
}
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
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
|
-
}
|
|
54
|
+
/** `motorised-hinge` only: change the driven speed at runtime. */
|
|
55
|
+
setMotorSpeed(speed) {
|
|
56
|
+
if (!Number.isFinite(speed))
|
|
57
|
+
throw new Error("Constraint motorSpeed must be finite.");
|
|
58
|
+
this.motorSpeedValue = speed;
|
|
59
|
+
}
|
|
60
|
+
motorSpeed() {
|
|
61
|
+
return this.motorSpeedValue;
|
|
62
|
+
}
|
|
63
|
+
/** Turn the constraint off without destroying it. */
|
|
64
|
+
setEnabled(enabled) {
|
|
65
|
+
this.enabled = enabled;
|
|
66
|
+
}
|
|
67
|
+
isEnabled() {
|
|
68
|
+
return this.enabled;
|
|
69
69
|
}
|
|
70
70
|
anchorAWorld() {
|
|
71
71
|
return addVec3(this.bodyA.position, rotateVec3ByQuat(this.localAnchorA, this.bodyA.rotation));
|
|
@@ -73,31 +73,5 @@ export class Constraint {
|
|
|
73
73
|
anchorBWorld() {
|
|
74
74
|
return addVec3(this.bodyB.position, rotateVec3ByQuat(this.localAnchorB, this.bodyB.rotation));
|
|
75
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
76
|
}
|
|
103
77
|
//# sourceMappingURL=Constraint.js.map
|
package/dist/Constraint.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Constraint.js","sourceRoot":"","sources":["../../../../packages/physics/src/Constraint.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"Constraint.js","sourceRoot":"","sources":["../../../../packages/physics/src/Constraint.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { KinematicBody, type KinematicBodyDescriptor, type KinematicBodyEvent, type KinematicBodySnapshot, type KinematicStepOptions } from "./KinematicBody.js";
|
|
2
|
+
export type FightingCharacterControllerState = "idle" | "walk" | "dash" | "jump" | "fast-fall" | "crouch" | "landing";
|
|
3
|
+
export type FightingCharacterControllerDescriptor = KinematicBodyDescriptor & {
|
|
4
|
+
readonly walkSpeed?: number;
|
|
5
|
+
readonly crouchSpeed?: number;
|
|
6
|
+
readonly fastFallSpeed?: number;
|
|
7
|
+
};
|
|
8
|
+
export type FightingCharacterControllerSnapshot = KinematicBodySnapshot & {
|
|
9
|
+
readonly state: FightingCharacterControllerState;
|
|
10
|
+
readonly walkSpeed: number;
|
|
11
|
+
readonly crouchSpeed: number;
|
|
12
|
+
readonly fastFallSpeed: number;
|
|
13
|
+
};
|
|
14
|
+
/** Authored-unit fighting movement; this is not a physical-simulation controller. */
|
|
15
|
+
export declare class FightingCharacterController {
|
|
16
|
+
#private;
|
|
17
|
+
readonly body: KinematicBody;
|
|
18
|
+
readonly walkSpeed: number;
|
|
19
|
+
readonly crouchSpeed: number;
|
|
20
|
+
readonly fastFallSpeed: number;
|
|
21
|
+
constructor(descriptor?: FightingCharacterControllerDescriptor);
|
|
22
|
+
walk(direction: number, speed?: number): void;
|
|
23
|
+
stop(): void;
|
|
24
|
+
jump(): void;
|
|
25
|
+
dash(direction?: number): void;
|
|
26
|
+
fastFall(speed?: number): void;
|
|
27
|
+
crouch(active?: boolean): void;
|
|
28
|
+
step(dt: number, options?: KinematicStepOptions): readonly KinematicBodyEvent[];
|
|
29
|
+
snapshot(): FightingCharacterControllerSnapshot;
|
|
30
|
+
}
|
|
31
|
+
export declare function createFightingCharacterController(descriptor?: FightingCharacterControllerDescriptor): FightingCharacterController;
|
|
32
|
+
//# sourceMappingURL=FightingCharacterController.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FightingCharacterController.d.ts","sourceRoot":"","sources":["../../../../packages/physics/src/FightingCharacterController.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,KAAK,uBAAuB,EAAE,KAAK,kBAAkB,EAAE,KAAK,qBAAqB,EAAE,KAAK,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAEjK,MAAM,MAAM,gCAAgC,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,WAAW,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEtH,MAAM,MAAM,qCAAqC,GAAG,uBAAuB,GAAG;IAC5E,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,mCAAmC,GAAG,qBAAqB,GAAG;IACxE,QAAQ,CAAC,KAAK,EAAE,gCAAgC,CAAC;IACjD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;CAChC,CAAC;AAEF,qFAAqF;AACrF,qBAAa,2BAA2B;;IACtC,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;gBAGnB,UAAU,GAAE,qCAA0C;IAwBlE,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI;IAS7C,IAAI,IAAI,IAAI;IACZ,IAAI,IAAI,IAAI;IACZ,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI;IAC9B,QAAQ,CAAC,KAAK,SAAqB,GAAG,IAAI;IAC1C,MAAM,CAAC,MAAM,UAAO,GAAG,IAAI;IAE3B,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,GAAE,oBAAyB,GAAG,SAAS,kBAAkB,EAAE;IAMnF,QAAQ,IAAI,mCAAmC;CAYhD;AAED,wBAAgB,iCAAiC,CAAC,UAAU,GAAE,qCAA0C,GAAG,2BAA2B,CAErI"}
|