@forgeax/engine-gltf 0.1.3 → 0.1.6

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 (41) hide show
  1. package/README.md +18 -11
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/__tests__/extension-admission.unit.test.d.ts +2 -0
  4. package/dist/__tests__/extension-admission.unit.test.d.ts.map +1 -0
  5. package/dist/__tests__/source-key-diagnostics.integration.test.d.ts +2 -0
  6. package/dist/__tests__/source-key-diagnostics.integration.test.d.ts.map +1 -0
  7. package/dist/bridge.d.ts +5 -6
  8. package/dist/bridge.d.ts.map +1 -1
  9. package/dist/check-extensions.d.ts.map +1 -1
  10. package/dist/cli-gltf.mjs +32 -16
  11. package/dist/cli-gltf.mjs.map +1 -1
  12. package/dist/gltf-importer.d.ts.map +1 -1
  13. package/dist/importer-entry.mjs +14 -3
  14. package/dist/importer-entry.mjs.map +1 -1
  15. package/dist/index.d.ts +1 -1
  16. package/dist/index.d.ts.map +1 -1
  17. package/dist/index.mjs +40 -12
  18. package/dist/index.mjs.map +1 -1
  19. package/dist/node-file-entry.mjs +5 -1
  20. package/dist/node-file-entry.mjs.map +1 -1
  21. package/dist/parse-gltf.d.ts.map +1 -1
  22. package/dist/source-key.d.ts +26 -4
  23. package/dist/source-key.d.ts.map +1 -1
  24. package/package.json +13 -15
  25. package/src/__tests__/extension-admission.unit.test.ts +19 -0
  26. package/src/__tests__/gltf.unit.test.ts +1 -1
  27. package/src/__tests__/material-texture-transform.unit.test.ts +30 -0
  28. package/src/__tests__/meshopt-real-matrix.integration.test.ts +108 -24
  29. package/src/__tests__/morph-import.integration.test.ts +31 -44
  30. package/src/__tests__/source-key-diagnostics.integration.test.ts +140 -0
  31. package/src/__tests__/source-key-producer.integration.test.ts +10 -2
  32. package/src/bridge.ts +9 -10
  33. package/src/check-extensions.ts +8 -4
  34. package/src/cli-gltf.ts +1 -6
  35. package/src/gltf-importer.ts +13 -4
  36. package/src/index.ts +1 -0
  37. package/src/parse-gltf.ts +7 -5
  38. package/src/source-key.ts +51 -17
  39. package/dist/__tests__/asset-runtime-fixture.d.ts +0 -14
  40. package/dist/__tests__/asset-runtime-fixture.d.ts.map +0 -1
  41. package/src/__tests__/asset-runtime-fixture.ts +0 -278
package/dist/index.d.ts CHANGED
@@ -18,7 +18,7 @@ export type { GltfHeaderJson } from './parse-gltf-header.js';
18
18
  export type { GltfDocItem, GltfMetaJson, GltfSubAssetEntry, ReimportReuseResult, ReimportReuseValue, SubAssetKey, } from './reimport-reuse-meta.js';
19
19
  export { reimportReuseMeta, subAssetKey, } from './reimport-reuse-meta.js';
20
20
  export { serializeMetaJson } from './serialize-meta.js';
21
- export type { GltfSourceKeyError, GltfSourceKeyErrorCode, GltfSourceKeyResult, } from './source-key.js';
21
+ export type { GltfSourceKeyConflictEntry, GltfSourceKeyError, GltfSourceKeyErrorCode, GltfSourceKeyResult, } from './source-key.js';
22
22
  export { deriveGltfSourceKeys, sourceKeyForGltfOutput } from './source-key.js';
23
23
  export type { DecomposedTransform, NodeTransformJson, TransformDiagnostics, Vec3Tuple, Vec4Tuple, } from './transform.js';
