@ifc-lite/clash 1.7.0 → 1.9.0
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 +18 -0
- package/dist/adapters/ifcx.d.ts.map +1 -1
- package/dist/adapters/ifcx.js +22 -36
- package/dist/adapters/ifcx.js.map +1 -1
- package/dist/adapters/shared.d.ts +61 -0
- package/dist/adapters/shared.d.ts.map +1 -0
- package/dist/adapters/shared.js +143 -0
- package/dist/adapters/shared.js.map +1 -0
- package/dist/adapters/step.d.ts +62 -3
- package/dist/adapters/step.d.ts.map +1 -1
- package/dist/adapters/step.js +180 -89
- package/dist/adapters/step.js.map +1 -1
- package/dist/analysis.d.ts +10 -1
- package/dist/analysis.d.ts.map +1 -1
- package/dist/analysis.js +20 -0
- package/dist/analysis.js.map +1 -1
- package/dist/contact/index.d.ts +14 -0
- package/dist/contact/index.d.ts.map +1 -1
- package/dist/contact/index.js +14 -0
- package/dist/contact/index.js.map +1 -1
- package/dist/contact/min-distance.d.ts +87 -0
- package/dist/contact/min-distance.d.ts.map +1 -0
- package/dist/contact/min-distance.js +255 -0
- package/dist/contact/min-distance.js.map +1 -0
- package/dist/contact/narrow-phase.d.ts +3 -2
- package/dist/contact/narrow-phase.d.ts.map +1 -1
- package/dist/contact/narrow-phase.js +32 -14
- package/dist/contact/narrow-phase.js.map +1 -1
- package/dist/contact/shared-faces.js +10 -1
- package/dist/contact/shared-faces.js.map +1 -1
- package/dist/contact/tri-tri.d.ts +33 -7
- package/dist/contact/tri-tri.d.ts.map +1 -1
- package/dist/contact/tri-tri.js +37 -14
- package/dist/contact/tri-tri.js.map +1 -1
- package/dist/duplicate-metric.d.ts +26 -8
- package/dist/duplicate-metric.d.ts.map +1 -1
- package/dist/duplicate-metric.js +26 -8
- package/dist/duplicate-metric.js.map +1 -1
- package/dist/duplicates.d.ts +9 -0
- package/dist/duplicates.d.ts.map +1 -1
- package/dist/duplicates.js +53 -18
- package/dist/duplicates.js.map +1 -1
- package/dist/engine-ts/broad.js +20 -2
- package/dist/engine-ts/broad.js.map +1 -1
- package/dist/engine-ts/depth.d.ts +99 -0
- package/dist/engine-ts/depth.d.ts.map +1 -0
- package/dist/engine-ts/depth.js +172 -0
- package/dist/engine-ts/depth.js.map +1 -0
- package/dist/engine-ts/kernel.d.ts +3 -1
- package/dist/engine-ts/kernel.d.ts.map +1 -1
- package/dist/engine-ts/narrow.d.ts +7 -1
- package/dist/engine-ts/narrow.d.ts.map +1 -1
- package/dist/engine-ts/narrow.js +53 -95
- package/dist/engine-ts/narrow.js.map +1 -1
- package/dist/engine-ts/obb.d.ts +116 -0
- package/dist/engine-ts/obb.d.ts.map +1 -0
- package/dist/engine-ts/obb.js +331 -0
- package/dist/engine-ts/obb.js.map +1 -0
- package/dist/engine-ts/orchestrator.d.ts.map +1 -1
- package/dist/engine-ts/orchestrator.js +3 -13
- package/dist/engine-ts/orchestrator.js.map +1 -1
- package/dist/engine-ts/tri-mesh.d.ts +88 -22
- package/dist/engine-ts/tri-mesh.d.ts.map +1 -1
- package/dist/engine-ts/tri-mesh.js +155 -48
- package/dist/engine-ts/tri-mesh.js.map +1 -1
- package/dist/engine-ts/ts-kernel.d.ts.map +1 -1
- package/dist/engine-ts/ts-kernel.js +1 -0
- package/dist/engine-ts/ts-kernel.js.map +1 -1
- package/dist/engine-wasm/wasm-kernel.d.ts.map +1 -1
- package/dist/engine-wasm/wasm-kernel.js +7 -0
- package/dist/engine-wasm/wasm-kernel.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/math/aabb.d.ts +10 -1
- package/dist/math/aabb.d.ts.map +1 -1
- package/dist/math/aabb.js +33 -13
- package/dist/math/aabb.js.map +1 -1
- package/dist/selectors.d.ts.map +1 -1
- package/dist/selectors.js +20 -4
- package/dist/selectors.js.map +1 -1
- package/dist/triage.d.ts.map +1 -1
- package/dist/triage.js +11 -3
- package/dist/triage.js.map +1 -1
- package/dist/types.d.ts +39 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +10 -9
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
+
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
+
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
|
4
|
+
/**
|
|
5
|
+
* Minimum distance between two world-space meshes, with the witness points.
|
|
6
|
+
*
|
|
7
|
+
* Why this is a new traversal rather than a new predicate: the exact
|
|
8
|
+
* triangle-to-triangle minimum distance already exists as `triTriDistance`
|
|
9
|
+
* (`../math/triangle-distance.ts`), and a second copy of that math would be one
|
|
10
|
+
* more thing to keep in step. What did NOT exist anywhere in this package is a
|
|
11
|
+
* traversal that can find the CLOSEST pair.
|
|
12
|
+
*
|
|
13
|
+
* Every other query here is an OVERLAP predicate: `Bvh.queryAABB`,
|
|
14
|
+
* `Bvh.queryPairs` and `queryMeshCross` all prune on AABB intersection, so for
|
|
15
|
+
* two disjoint meshes they return an empty candidate set and there is nothing
|
|
16
|
+
* left to measure. Inflating a clash `clearance` does not substitute either:
|
|
17
|
+
* `testPair` only ever considers triangle pairs already within its margin, so
|
|
18
|
+
* the answer is capped by the margin you guessed rather than found.
|
|
19
|
+
*
|
|
20
|
+
* So this is branch-and-bound over the two BVHs: descend the node pair whose
|
|
21
|
+
* AABB-to-AABB LOWER bound is smallest, and prune any pair whose lower bound is
|
|
22
|
+
* already >= the best real distance found so far. The bound is exact for
|
|
23
|
+
* axis-aligned boxes and never exceeds the true triangle distance, which is
|
|
24
|
+
* what makes the pruning safe: a pruned subtree cannot contain a closer pair.
|
|
25
|
+
*/
|
|
26
|
+
import { buildMeshBvh } from './mesh-bvh.js';
|
|
27
|
+
import { triangleAt } from './triangle.js';
|
|
28
|
+
import { closestPtPointTriangle, triTriDistance } from '../math/triangle-distance.js';
|
|
29
|
+
import { triTriIntersect } from '../math/triangle-intersect.js';
|
|
30
|
+
/** Squared distance between two AABBs; 0 when they overlap or touch. */
|
|
31
|
+
function aabbDistSq(a, b) {
|
|
32
|
+
let total = 0;
|
|
33
|
+
for (let axis = 0; axis < 3; axis++) {
|
|
34
|
+
// Gap on this axis, in whichever direction they are separated. Negative
|
|
35
|
+
// overlap contributes nothing, which is what makes this a LOWER bound.
|
|
36
|
+
const gap = Math.max(0, a.min[axis] - b.max[axis], b.min[axis] - a.max[axis]);
|
|
37
|
+
total += gap * gap;
|
|
38
|
+
}
|
|
39
|
+
return total;
|
|
40
|
+
}
|
|
41
|
+
/** The tuple `triTriDistance` expects (its Vec3 is mutable). */
|
|
42
|
+
function mutable(v) {
|
|
43
|
+
return [v[0], v[1], v[2]];
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Binary min-heap over `lowerSq`. Exported for its own tests but deliberately
|
|
47
|
+
* NOT re-exported from `contact/index.ts`, so it stays out of the package's
|
|
48
|
+
* public surface: it is an implementation detail of the traversal, and a
|
|
49
|
+
* hand-rolled sift is precisely the kind of code that needs a direct contract
|
|
50
|
+
* test rather than being covered incidentally.
|
|
51
|
+
*
|
|
52
|
+
* Note that a broken heap order does NOT break the RESULT — the traversal
|
|
53
|
+
* still visits every unpruned pair and still finds the true minimum, just
|
|
54
|
+
* slower. That is why the distance tests cannot catch an inverted comparison
|
|
55
|
+
* here, and why this class is tested on its own terms.
|
|
56
|
+
*
|
|
57
|
+
* Small and local on purpose: this is the only
|
|
58
|
+
* priority queue in the package, and pulling in a dependency (or a generic
|
|
59
|
+
* implementation) for one traversal would be more surface than the ~25 lines
|
|
60
|
+
* it replaces.
|
|
61
|
+
*/
|
|
62
|
+
export class PairHeap {
|
|
63
|
+
items = [];
|
|
64
|
+
push(entry) {
|
|
65
|
+
const items = this.items;
|
|
66
|
+
items.push(entry);
|
|
67
|
+
let i = items.length - 1;
|
|
68
|
+
while (i > 0) {
|
|
69
|
+
const parent = (i - 1) >> 1;
|
|
70
|
+
if (items[parent].lowerSq <= items[i].lowerSq)
|
|
71
|
+
break;
|
|
72
|
+
[items[parent], items[i]] = [items[i], items[parent]];
|
|
73
|
+
i = parent;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
pop() {
|
|
77
|
+
const items = this.items;
|
|
78
|
+
if (items.length === 0)
|
|
79
|
+
return undefined;
|
|
80
|
+
const top = items[0];
|
|
81
|
+
const last = items.pop();
|
|
82
|
+
if (items.length === 0)
|
|
83
|
+
return top;
|
|
84
|
+
items[0] = last;
|
|
85
|
+
let i = 0;
|
|
86
|
+
for (;;) {
|
|
87
|
+
const l = 2 * i + 1;
|
|
88
|
+
const r = l + 1;
|
|
89
|
+
let smallest = i;
|
|
90
|
+
if (l < items.length && items[l].lowerSq < items[smallest].lowerSq)
|
|
91
|
+
smallest = l;
|
|
92
|
+
if (r < items.length && items[r].lowerSq < items[smallest].lowerSq)
|
|
93
|
+
smallest = r;
|
|
94
|
+
if (smallest === i)
|
|
95
|
+
break;
|
|
96
|
+
[items[smallest], items[i]] = [items[i], items[smallest]];
|
|
97
|
+
i = smallest;
|
|
98
|
+
}
|
|
99
|
+
return top;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Exact minimum distance between two meshes, or `null` when either has no
|
|
104
|
+
* triangles (there is no distance to a mesh that is not there — deliberately
|
|
105
|
+
* distinct from returning 0, which would read as "they touch").
|
|
106
|
+
*/
|
|
107
|
+
export function minDistanceBetweenMeshes(a, b, opts = {}) {
|
|
108
|
+
const bvhA = buildMeshBvh(a, opts.leafSize ?? 8);
|
|
109
|
+
const bvhB = buildMeshBvh(b, opts.leafSize ?? 8);
|
|
110
|
+
return minDistanceBetweenBvhs(bvhA, bvhB, opts);
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Same, for callers that already hold the BVHs. Worth having separately: the
|
|
114
|
+
* BVH is the expensive part, and a measure tool asking about one element
|
|
115
|
+
* against several others should build each mesh's tree once.
|
|
116
|
+
*/
|
|
117
|
+
export function minDistanceBetweenBvhs(a, b, opts = {}) {
|
|
118
|
+
const rootA = a.bvh.root;
|
|
119
|
+
const rootB = b.bvh.root;
|
|
120
|
+
if (!rootA || !rootB)
|
|
121
|
+
return null;
|
|
122
|
+
const stopAt = opts.earlyExitAtOrBelow;
|
|
123
|
+
const best = {
|
|
124
|
+
distance: Infinity,
|
|
125
|
+
pointA: [0, 0, 0],
|
|
126
|
+
pointB: [0, 0, 0],
|
|
127
|
+
triangleA: -1,
|
|
128
|
+
triangleB: -1,
|
|
129
|
+
};
|
|
130
|
+
// Frontier of node pairs, popped best-first: the tightest lower bound is
|
|
131
|
+
// explored first, so a good real distance is found early and prunes the most.
|
|
132
|
+
//
|
|
133
|
+
// A min-heap rather than a scan-and-splice over an array. Both are correct,
|
|
134
|
+
// but the frontier grows with the product of the two trees' widths, and a
|
|
135
|
+
// linear pick plus a splice is O(n) each, so the traversal degrades toward
|
|
136
|
+
// quadratic exactly on the large disjoint meshes this query exists for. The
|
|
137
|
+
// heap keeps it O(log n) per pop with the same visit order.
|
|
138
|
+
const frontier = new PairHeap();
|
|
139
|
+
frontier.push({ na: rootA, nb: rootB, lowerSq: aabbDistSq(rootA.bounds, rootB.bounds) });
|
|
140
|
+
for (;;) {
|
|
141
|
+
const next = frontier.pop();
|
|
142
|
+
if (!next)
|
|
143
|
+
break;
|
|
144
|
+
const { na, nb, lowerSq } = next;
|
|
145
|
+
// The bound is a lower bound on every pair beneath this node pair, so
|
|
146
|
+
// once it reaches the best distance found, nothing here can improve it.
|
|
147
|
+
if (lowerSq >= best.distance * best.distance)
|
|
148
|
+
continue;
|
|
149
|
+
const leafA = na.items !== undefined;
|
|
150
|
+
const leafB = nb.items !== undefined;
|
|
151
|
+
if (leafA && leafB) {
|
|
152
|
+
for (const ia of na.items ?? []) {
|
|
153
|
+
const triA = triangleAt(a.mesh, Number(a.bvh.items[ia].id));
|
|
154
|
+
const va0 = mutable(triA.v0);
|
|
155
|
+
const va1 = mutable(triA.v1);
|
|
156
|
+
const va2 = mutable(triA.v2);
|
|
157
|
+
for (const ib of nb.items ?? []) {
|
|
158
|
+
const triB = triangleAt(b.mesh, Number(b.bvh.items[ib].id));
|
|
159
|
+
const vb0 = mutable(triB.v0);
|
|
160
|
+
const vb1 = mutable(triB.v1);
|
|
161
|
+
const vb2 = mutable(triB.v2);
|
|
162
|
+
// triTriDistance's own contract (../math/triangle-distance.ts) is
|
|
163
|
+
// "only invoked for non-intersecting pairs" — intersecting ones
|
|
164
|
+
// must be gated separately with triTriIntersect, the same order
|
|
165
|
+
// engine-ts/narrow.ts already uses for its per-pair test. Skipping
|
|
166
|
+
// this gate is exactly the bug this fix closes: an intersecting
|
|
167
|
+
// pair fed to triTriDistance reports a nonzero gap for surfaces
|
|
168
|
+
// that actually overlap.
|
|
169
|
+
if (triTriIntersect(va0, va1, va2, vb0, vb1, vb2)) {
|
|
170
|
+
// 0 is the smallest distance this query can ever report, so once
|
|
171
|
+
// found nothing left in the frontier — pruned or not — can beat
|
|
172
|
+
// it. Return immediately rather than continuing to search.
|
|
173
|
+
//
|
|
174
|
+
// Each `MeshDistance.pointA`/`pointB` is documented as "witness
|
|
175
|
+
// point on mesh A"/"on mesh B" — a point that actually lies ON
|
|
176
|
+
// that triangle. The 6-vertex centroid of BOTH triangles combined
|
|
177
|
+
// (the pre-fix value here) generally lies on neither: it is the
|
|
178
|
+
// mean of six points spread across two different planes, not a
|
|
179
|
+
// point constrained to either surface (PR #2815 review).
|
|
180
|
+
//
|
|
181
|
+
// Two rounds of closest-point projection give a pair of points
|
|
182
|
+
// that DO satisfy that contract exactly, by construction of
|
|
183
|
+
// `closestPtPointTriangle`: project the midpoint of both
|
|
184
|
+
// triangles' centroids onto A, then project THAT point onto B, so
|
|
185
|
+
// `pointB` answers "where does B actually sit relative to A's own
|
|
186
|
+
// witness" rather than an independent, uncorrelated projection.
|
|
187
|
+
// For a genuinely overlapping pair this converges into the
|
|
188
|
+
// overlap region in practice; it is not a claim of the exact
|
|
189
|
+
// deepest-penetration point (computing the true triangle-triangle
|
|
190
|
+
// intersection segment/polygon is a separate, larger fix), but it
|
|
191
|
+
// is always a real point on its own reported triangle, which is
|
|
192
|
+
// the property callers of this witness point can rely on.
|
|
193
|
+
const midCentroid = [
|
|
194
|
+
(va0[0] + va1[0] + va2[0] + vb0[0] + vb1[0] + vb2[0]) / 6,
|
|
195
|
+
(va0[1] + va1[1] + va2[1] + vb0[1] + vb1[1] + vb2[1]) / 6,
|
|
196
|
+
(va0[2] + va1[2] + va2[2] + vb0[2] + vb1[2] + vb2[2]) / 6,
|
|
197
|
+
];
|
|
198
|
+
const pA = closestPtPointTriangle(midCentroid, va0, va1, va2);
|
|
199
|
+
const pB = closestPtPointTriangle(pA, vb0, vb1, vb2);
|
|
200
|
+
return {
|
|
201
|
+
distance: 0,
|
|
202
|
+
pointA: pA,
|
|
203
|
+
pointB: pB,
|
|
204
|
+
triangleA: Number(a.bvh.items[ia].id),
|
|
205
|
+
triangleB: Number(b.bvh.items[ib].id),
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
const r = triTriDistance(va0, va1, va2, vb0, vb1, vb2);
|
|
209
|
+
if (r.dist < best.distance) {
|
|
210
|
+
best.distance = r.dist;
|
|
211
|
+
best.pointA = r.pA;
|
|
212
|
+
best.pointB = r.pB;
|
|
213
|
+
best.triangleA = Number(a.bvh.items[ia].id);
|
|
214
|
+
best.triangleB = Number(b.bvh.items[ib].id);
|
|
215
|
+
if (stopAt !== undefined && best.distance <= stopAt) {
|
|
216
|
+
return { ...best };
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
continue;
|
|
222
|
+
}
|
|
223
|
+
// Descend the side that is still internal; when both are, split the one
|
|
224
|
+
// with the larger box so the bounds tighten fastest.
|
|
225
|
+
const descendA = leafB || (!leafA && boxExtent(na.bounds) >= boxExtent(nb.bounds));
|
|
226
|
+
const children = [];
|
|
227
|
+
if (descendA && !leafA) {
|
|
228
|
+
if (na.left)
|
|
229
|
+
children.push({ na: na.left, nb });
|
|
230
|
+
if (na.right)
|
|
231
|
+
children.push({ na: na.right, nb });
|
|
232
|
+
}
|
|
233
|
+
else if (!leafB) {
|
|
234
|
+
if (nb.left)
|
|
235
|
+
children.push({ na, nb: nb.left });
|
|
236
|
+
if (nb.right)
|
|
237
|
+
children.push({ na, nb: nb.right });
|
|
238
|
+
}
|
|
239
|
+
for (const c of children) {
|
|
240
|
+
const lower = aabbDistSq(c.na.bounds, c.nb.bounds);
|
|
241
|
+
if (lower < best.distance * best.distance)
|
|
242
|
+
frontier.push({ ...c, lowerSq: lower });
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
// Both roots exist, so the mesh has at least one triangle and at least one
|
|
246
|
+
// leaf pair was evaluated: `best` is always populated here. (An earlier
|
|
247
|
+
// version returned null on `triangleA < 0`, which no input could reach —
|
|
248
|
+
// a branch a test cannot exercise is a branch that hides a mistake.)
|
|
249
|
+
return { ...best };
|
|
250
|
+
}
|
|
251
|
+
/** Longest side of a box, used only to choose which side to split. */
|
|
252
|
+
function boxExtent(box) {
|
|
253
|
+
return Math.max(box.max[0] - box.min[0], box.max[1] - box.min[1], box.max[2] - box.min[2]);
|
|
254
|
+
}
|
|
255
|
+
//# sourceMappingURL=min-distance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"min-distance.js","sourceRoot":"","sources":["../../src/contact/min-distance.ts"],"names":[],"mappings":"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"}
|
|
@@ -21,8 +21,9 @@ export interface NarrowPhaseOptions {
|
|
|
21
21
|
readonly epsilon?: number;
|
|
22
22
|
/**
|
|
23
23
|
* Plane-distance tolerance for coplanarity and Möller sign tests. Defaults
|
|
24
|
-
* to {@link scaledPlaneEps}'s f32-ULP
|
|
25
|
-
*
|
|
24
|
+
* to {@link scaledPlaneEps}'s per-axis f32-ULP noise, projected onto each
|
|
25
|
+
* tested plane's own normal, not a fixed constant nor a single max over
|
|
26
|
+
* all axes; see that function's doc.
|
|
26
27
|
*/
|
|
27
28
|
readonly planeEps?: number;
|
|
28
29
|
/** BVH leaf size for per-mesh triangle BVHs. Default 8. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"narrow-phase.d.ts","sourceRoot":"","sources":["../../src/contact/narrow-phase.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAE9C,OAAO,KAAK,EAAQ,IAAI,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"narrow-phase.d.ts","sourceRoot":"","sources":["../../src/contact/narrow-phase.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAE9C,OAAO,KAAK,EAAQ,IAAI,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AA+DnD,MAAM,MAAM,YAAY,GACpB;IACE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC;IACrB,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC;IACrB,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;CAC3B,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC;IACrB,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC;IACrB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,mEAAmE;IACnE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAClB,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;CACnB,CAAC;AAEN,MAAM,WAAW,kBAAkB;IACjC,0DAA0D;IAC1D,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B;;;;;OAKG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,2DAA2D;IAC3D,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,GAAE,kBAAuB,GAAG,YAAY,EAAE,CAsC3F"}
|
|
@@ -8,7 +8,7 @@ import { triangleAt, triangleCount } from "./triangle.js";
|
|
|
8
8
|
* f32-ULP scale factor for a "worst-case" single-precision coordinate: for a
|
|
9
9
|
* value with magnitude in `[2, 4)` the true float32 ULP is `2^-22`, and for
|
|
10
10
|
* larger magnitudes the ULP only grows. Same `2^-22` term (and reasoning) as
|
|
11
|
-
* `near_band_from_extent` in `rust/geometry/src/kernel/
|
|
11
|
+
* `near_band_from_extent` in `rust/geometry/src/kernel/near_band.rs` and
|
|
12
12
|
* `precisionFloor` in `engine-ts/narrow.ts` — kept local rather than shared
|
|
13
13
|
* because plane-distance tolerance and penetration-depth tolerance are
|
|
14
14
|
* different jobs, even though both derive from the same f32 ingestion floor.
|
|
@@ -25,26 +25,44 @@ const F32_ULP_SCALE = 1 / 4_194_304; // 2^-22
|
|
|
25
25
|
* bit-identical — f32 values, and a too-tight fixed epsilon then reads that
|
|
26
26
|
* rounding noise as a genuine non-coplanar separation, discarding the
|
|
27
27
|
* shared-face contact entirely rather than reporting it as
|
|
28
|
-
* `touch`/`coplanar`.
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
*
|
|
28
|
+
* `touch`/`coplanar`.
|
|
29
|
+
*
|
|
30
|
+
* Crucially, the extent must be taken PER AXIS and projected onto each
|
|
31
|
+
* plane's own normal (`epsForPlane` in `./tri-tri.js`), not collapsed to a
|
|
32
|
+
* single max over all three axes of both AABBs. The tolerance is compared
|
|
33
|
+
* against a signed distance measured along ONE plane normal, and each
|
|
34
|
+
* coordinate's rounding noise enters that distance weighted by its axis's
|
|
35
|
+
* normal component; an axis orthogonal to the normal contributes nothing.
|
|
36
|
+
* A max-over-axes scalar instead scales the tolerance to the meshes'
|
|
37
|
+
* DISTANCE FROM THE WORLD ORIGIN along whichever axis happens to be
|
|
38
|
+
* largest, even when that axis is irrelevant to the plane being tested:
|
|
39
|
+
* two horizontal faces (normal Z) with a genuine 2.0 mm Z-clearance
|
|
40
|
+
* authored 10 km along X got planeEps = 10000 * 2^-22 = 2.384 mm, inflated
|
|
41
|
+
* entirely by the irrelevant X axis, and were fabricated as coplanar
|
|
42
|
+
* contact (above ~8.4 km extent every near-parallel candidate pair reads
|
|
43
|
+
* as coplanar). Same reasoning as the LOCAL-vs-world tolerance sizing in
|
|
44
|
+
* `section-cutter.ts` (#2622): size the tolerance off the quantity the
|
|
45
|
+
* noise actually scales with, never off an unrelated world magnitude.
|
|
46
|
+
*
|
|
47
|
+
* The projected result is floored at the old fixed `1e-6`
|
|
48
|
+
* (`ProjectedPlaneEps.floor`): scaling must only ever *widen* the tolerance
|
|
49
|
+
* relative to the constant it replaces, never narrow it: a bare
|
|
50
|
+
* `extent * F32_ULP_SCALE` is far tighter than `1e-6` for any extent under
|
|
51
|
+
* ~4.19 m, which reintroduces the exact dropped-shared-face bug this
|
|
52
|
+
* function exists to fix.
|
|
35
53
|
*/
|
|
36
54
|
function scaledPlaneEps(aabbA, aabbB) {
|
|
37
|
-
|
|
55
|
+
const axisNoise = [0, 0, 0];
|
|
38
56
|
for (const aabb of [aabbA, aabbB]) {
|
|
39
57
|
for (const v of [aabb.min, aabb.max]) {
|
|
40
|
-
for (
|
|
41
|
-
const a = Math.abs(
|
|
42
|
-
if (a >
|
|
43
|
-
|
|
58
|
+
for (let i = 0; i < 3; i++) {
|
|
59
|
+
const a = Math.abs(v[i]) * F32_ULP_SCALE;
|
|
60
|
+
if (a > axisNoise[i])
|
|
61
|
+
axisNoise[i] = a;
|
|
44
62
|
}
|
|
45
63
|
}
|
|
46
64
|
}
|
|
47
|
-
return
|
|
65
|
+
return { axisNoise, floor: 1e-6 };
|
|
48
66
|
}
|
|
49
67
|
/**
|
|
50
68
|
* For two meshes A and B, return every triangle pair whose triangles
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"narrow-phase.js","sourceRoot":"","sources":["../../src/contact/narrow-phase.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC7D,OAAO,EAAE,eAAe,
|
|
1
|
+
{"version":3,"file":"narrow-phase.js","sourceRoot":"","sources":["../../src/contact/narrow-phase.ts"],"names":[],"mappings":"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"}
|
|
@@ -259,8 +259,17 @@ function classify(base, surfaceAreaM2, pointAreaM2, lineLengthM) {
|
|
|
259
259
|
return { ...base, kind: "surface" };
|
|
260
260
|
if (base.length_m >= lineLengthM)
|
|
261
261
|
return { ...base, kind: "line" };
|
|
262
|
+
// A cluster below the surface-area threshold but still above the point
|
|
263
|
+
// floor is a small coplanar/surface contact (buildSurfaceCluster always
|
|
264
|
+
// sets length_m: 0 -- see the field docs above), not a line: it has no
|
|
265
|
+
// shared-line length to report, only a small real area and a polygon
|
|
266
|
+
// boundary. Labeling it "line" here would contradict the length_m
|
|
267
|
+
// invariant ("line only -- 0 otherwise") and mislead consumers such as
|
|
268
|
+
// the viewer's contact overlay, which renders "line" clusters as a single
|
|
269
|
+
// 2-point segment (`boundary[0]`/`boundary[1]`) rather than the polygon
|
|
270
|
+
// outline a surface cluster actually has.
|
|
262
271
|
if (base.area_m2 >= pointAreaM2)
|
|
263
|
-
return { ...base, kind: "
|
|
272
|
+
return { ...base, kind: "surface" };
|
|
264
273
|
return { ...base, kind: "point" };
|
|
265
274
|
}
|
|
266
275
|
function canonicaliseDir(v) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared-faces.js","sourceRoot":"","sources":["../../src/contact/shared-faces.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"shared-faces.js","sourceRoot":"","sources":["../../src/contact/shared-faces.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,17 +16,43 @@ export type TriTriResult = {
|
|
|
16
16
|
} | {
|
|
17
17
|
readonly kind: "coplanar";
|
|
18
18
|
};
|
|
19
|
+
/**
|
|
20
|
+
* Direction-aware plane-distance tolerance: per-axis absolute rounding-noise
|
|
21
|
+
* amplitudes (world units), resolved into a scalar tolerance per plane by
|
|
22
|
+
* projecting them onto that plane's own unit normal:
|
|
23
|
+
*
|
|
24
|
+
* eps(n) = max(floor, |n_x| * axisNoise_x + |n_y| * axisNoise_y + |n_z| * axisNoise_z)
|
|
25
|
+
*
|
|
26
|
+
* A signed plane distance is `dot(n, v) + d` for a unit normal `n`, so each
|
|
27
|
+
* coordinate's rounding noise enters it weighted by that axis's normal
|
|
28
|
+
* component; an axis orthogonal to the normal contributes nothing. A single
|
|
29
|
+
* scalar built from the max coordinate over ALL axes (the pre-fix
|
|
30
|
+
* `scaledPlaneEps`) is compared against a quantity it was not derived from:
|
|
31
|
+
* it lets one large-magnitude axis inflate the tolerance for planes whose
|
|
32
|
+
* normal has no component on that axis at all, fabricating coplanar verdicts
|
|
33
|
+
* across genuine clearances (see `scaledPlaneEps` in `./narrow-phase.js`).
|
|
34
|
+
*/
|
|
35
|
+
export interface ProjectedPlaneEps {
|
|
36
|
+
/** Per-axis absolute rounding-noise amplitude (world units). */
|
|
37
|
+
readonly axisNoise: Vec3;
|
|
38
|
+
/** Minimum tolerance, applied after projection. */
|
|
39
|
+
readonly floor: number;
|
|
40
|
+
}
|
|
41
|
+
export type PlaneEps = number | ProjectedPlaneEps;
|
|
19
42
|
/**
|
|
20
43
|
* Full Möller test.
|
|
21
44
|
*
|
|
22
|
-
* `planeEps` is the
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
45
|
+
* `planeEps` is the tolerance on signed plane distance: distances with
|
|
46
|
+
* |d| / |N| <= eps are treated as zero (on-plane). A scalar is used as-is; a
|
|
47
|
+
* {@link ProjectedPlaneEps} is resolved per plane against that plane's own
|
|
48
|
+
* normal, so each of the two plane tests gets its own direction-correct
|
|
49
|
+
* tolerance. Defaults to 1e-6 in model-native units, which is only valid
|
|
50
|
+
* near the origin (see `scaledPlaneEps` in `./narrow-phase.js`); the
|
|
51
|
+
* production call path (`narrowPhase`) always supplies an explicit,
|
|
52
|
+
* coordinate-scaled value, so this default only applies to
|
|
53
|
+
* direct/standalone callers.
|
|
28
54
|
*/
|
|
29
|
-
export declare function triTriIntersect(a: Triangle, b: Triangle, planeEps?:
|
|
55
|
+
export declare function triTriIntersect(a: Triangle, b: Triangle, planeEps?: PlaneEps): TriTriResult;
|
|
30
56
|
/**
|
|
31
57
|
* True when triangles lie in the same plane within `planeEps`.
|
|
32
58
|
* Both triangles must be non-degenerate.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tri-tri.d.ts","sourceRoot":"","sources":["../../src/contact/tri-tri.ts"],"names":[],"mappings":"AAIA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAE9C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAGvC,MAAM,MAAM,YAAY,GACpB;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACzB;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAA;CAAE,GAChE;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAA;CAAE,CAAC;AAElC
|
|
1
|
+
{"version":3,"file":"tri-tri.d.ts","sourceRoot":"","sources":["../../src/contact/tri-tri.ts"],"names":[],"mappings":"AAIA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAE9C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAGvC,MAAM,MAAM,YAAY,GACpB;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACzB;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAA;CAAE,GAChE;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAA;CAAE,CAAC;AAElC;;;;;;;;;;;;;;;GAeG;AACH,MAAM,WAAW,iBAAiB;IAChC,gEAAgE;IAChE,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC;IACzB,mDAAmD;IACnD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,iBAAiB,CAAC;AAelD;;;;;;;;;;;;GAYG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,QAAQ,GAAE,QAAe,GAAG,YAAY,CAiEjG;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,QAAQ,SAAO,GAAG,OAAO,CAmBpF;AAED,4EAA4E;AAC5E,wBAAgB,qBAAqB,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,GAAG,MAAM,CAMlE"}
|
package/dist/contact/tri-tri.js
CHANGED
|
@@ -3,15 +3,30 @@
|
|
|
3
3
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
|
4
4
|
import { isDegenerate, triangleNormalRaw } from "./triangle.js";
|
|
5
5
|
import { cross3, dot3, length3, lerp3, sub3 } from "./vec3.js";
|
|
6
|
+
/** Resolve a {@link PlaneEps} into a scalar tolerance for the plane with
|
|
7
|
+
* (unnormalised) normal `n` of length `ln`. */
|
|
8
|
+
function epsForPlane(planeEps, n, ln) {
|
|
9
|
+
if (typeof planeEps === "number")
|
|
10
|
+
return planeEps;
|
|
11
|
+
const { axisNoise, floor } = planeEps;
|
|
12
|
+
const projected = (Math.abs(n[0]) * axisNoise[0] +
|
|
13
|
+
Math.abs(n[1]) * axisNoise[1] +
|
|
14
|
+
Math.abs(n[2]) * axisNoise[2]) /
|
|
15
|
+
ln;
|
|
16
|
+
return Math.max(floor, projected);
|
|
17
|
+
}
|
|
6
18
|
/**
|
|
7
19
|
* Full Möller test.
|
|
8
20
|
*
|
|
9
|
-
* `planeEps` is the
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
21
|
+
* `planeEps` is the tolerance on signed plane distance: distances with
|
|
22
|
+
* |d| / |N| <= eps are treated as zero (on-plane). A scalar is used as-is; a
|
|
23
|
+
* {@link ProjectedPlaneEps} is resolved per plane against that plane's own
|
|
24
|
+
* normal, so each of the two plane tests gets its own direction-correct
|
|
25
|
+
* tolerance. Defaults to 1e-6 in model-native units, which is only valid
|
|
26
|
+
* near the origin (see `scaledPlaneEps` in `./narrow-phase.js`); the
|
|
27
|
+
* production call path (`narrowPhase`) always supplies an explicit,
|
|
28
|
+
* coordinate-scaled value, so this default only applies to
|
|
29
|
+
* direct/standalone callers.
|
|
15
30
|
*/
|
|
16
31
|
export function triTriIntersect(a, b, planeEps = 1e-6) {
|
|
17
32
|
if (isDegenerate(a) || isDegenerate(b))
|
|
@@ -20,24 +35,26 @@ export function triTriIntersect(a, b, planeEps = 1e-6) {
|
|
|
20
35
|
const N2 = triangleNormalRaw(b);
|
|
21
36
|
const ln2 = length3(N2);
|
|
22
37
|
const d2 = -dot3(N2, b.v0);
|
|
38
|
+
const epsB = epsForPlane(planeEps, N2, ln2);
|
|
23
39
|
const dA0 = (dot3(N2, a.v0) + d2) / ln2;
|
|
24
40
|
const dA1 = (dot3(N2, a.v1) + d2) / ln2;
|
|
25
41
|
const dA2 = (dot3(N2, a.v2) + d2) / ln2;
|
|
26
|
-
const sA0 = signOf(dA0,
|
|
27
|
-
const sA1 = signOf(dA1,
|
|
28
|
-
const sA2 = signOf(dA2,
|
|
42
|
+
const sA0 = signOf(dA0, epsB);
|
|
43
|
+
const sA1 = signOf(dA1, epsB);
|
|
44
|
+
const sA2 = signOf(dA2, epsB);
|
|
29
45
|
if (sA0 === sA1 && sA1 === sA2 && sA0 !== 0)
|
|
30
46
|
return { kind: "none" };
|
|
31
47
|
// Plane of A
|
|
32
48
|
const N1 = triangleNormalRaw(a);
|
|
33
49
|
const ln1 = length3(N1);
|
|
34
50
|
const d1 = -dot3(N1, a.v0);
|
|
51
|
+
const epsA = epsForPlane(planeEps, N1, ln1);
|
|
35
52
|
const dB0 = (dot3(N1, b.v0) + d1) / ln1;
|
|
36
53
|
const dB1 = (dot3(N1, b.v1) + d1) / ln1;
|
|
37
54
|
const dB2 = (dot3(N1, b.v2) + d1) / ln1;
|
|
38
|
-
const sB0 = signOf(dB0,
|
|
39
|
-
const sB1 = signOf(dB1,
|
|
40
|
-
const sB2 = signOf(dB2,
|
|
55
|
+
const sB0 = signOf(dB0, epsA);
|
|
56
|
+
const sB1 = signOf(dB1, epsA);
|
|
57
|
+
const sB2 = signOf(dB2, epsA);
|
|
41
58
|
if (sB0 === sB1 && sB1 === sB2 && sB0 !== 0)
|
|
42
59
|
return { kind: "none" };
|
|
43
60
|
// All-zero on either side → coplanar
|
|
@@ -50,9 +67,15 @@ export function triTriIntersect(a, b, planeEps = 1e-6) {
|
|
|
50
67
|
const chordB = triChord(b, dB0, dB1, dB2);
|
|
51
68
|
if (!chordA || !chordB)
|
|
52
69
|
return { kind: "none" };
|
|
53
|
-
// Overlap along the common intersection line.
|
|
70
|
+
// Overlap along the common intersection line. The slop here compares
|
|
71
|
+
// coordinates along one world axis (`dAxis`), so a ProjectedPlaneEps
|
|
72
|
+
// resolves to that axis's own noise amplitude (the projection of
|
|
73
|
+
// `axisNoise` onto the axis unit vector), floored the same way.
|
|
54
74
|
const D = cross3(N1, N2);
|
|
55
75
|
const dAxis = dominantAxis(D);
|
|
76
|
+
const lineEps = typeof planeEps === "number"
|
|
77
|
+
? planeEps
|
|
78
|
+
: Math.max(planeEps.floor, planeEps.axisNoise[dAxis]);
|
|
56
79
|
const ta0 = chordA[0][dAxis];
|
|
57
80
|
const ta1 = chordA[1][dAxis];
|
|
58
81
|
const tb0 = chordB[0][dAxis];
|
|
@@ -63,7 +86,7 @@ export function triTriIntersect(a, b, planeEps = 1e-6) {
|
|
|
63
86
|
const bMax = Math.max(tb0, tb1);
|
|
64
87
|
const oMin = Math.max(aMin, bMin);
|
|
65
88
|
const oMax = Math.min(aMax, bMax);
|
|
66
|
-
if (oMax < oMin -
|
|
89
|
+
if (oMax < oMin - lineEps)
|
|
67
90
|
return { kind: "none" };
|
|
68
91
|
// Reconstruct 3D endpoints of the overlap on the intersection line by
|
|
69
92
|
// picking the chord whose parameter interval matches the overlap.
|