@aura3d/physics 1.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +26 -0
- package/dist/CharacterController.d.ts +52 -0
- package/dist/CharacterController.d.ts.map +1 -0
- package/dist/CharacterController.js +146 -0
- package/dist/CharacterController.js.map +1 -0
- package/dist/ClothFixtures.d.ts +87 -0
- package/dist/ClothFixtures.d.ts.map +1 -0
- package/dist/ClothFixtures.js +264 -0
- package/dist/ClothFixtures.js.map +1 -0
- package/dist/Collider.d.ts +27 -0
- package/dist/Collider.d.ts.map +1 -0
- package/dist/Collider.js +45 -0
- package/dist/Collider.js.map +1 -0
- package/dist/CollisionEvents.d.ts +26 -0
- package/dist/CollisionEvents.d.ts.map +1 -0
- package/dist/CollisionEvents.js +46 -0
- package/dist/CollisionEvents.js.map +1 -0
- package/dist/CollisionVolumes.d.ts +57 -0
- package/dist/CollisionVolumes.d.ts.map +1 -0
- package/dist/CollisionVolumes.js +159 -0
- package/dist/CollisionVolumes.js.map +1 -0
- package/dist/Constraint.d.ts +31 -0
- package/dist/Constraint.d.ts.map +1 -0
- package/dist/Constraint.js +103 -0
- package/dist/Constraint.js.map +1 -0
- package/dist/Constraints.d.ts +2 -0
- package/dist/Constraints.d.ts.map +1 -0
- package/dist/Constraints.js +2 -0
- package/dist/Constraints.js.map +1 -0
- package/dist/Crowd.d.ts +64 -0
- package/dist/Crowd.d.ts.map +1 -0
- package/dist/Crowd.js +209 -0
- package/dist/Crowd.js.map +1 -0
- package/dist/ECSPhysicsBridge.d.ts +17 -0
- package/dist/ECSPhysicsBridge.d.ts.map +1 -0
- package/dist/ECSPhysicsBridge.js +37 -0
- package/dist/ECSPhysicsBridge.js.map +1 -0
- package/dist/FireSmokeFixtures.d.ts +103 -0
- package/dist/FireSmokeFixtures.d.ts.map +1 -0
- package/dist/FireSmokeFixtures.js +271 -0
- package/dist/FireSmokeFixtures.js.map +1 -0
- package/dist/FluidFixtures.d.ts +75 -0
- package/dist/FluidFixtures.d.ts.map +1 -0
- package/dist/FluidFixtures.js +219 -0
- package/dist/FluidFixtures.js.map +1 -0
- package/dist/FractureFixtures.d.ts +68 -0
- package/dist/FractureFixtures.d.ts.map +1 -0
- package/dist/FractureFixtures.js +199 -0
- package/dist/FractureFixtures.js.map +1 -0
- package/dist/HitboxWorld.d.ts +250 -0
- package/dist/HitboxWorld.d.ts.map +1 -0
- package/dist/HitboxWorld.js +771 -0
- package/dist/HitboxWorld.js.map +1 -0
- package/dist/KinematicBody.d.ts +157 -0
- package/dist/KinematicBody.d.ts.map +1 -0
- package/dist/KinematicBody.js +405 -0
- package/dist/KinematicBody.js.map +1 -0
- package/dist/KinematicWorld.d.ts +58 -0
- package/dist/KinematicWorld.d.ts.map +1 -0
- package/dist/KinematicWorld.js +246 -0
- package/dist/KinematicWorld.js.map +1 -0
- package/dist/Navigation.d.ts +67 -0
- package/dist/Navigation.d.ts.map +1 -0
- package/dist/Navigation.js +261 -0
- package/dist/Navigation.js.map +1 -0
- package/dist/PhysicsDebugDraw.d.ts +11 -0
- package/dist/PhysicsDebugDraw.d.ts.map +1 -0
- package/dist/PhysicsDebugDraw.js +64 -0
- package/dist/PhysicsDebugDraw.js.map +1 -0
- package/dist/PhysicsSandboxFixtures.d.ts +53 -0
- package/dist/PhysicsSandboxFixtures.d.ts.map +1 -0
- package/dist/PhysicsSandboxFixtures.js +280 -0
- package/dist/PhysicsSandboxFixtures.js.map +1 -0
- package/dist/PhysicsStepper.d.ts +15 -0
- package/dist/PhysicsStepper.d.ts.map +1 -0
- package/dist/PhysicsStepper.js +37 -0
- package/dist/PhysicsStepper.js.map +1 -0
- package/dist/PhysicsWorld.d.ts +101 -0
- package/dist/PhysicsWorld.d.ts.map +1 -0
- package/dist/PhysicsWorld.js +868 -0
- package/dist/PhysicsWorld.js.map +1 -0
- package/dist/PlatformerFixtures.d.ts +70 -0
- package/dist/PlatformerFixtures.d.ts.map +1 -0
- package/dist/PlatformerFixtures.js +120 -0
- package/dist/PlatformerFixtures.js.map +1 -0
- package/dist/Raycast.d.ts +23 -0
- package/dist/Raycast.d.ts.map +1 -0
- package/dist/Raycast.js +271 -0
- package/dist/Raycast.js.map +1 -0
- package/dist/RigidBody.d.ts +69 -0
- package/dist/RigidBody.d.ts.map +1 -0
- package/dist/RigidBody.js +255 -0
- package/dist/RigidBody.js.map +1 -0
- package/dist/ScenePhysicsBridge.d.ts +42 -0
- package/dist/ScenePhysicsBridge.d.ts.map +1 -0
- package/dist/ScenePhysicsBridge.js +168 -0
- package/dist/ScenePhysicsBridge.js.map +1 -0
- package/dist/Shape.d.ts +50 -0
- package/dist/Shape.d.ts.map +1 -0
- package/dist/Shape.js +128 -0
- package/dist/Shape.js.map +1 -0
- package/dist/SoftBodyFixtures.d.ts +70 -0
- package/dist/SoftBodyFixtures.d.ts.map +1 -0
- package/dist/SoftBodyFixtures.js +272 -0
- package/dist/SoftBodyFixtures.js.map +1 -0
- package/dist/Steering.d.ts +161 -0
- package/dist/Steering.d.ts.map +1 -0
- package/dist/Steering.js +347 -0
- package/dist/Steering.js.map +1 -0
- package/dist/VehicleDynamics.d.ts +152 -0
- package/dist/VehicleDynamics.d.ts.map +1 -0
- package/dist/VehicleDynamics.js +335 -0
- package/dist/VehicleDynamics.js.map +1 -0
- package/dist/index.d.ts +29 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +29 -0
- package/dist/index.js.map +1 -0
- package/package.json +17 -0
- package/src/CharacterController.ts +184 -0
- package/src/ClothFixtures.ts +359 -0
- package/src/Collider.ts +67 -0
- package/src/CollisionEvents.ts +70 -0
- package/src/CollisionVolumes.ts +218 -0
- package/src/Constraint.ts +120 -0
- package/src/Constraints.ts +1 -0
- package/src/Crowd.ts +283 -0
- package/src/ECSPhysicsBridge.ts +53 -0
- package/src/FireSmokeFixtures.ts +382 -0
- package/src/FluidFixtures.ts +301 -0
- package/src/FractureFixtures.ts +277 -0
- package/src/HitboxWorld.ts +1179 -0
- package/src/KinematicBody.ts +553 -0
- package/src/KinematicWorld.ts +310 -0
- package/src/Navigation.ts +321 -0
- package/src/PhysicsDebugDraw.ts +71 -0
- package/src/PhysicsSandboxFixtures.ts +394 -0
- package/src/PhysicsStepper.ts +47 -0
- package/src/PhysicsWorld.ts +986 -0
- package/src/PlatformerFixtures.ts +205 -0
- package/src/Raycast.ts +315 -0
- package/src/RigidBody.ts +311 -0
- package/src/ScenePhysicsBridge.ts +207 -0
- package/src/Shape.ts +182 -0
- package/src/SoftBodyFixtures.ts +363 -0
- package/src/Steering.ts +531 -0
- package/src/VehicleDynamics.ts +524 -0
- package/src/index.ts +28 -0
package/dist/Crowd.js
ADDED
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
import { arriveSteering } from "./Steering.js";
|
|
2
|
+
export class CrowdSimulation {
|
|
3
|
+
agents = [];
|
|
4
|
+
neighborRadius;
|
|
5
|
+
maxNeighbors;
|
|
6
|
+
separationWeight;
|
|
7
|
+
alignmentWeight;
|
|
8
|
+
cohesionWeight;
|
|
9
|
+
formationWeight;
|
|
10
|
+
maxForce;
|
|
11
|
+
formation;
|
|
12
|
+
lastNeighbors = new Map();
|
|
13
|
+
lastSlots = new Map();
|
|
14
|
+
constructor(options = {}) {
|
|
15
|
+
this.neighborRadius = positive(options.neighborRadius ?? 0.55, "neighborRadius");
|
|
16
|
+
this.maxNeighbors = Math.max(1, Math.floor(options.maxNeighbors ?? 6));
|
|
17
|
+
this.separationWeight = nonNegative(options.separationWeight ?? 1.8, "separationWeight");
|
|
18
|
+
this.alignmentWeight = nonNegative(options.alignmentWeight ?? 0.55, "alignmentWeight");
|
|
19
|
+
this.cohesionWeight = nonNegative(options.cohesionWeight ?? 0.42, "cohesionWeight");
|
|
20
|
+
this.formationWeight = nonNegative(options.formationWeight ?? 0.85, "formationWeight");
|
|
21
|
+
this.maxForce = positive(options.maxForce ?? 1.2, "maxForce");
|
|
22
|
+
}
|
|
23
|
+
addAgent(options) {
|
|
24
|
+
if (this.agents.some((agent) => agent.id === options.id))
|
|
25
|
+
throw new Error(`Crowd agent already exists: ${options.id}`);
|
|
26
|
+
this.agents.push({
|
|
27
|
+
id: options.id,
|
|
28
|
+
position: options.position,
|
|
29
|
+
velocity: options.velocity ?? [0, 0],
|
|
30
|
+
radius: positive(options.radius ?? 0.1, "radius"),
|
|
31
|
+
maxSpeed: positive(options.maxSpeed ?? 0.65, "maxSpeed"),
|
|
32
|
+
priority: nonNegative(options.priority ?? 50, "priority")
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
removeAgent(id) {
|
|
36
|
+
const index = this.agents.findIndex((agent) => agent.id === id);
|
|
37
|
+
if (index < 0)
|
|
38
|
+
return false;
|
|
39
|
+
this.agents.splice(index, 1);
|
|
40
|
+
this.lastNeighbors.delete(id);
|
|
41
|
+
this.lastSlots.delete(id);
|
|
42
|
+
return true;
|
|
43
|
+
}
|
|
44
|
+
setFormation(options) {
|
|
45
|
+
this.formation = options;
|
|
46
|
+
}
|
|
47
|
+
update(deltaSeconds) {
|
|
48
|
+
const dt = Math.max(0, deltaSeconds);
|
|
49
|
+
const neighborsById = new Map(this.agents.map((agent) => [agent.id, this.neighborsFor(agent)]));
|
|
50
|
+
const slots = formationSlots(this.agents.length, this.formation);
|
|
51
|
+
this.lastNeighbors = neighborsById;
|
|
52
|
+
this.lastSlots = new Map(this.agents.map((agent, index) => [agent.id, slots[index] ?? agent.position]));
|
|
53
|
+
for (let index = 0; index < this.agents.length; index += 1) {
|
|
54
|
+
const agent = this.agents[index];
|
|
55
|
+
const neighbors = neighborsById.get(agent.id) ?? [];
|
|
56
|
+
const slot = slots[index] ?? agent.position;
|
|
57
|
+
const force = clampMagnitude(addMany([
|
|
58
|
+
scale(separationForce(agent, neighbors), this.separationWeight),
|
|
59
|
+
scale(alignmentForce(agent, neighbors), this.alignmentWeight),
|
|
60
|
+
scale(cohesionForce(agent, neighbors), this.cohesionWeight),
|
|
61
|
+
scale(formationForce(agent, slot), this.formationWeight)
|
|
62
|
+
]), this.maxForce);
|
|
63
|
+
const priorityDamping = Math.max(0.35, Math.min(1, agent.priority / 100));
|
|
64
|
+
const velocity = clampMagnitude([
|
|
65
|
+
agent.velocity[0] + force[0] * dt * priorityDamping,
|
|
66
|
+
agent.velocity[1] + force[1] * dt * priorityDamping
|
|
67
|
+
], agent.maxSpeed);
|
|
68
|
+
agent.velocity = velocity;
|
|
69
|
+
agent.position = [
|
|
70
|
+
round3(agent.position[0] + velocity[0] * dt),
|
|
71
|
+
round3(agent.position[1] + velocity[1] * dt)
|
|
72
|
+
];
|
|
73
|
+
}
|
|
74
|
+
return this.snapshot();
|
|
75
|
+
}
|
|
76
|
+
snapshot() {
|
|
77
|
+
const agentSnapshots = this.agents.map((agent) => {
|
|
78
|
+
const neighbors = this.lastNeighbors.get(agent.id) ?? [];
|
|
79
|
+
return {
|
|
80
|
+
id: agent.id,
|
|
81
|
+
position: [round3(agent.position[0]), round3(agent.position[1])],
|
|
82
|
+
velocity: [round3(agent.velocity[0]), round3(agent.velocity[1])],
|
|
83
|
+
speed: round3(length(agent.velocity)),
|
|
84
|
+
neighborCount: neighbors.length,
|
|
85
|
+
formationSlot: this.lastSlots.get(agent.id) ?? agent.position
|
|
86
|
+
};
|
|
87
|
+
});
|
|
88
|
+
const neighborPairs = agentSnapshots.reduce((sum, agent) => sum + agent.neighborCount, 0) / 2;
|
|
89
|
+
const averageSpeed = agentSnapshots.length > 0
|
|
90
|
+
? agentSnapshots.reduce((sum, agent) => sum + agent.speed, 0) / agentSnapshots.length
|
|
91
|
+
: 0;
|
|
92
|
+
return {
|
|
93
|
+
agentCount: agentSnapshots.length,
|
|
94
|
+
neighborPairs: round3(neighborPairs),
|
|
95
|
+
averageNeighbors: agentSnapshots.length > 0 ? round3((neighborPairs * 2) / agentSnapshots.length) : 0,
|
|
96
|
+
averageSpeed: round3(averageSpeed),
|
|
97
|
+
maxSpeed: round3(Math.max(0, ...agentSnapshots.map((agent) => agent.speed))),
|
|
98
|
+
formationType: this.formation?.type ?? "none",
|
|
99
|
+
center: centerOf(agentSnapshots.map((agent) => agent.position)),
|
|
100
|
+
agents: agentSnapshots
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
neighborsFor(agent) {
|
|
104
|
+
return this.agents
|
|
105
|
+
.filter((candidate) => candidate !== agent && distance(agent.position, candidate.position) <= this.neighborRadius)
|
|
106
|
+
.sort((left, right) => distance(agent.position, left.position) - distance(agent.position, right.position) || left.id.localeCompare(right.id))
|
|
107
|
+
.slice(0, this.maxNeighbors);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
function separationForce(agent, neighbors) {
|
|
111
|
+
const contributions = neighbors.map((neighbor) => {
|
|
112
|
+
const away = subtract(agent.position, neighbor.position);
|
|
113
|
+
const gap = Math.max(0.001, length(away) - agent.radius - neighbor.radius);
|
|
114
|
+
return scale(normalize(away), 1 / gap);
|
|
115
|
+
});
|
|
116
|
+
return normalize(addMany(contributions));
|
|
117
|
+
}
|
|
118
|
+
function alignmentForce(agent, neighbors) {
|
|
119
|
+
if (neighbors.length === 0)
|
|
120
|
+
return [0, 0];
|
|
121
|
+
const average = scale(addMany(neighbors.map((neighbor) => neighbor.velocity)), 1 / neighbors.length);
|
|
122
|
+
return subtract(clampMagnitude(average, agent.maxSpeed), agent.velocity);
|
|
123
|
+
}
|
|
124
|
+
function cohesionForce(agent, neighbors) {
|
|
125
|
+
if (neighbors.length === 0)
|
|
126
|
+
return [0, 0];
|
|
127
|
+
const center = centerOf(neighbors.map((neighbor) => neighbor.position));
|
|
128
|
+
return arriveSteering({ position: agent.position, velocity: agent.velocity, target: center, maxSpeed: agent.maxSpeed, slowingRadius: 0.45 }).force;
|
|
129
|
+
}
|
|
130
|
+
function formationForce(agent, slot) {
|
|
131
|
+
return arriveSteering({ position: agent.position, velocity: agent.velocity, target: slot, maxSpeed: agent.maxSpeed, slowingRadius: 0.35, tolerance: 0.025 }).force;
|
|
132
|
+
}
|
|
133
|
+
function formationSlots(count, formation) {
|
|
134
|
+
if (!formation)
|
|
135
|
+
return [];
|
|
136
|
+
const spacing = formation.spacing ?? 0.24;
|
|
137
|
+
const forward = normalize(formation.forward ?? [1, 0]);
|
|
138
|
+
const right = [forward[1], -forward[0]];
|
|
139
|
+
return Array.from({ length: count }, (_, index) => {
|
|
140
|
+
switch (formation.type) {
|
|
141
|
+
case "line":
|
|
142
|
+
return offset(formation.center, right, (index - (count - 1) / 2) * spacing);
|
|
143
|
+
case "column":
|
|
144
|
+
return offset(formation.center, forward, -index * spacing);
|
|
145
|
+
case "circle": {
|
|
146
|
+
const angle = (Math.PI * 2 * index) / Math.max(1, count);
|
|
147
|
+
return [round3(formation.center[0] + Math.cos(angle) * spacing), round3(formation.center[1] + Math.sin(angle) * spacing)];
|
|
148
|
+
}
|
|
149
|
+
case "wedge": {
|
|
150
|
+
if (index === 0)
|
|
151
|
+
return formation.center;
|
|
152
|
+
const side = index % 2 === 0 ? 1 : -1;
|
|
153
|
+
const row = Math.ceil(index / 2);
|
|
154
|
+
return add(offset(formation.center, forward, -row * spacing), scale(right, side * row * spacing));
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
function offset(origin, direction, amount) {
|
|
160
|
+
return [round3(origin[0] + direction[0] * amount), round3(origin[1] + direction[1] * amount)];
|
|
161
|
+
}
|
|
162
|
+
function add(left, right) {
|
|
163
|
+
return [round3(left[0] + right[0]), round3(left[1] + right[1])];
|
|
164
|
+
}
|
|
165
|
+
function subtract(left, right) {
|
|
166
|
+
return [left[0] - right[0], left[1] - right[1]];
|
|
167
|
+
}
|
|
168
|
+
function scale(value, scalar) {
|
|
169
|
+
return [value[0] * scalar, value[1] * scalar];
|
|
170
|
+
}
|
|
171
|
+
function addMany(values) {
|
|
172
|
+
return values.reduce((sum, value) => [sum[0] + value[0], sum[1] + value[1]], [0, 0]);
|
|
173
|
+
}
|
|
174
|
+
function distance(left, right) {
|
|
175
|
+
return length(subtract(left, right));
|
|
176
|
+
}
|
|
177
|
+
function length(value) {
|
|
178
|
+
return Math.hypot(value[0], value[1]);
|
|
179
|
+
}
|
|
180
|
+
function normalize(value) {
|
|
181
|
+
const magnitude = length(value);
|
|
182
|
+
return magnitude === 0 ? [0, 0] : [value[0] / magnitude, value[1] / magnitude];
|
|
183
|
+
}
|
|
184
|
+
function clampMagnitude(value, maxMagnitude) {
|
|
185
|
+
const magnitude = length(value);
|
|
186
|
+
if (magnitude === 0 || magnitude <= maxMagnitude)
|
|
187
|
+
return value;
|
|
188
|
+
return scale(value, maxMagnitude / magnitude);
|
|
189
|
+
}
|
|
190
|
+
function centerOf(points) {
|
|
191
|
+
if (points.length === 0)
|
|
192
|
+
return [0, 0];
|
|
193
|
+
const sum = points.reduce((total, point) => [total[0] + point[0], total[1] + point[1]], [0, 0]);
|
|
194
|
+
return [round3(sum[0] / points.length), round3(sum[1] / points.length)];
|
|
195
|
+
}
|
|
196
|
+
function positive(value, name) {
|
|
197
|
+
if (!Number.isFinite(value) || value <= 0)
|
|
198
|
+
throw new RangeError(`Crowd ${name} must be a finite positive number.`);
|
|
199
|
+
return value;
|
|
200
|
+
}
|
|
201
|
+
function nonNegative(value, name) {
|
|
202
|
+
if (!Number.isFinite(value) || value < 0)
|
|
203
|
+
throw new RangeError(`Crowd ${name} must be a finite non-negative number.`);
|
|
204
|
+
return value;
|
|
205
|
+
}
|
|
206
|
+
function round3(value) {
|
|
207
|
+
return Number(value.toFixed(3));
|
|
208
|
+
}
|
|
209
|
+
//# sourceMappingURL=Crowd.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Crowd.js","sourceRoot":"","sources":["../../../../packages/physics/src/Crowd.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { PhysicsWorld } from "./PhysicsWorld.js";
|
|
2
|
+
export type ECSTransformLike = {
|
|
3
|
+
position: [number, number, number];
|
|
4
|
+
};
|
|
5
|
+
export type ECSPhysicsBinding = {
|
|
6
|
+
readonly bodyId: number;
|
|
7
|
+
readonly transform: ECSTransformLike;
|
|
8
|
+
readonly mode?: "dynamic" | "kinematic";
|
|
9
|
+
};
|
|
10
|
+
export declare class ECSPhysicsBridge {
|
|
11
|
+
private readonly bindings;
|
|
12
|
+
bind(binding: ECSPhysicsBinding): void;
|
|
13
|
+
unbind(bodyId: number): void;
|
|
14
|
+
pushKinematic(world: Pick<PhysicsWorld, "getBody">): void;
|
|
15
|
+
pullDynamic(world: Pick<PhysicsWorld, "getBody">, alpha?: number): void;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=ECSPhysicsBridge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ECSPhysicsBridge.d.ts","sourceRoot":"","sources":["../../../../packages/physics/src/ECSPhysicsBridge.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAItD,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;CACpC,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,gBAAgB,CAAC;IACrC,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,GAAG,WAAW,CAAC;CACzC,CAAC;AAEF,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAwC;IAEjE,IAAI,CAAC,OAAO,EAAE,iBAAiB,GAAG,IAAI;IAOtC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAI5B,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC,GAAG,IAAI;IASzD,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC,EAAE,KAAK,SAAI,GAAG,IAAI;CAenE"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { interpolatePosition } from "./ScenePhysicsBridge.js";
|
|
2
|
+
export class ECSPhysicsBridge {
|
|
3
|
+
bindings = new Map();
|
|
4
|
+
bind(binding) {
|
|
5
|
+
if (this.bindings.has(binding.bodyId)) {
|
|
6
|
+
throw new Error(`Body ${binding.bodyId} is already bound to an ECS transform.`);
|
|
7
|
+
}
|
|
8
|
+
this.bindings.set(binding.bodyId, binding);
|
|
9
|
+
}
|
|
10
|
+
unbind(bodyId) {
|
|
11
|
+
this.bindings.delete(bodyId);
|
|
12
|
+
}
|
|
13
|
+
pushKinematic(world) {
|
|
14
|
+
for (const binding of this.bindings.values()) {
|
|
15
|
+
if (binding.mode !== "kinematic") {
|
|
16
|
+
continue;
|
|
17
|
+
}
|
|
18
|
+
world.getBody(binding.bodyId)?.setPosition(binding.transform.position);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
pullDynamic(world, alpha = 1) {
|
|
22
|
+
for (const binding of this.bindings.values()) {
|
|
23
|
+
if (binding.mode === "kinematic") {
|
|
24
|
+
continue;
|
|
25
|
+
}
|
|
26
|
+
const body = world.getBody(binding.bodyId);
|
|
27
|
+
if (!body) {
|
|
28
|
+
continue;
|
|
29
|
+
}
|
|
30
|
+
const interpolated = interpolatePosition(body.previousPosition, body.position, alpha);
|
|
31
|
+
binding.transform.position[0] = interpolated[0];
|
|
32
|
+
binding.transform.position[1] = interpolated[1];
|
|
33
|
+
binding.transform.position[2] = interpolated[2];
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=ECSPhysicsBridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ECSPhysicsBridge.js","sourceRoot":"","sources":["../../../../packages/physics/src/ECSPhysicsBridge.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAa9D,MAAM,OAAO,gBAAgB;IACV,QAAQ,GAAG,IAAI,GAAG,EAA6B,CAAC;IAEjE,IAAI,CAAC,OAA0B;QAC7B,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YACtC,MAAM,IAAI,KAAK,CAAC,QAAQ,OAAO,CAAC,MAAM,wCAAwC,CAAC,CAAC;QAClF,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC7C,CAAC;IAED,MAAM,CAAC,MAAc;QACnB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC/B,CAAC;IAED,aAAa,CAAC,KAAoC;QAChD,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;YAC7C,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;gBACjC,SAAS;YACX,CAAC;YACD,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACzE,CAAC;IACH,CAAC;IAED,WAAW,CAAC,KAAoC,EAAE,KAAK,GAAG,CAAC;QACzD,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;YAC7C,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;gBACjC,SAAS;YACX,CAAC;YACD,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAC3C,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,SAAS;YACX,CAAC;YACD,MAAM,YAAY,GAAG,mBAAmB,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;YACtF,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;YAChD,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;YAChD,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
export interface FireSmokeFixtureOptions {
|
|
2
|
+
readonly seed?: number;
|
|
3
|
+
readonly gridResolution?: readonly [number, number, number];
|
|
4
|
+
readonly elapsedSeconds?: number;
|
|
5
|
+
readonly sourceCount?: number;
|
|
6
|
+
}
|
|
7
|
+
export interface FireSmokeFixture {
|
|
8
|
+
readonly id: "external-parity-old-branch-fire-smoke-fixture";
|
|
9
|
+
readonly source: "origin-master-fire-smoke-volume-adapted";
|
|
10
|
+
readonly sourceFiles: readonly [
|
|
11
|
+
"origin/master:src/simulation/fire/FireSimulation.ts",
|
|
12
|
+
"origin/master:src/simulation/fire/FireParticleSystem.ts",
|
|
13
|
+
"origin/master:src/simulation/fire/TemperatureField.ts",
|
|
14
|
+
"origin/master:src/simulation/fire/TurbulenceSimulation.ts",
|
|
15
|
+
"origin/master:src/simulation/smoke/SmokeSimulation.ts",
|
|
16
|
+
"origin/master:src/simulation/smoke/SmokeGrid.ts",
|
|
17
|
+
"origin/master:src/simulation/smoke/SmokeRenderer.ts"
|
|
18
|
+
];
|
|
19
|
+
readonly config: {
|
|
20
|
+
readonly solver: "bounded-fire-smoke-telemetry";
|
|
21
|
+
readonly ambientTemperature: number;
|
|
22
|
+
readonly combustionTemperature: number;
|
|
23
|
+
readonly ignitionTemperature: number;
|
|
24
|
+
readonly fuelConsumptionRate: number;
|
|
25
|
+
readonly buoyancyStrength: number;
|
|
26
|
+
readonly turbulenceStrength: number;
|
|
27
|
+
readonly smokeGenerationRate: number;
|
|
28
|
+
readonly coolingRate: number;
|
|
29
|
+
readonly diffusionRate: number;
|
|
30
|
+
readonly smokePressureIterations: number;
|
|
31
|
+
readonly vorticityStrength: number;
|
|
32
|
+
readonly smokeDissipationRate: number;
|
|
33
|
+
readonly particleEmissionRate: number;
|
|
34
|
+
readonly particleLifetime: number;
|
|
35
|
+
readonly maxParticles: number;
|
|
36
|
+
readonly rayMarchMaxSteps: number;
|
|
37
|
+
readonly rayMarchStepSize: number;
|
|
38
|
+
};
|
|
39
|
+
readonly grid: {
|
|
40
|
+
readonly resolution: readonly [number, number, number];
|
|
41
|
+
readonly cellCount: number;
|
|
42
|
+
readonly sourceCount: number;
|
|
43
|
+
readonly hotCellSamples: readonly FireSmokeHotCellSample[];
|
|
44
|
+
};
|
|
45
|
+
readonly fire: {
|
|
46
|
+
readonly activeFuelCells: number;
|
|
47
|
+
readonly burningCells: number;
|
|
48
|
+
readonly averageTemperature: number;
|
|
49
|
+
readonly maxTemperature: number;
|
|
50
|
+
readonly fuelConsumed: number;
|
|
51
|
+
readonly smokeGenerated: number;
|
|
52
|
+
readonly buoyancyImpulse: number;
|
|
53
|
+
readonly turbulenceEnergy: number;
|
|
54
|
+
readonly coolingLoss: number;
|
|
55
|
+
readonly diffusionEstimate: number;
|
|
56
|
+
};
|
|
57
|
+
readonly particles: {
|
|
58
|
+
readonly emittedParticles: number;
|
|
59
|
+
readonly activeParticles: number;
|
|
60
|
+
readonly emberParticles: number;
|
|
61
|
+
readonly averageLifetime: number;
|
|
62
|
+
readonly averageSize: number;
|
|
63
|
+
readonly maxTemperature: number;
|
|
64
|
+
readonly uploadBytes: number;
|
|
65
|
+
};
|
|
66
|
+
readonly smoke: {
|
|
67
|
+
readonly densityCells: number;
|
|
68
|
+
readonly totalDensity: number;
|
|
69
|
+
readonly maxDensity: number;
|
|
70
|
+
readonly averageVelocityMagnitude: number;
|
|
71
|
+
readonly divergenceBeforeProjection: number;
|
|
72
|
+
readonly divergenceAfterProjection: number;
|
|
73
|
+
readonly pressureIterations: number;
|
|
74
|
+
readonly vorticityCells: number;
|
|
75
|
+
readonly buoyancyForceEstimate: number;
|
|
76
|
+
readonly dissipationLoss: number;
|
|
77
|
+
};
|
|
78
|
+
readonly volumeRendering: {
|
|
79
|
+
readonly rayMarchSteps: number;
|
|
80
|
+
readonly stepSize: number;
|
|
81
|
+
readonly sampledDensity: number;
|
|
82
|
+
readonly transmittance: number;
|
|
83
|
+
readonly scattering: number;
|
|
84
|
+
readonly shadowSamples: number;
|
|
85
|
+
readonly shadowTransmittance: number;
|
|
86
|
+
readonly alpha: number;
|
|
87
|
+
readonly volumetricRendererClaimed: false;
|
|
88
|
+
readonly productionLightingClaimed: false;
|
|
89
|
+
};
|
|
90
|
+
readonly blockedClaims: readonly string[];
|
|
91
|
+
readonly hash: string;
|
|
92
|
+
readonly claimBoundary: string;
|
|
93
|
+
}
|
|
94
|
+
export interface FireSmokeHotCellSample {
|
|
95
|
+
readonly index: number;
|
|
96
|
+
readonly cell: readonly [number, number, number];
|
|
97
|
+
readonly temperature: number;
|
|
98
|
+
readonly fuel: number;
|
|
99
|
+
readonly smokeDensity: number;
|
|
100
|
+
readonly velocity: readonly [number, number, number];
|
|
101
|
+
}
|
|
102
|
+
export declare function sampleFireSmokeFixture(options?: FireSmokeFixtureOptions): FireSmokeFixture;
|
|
103
|
+
//# sourceMappingURL=FireSmokeFixtures.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FireSmokeFixtures.d.ts","sourceRoot":"","sources":["../../../../packages/physics/src/FireSmokeFixtures.ts"],"names":[],"mappings":"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"}
|