@loaders.gl/tile-converter 5.0.0-alpha.10 → 5.0.0-alpha.11

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 (55) hide show
  1. package/README.md +33 -0
  2. package/dist/converter.min.cjs +103 -103
  3. package/dist/i3s-server/bin/i3s-server.min.cjs +1 -1
  4. package/dist/index.cjs +651 -547
  5. package/dist/index.js +641 -537
  6. package/dist/v5/adapters.cjs +1756 -200
  7. package/dist/v5/adapters.d.ts +13 -2
  8. package/dist/v5/adapters.js +1755 -190
  9. package/dist/v5/browser.cjs +12 -0
  10. package/dist/v5/browser.d.ts +12 -2
  11. package/dist/v5/browser.js +19 -1
  12. package/dist/v5/core.cjs +54 -0
  13. package/dist/v5/core.js +54 -0
  14. package/dist/v5/i3s-mesh-conversion.d.ts +10 -4
  15. package/dist/v5/i3s-mesh-sink.d.ts +25 -0
  16. package/dist/v5/i3s-mesh-source-features.d.ts +13 -0
  17. package/dist/v5/i3s-mesh-source-material.d.ts +5 -0
  18. package/dist/v5/i3s-mesh-source.d.ts +30 -0
  19. package/dist/v5/index.cjs +10 -0
  20. package/dist/v5/index.d.ts +10 -2
  21. package/dist/v5/index.js +17 -1
  22. package/dist/v5/mesh-conversion.d.ts +11 -2
  23. package/dist/v5/mesh-features.d.ts +9 -0
  24. package/dist/v5/mesh-source-texture.d.ts +2 -0
  25. package/dist/v5/mesh-source.d.ts +8 -1
  26. package/dist/v5/mesh.d.ts +6 -1
  27. package/dist/v5/point-cloud-source-encoder.d.ts +4 -7
  28. package/dist/v5/point-cloud-spatial.d.ts +22 -0
  29. package/dist/v5/point-cloud-tileset-sink.d.ts +28 -0
  30. package/dist/v5/point-cloud.d.ts +26 -1
  31. package/dist/v5/resource-fetcher.d.ts +18 -0
  32. package/dist/v5/spatial-conversion.d.ts +3 -1
  33. package/package.json +23 -23
  34. package/src/v5/adapters.ts +21 -2
  35. package/src/v5/browser.ts +36 -2
  36. package/src/v5/i3s-mesh-conversion.ts +58 -18
  37. package/src/v5/i3s-mesh-sink.ts +351 -0
  38. package/src/v5/i3s-mesh-source-features.ts +279 -0
  39. package/src/v5/i3s-mesh-source-material.ts +157 -0
  40. package/src/v5/i3s-mesh-source.ts +227 -0
  41. package/src/v5/index.ts +34 -2
  42. package/src/v5/mesh-conversion.ts +41 -11
  43. package/src/v5/mesh-draco.ts +47 -3
  44. package/src/v5/mesh-features.ts +319 -0
  45. package/src/v5/mesh-source-features.ts +37 -6
  46. package/src/v5/mesh-source-texture.ts +47 -0
  47. package/src/v5/mesh-source.ts +83 -21
  48. package/src/v5/mesh.ts +16 -7
  49. package/src/v5/point-cloud-conversion.ts +9 -1
  50. package/src/v5/point-cloud-source-encoder.ts +31 -20
  51. package/src/v5/point-cloud-spatial.ts +280 -0
  52. package/src/v5/point-cloud-tileset-sink.ts +234 -0
  53. package/src/v5/point-cloud.ts +159 -32
  54. package/src/v5/resource-fetcher.ts +110 -0
  55. package/src/v5/spatial-conversion.ts +84 -0
@@ -26,21 +26,28 @@ __export(browser_exports, {
26
26
  createBoundedMemoryTileConversionSink: () => import_core3.createBoundedMemoryTileConversionSink,
27
27
  createBrowserTileConversionSource: () => import_core4.createBrowserTileConversionSource,
28
28
  createBrowserTilesetConversionSource: () => import_core5.createBrowserTilesetConversionSource,
29
+ createI3SConversionSpatialContext: () => import_core8.createI3SConversionSpatialContext,
29
30
  createI3SMeshConversionCodec: () => import_adapters10.createI3SMeshConversionCodec,
31
+ createI3SMeshSink: () => import_adapters11.createI3SMeshSink,
32
+ createI3SMeshTilesetConversionSource: () => import_adapters14.createI3SMeshTilesetConversionSource,
30
33
  createMeshConversionCodec: () => import_adapters5.createMeshConversionCodec,
31
34
  createMeshTilesetConversionSource: () => import_adapters9.createMeshTilesetConversionSource,
35
+ createPointCloudTilesetSink: () => import_adapters12.createPointCloudTilesetSink,
32
36
  createSingleMeshI3SSink: () => import_adapters10.createSingleMeshI3SSink,
33
37
  createSingleMeshTilesetArchive: () => import_adapters8.createSingleMeshTilesetArchive,
34
38
  createSingleMeshTilesetSink: () => import_adapters6.createSingleMeshTilesetSink,
35
39
  createTileConversionArchive: () => import_adapters7.createTileConversionArchive,
40
+ createTileConversionResourceFetcher: () => import_adapters11.createTileConversionResourceFetcher,
36
41
  createTiles3DConversionSpatialContext: () => import_core7.createTiles3DConversionSpatialContext,
37
42
  createTilesetConversionSource: () => import_core2.createTilesetConversionSource,
38
43
  encodeMeshTile: () => import_adapters4.encodeMeshTile,
39
44
  encodePointCloudSource: () => import_adapters2.encodePointCloudSource,
40
45
  encodePointCloudSourceTile: () => import_adapters2.encodePointCloudSourceTile,
41
46
  encodePointCloudTile: () => import_adapters.encodePointCloudTile,
47
+ encodePointCloudTileWithMetadata: () => import_adapters.encodePointCloudTileWithMetadata,
42
48
  encodeTileConversionArchiveInBatches: () => import_adapters7.encodeTileConversionArchiveInBatches,
43
49
  inspectTileset: () => import_core.inspectTileset,
50
+ transformPointCloudSourceTile: () => import_adapters13.transformPointCloudSourceTile,
44
51
  traversePointCloudSource: () => import_core6.traversePointCloudSource,
45
52
  validateTileset: () => import_core.validateTileset
46
53
  });
@@ -62,3 +69,8 @@ var import_adapters7 = require("@loaders.gl/tile-converter/v5/adapters");
62
69
  var import_adapters8 = require("@loaders.gl/tile-converter/v5/adapters");