24
24
  export { decomposeNodeTransform } from './transform.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAkBA,YAAY,EACV,mBAAmB,EACnB,gBAAgB,EAChB,mBAAmB,EACnB,WAAW,EACX,OAAO,EACP,cAAc,EACd,cAAc,EACd,QAAQ,EACR,WAAW,EACX,OAAO,EACP,sBAAsB,EACtB,UAAU,GACX,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EACV,YAAY,EACZ,YAAY,EACZ,cAAc,EACd,eAAe,EACf,mBAAmB,EACnB,eAAe,GAChB,MAAM,+BAA+B,CAAC;AAEvC,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/E,YAAY,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAC3E,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,YAAY,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAK5E,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACtF,YAAY,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAEvF,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC7E,YAAY,EACV,8BAA8B,EAC9B,yCAAyC,EACzC,2BAA2B,EAC3B,gCAAgC,EAChC,kCAAkC,EAClC,SAAS,EACT,aAAa,EACb,eAAe,EACf,8BAA8B,EAC9B,4BAA4B,EAC5B,8BAA8B,EAC9B,iCAAiC,EACjC,yBAAyB,EACzB,qBAAqB,EACrB,sBAAsB,EACtB,0BAA0B,EAC1B,4BAA4B,EAC5B,gCAAgC,EAChC,8BAA8B,EAC9B,2BAA2B,EAC3B,4BAA4B,EAC5B,MAAM,GACP,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,GAAG,EAAE,gBAAgB,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAGjE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,YAAY,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAEvD,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxE,YAAY,EACV,cAAc,EACd,aAAa,EACb,mBAAmB,EACnB,iBAAiB,EACjB,OAAO,EACP,WAAW,EACX,cAAc,EACd,UAAU,EACV,UAAU,EACV,uBAAuB,EACvB,0BAA0B,EAC1B,aAAa,EACb,WAAW,EACX,iBAAiB,EACjB,aAAa,EACb,sBAAsB,EACtB,QAAQ,EACR,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AASnE,YAAY,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,YAAY,EACV,WAAW,EACX,YAAY,EACZ,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,EAClB,WAAW,GACZ,MAAM,0BAA0B,CAAC;AAElC,OAAO,EACL,iBAAiB,EACjB,WAAW,GACZ,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,YAAY,EACV,kBAAkB,EAClB,sBAAsB,EACtB,mBAAmB,GACpB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAC/E,YAAY,EACV,mBAAmB,EACnB,iBAAiB,EACjB,oBAAoB,EACpB,SAAS,EACT,SAAS,GACV,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAkBA,YAAY,EACV,mBAAmB,EACnB,gBAAgB,EAChB,mBAAmB,EACnB,WAAW,EACX,OAAO,EACP,cAAc,EACd,cAAc,EACd,QAAQ,EACR,WAAW,EACX,OAAO,EACP,sBAAsB,EACtB,UAAU,GACX,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EACV,YAAY,EACZ,YAAY,EACZ,cAAc,EACd,eAAe,EACf,mBAAmB,EACnB,eAAe,GAChB,MAAM,+BAA+B,CAAC;AAEvC,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/E,YAAY,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAC3E,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,YAAY,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAK5E,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACtF,YAAY,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAEvF,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC7E,YAAY,EACV,8BAA8B,EAC9B,yCAAyC,EACzC,2BAA2B,EAC3B,gCAAgC,EAChC,kCAAkC,EAClC,SAAS,EACT,aAAa,EACb,eAAe,EACf,8BAA8B,EAC9B,4BAA4B,EAC5B,8BAA8B,EAC9B,iCAAiC,EACjC,yBAAyB,EACzB,qBAAqB,EACrB,sBAAsB,EACtB,0BAA0B,EAC1B,4BAA4B,EAC5B,gCAAgC,EAChC,8BAA8B,EAC9B,2BAA2B,EAC3B,4BAA4B,EAC5B,MAAM,GACP,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,GAAG,EAAE,gBAAgB,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAGjE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,YAAY,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAEvD,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxE,YAAY,EACV,cAAc,EACd,aAAa,EACb,mBAAmB,EACnB,iBAAiB,EACjB,OAAO,EACP,WAAW,EACX,cAAc,EACd,UAAU,EACV,UAAU,EACV,uBAAuB,EACvB,0BAA0B,EAC1B,aAAa,EACb,WAAW,EACX,iBAAiB,EACjB,aAAa,EACb,sBAAsB,EACtB,QAAQ,EACR,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AASnE,YAAY,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,YAAY,EACV,WAAW,EACX,YAAY,EACZ,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,EAClB,WAAW,GACZ,MAAM,0BAA0B,CAAC;AAElC,OAAO,EACL,iBAAiB,EACjB,WAAW,GACZ,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,YAAY,EACV,0BAA0B,EAC1B,kBAAkB,EAClB,sBAAsB,EACtB,mBAAmB,GACpB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAC/E,YAAY,EACV,mBAAmB,EACnB,iBAAiB,EACjB,oBAAoB,EACpB,SAAS,EACT,SAAS,GACV,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC"}
package/dist/index.mjs CHANGED
@@ -3,7 +3,7 @@ export { err, ok } from '@forgeax/engine-types';
3
3
  import { packInterleavedVertexAttributes } from '@forgeax/engine-geometry';
4
4
  import { box3, mat4, vec3, quat } from '@forgeax/engine-math';
5
5
  import { AssetGuid } from '@forgeax/engine-pack/guid';
6
- import { packMeshBinV4 } from '@forgeax/engine-import';
6
+ import { packMeshBinV4 } from '@forgeax/engine-import/mesh-bin';
7
7
  import { deriveAnimationTargetId } from '@forgeax/engine-animation/target-id';
8
8
 
9
9
  // src/errors.ts
@@ -955,7 +955,11 @@ var EXTENSION_ALLOWLIST = [
955
955
  "EXT_mesh_gpu_instancing",
956
956
  "EXT_meshopt_compression"
957
957
  ];
