@helix3/helix-cli 0.1.7-helix3.46 → 0.1.8-helix3.47
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/browser/launch.d.ts +22 -0
- package/dist/browser/launch.js +46 -0
- package/dist/browser/launch.js.map +1 -0
- package/dist/gesture/worldRuntime.d.ts +2 -0
- package/dist/gesture/worldRuntime.js +2 -0
- package/dist/gesture/worldRuntime.js.map +1 -1
- package/dist/index.js +127 -0
- package/dist/index.js.map +1 -1
- package/dist/lib.d.ts +19 -0
- package/dist/lib.js +36 -1
- package/dist/lib.js.map +1 -1
- package/dist/screenshot/captureScreenshots.d.ts +4 -16
- package/dist/screenshot/captureScreenshots.js +16 -43
- package/dist/screenshot/captureScreenshots.js.map +1 -1
- package/dist/screenshot/staticServe.d.ts +1 -1
- package/dist/screenshot/staticServe.js +34 -16
- package/dist/screenshot/staticServe.js.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/dist/world/analyze.d.ts +40 -0
- package/dist/world/analyze.js +573 -0
- package/dist/world/analyze.js.map +1 -0
- package/dist/world/diff.d.ts +18 -0
- package/dist/world/diff.js +58 -0
- package/dist/world/diff.js.map +1 -0
- package/dist/world/focus.d.ts +11 -0
- package/dist/world/focus.js +99 -0
- package/dist/world/focus.js.map +1 -0
- package/dist/world/format.d.ts +6 -0
- package/dist/world/format.js +123 -0
- package/dist/world/format.js.map +1 -0
- package/dist/world/readWorldMetrics.d.ts +10 -0
- package/dist/world/readWorldMetrics.js +31 -0
- package/dist/world/readWorldMetrics.js.map +1 -0
- package/dist/world/snapshotTypes.d.ts +59 -0
- package/dist/world/snapshotTypes.js +8 -0
- package/dist/world/snapshotTypes.js.map +1 -0
- package/dist/world/snapshotWorld.d.ts +16 -0
- package/dist/world/snapshotWorld.js +120 -0
- package/dist/world/snapshotWorld.js.map +1 -0
- package/dist/world/zones.d.ts +23 -0
- package/dist/world/zones.js +134 -0
- package/dist/world/zones.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,573 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isHelperType = exports.isCharacterSubtree = exports.STEP_HEIGHT_M = void 0;
|
|
4
|
+
exports.colliderAabb = colliderAabb;
|
|
5
|
+
exports.yawDeg = yawDeg;
|
|
6
|
+
exports.obbPenetration = obbPenetration;
|
|
7
|
+
exports.analyzeWorld = analyzeWorld;
|
|
8
|
+
exports.sortFindings = sortFindings;
|
|
9
|
+
// Thresholds — hardcoded mirrors of humanoid-character's traversal defaults (RapierBody:
|
|
10
|
+
// autostep maxHeight 0.35 m, capsule 1.80 m × r 0.30). A future world_metrics table supersedes
|
|
11
|
+
// these; until then keep the values in sync with RapierBody's option defaults.
|
|
12
|
+
exports.STEP_HEIGHT_M = 0.35;
|
|
13
|
+
const SINK_TOLERANCE_M = 0.05;
|
|
14
|
+
const INTERSECT_TOLERANCE_M = 0.05;
|
|
15
|
+
const FLOOR_EPSILON_M = 0.02;
|
|
16
|
+
// A support this tall is often a ramp/terrain whose AABB top is its peak — the gap measured
|
|
17
|
+
// against it misreads slopes, so support-based findings drop to low confidence.
|
|
18
|
+
const TALL_SUPPORT_M = 1.0;
|
|
19
|
+
const DIVERGENCE_RATIO = 1.25;
|
|
20
|
+
const DIVERGENCE_OFFSET_M = 0.25;
|
|
21
|
+
// A collider only "belongs to" a visual it actually touches — per-axis gap beyond this and the
|
|
22
|
+
// pair is not a proxy relationship (obby's kill-plane band vs the pit floor 1.5 m below it).
|
|
23
|
+
const MATCH_GAP_M = 0.1;
|
|
24
|
+
const HALF_EXTENT_SLIP_RATIO = 2;
|
|
25
|
+
const RATIO_EPS = 0.06;
|
|
26
|
+
const ORPHAN_VISUAL_MIN_VOLUME_M3 = 0.5;
|
|
27
|
+
const OFF_GRID_MIN_SIBLINGS = 3;
|
|
28
|
+
const OFF_GRID_SHARE = 0.8;
|
|
29
|
+
const OFF_GRID_TOLERANCE_DEG = 1.0;
|
|
30
|
+
const GRIDS_DEG = [90, 45, 30, 15];
|
|
31
|
+
const OUT_OF_BOUNDS_FACTOR = 5;
|
|
32
|
+
const OUT_OF_BOUNDS_MIN_M = 50;
|
|
33
|
+
const DEGENERATE_SCALE = 1e-4;
|
|
34
|
+
const r2 = (n) => Math.round(n * 100) / 100;
|
|
35
|
+
function rotateByQuat(v, q) {
|
|
36
|
+
// v' = v + 2q×(q×v + wv) — standard quaternion-vector rotation without a matrix.
|
|
37
|
+
const tx = 2 * (q.y * v.z - q.z * v.y);
|
|
38
|
+
const ty = 2 * (q.z * v.x - q.x * v.z);
|
|
39
|
+
const tz = 2 * (q.x * v.y - q.y * v.x);
|
|
40
|
+
return {
|
|
41
|
+
x: v.x + q.w * tx + (q.y * tz - q.z * ty),
|
|
42
|
+
y: v.y + q.w * ty + (q.z * tx - q.x * tz),
|
|
43
|
+
z: v.z + q.w * tz + (q.x * ty - q.y * tx),
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
// AABB of a rotated box/ball/capsule collider. Trimeshes have no extents in the snapshot and
|
|
47
|
+
// return null — they are exempt from extent-based matching.
|
|
48
|
+
function colliderAabb(c) {
|
|
49
|
+
let half = null;
|
|
50
|
+
if (c.halfExtents)
|
|
51
|
+
half = c.halfExtents;
|
|
52
|
+
else if (typeof c.radius === 'number' && typeof c.halfHeight === 'number')
|
|
53
|
+
half = { x: c.radius, y: c.halfHeight + c.radius, z: c.radius };
|
|
54
|
+
else if (typeof c.radius === 'number')
|
|
55
|
+
half = { x: c.radius, y: c.radius, z: c.radius };
|
|
56
|
+
if (!half)
|
|
57
|
+
return null;
|
|
58
|
+
const min = { x: Infinity, y: Infinity, z: Infinity };
|
|
59
|
+
const max = { x: -Infinity, y: -Infinity, z: -Infinity };
|
|
60
|
+
for (const sx of [-1, 1]) {
|
|
61
|
+
for (const sy of [-1, 1]) {
|
|
62
|
+
for (const sz of [-1, 1]) {
|
|
63
|
+
const corner = rotateByQuat({ x: half.x * sx, y: half.y * sy, z: half.z * sz }, c.rotation);
|
|
64
|
+
const wx = c.position.x + corner.x;
|
|
65
|
+
const wy = c.position.y + corner.y;
|
|
66
|
+
const wz = c.position.z + corner.z;
|
|
67
|
+
if (wx < min.x)
|
|
68
|
+
min.x = wx;
|
|
69
|
+
if (wy < min.y)
|
|
70
|
+
min.y = wy;
|
|
71
|
+
if (wz < min.z)
|
|
72
|
+
min.z = wz;
|
|
73
|
+
if (wx > max.x)
|
|
74
|
+
max.x = wx;
|
|
75
|
+
if (wy > max.y)
|
|
76
|
+
max.y = wy;
|
|
77
|
+
if (wz > max.z)
|
|
78
|
+
max.z = wz;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return { min, max };
|
|
83
|
+
}
|
|
84
|
+
const size = (b) => ({ x: b.max.x - b.min.x, y: b.max.y - b.min.y, z: b.max.z - b.min.z });
|
|
85
|
+
const center = (b) => ({
|
|
86
|
+
x: (b.min.x + b.max.x) / 2,
|
|
87
|
+
y: (b.min.y + b.max.y) / 2,
|
|
88
|
+
z: (b.min.z + b.max.z) / 2,
|
|
89
|
+
});
|
|
90
|
+
const volume = (b) => {
|
|
91
|
+
const s = size(b);
|
|
92
|
+
return s.x * s.y * s.z;
|
|
93
|
+
};
|
|
94
|
+
const xzOverlaps = (a, b) => a.min.x < b.max.x && a.max.x > b.min.x && a.min.z < b.max.z && a.max.z > b.min.z;
|
|
95
|
+
const contains = (outer, inner) => outer.min.x <= inner.min.x &&
|
|
96
|
+
outer.min.y <= inner.min.y &&
|
|
97
|
+
outer.min.z <= inner.min.z &&
|
|
98
|
+
outer.max.x >= inner.max.x &&
|
|
99
|
+
outer.max.y >= inner.max.y &&
|
|
100
|
+
outer.max.z >= inner.max.z;
|
|
101
|
+
/** Yaw about +Y in degrees, [0, 360). */
|
|
102
|
+
function yawDeg(q) {
|
|
103
|
+
const deg = (Math.atan2(2 * (q.w * q.y + q.x * q.z), 1 - 2 * (q.y * q.y + q.z * q.z)) * 180) / Math.PI;
|
|
104
|
+
return ((deg % 360) + 360) % 360;
|
|
105
|
+
}
|
|
106
|
+
// The character system's own model (humanoid-character names its LOD group "character-lod"): its
|
|
107
|
+
// internal anatomy — co-located LOD levels, body/face overlap — is not world layout. Excluded
|
|
108
|
+
// from placement rules; still in the roster and still checked for degenerate transforms.
|
|
109
|
+
const isCharacterSubtree = (path) => path.split('/').includes('character-lod');
|
|
110
|
+
exports.isCharacterSubtree = isCharacterSubtree;
|
|
111
|
+
// Lines and point clouds are debug/FX helpers (path viz, grids), not renderable surfaces — they
|
|
112
|
+
// neither rest, support, nor collide, and toggling them off is normal.
|
|
113
|
+
const isHelperType = (type) => /^(Line|Points)/.test(type);
|
|
114
|
+
exports.isHelperType = isHelperType;
|
|
115
|
+
const parentOf = (path) => (path.includes('/') ? path.slice(0, path.lastIndexOf('/')) : '');
|
|
116
|
+
// Two siblings inside a non-root group are parts of one authored composite (a turret stacked from
|
|
117
|
+
// primitives); their mutual overlap is construction, not layout. Root-level siblings ARE layout.
|
|
118
|
+
const isCompositePair = (pathA, pathB) => {
|
|
119
|
+
const parent = parentOf(pathA);
|
|
120
|
+
return parent !== '' && parent === parentOf(pathB);
|
|
121
|
+
};
|
|
122
|
+
const dot = (a, b) => a.x * b.x + a.y * b.y + a.z * b.z;
|
|
123
|
+
function obbOf(obj) {
|
|
124
|
+
if (!obj.obb)
|
|
125
|
+
return null;
|
|
126
|
+
const q = obj.rotation;
|
|
127
|
+
return {
|
|
128
|
+
center: obj.obb.center,
|
|
129
|
+
half: obj.obb.half,
|
|
130
|
+
axes: [rotateByQuat({ x: 1, y: 0, z: 0 }, q), rotateByQuat({ x: 0, y: 1, z: 0 }, q), rotateByQuat({ x: 0, y: 0, z: 1 }, q)],
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
// Separating-axis penetration for two OBBs: the min overlap across the 15 candidate axes, or
|
|
134
|
+
// null when any axis separates them. Face axes alone miss edge-edge contact; the 9 cross
|
|
135
|
+
// products cover it.
|
|
136
|
+
function obbPenetration(a, b) {
|
|
137
|
+
const axes = [...a.axes, ...b.axes];
|
|
138
|
+
for (const u of a.axes) {
|
|
139
|
+
for (const v of b.axes) {
|
|
140
|
+
const c = { x: u.y * v.z - u.z * v.y, y: u.z * v.x - u.x * v.z, z: u.x * v.y - u.y * v.x };
|
|
141
|
+
const len = Math.hypot(c.x, c.y, c.z);
|
|
142
|
+
if (len > 1e-6)
|
|
143
|
+
axes.push({ x: c.x / len, y: c.y / len, z: c.z / len });
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
const d = { x: b.center.x - a.center.x, y: b.center.y - a.center.y, z: b.center.z - a.center.z };
|
|
147
|
+
let minOverlap = Infinity;
|
|
148
|
+
for (const axis of axes) {
|
|
149
|
+
const ra = a.half.x * Math.abs(dot(axis, a.axes[0])) + a.half.y * Math.abs(dot(axis, a.axes[1])) + a.half.z * Math.abs(dot(axis, a.axes[2]));
|
|
150
|
+
const rb = b.half.x * Math.abs(dot(axis, b.axes[0])) + b.half.y * Math.abs(dot(axis, b.axes[1])) + b.half.z * Math.abs(dot(axis, b.axes[2]));
|
|
151
|
+
const overlap = ra + rb - Math.abs(dot(d, axis));
|
|
152
|
+
if (overlap <= 0)
|
|
153
|
+
return null;
|
|
154
|
+
if (overlap < minOverlap)
|
|
155
|
+
minOverlap = overlap;
|
|
156
|
+
}
|
|
157
|
+
return minOverlap;
|
|
158
|
+
}
|
|
159
|
+
function supportRules(items, colliders, findings) {
|
|
160
|
+
// Invisible meshes (LOD levels, toggled variants) neither rest on anything nor support
|
|
161
|
+
// anything visually — both sides of the rule consider visible geometry only. Colliders
|
|
162
|
+
// always count: an invisible floor collider is a legitimate support.
|
|
163
|
+
const visibleItems = items.filter((i) => i.obj.visible);
|
|
164
|
+
const surfaces = [
|
|
165
|
+
...visibleItems.map((i) => ({ top: i.aabb.max.y, span: i.aabb.max.y - i.aabb.min.y, label: i.obj.path, aabb: i.aabb })),
|
|
166
|
+
...colliders
|
|
167
|
+
.map((c, index) => ({ index, aabb: colliderAabb(c) }))
|
|
168
|
+
.filter((x) => x.aabb !== null)
|
|
169
|
+
.map(({ index, aabb }) => ({ top: aabb.max.y, span: aabb.max.y - aabb.min.y, label: `collider[${index}]`, aabb })),
|
|
170
|
+
];
|
|
171
|
+
if (visibleItems.length === 0)
|
|
172
|
+
return;
|
|
173
|
+
const floorY = Math.min(...visibleItems.map((i) => i.aabb.min.y));
|
|
174
|
+
for (const item of visibleItems) {
|
|
175
|
+
const { aabb, obj } = item;
|
|
176
|
+
if (aabb.min.y <= floorY + FLOOR_EPSILON_M)
|
|
177
|
+
continue; // this IS (part of) the scene floor
|
|
178
|
+
// Support = the highest XZ-overlapping surface whose top sits at or below the object's top;
|
|
179
|
+
// walls beside the footprint don't overlap in XZ, ceilings above are excluded by the top test.
|
|
180
|
+
let support = null;
|
|
181
|
+
for (const s of surfaces) {
|
|
182
|
+
if (s.label === obj.path)
|
|
183
|
+
continue;
|
|
184
|
+
if (s.top > aabb.max.y)
|
|
185
|
+
continue;
|
|
186
|
+
if (!xzOverlaps(aabb, s.aabb))
|
|
187
|
+
continue;
|
|
188
|
+
if (!support || s.top > support.top)
|
|
189
|
+
support = s;
|
|
190
|
+
}
|
|
191
|
+
if (!support) {
|
|
192
|
+
const gap = aabb.min.y - floorY;
|
|
193
|
+
if (gap > exports.STEP_HEIGHT_M) {
|
|
194
|
+
findings.push({
|
|
195
|
+
rule: 'floating',
|
|
196
|
+
severity: 'warn',
|
|
197
|
+
path: obj.path,
|
|
198
|
+
detail: `floating ${r2(gap)} m above the scene floor (no surface beneath its footprint)`,
|
|
199
|
+
measured: { gapM: r2(gap) },
|
|
200
|
+
method: 'AABB min.y vs the lowest AABB in the scene; no XZ-overlapping support found',
|
|
201
|
+
confidence: 'medium',
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
continue;
|
|
205
|
+
}
|
|
206
|
+
const gap = aabb.min.y - support.top;
|
|
207
|
+
const confidence = support.span > TALL_SUPPORT_M ? 'low' : 'medium';
|
|
208
|
+
const slopeCaveat = support.span > TALL_SUPPORT_M ? ' (support is tall — a ramp/terrain AABB top is its peak, so this may misread)' : '';
|
|
209
|
+
if (gap > exports.STEP_HEIGHT_M) {
|
|
210
|
+
findings.push({
|
|
211
|
+
rule: 'floating',
|
|
212
|
+
severity: 'warn',
|
|
213
|
+
path: obj.path,
|
|
214
|
+
detail: `floating ${r2(gap)} m above ${support.label}${slopeCaveat}`,
|
|
215
|
+
measured: { gapM: r2(gap) },
|
|
216
|
+
method: `AABB min.y vs support AABB top; threshold = step height ${exports.STEP_HEIGHT_M} m`,
|
|
217
|
+
confidence,
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
else if (gap < -SINK_TOLERANCE_M) {
|
|
221
|
+
// Near-full burial is not "sunk a bit into its floor": either the surface is the object's
|
|
222
|
+
// own co-located collision proxy, or the overlap is intersecting's domain.
|
|
223
|
+
const height = aabb.max.y - aabb.min.y;
|
|
224
|
+
if (-gap >= height * 0.95)
|
|
225
|
+
continue;
|
|
226
|
+
const composite = !support.label.startsWith('collider[') && isCompositePair(obj.path, support.label);
|
|
227
|
+
findings.push({
|
|
228
|
+
rule: 'sunk',
|
|
229
|
+
severity: composite ? 'info' : 'warn',
|
|
230
|
+
path: obj.path,
|
|
231
|
+
detail: `sunk ${r2(-gap)} m into ${support.label}${slopeCaveat}${composite ? ' (composite model internals)' : ''}`,
|
|
232
|
+
measured: { penetrationM: r2(-gap) },
|
|
233
|
+
method: `AABB min.y below support AABB top; tolerance ${SINK_TOLERANCE_M} m`,
|
|
234
|
+
confidence,
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
function intersectionRule(items, findings) {
|
|
240
|
+
// Sweep-prune on x so big rosters stay tractable; invisible objects don't visually intersect.
|
|
241
|
+
const visible = items.filter((i) => i.obj.visible).sort((a, b) => a.aabb.min.x - b.aabb.min.x);
|
|
242
|
+
for (let i = 0; i < visible.length; i++) {
|
|
243
|
+
const a = visible[i];
|
|
244
|
+
for (let j = i + 1; j < visible.length; j++) {
|
|
245
|
+
const b = visible[j];
|
|
246
|
+
if (b.aabb.min.x > a.aabb.max.x - INTERSECT_TOLERANCE_M)
|
|
247
|
+
break;
|
|
248
|
+
const dx = Math.min(a.aabb.max.x, b.aabb.max.x) - Math.max(a.aabb.min.x, b.aabb.min.x);
|
|
249
|
+
const dy = Math.min(a.aabb.max.y, b.aabb.max.y) - Math.max(a.aabb.min.y, b.aabb.min.y);
|
|
250
|
+
const dz = Math.min(a.aabb.max.z, b.aabb.max.z) - Math.max(a.aabb.min.z, b.aabb.min.z);
|
|
251
|
+
if (dx <= INTERSECT_TOLERANCE_M || dy <= INTERSECT_TOLERANCE_M || dz <= INTERSECT_TOLERANCE_M)
|
|
252
|
+
continue;
|
|
253
|
+
// Full containment is normal scene structure (a room shell contains its furniture) — skip.
|
|
254
|
+
if (contains(a.aabb, b.aabb) || contains(b.aabb, a.aabb))
|
|
255
|
+
continue;
|
|
256
|
+
// The AABB of rotated geometry is fat — where oriented boxes exist, the separating-axis
|
|
257
|
+
// test decides, so diagonal skirts/ramps stop flagging against everything beside them.
|
|
258
|
+
const obbA = obbOf(a.obj);
|
|
259
|
+
const obbB = obbOf(b.obj);
|
|
260
|
+
const composite = isCompositePair(a.obj.path, b.obj.path);
|
|
261
|
+
if (obbA && obbB) {
|
|
262
|
+
const penetration = obbPenetration(obbA, obbB);
|
|
263
|
+
if (penetration === null || penetration <= INTERSECT_TOLERANCE_M)
|
|
264
|
+
continue;
|
|
265
|
+
findings.push({
|
|
266
|
+
rule: 'intersecting',
|
|
267
|
+
severity: composite ? 'info' : 'warn',
|
|
268
|
+
path: a.obj.path,
|
|
269
|
+
detail: `overlaps ${b.obj.path} — ${r2(penetration)} m deep at the tightest axis${composite ? ' (composite model internals)' : ''}`,
|
|
270
|
+
measured: { penetrationM: r2(penetration) },
|
|
271
|
+
method: 'oriented-box separating-axis test (bounding boxes; non-box shapes still over-approximate)',
|
|
272
|
+
confidence: 'medium',
|
|
273
|
+
});
|
|
274
|
+
continue;
|
|
275
|
+
}
|
|
276
|
+
findings.push({
|
|
277
|
+
rule: 'intersecting',
|
|
278
|
+
severity: composite ? 'info' : 'warn',
|
|
279
|
+
path: a.obj.path,
|
|
280
|
+
detail: `overlaps ${b.obj.path} by ${r2(dx)}×${r2(dy)}×${r2(dz)} m${composite ? ' (composite model internals)' : ''}`,
|
|
281
|
+
measured: { dxM: r2(dx), dyM: r2(dy), dzM: r2(dz) },
|
|
282
|
+
method: 'pairwise AABB overlap on all 3 axes — AABB-only, non-box shapes false-positive in corners',
|
|
283
|
+
confidence: 'medium',
|
|
284
|
+
});
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
function colliderRules(items, colliders, findings) {
|
|
289
|
+
// Rapier handles are opaque f64 bit-packs (they print as denormals like 5e-324) — label
|
|
290
|
+
// colliders by roster ordinal everywhere a human reads them; the handle stays in the JSON.
|
|
291
|
+
const matchable = colliders
|
|
292
|
+
.map((c, index) => ({ c, index, aabb: colliderAabb(c) }))
|
|
293
|
+
.filter((x) => x.aabb !== null);
|
|
294
|
+
const matchedVisuals = new Set();
|
|
295
|
+
for (const { c, index, aabb } of matchable) {
|
|
296
|
+
const cCenter = center(aabb);
|
|
297
|
+
const cSize = size(aabb);
|
|
298
|
+
const cDiag = Math.hypot(cSize.x, cSize.y, cSize.z) / 2;
|
|
299
|
+
let best = null;
|
|
300
|
+
for (const item of items) {
|
|
301
|
+
// A proxy collider touches its visual: per-axis gap beyond MATCH_GAP_M disqualifies the
|
|
302
|
+
// pair even when centers are near (a kill-band plane hovering over a pit floor is not a proxy).
|
|
303
|
+
const gapX = Math.max(item.aabb.min.x - aabb.max.x, aabb.min.x - item.aabb.max.x, 0);
|
|
304
|
+
const gapY = Math.max(item.aabb.min.y - aabb.max.y, aabb.min.y - item.aabb.max.y, 0);
|
|
305
|
+
const gapZ = Math.max(item.aabb.min.z - aabb.max.z, aabb.min.z - item.aabb.max.z, 0);
|
|
306
|
+
if (gapX > MATCH_GAP_M || gapY > MATCH_GAP_M || gapZ > MATCH_GAP_M)
|
|
307
|
+
continue;
|
|
308
|
+
const vCenter = center(item.aabb);
|
|
309
|
+
const vSize = size(item.aabb);
|
|
310
|
+
const dist = Math.hypot(vCenter.x - cCenter.x, vCenter.y - cCenter.y, vCenter.z - cCenter.z);
|
|
311
|
+
if (dist > cDiag + Math.hypot(vSize.x, vSize.y, vSize.z) / 2)
|
|
312
|
+
continue;
|
|
313
|
+
if (!best || dist < best.dist)
|
|
314
|
+
best = { item, dist };
|
|
315
|
+
}
|
|
316
|
+
if (!best) {
|
|
317
|
+
findings.push({
|
|
318
|
+
rule: 'orphan-collider',
|
|
319
|
+
severity: 'info',
|
|
320
|
+
path: `collider[${index}]`,
|
|
321
|
+
detail: `${c.shape} collider at (${r2(c.position.x)}, ${r2(c.position.y)}, ${r2(c.position.z)}) matches no visual — invisible wall, or a visual that was moved without its collider`,
|
|
322
|
+
method: 'no visual AABB within combined half-diagonal reach',
|
|
323
|
+
confidence: 'medium',
|
|
324
|
+
});
|
|
325
|
+
continue;
|
|
326
|
+
}
|
|
327
|
+
matchedVisuals.add(best.item.obj.path);
|
|
328
|
+
const vSize = size(best.item.aabb);
|
|
329
|
+
const ratios = [cSize.x / vSize.x, cSize.y / vSize.y, cSize.z / vSize.z].map((r) => Number.isFinite(r) ? r : 1);
|
|
330
|
+
const isSlip = ratios.every((r) => Math.abs(r - HALF_EXTENT_SLIP_RATIO) <= RATIO_EPS * HALF_EXTENT_SLIP_RATIO);
|
|
331
|
+
if (isSlip) {
|
|
332
|
+
findings.push({
|
|
333
|
+
rule: 'collider-divergence',
|
|
334
|
+
severity: 'error',
|
|
335
|
+
path: best.item.obj.path,
|
|
336
|
+
detail: `collider[${index}] is exactly 2× this visual on every axis — half-extent/full-size slip (full sizes passed where half-extents belong)`,
|
|
337
|
+
measured: { rx: r2(ratios[0]), ry: r2(ratios[1]), rz: r2(ratios[2]) },
|
|
338
|
+
method: 'collider/visual AABB extent ratio ≈ 2 on all axes',
|
|
339
|
+
confidence: 'high',
|
|
340
|
+
});
|
|
341
|
+
continue;
|
|
342
|
+
}
|
|
343
|
+
const maxRatio = Math.max(...ratios.map((r) => Math.max(r, 1 / r)));
|
|
344
|
+
// A center offset explained by extent asymmetry is normal authoring: a thick floor collider
|
|
345
|
+
// under a zero-thickness ground plane is surface-aligned, not misplaced — so each axis gets
|
|
346
|
+
// an allowance of half the extent difference before its offset counts as divergence.
|
|
347
|
+
const vCenter = center(best.item.aabb);
|
|
348
|
+
const vSize2 = size(best.item.aabb);
|
|
349
|
+
const offsets = [
|
|
350
|
+
{ axis: 'x', off: Math.abs(cCenter.x - vCenter.x), allow: Math.abs(cSize.x - vSize2.x) / 2 },
|
|
351
|
+
{ axis: 'y', off: Math.abs(cCenter.y - vCenter.y), allow: Math.abs(cSize.y - vSize2.y) / 2 },
|
|
352
|
+
{ axis: 'z', off: Math.abs(cCenter.z - vCenter.z), allow: Math.abs(cSize.z - vSize2.z) / 2 },
|
|
353
|
+
];
|
|
354
|
+
const worstOffset = offsets.find((o) => o.off > Math.max(DIVERGENCE_OFFSET_M, o.allow + 0.05));
|
|
355
|
+
if (maxRatio > DIVERGENCE_RATIO || worstOffset) {
|
|
356
|
+
findings.push({
|
|
357
|
+
rule: 'collider-divergence',
|
|
358
|
+
severity: 'warn',
|
|
359
|
+
path: best.item.obj.path,
|
|
360
|
+
detail: `collider[${index}] diverges from this visual: extent ratio up to ${r2(maxRatio)}${worstOffset ? `, ${worstOffset.axis}-centers ${r2(worstOffset.off)} m apart` : ''}`,
|
|
361
|
+
measured: { maxRatio: r2(maxRatio), centerOffsetM: r2(best.dist) },
|
|
362
|
+
method: 'nearest-touching collider↔visual AABB comparison; offsets explained by extent asymmetry are allowed',
|
|
363
|
+
confidence: 'medium',
|
|
364
|
+
});
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
if (matchable.length > 0) {
|
|
368
|
+
for (const item of items) {
|
|
369
|
+
if (matchedVisuals.has(item.obj.path) || !item.obj.visible)
|
|
370
|
+
continue;
|
|
371
|
+
if (volume(item.aabb) < ORPHAN_VISUAL_MIN_VOLUME_M3)
|
|
372
|
+
continue;
|
|
373
|
+
findings.push({
|
|
374
|
+
rule: 'orphan-visual',
|
|
375
|
+
severity: 'info',
|
|
376
|
+
path: item.obj.path,
|
|
377
|
+
detail: 'sizeable visual with no collider near it — walk-through scenery, or a collider that was never added',
|
|
378
|
+
method: `no collider AABB matched; only visuals over ${ORPHAN_VISUAL_MIN_VOLUME_M3} m³ reported`,
|
|
379
|
+
confidence: 'low',
|
|
380
|
+
});
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
function transformRules(objects, findings) {
|
|
385
|
+
for (const obj of objects) {
|
|
386
|
+
if (obj.nonFinite) {
|
|
387
|
+
findings.push({
|
|
388
|
+
rule: 'degenerate',
|
|
389
|
+
severity: 'error',
|
|
390
|
+
path: obj.path,
|
|
391
|
+
detail: 'transform contains NaN/Infinity',
|
|
392
|
+
method: 'nonFinite flag from the in-page snapshot (JSON nulls the raw values in transit)',
|
|
393
|
+
confidence: 'high',
|
|
394
|
+
});
|
|
395
|
+
continue;
|
|
396
|
+
}
|
|
397
|
+
const s = obj.scale;
|
|
398
|
+
if ([s.x, s.y, s.z].some((c) => Math.abs(c) < DEGENERATE_SCALE)) {
|
|
399
|
+
findings.push({
|
|
400
|
+
rule: 'degenerate',
|
|
401
|
+
severity: 'error',
|
|
402
|
+
path: obj.path,
|
|
403
|
+
detail: `scale ≈ 0 (${s.x}, ${s.y}, ${s.z}) — the object renders as nothing`,
|
|
404
|
+
measured: { sx: s.x, sy: s.y, sz: s.z },
|
|
405
|
+
method: 'decomposed world scale below 1e-4',
|
|
406
|
+
confidence: 'high',
|
|
407
|
+
});
|
|
408
|
+
}
|
|
409
|
+
else if (s.x < 0 || s.y < 0 || s.z < 0) {
|
|
410
|
+
findings.push({
|
|
411
|
+
rule: 'mirrored',
|
|
412
|
+
severity: 'warn',
|
|
413
|
+
path: obj.path,
|
|
414
|
+
detail: `negative scale (${s.x}, ${s.y}, ${s.z}) — the mesh is mirrored, normals may face inward`,
|
|
415
|
+
measured: { sx: s.x, sy: s.y, sz: s.z },
|
|
416
|
+
method: 'negative matrix determinant carried on the decomposed scale',
|
|
417
|
+
confidence: 'high',
|
|
418
|
+
});
|
|
419
|
+
}
|
|
420
|
+
// LOD levels and toggled variants inside the character subtree are invisible by design,
|
|
421
|
+
// and toggling debug helpers (Line/Points) off is normal.
|
|
422
|
+
if (!obj.visible && !(0, exports.isCharacterSubtree)(obj.path) && !(0, exports.isHelperType)(obj.type)) {
|
|
423
|
+
findings.push({
|
|
424
|
+
rule: 'invisible',
|
|
425
|
+
severity: 'info',
|
|
426
|
+
path: obj.path,
|
|
427
|
+
detail: 'effectively invisible (visible:false on itself or an ancestor)',
|
|
428
|
+
method: 'visibility folded down the ancestor chain',
|
|
429
|
+
confidence: 'high',
|
|
430
|
+
});
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
function offGridRule(objects, findings) {
|
|
435
|
+
const groups = new Map();
|
|
436
|
+
for (const obj of objects) {
|
|
437
|
+
const parent = obj.path.includes('/') ? obj.path.slice(0, obj.path.lastIndexOf('/')) : '';
|
|
438
|
+
const list = groups.get(parent) ?? [];
|
|
439
|
+
list.push(obj);
|
|
440
|
+
groups.set(parent, list);
|
|
441
|
+
}
|
|
442
|
+
for (const [parent, siblings] of groups) {
|
|
443
|
+
if (siblings.length < OFF_GRID_MIN_SIBLINGS)
|
|
444
|
+
continue;
|
|
445
|
+
const yaws = siblings.map((s) => yawDeg(s.rotation));
|
|
446
|
+
// Coarsest grid the majority agrees on wins; a finer grid is a superset and adds no signal.
|
|
447
|
+
for (const grid of GRIDS_DEG) {
|
|
448
|
+
const onGrid = yaws.map((y) => {
|
|
449
|
+
const mod = y % grid;
|
|
450
|
+
return Math.min(mod, grid - mod) <= OFF_GRID_TOLERANCE_DEG;
|
|
451
|
+
});
|
|
452
|
+
const share = onGrid.filter(Boolean).length / siblings.length;
|
|
453
|
+
if (share < OFF_GRID_SHARE || onGrid.every(Boolean))
|
|
454
|
+
continue;
|
|
455
|
+
siblings.forEach((obj, i) => {
|
|
456
|
+
if (onGrid[i])
|
|
457
|
+
return;
|
|
458
|
+
const yaw = yaws[i];
|
|
459
|
+
findings.push({
|
|
460
|
+
rule: 'off-grid',
|
|
461
|
+
severity: 'warn',
|
|
462
|
+
path: obj.path,
|
|
463
|
+
detail: `yaw ${r2(yaw)}° while ${Math.round(share * 100)}% of its siblings${parent ? ` under ${parent}` : ''} sit on a ${grid}° grid`,
|
|
464
|
+
measured: { yawDeg: r2(yaw), gridDeg: grid },
|
|
465
|
+
method: 'yaw vs the modal sibling grid; fires only when siblings agree on a grid',
|
|
466
|
+
confidence: 'medium',
|
|
467
|
+
});
|
|
468
|
+
});
|
|
469
|
+
break;
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
function outOfBoundsRule(items, findings) {
|
|
474
|
+
if (items.length < 3)
|
|
475
|
+
return;
|
|
476
|
+
const centers = items.map((i) => center(i.aabb));
|
|
477
|
+
const median = (values) => {
|
|
478
|
+
const sorted = [...values].sort((a, b) => a - b);
|
|
479
|
+
return sorted[Math.floor(sorted.length / 2)];
|
|
480
|
+
};
|
|
481
|
+
const mid = { x: median(centers.map((c) => c.x)), y: median(centers.map((c) => c.y)), z: median(centers.map((c) => c.z)) };
|
|
482
|
+
const dists = centers.map((c) => Math.hypot(c.x - mid.x, c.y - mid.y, c.z - mid.z)).sort((a, b) => a - b);
|
|
483
|
+
// floor((n-1)·0.9) keeps the top decile — including the max itself — OUT of the bulk radius,
|
|
484
|
+
// otherwise a single 1e6 stray inflates the radius and can never be flagged.
|
|
485
|
+
const bulkRadius = dists[Math.floor((dists.length - 1) * 0.9)];
|
|
486
|
+
const threshold = Math.max(OUT_OF_BOUNDS_FACTOR * bulkRadius, OUT_OF_BOUNDS_MIN_M);
|
|
487
|
+
items.forEach((item, i) => {
|
|
488
|
+
const d = Math.hypot(centers[i].x - mid.x, centers[i].y - mid.y, centers[i].z - mid.z);
|
|
489
|
+
if (d <= threshold)
|
|
490
|
+
return;
|
|
491
|
+
findings.push({
|
|
492
|
+
rule: 'out-of-bounds',
|
|
493
|
+
severity: 'error',
|
|
494
|
+
path: item.obj.path,
|
|
495
|
+
detail: `${r2(d)} m from the bulk of the scene (bulk radius ${r2(bulkRadius)} m) — stray coordinate?`,
|
|
496
|
+
measured: { distanceM: r2(d), bulkRadiusM: r2(bulkRadius) },
|
|
497
|
+
method: `center beyond max(${OUT_OF_BOUNDS_FACTOR}× the 90th-percentile bulk radius, ${OUT_OF_BOUNDS_MIN_M} m) from the median center`,
|
|
498
|
+
confidence: 'high',
|
|
499
|
+
});
|
|
500
|
+
});
|
|
501
|
+
}
|
|
502
|
+
const SEVERITY_ORDER = { error: 0, warn: 1, info: 2 };
|
|
503
|
+
function analyzeWorld(snapshot) {
|
|
504
|
+
const findings = [];
|
|
505
|
+
const notes = [];
|
|
506
|
+
if (snapshot.truncated) {
|
|
507
|
+
notes.push(`roster truncated: ${snapshot.truncated.emitted} of ${snapshot.truncated.total} objects in the payload — findings only cover what was emitted`);
|
|
508
|
+
}
|
|
509
|
+
if (snapshot.sources.colliders === 'unsupported') {
|
|
510
|
+
notes.push("collider checks skipped — this world's humanoid-character predates describeColliders (< 0.2.13)");
|
|
511
|
+
}
|
|
512
|
+
else if (snapshot.sources.colliders === 'absent') {
|
|
513
|
+
notes.push('collider checks skipped — the world passed no body to world.ready()');
|
|
514
|
+
}
|
|
515
|
+
const characterCount = snapshot.objects.filter((o) => (0, exports.isCharacterSubtree)(o.path)).length;
|
|
516
|
+
if (characterCount > 0) {
|
|
517
|
+
notes.push(`character subtree excluded from placement rules (${characterCount} objects under */character-lod/*)`);
|
|
518
|
+
}
|
|
519
|
+
const layoutObjects = snapshot.objects.filter((o) => !(0, exports.isCharacterSubtree)(o.path) && !(0, exports.isHelperType)(o.type));
|
|
520
|
+
const items = layoutObjects
|
|
521
|
+
.filter((o) => o.aabb !== null && !o.nonFinite)
|
|
522
|
+
.map((o) => ({ obj: o, aabb: o.aabb }));
|
|
523
|
+
const colliders = snapshot.sources.colliders === 'ok' ? snapshot.colliders : [];
|
|
524
|
+
transformRules(snapshot.objects, findings);
|
|
525
|
+
supportRules(items, colliders, findings);
|
|
526
|
+
intersectionRule(items, findings);
|
|
527
|
+
if (snapshot.sources.colliders === 'ok')
|
|
528
|
+
colliderRules(items, colliders, findings);
|
|
529
|
+
offGridRule(layoutObjects, findings);
|
|
530
|
+
outOfBoundsRule(items, findings);
|
|
531
|
+
collapseUniformOverlaps(findings);
|
|
532
|
+
sortFindings(findings);
|
|
533
|
+
return { findings, notes };
|
|
534
|
+
}
|
|
535
|
+
// Exported so callers merging extra findings (the zone checks) can restore the canonical order.
|
|
536
|
+
function sortFindings(findings) {
|
|
537
|
+
return findings.sort((a, b) => SEVERITY_ORDER[a.severity] - SEVERITY_ORDER[b.severity] ||
|
|
538
|
+
a.rule.localeCompare(b.rule) ||
|
|
539
|
+
a.path.localeCompare(b.path));
|
|
540
|
+
}
|
|
541
|
+
// Equal-depth overlaps in bulk are the signature of corner joints and repeated trim — walls
|
|
542
|
+
// deliberately overlapping at their ends share one thickness, so their depths match. Three or
|
|
543
|
+
// more warn-level overlaps within a 0.02 m bucket collapse to a single info summary; a lone odd
|
|
544
|
+
// overlap keeps its warn.
|
|
545
|
+
function collapseUniformOverlaps(findings) {
|
|
546
|
+
const buckets = new Map();
|
|
547
|
+
for (const f of findings) {
|
|
548
|
+
if (f.rule !== 'intersecting' || f.severity !== 'warn' || f.measured?.penetrationM === undefined)
|
|
549
|
+
continue;
|
|
550
|
+
const bucket = Math.round(f.measured.penetrationM / 0.02);
|
|
551
|
+
const list = buckets.get(bucket) ?? [];
|
|
552
|
+
list.push(f);
|
|
553
|
+
buckets.set(bucket, list);
|
|
554
|
+
}
|
|
555
|
+
for (const group of buckets.values()) {
|
|
556
|
+
if (group.length < 3)
|
|
557
|
+
continue;
|
|
558
|
+
const depth = group[0].measured.penetrationM ?? 0;
|
|
559
|
+
const paths = new Set(group.flatMap((f) => [f.path]));
|
|
560
|
+
for (const f of group)
|
|
561
|
+
findings.splice(findings.indexOf(f), 1);
|
|
562
|
+
findings.push({
|
|
563
|
+
rule: 'intersecting',
|
|
564
|
+
severity: 'info',
|
|
565
|
+
path: group[0].path,
|
|
566
|
+
detail: `${group.length} overlaps of uniform ~${depth} m depth across the scene (e.g. ${[...paths].slice(0, 3).join(', ')}) — equal depths read as corner joints / repeated trim, likely intentional`,
|
|
567
|
+
measured: { pairs: group.length, penetrationM: depth },
|
|
568
|
+
method: 'uniform-depth grouping of separating-axis overlaps',
|
|
569
|
+
confidence: 'low',
|
|
570
|
+
});
|
|
571
|
+
}
|
|
572
|
+
}
|
|
573
|
+
//# sourceMappingURL=analyze.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyze.js","sourceRoot":"","sources":["../../src/world/analyze.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { Vec3, WorldSnapshot } from './snapshotTypes';
|
|
2
|
+
import { type Finding } from './analyze';
|
|
3
|
+
export interface MovedObject {
|
|
4
|
+
path: string;
|
|
5
|
+
from: Vec3;
|
|
6
|
+
to: Vec3;
|
|
7
|
+
delta: Vec3;
|
|
8
|
+
distance: number;
|
|
9
|
+
}
|
|
10
|
+
export interface WorldDiff {
|
|
11
|
+
added: string[];
|
|
12
|
+
removed: string[];
|
|
13
|
+
moved: MovedObject[];
|
|
14
|
+
findingsAppeared: Finding[];
|
|
15
|
+
findingsCleared: Finding[];
|
|
16
|
+
}
|
|
17
|
+
export declare function diffWorldSnapshots(before: WorldSnapshot, after: WorldSnapshot): WorldDiff;
|
|
18
|
+
export declare function formatWorldDiff(diff: WorldDiff): string;
|