63
70
  var import_adapters9 = require("@loaders.gl/tile-converter/v5/adapters");
64
71
  var import_adapters10 = require("@loaders.gl/tile-converter/v5/adapters");
72
+ var import_adapters11 = require("@loaders.gl/tile-converter/v5/adapters");
73
+ var import_adapters12 = require("@loaders.gl/tile-converter/v5/adapters");
74
+ var import_adapters13 = require("@loaders.gl/tile-converter/v5/adapters");
75
+ var import_core8 = require("@loaders.gl/tile-converter/v5/core");
76
+ var import_adapters14 = require("@loaders.gl/tile-converter/v5/adapters");
@@ -7,8 +7,8 @@ export { createBrowserTileConversionSource } from '@loaders.gl/tile-converter/v5
7
7
  export type { BoundedMemoryTileConversionSink, BoundedMemoryTileConversionSinkOptions, BrowserTileConversionFile, BrowserTileConversionResource } from '@loaders.gl/tile-converter/v5/core';
8
8
  export type { BrowserTileConversionInspection, BrowserTileConversionInputResource, BrowserTileConversionSourceOptions } from '@loaders.gl/tile-converter/v5/core';
9
9
  export { createBrowserTilesetConversionSource } from '@loaders.gl/tile-converter/v5/core';
10
- export { encodePointCloudTile } from '@loaders.gl/tile-converter/v5/adapters';
11
- export type { EncodePointCloudTileOptions } from '@loaders.gl/tile-converter/v5/adapters';
10
+ export { encodePointCloudTile, encodePointCloudTileWithMetadata } from '@loaders.gl/tile-converter/v5/adapters';
11
+ export type { EncodePointCloudTileOptions, EncodedPointCloudTile } from '@loaders.gl/tile-converter/v5/adapters';
12
12
  export { traversePointCloudSource } from '@loaders.gl/tile-converter/v5/core';
13
13
  export type { PointCloudSourceTile, TraversePointCloudSourceOptions } from '@loaders.gl/tile-converter/v5/core';
14
14
  export { encodePointCloudSource, encodePointCloudSourceTile } from '@loaders.gl/tile-converter/v5/adapters';
@@ -32,3 +32,13 @@ export { createMeshTilesetConversionSource } from '@loaders.gl/tile-converter/v5
32
32
  export type { MeshSourceResource, MeshTilesetSourceOptions, MeshSourceFeatureOptions } from '@loaders.gl/tile-converter/v5/adapters';
33
33
  export { createI3SMeshConversionCodec, createSingleMeshI3SSink } from '@loaders.gl/tile-converter/v5/adapters';
34
34
  export type { I3SMeshConversionResource, I3SMeshConversionCodecOptions, SingleMeshI3SSink } from '@loaders.gl/tile-converter/v5/adapters';
35
+ export { createI3SMeshSink, createTileConversionResourceFetcher } from '@loaders.gl/tile-converter/v5/adapters';
36
+ export type { I3SMeshSink, I3SMeshSinkOptions, TileConversionResourceFetcherOptions, MeshTileFeatures } from '@loaders.gl/tile-converter/v5/adapters';
37
+ export { createPointCloudTilesetSink } from '@loaders.gl/tile-converter/v5/adapters';
38
+ export type { PointCloudTilesetSink, PointCloudTilesetSinkOptions } from '@loaders.gl/tile-converter/v5/adapters';
39
+ export { transformPointCloudSourceTile } from '@loaders.gl/tile-converter/v5/adapters';
40
+ export type { PointCloudSpatialOptions } from '@loaders.gl/tile-converter/v5/adapters';
41
+ export { createI3SConversionSpatialContext } from '@loaders.gl/tile-converter/v5/core';
42
+ export type { I3SConversionSpatialContext } from '@loaders.gl/tile-converter/v5/core';
43
+ export { createI3SMeshTilesetConversionSource } from '@loaders.gl/tile-converter/v5/adapters';
44
+ export type { I3SMeshTilesetSourceOptions, I3SMeshSourceFeatureOptions } from '@loaders.gl/tile-converter/v5/adapters';
@@ -9,7 +9,10 @@ import { createTilesetConversionSource } from "@loaders.gl/tile-converter/v5/cor
9
9
  import { createBoundedMemoryTileConversionSink } from "@loaders.gl/tile-converter/v5/core";
10
10
  import { createBrowserTileConversionSource } from "@loaders.gl/tile-converter/v5/core";
11
11
  import { createBrowserTilesetConversionSource } from "@loaders.gl/tile-converter/v5/core";
12
- import { encodePointCloudTile } from "@loaders.gl/tile-converter/v5/adapters";
12
+ import {
13
+ encodePointCloudTile,
14
+ encodePointCloudTileWithMetadata
15
+ } from "@loaders.gl/tile-converter/v5/adapters";
13
16
  import { traversePointCloudSource } from "@loaders.gl/tile-converter/v5/core";
