@ifc-lite/clash 1.1.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/LICENSE +373 -0
- package/README.md +32 -0
- package/dist/adapters/ifcx.d.ts +44 -0
- package/dist/adapters/ifcx.d.ts.map +1 -0
- package/dist/adapters/ifcx.js +198 -0
- package/dist/adapters/ifcx.js.map +1 -0
- package/dist/adapters/step.d.ts +42 -0
- package/dist/adapters/step.d.ts.map +1 -0
- package/dist/adapters/step.js +77 -0
- package/dist/adapters/step.js.map +1 -0
- package/dist/bcf-bridge.d.ts +51 -0
- package/dist/bcf-bridge.d.ts.map +1 -0
- package/dist/bcf-bridge.js +298 -0
- package/dist/bcf-bridge.js.map +1 -0
- package/dist/deterministic-uuid.d.ts +9 -0
- package/dist/deterministic-uuid.d.ts.map +1 -0
- package/dist/deterministic-uuid.js +87 -0
- package/dist/deterministic-uuid.js.map +1 -0
- package/dist/disciplines.d.ts +33 -0
- package/dist/disciplines.d.ts.map +1 -0
- package/dist/disciplines.js +148 -0
- package/dist/disciplines.js.map +1 -0
- package/dist/engine-ts/broad.d.ts +11 -0
- package/dist/engine-ts/broad.d.ts.map +1 -0
- package/dist/engine-ts/broad.js +61 -0
- package/dist/engine-ts/broad.js.map +1 -0
- package/dist/engine-ts/index.d.ts +16 -0
- package/dist/engine-ts/index.d.ts.map +1 -0
- package/dist/engine-ts/index.js +17 -0
- package/dist/engine-ts/index.js.map +1 -0
- package/dist/engine-ts/kernel.d.ts +50 -0
- package/dist/engine-ts/kernel.d.ts.map +1 -0
- package/dist/engine-ts/kernel.js +5 -0
- package/dist/engine-ts/kernel.js.map +1 -0
- package/dist/engine-ts/narrow.d.ts +23 -0
- package/dist/engine-ts/narrow.d.ts.map +1 -0
- package/dist/engine-ts/narrow.js +127 -0
- package/dist/engine-ts/narrow.js.map +1 -0
- package/dist/engine-ts/orchestrator.d.ts +11 -0
- package/dist/engine-ts/orchestrator.d.ts.map +1 -0
- package/dist/engine-ts/orchestrator.js +127 -0
- package/dist/engine-ts/orchestrator.js.map +1 -0
- package/dist/engine-ts/tri-mesh.d.ts +33 -0
- package/dist/engine-ts/tri-mesh.d.ts.map +1 -0
- package/dist/engine-ts/tri-mesh.js +125 -0
- package/dist/engine-ts/tri-mesh.js.map +1 -0
- package/dist/engine-ts/ts-kernel.d.ts +14 -0
- package/dist/engine-ts/ts-kernel.d.ts.map +1 -0
- package/dist/engine-ts/ts-kernel.js +85 -0
- package/dist/engine-ts/ts-kernel.js.map +1 -0
- package/dist/engine-wasm/index.d.ts +21 -0
- package/dist/engine-wasm/index.d.ts.map +1 -0
- package/dist/engine-wasm/index.js +40 -0
- package/dist/engine-wasm/index.js.map +1 -0
- package/dist/engine-wasm/wasm-kernel.d.ts +20 -0
- package/dist/engine-wasm/wasm-kernel.d.ts.map +1 -0
- package/dist/engine-wasm/wasm-kernel.js +106 -0
- package/dist/engine-wasm/wasm-kernel.js.map +1 -0
- package/dist/engine.d.ts +14 -0
- package/dist/engine.d.ts.map +1 -0
- package/dist/engine.js +20 -0
- package/dist/engine.js.map +1 -0
- package/dist/exclude.d.ts +15 -0
- package/dist/exclude.d.ts.map +1 -0
- package/dist/exclude.js +38 -0
- package/dist/exclude.js.map +1 -0
- package/dist/grouping.d.ts +16 -0
- package/dist/grouping.d.ts.map +1 -0
- package/dist/grouping.js +311 -0
- package/dist/grouping.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -0
- package/dist/lifecycle.d.ts +41 -0
- package/dist/lifecycle.d.ts.map +1 -0
- package/dist/lifecycle.js +70 -0
- package/dist/lifecycle.js.map +1 -0
- package/dist/math/aabb.d.ts +27 -0
- package/dist/math/aabb.d.ts.map +1 -0
- package/dist/math/aabb.js +127 -0
- package/dist/math/aabb.js.map +1 -0
- package/dist/math/triangle-distance.d.ts +29 -0
- package/dist/math/triangle-distance.d.ts.map +1 -0
- package/dist/math/triangle-distance.js +149 -0
- package/dist/math/triangle-distance.js.map +1 -0
- package/dist/math/triangle-intersect.d.ts +13 -0
- package/dist/math/triangle-intersect.d.ts.map +1 -0
- package/dist/math/triangle-intersect.js +55 -0
- package/dist/math/triangle-intersect.js.map +1 -0
- package/dist/math/vec3.d.ts +11 -0
- package/dist/math/vec3.d.ts.map +1 -0
- package/dist/math/vec3.js +38 -0
- package/dist/math/vec3.js.map +1 -0
- package/dist/selectors.d.ts +12 -0
- package/dist/selectors.d.ts.map +1 -0
- package/dist/selectors.js +53 -0
- package/dist/selectors.js.map +1 -0
- package/dist/triage.d.ts +19 -0
- package/dist/triage.d.ts.map +1 -0
- package/dist/triage.js +99 -0
- package/dist/triage.js.map +1 -0
- package/dist/types.d.ts +145 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +8 -0
- package/dist/types.js.map +1 -0
- package/package.json +72 -0
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { AABB } from '@ifc-lite/spatial';
|
|
2
|
+
import type { Mat4, Vec3 } from '../types.js';
|
|
3
|
+
/** Axis-aligned bounds of a packed `[x,y,z,...]` position buffer. */
|
|
4
|
+
export declare function fromPositions(positions: Float32Array, transform?: Mat4): AABB;
|
|
5
|
+
/** Expand bounds by `m` on every side. */
|
|
6
|
+
export declare function inflate(b: AABB, m: number): AABB;
|
|
7
|
+
export declare function center(b: AABB): Vec3;
|
|
8
|
+
export declare function intersects(a: AABB, b: AABB): boolean;
|
|
9
|
+
/**
|
|
10
|
+
* Signed gap between two boxes: `>0` is the Euclidean separation, `<0` is the
|
|
11
|
+
* penetration depth (negative of the minimum-axis overlap). Used as a cheap
|
|
12
|
+
* penetration *estimate* for hard clashes in the Phase-0 reference engine;
|
|
13
|
+
* exact penetration depth lands with the Rust core.
|
|
14
|
+
*/
|
|
15
|
+
export declare function signedGap(a: AABB, b: AABB): number;
|
|
16
|
+
/** The intersection box of two overlapping bounds (clamped to be non-inverted). */
|
|
17
|
+
export declare function overlapBounds(a: AABB, b: AABB): AABB;
|
|
18
|
+
/** Bounds enclosing two points. */
|
|
19
|
+
export declare function boundsOfPoints(a: Vec3, b: Vec3): AABB;
|
|
20
|
+
/**
|
|
21
|
+
* True when `outer` fully contains `inner` (face-sharing counts as contained).
|
|
22
|
+
* Cheap precondition for the enclosed-solid test in the narrow phase: a solid
|
|
23
|
+
* can only be buried inside another if its AABB is inside the other's. Mirrors
|
|
24
|
+
* `aabb_contains` in the Rust kernel exactly (same `<=`/`>=`, axis order 0,1,2).
|
|
25
|
+
*/
|
|
26
|
+
export declare function aabbContains(outer: AABB, inner: AABB): boolean;
|
|
27
|
+
//# sourceMappingURL=aabb.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aabb.d.ts","sourceRoot":"","sources":["../../src/math/aabb.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAW9C,qEAAqE;AACrE,wBAAgB,aAAa,CAAC,SAAS,EAAE,YAAY,EAAE,SAAS,CAAC,EAAE,IAAI,GAAG,IAAI,CAyB7E;AAED,0CAA0C;AAC1C,wBAAgB,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAKhD;AAED,wBAAgB,MAAM,CAAC,CAAC,EAAE,IAAI,GAAG,IAAI,CAMpC;AAED,wBAAgB,UAAU,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,GAAG,OAAO,CAMpD;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,GAAG,MAAM,CAelD;AAED,mFAAmF;AACnF,wBAAgB,aAAa,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,GAAG,IAAI,CAmBpD;AAED,mCAAmC;AACnC,wBAAgB,cAAc,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,GAAG,IAAI,CAKrD;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,GAAG,OAAO,CAM9D"}
|
|
@@ -0,0 +1,127 @@
|
|
|
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
|
+
/** Transform a point by a column-major 4×4 matrix. */
|
|
5
|
+
function applyMat4(m, x, y, z) {
|
|
6
|
+
return [
|
|
7
|
+
m[0] * x + m[4] * y + m[8] * z + m[12],
|
|
8
|
+
m[1] * x + m[5] * y + m[9] * z + m[13],
|
|
9
|
+
m[2] * x + m[6] * y + m[10] * z + m[14],
|
|
10
|
+
];
|
|
11
|
+
}
|
|
12
|
+
/** Axis-aligned bounds of a packed `[x,y,z,...]` position buffer. */
|
|
13
|
+
export function fromPositions(positions, transform) {
|
|
14
|
+
if (positions.length < 3) {
|
|
15
|
+
return { min: [0, 0, 0], max: [0, 0, 0] };
|
|
16
|
+
}
|
|
17
|
+
let minX = Infinity;
|
|
18
|
+
let minY = Infinity;
|
|
19
|
+
let minZ = Infinity;
|
|
20
|
+
let maxX = -Infinity;
|
|
21
|
+
let maxY = -Infinity;
|
|
22
|
+
let maxZ = -Infinity;
|
|
23
|
+
for (let i = 0; i + 2 < positions.length; i += 3) {
|
|
24
|
+
let x = positions[i];
|
|
25
|
+
let y = positions[i + 1];
|
|
26
|
+
let z = positions[i + 2];
|
|
27
|
+
if (transform) {
|
|
28
|
+
[x, y, z] = applyMat4(transform, x, y, z);
|
|
29
|
+
}
|
|
30
|
+
if (x < minX)
|
|
31
|
+
minX = x;
|
|
32
|
+
if (y < minY)
|
|
33
|
+
minY = y;
|
|
34
|
+
if (z < minZ)
|
|
35
|
+
minZ = z;
|
|
36
|
+
if (x > maxX)
|
|
37
|
+
maxX = x;
|
|
38
|
+
if (y > maxY)
|
|
39
|
+
maxY = y;
|
|
40
|
+
if (z > maxZ)
|
|
41
|
+
maxZ = z;
|
|
42
|
+
}
|
|
43
|
+
return { min: [minX, minY, minZ], max: [maxX, maxY, maxZ] };
|
|
44
|
+
}
|
|
45
|
+
/** Expand bounds by `m` on every side. */
|
|
46
|
+
export function inflate(b, m) {
|
|
47
|
+
return {
|
|
48
|
+
min: [b.min[0] - m, b.min[1] - m, b.min[2] - m],
|
|
49
|
+
max: [b.max[0] + m, b.max[1] + m, b.max[2] + m],
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
export function center(b) {
|
|
53
|
+
return [
|
|
54
|
+
(b.min[0] + b.max[0]) / 2,
|
|
55
|
+
(b.min[1] + b.max[1]) / 2,
|
|
56
|
+
(b.min[2] + b.max[2]) / 2,
|
|
57
|
+
];
|
|
58
|
+
}
|
|
59
|
+
export function intersects(a, b) {
|
|
60
|
+
return (a.min[0] <= b.max[0] && a.max[0] >= b.min[0] &&
|
|
61
|
+
a.min[1] <= b.max[1] && a.max[1] >= b.min[1] &&
|
|
62
|
+
a.min[2] <= b.max[2] && a.max[2] >= b.min[2]);
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Signed gap between two boxes: `>0` is the Euclidean separation, `<0` is the
|
|
66
|
+
* penetration depth (negative of the minimum-axis overlap). Used as a cheap
|
|
67
|
+
* penetration *estimate* for hard clashes in the Phase-0 reference engine;
|
|
68
|
+
* exact penetration depth lands with the Rust core.
|
|
69
|
+
*/
|
|
70
|
+
export function signedGap(a, b) {
|
|
71
|
+
let squaredDistance = 0;
|
|
72
|
+
let minOverlap = Infinity;
|
|
73
|
+
let penetrating = true;
|
|
74
|
+
for (let i = 0; i < 3; i += 1) {
|
|
75
|
+
const gap = Math.max(b.min[i] - a.max[i], a.min[i] - b.max[i]);
|
|
76
|
+
if (gap > 0) {
|
|
77
|
+
squaredDistance += gap * gap;
|
|
78
|
+
penetrating = false;
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
const overlap = Math.min(a.max[i], b.max[i]) - Math.max(a.min[i], b.min[i]);
|
|
82
|
+
if (overlap < minOverlap)
|
|
83
|
+
minOverlap = overlap;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return penetrating ? -minOverlap : Math.sqrt(squaredDistance);
|
|
87
|
+
}
|
|
88
|
+
/** The intersection box of two overlapping bounds (clamped to be non-inverted). */
|
|
89
|
+
export function overlapBounds(a, b) {
|
|
90
|
+
const min = [
|
|
91
|
+
Math.max(a.min[0], b.min[0]),
|
|
92
|
+
Math.max(a.min[1], b.min[1]),
|
|
93
|
+
Math.max(a.min[2], b.min[2]),
|
|
94
|
+
];
|
|
95
|
+
const max = [
|
|
96
|
+
Math.min(a.max[0], b.max[0]),
|
|
97
|
+
Math.min(a.max[1], b.max[1]),
|
|
98
|
+
Math.min(a.max[2], b.max[2]),
|
|
99
|
+
];
|
|
100
|
+
for (let i = 0; i < 3; i += 1) {
|
|
101
|
+
if (max[i] < min[i]) {
|
|
102
|
+
const mid = (min[i] + max[i]) / 2;
|
|
103
|
+
min[i] = mid;
|
|
104
|
+
max[i] = mid;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return { min, max };
|
|
108
|
+
}
|
|
109
|
+
/** Bounds enclosing two points. */
|
|
110
|
+
export function boundsOfPoints(a, b) {
|
|
111
|
+
return {
|
|
112
|
+
min: [Math.min(a[0], b[0]), Math.min(a[1], b[1]), Math.min(a[2], b[2])],
|
|
113
|
+
max: [Math.max(a[0], b[0]), Math.max(a[1], b[1]), Math.max(a[2], b[2])],
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* True when `outer` fully contains `inner` (face-sharing counts as contained).
|
|
118
|
+
* Cheap precondition for the enclosed-solid test in the narrow phase: a solid
|
|
119
|
+
* can only be buried inside another if its AABB is inside the other's. Mirrors
|
|
120
|
+
* `aabb_contains` in the Rust kernel exactly (same `<=`/`>=`, axis order 0,1,2).
|
|
121
|
+
*/
|
|
122
|
+
export function aabbContains(outer, inner) {
|
|
123
|
+
return (outer.min[0] <= inner.min[0] && outer.max[0] >= inner.max[0] &&
|
|
124
|
+
outer.min[1] <= inner.min[1] && outer.max[1] >= inner.max[1] &&
|
|
125
|
+
outer.min[2] <= inner.min[2] && outer.max[2] >= inner.max[2]);
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=aabb.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aabb.js","sourceRoot":"","sources":["../../src/math/aabb.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { Vec3 } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Closest points between two segments [p1,q1] and [p2,q2].
|
|
4
|
+
* Ericson, Real-Time Collision Detection §5.1.9. Returns squared distance and
|
|
5
|
+
* the closest point on each segment.
|
|
6
|
+
*/
|
|
7
|
+
export declare function closestPtSegSeg(p1: Vec3, q1: Vec3, p2: Vec3, q2: Vec3): {
|
|
8
|
+
d2: number;
|
|
9
|
+
c1: Vec3;
|
|
10
|
+
c2: Vec3;
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Closest point on triangle (a,b,c) to point p.
|
|
14
|
+
* Ericson, Real-Time Collision Detection §5.1.5.
|
|
15
|
+
*/
|
|
16
|
+
export declare function closestPtPointTriangle(p: Vec3, a: Vec3, b: Vec3, c: Vec3): Vec3;
|
|
17
|
+
/**
|
|
18
|
+
* Minimum distance between two triangles, with the closest point on each.
|
|
19
|
+
*
|
|
20
|
+
* Correct for **disjoint** triangles (the minimum lies on an edge–edge pair or
|
|
21
|
+
* a vertex-to-face). Intersecting triangles must be detected separately with
|
|
22
|
+
* `triTriIntersect`; this routine is only invoked for non-intersecting pairs.
|
|
23
|
+
*/
|
|
24
|
+
export declare function triTriDistance(a0: Vec3, a1: Vec3, a2: Vec3, b0: Vec3, b1: Vec3, b2: Vec3): {
|
|
25
|
+
dist: number;
|
|
26
|
+
pA: Vec3;
|
|
27
|
+
pB: Vec3;
|
|
28
|
+
};
|
|
29
|
+
//# sourceMappingURL=triangle-distance.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"triangle-distance.d.ts","sourceRoot":"","sources":["../../src/math/triangle-distance.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AASxC;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,EAAE,EAAE,IAAI,EACR,EAAE,EAAE,IAAI,EACR,EAAE,EAAE,IAAI,EACR,EAAE,EAAE,IAAI,GACP;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,IAAI,CAAC;IAAC,EAAE,EAAE,IAAI,CAAA;CAAE,CAwCpC;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,GAAG,IAAI,CAwC/E;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC5B,EAAE,EAAE,IAAI,EACR,EAAE,EAAE,IAAI,EACR,EAAE,EAAE,IAAI,EACR,EAAE,EAAE,IAAI,EACR,EAAE,EAAE,IAAI,EACR,EAAE,EAAE,IAAI,GACP;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,IAAI,CAAC;IAAC,EAAE,EAAE,IAAI,CAAA;CAAE,CAgDtC"}
|
|
@@ -0,0 +1,149 @@
|
|
|
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
|
+
import { add, distSq, dot, scale, sub } from './vec3.js';
|
|
5
|
+
function clamp(v, lo, hi) {
|
|
6
|
+
return v < lo ? lo : v > hi ? hi : v;
|
|
7
|
+
}
|
|
8
|
+
const EPS = 1e-12;
|
|
9
|
+
/**
|
|
10
|
+
* Closest points between two segments [p1,q1] and [p2,q2].
|
|
11
|
+
* Ericson, Real-Time Collision Detection §5.1.9. Returns squared distance and
|
|
12
|
+
* the closest point on each segment.
|
|
13
|
+
*/
|
|
14
|
+
export function closestPtSegSeg(p1, q1, p2, q2) {
|
|
15
|
+
const d1 = sub(q1, p1);
|
|
16
|
+
const d2v = sub(q2, p2);
|
|
17
|
+
const r = sub(p1, p2);
|
|
18
|
+
const a = dot(d1, d1);
|
|
19
|
+
const e = dot(d2v, d2v);
|
|
20
|
+
const f = dot(d2v, r);
|
|
21
|
+
let s;
|
|
22
|
+
let t;
|
|
23
|
+
if (a <= EPS && e <= EPS) {
|
|
24
|
+
s = 0;
|
|
25
|
+
t = 0;
|
|
26
|
+
}
|
|
27
|
+
else if (a <= EPS) {
|
|
28
|
+
s = 0;
|
|
29
|
+
t = clamp(f / e, 0, 1);
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
const c = dot(d1, r);
|
|
33
|
+
if (e <= EPS) {
|
|
34
|
+
t = 0;
|
|
35
|
+
s = clamp(-c / a, 0, 1);
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
const b = dot(d1, d2v);
|
|
39
|
+
const denom = a * e - b * b;
|
|
40
|
+
s = denom !== 0 ? clamp((b * f - c * e) / denom, 0, 1) : 0;
|
|
41
|
+
t = (b * s + f) / e;
|
|
42
|
+
if (t < 0) {
|
|
43
|
+
t = 0;
|
|
44
|
+
s = clamp(-c / a, 0, 1);
|
|
45
|
+
}
|
|
46
|
+
else if (t > 1) {
|
|
47
|
+
t = 1;
|
|
48
|
+
s = clamp((b - c) / a, 0, 1);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
const c1 = add(p1, scale(d1, s));
|
|
53
|
+
const c2 = add(p2, scale(d2v, t));
|
|
54
|
+
return { d2: distSq(c1, c2), c1, c2 };
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Closest point on triangle (a,b,c) to point p.
|
|
58
|
+
* Ericson, Real-Time Collision Detection §5.1.5.
|
|
59
|
+
*/
|
|
60
|
+
export function closestPtPointTriangle(p, a, b, c) {
|
|
61
|
+
const ab = sub(b, a);
|
|
62
|
+
const ac = sub(c, a);
|
|
63
|
+
const ap = sub(p, a);
|
|
64
|
+
const d1 = dot(ab, ap);
|
|
65
|
+
const d2 = dot(ac, ap);
|
|
66
|
+
if (d1 <= 0 && d2 <= 0)
|
|
67
|
+
return a;
|
|
68
|
+
const bp = sub(p, b);
|
|
69
|
+
const d3 = dot(ab, bp);
|
|
70
|
+
const d4 = dot(ac, bp);
|
|
71
|
+
if (d3 >= 0 && d4 <= d3)
|
|
72
|
+
return b;
|
|
73
|
+
const vc = d1 * d4 - d3 * d2;
|
|
74
|
+
if (vc <= 0 && d1 >= 0 && d3 <= 0) {
|
|
75
|
+
const v = d1 / (d1 - d3);
|
|
76
|
+
return add(a, scale(ab, v));
|
|
77
|
+
}
|
|
78
|
+
const cp = sub(p, c);
|
|
79
|
+
const d5 = dot(ab, cp);
|
|
80
|
+
const d6 = dot(ac, cp);
|
|
81
|
+
if (d6 >= 0 && d5 <= d6)
|
|
82
|
+
return c;
|
|
83
|
+
const vb = d5 * d2 - d1 * d6;
|
|
84
|
+
if (vb <= 0 && d2 >= 0 && d6 <= 0) {
|
|
85
|
+
const w = d2 / (d2 - d6);
|
|
86
|
+
return add(a, scale(ac, w));
|
|
87
|
+
}
|
|
88
|
+
const va = d3 * d6 - d5 * d4;
|
|
89
|
+
if (va <= 0 && d4 - d3 >= 0 && d5 - d6 >= 0) {
|
|
90
|
+
const w = (d4 - d3) / (d4 - d3 + (d5 - d6));
|
|
91
|
+
return add(b, scale(sub(c, b), w));
|
|
92
|
+
}
|
|
93
|
+
const denom = 1 / (va + vb + vc);
|
|
94
|
+
const v = vb * denom;
|
|
95
|
+
const w = vc * denom;
|
|
96
|
+
return add(a, add(scale(ab, v), scale(ac, w)));
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Minimum distance between two triangles, with the closest point on each.
|
|
100
|
+
*
|
|
101
|
+
* Correct for **disjoint** triangles (the minimum lies on an edge–edge pair or
|
|
102
|
+
* a vertex-to-face). Intersecting triangles must be detected separately with
|
|
103
|
+
* `triTriIntersect`; this routine is only invoked for non-intersecting pairs.
|
|
104
|
+
*/
|
|
105
|
+
export function triTriDistance(a0, a1, a2, b0, b1, b2) {
|
|
106
|
+
const ea = [
|
|
107
|
+
[a0, a1],
|
|
108
|
+
[a1, a2],
|
|
109
|
+
[a2, a0],
|
|
110
|
+
];
|
|
111
|
+
const eb = [
|
|
112
|
+
[b0, b1],
|
|
113
|
+
[b1, b2],
|
|
114
|
+
[b2, b0],
|
|
115
|
+
];
|
|
116
|
+
let best = Infinity;
|
|
117
|
+
let pA = a0;
|
|
118
|
+
let pB = b0;
|
|
119
|
+
for (const [s0, s1] of ea) {
|
|
120
|
+
for (const [t0, t1] of eb) {
|
|
121
|
+
const r = closestPtSegSeg(s0, s1, t0, t1);
|
|
122
|
+
if (r.d2 < best) {
|
|
123
|
+
best = r.d2;
|
|
124
|
+
pA = r.c1;
|
|
125
|
+
pB = r.c2;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
for (const v of [a0, a1, a2]) {
|
|
130
|
+
const c = closestPtPointTriangle(v, b0, b1, b2);
|
|
131
|
+
const d2 = distSq(v, c);
|
|
132
|
+
if (d2 < best) {
|
|
133
|
+
best = d2;
|
|
134
|
+
pA = v;
|
|
135
|
+
pB = c;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
for (const v of [b0, b1, b2]) {
|
|
139
|
+
const c = closestPtPointTriangle(v, a0, a1, a2);
|
|
140
|
+
const d2 = distSq(v, c);
|
|
141
|
+
if (d2 < best) {
|
|
142
|
+
best = d2;
|
|
143
|
+
pA = c;
|
|
144
|
+
pB = v;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
return { dist: Math.sqrt(best), pA, pB };
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=triangle-distance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"triangle-distance.js","sourceRoot":"","sources":["../../src/math/triangle-distance.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Vec3 } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Exact triangle–triangle intersection via the Separating Axis Theorem.
|
|
4
|
+
*
|
|
5
|
+
* Tests the 2 face normals plus the 9 edge–edge cross-product axes. Returns
|
|
6
|
+
* `true` only when the triangle *interiors* overlap; bare touching (coincident
|
|
7
|
+
* faces/edges/vertices) reports `false` and is handled by the distance path as
|
|
8
|
+
* a `touch`. Coplanar overlap is intentionally treated as touching, not a hard
|
|
9
|
+
* clash — genuine interpenetration always produces non-coplanar crossing
|
|
10
|
+
* triangles, which the edge-cross axes separate correctly.
|
|
11
|
+
*/
|
|
12
|
+
export declare function triTriIntersect(a0: Vec3, a1: Vec3, a2: Vec3, b0: Vec3, b1: Vec3, b2: Vec3, eps?: number): boolean;
|
|
13
|
+
//# sourceMappingURL=triangle-intersect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"triangle-intersect.d.ts","sourceRoot":"","sources":["../../src/math/triangle-intersect.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAGxC;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAC7B,EAAE,EAAE,IAAI,EACR,EAAE,EAAE,IAAI,EACR,EAAE,EAAE,IAAI,EACR,EAAE,EAAE,IAAI,EACR,EAAE,EAAE,IAAI,EACR,EAAE,EAAE,IAAI,EACR,GAAG,SAAQ,GACV,OAAO,CAuCT"}
|
|
@@ -0,0 +1,55 @@
|
|
|
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
|
+
import { cross, dot, sub } from './vec3.js';
|
|
5
|
+
/**
|
|
6
|
+
* Exact triangle–triangle intersection via the Separating Axis Theorem.
|
|
7
|
+
*
|
|
8
|
+
* Tests the 2 face normals plus the 9 edge–edge cross-product axes. Returns
|
|
9
|
+
* `true` only when the triangle *interiors* overlap; bare touching (coincident
|
|
10
|
+
* faces/edges/vertices) reports `false` and is handled by the distance path as
|
|
11
|
+
* a `touch`. Coplanar overlap is intentionally treated as touching, not a hard
|
|
12
|
+
* clash — genuine interpenetration always produces non-coplanar crossing
|
|
13
|
+
* triangles, which the edge-cross axes separate correctly.
|
|
14
|
+
*/
|
|
15
|
+
export function triTriIntersect(a0, a1, a2, b0, b1, b2, eps = 1e-12) {
|
|
16
|
+
const edgesA = [sub(a1, a0), sub(a2, a1), sub(a0, a2)];
|
|
17
|
+
const edgesB = [sub(b1, b0), sub(b2, b1), sub(b0, b2)];
|
|
18
|
+
const axes = [cross(edgesA[0], edgesA[1]), cross(edgesB[0], edgesB[1])];
|
|
19
|
+
for (const ea of edgesA) {
|
|
20
|
+
for (const eb of edgesB) {
|
|
21
|
+
const axis = cross(ea, eb);
|
|
22
|
+
if (dot(axis, axis) > eps) {
|
|
23
|
+
axes.push(axis);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
const va = [a0, a1, a2];
|
|
28
|
+
const vb = [b0, b1, b2];
|
|
29
|
+
for (const axis of axes) {
|
|
30
|
+
let minA = Infinity;
|
|
31
|
+
let maxA = -Infinity;
|
|
32
|
+
let minB = Infinity;
|
|
33
|
+
let maxB = -Infinity;
|
|
34
|
+
for (const v of va) {
|
|
35
|
+
const p = dot(v, axis);
|
|
36
|
+
if (p < minA)
|
|
37
|
+
minA = p;
|
|
38
|
+
if (p > maxA)
|
|
39
|
+
maxA = p;
|
|
40
|
+
}
|
|
41
|
+
for (const v of vb) {
|
|
42
|
+
const p = dot(v, axis);
|
|
43
|
+
if (p < minB)
|
|
44
|
+
minB = p;
|
|
45
|
+
if (p > maxB)
|
|
46
|
+
maxB = p;
|
|
47
|
+
}
|
|
48
|
+
// `<=` so exact contact counts as separation (touch), not interpenetration.
|
|
49
|
+
if (maxA <= minB || maxB <= minA) {
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return true;
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=triangle-intersect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"triangle-intersect.js","sourceRoot":"","sources":["../../src/math/triangle-intersect.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAG/D,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAE5C;;;;;;;;;GASG;AACH,MAAM,UAAU,eAAe,CAC7B,EAAQ,EACR,EAAQ,EACR,EAAQ,EACR,EAAQ,EACR,EAAQ,EACR,EAAQ,EACR,GAAG,GAAG,KAAK;IAEX,MAAM,MAAM,GAAW,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IAC/D,MAAM,MAAM,GAAW,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IAE/D,MAAM,IAAI,GAAW,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAChF,KAAK,MAAM,EAAE,IAAI,MAAM,EAAE,CAAC;QACxB,KAAK,MAAM,EAAE,IAAI,MAAM,EAAE,CAAC;YACxB,MAAM,IAAI,GAAG,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YAC3B,IAAI,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC;gBAC1B,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,EAAE,GAAW,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IAChC,MAAM,EAAE,GAAW,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IAEhC,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;QACxB,IAAI,IAAI,GAAG,QAAQ,CAAC;QACpB,IAAI,IAAI,GAAG,CAAC,QAAQ,CAAC;QACrB,IAAI,IAAI,GAAG,QAAQ,CAAC;QACpB,IAAI,IAAI,GAAG,CAAC,QAAQ,CAAC;QACrB,KAAK,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;YACnB,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;YACvB,IAAI,CAAC,GAAG,IAAI;gBAAE,IAAI,GAAG,CAAC,CAAC;YACvB,IAAI,CAAC,GAAG,IAAI;gBAAE,IAAI,GAAG,CAAC,CAAC;QACzB,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;YACnB,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;YACvB,IAAI,CAAC,GAAG,IAAI;gBAAE,IAAI,GAAG,CAAC,CAAC;YACvB,IAAI,CAAC,GAAG,IAAI;gBAAE,IAAI,GAAG,CAAC,CAAC;QACzB,CAAC;QACD,4EAA4E;QAC5E,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;YACjC,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Vec3 } from '../types.js';
|
|
2
|
+
export declare function sub(a: Vec3, b: Vec3): Vec3;
|
|
3
|
+
export declare function add(a: Vec3, b: Vec3): Vec3;
|
|
4
|
+
export declare function scale(a: Vec3, s: number): Vec3;
|
|
5
|
+
export declare function cross(a: Vec3, b: Vec3): Vec3;
|
|
6
|
+
export declare function dot(a: Vec3, b: Vec3): number;
|
|
7
|
+
export declare function lenSq(a: Vec3): number;
|
|
8
|
+
export declare function distSq(a: Vec3, b: Vec3): number;
|
|
9
|
+
export declare function mid(a: Vec3, b: Vec3): Vec3;
|
|
10
|
+
export declare function centroid(a: Vec3, b: Vec3, c: Vec3): Vec3;
|
|
11
|
+
//# sourceMappingURL=vec3.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vec3.d.ts","sourceRoot":"","sources":["../../src/math/vec3.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAExC,wBAAgB,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,GAAG,IAAI,CAE1C;AAED,wBAAgB,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,GAAG,IAAI,CAE1C;AAED,wBAAgB,KAAK,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAE9C;AAED,wBAAgB,KAAK,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,GAAG,IAAI,CAM5C;AAED,wBAAgB,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,GAAG,MAAM,CAE5C;AAED,wBAAgB,KAAK,CAAC,CAAC,EAAE,IAAI,GAAG,MAAM,CAErC;AAED,wBAAgB,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,GAAG,MAAM,CAK/C;AAED,wBAAgB,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,GAAG,IAAI,CAE1C;AAED,wBAAgB,QAAQ,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,GAAG,IAAI,CAExD"}
|
|
@@ -0,0 +1,38 @@
|
|
|
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
|
+
export function sub(a, b) {
|
|
5
|
+
return [a[0] - b[0], a[1] - b[1], a[2] - b[2]];
|
|
6
|
+
}
|
|
7
|
+
export function add(a, b) {
|
|
8
|
+
return [a[0] + b[0], a[1] + b[1], a[2] + b[2]];
|
|
9
|
+
}
|
|
10
|
+
export function scale(a, s) {
|
|
11
|
+
return [a[0] * s, a[1] * s, a[2] * s];
|
|
12
|
+
}
|
|
13
|
+
export function cross(a, b) {
|
|
14
|
+
return [
|
|
15
|
+
a[1] * b[2] - a[2] * b[1],
|
|
16
|
+
a[2] * b[0] - a[0] * b[2],
|
|
17
|
+
a[0] * b[1] - a[1] * b[0],
|
|
18
|
+
];
|
|
19
|
+
}
|
|
20
|
+
export function dot(a, b) {
|
|
21
|
+
return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
|
|
22
|
+
}
|
|
23
|
+
export function lenSq(a) {
|
|
24
|
+
return dot(a, a);
|
|
25
|
+
}
|
|
26
|
+
export function distSq(a, b) {
|
|
27
|
+
const dx = a[0] - b[0];
|
|
28
|
+
const dy = a[1] - b[1];
|
|
29
|
+
const dz = a[2] - b[2];
|
|
30
|
+
return dx * dx + dy * dy + dz * dz;
|
|
31
|
+
}
|
|
32
|
+
export function mid(a, b) {
|
|
33
|
+
return [(a[0] + b[0]) / 2, (a[1] + b[1]) / 2, (a[2] + b[2]) / 2];
|
|
34
|
+
}
|
|
35
|
+
export function centroid(a, b, c) {
|
|
36
|
+
return [(a[0] + b[0] + c[0]) / 3, (a[1] + b[1] + c[1]) / 3, (a[2] + b[2] + c[2]) / 3];
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=vec3.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vec3.js","sourceRoot":"","sources":["../../src/math/vec3.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Match an IFC type name against a selector pattern.
|
|
3
|
+
*
|
|
4
|
+
* Grammar (case-insensitive):
|
|
5
|
+
* - `*` matches everything
|
|
6
|
+
* - `IfcWall` exact match
|
|
7
|
+
* - `IfcPipe*` wildcard suffix
|
|
8
|
+
* - `IfcWall|IfcSlab` pipe-separated alternatives
|
|
9
|
+
* - `!IfcWall` exclusion (everything except)
|
|
10
|
+
*/
|
|
11
|
+
export declare function matchesSelector(typeName: string, selector: string): boolean;
|
|
12
|
+
//# sourceMappingURL=selectors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"selectors.d.ts","sourceRoot":"","sources":["../src/selectors.ts"],"names":[],"mappings":"AAIA;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAwC3E"}
|
|
@@ -0,0 +1,53 @@
|
|
|
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
|
+
* Match an IFC type name against a selector pattern.
|
|
6
|
+
*
|
|
7
|
+
* Grammar (case-insensitive):
|
|
8
|
+
* - `*` matches everything
|
|
9
|
+
* - `IfcWall` exact match
|
|
10
|
+
* - `IfcPipe*` wildcard suffix
|
|
11
|
+
* - `IfcWall|IfcSlab` pipe-separated alternatives
|
|
12
|
+
* - `!IfcWall` exclusion (everything except)
|
|
13
|
+
*/
|
|
14
|
+
export function matchesSelector(typeName, selector) {
|
|
15
|
+
const trimmed = selector.trim();
|
|
16
|
+
if (!trimmed || trimmed === '*') {
|
|
17
|
+
return true;
|
|
18
|
+
}
|
|
19
|
+
// Exclusion: !IfcWall means everything except IfcWall
|
|
20
|
+
if (trimmed.startsWith('!')) {
|
|
21
|
+
return !matchesSelector(typeName, trimmed.slice(1));
|
|
22
|
+
}
|
|
23
|
+
const alternatives = trimmed.split('|');
|
|
24
|
+
const upper = typeName.toUpperCase();
|
|
25
|
+
// Evaluate every alternative so exclusions win regardless of order:
|
|
26
|
+
// any matching negated alternative rejects the type outright, otherwise
|
|
27
|
+
// the type matches when at least one positive alternative matches.
|
|
28
|
+
let positiveMatch = false;
|
|
29
|
+
for (const alt of alternatives) {
|
|
30
|
+
const pattern = alt.trim().toUpperCase();
|
|
31
|
+
if (!pattern)
|
|
32
|
+
continue;
|
|
33
|
+
if (pattern.startsWith('!')) {
|
|
34
|
+
// Exclusion within alternatives: treated as "not this one"
|
|
35
|
+
const body = pattern.slice(1);
|
|
36
|
+
if (upper === body ||
|
|
37
|
+
(body.endsWith('*') && upper.startsWith(body.slice(0, -1)))) {
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
if (pattern.endsWith('*')) {
|
|
43
|
+
if (upper.startsWith(pattern.slice(0, -1))) {
|
|
44
|
+
positiveMatch = true;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
else if (upper === pattern) {
|
|
48
|
+
positiveMatch = true;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return positiveMatch;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=selectors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"selectors.js","sourceRoot":"","sources":["../src/selectors.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D;;;;;;;;;GASG;AACH,MAAM,UAAU,eAAe,CAAC,QAAgB,EAAE,QAAgB;IAChE,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;IAChC,IAAI,CAAC,OAAO,IAAI,OAAO,KAAK,GAAG,EAAE,CAAC;QAChC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,sDAAsD;IACtD,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC5B,OAAO,CAAC,eAAe,CAAC,QAAQ,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACtD,CAAC;IAED,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACxC,MAAM,KAAK,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;IACrC,oEAAoE;IACpE,wEAAwE;IACxE,mEAAmE;IACnE,IAAI,aAAa,GAAG,KAAK,CAAC;IAC1B,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;QAC/B,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACzC,IAAI,CAAC,OAAO;YAAE,SAAS;QACvB,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC5B,2DAA2D;YAC3D,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC9B,IACE,KAAK,KAAK,IAAI;gBACd,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAC3D,CAAC;gBACD,OAAO,KAAK,CAAC;YACf,CAAC;YACD,SAAS;QACX,CAAC;QACD,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1B,IAAI,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC3C,aAAa,GAAG,IAAI,CAAC;YACvB,CAAC;QACH,CAAC;aAAM,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;YAC7B,aAAa,GAAG,IAAI,CAAC;QACvB,CAAC;IACH,CAAC;IACD,OAAO,aAAa,CAAC;AACvB,CAAC"}
|
package/dist/triage.d.ts
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI-assisted clash triage: build a structured prompt from a clash result and
|
|
3
|
+
* parse the LLM response into actionable recommendations. These are pure
|
|
4
|
+
* functions — the host (desktop, web chat, CLI `ask`, MCP `clash_review`) owns
|
|
5
|
+
* the actual LLM call.
|
|
6
|
+
*/
|
|
7
|
+
import type { ClashResult, ClashSeverity } from './types.js';
|
|
8
|
+
export interface ClashTriageResult {
|
|
9
|
+
summary: string;
|
|
10
|
+
recommendations: string[];
|
|
11
|
+
severityCounts: Record<ClashSeverity, number>;
|
|
12
|
+
}
|
|
13
|
+
/** System prompt instructing the LLM to act as a BIM coordination specialist. */
|
|
14
|
+
export declare function buildTriageSystemPrompt(): string;
|
|
15
|
+
/** Build the user message with structured clash data for the LLM. */
|
|
16
|
+
export declare function buildTriageUserMessage(result: ClashResult): string;
|
|
17
|
+
/** Parse the LLM's JSON response into a structured triage result. */
|
|
18
|
+
export declare function parseTriageResponse(text: string, result: ClashResult): ClashTriageResult;
|
|
19
|
+
//# sourceMappingURL=triage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"triage.d.ts","sourceRoot":"","sources":["../src/triage.ts"],"names":[],"mappings":"AAIA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE7D,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,cAAc,EAAE,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;CAC/C;AAED,iFAAiF;AACjF,wBAAgB,uBAAuB,IAAI,MAAM,CAsBhD;AAUD,qEAAqE;AACrE,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CA4ClE;AAQD,qEAAqE;AACrE,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,iBAAiB,CAoBxF"}
|