@adobe/data-gpu 0.9.86 → 0.9.88
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/graphics/rendering/bone-collider-plugin.d.ts +2724 -331
- package/dist/graphics/rendering/interpolation-plugin.d.ts +2532 -138
- package/dist/graphics/rendering/jolt-ragdoll-plugin.d.ts +2398 -5
- package/dist/graphics/rendering/model-collider-plugin.d.ts +2675 -282
- package/dist/graphics/rendering/pbr-render/physics-bridge-plugin.d.ts +2396 -3
- package/dist/physics/physics-data-plugin.d.ts +2398 -2
- package/dist/physics/physics-data-plugin.js +26 -0
- package/dist/physics/physics-data-plugin.js.map +1 -1
- package/dist/physics/physics-hit.d.ts +18 -0
- package/dist/physics/physics-hit.js +3 -0
- package/dist/physics/physics-hit.js.map +1 -0
- package/dist/physics/physics-query.d.ts +43 -0
- package/dist/physics/physics-query.js +3 -0
- package/dist/physics/physics-query.js.map +1 -0
- package/dist/physics/public.d.ts +2 -0
- package/dist/physics/public.js +2 -0
- package/dist/physics/public.js.map +1 -1
- package/dist/physics/solvers/jolt-solver-plugin.d.ts +2394 -4
- package/dist/physics/solvers/jolt-solver-plugin.js +149 -0
- package/dist/physics/solvers/jolt-solver-plugin.js.map +1 -1
- package/dist/physics/solvers/mutable-hit.d.ts +14 -0
- package/dist/physics/solvers/mutable-hit.js +3 -0
- package/dist/physics/solvers/mutable-hit.js.map +1 -0
- package/dist/physics/solvers/orient-normal-against-ray.d.ts +11 -0
- package/dist/physics/solvers/orient-normal-against-ray.js +25 -0
- package/dist/physics/solvers/orient-normal-against-ray.js.map +1 -0
- package/dist/physics/solvers/orient-normal-against-ray.test.d.ts +1 -0
- package/dist/physics/solvers/orient-normal-against-ray.test.js +27 -0
- package/dist/physics/solvers/orient-normal-against-ray.test.js.map +1 -0
- package/dist/physics/solvers/pick-ray-conformance.test.d.ts +1 -0
- package/dist/physics/solvers/pick-ray-conformance.test.js +159 -0
- package/dist/physics/solvers/pick-ray-conformance.test.js.map +1 -0
- package/dist/physics/solvers/rapier-solver-plugin.d.ts +2394 -4
- package/dist/physics/solvers/rapier-solver-plugin.js +110 -1
- package/dist/physics/solvers/rapier-solver-plugin.js.map +1 -1
- package/package.json +2 -2
- package/src/physics/README.md +15 -2
- package/src/physics/physics-data-plugin.ts +29 -1
- package/src/physics/physics-hit.ts +21 -0
- package/src/physics/physics-query.ts +42 -0
- package/src/physics/public.ts +2 -0
- package/src/physics/solvers/jolt-solver-plugin.ts +119 -0
- package/src/physics/solvers/mutable-hit.ts +18 -0
- package/src/physics/solvers/orient-normal-against-ray.test.ts +31 -0
- package/src/physics/solvers/orient-normal-against-ray.ts +18 -0
- package/src/physics/solvers/pick-ray-conformance.test.ts +200 -0
- package/src/physics/solvers/rapier-solver-plugin.ts +92 -1
- package/tsconfig.tsbuildinfo +1 -1
|
@@ -7,6 +7,8 @@ import { physicsClock } from "../physics-clock-plugin.js";
|
|
|
7
7
|
import { physicsData } from "../physics-data-plugin.js";
|
|
8
8
|
import { jointData } from "../joint/joint-plugin.js";
|
|
9
9
|
import { BodyType } from "../body/body-type/body-type.js";
|
|
10
|
+
import { orientNormalAgainstRay } from "./orient-normal-against-ray.js";
|
|
11
|
+
import { newHit } from "./mutable-hit.js";
|
|
10
12
|
/**
|
|
11
13
|
* A second rigid-body solver behind the same `physicsData` seam — the
|
|
12
14
|
* battle-tested Rapier engine (dimforge, Rust→WASM). It reads the identical
|
|
@@ -78,6 +80,7 @@ export const rapierSolver = Database.Plugin.create({
|
|
|
78
80
|
desc.setAngvel({ x: wx, y: wy, z: wz });
|
|
79
81
|
}
|
|
80
82
|
const body = world.createRigidBody(desc);
|
|
83
|
+
body.userData = id; // reverse lookup for ray-pick: collider → parent body → entity
|
|
81
84
|
// capsule: Y-aligned, halfHeight = cylinder half (hy), radius = hx.
|
|
82
85
|
// hull: convex hull of the authored point cloud (read once here).
|
|
83
86
|
let col;
|
|
@@ -109,11 +112,117 @@ export const rapierSolver = Database.Plugin.create({
|
|
|
109
112
|
world.createCollider(col, body);
|
|
110
113
|
bodies.set(id, body);
|
|
111
114
|
};
|
|
115
|
+
// Solver-agnostic ray-pick over the live Rapier world. Passing the
|
|
116
|
+
// segment vector (b − a) as the ray/shape-cast direction and capping
|
|
117
|
+
// the time-of-impact at 1 makes the returned toi the parametric α ∈
|
|
118
|
+
// [0,1] along the segment directly (matching PhysicsHit's convention).
|
|
119
|
+
const makeQuery = (w) => {
|
|
120
|
+
// Fill `out` with a thin-ray hit. userData was set to the entity id
|
|
121
|
+
// when the body was mirrored. Normal is oriented to oppose the ray.
|
|
122
|
+
const fillRay = (out, entity, alpha, nx, ny, nz, a, dx, dy, dz) => {
|
|
123
|
+
out.entity = entity;
|
|
124
|
+
out.distance = alpha;
|
|
125
|
+
out.point[0] = a[0] + dx * alpha;
|
|
126
|
+
out.point[1] = a[1] + dy * alpha;
|
|
127
|
+
out.point[2] = a[2] + dz * alpha;
|
|
128
|
+
out.normal[0] = nx;
|
|
129
|
+
out.normal[1] = ny;
|
|
130
|
+
out.normal[2] = nz;
|
|
131
|
+
orientNormalAgainstRay(out.normal, dx, dy, dz);
|
|
132
|
+
};
|
|
133
|
+
const nearest = (ray, options) => {
|
|
134
|
+
const a = ray.a, b = ray.b;
|
|
135
|
+
const dx = b[0] - a[0], dy = b[1] - a[1], dz = b[2] - a[2];
|
|
136
|
+
const radius = options?.radius ?? 0;
|
|
137
|
+
const out = newHit();
|
|
138
|
+
if (radius > 0) {
|
|
139
|
+
// sphere of `radius` swept along the segment
|
|
140
|
+
const hit = w.castShape({ x: a[0], y: a[1], z: a[2] }, { x: 0, y: 0, z: 0, w: 1 }, { x: dx, y: dy, z: dz }, new RAPIER.Ball(radius), 0, 1, true);
|
|
141
|
+
if (!hit)
|
|
142
|
+
return null;
|
|
143
|
+
const bod = hit.collider.parent();
|
|
144
|
+
if (!bod)
|
|
145
|
+
return null;
|
|
146
|
+
const alpha = hit.time_of_impact;
|
|
147
|
+
out.entity = bod.userData;
|
|
148
|
+
out.distance = alpha;
|
|
149
|
+
out.normal[0] = hit.normal1.x;
|
|
150
|
+
out.normal[1] = hit.normal1.y;
|
|
151
|
+
out.normal[2] = hit.normal1.z;
|
|
152
|
+
orientNormalAgainstRay(out.normal, dx, dy, dz);
|
|
153
|
+
// pull the swept-sphere centre at impact back onto the collider surface
|
|
154
|
+
out.point[0] = a[0] + dx * alpha - out.normal[0] * radius;
|
|
155
|
+
out.point[1] = a[1] + dy * alpha - out.normal[1] * radius;
|
|
156
|
+
out.point[2] = a[2] + dz * alpha - out.normal[2] * radius;
|
|
157
|
+
return out;
|
|
158
|
+
}
|
|
159
|
+
const hit = w.castRayAndGetNormal(new RAPIER.Ray({ x: a[0], y: a[1], z: a[2] }, { x: dx, y: dy, z: dz }), 1, true);
|
|
160
|
+
if (!hit)
|
|
161
|
+
return null;
|
|
162
|
+
const bod = hit.collider.parent();
|
|
163
|
+
if (!bod)
|
|
164
|
+
return null;
|
|
165
|
+
fillRay(out, bod.userData, hit.timeOfImpact, hit.normal.x, hit.normal.y, hit.normal.z, a, dx, dy, dz);
|
|
166
|
+
return out;
|
|
167
|
+
};
|
|
168
|
+
// Zero-alloc scratch for castRayEach: one reused hit + a grow-only pool
|
|
169
|
+
// of records. intersectionsWithRay reports crossings in broadphase-
|
|
170
|
+
// arbitrary order, so records are collected then index-sorted near→far.
|
|
171
|
+
const scratch = newHit();
|
|
172
|
+
const pool = [];
|
|
173
|
+
const order = [];
|
|
174
|
+
return {
|
|
175
|
+
castRay: nearest,
|
|
176
|
+
castRayEach(ray, visit, options) {
|
|
177
|
+
// The compat binding has no swept-shape all-hits query, so a
|
|
178
|
+
// radius query degrades to the nearest hit (see PhysicsQuery).
|
|
179
|
+
if ((options?.radius ?? 0) > 0) {
|
|
180
|
+
const h = nearest(ray, options);
|
|
181
|
+
if (h)
|
|
182
|
+
visit(h);
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
const a = ray.a, b = ray.b;
|
|
186
|
+
const dx = b[0] - a[0], dy = b[1] - a[1], dz = b[2] - a[2];
|
|
187
|
+
let count = 0;
|
|
188
|
+
w.intersectionsWithRay(new RAPIER.Ray({ x: a[0], y: a[1], z: a[2] }, { x: dx, y: dy, z: dz }), 1, true, (isect) => {
|
|
189
|
+
const bod = isect.collider.parent();
|
|
190
|
+
if (bod) {
|
|
191
|
+
let rec = pool[count];
|
|
192
|
+
if (!rec) {
|
|
193
|
+
rec = { entity: 0, distance: 0, nx: 0, ny: 0, nz: 0 };
|
|
194
|
+
pool[count] = rec;
|
|
195
|
+
}
|
|
196
|
+
rec.entity = bod.userData;
|
|
197
|
+
rec.distance = isect.timeOfImpact;
|
|
198
|
+
rec.nx = isect.normal.x;
|
|
199
|
+
rec.ny = isect.normal.y;
|
|
200
|
+
rec.nz = isect.normal.z;
|
|
201
|
+
count++;
|
|
202
|
+
}
|
|
203
|
+
return true; // keep collecting
|
|
204
|
+
});
|
|
205
|
+
for (let i = 0; i < count; i++)
|
|
206
|
+
order[i] = i;
|
|
207
|
+
order.length = count;
|
|
208
|
+
order.sort((i, j) => pool[i].distance - pool[j].distance);
|
|
209
|
+
for (let k = 0; k < count; k++) {
|
|
210
|
+
const rec = pool[order[k]];
|
|
211
|
+
fillRay(scratch, rec.entity, rec.distance, rec.nx, rec.ny, rec.nz, a, dx, dy, dz);
|
|
212
|
+
if (visit(scratch) === false)
|
|
213
|
+
break;
|
|
214
|
+
}
|
|
215
|
+
},
|
|
216
|
+
};
|
|
217
|
+
};
|
|
112
218
|
return () => {
|
|
113
219
|
if (!world) {
|
|
114
220
|
if (!initStarted) {
|
|
115
221
|
initStarted = true;
|
|
116
|
-
RAPIER.init().then(() => {
|
|
222
|
+
RAPIER.init().then(() => {
|
|
223
|
+
world = new RAPIER.World({ x: 0, y: -GRAVITY, z: 0 });
|
|
224
|
+
db.store.resources.physicsQuery = makeQuery(world);
|
|
225
|
+
});
|
|
117
226
|
}
|
|
118
227
|
return; // WASM not ready yet
|
|
119
228
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rapier-solver-plugin.js","sourceRoot":"","sources":["../../../src/physics/solvers/rapier-solver-plugin.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"rapier-solver-plugin.js","sourceRoot":"","sources":["../../../src/physics/solvers/rapier-solver-plugin.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@adobe/data-gpu",
|
|
3
|
-
"version": "0.9.
|
|
3
|
+
"version": "0.9.88",
|
|
4
4
|
"description": "Adobe data WebGPU plugins and types for graphics and compute",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"private": false,
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
"dependencies": {
|
|
13
13
|
"@dimforge/rapier3d-compat": "^0.19.3",
|
|
14
14
|
"jolt-physics": "^1.0.0",
|
|
15
|
-
"@adobe/data": "0.9.
|
|
15
|
+
"@adobe/data": "0.9.88"
|
|
16
16
|
},
|
|
17
17
|
"devDependencies": {
|
|
18
18
|
"@webgpu/types": "^0.1.61",
|
package/src/physics/README.md
CHANGED
|
@@ -65,8 +65,21 @@ lose track. Keep it honest about approximations and limitations.
|
|
|
65
65
|
so the skin flops. Runs on any solver. *Per-joint limit tuning is a follow-up.*
|
|
66
66
|
- [ ] **Collision events + groups/masks + sensors** — contact callbacks drained
|
|
67
67
|
to ECS; per-body layer masks; overlap-only sensor colliders.
|
|
68
|
-
- [
|
|
69
|
-
|
|
68
|
+
- [~] **Spatial queries** — a solver-agnostic `physicsQuery` resource +
|
|
69
|
+
`pickRay` / `pickRayEach` actions on the `physicsData` seam: **ray/line picking
|
|
70
|
+
with or without radius** (a thin ray, or a sphere of `radius` swept along the
|
|
71
|
+
segment). `pickRay` returns the nearest collider as a fresh, retainable
|
|
72
|
+
`PhysicsHit`; `pickRayEach` visits *every* collider along the segment, nearest
|
|
73
|
+
first, with early-out, passing a single reused (zero-alloc) hit valid only for
|
|
74
|
+
that call. A `PhysicsHit` is (entity, parametric α, world point, ray-opposing
|
|
75
|
+
normal). Backed by
|
|
76
|
+
each engine's native cast (Rapier `castRayAndGetNormal` / `castShape` /
|
|
77
|
+
`intersectionsWithRay`; Jolt `NarrowPhaseQuery.CastRay` / `CastShape` with
|
|
78
|
+
all-hit collectors) and verified by an abstract conformance suite run against
|
|
79
|
+
both. *Radius all-hits is native on Jolt; the Rapier compat binding has no
|
|
80
|
+
swept-shape all-hits query, so a radius `pickRayEach` degrades to the nearest
|
|
81
|
+
hit there. Still to do: overlap queries (sphere/AABB), general shape-cast vs.
|
|
82
|
+
arbitrary shapes, and a query `filter` (collision-group / entity predicate).*
|
|
70
83
|
- [ ] **`uint32`-indexed primitives** — flat-shaded collider/render meshes
|
|
71
84
|
currently emit `uint16` indices (fine for authored ramps/props, not dense
|
|
72
85
|
terrain).
|
|
@@ -2,13 +2,15 @@
|
|
|
2
2
|
|
|
3
3
|
import { Database } from "@adobe/data/ecs";
|
|
4
4
|
import { F32 } from "@adobe/data/schema";
|
|
5
|
-
import { Vec3, Quat } from "@adobe/data/math";
|
|
5
|
+
import { Vec3, Quat, type Line3 } from "@adobe/data/math";
|
|
6
6
|
import { BodyType } from "./body/body-type/body-type.js";
|
|
7
7
|
import { ColliderShape } from "./body/collider-shape/collider-shape.js";
|
|
8
8
|
import type { ColliderMesh } from "./body/collider-mesh.js";
|
|
9
9
|
import { Material } from "../material/material.js";
|
|
10
10
|
import { RIGID_BODY_COMPONENTS } from "./rigid-body-components.js";
|
|
11
11
|
import { STATIC_COLLIDER_COMPONENTS } from "./static-collider-components.js";
|
|
12
|
+
import type { PhysicsQuery } from "./physics-query.js";
|
|
13
|
+
import type { PhysicsHit } from "./physics-hit.js";
|
|
12
14
|
|
|
13
15
|
/**
|
|
14
16
|
* The shared, solver-agnostic rigid-body data model — the seam every physics
|
|
@@ -39,6 +41,11 @@ import { STATIC_COLLIDER_COMPONENTS } from "./static-collider-components.js";
|
|
|
39
41
|
* body the first time it mirrors it, so authors never supply derived state.
|
|
40
42
|
*
|
|
41
43
|
* Mass + inertia are derived per solver from shape + material (not stored here).
|
|
44
|
+
*
|
|
45
|
+
* Besides the authored model, this seam declares the pluggable spatial-query
|
|
46
|
+
* contract every solver fulfils: a `physicsQuery` resource (the active solver
|
|
47
|
+
* publishes its engine-backed implementation once its world is live) and a
|
|
48
|
+
* `pickRay` action that delegates to it — so ray/line picking is solver-agnostic.
|
|
42
49
|
*/
|
|
43
50
|
export const physicsData = Database.Plugin.create({
|
|
44
51
|
extends: Material.plugin, // brings the `material` reference component
|
|
@@ -64,6 +71,13 @@ export const physicsData = Database.Plugin.create({
|
|
|
64
71
|
convexPoints: { default: null as Float32Array | null }, // colliderShape "hull": point cloud → convex hull
|
|
65
72
|
colliderMesh: { default: null as ColliderMesh | null }, // colliderShape "mesh": static triangle soup
|
|
66
73
|
},
|
|
74
|
+
resources: {
|
|
75
|
+
// The pluggable spatial-query seam: the active solver publishes its
|
|
76
|
+
// engine-backed implementation here once its world is live, so picking
|
|
77
|
+
// is solver-agnostic. Null before then (lazy WASM init) and when no
|
|
78
|
+
// solver is combined in. Runtime object → nonPersistent.
|
|
79
|
+
physicsQuery: { default: null as PhysicsQuery | null, nonPersistent: true },
|
|
80
|
+
},
|
|
67
81
|
archetypes: {
|
|
68
82
|
RigidBody: [...RIGID_BODY_COMPONENTS],
|
|
69
83
|
StaticCollider: [...STATIC_COLLIDER_COMPONENTS],
|
|
@@ -72,4 +86,18 @@ export const physicsData = Database.Plugin.create({
|
|
|
72
86
|
// A static triangle-mesh collider (terrain / level geometry).
|
|
73
87
|
MeshCollider: [...STATIC_COLLIDER_COMPONENTS, "colliderMesh"],
|
|
74
88
|
},
|
|
89
|
+
actions: {
|
|
90
|
+
// Consumer surface for engine-backed picking. An action (not a
|
|
91
|
+
// transaction) because it returns a value; a pure delegate to whatever
|
|
92
|
+
// solver filled `physicsQuery` — `physicsData` itself holds no engine
|
|
93
|
+
// knowledge. Returns null until a solver's world is live.
|
|
94
|
+
pickRay(db, args: { ray: Line3; radius?: number }): PhysicsHit | null {
|
|
95
|
+
return db.resources.physicsQuery?.castRay(args.ray, { radius: args.radius }) ?? null;
|
|
96
|
+
},
|
|
97
|
+
// Visit every collider along the ray, nearest first (see PhysicsQuery.castRayEach).
|
|
98
|
+
// Returns void; no-op until a solver's world is live.
|
|
99
|
+
pickRayEach(db, args: { ray: Line3; visit: (hit: PhysicsHit) => boolean | void; radius?: number }): void {
|
|
100
|
+
db.resources.physicsQuery?.castRayEach(args.ray, args.visit, { radius: args.radius });
|
|
101
|
+
},
|
|
102
|
+
},
|
|
75
103
|
});
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
// © 2026 Adobe. MIT License. See /LICENSE for details.
|
|
2
|
+
|
|
3
|
+
import type { Entity } from "@adobe/data/ecs";
|
|
4
|
+
import type { Vec3 } from "@adobe/data/math";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* One physics ray-pick result — the body/collider the ray hit plus the
|
|
8
|
+
* geometry of the hit the engine's broadphase can give that an AABB scan
|
|
9
|
+
* cannot.
|
|
10
|
+
*
|
|
11
|
+
* `distance` uses the same parametric convention as the graphics `PickHit`
|
|
12
|
+
* (α ∈ [0,1] along the `Line3` segment, 0 = near point `a`, 1 = far point
|
|
13
|
+
* `b`), so `PhysicsHit` is a structural superset of `PickHit` and `distance`
|
|
14
|
+
* reads the same in both picking systems. The absolute hit location is `point`.
|
|
15
|
+
*/
|
|
16
|
+
export interface PhysicsHit {
|
|
17
|
+
readonly entity: Entity;
|
|
18
|
+
readonly distance: number; // parametric α ∈ [0,1] along the ray segment
|
|
19
|
+
readonly point: Vec3; // world-space hit point = a + (b − a)·distance
|
|
20
|
+
readonly normal: Vec3; // unit surface normal at the hit, oriented to oppose the ray
|
|
21
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
// © 2026 Adobe. MIT License. See /LICENSE for details.
|
|
2
|
+
|
|
3
|
+
import type { Line3 } from "@adobe/data/math";
|
|
4
|
+
import type { PhysicsHit } from "./physics-hit.js";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* The solver-agnostic spatial-query capability — the pluggable seam for
|
|
8
|
+
* engine-backed picking. Whichever solver is active (`rapierSolver`,
|
|
9
|
+
* `joltSolver`, …) publishes an implementation of this interface into the
|
|
10
|
+
* `physicsQuery` resource once its world is live; consumers reach it through
|
|
11
|
+
* the `pickRay` action (or read the resource directly for advanced use).
|
|
12
|
+
*
|
|
13
|
+
* `castRay` returns the nearest collider along the `Line3` segment, or `null`
|
|
14
|
+
* for a miss. `castRayEach` visits *every* collider along the segment, nearest
|
|
15
|
+
* first. `radius` (omitted / 0 → an infinitely-thin ray; > 0 → a sphere of that
|
|
16
|
+
* radius swept along the segment) covers "pick along a line with or without
|
|
17
|
+
* radius" behind one call. Both reference solvers back these with their native
|
|
18
|
+
* ray / shape cast (Rapier `castRayAndGetNormal` / `castShape` /
|
|
19
|
+
* `intersectionsWithRay`; Jolt `NarrowPhaseQuery.CastRay` / `CastShape` with
|
|
20
|
+
* all-hit collectors).
|
|
21
|
+
*/
|
|
22
|
+
export interface PhysicsQuery {
|
|
23
|
+
castRay(ray: Line3, options?: { radius?: number }): PhysicsHit | null;
|
|
24
|
+
/**
|
|
25
|
+
* Visit each collider crossed by the segment, **nearest first**, calling
|
|
26
|
+
* `visit` once per crossing. Return `false` from `visit` to stop early (any
|
|
27
|
+
* other return continues).
|
|
28
|
+
*
|
|
29
|
+
* Zero-allocation: `visit` receives a **single reused hit** that is valid
|
|
30
|
+
* only for the duration of that call — read what you need (or copy fields
|
|
31
|
+
* out); do not retain the object or its `point` / `normal` arrays past the
|
|
32
|
+
* callback. (`castRay` returns a fresh, retainable hit; use it when you need
|
|
33
|
+
* to keep one.)
|
|
34
|
+
*
|
|
35
|
+
* `radius > 0` sweeps a sphere: fully supported on solvers with a native
|
|
36
|
+
* swept-shape all-hits query (Jolt); where the engine binding lacks one
|
|
37
|
+
* (the Rapier compat binding), a radius query degrades to visiting only the
|
|
38
|
+
* nearest hit. A thin ray (`radius` omitted / 0) visits all crossings on
|
|
39
|
+
* every solver.
|
|
40
|
+
*/
|
|
41
|
+
castRayEach(ray: Line3, visit: (hit: PhysicsHit) => boolean | void, options?: { radius?: number }): void;
|
|
42
|
+
}
|
package/src/physics/public.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
// © 2026 Adobe. MIT License. See /LICENSE for details.
|
|
2
2
|
|
|
3
3
|
export * from "./physics-data-plugin.js";
|
|
4
|
+
export * from "./physics-hit.js";
|
|
5
|
+
export * from "./physics-query.js";
|
|
4
6
|
export * from "./rigid-body-components.js";
|
|
5
7
|
export * from "./static-collider-components.js";
|
|
6
8
|
export * from "./collider-primitive-render-archetypes.js";
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import initJolt from "jolt-physics";
|
|
4
4
|
import { Database, type Entity } from "@adobe/data/ecs";
|
|
5
|
+
import type { Line3, Vec3 } from "@adobe/data/math";
|
|
5
6
|
import { isVoxelShapePhysicsPending } from "../is-voxel-shape-physics-pending.js";
|
|
6
7
|
import { True } from "@adobe/data/schema";
|
|
7
8
|
import { physicsClock } from "../physics-clock-plugin.js";
|
|
@@ -11,6 +12,10 @@ import { BodyType } from "../body/body-type/body-type.js";
|
|
|
11
12
|
import { ColliderShape } from "../body/collider-shape/collider-shape.js";
|
|
12
13
|
import type { ColliderMesh } from "../body/collider-mesh.js";
|
|
13
14
|
import { massFromVolume } from "../body/collider-shape/mass-from-volume.js";
|
|
15
|
+
import type { PhysicsQuery } from "../physics-query.js";
|
|
16
|
+
import type { PhysicsHit } from "../physics-hit.js";
|
|
17
|
+
import { orientNormalAgainstRay } from "./orient-normal-against-ray.js";
|
|
18
|
+
import { newHit, type MutableHit } from "./mutable-hit.js";
|
|
14
19
|
|
|
15
20
|
/**
|
|
16
21
|
* A third rigid-body solver behind the same `physicsData` seam — Jolt Physics
|
|
@@ -61,6 +66,8 @@ type JQuat = InstanceType<JoltModule["Quat"]>;
|
|
|
61
66
|
type JVec3 = InstanceType<JoltModule["Vec3"]>;
|
|
62
67
|
type JShape = InstanceType<JoltModule["Shape"]>;
|
|
63
68
|
type JPhysicsSystem = InstanceType<JoltModule["PhysicsSystem"]>;
|
|
69
|
+
type JRayCastResult = InstanceType<JoltModule["RayCastResult"]>;
|
|
70
|
+
type JShapeCastResult = InstanceType<JoltModule["ShapeCastResult"]>;
|
|
64
71
|
|
|
65
72
|
interface MatProps { density: number; restitution: number; friction: number }
|
|
66
73
|
|
|
@@ -210,6 +217,7 @@ export const joltSolver = Database.Plugin.create({
|
|
|
210
217
|
}
|
|
211
218
|
}
|
|
212
219
|
const body = bi.CreateBody(settings);
|
|
220
|
+
body.SetUserData(id); // reverse lookup for ray-pick: hit body id → entity
|
|
213
221
|
bi.AddBody(body.GetID(), motion === "static" ? jolt.EActivation_DontActivate : jolt.EActivation_Activate);
|
|
214
222
|
if (motion === "dynamic" && (vx || vy || vz || wx || wy || wz)) {
|
|
215
223
|
const lv = new jolt.Vec3(vx, vy, vz), av = new jolt.Vec3(wx, wy, wz);
|
|
@@ -222,6 +230,116 @@ export const joltSolver = Database.Plugin.create({
|
|
|
222
230
|
if (half) jolt.destroy(half);
|
|
223
231
|
};
|
|
224
232
|
|
|
233
|
+
// Solver-agnostic ray-pick over the live Jolt world. As in the Rapier
|
|
234
|
+
// plugin, the segment vector (b − a) is the cast direction, so the hit
|
|
235
|
+
// fraction is the parametric α ∈ [0,1] along the segment directly
|
|
236
|
+
// (matching PhysicsHit). Accept-all filters + reusable settings are
|
|
237
|
+
// created once here; per-call WASM temporaries are freed after each pick.
|
|
238
|
+
const makeQuery = (jolt: JoltModule, ps: JPhysicsSystem, bi: JBodyInterface): PhysicsQuery => {
|
|
239
|
+
const narrow = ps.GetNarrowPhaseQuery();
|
|
240
|
+
const bpFilter = new jolt.BroadPhaseLayerFilter();
|
|
241
|
+
const objFilter = new jolt.ObjectLayerFilter();
|
|
242
|
+
const bodyFilter = new jolt.BodyFilter();
|
|
243
|
+
const shapeFilter = new jolt.ShapeFilter();
|
|
244
|
+
const raySettings = new jolt.RayCastSettings();
|
|
245
|
+
const shapeSettings = new jolt.ShapeCastSettings();
|
|
246
|
+
const baseOffset = new jolt.RVec3(0, 0, 0); // results in world space
|
|
247
|
+
const unitScale = new jolt.Vec3(1, 1, 1);
|
|
248
|
+
|
|
249
|
+
// Fill `out` from one ray result. Surface normal comes from the body
|
|
250
|
+
// we already hold (no body-lock round-trip). Reads every field into JS
|
|
251
|
+
// before any collector is destroyed. userData = entity id.
|
|
252
|
+
const fillRay = (out: MutableHit, hit: JRayCastResult, a: Vec3, dx: number, dy: number, dz: number): void => {
|
|
253
|
+
const alpha = hit.get_mFraction();
|
|
254
|
+
const entity = bi.GetUserData(hit.get_mBodyID()) as Entity;
|
|
255
|
+
out.entity = entity; out.distance = alpha;
|
|
256
|
+
out.point[0] = a[0] + dx * alpha; out.point[1] = a[1] + dy * alpha; out.point[2] = a[2] + dz * alpha;
|
|
257
|
+
out.normal[0] = 0; out.normal[1] = 0; out.normal[2] = 0;
|
|
258
|
+
const body = bodies.get(entity);
|
|
259
|
+
if (body) {
|
|
260
|
+
const p = new jolt.RVec3(out.point[0], out.point[1], out.point[2]);
|
|
261
|
+
const nv = body.GetWorldSpaceSurfaceNormal(hit.get_mSubShapeID2(), p);
|
|
262
|
+
out.normal[0] = nv.GetX(); out.normal[1] = nv.GetY(); out.normal[2] = nv.GetZ();
|
|
263
|
+
jolt.destroy(p);
|
|
264
|
+
}
|
|
265
|
+
orientNormalAgainstRay(out.normal, dx, dy, dz);
|
|
266
|
+
};
|
|
267
|
+
// Fill `out` from one swept-sphere result (contact point + penetration
|
|
268
|
+
// axis; both world-space with baseOffset = 0).
|
|
269
|
+
const fillShape = (out: MutableHit, hit: JShapeCastResult, dx: number, dy: number, dz: number): void => {
|
|
270
|
+
const cp = hit.get_mContactPointOn2();
|
|
271
|
+
out.entity = bi.GetUserData(hit.get_mBodyID2()) as Entity; out.distance = hit.get_mFraction();
|
|
272
|
+
out.point[0] = cp.GetX(); out.point[1] = cp.GetY(); out.point[2] = cp.GetZ();
|
|
273
|
+
const pax = hit.get_mPenetrationAxis();
|
|
274
|
+
out.normal[0] = pax.GetX(); out.normal[1] = pax.GetY(); out.normal[2] = pax.GetZ();
|
|
275
|
+
orientNormalAgainstRay(out.normal, dx, dy, dz);
|
|
276
|
+
};
|
|
277
|
+
|
|
278
|
+
const scratch = newHit(); // reused across castRayEach visits (zero-alloc)
|
|
279
|
+
return {
|
|
280
|
+
castRay(ray: Line3, options): PhysicsHit | null {
|
|
281
|
+
const a = ray.a, b = ray.b;
|
|
282
|
+
const dx = b[0] - a[0], dy = b[1] - a[1], dz = b[2] - a[2];
|
|
283
|
+
const out = newHit();
|
|
284
|
+
if ((options?.radius ?? 0) > 0) {
|
|
285
|
+
// sphere of `radius` swept along the segment
|
|
286
|
+
const shape = new jolt.SphereShape(options!.radius!);
|
|
287
|
+
const startPos = new jolt.RVec3(a[0], a[1], a[2]);
|
|
288
|
+
const comStart = jolt.RMat44.prototype.sTranslation(startPos);
|
|
289
|
+
const dir = new jolt.Vec3(dx, dy, dz);
|
|
290
|
+
const shapeCast = new jolt.RShapeCast(shape, unitScale, comStart, dir);
|
|
291
|
+
const collector = new jolt.CastShapeClosestHitCollisionCollector();
|
|
292
|
+
narrow.CastShape(shapeCast, shapeSettings, baseOffset, collector, bpFilter, objFilter, bodyFilter, shapeFilter);
|
|
293
|
+
const hadHit = collector.HadHit();
|
|
294
|
+
if (hadHit) fillShape(out, collector.mHit, dx, dy, dz);
|
|
295
|
+
jolt.destroy(shape); jolt.destroy(startPos); jolt.destroy(comStart); jolt.destroy(dir); jolt.destroy(shapeCast); jolt.destroy(collector);
|
|
296
|
+
return hadHit ? out : null;
|
|
297
|
+
}
|
|
298
|
+
const origin = new jolt.RVec3(a[0], a[1], a[2]);
|
|
299
|
+
const dir = new jolt.Vec3(dx, dy, dz);
|
|
300
|
+
const rc = new jolt.RRayCast(origin, dir);
|
|
301
|
+
const collector = new jolt.CastRayClosestHitCollisionCollector();
|
|
302
|
+
narrow.CastRay(rc, raySettings, collector, bpFilter, objFilter, bodyFilter, shapeFilter);
|
|
303
|
+
const hadHit = collector.HadHit();
|
|
304
|
+
if (hadHit) fillRay(out, collector.mHit, a, dx, dy, dz);
|
|
305
|
+
jolt.destroy(origin); jolt.destroy(dir); jolt.destroy(rc); jolt.destroy(collector);
|
|
306
|
+
return hadHit ? out : null;
|
|
307
|
+
},
|
|
308
|
+
castRayEach(ray: Line3, visit, options): void {
|
|
309
|
+
const a = ray.a, b = ray.b;
|
|
310
|
+
const dx = b[0] - a[0], dy = b[1] - a[1], dz = b[2] - a[2];
|
|
311
|
+
if ((options?.radius ?? 0) > 0) {
|
|
312
|
+
// Jolt has a native swept-sphere all-hits query.
|
|
313
|
+
const shape = new jolt.SphereShape(options!.radius!);
|
|
314
|
+
const startPos = new jolt.RVec3(a[0], a[1], a[2]);
|
|
315
|
+
const comStart = jolt.RMat44.prototype.sTranslation(startPos);
|
|
316
|
+
const dir = new jolt.Vec3(dx, dy, dz);
|
|
317
|
+
const shapeCast = new jolt.RShapeCast(shape, unitScale, comStart, dir);
|
|
318
|
+
const collector = new jolt.CastShapeAllHitCollisionCollector();
|
|
319
|
+
narrow.CastShape(shapeCast, shapeSettings, baseOffset, collector, bpFilter, objFilter, bodyFilter, shapeFilter);
|
|
320
|
+
if (collector.HadHit()) {
|
|
321
|
+
collector.Sort(); // near→far
|
|
322
|
+
const hits = collector.get_mHits();
|
|
323
|
+
for (let i = 0, len = hits.size(); i < len; i++) { fillShape(scratch, hits.at(i), dx, dy, dz); if (visit(scratch) === false) break; }
|
|
324
|
+
}
|
|
325
|
+
jolt.destroy(shape); jolt.destroy(startPos); jolt.destroy(comStart); jolt.destroy(dir); jolt.destroy(shapeCast); jolt.destroy(collector);
|
|
326
|
+
return;
|
|
327
|
+
}
|
|
328
|
+
const origin = new jolt.RVec3(a[0], a[1], a[2]);
|
|
329
|
+
const dir = new jolt.Vec3(dx, dy, dz);
|
|
330
|
+
const rc = new jolt.RRayCast(origin, dir);
|
|
331
|
+
const collector = new jolt.CastRayAllHitCollisionCollector();
|
|
332
|
+
narrow.CastRay(rc, raySettings, collector, bpFilter, objFilter, bodyFilter, shapeFilter);
|
|
333
|
+
if (collector.HadHit()) {
|
|
334
|
+
collector.Sort(); // near→far
|
|
335
|
+
const hits = collector.get_mHits();
|
|
336
|
+
for (let i = 0, len = hits.size(); i < len; i++) { fillRay(scratch, hits.at(i), a, dx, dy, dz); if (visit(scratch) === false) break; }
|
|
337
|
+
}
|
|
338
|
+
jolt.destroy(origin); jolt.destroy(dir); jolt.destroy(rc); jolt.destroy(collector);
|
|
339
|
+
},
|
|
340
|
+
};
|
|
341
|
+
};
|
|
342
|
+
|
|
225
343
|
return () => {
|
|
226
344
|
if (!J || !bodyInterface || !joltInterface) {
|
|
227
345
|
if (!initStarted) {
|
|
@@ -229,6 +347,7 @@ export const joltSolver = Database.Plugin.create({
|
|
|
229
347
|
initJolt().then((j: JoltModule) => {
|
|
230
348
|
J = j; setup(j);
|
|
231
349
|
db.store.resources._joltContext = { jolt: j, physicsSystem: physicsSystem!, bodyInterface: bodyInterface!, ragdollLayer: L_RAGDOLL };
|
|
350
|
+
db.store.resources.physicsQuery = makeQuery(j, physicsSystem!, bodyInterface!);
|
|
232
351
|
});
|
|
233
352
|
}
|
|
234
353
|
return; // WASM not ready yet
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
// © 2026 Adobe. MIT License. See /LICENSE for details.
|
|
2
|
+
|
|
3
|
+
import type { Entity } from "@adobe/data/ecs";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Internal mutable form of `PhysicsHit` used by the solver query
|
|
7
|
+
* implementations. `castRay` fills a fresh one (retainable return value);
|
|
8
|
+
* `castRayEach` fills and re-visits a single reused instance (zero-alloc).
|
|
9
|
+
* Assignable to the public read-only `PhysicsHit` at the seam.
|
|
10
|
+
*/
|
|
11
|
+
export interface MutableHit {
|
|
12
|
+
entity: Entity;
|
|
13
|
+
distance: number;
|
|
14
|
+
point: [number, number, number];
|
|
15
|
+
normal: [number, number, number];
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export const newHit = (): MutableHit => ({ entity: 0 as Entity, distance: 0, point: [0, 0, 0], normal: [0, 0, 0] });
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
// © 2026 Adobe. MIT License. See /LICENSE for details.
|
|
2
|
+
|
|
3
|
+
import { describe, it, expect } from "vitest";
|
|
4
|
+
import { orientNormalAgainstRay } from "./orient-normal-against-ray.js";
|
|
5
|
+
|
|
6
|
+
describe("orientNormalAgainstRay", () => {
|
|
7
|
+
it("normalizes the normal to unit length", () => {
|
|
8
|
+
const n: [number, number, number] = [0, 3, 0];
|
|
9
|
+
orientNormalAgainstRay(n, 1, 0, 0); // ray perpendicular → no flip
|
|
10
|
+
expect(Math.hypot(...n)).toBeCloseTo(1, 6);
|
|
11
|
+
expect(n[1]).toBeCloseTo(1, 6);
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
it("flips a normal that points along the ray so it opposes it", () => {
|
|
15
|
+
const n: [number, number, number] = [0, -1, 0]; // points down, same as a downward ray
|
|
16
|
+
orientNormalAgainstRay(n, 0, -20, 0); // downward ray
|
|
17
|
+
expect(n[1]).toBeGreaterThan(0); // now points up, opposing the ray
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
it("leaves a normal that already opposes the ray unchanged in direction", () => {
|
|
21
|
+
const n: [number, number, number] = [0, 1, 0];
|
|
22
|
+
orientNormalAgainstRay(n, 0, -20, 0);
|
|
23
|
+
expect(n[1]).toBeCloseTo(1, 6);
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
it("leaves a zero-length normal as the zero vector (no divide-by-zero)", () => {
|
|
27
|
+
const n: [number, number, number] = [0, 0, 0];
|
|
28
|
+
orientNormalAgainstRay(n, 0, -1, 0);
|
|
29
|
+
expect(n).toEqual([0, 0, 0]);
|
|
30
|
+
});
|
|
31
|
+
});
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
// © 2026 Adobe. MIT License. See /LICENSE for details.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Normalize `n` in place and flip it so it opposes the ray direction
|
|
5
|
+
* `(dx,dy,dz)` — the standard picking convention (the returned normal points
|
|
6
|
+
* back toward the ray origin, i.e. outward from the hit surface).
|
|
7
|
+
*
|
|
8
|
+
* Unifies the normal convention across engines and across ray-cast vs.
|
|
9
|
+
* shape-cast, whose raw normals (surface normal, contact normal, penetration
|
|
10
|
+
* axis) don't otherwise agree on sign. A zero-length input is left as the zero
|
|
11
|
+
* vector (guarded so a degenerate hit doesn't divide by zero).
|
|
12
|
+
*/
|
|
13
|
+
export const orientNormalAgainstRay = (n: [number, number, number], dx: number, dy: number, dz: number): void => {
|
|
14
|
+
const len = Math.hypot(n[0], n[1], n[2]);
|
|
15
|
+
if (len === 0) return;
|
|
16
|
+
n[0] /= len; n[1] /= len; n[2] /= len;
|
|
17
|
+
if (n[0] * dx + n[1] * dy + n[2] * dz > 0) { n[0] = -n[0]; n[1] = -n[1]; n[2] = -n[2]; }
|
|
18
|
+
};
|