14
17
  import {
15
18
  encodePointCloudSource,
@@ -30,6 +33,14 @@ import {
30
33
  createI3SMeshConversionCodec,
31
34
  createSingleMeshI3SSink
32
35
  } from "@loaders.gl/tile-converter/v5/adapters";
36
+ import {
37
+ createI3SMeshSink,
38
+ createTileConversionResourceFetcher
39
+ } from "@loaders.gl/tile-converter/v5/adapters";
40
+ import { createPointCloudTilesetSink } from "@loaders.gl/tile-converter/v5/adapters";
41
+ import { transformPointCloudSourceTile } from "@loaders.gl/tile-converter/v5/adapters";
42
+ import { createI3SConversionSpatialContext } from "@loaders.gl/tile-converter/v5/core";
43
+ import { createI3SMeshTilesetConversionSource } from "@loaders.gl/tile-converter/v5/adapters";
33
44
  export {
34
45
  TileConversionError,
35
46
  convertPointCloudSource,
@@ -37,21 +48,28 @@ export {
37
48
  createBoundedMemoryTileConversionSink,
38
49
  createBrowserTileConversionSource,
39
50
  createBrowserTilesetConversionSource,
51
+ createI3SConversionSpatialContext,
40
52
  createI3SMeshConversionCodec,
53
+ createI3SMeshSink,
54
+ createI3SMeshTilesetConversionSource,
41
55
  createMeshConversionCodec,
42
56
  createMeshTilesetConversionSource,
57
+ createPointCloudTilesetSink,
43
58
  createSingleMeshI3SSink,
44
59
  createSingleMeshTilesetArchive,
45
60
  createSingleMeshTilesetSink,
46
61
  createTileConversionArchive,
62
+ createTileConversionResourceFetcher,
47
63
  createTiles3DConversionSpatialContext,
48
64
  createTilesetConversionSource,
49
65
  encodeMeshTile,
50
66
  encodePointCloudSource,
51
67
  encodePointCloudSourceTile,
52
68
  encodePointCloudTile,
69
+ encodePointCloudTileWithMetadata,
53
70
  encodeTileConversionArchiveInBatches,
54
71
  inspectTileset,
72
+ transformPointCloudSourceTile,
55
73
  traversePointCloudSource,
56
74
  validateTileset
57
75
  };
package/dist/v5/core.cjs CHANGED
@@ -310,6 +310,12 @@ function createTiles3DConversionSpatialContext(discovered, options = {}) {
310
310
  if (spatialReference.status === "unresolved") {
311
311
  throw createSpatialConversionError(spatialReference);
312
312
  }
313
+ if (spatialReference.status !== "native" && spatialReference.coordinateEpoch !== void 0) {
314
+ throw new TileConversionError(
315
+ "SPATIAL_EPOCH_UNSUPPORTED",
316
+ "Epoch-tagged coordinates require an epoch-aware datum operation before conversion"
317
+ );
318
+ }
313
319
  const transformer = spatialReference.status === "native" ? void 0 : createSpatialTransformer(
314
320
  spatialReference,
315
321
  () => new import_tiles.Tiles3DSpatialTransformer(spatialReference, options)
@@ -327,14 +333,62 @@ function createI3SConversionSpatialContext(discovered, options = {}) {
327
333
  if (spatialReference.status === "unresolved") {
328
334
  throw createSpatialConversionError(spatialReference);
329
335
  }
336
+ if (spatialReference.status !== "native" && spatialReference.coordinateEpoch !== void 0) {
337
+ throw new TileConversionError(
338
+ "SPATIAL_EPOCH_UNSUPPORTED",
339
+ "Epoch-tagged coordinates require an epoch-aware datum operation before conversion"
340
+ );
341
+ }
330
342
  const transformer = spatialReference.status === "native" ? void 0 : createSpatialTransformer(
331
343
  spatialReference,
332
344
  () => new import_tiles.I3SSpatialTransformer(spatialReference, options)
333
345
  );
334
346
  const outputSpatialReference = transformer ? transformer.spatialReference : spatialReference;
347
+ let nativeNormalTransformer;
348
+ const transformNativeNormals = (normals, positions, normalReferenceFrame) => {
349
+ if (!spatialReference.sourceCrs || ["local", "cartesian"].includes(spatialReference.coordinateFrame)) {
350
+ const targetNormals = Float32Array.from(normals);
351
+ for (let index = 0; index < normals.length; index += 3) {
352
+ const length = Math.hypot(normals[index], normals[index + 1], normals[index + 2]);
353
+ if (length) {
354
+ for (let axis = 0; axis < 3; axis++) {
355
+ targetNormals[index + axis] = normals[index + axis] / length;
356
+ }
357
+ }
358
+ }
359
+ return targetNormals;
360
+ }
361
+ nativeNormalTransformer ||= createSpatialTransformer(
362
+ spatialReference,
363
+ () => new import_tiles.I3SSpatialTransformer(
364
+ {
365
+ ...spatialReference,
366
+ status: "transformable",
367
+ targetCrs: spatialReference.sourceCrs
368
+ },
369
+ options
370
+ )
371
+ );
372
+ return nativeNormalTransformer.transformNormals(normals, positions, normalReferenceFrame);
373
+ };
335
374
  return {
336
375
  spatialReference: outputSpatialReference,
337
376
  transformPositions: (positions, sourceOrigin) => transformer ? transformer.transformPositions(positions, sourceOrigin) : createNativeI3SPositions(positions, sourceOrigin, spatialReference),
377
+ transformGeometryAsync: async (positions, normals, normalReferenceFrame) => {
378
+ if (transformer)
379
+ return transformer.transformGeometryAsync(positions, normals, normalReferenceFrame);
380
+ const targetPositions = Float64Array.from(positions);
381
+ if (targetPositions.length % 3 || targetPositions.some((value) => !Number.isFinite(value)) || normals && (normals.length !== positions.length || Array.from(normals).some((value) => !Number.isFinite(value))) || normalReferenceFrame !== void 0 && !["earth-centered", "vertex-reference-frame"].includes(normalReferenceFrame)) {
382
+ throw new TileConversionError(
383
+ "SPATIAL_INPUT_INVALID",
384
+ "Conversion geometry requires finite matching xyz arrays and a supported I3S vector frame"
385
+ );
386
+ }
387
+ return {
388
+ positions: targetPositions,
389
+ normals: normals ? transformNativeNormals(normals, positions, normalReferenceFrame) : void 0
390
+ };
391
+ },
338
392
  transformPositionsAsync: (positions, sourceOrigin) => transformer ? transformer.transformPositionsAsync(positions, sourceOrigin) : Promise.resolve(createNativeI3SPositions(positions, sourceOrigin, spatialReference)),
339
393
  transformNormals: (normals, positions, normalReferenceFrame) => transformer ? transformer.transformNormals(normals, positions, normalReferenceFrame) : Float32Array.from(normals),
340
394
  transformBoundingVolume: (bounds) => transformer ? transformer.transformBoundingVolume(bounds) : cloneI3SBounds(bounds),
package/dist/v5/core.js CHANGED
@@ -278,6 +278,12 @@ function createTiles3DConversionSpatialContext(discovered, options = {}) {
278
278
  if (spatialReference.status === "unresolved") {
279
279
  throw createSpatialConversionError(spatialReference);
280
280
  }
281
+ if (spatialReference.status !== "native" && spatialReference.coordinateEpoch !== void 0) {
282
+ throw new TileConversionError(
283
+ "SPATIAL_EPOCH_UNSUPPORTED",
284
+ "Epoch-tagged coordinates require an epoch-aware datum operation before conversion"
285
+ );
286
+ }
281
287
  const transformer = spatialReference.status === "native" ? void 0 : createSpatialTransformer(
282
288
  spatialReference,
283
289
  () => new Tiles3DSpatialTransformer(spatialReference, options)
@@ -295,14 +301,62 @@ function createI3SConversionSpatialContext(discovered, options = {}) {
295
301
  if (spatialReference.status === "unresolved") {
296
302
  throw createSpatialConversionError(spatialReference);
297
303
  }
304
+ if (spatialReference.status !== "native" && spatialReference.coordinateEpoch !== void 0) {
305
+ throw new TileConversionError(
306
+ "SPATIAL_EPOCH_UNSUPPORTED",
307
+ "Epoch-tagged coordinates require an epoch-aware datum operation before conversion"
308
+ );
309
+ }
298
310
  const transformer = spatialReference.status === "native" ? void 0 : createSpatialTransformer(
299
311
  spatialReference,
300
312
  () => new I3SSpatialTransformer(spatialReference, options)
301
313
  );
302
314
  const outputSpatialReference = transformer ? transformer.spatialReference : spatialReference;
315
+ let nativeNormalTransformer;
316
+ const transformNativeNormals = (normals, positions, normalReferenceFrame) => {
317
+ if (!spatialReference.sourceCrs || ["local", "cartesian"].includes(spatialReference.coordinateFrame)) {
318
+ const targetNormals = Float32Array.from(normals);
319
+ for (let index = 0; index < normals.length; index += 3) {
320
+ const length = Math.hypot(normals[index], normals[index + 1], normals[index + 2]);
321
+ if (length) {
322
+ for (let axis = 0; axis < 3; axis++) {
323
+ targetNormals[index + axis] = normals[index + axis] / length;
324
+ }
325
+ }
326
+ }
327
+ return targetNormals;
328
+ }
329
+ nativeNormalTransformer ||= createSpatialTransformer(
330
+ spatialReference,
331
+ () => new I3SSpatialTransformer(
332
+ {
333
+ ...spatialReference,
334
+ status: "transformable",
335
+ targetCrs: spatialReference.sourceCrs
336
+ },
337
+ options
338
+ )
339
+ );
340
+ return nativeNormalTransformer.transformNormals(normals, positions, normalReferenceFrame);
341
+ };
303
342
  return {
304
343
  spatialReference: outputSpatialReference,
305
344
  transformPositions: (positions, sourceOrigin) => transformer ? transformer.transformPositions(positions, sourceOrigin) : createNativeI3SPositions(positions, sourceOrigin, spatialReference),
345
+ transformGeometryAsync: async (positions, normals, normalReferenceFrame) => {
346
+ if (transformer)
347
+ return transformer.transformGeometryAsync(positions, normals, normalReferenceFrame);
348
+ const targetPositions = Float64Array.from(positions);
349
+ if (targetPositions.length % 3 || targetPositions.some((value) => !Number.isFinite(value)) || normals && (normals.length !== positions.length || Array.from(normals).some((value) => !Number.isFinite(value))) || normalReferenceFrame !== void 0 && !["earth-centered", "vertex-reference-frame"].includes(normalReferenceFrame)) {
350
+ throw new TileConversionError(
351
+ "SPATIAL_INPUT_INVALID",
352
+ "Conversion geometry requires finite matching xyz arrays and a supported I3S vector frame"
353
+ );
354
+ }
355
+ return {
356
+ positions: targetPositions,
357
+ normals: normals ? transformNativeNormals(normals, positions, normalReferenceFrame) : void 0
358
+ };
359
+ },
306
360
  transformPositionsAsync: (positions, sourceOrigin) => transformer ? transformer.transformPositionsAsync(positions, sourceOrigin) : Promise.resolve(createNativeI3SPositions(positions, sourceOrigin, spatialReference)),
307
361
  transformNormals: (normals, positions, normalReferenceFrame) => transformer ? transformer.transformNormals(normals, positions, normalReferenceFrame) : Float32Array.from(normals),
308
362
  transformBoundingVolume: (bounds) => transformer ? transformer.transformBoundingVolume(bounds) : cloneI3SBounds(bounds),
@@ -1,6 +1,6 @@
1
- import type { EncodedI3SMeshLayer, I3SMeshWriterOptions } from '@loaders.gl/i3s';
1
+ import type { EncodedI3SMeshLayer, I3SMeshWriterOptions, I3SDracoLibraryOptions } from '@loaders.gl/i3s';
2
2
  import type { TileConversionCodec, TileConversionSink } from '@loaders.gl/tile-converter/v5/core';
3
- import type { Tiles3DConversionSpatialContext } from '@loaders.gl/tile-converter/v5/core';
3
+ import type { Tiles3DConversionSpatialContext, I3SConversionSpatialContext } from '@loaders.gl/tile-converter/v5/core';
4
4
  import type { MeshSourceResource } from './mesh-source.js';
5
5
  import type { BrowserTileConversionFile } from '@loaders.gl/tile-converter/v5/core';
6
6
  /** One authored mesh layer, ready for the single-layer sink. */
@@ -11,13 +11,19 @@ export interface I3SMeshConversionResource extends EncodedI3SMeshLayer {
11
11
  /** Spatial preparation and required authoring limits for the I3S codec. */
12
12
  export interface I3SMeshConversionCodecOptions extends Pick<I3SMeshWriterOptions, 'name' | 'maxPositionError' | 'maxResourceBytes'> {
13
13
  /** Shared source-to-ECEF context, applied exactly once before I3S geographic encoding. */
14
- readonly spatialContext: Tiles3DConversionSpatialContext;
14
+ readonly spatialContext: Tiles3DConversionSpatialContext | I3SConversionSpatialContext;
15
+ /** I3S vector frame when using an I3S context; defaults to earth-centered. */
16
+ readonly normalReferenceFrame?: 'earth-centered' | 'vertex-reference-frame';
17
+ /** Lossless Edge Breaker geometry by default; false retains raw I3S geometry. */
18
+ readonly draco?: boolean;
19
+ /** Full Draco encoder/decoder runtime URLs or injected modules. */
20
+ readonly dracoLibraryOptions?: I3SDracoLibraryOptions;
15
21
  }
16
22
  /** Creates a portable source-mesh to I3S layer codec with explicit precision and feature diagnostics. */
17
23
  export declare function createI3SMeshConversionCodec<TInspection = unknown>(options: I3SMeshConversionCodecOptions): TileConversionCodec<TInspection, MeshSourceResource, I3SMeshConversionResource>;
18
24
  /** Atomic bounded output for one authored I3S layer. */
19
25
  export interface SingleMeshI3SSink extends TileConversionSink<I3SMeshConversionResource> {
20
- /** Compressed archive-relative files visible only after successful finalization. */
26
+ /** Archive-relative geometry, metadata and images visible only after successful finalization. */
21
27
  getFiles(): readonly BrowserTileConversionFile[];
22
28
  }
23
29
  /** Creates an atomic bounded single-mesh I3S sink; pass finalized files to createTileConversionArchive. */
@@ -0,0 +1,25 @@
1
+ import type { BrowserTileConversionFile, TileConversionSink } from '@loaders.gl/tile-converter/v5/core';
2
+ import type { I3SMeshConversionResource } from './i3s-mesh-conversion.js';
3
+ /** Bounded flat collection of mesh nodes sharing one I3S feature/geometry schema. */
4
+ export interface I3SMeshSinkOptions {
5
+ /** Maximum compressed bytes retained, including final layer/index metadata. */
6
+ readonly maxTotalBytes: number;
7
+ /** Maximum primitive placements, from one through 64. */
8
+ readonly maxMeshes: number;
9
+ /** Maximum decompressed or generated metadata/attribute resource bytes. */
10
+ readonly maxResourceBytes: number;
11
+ }
12
+ /** Atomic multi-mesh I3S output, ready for portable SLPK packaging. */
13
+ export interface I3SMeshSink extends TileConversionSink<I3SMeshConversionResource> {
14
+ /** Finalized files only; failed or unfinished conversion exposes no output. */
15
+ getFiles(): readonly BrowserTileConversionFile[];
16
+ }
17
+ /**
18
+ * Combines independently authored mesh resources into one flat I3S layer.
19
+ * Leaves retain geographic placements, compressed geometry and attributes. A shared schema is
20
+ * required; generated object IDs must be disjoint (the conversion codec allocates them).
21
+ * Finalization rebuilds legacy indices, paged indices and enclosing ECEF bounds, including a
22
+ * second page for the 64th leaf. No source LOD hierarchy is implied. Byte gates bound retained
23
+ * resources and metadata, not peak decoder/compressor memory.
24
+ */
25
+ export declare function createI3SMeshSink(options: I3SMeshSinkOptions): I3SMeshSink;
@@ -0,0 +1,13 @@
1
+ import type { I3STileContent, I3SMeshFeatures } from '@loaders.gl/i3s';
2
+ import type { TilesetContentTraversalItem, TilesetSourceMetadata } from '@loaders.gl/tiles';
3
+ import type { MeshSourceFeatureOptions } from './mesh-source-features.js';
4
+ import type { MeshTilesetSourceOptions } from './mesh-source.js';
5
+ /** Explicit mapping of scalar I3S attribute resources and their geometry identifiers. */
6
+ export interface I3SMeshSourceFeatureOptions extends MeshSourceFeatureOptions {
7
+ /** Attribute column whose exact integer values identify the decoded geometry. */
8
+ readonly objectIdProperty: string;
9
+ /** Aggregate encoded attribute byte limit for each node, checked before parsing. */
10
+ readonly maxAttributeBytes: number;
11
+ }
12
+ /** Reads exact scalar/string columns and constructs complete triangle-to-Arrow-row ownership. */
13
+ export declare function extractI3SMeshFeatures(content: I3STileContent, item: TilesetContentTraversalItem, metadata: TilesetSourceMetadata, options: I3SMeshSourceFeatureOptions, readExternalResource: MeshTilesetSourceOptions['readExternalResource'], contentUri: string | undefined, signal?: AbortSignal): Promise<I3SMeshFeatures>;
@@ -0,0 +1,5 @@
1
+ import type { I3STileContent, I3STileHeader } from '@loaders.gl/i3s';
2
+ import type { MeshTilesetSourceOptions } from './mesh-source.js';
3
+ import type { MeshTileMaterial } from './mesh.js';
4
+ /** Maps normalized I3S factors and one encoded base-color PNG/JPEG with explicit wrapping. */
5
+ export declare function mapI3SMeshSourceMaterial(content: I3STileContent, header: Partial<I3STileHeader>, readExternalResource: MeshTilesetSourceOptions['readExternalResource'], contentUri: string | undefined, signal?: AbortSignal): Promise<MeshTileMaterial | undefined>;
@@ -0,0 +1,30 @@
1
+ import type { I3STileContent, I3SMeshFeatures } from '@loaders.gl/i3s';
2
+ import type { Tileset3D, TilesetSourceMetadata, TilesetContentTraversalItem } from '@loaders.gl/tiles';
3
+ import type { TileConversionSource, TilesetConversionSourceOptions } from '@loaders.gl/tile-converter/v5/core';
4
+ import type { MeshSourceResource } from './mesh-source.js';
5
+ import type { MeshTilesetSourceOptions } from './mesh-source.js';
6
+ import type { I3SMeshSourceFeatureOptions } from './i3s-mesh-source-features.js';
7
+ export type { I3SMeshSourceFeatureOptions } from './i3s-mesh-source-features.js';
8
+ /** Selected I3S triangle, encoded base-color appearance and explicit-schema feature profile. */
9
+ export interface I3SMeshTilesetSourceOptions extends TilesetConversionSourceOptions {
10
+ /** Read scalar/string attribute resources with an explicit schema and geometry OID mapping. */
11
+ readonly features?: I3SMeshSourceFeatureOptions;
12
+ /** Application-owned bounded reader, including archive resolution, authentication and decompression. */
13
+ readonly readExternalResource?: MeshTilesetSourceOptions['readExternalResource'];
14
+ /** Custom alternative to features, for source semantics outside the scalar resource profile. */
15
+ readonly getFeatures?: (content: I3STileContent, item: TilesetContentTraversalItem, metadata: TilesetSourceMetadata, signal?: AbortSignal) => I3SMeshFeatures | Promise<I3SMeshFeatures>;
16
+ }
17
+ /**
18
+ * Reads original absolute I3S positions through camera-independent traversal.
19
+ * Use a dedicated runtime with i3s.geometryMode='source'. The shared I3S spatial codec owns
20
+ * units, elevation and reprojection; this source never consumes renderer placement matrices.
21
+ * Pair the GLB codec with autoOrigin=true, or select an explicit target origin on the resources.
22
+ * Positions/normals/TEXCOORD_0, basic PBR factors and one encoded PNG/JPEG base-color texture
23
+ * are supported. Vertex colors, UV regions, additional attributes and segmentation fail explicitly.
24
+ * Features require an explicit schema/resource reader or a custom Arrow mapper.
25
+ * Unsafe decoded numeric geometry identifiers are rejected; exact property IDs use bigint.
26
+ * @param tileset - Dedicated I3S runtime using source-coordinate content decoding.
27
+ * @param options - Feature mapping and lifetime policy for content loaded during traversal.
28
+ * @returns A portable source of one absolute mesh per I3S node content.
29
+ */
30
+ export declare function createI3SMeshTilesetConversionSource(tileset: Tileset3D, options?: I3SMeshTilesetSourceOptions): TileConversionSource<TilesetSourceMetadata, MeshSourceResource>;
package/dist/v5/index.cjs CHANGED
@@ -26,21 +26,27 @@ __export(index_exports, {
26
26
  convertTileset: () => import_core.convertTileset,
27
27
  createI3SConversionSpatialContext: () => import_core3.createI3SConversionSpatialContext,
28
28
  createI3SMeshConversionCodec: () => import_adapters11.createI3SMeshConversionCodec,
29
+ createI3SMeshSink: () => import_adapters12.createI3SMeshSink,
30
+ createI3SMeshTilesetConversionSource: () => import_adapters15.createI3SMeshTilesetConversionSource,
29
31
  createManifestBackedTileConversionSink: () => import_core5.createManifestBackedTileConversionSink,
30
32
  createMeshConversionCodec: () => import_adapters6.createMeshConversionCodec,
31
33
  createMeshTilesetConversionSource: () => import_adapters10.createMeshTilesetConversionSource,
34
+ createPointCloudTilesetSink: () => import_adapters13.createPointCloudTilesetSink,
32
35
  createSingleMeshI3SSink: () => import_adapters11.createSingleMeshI3SSink,
33
36
  createSingleMeshTilesetArchive: () => import_adapters9.createSingleMeshTilesetArchive,
34
37
  createSingleMeshTilesetSink: () => import_adapters7.createSingleMeshTilesetSink,
35
38
  createTileConversionArchive: () => import_adapters8.createTileConversionArchive,
39
+ createTileConversionResourceFetcher: () => import_adapters12.createTileConversionResourceFetcher,
36
40
  createTiles3DConversionSpatialContext: () => import_core3.createTiles3DConversionSpatialContext,
37
41
  createTilesetConversionSource: () => import_core2.createTilesetConversionSource,
38
42
  encodeMeshTile: () => import_adapters5.encodeMeshTile,
39
43
  encodePointCloudSource: () => import_adapters3.encodePointCloudSource,
40
44
  encodePointCloudSourceTile: () => import_adapters3.encodePointCloudSourceTile,
41
45
  encodePointCloudTile: () => import_adapters2.encodePointCloudTile,
46
+ encodePointCloudTileWithMetadata: () => import_adapters2.encodePointCloudTileWithMetadata,
42
47
  encodeTileConversionArchiveInBatches: () => import_adapters8.encodeTileConversionArchiveInBatches,
43
48
  inspectTileset: () => import_core.inspectTileset,
49
+ transformPointCloudSourceTile: () => import_adapters14.transformPointCloudSourceTile,
44
50
  traversePointCloudSource: () => import_core4.traversePointCloudSource,
45
51
  validateTileset: () => import_core.validateTileset
46
52
  });
@@ -61,3 +67,7 @@ var import_adapters8 = require("@loaders.gl/tile-converter/v5/adapters");
61
67
  var import_adapters9 = require("@loaders.gl/tile-converter/v5/adapters");
62
68
  var import_adapters10 = require("@loaders.gl/tile-converter/v5/adapters");
63
69
  var import_adapters11 = require("@loaders.gl/tile-converter/v5/adapters");
70
+ var import_adapters12 = require("@loaders.gl/tile-converter/v5/adapters");
71
+ var import_adapters13 = require("@loaders.gl/tile-converter/v5/adapters");
72
+ var import_adapters14 = require("@loaders.gl/tile-converter/v5/adapters");
73
+ var import_adapters15 = require("@loaders.gl/tile-converter/v5/adapters");
@@ -6,8 +6,8 @@ export { createI3SConversionSpatialContext, createTiles3DConversionSpatialContex
6
6
  export type { I3SConversionSpatialContext, Tiles3DConversionSpatialContext } from '@loaders.gl/tile-converter/v5/core';
7
7
  export { convertFeatureAttributesToArrowBatches } from '@loaders.gl/tile-converter/v5/adapters';
8
8
  export type { FeatureArrowBatchOptions, TileFeatureAttributes } from '@loaders.gl/tile-converter/v5/adapters';
9
- export { encodePointCloudTile } from '@loaders.gl/tile-converter/v5/adapters';
10
- export type { EncodePointCloudTileOptions } from '@loaders.gl/tile-converter/v5/adapters';
9
+ export { encodePointCloudTile, encodePointCloudTileWithMetadata } from '@loaders.gl/tile-converter/v5/adapters';
10
+ export type { EncodePointCloudTileOptions, EncodedPointCloudTile } from '@loaders.gl/tile-converter/v5/adapters';
11
11
  export { traversePointCloudSource } from '@loaders.gl/tile-converter/v5/core';
12
12
  export type { PointCloudSourceTile, TraversePointCloudSourceOptions } from '@loaders.gl/tile-converter/v5/core';
13
13
  export { encodePointCloudSource, encodePointCloudSourceTile } from '@loaders.gl/tile-converter/v5/adapters';
@@ -30,3 +30,11 @@ export { createMeshTilesetConversionSource } from '@loaders.gl/tile-converter/v5
30
30
  export type { MeshSourceResource, MeshTilesetSourceOptions, MeshSourceFeatureOptions } from '@loaders.gl/tile-converter/v5/adapters';
31
31
  export { createI3SMeshConversionCodec, createSingleMeshI3SSink } from '@loaders.gl/tile-converter/v5/adapters';
32
32
  export type { I3SMeshConversionResource, I3SMeshConversionCodecOptions, SingleMeshI3SSink } from '@loaders.gl/tile-converter/v5/adapters';
33
+ export { createI3SMeshSink, createTileConversionResourceFetcher } from '@loaders.gl/tile-converter/v5/adapters';
34
+ export type { I3SMeshSink, I3SMeshSinkOptions, TileConversionResourceFetcherOptions, MeshTileFeatures } from '@loaders.gl/tile-converter/v5/adapters';
35
+ export { createPointCloudTilesetSink } from '@loaders.gl/tile-converter/v5/adapters';
36
+ export type { PointCloudTilesetSink, PointCloudTilesetSinkOptions } from '@loaders.gl/tile-converter/v5/adapters';
37
+ export { transformPointCloudSourceTile } from '@loaders.gl/tile-converter/v5/adapters';
38
+ export type { PointCloudSpatialOptions } from '@loaders.gl/tile-converter/v5/adapters';
39
+ export { createI3SMeshTilesetConversionSource } from '@loaders.gl/tile-converter/v5/adapters';
40
+ export type { I3SMeshTilesetSourceOptions, I3SMeshSourceFeatureOptions } from '@loaders.gl/tile-converter/v5/adapters';
package/dist/v5/index.js CHANGED
@@ -11,7 +11,10 @@ import {
11
11
  createTiles3DConversionSpatialContext
12
12
  } from "@loaders.gl/tile-converter/v5/core";
13
13
  import { convertFeatureAttributesToArrowBatches } from "@loaders.gl/tile-converter/v5/adapters";
14
- import { encodePointCloudTile } from "@loaders.gl/tile-converter/v5/adapters";
14
+ import {
15
+ encodePointCloudTile,
16
+ encodePointCloudTileWithMetadata
17
+ } from "@loaders.gl/tile-converter/v5/adapters";
15
18
  import { traversePointCloudSource } from "@loaders.gl/tile-converter/v5/core";
16
19
  import {
17
20
  encodePointCloudSource,
@@ -32,6 +35,13 @@ import {
32
35
  createI3SMeshConversionCodec,
33
36
  createSingleMeshI3SSink
34
37
  } from "@loaders.gl/tile-converter/v5/adapters";
38
+ import {
39
+ createI3SMeshSink,
40
+ createTileConversionResourceFetcher
41
+ } from "@loaders.gl/tile-converter/v5/adapters";
42
+ import { createPointCloudTilesetSink } from "@loaders.gl/tile-converter/v5/adapters";
43
+ import { transformPointCloudSourceTile } from "@loaders.gl/tile-converter/v5/adapters";
44
+ import { createI3SMeshTilesetConversionSource } from "@loaders.gl/tile-converter/v5/adapters";
35
45
  export {
36
46
  TileConversionError,
37
47
  convertFeatureAttributesToArrowBatches,
@@ -39,21 +49,27 @@ export {
39
49
  convertTileset,
40
50
  createI3SConversionSpatialContext,
41
51
  createI3SMeshConversionCodec,
52
+ createI3SMeshSink,
53
+ createI3SMeshTilesetConversionSource,
42
54
  createManifestBackedTileConversionSink,
43
55
  createMeshConversionCodec,
44
56
  createMeshTilesetConversionSource,
57
+ createPointCloudTilesetSink,
45
58
  createSingleMeshI3SSink,
46
59
  createSingleMeshTilesetArchive,
47
60
  createSingleMeshTilesetSink,
48
61
  createTileConversionArchive,
62
+ createTileConversionResourceFetcher,
49
63
  createTiles3DConversionSpatialContext,
50
64
  createTilesetConversionSource,
51
65
  encodeMeshTile,
52
66
  encodePointCloudSource,
53
67
  encodePointCloudSourceTile,
54
68
  encodePointCloudTile,
69
+ encodePointCloudTileWithMetadata,
55
70
  encodeTileConversionArchiveInBatches,
56
71
  inspectTileset,
72
+ transformPointCloudSourceTile,
57
73
  traversePointCloudSource,
58
74
  validateTileset
59
75
  };
@@ -2,7 +2,8 @@ import type { TilesetSpatialReference } from '@loaders.gl/tiles';
2
2
  import type { MeshGeometry } from '@loaders.gl/schema';
3
3
  import type { LoadLibraryOptions } from '@loaders.gl/worker-utils';
4
4
  import type { TileConversionCodec } from '@loaders.gl/tile-converter/v5/core';
5
- import type { Tiles3DConversionSpatialContext } from '@loaders.gl/tile-converter/v5/core';
5
+ import type { Tiles3DConversionSpatialContext, I3SConversionSpatialContext } from '@loaders.gl/tile-converter/v5/core';
6
+ import type { MeshTileFeatures } from './mesh-features.js';
6
7
  import type { MeshTileMaterial } from './mesh.js';
7
8
  /** Explicitly selected geometry, with positions already in the spatial context's source frame. */
8
9
  export interface MeshConversionInput {
@@ -10,8 +11,12 @@ export interface MeshConversionInput {
10
11
  readonly id: string;
11
12
  /** Triangle geometry with absolute packed Float32 or Float64 source positions. */
12
13
  readonly mesh: MeshGeometry;
14
+ /** Original I3S vector basis; overrides the codec default when supplied by a source. */
15
+ readonly normalReferenceFrame?: 'earth-centered' | 'vertex-reference-frame';
13
16
  /** Optional single material with an embedded base-color image, mapped explicitly by the source adapter. */
14
17
  readonly material?: MeshTileMaterial;
18
+ /** Explicit feature table and triangle associations, written as structural metadata. */
19
+ readonly features?: MeshTileFeatures;
15
20
  /** Finite xyz origin in the target frame, subtracted before float32 encoding. */
16
21
  readonly origin: readonly [number, number, number];
17
22
  }
@@ -35,7 +40,11 @@ export interface EncodedMeshConversionResource {
35
40
  /** Spatial policy used by the concrete mesh conversion codec. */
36
41
  export interface MeshConversionCodecOptions {
37
42
  /** Shared context that accepts absolute source positions and returns absolute target positions. */
38
- readonly spatialContext: Tiles3DConversionSpatialContext;
43
+ readonly spatialContext: Tiles3DConversionSpatialContext | I3SConversionSpatialContext;
44
+ /** I3S vector frame when using an I3S context; defaults to earth-centered. */
45
+ readonly normalReferenceFrame?: 'earth-centered' | 'vertex-reference-frame';
46
+ /** Rebase around the transformed bounds center instead of the resource's explicit origin. */
47
+ readonly autoOrigin?: boolean;
39
48
  /** Maximum Euclidean reconstruction error per vertex, in target coordinate units. */
40
49
  readonly maxPositionError: number;
41
50
  /** Lossless Draco Edge Breaker is enabled by default; false emits uncompressed GLB geometry. */
@@ -0,0 +1,9 @@
1
+ import type { MeshGeometry } from '@loaders.gl/schema';
2
+ import type { GLTFScenegraph } from '@loaders.gl/gltf';
3
+ import type { I3SMeshFeatures } from '@loaders.gl/i3s';
4
+ /** Explicit-schema Arrow features; stable identifiers are distinct from geometry row indices. */
5
+ export type MeshTileFeatures = Pick<I3SMeshFeatures, 'batches' | 'triangleFeatureIndices' | 'featureIdField'>;
6
+ /** Expands shared vertices so each complete triangle retains its own feature row through Draco. */
7
+ export declare function prepareMeshFeatureGeometry(mesh: MeshGeometry, features?: MeshTileFeatures): MeshGeometry;
8
+ /** Writes one inline structural metadata table without number coercion or nullable sentinel collisions. */
9
+ export declare function encodeMeshFeatures(scenegraph: GLTFScenegraph, meshIndex: number, features?: MeshTileFeatures): void;
@@ -2,3 +2,5 @@ import type { GLTFMaterialPostprocessed } from '@loaders.gl/gltf';
2
2
  import type { MeshTileTexture } from './mesh.js';
3
3
  /** Maps a buffer-view or base64 PNG/JPEG image, sampling and UV transform without decoding pixels. */
4
4
  export declare function mapMeshSourceTexture(textureInfo: NonNullable<GLTFMaterialPostprocessed['pbrMetallicRoughness']>['baseColorTexture']): MeshTileTexture;
5
+ /** Resolves one external encoded image through an explicitly supplied application reader. */
6
+ export declare function resolveMeshSourceTexture(textureInfo: NonNullable<GLTFMaterialPostprocessed['pbrMetallicRoughness']>['baseColorTexture'], readExternalResource: ((uri: string, contentUri: string | undefined, signal?: AbortSignal) => Promise<Uint8Array>) | undefined, contentUri: string | undefined, signal?: AbortSignal): Promise<MeshTileTexture>;
@@ -1,7 +1,9 @@
1
+ import type { GLTFMaterialPostprocessed } from '@loaders.gl/gltf';
1
2
  import type { Tileset3D, TilesetSourceMetadata } from '@loaders.gl/tiles';
2
3
  import type { TileConversionSource } from '@loaders.gl/tile-converter/v5/core';
3
4
  import type { TilesetConversionSourceOptions } from '@loaders.gl/tile-converter/v5/core';
4
5
  import type { MeshConversionInput } from './mesh-conversion.js';
6
+ import type { MeshTileMaterial } from './mesh.js';
5
7
  import type { MeshSourceFeatureOptions } from './mesh-source-features.js';
6
8
  import type { I3SMeshFeatures } from '@loaders.gl/i3s';
7
9
  export type { MeshSourceFeatureOptions } from './mesh-source-features.js';
@@ -14,21 +16,26 @@ export interface MeshSourceResource extends MeshConversionInput {
14
16
  export interface MeshTilesetSourceOptions extends TilesetConversionSourceOptions {
15
17
  /** Required when the source has batch/structural metadata; no schema is inferred. */
16
18
  readonly features?: MeshSourceFeatureOptions;
19
+ /** Explicit bounded reader for external encoded images, relative to the content URI. */
20
+ readonly readExternalResource?: (uri: string, contentUri: string | undefined, signal?: AbortSignal) => Promise<Uint8Array>;
17
21
  }
18
22
  /**
19
23
  * Extracts static GLB/B3DM primitives from a native ECEF 3D Tiles runtime, including
20
24
  * optional buffer-view or base64 data-URI PNG/JPEG images, TEXCOORD_0, glTF sampling and
21
25
  * KHR_texture_transform controls on TEXCOORD_0. Decode content with
22
26
  * `gltf.excludeExtensions: {KHR_texture_transform: false}` to retain authored UVs/transforms.
27
+ * Triangle strips are expanded with alternating winding; the glTF loader already expands fans.
23
28
  * Shared traversal retains placement identity and unloads content according to the supplied policy.
24
29
  * The adapter applies node transforms, glTF up-axis correction, RTC translation, and tile placement
25
30
  * once, retaining Float64 absolute positions and inverse-transpose unit normals. Animation, skins,
26
31
  * morphs, instancing, broader texture semantics, unknown extensions, non-affine/mirrored
27
32
  * placements, and
28
33
  * metadata outside the declared feature profile fail explicitly. Multiple resources can be read;
29
- * the single-mesh I3S sink rejects a second resource and aborts the entire output.
34
+ * collection sinks accept bounded multiple placements; the compatibility single-mesh sink rejects a second resource.
30
35
  * @param tileset - Dedicated native EPSG:4978 runtime with decoded glTF content enabled.
31
36
  * @param options - Explicit feature schema/mapping and optional decoded-content cleanup.
32
37
  * @returns Portable conversion source; COLOR_0 is preserved for GLB, while I3S rejects vertex colors.
33
38
  */
34
39
  export declare function createMeshTilesetConversionSource(tileset: Tileset3D, options?: MeshTilesetSourceOptions): TileConversionSource<TilesetSourceMetadata, MeshSourceResource>;
40
+ /** Maps supported PBR controls and an embedded base-color image, rejecting unmapped semantics. */
41
+ export declare function mapMeshSourceMaterial(material: GLTFMaterialPostprocessed | undefined, readExternalResource: MeshTilesetSourceOptions['readExternalResource'], contentUri: string | undefined, signal?: AbortSignal): Promise<MeshTileMaterial | undefined>;
package/dist/v5/mesh.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  import { GLTFScenegraph } from '@loaders.gl/gltf';
2
- import type { MeshGeometry } from '@loaders.gl/schema';
2
+ import type { MeshAttribute, MeshGeometry } from '@loaders.gl/schema';
3
+ import { type MeshTileFeatures } from './mesh-features.js';
3
4
  /** Explicit glTF wrapping and filtering for the selected base-color image. */
4
5
  export interface MeshTileSampler {
5
6
  /** Horizontal wrapping: CLAMP_TO_EDGE, MIRRORED_REPEAT, or REPEAT; omitted values use REPEAT. */
@@ -50,6 +51,8 @@ export interface MeshTileMaterial {
50
51
  }
51
52
  /** Optional appearance for the single-mesh GLB profile. */
52
53
  export interface MeshTileOptions {
54
+ /** One explicit Arrow feature table with a row index per triangle. */
55
+ readonly features?: MeshTileFeatures;
53
56
  /** Explicitly selected material; other texture maps and material extensions are unsupported. */
54
57
  readonly material?: MeshTileMaterial;
55
58
  }
@@ -79,3 +82,5 @@ export declare function createMeshTileScenegraph(options: MeshTileOptions, geome
79
82
  export declare function finalizeMeshTileScenegraph(scenegraph: GLTFScenegraph, meshIndex: number): ArrayBuffer;
80
83
  /** Validates the shared mesh profile; spatial preparation may retain Float64 positions internally. */
81
84
  export declare function validateMeshGeometry(mesh: MeshGeometry, allowFloat64Positions?: boolean): MeshGeometry;
85
+ /** Validates packed indices for triangle lists or strips, including glTF primitive-restart rules. */
86
+ export declare function validateMeshIndices(attribute: MeshAttribute | undefined, vertexCount: number, primitiveMode?: 4 | 5): Uint8Array | Uint16Array | Uint32Array | undefined;