@aura3d/cli 4.1.3 → 4.3.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.
Files changed (68) hide show
  1. package/dist/cli-help.d.ts.map +1 -1
  2. package/dist/cli-help.js +4 -2
  3. package/dist/cli-help.js.map +1 -1
  4. package/dist/cli.d.ts.map +1 -1
  5. package/dist/cli.js +129 -19
  6. package/dist/cli.js.map +1 -1
  7. package/dist/commands/assets/index.js +2 -2
  8. package/dist/commands/assets/index.js.map +1 -1
  9. package/dist/commands/meshyLedger.d.ts +125 -14
  10. package/dist/commands/meshyLedger.d.ts.map +1 -1
  11. package/dist/commands/meshyLedger.js +262 -35
  12. package/dist/commands/meshyLedger.js.map +1 -1
  13. package/dist/commands/prd13/run.js +19 -16
  14. package/dist/commands/prd13/run.js.map +1 -1
  15. package/dist/index.d.ts +8 -0
  16. package/dist/index.d.ts.map +1 -1
  17. package/dist/index.js +12 -0
  18. package/dist/index.js.map +1 -1
  19. package/dist/pull-bridge/adapters.d.ts +9 -1
  20. package/dist/pull-bridge/adapters.d.ts.map +1 -1
  21. package/dist/pull-bridge/adapters.js +30 -7
  22. package/dist/pull-bridge/adapters.js.map +1 -1
  23. package/dist/pull-bridge/search.d.ts +5 -0
  24. package/dist/pull-bridge/search.d.ts.map +1 -1
  25. package/dist/pull-bridge/search.js +7 -1
  26. package/dist/pull-bridge/search.js.map +1 -1
  27. package/dist/pull-bridge.js +1 -1
  28. package/dist/pull-bridge.js.map +1 -1
  29. package/dist/resolve-ladder.d.ts +123 -0
  30. package/dist/resolve-ladder.d.ts.map +1 -0
  31. package/dist/resolve-ladder.js +410 -0
  32. package/dist/resolve-ladder.js.map +1 -0
  33. package/dist/skin/analysis.d.ts +137 -0
  34. package/dist/skin/analysis.d.ts.map +1 -0
  35. package/dist/skin/analysis.js +382 -0
  36. package/dist/skin/analysis.js.map +1 -0
  37. package/dist/skin/command.d.ts +71 -0
  38. package/dist/skin/command.d.ts.map +1 -0
  39. package/dist/skin/command.js +186 -0
  40. package/dist/skin/command.js.map +1 -0
  41. package/dist/skin/glbEdit.d.ts +14 -0
  42. package/dist/skin/glbEdit.d.ts.map +1 -0
  43. package/dist/skin/glbEdit.js +152 -0
  44. package/dist/skin/glbEdit.js.map +1 -0
  45. package/dist/skin/gltf.d.ts +159 -0
  46. package/dist/skin/gltf.d.ts.map +1 -0
  47. package/dist/skin/gltf.js +379 -0
  48. package/dist/skin/gltf.js.map +1 -0
  49. package/dist/skin/rebuildLimbs.d.ts +31 -0
  50. package/dist/skin/rebuildLimbs.d.ts.map +1 -0
  51. package/dist/skin/rebuildLimbs.js +326 -0
  52. package/dist/skin/rebuildLimbs.js.map +1 -0
  53. package/dist/skin/repair.d.ts +41 -0
  54. package/dist/skin/repair.d.ts.map +1 -0
  55. package/dist/skin/repair.js +180 -0
  56. package/dist/skin/repair.js.map +1 -0
  57. package/package.json +5 -5
  58. package/skills/aura3d-art-direction/SKILL.md +1 -1
  59. package/skills/aura3d-assets/SKILL.md +10 -6
  60. package/skills/aura3d-browser-game/SKILL.md +2 -0
  61. package/skills/aura3d-character-animation/SKILL.md +3 -1
  62. package/skills/aura3d-core/SKILL.md +4 -4
  63. package/skills/aura3d-core/references/boundaries.md +8 -5
  64. package/skills/aura3d-evidence-review/SKILL.md +1 -0
  65. package/skills/aura3d-materials-environments/references/custom-shader-chunks.md +8 -2
  66. package/skills/llms.txt +5 -5
  67. package/skills/meshy-cli/SKILL.md +13 -12
  68. package/skills/meshy-cli/references/asset-tooling.md +16 -5
