@forgeax/engine-gltf 0.1.20 → 0.1.23

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 (49) hide show
  1. package/README.md +59 -0
  2. package/dist/__tests__/lod-import.integration.test.d.ts +2 -0
  3. package/dist/__tests__/lod-import.integration.test.d.ts.map +1 -0
  4. package/dist/__tests__/lod-meta-publication.integration.test.d.ts +2 -0
  5. package/dist/__tests__/lod-meta-publication.integration.test.d.ts.map +1 -0
  6. package/dist/check-extensions.d.ts.map +1 -1
  7. package/dist/cli-gltf.mjs +183 -8
  8. package/dist/cli-gltf.mjs.map +1 -1
  9. package/dist/errors.d.ts +6 -0
  10. package/dist/errors.d.ts.map +1 -1
  11. package/dist/gltf-importer.d.ts.map +1 -1
  12. package/dist/importer-entry.mjs +145 -3
  13. package/dist/importer-entry.mjs.map +1 -1
  14. package/dist/index.d.ts +2 -0
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.mjs +238 -6
  17. package/dist/index.mjs.map +1 -1
  18. package/dist/lod/parse-lod.d.ts +15 -0
  19. package/dist/lod/parse-lod.d.ts.map +1 -0
  20. package/dist/lod/project-meta.d.ts +23 -0
  21. package/dist/lod/project-meta.d.ts.map +1 -0
  22. package/dist/node-file-entry.mjs +86 -2
  23. package/dist/node-file-entry.mjs.map +1 -1
  24. package/dist/parse-gltf.d.ts +3 -1
  25. package/dist/parse-gltf.d.ts.map +1 -1
  26. package/dist/reimport-reuse-meta.d.ts +1 -1
  27. package/dist/reimport-reuse-meta.d.ts.map +1 -1
  28. package/package.json +12 -12
  29. package/src/__tests__/fixtures/lod/core-only.gltf +1 -0
  30. package/src/__tests__/fixtures/lod/msft-lod-malformed.gltf +1 -0
  31. package/src/__tests__/fixtures/lod/msft-lod-multi-root.gltf +1 -0
  32. package/src/__tests__/fixtures/lod/msft-lod-node-extras.gltf +1 -0
  33. package/src/__tests__/fixtures/lod/msft-lod.gltf +1 -0
  34. package/src/__tests__/gltf-error-derived-views.test-d.ts +4 -0
  35. package/src/__tests__/gltf.unit.test.ts +12 -3
  36. package/src/__tests__/lod-import.integration.test.ts +106 -0
  37. package/src/__tests__/lod-meta-publication.integration.test.ts +24 -0
  38. package/src/__tests__/parse-gltf.unit.test.ts +22 -0
  39. package/src/__tests__/source-key-producer.integration.test.ts +6 -2
  40. package/src/bridge.ts +1 -1
  41. package/src/check-extensions.ts +2 -0
  42. package/src/errors.ts +11 -0
  43. package/src/gltf-importer.ts +87 -1
  44. package/src/index.ts +2 -0
  45. package/src/lod/parse-lod.ts +129 -0
  46. package/src/lod/project-meta.ts +48 -0
  47. package/src/parse-gltf.ts +97 -1
  48. package/src/reimport-reuse-meta.ts +3 -1
  49. package/dist/.tsbuildinfo +0 -1
package/dist/errors.d.ts CHANGED
@@ -27,6 +27,11 @@ export interface GltfExtensionUnsupportedDetail {
27
27
  readonly extension: string;
28
28
  readonly source: 'extensionsRequired' | 'extensionsUsed';
29
29
  }
