@aura3d/engine 4.2.0 → 4.3.1

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 (191) hide show
  1. package/README.md +1 -1
  2. package/dist/aura3d-cli/cli-help.d.ts.map +1 -1
  3. package/dist/aura3d-cli/cli-help.js +4 -2
  4. package/dist/aura3d-cli/cli-help.js.map +1 -1
  5. package/dist/aura3d-cli/cli.js +85 -2
  6. package/dist/aura3d-cli/cli.js.map +1 -1
  7. package/dist/aura3d-cli/commands/assets/index.js +2 -2
  8. package/dist/aura3d-cli/commands/assets/index.js.map +1 -1
  9. package/dist/aura3d-cli/commands/meshyLedger.d.ts +125 -14
  10. package/dist/aura3d-cli/commands/meshyLedger.d.ts.map +1 -1
  11. package/dist/aura3d-cli/commands/meshyLedger.js +262 -35
  12. package/dist/aura3d-cli/commands/meshyLedger.js.map +1 -1
  13. package/dist/aura3d-cli/commands/prd13/run.js +19 -16
  14. package/dist/aura3d-cli/commands/prd13/run.js.map +1 -1
  15. package/dist/aura3d-cli/index.d.ts +10 -0
  16. package/dist/aura3d-cli/index.d.ts.map +1 -1
  17. package/dist/aura3d-cli/index.js +13 -0
  18. package/dist/aura3d-cli/index.js.map +1 -1
  19. package/dist/aura3d-cli/skin/analysis.d.ts +137 -0
  20. package/dist/aura3d-cli/skin/analysis.d.ts.map +1 -0
  21. package/dist/aura3d-cli/skin/analysis.js +382 -0
  22. package/dist/aura3d-cli/skin/analysis.js.map +1 -0
  23. package/dist/aura3d-cli/skin/command.d.ts +75 -0
  24. package/dist/aura3d-cli/skin/command.d.ts.map +1 -0
  25. package/dist/aura3d-cli/skin/command.js +208 -0
  26. package/dist/aura3d-cli/skin/command.js.map +1 -0
  27. package/dist/aura3d-cli/skin/glbEdit.d.ts +14 -0
  28. package/dist/aura3d-cli/skin/glbEdit.d.ts.map +1 -0
  29. package/dist/aura3d-cli/skin/glbEdit.js +152 -0
  30. package/dist/aura3d-cli/skin/glbEdit.js.map +1 -0
  31. package/dist/aura3d-cli/skin/gltf.d.ts +159 -0
  32. package/dist/aura3d-cli/skin/gltf.d.ts.map +1 -0
  33. package/dist/aura3d-cli/skin/gltf.js +379 -0
  34. package/dist/aura3d-cli/skin/gltf.js.map +1 -0
  35. package/dist/aura3d-cli/skin/rebuildLimbs.d.ts +31 -0
  36. package/dist/aura3d-cli/skin/rebuildLimbs.d.ts.map +1 -0
  37. package/dist/aura3d-cli/skin/rebuildLimbs.js +326 -0
  38. package/dist/aura3d-cli/skin/rebuildLimbs.js.map +1 -0
  39. package/dist/aura3d-cli/skin/refitSkeleton.d.ts +23 -0
  40. package/dist/aura3d-cli/skin/refitSkeleton.d.ts.map +1 -0
  41. package/dist/aura3d-cli/skin/refitSkeleton.js +288 -0
  42. package/dist/aura3d-cli/skin/refitSkeleton.js.map +1 -0
  43. package/dist/aura3d-cli/skin/repair.d.ts +45 -0
  44. package/dist/aura3d-cli/skin/repair.d.ts.map +1 -0
  45. package/dist/aura3d-cli/skin/repair.js +192 -0
  46. package/dist/aura3d-cli/skin/repair.js.map +1 -0
  47. package/dist/create-aura3d/index.js +1 -1
  48. package/dist/engine/agent-api/camera/layers.d.ts.map +1 -1
  49. package/dist/engine/agent-api/camera/layers.js +6 -1
  50. package/dist/engine/agent-api/camera/layers.js.map +1 -1
  51. package/dist/engine/agent-api/compiler/customMaterial.d.ts.map +1 -1
  52. package/dist/engine/agent-api/compiler/customMaterial.js +12 -1
  53. package/dist/engine/agent-api/compiler/customMaterial.js.map +1 -1
  54. package/dist/engine/agent-api/compiler/lines.d.ts.map +1 -1
  55. package/dist/engine/agent-api/compiler/lines.js +8 -6
  56. package/dist/engine/agent-api/compiler/lines.js.map +1 -1
  57. package/dist/engine/agent-api/nodes/types.d.ts +6 -0
  58. package/dist/engine/agent-api/nodes/types.d.ts.map +1 -1
  59. package/dist/engine/agent-api/vfx/effects-api.d.ts.map +1 -1
  60. package/dist/engine/agent-api/vfx/effects-api.js +12 -3
  61. package/dist/engine/agent-api/vfx/effects-api.js.map +1 -1
  62. package/dist/engine/agent-api/vfx/gameEffects.d.ts.map +1 -1
  63. package/dist/engine/agent-api/vfx/gameEffects.js +20 -3
  64. package/dist/engine/agent-api/vfx/gameEffects.js.map +1 -1
  65. package/dist/engine/contracts/camera.d.ts +1 -0
  66. package/dist/engine/contracts/camera.d.ts.map +1 -1
  67. package/dist/engine/contracts/effects.d.ts +4 -2
  68. package/dist/engine/contracts/effects.d.ts.map +1 -1
  69. package/dist/engine/contracts/effects.js.map +1 -1
  70. package/dist/game/index.d.ts +2 -2
  71. package/dist/game/index.d.ts.map +1 -1
  72. package/dist/game/index.js +1 -1
  73. package/dist/game/index.js.map +1 -1
  74. package/dist/game/motion/facing.d.ts +30 -0
  75. package/dist/game/motion/facing.d.ts.map +1 -0
  76. package/dist/game/motion/facing.js +50 -0
  77. package/dist/game/motion/facing.js.map +1 -0
  78. package/dist/game/motion/handBounce.d.ts +251 -0
  79. package/dist/game/motion/handBounce.d.ts.map +1 -0
  80. package/dist/game/motion/handBounce.js +315 -0
  81. package/dist/game/motion/handBounce.js.map +1 -0
  82. package/dist/game/motion/index.d.ts +6 -0
  83. package/dist/game/motion/index.d.ts.map +1 -1
  84. package/dist/game/motion/index.js +3 -0
  85. package/dist/game/motion/index.js.map +1 -1
  86. package/dist/game/motion/twoHandGrip.d.ts +229 -0
  87. package/dist/game/motion/twoHandGrip.d.ts.map +1 -0
  88. package/dist/game/motion/twoHandGrip.js +413 -0
  89. package/dist/game/motion/twoHandGrip.js.map +1 -0
  90. package/dist/game/session/warmPrograms.d.ts +17 -0
  91. package/dist/game/session/warmPrograms.d.ts.map +1 -1
  92. package/dist/game/session/warmPrograms.js +18 -1
  93. package/dist/game/session/warmPrograms.js.map +1 -1
  94. package/dist/physics/ensure.d.ts +2 -0
  95. package/dist/physics/ensure.d.ts.map +1 -0
  96. package/dist/physics/ensure.js +4 -0
  97. package/dist/physics/ensure.js.map +1 -0
  98. package/dist/physics/index.d.ts +1 -0
  99. package/dist/physics/index.d.ts.map +1 -1
  100. package/dist/physics/index.js +1 -0
  101. package/dist/physics/index.js.map +1 -1
  102. package/dist/physics/world.d.ts +1 -0
  103. package/dist/physics/world.d.ts.map +1 -1
  104. package/dist/physics/world.js +1 -0
  105. package/dist/physics/world.js.map +1 -1
  106. package/dist/physics-rapier/index.d.ts +2 -0
  107. package/dist/physics-rapier/index.d.ts.map +1 -1
  108. package/dist/physics-rapier/index.js +12 -10
  109. package/dist/physics-rapier/index.js.map +1 -1
  110. package/dist/physics-rapier/rapierInit.d.ts +6 -0
  111. package/dist/physics-rapier/rapierInit.d.ts.map +1 -0
  112. package/dist/physics-rapier/rapierInit.js +12 -0
  113. package/dist/physics-rapier/rapierInit.js.map +1 -0
  114. package/dist/physics-rapier/rapierInit.lazy.d.ts +6 -0
  115. package/dist/physics-rapier/rapierInit.lazy.d.ts.map +1 -0
  116. package/dist/physics-rapier/rapierInit.lazy.js +19 -0
  117. package/dist/physics-rapier/rapierInit.lazy.js.map +1 -0
  118. package/dist/rendering/DepthPass.d.ts.map +1 -1
  119. package/dist/rendering/DepthPass.js +30 -8
  120. package/dist/rendering/DepthPass.js.map +1 -1
  121. package/dist/rendering/ForwardPass.d.ts.map +1 -1
  122. package/dist/rendering/ForwardPass.js +7 -0
  123. package/dist/rendering/ForwardPass.js.map +1 -1
  124. package/dist/rendering/Renderer.d.ts +0 -2
  125. package/dist/rendering/Renderer.d.ts.map +1 -1
  126. package/dist/rendering/Renderer.js +6 -16
  127. package/dist/rendering/Renderer.js.map +1 -1
  128. package/dist/rendering/contracts/output.d.ts +9 -1
  129. package/dist/rendering/contracts/output.d.ts.map +1 -1
  130. package/dist/rendering/contracts/output.js.map +1 -1
  131. package/dist/rendering/output/OutputPass.d.ts +2 -0
  132. package/dist/rendering/output/OutputPass.d.ts.map +1 -1
  133. package/dist/rendering/output/OutputPass.js +26 -3
  134. package/dist/rendering/output/OutputPass.js.map +1 -1
  135. package/dist/rendering/output/ToneMappingOperators.glsl.d.ts +3 -1
  136. package/dist/rendering/output/ToneMappingOperators.glsl.d.ts.map +1 -1
  137. package/dist/rendering/output/ToneMappingOperators.glsl.js +19 -1
  138. package/dist/rendering/output/ToneMappingOperators.glsl.js.map +1 -1
  139. package/dist/rendering/post/v2Stages.d.ts +2 -7
  140. package/dist/rendering/post/v2Stages.d.ts.map +1 -1
  141. package/dist/rendering/post/v2Stages.js +2 -17
  142. package/dist/rendering/post/v2Stages.js.map +1 -1
  143. package/dist/rendering/post/vignetteColor.d.ts +8 -0
  144. package/dist/rendering/post/vignetteColor.d.ts.map +1 -0
  145. package/dist/rendering/post/vignetteColor.js +18 -0
  146. package/dist/rendering/post/vignetteColor.js.map +1 -0
  147. package/dist/rendering/renderer/PostprocessExecution.d.ts +10 -0
  148. package/dist/rendering/renderer/PostprocessExecution.d.ts.map +1 -1
  149. package/dist/rendering/renderer/PostprocessExecution.js +38 -38
  150. package/dist/rendering/renderer/PostprocessExecution.js.map +1 -1
  151. package/dist/rendering/renderer/coreOutputPostRoute.d.ts +25 -17
  152. package/dist/rendering/renderer/coreOutputPostRoute.d.ts.map +1 -1
  153. package/dist/rendering/renderer/coreOutputPostRoute.js +27 -18
  154. package/dist/rendering/renderer/coreOutputPostRoute.js.map +1 -1
  155. package/dist/rendering/renderer/qrSubFlags.d.ts +1 -1
  156. package/dist/rendering/renderer/qrSubFlags.d.ts.map +1 -1
  157. package/dist/rendering/renderer/qrSubFlags.js +2 -8
  158. package/dist/rendering/renderer/qrSubFlags.js.map +1 -1
  159. package/dist/rendering/shaders/chunks/author/index.d.ts.map +1 -1
  160. package/dist/rendering/shaders/chunks/author/index.js +7 -0
  161. package/dist/rendering/shaders/chunks/author/index.js.map +1 -1
  162. package/dist/rendering/shaders/chunks/author/shadow.glsl.d.ts +11 -0
  163. package/dist/rendering/shaders/chunks/author/shadow.glsl.d.ts.map +1 -0
  164. package/dist/rendering/shaders/chunks/author/shadow.glsl.js +57 -0
  165. package/dist/rendering/shaders/chunks/author/shadow.glsl.js.map +1 -0
  166. package/dist/rendering/shadows/DirectionalCascadeFitter.d.ts +20 -0
  167. package/dist/rendering/shadows/DirectionalCascadeFitter.d.ts.map +1 -1
  168. package/dist/rendering/shadows/DirectionalCascadeFitter.js +80 -7
  169. package/dist/rendering/shadows/DirectionalCascadeFitter.js.map +1 -1
  170. package/dist/rendering/shadows/Prd02DepthShaderLibrary.d.ts.map +1 -1
  171. package/dist/rendering/shadows/Prd02DepthShaderLibrary.js +9 -1
  172. package/dist/rendering/shadows/Prd02DepthShaderLibrary.js.map +1 -1
  173. package/dist/rendering/shadows/ShadowSystem.d.ts.map +1 -1
  174. package/dist/rendering/shadows/ShadowSystem.js +7 -2
  175. package/dist/rendering/shadows/ShadowSystem.js.map +1 -1
  176. package/dist/rendering/webgl2/LdrPostprocessShader.d.ts +2 -0
  177. package/dist/rendering/webgl2/LdrPostprocessShader.d.ts.map +1 -1
  178. package/dist/rendering/webgl2/LdrPostprocessShader.js +25 -3
  179. package/dist/rendering/webgl2/LdrPostprocessShader.js.map +1 -1
  180. package/dist/rendering/webgl2/LegacyPost.d.ts +11 -2
  181. package/dist/rendering/webgl2/LegacyPost.d.ts.map +1 -1
  182. package/dist/rendering/webgl2/LegacyPost.js +191 -16
  183. package/dist/rendering/webgl2/LegacyPost.js.map +1 -1
  184. package/package.json +33 -26
  185. package/templates/cinematic-scene/package.json +2 -2
  186. package/templates/mini-game/package.json +2 -2
  187. package/templates/product-viewer/package.json +2 -2
  188. package/templates/production-asset-inspector/package.json +1 -1
  189. package/templates/production-material-studio/package.json +1 -1
  190. package/templates/production-product-configurator/package.json +1 -1
  191. package/templates/production-product-viewer/package.json +1 -1
