@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
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
import { PhysicsWorld } from "./PhysicsWorld.js";
|
|
2
|
+
import { Shape } from "./Shape.js";
|
|
3
|
+
export function samplePhysicsSandboxFixture(options = {}) {
|
|
4
|
+
const seed = integer(options.seed ?? 0x3d2025, "seed");
|
|
5
|
+
const steps = integer(options.steps ?? 24, "steps");
|
|
6
|
+
if (steps < 0 || steps > 240)
|
|
7
|
+
throw new RangeError("Physics sandbox fixture steps must be in the [0, 240] range.");
|
|
8
|
+
const world = new PhysicsWorld({ gravity: [0, -9.81, 0], fixedDelta: 1 / 60, solverIterations: 6 });
|
|
9
|
+
const records = [];
|
|
10
|
+
const constraints = [];
|
|
11
|
+
const ground = world.createRigidBody({ type: "static", position: [0, -0.15, 0] });
|
|
12
|
+
world.createCollider(ground, { shape: Shape.box(8, 0.15, 2), material: { friction: 0.9, restitution: 0 } });
|
|
13
|
+
spawnBasic(world, records, "box", [-4.2, 1.2, 0], Shape.box(0.32, 0.32, 0.32), "box", 1);
|
|
14
|
+
spawnBasic(world, records, "sphere", [-3.45, 1.25, 0], Shape.sphere(0.32), "sphere", 1);
|
|
15
|
+
spawnBasic(world, records, "capsule", [-2.7, 1.35, 0], Shape.capsule(0.22, 0.38), "capsule", 1);
|
|
16
|
+
spawnBasic(world, records, "cylinder-proxy", [-1.95, 1.3, 0], Shape.capsule(0.28, 0.26), "cylinder", 1);
|
|
17
|
+
spawnTower(world, records, [-4.5, 0.25, 0], 5);
|
|
18
|
+
spawnPyramid(world, records, [-2.7, 0.25, 0], 4);
|
|
19
|
+
spawnWall(world, records, [-0.6, 0.25, 0], 5, 3);
|
|
20
|
+
spawnChain(world, records, constraints, [1.5, 3.1, 0], [3.0, 2.2, 0], 6);
|
|
21
|
+
spawnNewtonsCradle(world, records, constraints, [0.9, 4.2, 0], 4);
|
|
22
|
+
spawnDominoes(world, records, [2.1, 0.45, 0], 8);
|
|
23
|
+
spawnWreckingBall(world, records, constraints, [4.0, 3.5, 0], 2.4);
|
|
24
|
+
spawnVehicle(world, records, constraints, [-0.2, 2.0, 0]);
|
|
25
|
+
spawnRagdoll(world, records, constraints, [3.7, 1.6, 0]);
|
|
26
|
+
const bodyCountBeforeTools = world.snapshot().stats.bodies;
|
|
27
|
+
const tools = applyToolSequence(world, seed);
|
|
28
|
+
for (let step = 0; step < steps; step += 1)
|
|
29
|
+
world.step(1 / 60);
|
|
30
|
+
const snapshot = world.snapshot();
|
|
31
|
+
const spawners = summarizeSpawners(records, constraints, world);
|
|
32
|
+
const supportedToolCount = tools.filter((tool) => tool.supported).length;
|
|
33
|
+
const blockedToolCount = tools.length - supportedToolCount;
|
|
34
|
+
const metrics = {
|
|
35
|
+
bodyCountBeforeTools,
|
|
36
|
+
bodyCountAfterTools: snapshot.stats.bodies,
|
|
37
|
+
colliderCountAfterTools: snapshot.stats.colliders,
|
|
38
|
+
constraintCountAfterTools: snapshot.stats.constraints,
|
|
39
|
+
dynamicBodiesAfterTools: snapshot.bodies.filter((body) => body.type === "dynamic").length,
|
|
40
|
+
sleepingBodiesAfterTools: snapshot.stats.sleepingBodies,
|
|
41
|
+
contactsAfterSteps: snapshot.stats.contacts,
|
|
42
|
+
broadphasePairsAfterSteps: snapshot.stats.broadphasePairs,
|
|
43
|
+
kineticEnergyAfterSteps: Number(snapshot.stats.kineticEnergy.toFixed(4)),
|
|
44
|
+
maxContactPenetrationAfterSteps: Number(snapshot.stats.maxContactPenetration.toFixed(5)),
|
|
45
|
+
totalSpawnedBodies: records.length,
|
|
46
|
+
totalSpawnerConstraints: constraints.length,
|
|
47
|
+
supportedToolCount,
|
|
48
|
+
blockedToolCount
|
|
49
|
+
};
|
|
50
|
+
return {
|
|
51
|
+
id: "external-parity-old-branch-physics-sandbox-fixture",
|
|
52
|
+
source: "origin-master-physics-sandbox-tools-spawners-adapted",
|
|
53
|
+
spawners,
|
|
54
|
+
tools,
|
|
55
|
+
metrics,
|
|
56
|
+
unsupportedAdvancedSimulations: ["cloth", "soft-body", "fluid", "fracture"],
|
|
57
|
+
hash: hashFixture(spawners, tools, metrics),
|
|
58
|
+
claimBoundary: "Deterministic current-engine fixture adapted from old physics sandbox spawners and tools. It proves bounded rigid-body spawn presets, hinge/spring constraints, and supported tool telemetry; it does not claim soft body, cloth, fluid, fracture, full interactive editor tools, or Unity/Unreal physics-sandbox parity."
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
function spawnBasic(world, records, preset, position, shape, visualKind, mass) {
|
|
62
|
+
const body = world.createRigidBody({ position, mass, linearDamping: 0.02, angularDamping: 0.02 });
|
|
63
|
+
world.createCollider(body, { shape, material: { friction: 0.72, restitution: 0.05 } });
|
|
64
|
+
records.push({ preset, body, visualKind, colliderKind: preset === "cylinder-proxy" ? "cylinder-proxy" : shape.kind });
|
|
65
|
+
return body;
|
|
66
|
+
}
|
|
67
|
+
function spawnTower(world, records, origin, height) {
|
|
68
|
+
for (let index = 0; index < height; index += 1) {
|
|
69
|
+
spawnBasic(world, records, "tower", [origin[0], origin[1] + index * 0.46, origin[2]], Shape.box(0.36, 0.22, 0.32), "box", 1);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
function spawnPyramid(world, records, origin, levels) {
|
|
73
|
+
for (let level = 0; level < levels; level += 1) {
|
|
74
|
+
const width = levels - level;
|
|
75
|
+
for (let x = 0; x < width; x += 1) {
|
|
76
|
+
spawnBasic(world, records, "pyramid", [
|
|
77
|
+
origin[0] + (x - (width - 1) / 2) * 0.44,
|
|
78
|
+
origin[1] + level * 0.46,
|
|
79
|
+
origin[2]
|
|
80
|
+
], Shape.box(0.2, 0.22, 0.25), "box", 1);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
function spawnWall(world, records, origin, width, height) {
|
|
85
|
+
for (let y = 0; y < height; y += 1) {
|
|
86
|
+
const boxesInRow = width - (y % 2);
|
|
87
|
+
for (let x = 0; x < boxesInRow; x += 1) {
|
|
88
|
+
spawnBasic(world, records, "wall", [
|
|
89
|
+
origin[0] + (x - (boxesInRow - 1) / 2) * 0.42 + (y % 2) * 0.21,
|
|
90
|
+
origin[1] + y * 0.42,
|
|
91
|
+
origin[2]
|
|
92
|
+
], Shape.box(0.2, 0.2, 0.2), "brick", 1);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
function spawnChain(world, records, constraints, start, end, segments) {
|
|
97
|
+
let previous;
|
|
98
|
+
for (let index = 0; index < segments; index += 1) {
|
|
99
|
+
const t = (index + 0.5) / segments;
|
|
100
|
+
const body = spawnBasic(world, records, "chain", lerpVec3(start, end, t), Shape.box(0.12, 0.12, 0.32), "chain-link", 0.5);
|
|
101
|
+
if (previous) {
|
|
102
|
+
world.createConstraint({ type: "hinge", bodyA: previous, bodyB: body, stiffness: 0.85 });
|
|
103
|
+
constraints.push({ preset: "chain" });
|
|
104
|
+
}
|
|
105
|
+
previous = body;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
function spawnNewtonsCradle(world, records, constraints, origin, balls) {
|
|
109
|
+
for (let index = 0; index < balls; index += 1) {
|
|
110
|
+
const x = origin[0] + (index - (balls - 1) / 2) * 0.42;
|
|
111
|
+
const anchor = world.createRigidBody({ type: "static", position: [x, origin[1], origin[2]] });
|
|
112
|
+
world.createCollider(anchor, { shape: Shape.box(0.06, 0.06, 0.06) });
|
|
113
|
+
records.push({ preset: "newtons-cradle", body: anchor, visualKind: "anchor", colliderKind: "box" });
|
|
114
|
+
const ball = spawnBasic(world, records, "newtons-cradle", [x, origin[1] - 1.1, origin[2]], Shape.sphere(0.18), "sphere", 1);
|
|
115
|
+
world.createConstraint({ type: "hinge", bodyA: anchor, bodyB: ball, stiffness: 0.9 });
|
|
116
|
+
constraints.push({ preset: "newtons-cradle" });
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
function spawnDominoes(world, records, start, count) {
|
|
120
|
+
for (let index = 0; index < count; index += 1) {
|
|
121
|
+
spawnBasic(world, records, "dominoes", [start[0] + index * 0.22, start[1], start[2]], Shape.box(0.05, 0.34, 0.18), "domino", 0.5);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
function spawnWreckingBall(world, records, constraints, position, chainLength) {
|
|
125
|
+
const anchor = world.createRigidBody({ type: "static", position });
|
|
126
|
+
world.createCollider(anchor, { shape: Shape.box(0.08, 0.08, 0.08) });
|
|
127
|
+
records.push({ preset: "wrecking-ball", body: anchor, visualKind: "anchor", colliderKind: "box" });
|
|
128
|
+
const ball = spawnBasic(world, records, "wrecking-ball", [position[0] + 0.55, position[1] - chainLength, position[2]], Shape.sphere(0.34), "sphere", 8);
|
|
129
|
+
world.createConstraint({ type: "spring", bodyA: anchor, bodyB: ball, restLength: chainLength, stiffness: 0.55 });
|
|
130
|
+
constraints.push({ preset: "wrecking-ball" });
|
|
131
|
+
}
|
|
132
|
+
function spawnVehicle(world, records, constraints, position) {
|
|
133
|
+
const chassis = spawnBasic(world, records, "vehicle", position, Shape.box(0.56, 0.16, 0.32), "chassis", 5);
|
|
134
|
+
for (const offset of [[-0.38, -0.24, -0.32], [-0.38, -0.24, 0.32], [0.38, -0.24, -0.32], [0.38, -0.24, 0.32]]) {
|
|
135
|
+
const wheel = spawnBasic(world, records, "vehicle", [position[0] + offset[0], position[1] + offset[1], position[2] + offset[2]], Shape.sphere(0.15), "wheel", 0.5);
|
|
136
|
+
world.createConstraint({ type: "hinge", bodyA: chassis, bodyB: wheel, stiffness: 0.75 });
|
|
137
|
+
constraints.push({ preset: "vehicle" });
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
function spawnRagdoll(world, records, constraints, position) {
|
|
141
|
+
const torso = spawnBasic(world, records, "ragdoll", position, Shape.box(0.22, 0.36, 0.16), "torso", 5);
|
|
142
|
+
const parts = [
|
|
143
|
+
["head", [0, 0.58, 0], Shape.sphere(0.18), 1],
|
|
144
|
+
["left-arm", [-0.36, 0.14, 0], Shape.capsule(0.08, 0.28), 1],
|
|
145
|
+
["right-arm", [0.36, 0.14, 0], Shape.capsule(0.08, 0.28), 1],
|
|
146
|
+
["left-leg", [-0.16, -0.56, 0], Shape.capsule(0.09, 0.34), 1],
|
|
147
|
+
["right-leg", [0.16, -0.56, 0], Shape.capsule(0.09, 0.34), 1]
|
|
148
|
+
];
|
|
149
|
+
for (const [visualKind, offset, shape, mass] of parts) {
|
|
150
|
+
const body = spawnBasic(world, records, "ragdoll", [position[0] + offset[0], position[1] + offset[1], position[2] + offset[2]], shape, visualKind, mass);
|
|
151
|
+
world.createConstraint({ type: "hinge", bodyA: torso, bodyB: body, stiffness: 0.72 });
|
|
152
|
+
constraints.push({ preset: "ragdoll" });
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
function applyToolSequence(world, seed) {
|
|
156
|
+
const tools = [];
|
|
157
|
+
const dynamicBodies = () => world.bodies().filter((body) => body.type === "dynamic");
|
|
158
|
+
const grabTarget = [0.25 + hash01(seed, 1) * 0.25, 2.15, 0];
|
|
159
|
+
const grabbed = nearestBody(dynamicBodies(), [0, 2, 0]);
|
|
160
|
+
if (grabbed) {
|
|
161
|
+
grabbed.setVelocity([
|
|
162
|
+
(grabTarget[0] - grabbed.position[0]) * 3.5,
|
|
163
|
+
(grabTarget[1] - grabbed.position[1]) * 3.5,
|
|
164
|
+
0
|
|
165
|
+
]);
|
|
166
|
+
}
|
|
167
|
+
tools.push({
|
|
168
|
+
tool: "grab",
|
|
169
|
+
supported: grabbed !== undefined,
|
|
170
|
+
affectedBodies: grabbed ? 1 : 0,
|
|
171
|
+
selectedBodyId: grabbed?.id,
|
|
172
|
+
blocker: "Current RigidBody type is immutable, so this fixture proves velocity-targeted grab telemetry rather than old kinematic type switching."
|
|
173
|
+
});
|
|
174
|
+
const pushPoint = [0, 1.2, 0];
|
|
175
|
+
let pushed = 0;
|
|
176
|
+
let impulseMagnitude = 0;
|
|
177
|
+
for (const body of dynamicBodies()) {
|
|
178
|
+
const distance = distanceVec3(body.position, pushPoint);
|
|
179
|
+
if (distance <= 2.5 && distance > 1e-6) {
|
|
180
|
+
const direction = scaleVec3(subVec3(body.position, pushPoint), 1 / distance);
|
|
181
|
+
const impulse = scaleVec3(direction, Number(((2.5 - distance) * 0.38).toFixed(4)));
|
|
182
|
+
body.applyImpulse(impulse);
|
|
183
|
+
impulseMagnitude += Math.hypot(...impulse);
|
|
184
|
+
pushed += 1;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
tools.push({ tool: "push", supported: true, affectedBodies: pushed, impulseMagnitude: Number(impulseMagnitude.toFixed(4)) });
|
|
188
|
+
const freezeCandidates = dynamicBodies().slice(0, 3);
|
|
189
|
+
for (const body of freezeCandidates) {
|
|
190
|
+
body.setVelocity([0, 0, 0]);
|
|
191
|
+
body.setAngularVelocity([0, 0, 0]);
|
|
192
|
+
body.sleeping = true;
|
|
193
|
+
}
|
|
194
|
+
tools.push({ tool: "freeze", supported: true, affectedBodies: freezeCandidates.length, frozenBodies: freezeCandidates.length });
|
|
195
|
+
const deleteTarget = dynamicBodies().at(-1);
|
|
196
|
+
if (deleteTarget)
|
|
197
|
+
world.removeRigidBody(deleteTarget.id);
|
|
198
|
+
tools.push({ tool: "delete", supported: deleteTarget !== undefined, affectedBodies: deleteTarget ? 1 : 0, selectedBodyId: deleteTarget?.id, deletedBodies: deleteTarget ? 1 : 0 });
|
|
199
|
+
const explodePoint = [1.2, 1.2, 0];
|
|
200
|
+
let exploded = 0;
|
|
201
|
+
let explosionImpulse = 0;
|
|
202
|
+
for (const body of dynamicBodies()) {
|
|
203
|
+
const distance = distanceVec3(body.position, explodePoint);
|
|
204
|
+
if (distance <= 3.25 && distance > 1e-6) {
|
|
205
|
+
const direction = scaleVec3(subVec3(body.position, explodePoint), 1 / distance);
|
|
206
|
+
const impulse = scaleVec3(direction, Number(((3.25 - distance) * 0.52).toFixed(4)));
|
|
207
|
+
body.applyImpulse(impulse);
|
|
208
|
+
explosionImpulse += Math.hypot(...impulse);
|
|
209
|
+
exploded += 1;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
tools.push({ tool: "explode", supported: true, affectedBodies: exploded, impulseMagnitude: Number(explosionImpulse.toFixed(4)) });
|
|
213
|
+
tools.push({
|
|
214
|
+
tool: "slice",
|
|
215
|
+
supported: false,
|
|
216
|
+
affectedBodies: 0,
|
|
217
|
+
blocker: "Old slice tool only drew/specified a cut gesture; current physics has no convex decomposition or fracture pipeline."
|
|
218
|
+
});
|
|
219
|
+
return tools;
|
|
220
|
+
}
|
|
221
|
+
function summarizeSpawners(records, constraints, world) {
|
|
222
|
+
const summaries = [];
|
|
223
|
+
const liveBodyIds = new Set(world.bodies().map((body) => body.id));
|
|
224
|
+
for (const preset of unique(records.map((record) => record.preset))) {
|
|
225
|
+
const presetRecords = records.filter((record) => record.preset === preset && liveBodyIds.has(record.body.id));
|
|
226
|
+
summaries.push({
|
|
227
|
+
preset,
|
|
228
|
+
bodies: presetRecords.length,
|
|
229
|
+
dynamicBodies: presetRecords.filter((record) => record.body.type === "dynamic").length,
|
|
230
|
+
staticBodies: presetRecords.filter((record) => record.body.type === "static").length,
|
|
231
|
+
colliders: presetRecords.length,
|
|
232
|
+
constraints: constraints.filter((constraint) => constraint.preset === preset).length,
|
|
233
|
+
visualKinds: unique(presetRecords.map((record) => record.visualKind)).sort(),
|
|
234
|
+
colliderKinds: unique(presetRecords.map((record) => record.colliderKind)).sort()
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
return summaries;
|
|
238
|
+
}
|
|
239
|
+
function nearestBody(bodies, target) {
|
|
240
|
+
return [...bodies].sort((left, right) => distanceVec3(left.position, target) - distanceVec3(right.position, target) || left.id - right.id)[0];
|
|
241
|
+
}
|
|
242
|
+
function lerpVec3(start, end, t) {
|
|
243
|
+
return [
|
|
244
|
+
start[0] + (end[0] - start[0]) * t,
|
|
245
|
+
start[1] + (end[1] - start[1]) * t,
|
|
246
|
+
start[2] + (end[2] - start[2]) * t
|
|
247
|
+
];
|
|
248
|
+
}
|
|
249
|
+
function distanceVec3(left, right) {
|
|
250
|
+
return Math.hypot(left[0] - right[0], left[1] - right[1], left[2] - right[2]);
|
|
251
|
+
}
|
|
252
|
+
function subVec3(left, right) {
|
|
253
|
+
return [left[0] - right[0], left[1] - right[1], left[2] - right[2]];
|
|
254
|
+
}
|
|
255
|
+
function scaleVec3(value, scale) {
|
|
256
|
+
return [value[0] * scale, value[1] * scale, value[2] * scale];
|
|
257
|
+
}
|
|
258
|
+
function unique(values) {
|
|
259
|
+
return [...new Set(values)];
|
|
260
|
+
}
|
|
261
|
+
function hashFixture(...parts) {
|
|
262
|
+
const text = JSON.stringify(parts);
|
|
263
|
+
let hash = 0x811c9dc5;
|
|
264
|
+
for (let index = 0; index < text.length; index += 1) {
|
|
265
|
+
hash ^= text.charCodeAt(index);
|
|
266
|
+
hash = Math.imul(hash, 0x01000193) >>> 0;
|
|
267
|
+
}
|
|
268
|
+
return hash.toString(16).padStart(8, "0");
|
|
269
|
+
}
|
|
270
|
+
function hash01(seed, salt) {
|
|
271
|
+
let value = Math.imul(seed + salt * 1013904223, 1664525) + 1013904223;
|
|
272
|
+
value = Math.imul(value ^ (value >>> 13), 1274126177);
|
|
273
|
+
return ((value ^ (value >>> 16)) >>> 0) / 4294967296;
|
|
274
|
+
}
|
|
275
|
+
function integer(value, label) {
|
|
276
|
+
if (!Number.isInteger(value))
|
|
277
|
+
throw new RangeError(`Physics sandbox fixture ${label} must be an integer.`);
|
|
278
|
+
return value;
|
|
279
|
+
}
|
|
280
|
+
//# sourceMappingURL=PhysicsSandboxFixtures.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PhysicsSandboxFixtures.js","sourceRoot":"","sources":["../../../../packages/physics/src/PhysicsSandboxFixtures.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { PhysicsWorld } from "./PhysicsWorld.js";
|
|
2
|
+
export type PhysicsStepperResult = {
|
|
3
|
+
readonly steps: number;
|
|
4
|
+
readonly alpha: number;
|
|
5
|
+
readonly droppedTime: number;
|
|
6
|
+
};
|
|
7
|
+
export declare class PhysicsStepper {
|
|
8
|
+
readonly fixedDelta: number;
|
|
9
|
+
readonly maxSubSteps: number;
|
|
10
|
+
private accumulator;
|
|
11
|
+
constructor(fixedDelta: number, maxSubSteps?: number);
|
|
12
|
+
advance(deltaSeconds: number, world: Pick<PhysicsWorld, "step">): PhysicsStepperResult;
|
|
13
|
+
reset(): void;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=PhysicsStepper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PhysicsStepper.d.ts","sourceRoot":"","sources":["../../../../packages/physics/src/PhysicsStepper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD,MAAM,MAAM,oBAAoB,GAAG;IACjC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B,CAAC;AAEF,qBAAa,cAAc;IACzB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,OAAO,CAAC,WAAW,CAAK;gBAEZ,UAAU,EAAE,MAAM,EAAE,WAAW,SAAI;IAW/C,OAAO,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,YAAY,EAAE,MAAM,CAAC,GAAG,oBAAoB;IAmBtF,KAAK,IAAI,IAAI;CAGd"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export class PhysicsStepper {
|
|
2
|
+
fixedDelta;
|
|
3
|
+
maxSubSteps;
|
|
4
|
+
accumulator = 0;
|
|
5
|
+
constructor(fixedDelta, maxSubSteps = 5) {
|
|
6
|
+
if (!Number.isFinite(fixedDelta) || fixedDelta <= 0) {
|
|
7
|
+
throw new Error("fixedDelta must be a finite positive number.");
|
|
8
|
+
}
|
|
9
|
+
if (!Number.isInteger(maxSubSteps) || maxSubSteps <= 0) {
|
|
10
|
+
throw new Error("maxSubSteps must be a positive integer.");
|
|
11
|
+
}
|
|
12
|
+
this.fixedDelta = fixedDelta;
|
|
13
|
+
this.maxSubSteps = maxSubSteps;
|
|
14
|
+
}
|
|
15
|
+
advance(deltaSeconds, world) {
|
|
16
|
+
if (!Number.isFinite(deltaSeconds) || deltaSeconds < 0) {
|
|
17
|
+
throw new Error("deltaSeconds must be finite and non-negative.");
|
|
18
|
+
}
|
|
19
|
+
this.accumulator += deltaSeconds;
|
|
20
|
+
let steps = 0;
|
|
21
|
+
while (this.accumulator + 1e-12 >= this.fixedDelta && steps < this.maxSubSteps) {
|
|
22
|
+
world.step(this.fixedDelta);
|
|
23
|
+
this.accumulator -= this.fixedDelta;
|
|
24
|
+
steps += 1;
|
|
25
|
+
}
|
|
26
|
+
let droppedTime = 0;
|
|
27
|
+
if (this.accumulator >= this.fixedDelta) {
|
|
28
|
+
droppedTime = this.accumulator;
|
|
29
|
+
this.accumulator = 0;
|
|
30
|
+
}
|
|
31
|
+
return { steps, alpha: this.accumulator / this.fixedDelta, droppedTime };
|
|
32
|
+
}
|
|
33
|
+
reset() {
|
|
34
|
+
this.accumulator = 0;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=PhysicsStepper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PhysicsStepper.js","sourceRoot":"","sources":["../../../../packages/physics/src/PhysicsStepper.ts"],"names":[],"mappings":"AAQA,MAAM,OAAO,cAAc;IAChB,UAAU,CAAS;IACnB,WAAW,CAAS;IACrB,WAAW,GAAG,CAAC,CAAC;IAExB,YAAY,UAAkB,EAAE,WAAW,GAAG,CAAC;QAC7C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,UAAU,IAAI,CAAC,EAAE,CAAC;YACpD,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;QAClE,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,WAAW,IAAI,CAAC,EAAE,CAAC;YACvD,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;QAC7D,CAAC;QACD,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;IACjC,CAAC;IAED,OAAO,CAAC,YAAoB,EAAE,KAAiC;QAC7D,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;YACvD,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;QACnE,CAAC;QACD,IAAI,CAAC,WAAW,IAAI,YAAY,CAAC;QACjC,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,OAAO,IAAI,CAAC,WAAW,GAAG,KAAK,IAAI,IAAI,CAAC,UAAU,IAAI,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;YAC/E,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC5B,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,UAAU,CAAC;YACpC,KAAK,IAAI,CAAC,CAAC;QACb,CAAC;QACD,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACxC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;YAC/B,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC;QACvB,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,WAAW,EAAE,CAAC;IAC3E,CAAC;IAED,KAAK;QACH,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC;IACvB,CAAC;CACF"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { Collider, type ColliderDescriptor } from "./Collider.js";
|
|
2
|
+
import { type CollisionEvent, type Contact } from "./CollisionEvents.js";
|
|
3
|
+
import { Constraint, type ConstraintDescriptor } from "./Constraint.js";
|
|
4
|
+
import { type RaycastHit, type RaycastOptions, type SphereCastHit } from "./Raycast.js";
|
|
5
|
+
import { RigidBody, type RigidBodyDescriptor, type RigidBodySnapshot } from "./RigidBody.js";
|
|
6
|
+
import { type Vec3 } from "./Shape.js";
|
|
7
|
+
export type PhysicsWorldDescriptor = {
|
|
8
|
+
readonly backend?: PhysicsBackendPreference;
|
|
9
|
+
readonly gravity?: Vec3;
|
|
10
|
+
readonly fixedDelta?: number;
|
|
11
|
+
readonly solverIterations?: number;
|
|
12
|
+
readonly enableSleeping?: boolean;
|
|
13
|
+
readonly sleepVelocityThreshold?: number;
|
|
14
|
+
readonly sleepDelay?: number;
|
|
15
|
+
};
|
|
16
|
+
export type PhysicsBackend = "cannon-es" | "aura-js";
|
|
17
|
+
export type PhysicsBackendPreference = PhysicsBackend | "auto";
|
|
18
|
+
export type PhysicsBackendSelection = {
|
|
19
|
+
readonly requested: PhysicsBackendPreference;
|
|
20
|
+
readonly active: PhysicsBackend;
|
|
21
|
+
readonly fallback?: string;
|
|
22
|
+
readonly deterministic: boolean;
|
|
23
|
+
readonly jsFallbackAvailable: boolean;
|
|
24
|
+
};
|
|
25
|
+
export type PhysicsStepStats = {
|
|
26
|
+
readonly steps: number;
|
|
27
|
+
readonly bodies: number;
|
|
28
|
+
readonly colliders: number;
|
|
29
|
+
readonly constraints: number;
|
|
30
|
+
readonly broadphasePairs: number;
|
|
31
|
+
readonly broadphaseFiniteColliders: number;
|
|
32
|
+
readonly broadphaseInfiniteColliders: number;
|
|
33
|
+
readonly broadphaseCandidateTests: number;
|
|
34
|
+
readonly broadphaseActiveMax: number;
|
|
35
|
+
readonly broadphaseRejectedByBounds: number;
|
|
36
|
+
readonly contacts: number;
|
|
37
|
+
readonly events: number;
|
|
38
|
+
readonly sleepingBodies: number;
|
|
39
|
+
readonly kineticEnergy: number;
|
|
40
|
+
readonly maxContactPenetration: number;
|
|
41
|
+
};
|
|
42
|
+
export type PhysicsSnapshot = {
|
|
43
|
+
readonly backend: PhysicsBackendSelection;
|
|
44
|
+
readonly bodies: readonly RigidBodySnapshot[];
|
|
45
|
+
readonly contacts: readonly Contact[];
|
|
46
|
+
readonly stats: PhysicsStepStats;
|
|
47
|
+
};
|
|
48
|
+
export declare class PhysicsWorld {
|
|
49
|
+
readonly gravity: [number, number, number];
|
|
50
|
+
readonly fixedDelta: number;
|
|
51
|
+
private readonly solverIterations;
|
|
52
|
+
private readonly enableSleeping;
|
|
53
|
+
private readonly sleepVelocityThreshold;
|
|
54
|
+
private readonly sleepDelay;
|
|
55
|
+
private readonly bodiesById;
|
|
56
|
+
private readonly collidersById;
|
|
57
|
+
private readonly constraintsList;
|
|
58
|
+
private readonly bodyColliders;
|
|
59
|
+
private readonly eventQueue;
|
|
60
|
+
private readonly requestedBackend;
|
|
61
|
+
private backendSelection;
|
|
62
|
+
private cannonWorld;
|
|
63
|
+
private readonly cannonBodiesByAuraId;
|
|
64
|
+
private nextBodyId;
|
|
65
|
+
private nextColliderId;
|
|
66
|
+
private lastEvents;
|
|
67
|
+
private lastBroadphasePairs;
|
|
68
|
+
private lastBroadphaseProfile;
|
|
69
|
+
private steps;
|
|
70
|
+
constructor(descriptor?: PhysicsWorldDescriptor);
|
|
71
|
+
createRigidBody(descriptor?: RigidBodyDescriptor): RigidBody;
|
|
72
|
+
createCollider(body: RigidBody | number, descriptor: ColliderDescriptor): Collider;
|
|
73
|
+
createConstraint(descriptor: ConstraintDescriptor): Constraint;
|
|
74
|
+
getBody(id: number): RigidBody | undefined;
|
|
75
|
+
getCollider(id: number): Collider | undefined;
|
|
76
|
+
bodies(): readonly RigidBody[];
|
|
77
|
+
colliders(): readonly Collider[];
|
|
78
|
+
private bodyValues;
|
|
79
|
+
private colliderValues;
|
|
80
|
+
constraints(): readonly Constraint[];
|
|
81
|
+
removeRigidBody(id: number): void;
|
|
82
|
+
removeCollider(id: number): void;
|
|
83
|
+
step(dt?: number): readonly CollisionEvent[];
|
|
84
|
+
drainEvents(): readonly CollisionEvent[];
|
|
85
|
+
raycast(origin: Vec3, direction: Vec3, options?: RaycastOptions): RaycastHit | undefined;
|
|
86
|
+
raycastAll(origin: Vec3, direction: Vec3, options?: RaycastOptions): readonly RaycastHit[];
|
|
87
|
+
sphereCast(origin: Vec3, radius: number, direction: Vec3, options?: RaycastOptions): SphereCastHit | undefined;
|
|
88
|
+
sphereCastAll(origin: Vec3, radius: number, direction: Vec3, options?: RaycastOptions): readonly SphereCastHit[];
|
|
89
|
+
snapshot(): PhysicsSnapshot;
|
|
90
|
+
private detectContacts;
|
|
91
|
+
private collectPotentialPairs;
|
|
92
|
+
private resolveContact;
|
|
93
|
+
private effectiveMaterial;
|
|
94
|
+
private applyImpulsePair;
|
|
95
|
+
private updateSleeping;
|
|
96
|
+
private createCannonBody;
|
|
97
|
+
private addCannonCollider;
|
|
98
|
+
private disableCannonBackend;
|
|
99
|
+
private stepCannon;
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=PhysicsWorld.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PhysicsWorld.d.ts","sourceRoot":"","sources":["../../../../packages/physics/src/PhysicsWorld.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,QAAQ,EAAE,KAAK,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAClE,OAAO,EAAuB,KAAK,cAAc,EAAE,KAAK,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC9F,OAAO,EAAE,UAAU,EAAE,KAAK,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACxE,OAAO,EAAuC,KAAK,UAAU,EAAE,KAAK,cAAc,EAAE,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7H,OAAO,EAAE,SAAS,EAAE,KAAK,mBAAmB,EAAE,KAAK,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAC7F,OAAO,EAAyF,KAAK,IAAI,EAAE,MAAM,YAAY,CAAC;AAE9H,MAAM,MAAM,sBAAsB,GAAG;IACnC,QAAQ,CAAC,OAAO,CAAC,EAAE,wBAAwB,CAAC;IAC5C,QAAQ,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC;IACxB,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC;IAClC,QAAQ,CAAC,sBAAsB,CAAC,EAAE,MAAM,CAAC;IACzC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,WAAW,GAAG,SAAS,CAAC;AACrD,MAAM,MAAM,wBAAwB,GAAG,cAAc,GAAG,MAAM,CAAC;AAE/D,MAAM,MAAM,uBAAuB,GAAG;IACpC,QAAQ,CAAC,SAAS,EAAE,wBAAwB,CAAC;IAC7C,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAChC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;IAChC,QAAQ,CAAC,mBAAmB,EAAE,OAAO,CAAC;CACvC,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,yBAAyB,EAAE,MAAM,CAAC;IAC3C,QAAQ,CAAC,2BAA2B,EAAE,MAAM,CAAC;IAC7C,QAAQ,CAAC,wBAAwB,EAAE,MAAM,CAAC;IAC1C,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,0BAA0B,EAAE,MAAM,CAAC;IAC5C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC;CACxC,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,CAAC,OAAO,EAAE,uBAAuB,CAAC;IAC1C,QAAQ,CAAC,MAAM,EAAE,SAAS,iBAAiB,EAAE,CAAC;IAC9C,QAAQ,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,CAAC;IACtC,QAAQ,CAAC,KAAK,EAAE,gBAAgB,CAAC;CAClC,CAAC;AAEF,qBAAa,YAAY;IACvB,QAAQ,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAU;IACzC,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAS;IAChD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAgC;IAC3D,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA+B;IAC7D,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAoB;IACpD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAkC;IAChE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA6B;IACxD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAA2B;IAC5D,OAAO,CAAC,gBAAgB,CAA0B;IAClD,OAAO,CAAC,WAAW,CAA0B;IAC7C,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAiC;IACtE,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,UAAU,CAAiC;IACnD,OAAO,CAAC,mBAAmB,CAAK;IAChC,OAAO,CAAC,qBAAqB,CAA+C;IAC5E,OAAO,CAAC,KAAK,CAAK;gBAEN,UAAU,GAAE,sBAA2B;IAqCnD,eAAe,CAAC,UAAU,GAAE,mBAAwB,GAAG,SAAS;IAahE,cAAc,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,EAAE,UAAU,EAAE,kBAAkB,GAAG,QAAQ;IAalF,gBAAgB,CAAC,UAAU,EAAE,oBAAoB,GAAG,UAAU;IAS9D,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS;IAI1C,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS;IAI7C,MAAM,IAAI,SAAS,SAAS,EAAE;IAI9B,SAAS,IAAI,SAAS,QAAQ,EAAE;IAIhC,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,cAAc;IAItB,WAAW,IAAI,SAAS,UAAU,EAAE;IAIpC,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAoBjC,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAahC,IAAI,CAAC,EAAE,SAAkB,GAAG,SAAS,cAAc,EAAE;IA6BrD,WAAW,IAAI,SAAS,cAAc,EAAE;IAMxC,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,GAAE,cAAmB,GAAG,UAAU,GAAG,SAAS;IAK5F,UAAU,CAAC,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,GAAE,cAAmB,GAAG,SAAS,UAAU,EAAE;IAiB9F,UAAU,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,GAAE,cAAmB,GAAG,aAAa,GAAG,SAAS;IAIlH,aAAa,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,GAAE,cAAmB,GAAG,SAAS,aAAa,EAAE;IAiBpH,QAAQ,IAAI,eAAe;IA2B3B,OAAO,CAAC,cAAc;IActB,OAAO,CAAC,qBAAqB;IA2D7B,OAAO,CAAC,cAAc;IA8CtB,OAAO,CAAC,iBAAiB;IAQzB,OAAO,CAAC,gBAAgB;IAexB,OAAO,CAAC,cAAc;IAgCtB,OAAO,CAAC,gBAAgB;IAmBxB,OAAO,CAAC,iBAAiB;IAkBzB,OAAO,CAAC,oBAAoB;IAa5B,OAAO,CAAC,UAAU;CAkBnB"}
|