30
+ export interface GltfLodInvalidDetail {
31
+ readonly rootNode: number;
32
+ readonly ids: readonly number[];
33
+ readonly reason: 'missing-node' | 'duplicate-node' | 'not-integer' | 'coverage';
34
+ }
30
35
  export interface GltfMaterialTransmissionInvalidDetail {
31
36
  readonly extension: 'KHR_materials_transmission' | 'KHR_materials_ior' | 'KHR_materials_volume';
32
37
  readonly field: string;
@@ -175,6 +180,7 @@ interface DetailFor {
175
180
  readonly 'gltf-version-unsupported': GltfVersionUnsupportedDetail;
176
181
  readonly 'gltf-buffer-out-of-bounds': GltfBufferOutOfBoundsDetail;
177
182
  readonly 'gltf-extension-unsupported': GltfExtensionUnsupportedDetail;
183
+ readonly 'gltf-lod-invalid': GltfLodInvalidDetail;
178
184
  readonly 'gltf-accessor-type-mismatch': GltfAccessorTypeMismatchDetail;
179
185
  readonly 'gltf-texture-load-failed': GltfTextureLoadFailedDetail;
180
186
  readonly 'gltf-meta-missing': GltfMetaMissingDetail;
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"gltf-importer.d.ts","sourceRoot":"","sources":["../src/gltf-importer.ts"],"names":[],"mappings":"AAoCA,OAAO,KAAK,EAEV,QAAQ,EAIR,QAAQ,EAMT,MAAM,uBAAuB,CAAC;AAiB/B,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,qBAAqB,CAAC;AAC1E,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAqB,MAAM,iBAAiB,CAAC;AAwTlF,iFAAiF;AACjF,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,cAAc,EACnB,GAAG,EAAE,OAAO,EACZ,kBAAkB,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,EAC/C,kBAAkB,GAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAa,GAC1D,SAAS,QAAQ,EAAE,CAiCrB;AA+hBD;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,CAAC,EAAE,8BAA8B,GAAG,QAAQ,CAMrF;AAED,8EAA8E;AAC9E,eAAO,MAAM,YAAY,EAAE,QAA+B,CAAC"}
1
+ {"version":3,"file":"gltf-importer.d.ts","sourceRoot":"","sources":["../src/gltf-importer.ts"],"names":[],"mappings":"AAqCA,OAAO,KAAK,EAEV,QAAQ,EAIR,QAAQ,EAMT,MAAM,uBAAuB,CAAC;AAiB/B,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,qBAAqB,CAAC;AAC1E,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAqB,MAAM,iBAAiB,CAAC;AAwTlF,iFAAiF;AACjF,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,cAAc,EACnB,GAAG,EAAE,OAAO,EACZ,kBAAkB,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,EAC/C,kBAAkB,GAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAa,GAC1D,SAAS,QAAQ,EAAE,CAiCrB;AAonBD;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,CAAC,EAAE,8BAA8B,GAAG,QAAQ,CAMrF;AAED,8EAA8E;AAC9E,eAAO,MAAM,YAAY,EAAE,QAA+B,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import { MeshoptDecoder } from 'meshoptimizer';
2
+ import { deriveDefaultLodScreenCoverages } from '@forgeax/engine-import';
2
3
  import { packMeshBinV4 } from '@forgeax/engine-import/mesh-bin';
3
4
  import { AssetGuid } from '@forgeax/engine-pack/guid';
4
5
  import { ImportError, toShared, err, ok, reconcileMeshMaterialSlotTopology, IMPORT_ERROR_HINTS, resolveMeshMaterialSlotDefaultGuid, createMaterialError } from '@forgeax/engine-types';
@@ -26,6 +27,10 @@ var gltfErrorPolicy = {
26
27
  expected: "extension listed in v1 allowlist (see EXTENSION_ALLOWLIST in @forgeax/engine-gltf)",
27
28
  hint: "see feat-future-gltf-extensions-allowlist; remove this extension or wait for the allowlist to expand"
28
29
  },
30
+ "gltf-lod-invalid": {
31
+ expected: "MSFT_lod ids to reference unique existing node indices with valid coverage",
32
+ hint: "repair the MSFT_lod node relation or remove it from extensionsRequired before re-importing"
33
+ },
29
34
  "gltf-material-transmission-invalid": {
30
35
  expected: "KHR transmission, IOR, and volume values are finite and within their glTF ranges",
31
36
  hint: "repair the named glTF material extension value and re-import the source"
@@ -1394,7 +1399,9 @@ function decodeColorAccessor(input, flags = {}) {
1394
1399
  // src/check-extensions.ts
1395
1400
  var EXTENSION_ALLOWLIST = [
1396
1401
  "EXT_mesh_gpu_instancing",
1397
- "EXT_meshopt_compression"
1402
+ "EXT_meshopt_compression",
1403
+ "MSFT_lod",
1404
+ "MSFT_screencoverage"
1398
1405
  ];
1399
1406
  var SUPPORTED_EXTENSIONS = [
1400
1407
  ...EXTENSION_ALLOWLIST,
@@ -1426,6 +1433,81 @@ function checkExtensions(json) {
1426
1433
  return ok({ unsupportedUsed });
1427
1434
  }
1428
1435
 
1436
+ // src/lod/parse-lod.ts
1437
+ function parseGltfLodExtension(json) {
1438
+ const doc = json;
1439
+ const nodes = doc.nodes ?? [];
1440
+ const rawCoverage = doc.extensions?.MSFT_screencoverage?.scales;
1441
+ const groups = [];
1442
+ for (let rootNode = 0; rootNode < nodes.length; rootNode += 1) {
1443
+ if (nodes[rootNode]?.extensions?.MSFT_lod === void 0) continue;
1444
+ const idsRaw = nodes[rootNode]?.extensions?.MSFT_lod?.ids;
1445
+ if (!Array.isArray(idsRaw)) {
1446
+ return err(gltfErr("gltf-lod-invalid", { rootNode, ids: [], reason: "not-integer" }));
1447
+ }
1448
+ const ids = idsRaw.filter((value) => typeof value === "number");
1449
+ if (ids.length !== idsRaw.length || ids.some((id) => !Number.isInteger(id) || id < 0 || id >= nodes.length)) {
1450
+ return err(gltfErr("gltf-lod-invalid", { rootNode, ids, reason: "missing-node" }));
1451
+ }
1452
+ if (new Set(ids).size !== ids.length || ids.includes(rootNode)) {
1453
+ return err(gltfErr("gltf-lod-invalid", { rootNode, ids, reason: "duplicate-node" }));
1454
+ }
1455
+ const hasMesh = (node) => {
1456
+ if (typeof node?.mesh !== "number" || !Number.isInteger(node.mesh) || node.mesh < 0) {
1457
+ return false;
1458
+ }
1459
+ const mesh = doc.meshes?.[node.mesh];
1460
+ return mesh !== void 0 && Array.isArray(mesh.primitives) && mesh.primitives.length > 0;
1461
+ };
1462
+ if (!hasMesh(nodes[rootNode]) || ids.some((id) => !hasMesh(nodes[id]))) {
1463
+ return err(gltfErr("gltf-lod-invalid", { rootNode, ids, reason: "missing-node" }));
1464
+ }
1465
+ const nodeCoverage = nodes[rootNode]?.extras?.MSFT_screencoverage;
1466
+ const coverage = normalizeScreenCoverages(
1467
+ nodeCoverage === void 0 ? rawCoverage : nodeCoverage,
1468
+ ids.length,
1469
+ nodeCoverage !== void 0
1470
+ );
1471
+ if (coverage === "invalid") {
1472
+ return err(gltfErr("gltf-lod-invalid", { rootNode, ids, reason: "coverage" }));
1473
+ }
1474
+ groups.push({
1475
+ rootNode,
1476
+ lodNodeIds: ids,
1477
+ screenCoverages: coverage ?? []
1478
+ });
1479
+ }
1480
+ const first = groups[0];
1481
+ if (first === void 0) {
1482
+ if (doc.extensionsRequired?.some((extension) => extension === "MSFT_lod")) {
1483
+ return err(gltfErr("gltf-lod-invalid", { rootNode: 0, ids: [], reason: "missing-node" }));
1484
+ }
1485
+ return ok({ rootNode: 0, lodNodeIds: [], screenCoverages: [], groups: [] });
1486
+ }
1487
+ return ok({
1488
+ rootNode: first.rootNode,
1489
+ lodNodeIds: first.lodNodeIds,
1490
+ screenCoverages: first.screenCoverages,
1491
+ groups
1492
+ });
1493
+ }
1494
+ function normalizeScreenCoverages(raw, lodCount, officialNodeForm) {
1495
+ if (raw === void 0) return void 0;
1496
+ if (!Array.isArray(raw)) return "invalid";
1497
+ if (raw.some(
1498
+ (value) => typeof value !== "number" || !Number.isFinite(value) || value <= 0 || value > 1
1499
+ )) {
1500
+ return "invalid";
1501
+ }
1502
+ const expectedLengths = officialNodeForm ? [lodCount + 1] : [lodCount, lodCount + 1];
1503
+ if (!expectedLengths.includes(raw.length)) return "invalid";
1504
+ const values = raw.slice(0, lodCount);
1505
+ for (let index = 1; index < values.length; index += 1) {
1506
+ if (values[index] >= values[index - 1]) return "invalid";
1507
+ }
1508
+ return values;
1509
+ }
1510
+
1429
1511
  // src/material/parse-material.ts
1430
1512
  function tuple2(values) {
1431
1513
  if (values === void 0 || values.length < 2) return void 0;
@@ -2210,6 +2292,8 @@ async function parseGltfWithBin(json, ctx) {
2210
2292
  const extResult = checkExtensions(json);
2211
2293
  if (!extResult.ok) return err(extResult.error);
2212
2294
  const unsupportedExtensions = extResult.value.unsupportedUsed;
2295
+ const lodResult = parseGltfLodExtension(json);
2296
+ if (!lodResult.ok) return err(lodResult.error);
2213
2297
  const lightsResult = parsePunctualLights(json, ctx.filePath);
2214
2298
  if (!lightsResult.ok) return err(lightsResult.error);
2215
2299
  const meshesJson = json.meshes ?? [];
@@ -2750,7 +2834,8 @@ async function parseGltfWithBin(json, ctx) {
2750
2834
  matrixTrsCoexistNodes: diagnostics.matrixTrsCoexistNodes
2751
2835
  },
2752
2836
  meshPrimitiveCount,
2753
- lights: lightsResult.value
2837
+ lights: lightsResult.value,
2838
+ ...lodResult.value.lodNodeIds.length === 0 ? {} : { lod: lodResult.value }
2754
2839
  });
2755
2840
  }
2756
2841
  async function parseGltfForImporter(json, externalLoader, filePath, options = {}) {
@@ -3167,7 +3252,55 @@ async function importGltf(ctx, meshopt) {
3167
3252
  })
3168
3253
  };
3169
3254
  }
3170
- const meshPayload = stabilizeMeshMaterialSlots(bridged.value, ctx, sub.guid, sub.sourceKey);
3255
+ const stabilizedMesh = stabilizeMeshMaterialSlots(
3256
+ bridged.value,
3257
+ ctx,
3258
+ sub.guid,
3259
+ sub.sourceKey
3260
+ );
3261
+ const lodGroup = doc.lod?.groups?.find(
3262
+ (group) => doc.nodes[group.rootNode]?.meshIndex === sub.sourceIndex
3263
+ ) ?? (doc.lod?.rootNode !== void 0 && doc.nodes[doc.lod.rootNode]?.meshIndex === sub.sourceIndex ? doc.lod : void 0);
3264
+ const rootMeshIndex = lodGroup === void 0 ? void 0 : sub.sourceIndex;
3265
+ if (lodGroup !== void 0) {
3266
+ const referencedMeshIndices = [
3267
+ sub.sourceIndex,
3268
+ ...lodGroup.lodNodeIds.map((nodeIndex) => doc.nodes[nodeIndex]?.meshIndex)
3269
+ ];
3270
+ const missingMeshIndex = referencedMeshIndices.find(
3271
+ (meshIndex) => !Number.isInteger(meshIndex) || meshIndex === null || meshIndex === void 0 || maps.meshGuidByIndex.get(meshIndex) === void 0
3272
+ );
3273
+ if (missingMeshIndex !== void 0) {
3274
+ return {
3275
+ ok: false,
3276
+ error: new ImportError({
3277
+ code: "import-internal-error",
3278
+ expected: "every MSFT_lod node to resolve a cooked mesh sub-asset",
3279
+ actual: String(missingMeshIndex),
3280
+ hint: "repair the referenced glTF mesh primitives and re-run the importer",
3281
+ detail: {
3282
+ reason: `MSFT_lod group for mesh ${sub.sourceIndex} references an unprojected mesh`
3283
+ }
3284
+ })
3285
+ };
3286
+ }
3287
+ }
3288
+ const authoredLods = sub.sourceKey === void 0 ? void 0 : ctx.sourceOverrides?.[sub.sourceKey]?.lods;
3289
+ const lodEntries = Array.isArray(authoredLods) ? authoredLods : [];
3290
+ const lodLevels = rootMeshIndex === sub.sourceIndex && lodGroup !== void 0 ? lodGroup.lodNodeIds.flatMap((nodeIndex, index) => {
3291
+ const meshIndex = doc.nodes[nodeIndex]?.meshIndex;
3292
+ const guid = meshIndex === void 0 || meshIndex === null ? void 0 : maps.meshGuidByIndex.get(meshIndex);
3293
+ if (guid === void 0) return [];
3294
+ const authored = lodEntries[index];
3295
+ const authoredCoverage = authored !== null && typeof authored === "object" ? authored.screenCoverage : void 0;
3296
+ const coverage = typeof authoredCoverage === "number" ? authoredCoverage : lodGroup.screenCoverages[index] ?? deriveDefaultLodScreenCoverages(lodGroup.lodNodeIds.length + 1)[index];
3297
+ const parsed2 = AssetGuid.parse(guid);
3298
+ return parsed2.ok && coverage !== void 0 ? [{ mesh: parsed2.value, screenCoverage: coverage, guid }] : [];
3299
+ }) : [];
3300
+ const meshPayload = lodLevels.length === 0 ? stabilizedMesh : {
3301
+ ...stabilizedMesh,
3302
+ lods: lodLevels.map(({ mesh, screenCoverage }) => ({ mesh, screenCoverage }))
3303
+ };
3171
3304
  const materialRefs = [];
3172
3305
  const seenMaterialGuids = /* @__PURE__ */ new Set();
3173
3306
  for (let slotIndex = 0; slotIndex < meshPayload.materialSlots.length; slotIndex++) {
@@ -3181,6 +3314,15 @@ async function importGltf(ctx, meshopt) {
3181
3314
  });
3182
3315
  }
3183
3316
  }
3317
+ for (const [lodIndex, level] of lodLevels.entries()) {
3318
+ if (!seenMaterialGuids.has(level.guid.toLowerCase())) {
3319
+ seenMaterialGuids.add(level.guid.toLowerCase());
3320
+ materialRefs.push({
3321
+ guid: level.guid,
3322
+ sourceField: { fieldName: "lods", arrayIndex: lodIndex }
3323
+ });
3324
+ }
3325
+ }
3184
3326
  out.push({
3185
3327
  guid: sub.guid,
3186
3328
  kind: "mesh",