@aura3d/engine 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.
- package/README.md +3 -3
- package/dist/aura3d-cli/cli-help.d.ts.map +1 -1
- package/dist/aura3d-cli/cli-help.js +4 -2
- package/dist/aura3d-cli/cli-help.js.map +1 -1
- package/dist/aura3d-cli/cli.d.ts.map +1 -1
- package/dist/aura3d-cli/cli.js +129 -19
- package/dist/aura3d-cli/cli.js.map +1 -1
- package/dist/aura3d-cli/commands/assets/index.js +2 -2
- package/dist/aura3d-cli/commands/assets/index.js.map +1 -1
- package/dist/aura3d-cli/commands/meshyLedger.d.ts +125 -14
- package/dist/aura3d-cli/commands/meshyLedger.d.ts.map +1 -1
- package/dist/aura3d-cli/commands/meshyLedger.js +262 -35
- package/dist/aura3d-cli/commands/meshyLedger.js.map +1 -1
- package/dist/aura3d-cli/commands/prd13/run.js +19 -16
- package/dist/aura3d-cli/commands/prd13/run.js.map +1 -1
- package/dist/aura3d-cli/index.d.ts +8 -0
- package/dist/aura3d-cli/index.d.ts.map +1 -1
- package/dist/aura3d-cli/index.js +12 -0
- package/dist/aura3d-cli/index.js.map +1 -1
- package/dist/aura3d-cli/pull-bridge/adapters.d.ts +9 -1
- package/dist/aura3d-cli/pull-bridge/adapters.d.ts.map +1 -1
- package/dist/aura3d-cli/pull-bridge/adapters.js +30 -7
- package/dist/aura3d-cli/pull-bridge/adapters.js.map +1 -1
- package/dist/aura3d-cli/pull-bridge/search.d.ts +5 -0
- package/dist/aura3d-cli/pull-bridge/search.d.ts.map +1 -1
- package/dist/aura3d-cli/pull-bridge/search.js +7 -1
- package/dist/aura3d-cli/pull-bridge/search.js.map +1 -1
- package/dist/aura3d-cli/pull-bridge.js +1 -1
- package/dist/aura3d-cli/pull-bridge.js.map +1 -1
- package/dist/aura3d-cli/resolve-ladder.d.ts +123 -0
- package/dist/aura3d-cli/resolve-ladder.d.ts.map +1 -0
- package/dist/aura3d-cli/resolve-ladder.js +410 -0
- package/dist/aura3d-cli/resolve-ladder.js.map +1 -0
- package/dist/aura3d-cli/skin/analysis.d.ts +137 -0
- package/dist/aura3d-cli/skin/analysis.d.ts.map +1 -0
- package/dist/aura3d-cli/skin/analysis.js +382 -0
- package/dist/aura3d-cli/skin/analysis.js.map +1 -0
- package/dist/aura3d-cli/skin/command.d.ts +71 -0
- package/dist/aura3d-cli/skin/command.d.ts.map +1 -0
- package/dist/aura3d-cli/skin/command.js +186 -0
- package/dist/aura3d-cli/skin/command.js.map +1 -0
- package/dist/aura3d-cli/skin/glbEdit.d.ts +14 -0
- package/dist/aura3d-cli/skin/glbEdit.d.ts.map +1 -0
- package/dist/aura3d-cli/skin/glbEdit.js +152 -0
- package/dist/aura3d-cli/skin/glbEdit.js.map +1 -0
- package/dist/aura3d-cli/skin/gltf.d.ts +159 -0
- package/dist/aura3d-cli/skin/gltf.d.ts.map +1 -0
- package/dist/aura3d-cli/skin/gltf.js +379 -0
- package/dist/aura3d-cli/skin/gltf.js.map +1 -0
- package/dist/aura3d-cli/skin/rebuildLimbs.d.ts +31 -0
- package/dist/aura3d-cli/skin/rebuildLimbs.d.ts.map +1 -0
- package/dist/aura3d-cli/skin/rebuildLimbs.js +326 -0
- package/dist/aura3d-cli/skin/rebuildLimbs.js.map +1 -0
- package/dist/aura3d-cli/skin/repair.d.ts +41 -0
- package/dist/aura3d-cli/skin/repair.d.ts.map +1 -0
- package/dist/aura3d-cli/skin/repair.js +180 -0
- package/dist/aura3d-cli/skin/repair.js.map +1 -0
- package/dist/create-aura3d/index.js +1 -1
- package/dist/debug/index.d.ts +2 -2
- package/dist/debug/index.d.ts.map +1 -1
- package/dist/debug/index.js +1 -1
- package/dist/debug/index.js.map +1 -1
- package/dist/debug/safety/frameBoundary.d.ts +33 -0
- package/dist/debug/safety/frameBoundary.d.ts.map +1 -0
- package/dist/debug/safety/frameBoundary.js +40 -0
- package/dist/debug/safety/frameBoundary.js.map +1 -0
- package/dist/debug/safety/index.d.ts +1 -0
- package/dist/debug/safety/index.d.ts.map +1 -1
- package/dist/debug/safety/index.js +1 -0
- package/dist/debug/safety/index.js.map +1 -1
- package/dist/engine/agent-api/app/actorBoneMatrixLookup.d.ts +22 -0
- package/dist/engine/agent-api/app/actorBoneMatrixLookup.d.ts.map +1 -0
- package/dist/engine/agent-api/app/actorBoneMatrixLookup.js +24 -0
- package/dist/engine/agent-api/app/actorBoneMatrixLookup.js.map +1 -0
- package/dist/engine/agent-api/app/canvas.d.ts +16 -0
- package/dist/engine/agent-api/app/canvas.d.ts.map +1 -1
- package/dist/engine/agent-api/app/canvas.js +15 -0
- package/dist/engine/agent-api/app/canvas.js.map +1 -1
- package/dist/engine/agent-api/app/createAuraApp.d.ts.map +1 -1
- package/dist/engine/agent-api/app/createAuraApp.js +21 -3
- package/dist/engine/agent-api/app/createAuraApp.js.map +1 -1
- package/dist/engine/agent-api/app/frameLoop.d.ts.map +1 -1
- package/dist/engine/agent-api/app/frameLoop.js +21 -3
- package/dist/engine/agent-api/app/frameLoop.js.map +1 -1
- package/dist/engine/agent-api/app/mountFailure.d.ts +6 -0
- package/dist/engine/agent-api/app/mountFailure.d.ts.map +1 -0
- package/dist/engine/agent-api/app/mountFailure.js +9 -0
- package/dist/engine/agent-api/app/mountFailure.js.map +1 -0
- package/dist/engine/agent-api/app/parentFit.d.ts +35 -0
- package/dist/engine/agent-api/app/parentFit.d.ts.map +1 -0
- package/dist/engine/agent-api/app/parentFit.js +36 -0
- package/dist/engine/agent-api/app/parentFit.js.map +1 -0
- package/dist/engine/agent-api/compiler/customMaterial.d.ts.map +1 -1
- package/dist/engine/agent-api/compiler/customMaterial.js +15 -3
- package/dist/engine/agent-api/compiler/customMaterial.js.map +1 -1
- package/dist/engine/agent-api/nodes/batched.d.ts +10 -0
- package/dist/engine/agent-api/nodes/batched.d.ts.map +1 -1
- package/dist/engine/agent-api/nodes/batched.js +7 -5
- package/dist/engine/agent-api/nodes/batched.js.map +1 -1
- package/dist/engine/agent-api/nodes/builder.d.ts +13 -0
- package/dist/engine/agent-api/nodes/builder.d.ts.map +1 -1
- package/dist/engine/agent-api/nodes/builder.js +7 -3
- package/dist/engine/agent-api/nodes/builder.js.map +1 -1
- package/dist/engine/agent-api/nodes/instancedMesh.d.ts +10 -0
- package/dist/engine/agent-api/nodes/instancedMesh.d.ts.map +1 -1
- package/dist/engine/agent-api/nodes/instancedMesh.js +7 -5
- package/dist/engine/agent-api/nodes/instancedMesh.js.map +1 -1
- package/dist/engine/agent-api/nodes/types.d.ts +6 -0
- package/dist/engine/agent-api/nodes/types.d.ts.map +1 -1
- package/dist/engine/lanes/prd06.d.ts.map +1 -1
- package/dist/engine/lanes/prd06.js +1 -16
- package/dist/engine/lanes/prd06.js.map +1 -1
- package/dist/engine/qa/fixedStepLoop.d.ts +2 -0
- package/dist/engine/qa/fixedStepLoop.d.ts.map +1 -1
- package/dist/engine/qa/fixedStepLoop.js +3 -0
- package/dist/engine/qa/fixedStepLoop.js.map +1 -1
- package/dist/game/evidence/textureStatus.d.ts +24 -0
- package/dist/game/evidence/textureStatus.d.ts.map +1 -0
- package/dist/game/evidence/textureStatus.js +27 -0
- package/dist/game/evidence/textureStatus.js.map +1 -0
- package/dist/game/index.d.ts +5 -0
- package/dist/game/index.d.ts.map +1 -1
- package/dist/game/index.js +3 -0
- package/dist/game/index.js.map +1 -1
- package/dist/game/motion/boneAttach.d.ts +42 -0
- package/dist/game/motion/boneAttach.d.ts.map +1 -0
- package/dist/game/motion/boneAttach.js +166 -0
- package/dist/game/motion/boneAttach.js.map +1 -0
- package/dist/game/motion/cameraClear.d.ts +35 -0
- package/dist/game/motion/cameraClear.d.ts.map +1 -0
- package/dist/game/motion/cameraClear.js +64 -0
- package/dist/game/motion/cameraClear.js.map +1 -0
- package/dist/game/motion/doubleFrame.d.ts +37 -0
- package/dist/game/motion/doubleFrame.d.ts.map +1 -0
- package/dist/game/motion/doubleFrame.js +59 -0
- package/dist/game/motion/doubleFrame.js.map +1 -0
- package/dist/game/motion/footSlide.d.ts +32 -0
- package/dist/game/motion/footSlide.d.ts.map +1 -0
- package/dist/game/motion/footSlide.js +59 -0
- package/dist/game/motion/footSlide.js.map +1 -0
- package/dist/game/motion/handBounce.d.ts +206 -0
- package/dist/game/motion/handBounce.d.ts.map +1 -0
- package/dist/game/motion/handBounce.js +267 -0
- package/dist/game/motion/handBounce.js.map +1 -0
- package/dist/game/motion/impact.d.ts +113 -0
- package/dist/game/motion/impact.d.ts.map +1 -0
- package/dist/game/motion/impact.js +233 -0
- package/dist/game/motion/impact.js.map +1 -0
- package/dist/game/motion/index.d.ts +21 -0
- package/dist/game/motion/index.d.ts.map +1 -0
- package/dist/game/motion/index.js +11 -0
- package/dist/game/motion/index.js.map +1 -0
- package/dist/game/motion/locomotion.d.ts +55 -0
- package/dist/game/motion/locomotion.d.ts.map +1 -0
- package/dist/game/motion/locomotion.js +107 -0
- package/dist/game/motion/locomotion.js.map +1 -0
- package/dist/game/motion/motionGate.d.ts +41 -0
- package/dist/game/motion/motionGate.d.ts.map +1 -0
- package/dist/game/motion/motionGate.js +71 -0
- package/dist/game/motion/motionGate.js.map +1 -0
- package/dist/game/motion/presenter.d.ts +37 -0
- package/dist/game/motion/presenter.d.ts.map +1 -0
- package/dist/game/motion/presenter.js +72 -0
- package/dist/game/motion/presenter.js.map +1 -0
- package/dist/game/motion/smoothing.d.ts +34 -0
- package/dist/game/motion/smoothing.d.ts.map +1 -0
- package/dist/game/motion/smoothing.js +92 -0
- package/dist/game/motion/smoothing.js.map +1 -0
- package/dist/game/session/warmPrograms.d.ts +75 -0
- package/dist/game/session/warmPrograms.d.ts.map +1 -0
- package/dist/game/session/warmPrograms.js +80 -0
- package/dist/game/session/warmPrograms.js.map +1 -0
- package/dist/physics/ensure.d.ts +2 -0
- package/dist/physics/ensure.d.ts.map +1 -0
- package/dist/physics/ensure.js +4 -0
- package/dist/physics/ensure.js.map +1 -0
- package/dist/physics/index.d.ts +1 -0
- package/dist/physics/index.d.ts.map +1 -1
- package/dist/physics/index.js +1 -0
- package/dist/physics/index.js.map +1 -1
- package/dist/physics/world.d.ts +1 -0
- package/dist/physics/world.d.ts.map +1 -1
- package/dist/physics/world.js +1 -0
- package/dist/physics/world.js.map +1 -1
- package/dist/physics-rapier/index.d.ts +2 -0
- package/dist/physics-rapier/index.d.ts.map +1 -1
- package/dist/physics-rapier/index.js +12 -10
- package/dist/physics-rapier/index.js.map +1 -1
- package/dist/physics-rapier/rapierInit.d.ts +6 -0
- package/dist/physics-rapier/rapierInit.d.ts.map +1 -0
- package/dist/physics-rapier/rapierInit.js +12 -0
- package/dist/physics-rapier/rapierInit.js.map +1 -0
- package/dist/physics-rapier/rapierInit.lazy.d.ts +6 -0
- package/dist/physics-rapier/rapierInit.lazy.d.ts.map +1 -0
- package/dist/physics-rapier/rapierInit.lazy.js +19 -0
- package/dist/physics-rapier/rapierInit.lazy.js.map +1 -0
- package/dist/rendering/DepthPass.d.ts.map +1 -1
- package/dist/rendering/DepthPass.js +30 -8
- package/dist/rendering/DepthPass.js.map +1 -1
- package/dist/rendering/ForwardPass.d.ts.map +1 -1
- package/dist/rendering/ForwardPass.js +7 -0
- package/dist/rendering/ForwardPass.js.map +1 -1
- package/dist/rendering/Renderer.d.ts +0 -2
- package/dist/rendering/Renderer.d.ts.map +1 -1
- package/dist/rendering/Renderer.js +6 -16
- package/dist/rendering/Renderer.js.map +1 -1
- package/dist/rendering/contracts/output.d.ts +9 -1
- package/dist/rendering/contracts/output.d.ts.map +1 -1
- package/dist/rendering/contracts/output.js.map +1 -1
- package/dist/rendering/environment/EnvironmentCache.d.ts.map +1 -1
- package/dist/rendering/environment/EnvironmentCache.js +6 -1
- package/dist/rendering/environment/EnvironmentCache.js.map +1 -1
- package/dist/rendering/environment/neutralEmbedded.d.ts +5 -0
- package/dist/rendering/environment/neutralEmbedded.d.ts.map +1 -0
- package/dist/rendering/environment/neutralEmbedded.js +1118 -0
- package/dist/rendering/environment/neutralEmbedded.js.map +1 -0
- package/dist/rendering/environment/neutralEmbeddedLoader.d.ts +5 -0
- package/dist/rendering/environment/neutralEmbeddedLoader.d.ts.map +1 -0
- package/dist/rendering/environment/neutralEmbeddedLoader.js +32 -0
- package/dist/rendering/environment/neutralEmbeddedLoader.js.map +1 -0
- package/dist/rendering/output/OutputPass.d.ts +2 -0
- package/dist/rendering/output/OutputPass.d.ts.map +1 -1
- package/dist/rendering/output/OutputPass.js +26 -3
- package/dist/rendering/output/OutputPass.js.map +1 -1
- package/dist/rendering/output/ToneMappingOperators.glsl.d.ts +3 -1
- package/dist/rendering/output/ToneMappingOperators.glsl.d.ts.map +1 -1
- package/dist/rendering/output/ToneMappingOperators.glsl.js +19 -1
- package/dist/rendering/output/ToneMappingOperators.glsl.js.map +1 -1
- package/dist/rendering/post/v2Stages.d.ts +2 -7
- package/dist/rendering/post/v2Stages.d.ts.map +1 -1
- package/dist/rendering/post/v2Stages.js +2 -17
- package/dist/rendering/post/v2Stages.js.map +1 -1
- package/dist/rendering/post/vignetteColor.d.ts +8 -0
- package/dist/rendering/post/vignetteColor.d.ts.map +1 -0
- package/dist/rendering/post/vignetteColor.js +18 -0
- package/dist/rendering/post/vignetteColor.js.map +1 -0
- package/dist/rendering/renderer/PostprocessExecution.d.ts +10 -0
- package/dist/rendering/renderer/PostprocessExecution.d.ts.map +1 -1
- package/dist/rendering/renderer/PostprocessExecution.js +38 -38
- package/dist/rendering/renderer/PostprocessExecution.js.map +1 -1
- package/dist/rendering/renderer/coreOutputPostRoute.d.ts +25 -17
- package/dist/rendering/renderer/coreOutputPostRoute.d.ts.map +1 -1
- package/dist/rendering/renderer/coreOutputPostRoute.js +27 -18
- package/dist/rendering/renderer/coreOutputPostRoute.js.map +1 -1
- package/dist/rendering/renderer/qrSubFlags.d.ts +1 -1
- package/dist/rendering/renderer/qrSubFlags.d.ts.map +1 -1
- package/dist/rendering/renderer/qrSubFlags.js +2 -8
- package/dist/rendering/renderer/qrSubFlags.js.map +1 -1
- package/dist/rendering/shaders/chunks/author/index.d.ts.map +1 -1
- package/dist/rendering/shaders/chunks/author/index.js +7 -0
- package/dist/rendering/shaders/chunks/author/index.js.map +1 -1
- package/dist/rendering/shaders/chunks/author/shadow.glsl.d.ts +11 -0
- package/dist/rendering/shaders/chunks/author/shadow.glsl.d.ts.map +1 -0
- package/dist/rendering/shaders/chunks/author/shadow.glsl.js +57 -0
- package/dist/rendering/shaders/chunks/author/shadow.glsl.js.map +1 -0
- package/dist/rendering/shadows/DirectionalCascadeFitter.d.ts +20 -0
- package/dist/rendering/shadows/DirectionalCascadeFitter.d.ts.map +1 -1
- package/dist/rendering/shadows/DirectionalCascadeFitter.js +80 -7
- package/dist/rendering/shadows/DirectionalCascadeFitter.js.map +1 -1
- package/dist/rendering/shadows/Prd02DepthShaderLibrary.d.ts.map +1 -1
- package/dist/rendering/shadows/Prd02DepthShaderLibrary.js +9 -1
- package/dist/rendering/shadows/Prd02DepthShaderLibrary.js.map +1 -1
- package/dist/rendering/shadows/ShadowSystem.d.ts.map +1 -1
- package/dist/rendering/shadows/ShadowSystem.js +7 -2
- package/dist/rendering/shadows/ShadowSystem.js.map +1 -1
- package/dist/rendering/webgl2/LdrPostprocessShader.d.ts +2 -0
- package/dist/rendering/webgl2/LdrPostprocessShader.d.ts.map +1 -1
- package/dist/rendering/webgl2/LdrPostprocessShader.js +25 -3
- package/dist/rendering/webgl2/LdrPostprocessShader.js.map +1 -1
- package/dist/rendering/webgl2/LegacyPost.d.ts +11 -2
- package/dist/rendering/webgl2/LegacyPost.d.ts.map +1 -1
- package/dist/rendering/webgl2/LegacyPost.js +191 -16
- package/dist/rendering/webgl2/LegacyPost.js.map +1 -1
- package/package.json +33 -26
- package/templates/cinematic-scene/package.json +2 -2
- package/templates/mini-game/package.json +2 -2
- package/templates/product-viewer/package.json +2 -2
- package/templates/production-asset-inspector/package.json +1 -1
- package/templates/production-material-studio/package.json +1 -1
- package/templates/production-product-configurator/package.json +1 -1
- package/templates/production-product-viewer/package.json +1 -1
|
@@ -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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"}
|