@@ -0,0 +1,382 @@
1
+ /**
2
+ * `assets validate --skin`: poses a rigged GLB through the clips it ships and reports the defects that tore the Aura FC athletes:
3
+ * stretched triangles (the "sails" at the hips), thin long flaps, bad or distant skin weights, limb meshes that are not in the
4
+ * pose the skeleton assumes (modelled mid-stride and bound to a straight skeleton) and joint ranges no limb can reach.
5
+ */
6
+ import { buildHierarchy, clipDuration, forward, jointBindPositions, localPose, loadSkins, qconj, qmul, skinnedPositions, vdist, vdot, vlen, vsub } from "./gltf.js";
7
+ export const SKIN_STRETCH = "SKIN_STRETCH";
8
+ export const SKIN_FLAP = "SKIN_FLAP";
9
+ export const SKIN_WEIGHT_SUM = "SKIN_WEIGHT_SUM";
10
+ export const SKIN_WEIGHT_DISTANT = "SKIN_WEIGHT_DISTANT";
11
+ export const SKIN_BIND_MISMATCH = "SKIN_BIND_MISMATCH";
12
+ export const SKIN_JOINT_RANGE = "SKIN_JOINT_RANGE";
13
+ export const SKIN_NO_SKIN = "SKIN_NO_SKIN";
14
+ export const DEFAULT_SKIN_THRESHOLDS = {
15
+ stretchLimit: 1.6,
16
+ stretchHardLimit: 2.5,
17
+ stretchAllowTriangles: 2,
18
+ flapEdgeFraction: 0.14,
19
+ flapThin: 0.08,
20
+ bindOffsetRatio: 0.34,
21
+ weightSumTolerance: 0.02,
22
+ distantFraction: 0.5,
23
+ distantMinWeight: 0.15,
24
+ hipFlexMin: -70,
25
+ hipFlexMax: 120,
26
+ hipAbductionMax: 75,
27
+ kneeMax: 155,
28
+ thighTwistMax: 60
29
+ };
30
+ const DEG = 180 / Math.PI;
31
+ /** Trunk and root bones: their vertex cloud is wide and not a limb, so the axis-offset test does not apply. */
32
+ const TRUNK_BONE = /spine|chest|hips|pelvis|neck|head|shoulder|clavicle|root|armature|jaw|eye|tongue|hair|breast|skirt|cape|tail/i;
33
+ const round = (n, d = 3) => Math.round(n * 10 ** d) / 10 ** d;
34
+ function triArea(a, b, c) {
35
+ const u = vsub(b, a), v = vsub(c, a);
36
+ return 0.5 * Math.hypot(u[1] * v[2] - u[2] * v[1], u[2] * v[0] - u[0] * v[2], u[0] * v[1] - u[1] * v[0]);
37
+ }
38
+ /** Worst posed/rest edge stretch of every triangle over the sampled poses, per primitive, plus thin-flap data. */
39
+ export function samplePoses(glb, hierarchy, clips, samples) {
40
+ const poses = [];
41
+ const clipOfPose = [];
42
+ for (const anim of clips) {
43
+ const dur = clipDuration(glb, anim);
44
+ for (let s = 0; s < samples; s += 1) {
45
+ poses.push(forward(localPose(glb, anim, (dur * s) / samples, hierarchy), hierarchy));
46
+ clipOfPose.push(anim.name ?? "clip");
47
+ }
48
+ }
49
+ return { poses, clipOfPose };
50
+ }
51
+ export function triangleStretch(skin, prim, poses, flapEdge, flapThin, flapOutlier = 2.5) {
52
+ const nTri = Math.floor(prim.indices.length / 3);
53
+ const worst = new Float32Array(nTri);
54
+ const flap = new Uint8Array(nTri);
55
+ let flapEdgeMax = 0;
56
+ const rest = prim.pos;
57
+ const restLen = (a, b) => Math.max(vdist(rest[a], rest[b]), 0.004);
58
+ const restEdges = [];
59
+ for (let t = 0; t < nTri; t += 1) {
60
+ const a = prim.indices[t * 3] ?? 0, b = prim.indices[t * 3 + 1] ?? 0, c = prim.indices[t * 3 + 2] ?? 0;
61
+ restEdges.push([restLen(a, b), restLen(b, c), restLen(c, a)]);
62
+ }
63
+ // A flap is a thin triangle much longer than the mesh's normal triangles (long thin strips that tile a sleeve or trouser leg are not).
64
+ const sortedEdges = restEdges.map((e) => Math.max(...e)).sort((a, b) => a - b);
65
+ const p95 = sortedEdges[Math.floor(sortedEdges.length * 0.95)] ?? 0;
66
+ const flapFloor = Math.max(flapEdge, flapOutlier * p95);
67
+ for (const pose of poses) {
68
+ const out = skinnedPositions(skin, prim, pose);
69
+ for (let t = 0; t < nTri; t += 1) {
70
+ const a = prim.indices[t * 3] ?? 0, b = prim.indices[t * 3 + 1] ?? 0, c = prim.indices[t * 3 + 2] ?? 0;
71
+ const pa = out[a], pb = out[b], pc = out[c];
72
+ const e0 = vdist(pa, pb), e1 = vdist(pb, pc), e2 = vdist(pc, pa);
73
+ const re = restEdges[t];
74
+ const r = Math.max(e0 / re[0], e1 / re[1], e2 / re[2]);
75
+ if (r > worst[t])
76
+ worst[t] = r;
77
+ const longest = Math.max(e0, e1, e2);
78
+ if (longest > flapFloor && triArea(pa, pb, pc) / (longest * longest) < flapThin) {
79
+ flap[t] = 1;
80
+ if (longest > flapEdgeMax)
81
+ flapEdgeMax = longest;
82
+ }
83
+ }
84
+ }
85
+ return { worst, flap, flapEdgeMax };
86
+ }
87
+ function modelHeight(skins) {
88
+ let lo = Infinity, hi = -Infinity;
89
+ for (const skin of skins)
90
+ for (const prim of skin.primitives)
91
+ for (const p of prim.pos) {
92
+ lo = Math.min(lo, p[1]);
93
+ hi = Math.max(hi, p[1]);
94
+ }
95
+ return Number.isFinite(lo) && hi > lo ? hi - lo : 1;
96
+ }
97
+ function dominantJoint(prim, v) {
98
+ let best = 0, joint = 0;
99
+ const w = prim.weights[v] ?? [], j = prim.joints[v] ?? [];
100
+ for (let k = 0; k < 4; k += 1)
101
+ if ((w[k] ?? 0) > best) {
102
+ best = w[k] ?? 0;
103
+ joint = j[k] ?? 0;
104
+ }
105
+ return { joint, weight: best };
106
+ }
107
+ /** Distance from a point to a segment. */
108
+ function segmentDistance(p, a, b) {
109
+ const ab = vsub(b, a);
110
+ const l2 = vdot(ab, ab);
111
+ if (l2 < 1e-12)
112
+ return vdist(p, a);
113
+ const t = Math.max(0, Math.min(1, vdot(vsub(p, a), ab) / l2));
114
+ return vdist(p, [a[0] + ab[0] * t, a[1] + ab[1] * t, a[2] + ab[2] * t]);
115
+ }
116
+ const LEG_NAMES = [
117
+ { up: /^(mixamorig:?)?left(upper)?(up)?(leg|thigh)$/i, low: /^(mixamorig:?)?left(lower)?(leg|shin|calf)$/i, foot: /^(mixamorig:?)?left(foot|ankle)$/i },
118
+ { up: /^(mixamorig:?)?right(upper)?(up)?(leg|thigh)$/i, low: /^(mixamorig:?)?right(lower)?(leg|shin|calf)$/i, foot: /^(mixamorig:?)?right(foot|ankle)$/i }
119
+ ];
120
+ /** Recognises Meshy/Mixamo/VRM-style leg bone names; returns null when the rig is not a recognised humanoid. */
121
+ export function findHumanoidLegs(hierarchy) {
122
+ const legs = [];
123
+ for (const spec of LEG_NAMES) {
124
+ const names = hierarchy.names;
125
+ const up = names.findIndex((n) => spec.up.test(n) && /up|thigh/i.test(n));
126
+ const foot = names.findIndex((n) => spec.foot.test(n));
127
+ if (up < 0 || foot < 0)
128
+ return null;
129
+ let knee = -1;
130
+ for (let i = 0; i < names.length; i += 1) {
131
+ if (!spec.low.test(names[i]) || i === up)
132
+ continue;
133
+ if (hierarchy.parent[i] === up) {
134
+ knee = i;
135
+ break;
136
+ }
137
+ }
138
+ if (knee < 0)
139
+ return null;
140
+ legs.push({ up, knee, foot });
141
+ }
142
+ return legs;
143
+ }
144
+ function legAngles(pose, rest, leg) {
145
+ const unit = (a) => { const l = vlen(a) || 1; return [a[0] / l, a[1] / l, a[2] / l]; };
146
+ const thigh = unit(vsub(pose.pos[leg.knee], pose.pos[leg.up]));
147
+ const shin = unit(vsub(pose.pos[leg.foot], pose.pos[leg.knee]));
148
+ const rThigh = unit(vsub(rest.pos[leg.knee], rest.pos[leg.up]));
149
+ const flex = (Math.atan2(thigh[2], -thigh[1]) - Math.atan2(rThigh[2], -rThigh[1])) * DEG;
150
+ const abd = (Math.atan2(thigh[0], -thigh[1]) - Math.atan2(rThigh[0], -rThigh[1])) * DEG;
151
+ const knee = Math.acos(Math.max(-1, Math.min(1, vdot(thigh, shin)))) * DEG;
152
+ const shinBack = Math.atan2(shin[2], -shin[1]) - Math.atan2(thigh[2], -thigh[1]);
153
+ const quat = (m) => {
154
+ const sx = Math.hypot(m[0] ?? 0, m[1] ?? 0, m[2] ?? 0) || 1, sy = Math.hypot(m[4] ?? 0, m[5] ?? 0, m[6] ?? 0) || 1, sz = Math.hypot(m[8] ?? 0, m[9] ?? 0, m[10] ?? 0) || 1;
155
+ const r00 = (m[0] ?? 0) / sx, r10 = (m[1] ?? 0) / sx, r20 = (m[2] ?? 0) / sx, r01 = (m[4] ?? 0) / sy, r11 = (m[5] ?? 0) / sy, r21 = (m[6] ?? 0) / sy, r02 = (m[8] ?? 0) / sz, r12 = (m[9] ?? 0) / sz, r22 = (m[10] ?? 0) / sz;
156
+ const tr = r00 + r11 + r22;
157
+ if (tr > 0) {
158
+ const s = Math.sqrt(tr + 1) * 2;
159
+ return [(r21 - r12) / s, (r02 - r20) / s, (r10 - r01) / s, 0.25 * s];
160
+ }
161
+ if (r00 > r11 && r00 > r22) {
162
+ const s = Math.sqrt(1 + r00 - r11 - r22) * 2;
163
+ return [0.25 * s, (r01 + r10) / s, (r02 + r20) / s, (r21 - r12) / s];
164
+ }
165
+ if (r11 > r22) {
166
+ const s = Math.sqrt(1 + r11 - r00 - r22) * 2;
167
+ return [(r01 + r10) / s, 0.25 * s, (r12 + r21) / s, (r02 - r20) / s];
168
+ }
169
+ const s = Math.sqrt(1 + r22 - r00 - r11) * 2;
170
+ return [(r02 + r20) / s, (r12 + r21) / s, 0.25 * s, (r10 - r01) / s];
171
+ };
172
+ const delta = qmul(quat(pose.world[leg.up]), qconj(quat(rest.world[leg.up])));
173
+ const s = vdot([delta[0], delta[1], delta[2]], rThigh);
174
+ let twist = 2 * Math.atan2(s, delta[3]) * DEG;
175
+ if (twist > 180)
176
+ twist -= 360;
177
+ if (twist < -180)
178
+ twist += 360;
179
+ return { flex, abd, knee, kneeForward: shinBack > 1e-3 && knee > 3, twist };
180
+ }
181
+ /** Hip/knee/twist ranges of the humanoid legs per clip (degrees); null when the rig is not a recognised humanoid. */
182
+ export function jointRanges(glb, hierarchy, clips, samples = 24) {
183
+ const legs = findHumanoidLegs(hierarchy);
184
+ if (!legs)
185
+ return null;
186
+ const rest = forward(localPose(glb, null, 0, hierarchy), hierarchy);
187
+ const out = {};
188
+ for (const anim of clips) {
189
+ const dur = clipDuration(glb, anim);
190
+ const acc = { hipFlexMin: Infinity, hipFlexMax: -Infinity, hipAbductionMax: 0, kneeMax: 0, kneeForwardFrames: 0, thighTwistMax: 0 };
191
+ for (let s = 0; s < samples; s += 1) {
192
+ const pose = forward(localPose(glb, anim, (dur * s) / samples, hierarchy), hierarchy);
193
+ for (const leg of legs) {
194
+ const a = legAngles(pose, rest, leg);
195
+ acc.hipFlexMin = Math.min(acc.hipFlexMin, a.flex);
196
+ acc.hipFlexMax = Math.max(acc.hipFlexMax, a.flex);
197
+ acc.hipAbductionMax = Math.max(acc.hipAbductionMax, Math.abs(a.abd));
198
+ acc.kneeMax = Math.max(acc.kneeMax, a.knee);
199
+ if (a.kneeForward)
200
+ acc.kneeForwardFrames += 1;
201
+ acc.thighTwistMax = Math.max(acc.thighTwistMax, Math.abs(a.twist));
202
+ }
203
+ }
204
+ out[anim.name ?? "clip"] = {
205
+ hipFlexMin: round(Number.isFinite(acc.hipFlexMin) ? acc.hipFlexMin : 0, 1), hipFlexMax: round(Number.isFinite(acc.hipFlexMax) ? acc.hipFlexMax : 0, 1),
206
+ hipAbductionMax: round(acc.hipAbductionMax, 1), kneeMax: round(acc.kneeMax, 1), kneeForwardFrames: acc.kneeForwardFrames, thighTwistMax: round(acc.thighTwistMax, 1)
207
+ };
208
+ }
209
+ return out;
210
+ }
211
+ /** Per bone: how far the centroid of the vertices it dominates sits from the bone's axis, relative to the bone length (bind pose). */
212
+ export function bindMismatch(skins, hierarchy, height, ratioLimit) {
213
+ const flagged = [];
214
+ for (const skin of skins) {
215
+ const bindPos = jointBindPositions(skin);
216
+ const sums = new Map();
217
+ for (const prim of skin.primitives) {
218
+ for (let v = 0; v < prim.pos.length; v += 1) {
219
+ const d = dominantJoint(prim, v);
220
+ if (d.weight < 0.6)
221
+ continue;
222
+ const p = prim.pos[v];
223
+ const entry = sums.get(d.joint) ?? { sum: [0, 0, 0], n: 0 };
224
+ entry.sum[0] += p[0];
225
+ entry.sum[1] += p[1];
226
+ entry.sum[2] += p[2];
227
+ entry.n += 1;
228
+ sums.set(d.joint, entry);
229
+ }
230
+ }
231
+ for (const [jointIndex, { sum, n }] of sums) {
232
+ if (n < 25)
233
+ continue;
234
+ const node = skin.joints[jointIndex];
235
+ if (node === undefined)
236
+ continue;
237
+ const childIndex = skin.joints.findIndex((c) => hierarchy.parent[c] === node);
238
+ if (childIndex < 0)
239
+ continue;
240
+ const a = bindPos[jointIndex], b = bindPos[childIndex];
241
+ const length = vdist(a, b);
242
+ if (length < 0.06 * height)
243
+ continue;
244
+ if (TRUNK_BONE.test(hierarchy.names[node] ?? ""))
245
+ continue;
246
+ const centroid = [sum[0] / n, sum[1] / n, sum[2] / n];
247
+ const offset = segmentDistance(centroid, a, b);
248
+ const ratio = offset / length;
249
+ if (ratio > ratioLimit)
250
+ flagged.push({ bone: hierarchy.names[node] ?? `joint${node}`, vertices: n, offset: round(offset), boneLength: round(length), ratio: round(ratio, 2) });
251
+ }
252
+ }
253
+ return flagged;
254
+ }
255
+ export function analyzeSkin(glb, options = {}) {
256
+ const thresholds = { ...DEFAULT_SKIN_THRESHOLDS, ...options.thresholds };
257
+ const hierarchy = buildHierarchy(glb);
258
+ const allSkins = loadSkins(glb, hierarchy);
259
+ const warnOnly = new Set(options.strict ? [] : options.warnOnly ?? [SKIN_BIND_MISMATCH, SKIN_WEIGHT_DISTANT]);
260
+ const findings = [];
261
+ const push = (code, message, primitive, detail) => {
262
+ findings.push({ code, severity: warnOnly.has(code) ? "warning" : "error", message, ...(primitive ? { primitive } : {}), ...(detail ? { detail } : {}) });
263
+ };
264
+ const skins = allSkins.map((s) => ({ ...s, primitives: s.primitives.filter((p) => !(options.ignoreMaterials?.test(p.materialName))) }));
265
+ const animations = glb.json.animations ?? [];
266
+ const clips = options.clips ? animations.filter((a) => options.clips?.includes(a.name ?? "")) : animations;
267
+ const samples = Math.max(2, options.samples ?? 10);
268
+ const base = { thresholds, samplesPerClip: samples };
269
+ if (skins.length === 0 || skins.every((s) => s.primitives.length === 0)) {
270
+ return {
271
+ ok: true, skinned: false, modelHeight: 0, clips: [], ...base, skins: [], materials: {}, bindMismatch: [], jointRanges: null, findings: [], failures: [], warnings: [],
272
+ reasonCodes: [], messages: ["No skinned mesh: skin check not applicable."]
273
+ };
274
+ }
275
+ const height = modelHeight(skins);
276
+ const flapEdge = thresholds.flapEdgeFraction * height;
277
+ const restPose = forward(localPose(glb, null, 0, hierarchy), hierarchy);
278
+ const bindPositions = new Map(skins.map((s) => [s.index, jointBindPositions(s)]));
279
+ const { poses } = samplePoses(glb, hierarchy, clips, samples);
280
+ const evalPoses = poses.length > 0 ? poses : [restPose];
281
+ const skinReports = [];
282
+ const materials = {};
283
+ for (const skin of skins) {
284
+ const primReports = [];
285
+ for (const prim of skin.primitives) {
286
+ const label = `${prim.materialName} (mesh ${prim.meshIndex} prim ${prim.primitiveIndex})`;
287
+ const { worst, flap, flapEdgeMax } = triangleStretch(skin, prim, evalPoses, flapEdge, thresholds.flapThin);
288
+ let maxStretch = 0, over = 0, flaps = 0;
289
+ for (let t = 0; t < worst.length; t += 1) {
290
+ const w = worst[t];
291
+ if (w > maxStretch)
292
+ maxStretch = w;
293
+ if (w > thresholds.stretchLimit)
294
+ over += 1;
295
+ if (flap[t])
296
+ flaps += 1;
297
+ }
298
+ // weights
299
+ let weightSumBad = 0, weightDistant = 0;
300
+ const distantLimit = thresholds.distantFraction * height;
301
+ const jointCount = skin.joints.length;
302
+ for (let v = 0; v < prim.pos.length; v += 1) {
303
+ const w = prim.weights[v] ?? [], j = prim.joints[v] ?? [];
304
+ const sum = w.reduce((a, b) => a + b, 0);
305
+ let badIndex = false;
306
+ for (let k = 0; k < 4; k += 1)
307
+ if ((w[k] ?? 0) > 0 && (j[k] ?? 0) >= jointCount)
308
+ badIndex = true;
309
+ if (!Number.isFinite(sum) || Math.abs(sum - 1) > thresholds.weightSumTolerance || badIndex)
310
+ weightSumBad += 1;
311
+ for (let k = 0; k < 4; k += 1) {
312
+ if ((w[k] ?? 0) < thresholds.distantMinWeight)
313
+ continue;
314
+ const at = (bindPositions.get(skin.index) ?? [])[j[k] ?? 0];
315
+ if (!at)
316
+ continue;
317
+ if (vdist(prim.pos[v], at) > distantLimit) {
318
+ weightDistant += 1;
319
+ break;
320
+ }
321
+ }
322
+ }
323
+ primReports.push({
324
+ mesh: prim.meshIndex, primitive: prim.primitiveIndex, material: prim.materialName, vertices: prim.pos.length, triangles: worst.length,
325
+ maxStretch: round(maxStretch, 2), trianglesOverLimit: over, flaps, maxFlapEdge: round(flapEdgeMax), weightSumBad, weightDistant
326
+ });
327
+ const m = materials[prim.materialName] ?? { triangles: 0, maxStretch: 0, trianglesOverLimit: 0, flaps: 0 };
328
+ m.triangles += worst.length;
329
+ m.maxStretch = Math.max(m.maxStretch, round(maxStretch, 2));
330
+ m.trianglesOverLimit += over;
331
+ m.flaps += flaps;
332
+ materials[prim.materialName] = m;
333
+ const allowed = Math.max(thresholds.stretchAllowTriangles, Math.floor(worst.length * 0.001));
334
+ if (over > 0 && (maxStretch > thresholds.stretchHardLimit || over > allowed))
335
+ push(SKIN_STRETCH, `${label}: ${over} of ${worst.length} triangles stretch past ${thresholds.stretchLimit}x their rest edges (worst ${round(maxStretch, 2)}x) in the played clips (${SKIN_STRETCH}). Bridging triangles between parts that move independently, or a mesh bound in a different pose than its skeleton. Run assets repair-skin.`, label, { triangles: over, worst: round(maxStretch, 2) });
336
+ if (over > 0 && !(maxStretch > thresholds.stretchHardLimit || over > allowed))
337
+ findings.push({ code: SKIN_STRETCH, severity: "warning", message: `${label}: ${over} triangle(s) stretch past ${thresholds.stretchLimit}x (worst ${round(maxStretch, 2)}x), within the allowance of ${allowed} (${SKIN_STRETCH}).`, primitive: label });
338
+ if (flaps > 0)
339
+ push(SKIN_FLAP, `${label}: ${flaps} thin triangle(s) with a posed edge up to ${round(flapEdgeMax)} m (> ${round(flapEdge)} m): they draw as shards or sails once a limb swings (${SKIN_FLAP}).`, label, { flaps, longestEdge: round(flapEdgeMax) });
340
+ if (weightSumBad > 0)
341
+ push(SKIN_WEIGHT_SUM, `${label}: ${weightSumBad} vertices have skin weights that do not sum to 1 (+-${thresholds.weightSumTolerance}) or point past the joint list (${SKIN_WEIGHT_SUM}). assets repair-skin --normalize fixes it.`, label, { vertices: weightSumBad });
342
+ if (weightDistant > 0)
343
+ push(SKIN_WEIGHT_DISTANT, `${label}: ${weightDistant} vertices are influenced (>= ${thresholds.distantMinWeight}) by a bone farther than ${round(distantLimit)} m (${SKIN_WEIGHT_DISTANT}). assets repair-skin --prune-distant removes those influences.`, label, { vertices: weightDistant });
344
+ }
345
+ skinReports.push({ index: skin.index, jointCount: skin.joints.length, primitives: primReports });
346
+ }
347
+ const mismatch = bindMismatch(skins, hierarchy, height, thresholds.bindOffsetRatio);
348
+ if (mismatch.length > 0) {
349
+ push(SKIN_BIND_MISMATCH, `${mismatch.length} bone(s) are not inside the mesh they move: ${mismatch.slice(0, 4).map((b) => `${b.bone} (vertices ${b.offset} m off a ${b.boneLength} m bone)`).join(", ")} (${SKIN_BIND_MISMATCH}). The mesh was modelled in a different pose than the skeleton assumes (typically mid-stride), so every clip rotates the limbs about joints off the limb. Rebuild the limbs in the skeleton's pose (assets repair-skin --rebuild-limbs) or re-rig.`, undefined, { bones: mismatch });
350
+ }
351
+ const ranges = jointRanges(glb, hierarchy, clips);
352
+ if (ranges) {
353
+ for (const [clip, r] of Object.entries(ranges)) {
354
+ const bad = [];
355
+ if (r.hipFlexMin < thresholds.hipFlexMin || r.hipFlexMax > thresholds.hipFlexMax)
356
+ bad.push(`hip flexion ${r.hipFlexMin}..${r.hipFlexMax} deg`);
357
+ if (r.hipAbductionMax > thresholds.hipAbductionMax)
358
+ bad.push(`hip abduction ${r.hipAbductionMax} deg`);
359
+ if (r.kneeMax > thresholds.kneeMax)
360
+ bad.push(`knee flexion ${r.kneeMax} deg`);
361
+ if (r.kneeForwardFrames > 0)
362
+ bad.push(`knee bends forward in ${r.kneeForwardFrames} sampled frames`);
363
+ if (r.thighTwistMax > thresholds.thighTwistMax)
364
+ bad.push(`thigh twist ${r.thighTwistMax} deg`);
365
+ if (bad.length > 0)
366
+ push(SKIN_JOINT_RANGE, `clip "${clip}": ${bad.join("; ")} (${SKIN_JOINT_RANGE}).`, undefined, { clip, ...r });
367
+ }
368
+ }
369
+ const failures = findings.filter((f) => f.severity === "error").map((f) => f.message);
370
+ const warnings = findings.filter((f) => f.severity === "warning").map((f) => f.message);
371
+ const ok = failures.length === 0;
372
+ const worstMaterial = Object.entries(materials).sort((a, b) => b[1].maxStretch - a[1].maxStretch)[0];
373
+ return {
374
+ ok, skinned: true, modelHeight: round(height), clips: clips.map((c) => c.name ?? "clip"), ...base,
375
+ skins: skinReports, materials, bindMismatch: mismatch, jointRanges: ranges, findings, failures, warnings,
376
+ reasonCodes: [...new Set(findings.map((f) => f.code))],
377
+ messages: ok
378
+ ? [`Skin check passed: ${skinReports.reduce((n, s) => n + s.primitives.reduce((m, p) => m + p.triangles, 0), 0)} triangles over ${clips.length} clip(s); worst stretch ${worstMaterial ? `${worstMaterial[1].maxStretch}x (${worstMaterial[0]})` : "n/a"}.`]
379
+ : failures
380
+ };
381
+ }
382
+ //# sourceMappingURL=analysis.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analysis.js","sourceRoot":"","sources":["../../../../../packages/aura3d-cli/src/skin/analysis.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,71 @@
1
+ import { DEFAULT_SKIN_THRESHOLDS, type SkinCode, type SkinReport } from "./analysis.js";
2
+ import { type RepairSkinOptions } from "./repair.js";
3
+ import { type RebuildLimbsOptions } from "./rebuildLimbs.js";
4
+ export declare const SKIN_ALLOW_FILE = "aura.skin-allow.json";
5
+ export declare const ALL_SKIN_CODES: readonly SkinCode[];
6
+ export interface SkinAllowEntry {
7
+ readonly allow: readonly SkinCode[];
8
+ readonly reason: string;
9
+ }
10
+ /** `aura.skin-allow.json`: `{ "<assetId>": { "allow": ["SKIN_STRETCH"], "reason": "why this known defect ships" } }`. A reason is required. */
11
+ export declare function readSkinAllowlist(projectDir: string): Record<string, SkinAllowEntry>;
12
+ export declare function isRiggedGlb(path: string): boolean;
13
+ export interface SkinCliOptions {
14
+ readonly file?: string;
15
+ readonly assetIds?: readonly string[];
16
+ readonly clips?: readonly string[];
17
+ readonly samples?: number;
18
+ readonly stretchLimit?: number;
19
+ readonly strict?: boolean;
20
+ readonly warnOnly?: readonly SkinCode[];
21
+ readonly ignoreMaterials?: RegExp;
22
+ readonly json?: boolean;
23
+ }
24
+ export interface SkinAssetResult {
25
+ readonly id: string;
26
+ readonly file: string;
27
+ readonly report: SkinReport;
28
+ readonly allowed: readonly SkinCode[];
29
+ readonly allowReason?: string;
30
+ readonly ok: boolean;
31
+ }
32
+ export interface SkinProjectReport {
33
+ readonly ok: boolean;
34
+ readonly messages: readonly string[];
35
+ readonly failures: readonly string[];
36
+ readonly warnings: readonly string[];
37
+ readonly assets: readonly SkinAssetResult[];
38
+ }
39
+ /** Skin check of one asset, with its allow-list entry applied (allowed codes become warnings that carry the reason). */
40
+ export declare function checkAssetSkin(id: string, file: string, options: SkinCliOptions, allow: Record<string, SkinAllowEntry>): SkinAssetResult;
41
+ export declare function checkProjectSkins(projectDir: string, options?: SkinCliOptions): SkinProjectReport;
42
+ /** Release gate for `validateAssets` / `check-deploy --release`: failures only, with the allow-list applied. */
43
+ export declare function skinReleaseFailures(projectDir: string, asset: {
44
+ readonly id: string;
45
+ readonly format?: string;
46
+ readonly outputPath: string;
47
+ readonly derived?: {
48
+ readonly outputPath?: string;
49
+ };
50
+ }, allow: Record<string, SkinAllowEntry>): {
51
+ failures: string[];
52
+ warnings: string[];
53
+ };
54
+ export declare function formatSkinReport(report: SkinReport, label: string): string;
55
+ export declare function formatProjectSkinReport(report: SkinProjectReport): string;
56
+ export interface RepairSkinCliOptions extends RepairSkinOptions {
57
+ readonly rebuildLimbs?: boolean;
58
+ readonly materialMap?: RebuildLimbsOptions["materials"];
59
+ readonly out?: string;
60
+ }
61
+ export declare function resolveAssetFile(projectDir: string, target: string): string;
62
+ export declare function parseMaterialMap(raw: string | undefined): RebuildLimbsOptions["materials"] | undefined;
63
+ export declare function runRepairSkin(projectDir: string, target: string, options: RepairSkinCliOptions): {
64
+ readonly ok: boolean;
65
+ readonly out: string;
66
+ readonly messages: readonly string[];
67
+ readonly report: unknown;
68
+ };
69
+ export declare const SKIN_HELP = "aura3d assets validate --skin [file.glb] [--asset id[,id]] [--clips Walk,Run] [--samples 10] [--stretch-limit 1.6] [--strict] [--warn-only CODE,CODE] [--json]\n Poses every rigged GLB through the clips it ships and fails on stretched triangles (SKIN_STRETCH), thin long flaps (SKIN_FLAP), bad weights (SKIN_WEIGHT_SUM), distant influences (SKIN_WEIGHT_DISTANT), a mesh not in its skeleton's pose (SKIN_BIND_MISMATCH, warning unless --strict) and impossible joint ranges (SKIN_JOINT_RANGE).\n Known defects that ship are listed with a reason in aura.skin-allow.json.\naura3d assets repair-skin <file.glb|assetId> [--out file.glb] [--normalize] [--max-influences 4] [--prune-distant] [--smooth-bridges] [--cut-stretch 2] [--rebuild-limbs [--material-map skin=skin,shorts=short,socks=sock,boots=dark]] [--json]\n Every step is opt-in. --rebuild-limbs rebuilds the legs of a recognised humanoid in the pose its skeleton assumes (generalised from the Aura FC fix).";
70
+ export { DEFAULT_SKIN_THRESHOLDS };
71
+ //# sourceMappingURL=command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../../../../packages/aura3d-cli/src/skin/command.ts"],"names":[],"mappings":"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"}