958
- var SUPPORTED_EXTENSIONS = [...EXTENSION_ALLOWLIST, "KHR_lights_punctual"];
958
+ var SUPPORTED_EXTENSIONS = [
959
+ ...EXTENSION_ALLOWLIST,
960
+ "KHR_lights_punctual",
961
+ "KHR_texture_transform"
962
+ ];
959
963
  function checkExtensions(json) {
960
964
  const required = json.extensionsRequired ?? [];
961
965
  for (const ext of required) {
@@ -1812,9 +1816,9 @@ function deriveGltfSourceKeys(items) {
1812
1816
  ok: false,
1813
1817
  error: {
1814
1818
  code: "missing-source-key",
1815
- sourceIndices: missing,
1816
1819
  expected: "every glTF output needs a stable semantic kind or name",
1817
- hint: "publish a semantic kind/name key; do not use sourceIndex"
1820
+ hint: "publish a semantic kind/name key; do not use sourceIndex",
1821
+ detail: { sourceIndices: missing }
1818
1822
  }
1819
1823
  };
1820
1824
  }
@@ -1822,19 +1826,34 @@ function deriveGltfSourceKeys(items) {
1822
1826
  for (let index = 0; index < keys.length; index++) {
1823
1827
  const key = keys[index];
1824
1828
  if (key === void 0) continue;
1829
+ const current = items[index];
1830
+ if (current === void 0) continue;
1825
1831
  const prior = seen.get(key);
1826
1832
  if (prior !== void 0) {
1833
+ const entry = (item) => {
1834
+ const name = item.name?.trim();
1835
+ return {
1836
+ kind: item.kind.trim(),
1837
+ name: name === void 0 || name.length === 0 ? null : name,
1838
+ sourceIndex: item.sourceIndex
1839
+ };
1840
+ };
1841
+ const ambiguous = key === current.kind.trim();
1827
1842
  return {
1828
1843
  ok: false,
1829
1844
  error: {
1830
- code: key === items[index]?.kind ? "ambiguous-source-key" : "duplicate-source-key",
1831
- sourceIndices: [prior, items[index]?.sourceIndex ?? 0],
1845
+ code: ambiguous ? "ambiguous-source-key" : "duplicate-source-key",
1832
1846
  expected: "sourceKey values must be unique within one glTF package",
1833
- hint: key === items[index]?.kind ? "name each otherwise anonymous output; do not use sourceIndex" : "rename duplicate outputs before publishing topology facts"
1847
+ hint: ambiguous ? "name each otherwise anonymous output; do not use sourceIndex" : "rename duplicate outputs before publishing topology facts",
1848
+ detail: {
1849
+ key,
1850
+ sourceIndices: [prior.sourceIndex, current.sourceIndex],
1851
+ entries: [entry(prior), entry(current)]
1852
+ }
1834
1853
  }
1835
1854
  };
1836
1855
  }
1837
- seen.set(key, items[index]?.sourceIndex ?? 0);
1856
+ seen.set(key, current);
1838
1857
  }
1839
1858
  return { ok: true, keys, conflicts: [] };
1840
1859
  }
@@ -2931,10 +2950,12 @@ function toAssetPack(doc, existingMeta, source) {
2931
2950
  if (!reconciled.ok) {
2932
2951
  return err({
2933
2952
  code: "mesh-material-slot-topology-change",
2934
- sourceIndices: reconciled.error.nextIndices,
2935
- previousIndices: reconciled.error.previousIndices,
2936
2953
  expected: `unambiguous material slot identity for mesh ${meshOutput.guid}`,
2937
- hint: reconciled.error.hint
2954
+ hint: reconciled.error.hint,
2955
+ detail: {
2956
+ sourceIndices: reconciled.error.nextIndices,
2957
+ previousIndices: reconciled.error.previousIndices
2958
+ }
2938
2959
  });
2939
2960
  }
2940
2961
  sourceOverrides[meshOutput.sourceKey] = {
@@ -2972,6 +2993,9 @@ function toAssetPack(doc, existingMeta, source) {
2972
2993
  function isGlbBytes(source) {
2973
2994
  return source.toLowerCase().endsWith(".glb");
2974
2995
  }
2996
+ function publishesCatalogProduct(input) {
2997
+ return input.importSettings.geometry !== "procedural";
2998
+ }
2975
2999
  function previousMaterialSlotTopology(ctx, meshSourceKey) {
2976
3000
  if (meshSourceKey === void 0) return void 0;
2977
3001
  const value = ctx.sourceOverrides?.[meshSourceKey]?.materialSlots;
@@ -3618,7 +3642,11 @@ async function importGltf(ctx, meshopt) {
3618
3642
  return { ok: true, value: { assets: out, sourceDependencies: [] } };
3619
3643
  }
3620
3644
  function createGltfImporter(meshopt) {
3621
- return { key: "gltf", import: (ctx) => importGltf(ctx) };
3645
+ return {
3646
+ key: "gltf",
3647
+ import: (ctx) => importGltf(ctx),
3648
+ capabilities: { catalog: { publish: publishesCatalogProduct } }
3649
+ };
3622
3650
  }
3623
3651
  var gltfImporter = createGltfImporter();
3624
3652