@@ -0,0 +1,75 @@
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
+ /** Moves the skeleton onto the mesh and re-targets the clips (see refitSkeleton). */
59
+ readonly refitSkeleton?: boolean;
60
+ /** Keep only these animation clips (the ones the game plays); the rest are dropped from the file. */
61
+ readonly keepClips?: readonly string[];
62
+ readonly materialMap?: RebuildLimbsOptions["materials"];
63
+ readonly out?: string;
64
+ }
65
+ export declare function resolveAssetFile(projectDir: string, target: string): string;
66
+ export declare function parseMaterialMap(raw: string | undefined): RebuildLimbsOptions["materials"] | undefined;
67
+ export declare function runRepairSkin(projectDir: string, target: string, options: RepairSkinCliOptions): {
68
+ readonly ok: boolean;
69
+ readonly out: string;
70
+ readonly messages: readonly string[];
71
+ readonly report: unknown;
72
+ };
73
+ 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). --refit-skeleton moves the joints to where the mesh actually bends and re-targets the clips (for a textured mesh you cannot rebuild); --keep-clips drops the clips the game does not play; --smooth-rounds/--smooth-rings/--smooth-threshold tune --smooth-bridges.";
74
+ export { DEFAULT_SKIN_THRESHOLDS };
75
+ //# 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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"}
@@ -0,0 +1,208 @@
1
+ /** CLI glue for the skin tools: `assets validate --skin`, `assets repair-skin`, the release gate and the allow-list. */
2
+ import { existsSync, readFileSync } from "node:fs";
3
+ import { basename, dirname, extname, join, resolve } from "node:path";
4
+ import { readAssetManifest } from "../asset-manifest.js";
5
+ import { analyzeSkin, DEFAULT_SKIN_THRESHOLDS, SKIN_BIND_MISMATCH, SKIN_FLAP, SKIN_JOINT_RANGE, SKIN_NO_SKIN, SKIN_STRETCH, SKIN_WEIGHT_DISTANT, SKIN_WEIGHT_SUM } from "./analysis.js";
6
+ import { readGlbFile, writeGlbFile } from "./gltf.js";
7
+ import { repairSkin } from "./repair.js";
8
+ import { rebuildLimbs, RebuildLimbsUnsupported } from "./rebuildLimbs.js";
9
+ import { refitSkeleton, RefitUnsupported } from "./refitSkeleton.js";
10
+ export const SKIN_ALLOW_FILE = "aura.skin-allow.json";
11
+ export const ALL_SKIN_CODES = [SKIN_STRETCH, SKIN_FLAP, SKIN_WEIGHT_SUM, SKIN_WEIGHT_DISTANT, SKIN_BIND_MISMATCH, SKIN_JOINT_RANGE, SKIN_NO_SKIN];
12
+ /** `aura.skin-allow.json`: `{ "<assetId>": { "allow": ["SKIN_STRETCH"], "reason": "why this known defect ships" } }`. A reason is required. */
13
+ export function readSkinAllowlist(projectDir) {
14
+ const path = resolve(projectDir, SKIN_ALLOW_FILE);
15
+ if (!existsSync(path))
16
+ return {};
17
+ const raw = JSON.parse(readFileSync(path, "utf8"));
18
+ const out = {};
19
+ for (const [id, entry] of Object.entries(raw)) {
20
+ if (id.startsWith("$"))
21
+ continue;
22
+ if (!entry.reason || entry.reason.trim().length < 8)
23
+ throw new Error(`${SKIN_ALLOW_FILE}: "${id}" needs a reason (what is wrong, where it is tracked).`);
24
+ out[id] = { allow: (entry.allow ?? []), reason: entry.reason };
25
+ }
26
+ return out;
27
+ }
28
+ export function isRiggedGlb(path) {
29
+ if (!existsSync(path) || extname(path).toLowerCase() !== ".glb")
30
+ return false;
31
+ try {
32
+ const buf = readFileSync(path);
33
+ if (buf.length < 24 || buf.readUInt32LE(0) !== 0x46546c67)
34
+ return false;
35
+ return buf.toString("utf8", 20, 20 + buf.readUInt32LE(12)).includes('"skins"');
36
+ }
37
+ catch {
38
+ return false;
39
+ }
40
+ }
41
+ function analysisOptions(options) {
42
+ const thresholds = options.stretchLimit !== undefined ? { stretchLimit: options.stretchLimit } : {};
43
+ return { clips: options.clips, samples: options.samples, thresholds, strict: options.strict, warnOnly: options.warnOnly, ignoreMaterials: options.ignoreMaterials };
44
+ }
45
+ /** Skin check of one asset, with its allow-list entry applied (allowed codes become warnings that carry the reason). */
46
+ export function checkAssetSkin(id, file, options, allow) {
47
+ const report = analyzeSkin(readGlbFile(file), analysisOptions(options));
48
+ const entry = allow[id];
49
+ const allowed = entry?.allow ?? [];
50
+ const blocking = report.findings.filter((f) => f.severity === "error" && !allowed.includes(f.code));
51
+ return { id, file, report, allowed, ...(entry ? { allowReason: entry.reason } : {}), ok: blocking.length === 0 };
52
+ }
53
+ export function checkProjectSkins(projectDir, options = {}) {
54
+ const allow = readSkinAllowlist(projectDir);
55
+ const targets = [];
56
+ if (options.file) {
57
+ targets.push({ id: basename(options.file, extname(options.file)), file: resolve(projectDir, options.file) });
58
+ }
59
+ else {
60
+ const manifest = readAssetManifest(projectDir);
61
+ for (const asset of manifest.assets) {
62
+ if (options.assetIds && !options.assetIds.includes(asset.id))
63
+ continue;
64
+ if (asset.format !== "glb" || !(asset.derived?.outputPath ?? asset.outputPath))
65
+ continue;
66
+ const file = resolve(projectDir, asset.derived?.outputPath ?? asset.outputPath);
67
+ if (isRiggedGlb(file))
68
+ targets.push({ id: asset.id, file });
69
+ }
70
+ }
71
+ const assets = targets.map((t) => checkAssetSkin(t.id, t.file, options, allow));
72
+ const failures = [];
73
+ const warnings = [];
74
+ for (const a of assets) {
75
+ for (const f of a.report.findings) {
76
+ const allowed = a.allowed.includes(f.code);
77
+ if (f.severity === "error" && !allowed)
78
+ failures.push(`${a.id}: ${f.message}`);
79
+ else
80
+ warnings.push(`${a.id}: ${f.message}${allowed ? ` [allowed: ${a.allowReason}]` : ""}`);
81
+ }
82
+ }
83
+ return {
84
+ ok: failures.length === 0, failures, warnings, assets,
85
+ messages: failures.length === 0 ? [`Skin check: ${assets.length} rigged asset(s) passed${warnings.length ? `, ${warnings.length} warning(s)` : ""}.`] : failures
86
+ };
87
+ }
88
+ /** Release gate for `validateAssets` / `check-deploy --release`: failures only, with the allow-list applied. */
89
+ export function skinReleaseFailures(projectDir, asset, allow) {
90
+ if (asset.format !== "glb")
91
+ return { failures: [], warnings: [] };
92
+ const file = resolve(projectDir, asset.derived?.outputPath ?? asset.outputPath);
93
+ if (!isRiggedGlb(file))
94
+ return { failures: [], warnings: [] };
95
+ const result = checkAssetSkin(asset.id, file, { samples: 6 }, allow);
96
+ const failures = [];
97
+ const warnings = [];
98
+ for (const f of result.report.findings) {
99
+ if (f.severity === "error" && !result.allowed.includes(f.code))
100
+ failures.push(`${asset.id}: ${f.message}`);
101
+ else if (result.allowed.includes(f.code))
102
+ warnings.push(`${asset.id}: skin finding allowed (${result.allowReason}): ${f.code}`);
103
+ }
104
+ return { failures, warnings };
105
+ }
106
+ export function formatSkinReport(report, label) {
107
+ const lines = [];
108
+ lines.push(`${report.ok ? "PASS" : "FAIL"} ${label}${report.skinned ? ` (height ${report.modelHeight} m, ${report.clips.length} clip(s) x ${report.samplesPerClip} poses)` : " (no skinned mesh)"}`);
109
+ if (report.skinned) {
110
+ lines.push(" material tris max stretch over limit flaps");
111
+ for (const [name, m] of Object.entries(report.materials))
112
+ lines.push(` ${name.slice(0, 38).padEnd(38)} ${String(m.triangles).padStart(6)} ${`${m.maxStretch}x`.padStart(11)} ${String(m.trianglesOverLimit).padStart(10)} ${String(m.flaps).padStart(5)}`);
113
+ if (report.bindMismatch.length)
114
+ lines.push(` bind-pose mismatch (${SKIN_BIND_MISMATCH}): ${report.bindMismatch.map((b) => `${b.bone} ${Math.round(b.ratio * 100)}% off-axis`).join(", ")}`);
115
+ if (report.jointRanges) {
116
+ const worstKnee = Math.max(...Object.values(report.jointRanges).map((r) => r.kneeMax));
117
+ lines.push(` humanoid joint ranges: ${Object.keys(report.jointRanges).length} clip(s), knee max ${worstKnee} deg`);
118
+ }
119
+ }
120
+ for (const f of report.findings)
121
+ lines.push(` ${f.severity === "error" ? "ERROR" : "warn "} ${f.message}`);
122
+ return lines.join("\n");
123
+ }
124
+ export function formatProjectSkinReport(report) {
125
+ const lines = report.assets.map((a) => formatSkinReport(a.report, a.id) + (a.allowed.length ? `\n allowed (${a.allowed.join(", ")}): ${a.allowReason}` : ""));
126
+ lines.push("", report.messages.join("\n"));
127
+ return lines.join("\n");
128
+ }
129
+ export function resolveAssetFile(projectDir, target) {
130
+ const direct = resolve(projectDir, target);
131
+ if (existsSync(direct) && extname(direct))
132
+ return direct;
133
+ const manifest = readAssetManifest(projectDir);
134
+ const asset = manifest.assets.find((a) => a.id === target);
135
+ if (!asset)
136
+ throw new Error(`repair-skin: "${target}" is neither a .glb file nor an asset id in the manifest.`);
137
+ return resolve(projectDir, asset.derived?.outputPath ?? asset.outputPath);
138
+ }
139
+ export function parseMaterialMap(raw) {
140
+ if (!raw)
141
+ return undefined;
142
+ const map = {};
143
+ for (const pair of raw.split(",")) {
144
+ const [role, pattern] = pair.split("=");
145
+ if (role && pattern)
146
+ map[role.trim()] = new RegExp(pattern.trim(), "i");
147
+ }
148
+ return map;
149
+ }
150
+ export function runRepairSkin(projectDir, target, options) {
151
+ const file = resolveAssetFile(projectDir, target);
152
+ let glb = readGlbFile(file);
153
+ const messages = [];
154
+ let rebuild;
155
+ if (options.keepClips && options.keepClips.length > 0) {
156
+ const keep = new Set(options.keepClips);
157
+ const all = glb.json.animations ?? [];
158
+ const missing = options.keepClips.filter((c) => !all.some((a) => a.name === c));
159
+ if (missing.length > 0)
160
+ return { ok: false, out: "", messages: [`--keep-clips: ${missing.join(", ")} not found in ${basename(file)} (clips: ${all.map((a) => a.name).join(", ")}).`], report: null };
161
+ glb = { json: { ...glb.json, animations: all.filter((a) => keep.has(a.name ?? "")) }, bin: glb.bin };
162
+ messages.push(`kept ${options.keepClips.length} of ${all.length} clips (${options.keepClips.join(", ")})`);
163
+ }
164
+ if (options.refitSkeleton) {
165
+ try {
166
+ const refit = refitSkeleton(glb);
167
+ glb = refit.glb;
168
+ messages.push(`refitted the skeleton to the mesh (${refit.report.moved.length} joints moved${refit.report.fallback.length ? `, ${refit.report.fallback.join("/")} followed their parent` : ""}) and re-targeted ${refit.report.clips} clip(s)`);
169
+ }
170
+ catch (error) {
171
+ if (error instanceof RefitUnsupported)
172
+ return { ok: false, out: "", messages: [error.message], report: null };
173
+ throw error;
174
+ }
175
+ }
176
+ if (options.rebuildLimbs) {
177
+ try {
178
+ const rebuilt = rebuildLimbs(glb, { materials: options.materialMap });
179
+ glb = rebuilt.glb;
180
+ rebuild = rebuilt.report;
181
+ messages.push(`rebuilt the legs in the skeleton's pose (scale ${rebuilt.report.scale}): ${rebuilt.report.primitives.map((p) => `${p.material} -${p.removedTriangles}/+${p.addedTriangles} tris`).join(", ")}`);
182
+ }
183
+ catch (error) {
184
+ if (error instanceof RebuildLimbsUnsupported)
185
+ return { ok: false, out: "", messages: [error.message], report: null };
186
+ throw error;
187
+ }
188
+ }
189
+ const generic = options.normalize || options.pruneDistant || options.smoothBridges || options.cutStretch !== undefined;
190
+ const repaired = repairSkin(glb, { ...options });
191
+ const final = generic ? repaired.glb : glb;
192
+ const out = resolve(projectDir, options.out ?? join(dirname(file), `${basename(file, extname(file))}.repaired.glb`));
193
+ const { bytes } = writeGlbFile(out, final);
194
+ const after = generic ? repaired.report.after : analyzeSkin(final, { clips: options.clips, samples: options.samples });
195
+ messages.push(`wrote ${out} (${bytes} bytes)`);
196
+ messages.push(after.ok ? "skin check passes after repair" : `skin check still fails after repair: ${after.reasonCodes.join(", ")}`);
197
+ for (const g of repaired.report.guidance)
198
+ messages.push(g);
199
+ messages.push("Re-admit the repaired file with `aura3d assets add` (it gets a new hash); do not edit the manifest by hand.");
200
+ return { ok: after.ok, out, messages, report: { before: repaired.report.before, after, rebuild, steps: repaired.report.steps } };
201
+ }
202
+ export 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]
203
+ 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}).
204
+ Known defects that ship are listed with a reason in ${SKIN_ALLOW_FILE}.
205
+ aura3d 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]
206
+ 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). --refit-skeleton moves the joints to where the mesh actually bends and re-targets the clips (for a textured mesh you cannot rebuild); --keep-clips drops the clips the game does not play; --smooth-rounds/--smooth-rings/--smooth-threshold tune --smooth-bridges.`;
207
+ export { DEFAULT_SKIN_THRESHOLDS };
208
+ //# sourceMappingURL=command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command.js","sourceRoot":"","sources":["../../../../../packages/aura3d-cli/src/skin/command.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /** Copy-on-write GLB editing for the skin repair tools: append accessors, replace primitive attributes, repack the binary. */
2
+ import type { GlbData, GltfJson } from "./gltf.js";
3
+ export declare class GlbEditor {
4
+ readonly json: GltfJson;
5
+ bin: Buffer;
6
+ constructor(source: GlbData);
7
+ /** Appends a typed array as a new buffer view + accessor and returns the accessor index. */
8
+ addAccessor(values: ArrayLike<number>, componentType: 5123 | 5125 | 5126, type: "SCALAR" | "VEC2" | "VEC3" | "VEC4" | "MAT4", target: 34962 | 34963 | undefined, bounds?: boolean): number;
9
+ primitive(meshIndex: number, primitiveIndex: number): NonNullable<GltfJson["meshes"]>[number]["primitives"][number];
10
+ /** Repacks the binary chunk without accessors, buffer views and bytes no primitive, animation or skin references any more. */
11
+ finish(): GlbData;
12
+ }
13
+ export declare function compactGlb(glb: GlbData): GlbData;
14
+ //# sourceMappingURL=glbEdit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glbEdit.d.ts","sourceRoot":"","sources":["../../../../../packages/aura3d-cli/src/skin/glbEdit.ts"],"names":[],"mappings":"AAAA,8HAA8H;AAC9H,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAKnD,qBAAa,SAAS;IACpB,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,GAAG,EAAE,MAAM,CAAC;gBAEA,MAAM,EAAE,OAAO;IAK3B,4FAA4F;IAC5F,WAAW,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,EAAE,aAAa,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,EAAE,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,MAAM,EAAE,KAAK,GAAG,KAAK,GAAG,SAAS,EAAE,MAAM,UAAQ,GAAG,MAAM;IA0BxL,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC;IAMnH,8HAA8H;IAC9H,MAAM,IAAI,OAAO;CAGlB;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAiEhD"}
@@ -0,0 +1,152 @@
1
+ const SIZE = { 5120: 1, 5121: 1, 5122: 2, 5123: 2, 5125: 4, 5126: 4 };
2
+ const NCOMP = { SCALAR: 1, VEC2: 2, VEC3: 3, VEC4: 4, MAT2: 4, MAT3: 9, MAT4: 16 };
3
+ export class GlbEditor {
4
+ json;
5
+ bin;
6
+ constructor(source) {
7
+ this.json = JSON.parse(JSON.stringify(source.json));
8
+ this.bin = Buffer.from(source.bin);
9
+ }
10
+ /** Appends a typed array as a new buffer view + accessor and returns the accessor index. */
11
+ addAccessor(values, componentType, type, target, bounds = false) {
12
+ const comps = NCOMP[type] ?? 1;
13
+ const count = Math.floor(values.length / comps);
14
+ const size = SIZE[componentType] ?? 4;
15
+ const pad = (4 - (this.bin.length % 4)) % 4;
16
+ if (pad)
17
+ this.bin = Buffer.concat([this.bin, Buffer.alloc(pad)]);
18
+ const offset = this.bin.length;
19
+ const buf = Buffer.alloc(values.length * size);
20
+ for (let i = 0; i < values.length; i += 1) {
21
+ const v = values[i] ?? 0;
22
+ if (componentType === 5126)
23
+ buf.writeFloatLE(v, i * 4);
24
+ else if (componentType === 5123)
25
+ buf.writeUInt16LE(v, i * 2);
26
+ else
27
+ buf.writeUInt32LE(v, i * 4);
28
+ }
29
+ this.bin = Buffer.concat([this.bin, buf]);
30
+ this.json.bufferViews.push({ buffer: 0, byteOffset: offset, byteLength: buf.length, ...(target ? { target } : {}) });
31
+ const accessor = { bufferView: this.json.bufferViews.length - 1, componentType, count, type };
32
+ if (bounds && comps === 3) {
33
+ const min = [Infinity, Infinity, Infinity], max = [-Infinity, -Infinity, -Infinity];
34
+ for (let i = 0; i < count; i += 1)
35
+ for (let a = 0; a < 3; a += 1) {
36
+ const v = values[i * 3 + a] ?? 0;
37
+ min[a] = Math.min(min[a], v);
38
+ max[a] = Math.max(max[a], v);
39
+ }
40
+ accessor.min = min;
41
+ accessor.max = max;
42
+ }
43
+ this.json.accessors.push(accessor);
44
+ return this.json.accessors.length - 1;
45
+ }
46
+ primitive(meshIndex, primitiveIndex) {
47
+ const prim = this.json.meshes?.[meshIndex]?.primitives[primitiveIndex];
48
+ if (!prim)
49
+ throw new Error(`primitive ${meshIndex}/${primitiveIndex} does not exist`);
50
+ return prim;
51
+ }
52
+ /** Repacks the binary chunk without accessors, buffer views and bytes no primitive, animation or skin references any more. */
53
+ finish() {
54
+ return compactGlb({ json: this.json, bin: this.bin });
55
+ }
56
+ }
57
+ export function compactGlb(glb) {
58
+ const json = JSON.parse(JSON.stringify(glb.json));
59
+ const used = new Set();
60
+ for (const mesh of json.meshes ?? [])
61
+ for (const p of mesh.primitives) {
62
+ for (const v of Object.values(p.attributes))
63
+ used.add(v);
64
+ if (p.indices !== undefined)
65
+ used.add(p.indices);
66
+ for (const t of p.targets ?? [])
67
+ for (const v of Object.values(t))
68
+ used.add(v);
69
+ }
70
+ for (const an of json.animations ?? [])
71
+ for (const sm of an.samplers) {
72
+ used.add(sm.input);
73
+ used.add(sm.output);
74
+ }
75
+ for (const sk of json.skins ?? [])
76
+ if (sk.inverseBindMatrices !== undefined)
77
+ used.add(sk.inverseBindMatrices);
78
+ const keepOther = new Set();
79
+ // Accessors referenced from elsewhere (images use bufferViews directly, not accessors) are left alone: only the accessor table is compacted.
80
+ const order = [...used].sort((a, b) => a - b);
81
+ const map = new Map(order.map((old, i) => [old, i]));
82
+ const accessors = order.map((old) => ({ ...json.accessors[old] }));
83
+ for (const mesh of json.meshes ?? [])
84
+ for (const p of mesh.primitives) {
85
+ for (const k of Object.keys(p.attributes))
86
+ p.attributes[k] = map.get(p.attributes[k]);
87
+ if (p.indices !== undefined)
88
+ p.indices = map.get(p.indices);
89
+ for (const t of p.targets ?? [])
90
+ for (const k of Object.keys(t))
91
+ t[k] = map.get(t[k]);
92
+ }
93
+ for (const an of json.animations ?? [])
94
+ for (const sm of an.samplers) {
95
+ sm.input = map.get(sm.input);
96
+ sm.output = map.get(sm.output);
97
+ }
98
+ for (const sk of json.skins ?? [])
99
+ if (sk.inverseBindMatrices !== undefined)
100
+ sk.inverseBindMatrices = map.get(sk.inverseBindMatrices);
101
+ json.accessors = accessors;
102
+ void keepOther;
103
+ const parts = [];
104
+ const views = [];
105
+ let offset = 0;
106
+ const push = (bytes, extra) => {
107
+ const pad = (4 - (offset % 4)) % 4;
108
+ if (pad) {
109
+ parts.push(Buffer.alloc(pad));
110
+ offset += pad;
111
+ }
112
+ parts.push(bytes);
113
+ views.push({ buffer: 0, byteOffset: offset, byteLength: bytes.length, ...extra });
114
+ offset += bytes.length;
115
+ return views.length - 1;
116
+ };
117
+ // Buffer views used by images (and anything else that is not an accessor) must survive: copy them first and remap.
118
+ const viewMap = new Map();
119
+ const copyView = (index) => {
120
+ const known = viewMap.get(index);
121
+ if (known !== undefined)
122
+ return known;
123
+ const bv = json.bufferViews[index];
124
+ const start = bv.byteOffset ?? 0;
125
+ const created = push(glb.bin.subarray(start, start + bv.byteLength), { ...(bv.byteStride ? { byteStride: bv.byteStride } : {}), ...(bv.target ? { target: bv.target } : {}) });
126
+ viewMap.set(index, created);
127
+ return created;
128
+ };
129
+ const images = (json.images ?? []);
130
+ for (const image of images)
131
+ if (image.bufferView !== undefined)
132
+ image.bufferView = copyView(image.bufferView);
133
+ for (const a of accessors) {
134
+ if (a.bufferView === undefined)
135
+ continue;
136
+ const bv = json.bufferViews[a.bufferView];
137
+ if (bv.byteStride) {
138
+ a.bufferView = copyView(a.bufferView);
139
+ }
140
+ else {
141
+ const len = a.count * (SIZE[a.componentType] ?? 4) * (NCOMP[a.type] ?? 1);
142
+ const start = (bv.byteOffset ?? 0) + (a.byteOffset ?? 0);
143
+ a.bufferView = push(glb.bin.subarray(start, start + len), bv.target ? { target: bv.target } : {});
144
+ delete a.byteOffset;
145
+ }
146
+ }
147
+ json.bufferViews = views;
148
+ const bin = Buffer.concat(parts);
149
+ json.buffers[0] = { ...(json.buffers[0] ?? {}), byteLength: bin.length };
150
+ return { json, bin };
151
+ }
152
+ //# sourceMappingURL=glbEdit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glbEdit.js","sourceRoot":"","sources":["../../../../../packages/aura3d-cli/src/skin/glbEdit.ts"],"names":[],"mappings":"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"}