@needle-tools/gltf-build-pipeline 2.13.0 → 2.13.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 (103) hide show
  1. package/CHANGELOG.md +520 -517
  2. package/README.md +38 -38
  3. package/dist/cache/cache.d.ts +55 -55
  4. package/dist/cache/cache.js +326 -326
  5. package/dist/cache/index.d.ts +1 -1
  6. package/dist/cache/index.js +1 -1
  7. package/dist/cli/index.d.ts +2 -2
  8. package/dist/cli/index.js +198 -198
  9. package/dist/config/index.d.ts +53 -53
  10. package/dist/config/index.js +152 -152
  11. package/dist/constants.d.ts +7 -7
  12. package/dist/constants.js +7 -7
  13. package/dist/extensions/NEEDLE_compression_texture/NEEDLE_compression_texture.d.ts +24 -24
  14. package/dist/extensions/NEEDLE_compression_texture/NEEDLE_compression_texture.js +54 -54
  15. package/dist/extensions/NEEDLE_compression_texture/index.d.ts +1 -1
  16. package/dist/extensions/NEEDLE_compression_texture/index.js +1 -1
  17. package/dist/extensions/NEEDLE_mesh_compression/NEEDLE_mesh_compression.d.ts +27 -27
  18. package/dist/extensions/NEEDLE_mesh_compression/NEEDLE_mesh_compression.js +88 -88
  19. package/dist/extensions/NEEDLE_mesh_compression/index.d.ts +1 -1
  20. package/dist/extensions/NEEDLE_mesh_compression/index.js +1 -1
  21. package/dist/extensions/NEEDLE_opaque/NEEDLE_opaque.d.ts +27 -27
  22. package/dist/extensions/NEEDLE_opaque/NEEDLE_opaque.js +980 -980
  23. package/dist/extensions/NEEDLE_opaque/index.d.ts +3 -3
  24. package/dist/extensions/NEEDLE_opaque/index.js +30 -30
  25. package/dist/extensions/NEEDLE_progressive/NEEDLE_progressive.d.ts +48 -48
  26. package/dist/extensions/NEEDLE_progressive/NEEDLE_progressive.js +69 -69
  27. package/dist/extensions/NEEDLE_progressive/index.d.ts +1 -1
  28. package/dist/extensions/NEEDLE_progressive/index.js +1 -1
  29. package/dist/extensions/NEEDLE_progressive_mesh_settings/index.d.ts +23 -23
  30. package/dist/extensions/NEEDLE_progressive_mesh_settings/index.js +41 -41
  31. package/dist/extensions/NEEDLE_progressive_texture_settings/index.d.ts +25 -25
  32. package/dist/extensions/NEEDLE_progressive_texture_settings/index.js +38 -38
  33. package/dist/extensions/index.d.ts +7 -7
  34. package/dist/extensions/index.js +17 -17
  35. package/dist/extensions/utils.d.ts +6 -6
  36. package/dist/extensions/utils.js +72 -72
  37. package/dist/functions/weld.3.d.ts +76 -76
  38. package/dist/functions/weld.3.js +414 -414
  39. package/dist/index.d.ts +8 -8
  40. package/dist/index.js +8 -8
  41. package/dist/scripts/index.d.ts +2 -2
  42. package/dist/scripts/index.js +2 -2
  43. package/dist/scripts/pack-gltf.d.ts +15 -15
  44. package/dist/scripts/pack-gltf.js +135 -133
  45. package/dist/scripts/stats.d.ts +2 -2
  46. package/dist/scripts/stats.js +19 -19
  47. package/dist/transforms/index.d.ts +9 -9
  48. package/dist/transforms/index.js +9 -9
  49. package/dist/transforms/needle_animation_transform.d.ts +2 -2
  50. package/dist/transforms/needle_animation_transform.js +5 -5
  51. package/dist/transforms/needle_asset.d.ts +3 -3
  52. package/dist/transforms/needle_asset.js +50 -50
  53. package/dist/transforms/needle_common.d.ts +17 -17
  54. package/dist/transforms/needle_common.js +1 -1
  55. package/dist/transforms/needle_mesh_transform.d.ts +15 -15
  56. package/dist/transforms/needle_mesh_transform.js +223 -223
  57. package/dist/transforms/needle_progressive.d.ts +45 -45
  58. package/dist/transforms/needle_progressive.js +1043 -1043
  59. package/dist/transforms/needle_texture_transform.d.ts +13 -13
  60. package/dist/transforms/needle_texture_transform.js +257 -257
  61. package/dist/transforms/needle_toktx.d.ts +26 -26
  62. package/dist/transforms/needle_toktx.js +243 -243
  63. package/dist/transforms/needle_webp.d.ts +15 -15
  64. package/dist/transforms/needle_webp.js +53 -53
  65. package/dist/transforms/toktx.d.ts +52 -52
  66. package/dist/transforms/toktx.js +221 -221
  67. package/dist/transforms/toktx_types.d.ts +78 -78
  68. package/dist/transforms/toktx_types.js +62 -62
  69. package/dist/transforms/util.d.ts +21 -21
  70. package/dist/transforms/util.js +90 -90
  71. package/dist/utils/compression_utils.d.ts +2 -2
  72. package/dist/utils/compression_utils.js +6 -6
  73. package/dist/utils/fileutils.d.ts +19 -19
  74. package/dist/utils/fileutils.js +177 -177
  75. package/dist/utils/guid.d.ts +1 -1
  76. package/dist/utils/guid.js +5 -5
  77. package/dist/utils/index.d.ts +10 -10
  78. package/dist/utils/index.js +10 -10
  79. package/dist/utils/merge.d.ts +12 -12
  80. package/dist/utils/merge.js +31 -31
  81. package/dist/utils/mesh.d.ts +13 -13
  82. package/dist/utils/mesh.js +124 -124
  83. package/dist/utils/nodeio.d.ts +6 -6
  84. package/dist/utils/nodeio.js +86 -86
  85. package/dist/utils/stats.d.ts +70 -70
  86. package/dist/utils/stats.js +258 -258
  87. package/dist/utils/texture.d.ts +5 -5
  88. package/dist/utils/texture.js +14 -14
  89. package/dist/utils/validate.d.ts +5 -5
  90. package/dist/utils/validate.js +17 -17
  91. package/dist/utils/version.d.ts +1 -1
  92. package/dist/utils/version.gen.d.ts +1 -1
  93. package/dist/utils/version.gen.js +1 -1
  94. package/dist/utils/version.js +4 -4
  95. package/package.json +79 -79
  96. package/scripts/clear-caches.mjs +3 -3
  97. package/scripts/defaults.mjs +11 -11
  98. package/scripts/fileutils.mjs +5 -5
  99. package/scripts/index.mjs +41 -41
  100. package/scripts/limit-caches.mjs +3 -3
  101. package/scripts/make-progressive.mjs +16 -16
  102. package/scripts/pack-gltf.mjs +106 -106
  103. package/tsconfig.json +19 -19
package/dist/index.d.ts CHANGED
@@ -1,8 +1,8 @@
1
- export * from "./config/index.js";
2
- export * from "./cli/index.js";
3
- export * from "./utils/index.js";
4
- export * from "./transforms/index.js";
5
- export * from "./extensions/index.js";
6
- export * from "./cache/index.js";
7
- export * from "./scripts/index.js";
8
- export * from "./constants.js";
1
+ export * from "./config/index.js";
2
+ export * from "./cli/index.js";
3
+ export * from "./utils/index.js";
4
+ export * from "./transforms/index.js";
5
+ export * from "./extensions/index.js";
6
+ export * from "./cache/index.js";
7
+ export * from "./scripts/index.js";
8
+ export * from "./constants.js";
package/dist/index.js CHANGED
@@ -1,8 +1,8 @@
1
- export * from "./config/index.js";
2
- export * from "./cli/index.js";
3
- export * from "./utils/index.js";
4
- export * from "./transforms/index.js";
5
- export * from "./extensions/index.js";
6
- export * from "./cache/index.js";
7
- export * from "./scripts/index.js";
8
- export * from "./constants.js";
1
+ export * from "./config/index.js";
2
+ export * from "./cli/index.js";
3
+ export * from "./utils/index.js";
4
+ export * from "./transforms/index.js";
5
+ export * from "./extensions/index.js";
6
+ export * from "./cache/index.js";
7
+ export * from "./scripts/index.js";
8
+ export * from "./constants.js";
@@ -1,2 +1,2 @@
1
- export * from "./pack-gltf.js";
2
- export * from "./stats.js";
1
+ export * from "./pack-gltf.js";
2
+ export * from "./stats.js";
@@ -1,2 +1,2 @@
1
- export * from "./pack-gltf.js";
2
- export * from "./stats.js";
1
+ export * from "./pack-gltf.js";
2
+ export * from "./stats.js";
@@ -1,15 +1,15 @@
1
- import { ILogger } from '@gltf-transform/core';
2
- import { ProcessStats } from "../utils/index.js";
3
- import { Config } from '../config/index.js';
4
- export type PackGLTFOptions = {
5
- useCache: boolean;
6
- packedFiles?: Set<string>;
7
- stats?: ProcessStats;
8
- config: Config;
9
- logger?: ILogger;
10
- debug: boolean;
11
- verbose?: boolean;
12
- };
13
- /** Compress a glTF file
14
- */
15
- export declare function packGLTF(inputFile: string, outputFile: string, options: PackGLTFOptions): Promise<boolean>;
1
+ import { ILogger } from '@gltf-transform/core';
2
+ import { ProcessStats } from "../utils/index.js";
3
+ import { Config } from '../config/index.js';
4
+ export type PackGLTFOptions = {
5
+ useCache: boolean;
6
+ packedFiles?: Set<string>;
7
+ stats?: ProcessStats;
8
+ config: Config;
9
+ logger?: ILogger;
10
+ debug: boolean;
11
+ verbose?: boolean;
12
+ };
13
+ /** Compress a glTF file
14
+ */
15
+ export declare function packGLTF(inputFile: string, outputFile: string, options: PackGLTFOptions): Promise<boolean>;
@@ -1,133 +1,135 @@
1
- import path from 'path';
2
- import { Logger, NodeIO, PropertyType, Verbosity } from '@gltf-transform/core';
3
- import { ALL_EXTENSIONS } from '@gltf-transform/extensions';
4
- import draco3d from 'draco3dgltf';
5
- import { existsSync, readFileSync, statSync, writeFileSync } from 'fs';
6
- import { MeshoptDecoder, MeshoptEncoder } from 'meshoptimizer';
7
- import { dedup, prune, resample } from '@gltf-transform/functions';
8
- import { ALL_EXTENSIONS as NEEDLE_EXTENSIONS, NEEDLE_compression_texture, NEEDLE_mesh_compression, } from '../extensions/index.js';
9
- import { isLOD, isMeshLOD, needle_animation_transform, needle_asset, needle_mesh_transform, needle_texture_transform, } from '../transforms/index.js';
10
- import { getOutputPath, getVersion, ioTryReadWithMissingResources, writeNodeIO } from "../utils/index.js";
11
- import { addToCache, getHash, tryGetFromCache, } from "../cache/index.js";
12
- /** Compress a glTF file
13
- */
14
- export async function packGLTF(inputFile, outputFile, options) {
15
- if (!options.logger) {
16
- options.logger = new Logger(Verbosity.INFO);
17
- }
18
- const { debug, stats, packedFiles, useCache, logger } = options;
19
- if (!existsSync(inputFile)) {
20
- logger.error(`WARN: can not pack, file does not exist: \"${inputFile}\"`);
21
- return false;
22
- }
23
- // check if it's in the cache.
24
- // We only need to check mesh LOD files because image LODs are cache via our toktx transform
25
- // We can not cache the main glTF files because the hash always changes for them
26
- let cacheKey = undefined;
27
- if (useCache && isMeshLOD(inputFile)) {
28
- const existing = readFileSync(inputFile);
29
- const hash = getHash(existing);
30
- cacheKey = "packed-" + hash;
31
- const cached = tryGetFromCache(cacheKey);
32
- if (cached) {
33
- logger.info(`→ Loaded compressed file from cache: \"${path.basename(inputFile)}\"`);
34
- writeFileSync(inputFile, cached);
35
- return true;
36
- }
37
- }
38
- if (packedFiles) {
39
- if (packedFiles.has(inputFile))
40
- return true;
41
- packedFiles.add(inputFile);
42
- }
43
- try {
44
- const config = options.config;
45
- if (!outputFile)
46
- outputFile = inputFile;
47
- else {
48
- outputFile = getOutputPath(inputFile, outputFile);
49
- }
50
- const prevSizeInMB = statSync(inputFile).size / 1024 / 1024;
51
- logger.info(`→ Compressing ${prevSizeInMB.toFixed(1)} MB: ${inputFile}`);
52
- const startTime = Date.now();
53
- const io = new NodeIO()
54
- .registerExtensions(ALL_EXTENSIONS)
55
- .registerExtensions(NEEDLE_EXTENSIONS)
56
- .registerExtensions([
57
- NEEDLE_compression_texture,
58
- NEEDLE_mesh_compression,
59
- ])
60
- .registerDependencies({
61
- 'draco3d.decoder': await draco3d.createDecoderModule(),
62
- 'draco3d.encoder': await draco3d.createEncoderModule(),
63
- 'meshopt.decoder': MeshoptDecoder,
64
- 'meshopt.encoder': MeshoptEncoder,
65
- });
66
- const document = await ioTryReadWithMissingResources(io, inputFile); // await io.read(inputFile);
67
- /** @ts-ignore */
68
- document.getLogger().verbosity = options.verbose ? Verbosity.DEBUG : options.debug ? Verbosity.INFO : Verbosity.WARN;
69
- let totalGPUTextureMemory = 0;
70
- /** @type {Array<import('@gltf-transform/core').Transform>} */
71
- const transforms = [
72
- needle_asset(),
73
- needle_texture_transform({
74
- file: inputFile,
75
- outfile: outputFile,
76
- useCache,
77
- noToktx: false,
78
- debug: debug,
79
- reportGPUMemory: val => {
80
- totalGPUTextureMemory += val;
81
- },
82
- config,
83
- }),
84
- needle_mesh_transform({ file: inputFile, config }),
85
- needle_animation_transform({}),
86
- resample(),
87
- // Can not dedup "materials" because progressive textures will then assigned to the wrong material instance
88
- // HACK: keepUniqueNames is enabled to fix https://linear.app/needle/issue/NE-6288
89
- dedup({ propertyTypes: [PropertyType.MESH, PropertyType.MATERIAL] }),
90
- ];
91
- const isProgressiveAsset = isLOD(inputFile);
92
- // TODO: progressive mesh LODs should not be pruned right now because it will remove e.g. UVs from meshes (and probably blend shapes too) (so we just not do it for any progressive asset)
93
- if (!isProgressiveAsset) {
94
- transforms.push(prune({
95
- // Pruning animations is not supported yet (e.g. if the animation is only referenced by a component)
96
- propertyTypes: [
97
- PropertyType.MESH,
98
- PropertyType.MATERIAL,
99
- PropertyType.TEXTURE,
100
- PropertyType.ACCESSOR,
101
- PropertyType.BUFFER,
102
- ],
103
- keepAttributes: true,
104
- keepIndices: true,
105
- keepExtras: true,
106
- keepSolidTextures: true,
107
- }));
108
- }
109
- await document.transform(...transforms);
110
- logger.info(`← Writing to ${outputFile}`);
111
- await writeNodeIO(io, outputFile, document);
112
- if (useCache && cacheKey != undefined && existsSync(outputFile))
113
- addToCache(cacheKey, readFileSync(outputFile));
114
- const duration = Date.now() - startTime;
115
- const sizeInMB = statSync(outputFile).size / 1024 / 1024;
116
- const filename = path.basename(outputFile);
117
- const gpuMemoryInMB = totalGPUTextureMemory / 1024 / 1024;
118
- logger.info(`← Compressing done in ${(duration / 1000).toFixed(1)} sec, ${prevSizeInMB.toFixed(1)} MB → ${sizeInMB.toFixed(1)} MB (GPU: ${gpuMemoryInMB.toFixed(1)} MB textures): ${filename} at ${outputFile}`);
119
- if (stats) {
120
- stats.totalFilesProcessed++;
121
- stats.totalFileSizeInMB += sizeInMB;
122
- stats.totalFileSizeInMBBefore += prevSizeInMB;
123
- stats.totalGPUMemoryInMB += gpuMemoryInMB;
124
- }
125
- return true;
126
- }
127
- catch (err) {
128
- logger.error(`Packing of "${path.basename(inputFile)}" using version ${getVersion()} failed with error:\n${err.message}`);
129
- if (debug)
130
- throw err;
131
- return false;
132
- }
133
- }
1
+ import path from 'path';
2
+ import { Logger, NodeIO, PropertyType, Verbosity } from '@gltf-transform/core';
3
+ import { ALL_EXTENSIONS } from '@gltf-transform/extensions';
4
+ import draco3d from 'draco3dgltf';
5
+ import { existsSync, readFileSync, statSync, writeFileSync } from 'fs';
6
+ import { MeshoptDecoder, MeshoptEncoder } from 'meshoptimizer';
7
+ import { dedup, prune, resample } from '@gltf-transform/functions';
8
+ import { ALL_EXTENSIONS as NEEDLE_EXTENSIONS, NEEDLE_compression_texture, NEEDLE_mesh_compression, } from '../extensions/index.js';
9
+ import { isLOD, isMeshLOD, needle_animation_transform, needle_asset, needle_mesh_transform, needle_texture_transform, } from '../transforms/index.js';
10
+ import { getOutputPath, getVersion, ioTryReadWithMissingResources, writeNodeIO } from "../utils/index.js";
11
+ import { addToCache, getHash, tryGetFromCache, } from "../cache/index.js";
12
+ /** Compress a glTF file
13
+ */
14
+ export async function packGLTF(inputFile, outputFile, options) {
15
+ if (!options.logger) {
16
+ options.logger = new Logger(Verbosity.INFO);
17
+ }
18
+ const { debug, stats, packedFiles, useCache, logger } = options;
19
+ if (!existsSync(inputFile)) {
20
+ logger.error(`WARN: can not pack, file does not exist: \"${inputFile}\"`);
21
+ return false;
22
+ }
23
+ // check if it's in the cache.
24
+ // We only need to check mesh LOD files because image LODs are cache via our toktx transform
25
+ // We can not cache the main glTF files because the hash always changes for them
26
+ let cacheKey = undefined;
27
+ if (useCache && isMeshLOD(inputFile)) {
28
+ const existing = readFileSync(inputFile);
29
+ const hash = getHash(existing);
30
+ cacheKey = "packed-" + hash;
31
+ const cached = tryGetFromCache(cacheKey);
32
+ if (cached) {
33
+ logger.info(`→ Loaded compressed file from cache: \"${path.basename(inputFile)}\"`);
34
+ writeFileSync(inputFile, cached);
35
+ return true;
36
+ }
37
+ }
38
+ if (packedFiles) {
39
+ if (packedFiles.has(inputFile))
40
+ return true;
41
+ packedFiles.add(inputFile);
42
+ }
43
+ try {
44
+ const config = options.config;
45
+ if (!outputFile)
46
+ outputFile = inputFile;
47
+ else {
48
+ outputFile = getOutputPath(inputFile, outputFile);
49
+ }
50
+ const prevSizeInMB = statSync(inputFile).size / 1024 / 1024;
51
+ logger.info(`→ Compressing ${prevSizeInMB.toFixed(1)} MB: ${inputFile}`);
52
+ const startTime = Date.now();
53
+ const io = new NodeIO()
54
+ .registerExtensions(ALL_EXTENSIONS)
55
+ .registerExtensions(NEEDLE_EXTENSIONS)
56
+ .registerExtensions([
57
+ NEEDLE_compression_texture,
58
+ NEEDLE_mesh_compression,
59
+ ])
60
+ .registerDependencies({
61
+ 'draco3d.decoder': await draco3d.createDecoderModule(),
62
+ 'draco3d.encoder': await draco3d.createEncoderModule(),
63
+ 'meshopt.decoder': MeshoptDecoder,
64
+ 'meshopt.encoder': MeshoptEncoder,
65
+ });
66
+ const document = await ioTryReadWithMissingResources(io, inputFile); // await io.read(inputFile);
67
+ /** @ts-ignore */
68
+ document.getLogger().verbosity = options.verbose ? Verbosity.DEBUG : options.debug ? Verbosity.INFO : Verbosity.WARN;
69
+ let totalGPUTextureMemory = 0;
70
+ /** @type {Array<import('@gltf-transform/core').Transform>} */
71
+ const transforms = [
72
+ needle_asset(),
73
+ needle_texture_transform({
74
+ file: inputFile,
75
+ outfile: outputFile,
76
+ useCache,
77
+ noToktx: false,
78
+ debug: debug,
79
+ reportGPUMemory: val => {
80
+ totalGPUTextureMemory += val;
81
+ },
82
+ config,
83
+ }),
84
+ needle_mesh_transform({ file: inputFile, config }),
85
+ needle_animation_transform({}),
86
+ resample({
87
+ tolerance: 1e-6, // NOTE: lowered from 1e-4 to 1e-6 to fix https://linear.app/needle/issue/NE-6872
88
+ }),
89
+ // Can not dedup "materials" because progressive textures will then assigned to the wrong material instance
90
+ // HACK: keepUniqueNames is enabled to fix https://linear.app/needle/issue/NE-6288
91
+ dedup({ propertyTypes: [PropertyType.MESH, PropertyType.MATERIAL] }),
92
+ ];
93
+ const isProgressiveAsset = isLOD(inputFile);
94
+ // TODO: progressive mesh LODs should not be pruned right now because it will remove e.g. UVs from meshes (and probably blend shapes too) (so we just not do it for any progressive asset)
95
+ if (!isProgressiveAsset) {
96
+ transforms.push(prune({
97
+ // Pruning animations is not supported yet (e.g. if the animation is only referenced by a component)
98
+ propertyTypes: [
99
+ PropertyType.MESH,
100
+ PropertyType.MATERIAL,
101
+ PropertyType.TEXTURE,
102
+ PropertyType.ACCESSOR,
103
+ PropertyType.BUFFER,
104
+ ],
105
+ keepAttributes: true,
106
+ keepIndices: true,
107
+ keepExtras: true,
108
+ keepSolidTextures: true,
109
+ }));
110
+ }
111
+ await document.transform(...transforms);
112
+ logger.info(`← Writing to ${outputFile}`);
113
+ await writeNodeIO(io, outputFile, document);
114
+ if (useCache && cacheKey != undefined && existsSync(outputFile))
115
+ addToCache(cacheKey, readFileSync(outputFile));
116
+ const duration = Date.now() - startTime;
117
+ const sizeInMB = statSync(outputFile).size / 1024 / 1024;
118
+ const filename = path.basename(outputFile);
119
+ const gpuMemoryInMB = totalGPUTextureMemory / 1024 / 1024;
120
+ logger.info(`← Compressing done in ${(duration / 1000).toFixed(1)} sec, ${prevSizeInMB.toFixed(1)} MB → ${sizeInMB.toFixed(1)} MB (GPU: ${gpuMemoryInMB.toFixed(1)} MB textures): ${filename} at ${outputFile}`);
121
+ if (stats) {
122
+ stats.totalFilesProcessed++;
123
+ stats.totalFileSizeInMB += sizeInMB;
124
+ stats.totalFileSizeInMBBefore += prevSizeInMB;
125
+ stats.totalGPUMemoryInMB += gpuMemoryInMB;
126
+ }
127
+ return true;
128
+ }
129
+ catch (err) {
130
+ logger.error(`Packing of "${path.basename(inputFile)}" using version ${getVersion()} failed with error:\n${err.message}`);
131
+ if (debug)
132
+ throw err;
133
+ return false;
134
+ }
135
+ }
@@ -1,2 +1,2 @@
1
- import { FileStats } from "../utils/stats.js";
2
- export declare function calculateStats(inputfile: string): Promise<FileStats>;
1
+ import { FileStats } from "../utils/stats.js";
2
+ export declare function calculateStats(inputfile: string): Promise<FileStats>;
@@ -1,19 +1,19 @@
1
- import { NodeIO } from "@gltf-transform/core";
2
- import { ALL_EXTENSIONS } from "@gltf-transform/extensions";
3
- import draco3d from 'draco3dgltf';
4
- import { MeshoptDecoder, MeshoptEncoder } from "meshoptimizer";
5
- import { createNewFilestats } from "../utils/stats.js";
6
- export async function calculateStats(inputfile) {
7
- const io = new NodeIO()
8
- .registerExtensions(ALL_EXTENSIONS)
9
- .registerDependencies({
10
- 'draco3d.decoder': await draco3d.createDecoderModule(),
11
- 'draco3d.encoder': await draco3d.createEncoderModule(),
12
- 'meshopt.decoder': MeshoptDecoder,
13
- 'meshopt.encoder': MeshoptEncoder,
14
- });
15
- const document = await io.read(inputfile);
16
- const json = await io.readAsJSON(inputfile);
17
- const stats = createNewFilestats(inputfile, document, json);
18
- return stats;
19
- }
1
+ import { NodeIO } from "@gltf-transform/core";
2
+ import { ALL_EXTENSIONS } from "@gltf-transform/extensions";
3
+ import draco3d from 'draco3dgltf';
4
+ import { MeshoptDecoder, MeshoptEncoder } from "meshoptimizer";
5
+ import { createNewFilestats } from "../utils/stats.js";
6
+ export async function calculateStats(inputfile) {
7
+ const io = new NodeIO()
8
+ .registerExtensions(ALL_EXTENSIONS)
9
+ .registerDependencies({
10
+ 'draco3d.decoder': await draco3d.createDecoderModule(),
11
+ 'draco3d.encoder': await draco3d.createEncoderModule(),
12
+ 'meshopt.decoder': MeshoptDecoder,
13
+ 'meshopt.encoder': MeshoptEncoder,
14
+ });
15
+ const document = await io.read(inputfile);
16
+ const json = await io.readAsJSON(inputfile);
17
+ const stats = createNewFilestats(inputfile, document, json);
18
+ return stats;
19
+ }
@@ -1,9 +1,9 @@
1
- export * from "./needle_asset.js";
2
- export * from "./toktx.js";
3
- export * from "./needle_toktx.js";
4
- export * from "./needle_progressive.js";
5
- export * from "./needle_webp.js";
6
- export * from "./needle_mesh_transform.js";
7
- export * from "./needle_common.js";
8
- export * from "./needle_texture_transform.js";
9
- export * from "./needle_animation_transform.js";
1
+ export * from "./needle_asset.js";
2
+ export * from "./toktx.js";
3
+ export * from "./needle_toktx.js";
4
+ export * from "./needle_progressive.js";
5
+ export * from "./needle_webp.js";
6
+ export * from "./needle_mesh_transform.js";
7
+ export * from "./needle_common.js";
8
+ export * from "./needle_texture_transform.js";
9
+ export * from "./needle_animation_transform.js";
@@ -1,9 +1,9 @@
1
- export * from "./needle_asset.js";
2
- export * from "./toktx.js";
3
- export * from "./needle_toktx.js";
4
- export * from "./needle_progressive.js";
5
- export * from "./needle_webp.js";
6
- export * from "./needle_mesh_transform.js";
7
- export * from "./needle_common.js";
8
- export * from "./needle_texture_transform.js";
9
- export * from "./needle_animation_transform.js";
1
+ export * from "./needle_asset.js";
2
+ export * from "./toktx.js";
3
+ export * from "./needle_toktx.js";
4
+ export * from "./needle_progressive.js";
5
+ export * from "./needle_webp.js";
6
+ export * from "./needle_mesh_transform.js";
7
+ export * from "./needle_common.js";
8
+ export * from "./needle_texture_transform.js";
9
+ export * from "./needle_animation_transform.js";
@@ -1,2 +1,2 @@
1
- import { Transform } from "@gltf-transform/core";
2
- export declare const needle_animation_transform: (_options: any) => Transform;
1
+ import { Transform } from "@gltf-transform/core";
2
+ export declare const needle_animation_transform: (_options: any) => Transform;
@@ -1,5 +1,5 @@
1
- export const needle_animation_transform = function (_options) {
2
- // return resample();
3
- return (document, _context) => {
4
- };
5
- };
1
+ export const needle_animation_transform = function (_options) {
2
+ // return resample();
3
+ return (document, _context) => {
4
+ };
5
+ };
@@ -1,3 +1,3 @@
1
- import { Document, Transform } from '@gltf-transform/core';
2
- export declare function writeNeedleAsset(document: Document, metadata?: Record<string, object | string | number | boolean>): void;
3
- export declare function needle_asset(): Transform;
1
+ import { Document, Transform } from '@gltf-transform/core';
2
+ export declare function writeNeedleAsset(document: Document, metadata?: Record<string, object | string | number | boolean>): void;
3
+ export declare function needle_asset(): Transform;
@@ -1,50 +1,50 @@
1
- import { createTransform } from '@gltf-transform/functions';
2
- import { getVersion } from '../index.js';
3
- const generatorName = "Needle Build Pipeline";
4
- export function writeNeedleAsset(document, metadata) {
5
- const root = document.getRoot();
6
- const asset = root.getAsset();
7
- if (asset) {
8
- asset.extras = writeNeedleExtras(asset.extras);
9
- if (metadata)
10
- asset.extras = Object.assign(asset.extras, metadata);
11
- const version = getVersion();
12
- asset.generator = generatorName;
13
- if (version?.length > 0) {
14
- asset.generator += " " + version;
15
- }
16
- }
17
- }
18
- export function needle_asset() {
19
- return createTransform("needle_asset_transform", (document) => {
20
- writeNeedleAsset(document);
21
- });
22
- }
23
- /** @internal */
24
- function writeNeedleExtras(extras) {
25
- if (!extras)
26
- extras = {};
27
- // if the document doesnt have a needle property, add it
28
- if (typeof extras === "object" && !extras.needle) {
29
- let generator = generatorName;
30
- const version = getVersion();
31
- if (version?.length > 0)
32
- generator += " " + version;
33
- const time = new Date().toISOString();
34
- extras.needle = {
35
- generator: generator,
36
- created: time,
37
- updated: time,
38
- revision: 0,
39
- };
40
- }
41
- // if this is the second time this function is called, we need to update the revision number
42
- else {
43
- const needle_Extras = extras["needle"];
44
- if (needle_Extras) {
45
- needle_Extras.updated = new Date().toISOString();
46
- needle_Extras.revision = needle_Extras.revision + 1;
47
- }
48
- }
49
- return extras;
50
- }
1
+ import { createTransform } from '@gltf-transform/functions';
2
+ import { getVersion } from '../index.js';
3
+ const generatorName = "Needle Build Pipeline";
4
+ export function writeNeedleAsset(document, metadata) {
5
+ const root = document.getRoot();
6
+ const asset = root.getAsset();
7
+ if (asset) {
8
+ asset.extras = writeNeedleExtras(asset.extras);
9
+ if (metadata)
10
+ asset.extras = Object.assign(asset.extras, metadata);
11
+ const version = getVersion();
12
+ asset.generator = generatorName;
13
+ if (version?.length > 0) {
14
+ asset.generator += " " + version;
15
+ }
16
+ }
17
+ }
18
+ export function needle_asset() {
19
+ return createTransform("needle_asset_transform", (document) => {
20
+ writeNeedleAsset(document);
21
+ });
22
+ }
23
+ /** @internal */
24
+ function writeNeedleExtras(extras) {
25
+ if (!extras)
26
+ extras = {};
27
+ // if the document doesnt have a needle property, add it
28
+ if (typeof extras === "object" && !extras.needle) {
29
+ let generator = generatorName;
30
+ const version = getVersion();
31
+ if (version?.length > 0)
32
+ generator += " " + version;
33
+ const time = new Date().toISOString();
34
+ extras.needle = {
35
+ generator: generator,
36
+ created: time,
37
+ updated: time,
38
+ revision: 0,
39
+ };
40
+ }
41
+ // if this is the second time this function is called, we need to update the revision number
42
+ else {
43
+ const needle_Extras = extras["needle"];
44
+ if (needle_Extras) {
45
+ needle_Extras.updated = new Date().toISOString();
46
+ needle_Extras.revision = needle_Extras.revision + 1;
47
+ }
48
+ }
49
+ return extras;
50
+ }
@@ -1,17 +1,17 @@
1
- import { Document, Texture } from '@gltf-transform/core';
2
- import { NEEDLE_compression_texture_schema } from '../extensions/index.js';
3
- import { Config } from '../config/index.js';
4
- export interface NeedleTransformContext {
5
- /** full path to the file being processed */
6
- file: string;
7
- outfile: string;
8
- config: Config;
9
- debug?: boolean;
10
- useCache: boolean;
11
- noToktx: boolean;
12
- }
13
- export interface INeedleTextureTransformContext {
14
- prepare(document: Document): Promise<void | boolean>;
15
- process(index: number, texture: Texture, settings: NEEDLE_compression_texture_schema, context: NeedleTransformContext): Promise<boolean>;
16
- finalize(document: Document): Promise<void>;
17
- }
1
+ import { Document, Texture } from '@gltf-transform/core';
2
+ import { NEEDLE_compression_texture_schema } from '../extensions/index.js';
3
+ import { Config } from '../config/index.js';
4
+ export interface NeedleTransformContext {
5
+ /** full path to the file being processed */
6
+ file: string;
7
+ outfile: string;
8
+ config: Config;
9
+ debug?: boolean;
10
+ useCache: boolean;
11
+ noToktx: boolean;
12
+ }
13
+ export interface INeedleTextureTransformContext {
14
+ prepare(document: Document): Promise<void | boolean>;
15
+ process(index: number, texture: Texture, settings: NEEDLE_compression_texture_schema, context: NeedleTransformContext): Promise<boolean>;
16
+ finalize(document: Document): Promise<void>;
17
+ }
@@ -1 +1 @@
1
- export {};
1
+ export {};
@@ -1,15 +1,15 @@
1
- import { Transform, Document, Primitive, Mesh } from "@gltf-transform/core";
2
- import { SimplifyOptions, WeldOptions } from "@gltf-transform/functions";
3
- import { NEEDLE_mesh_compression_model_root } from "../extensions/index.js";
4
- import { Config } from "../config/index.js";
5
- declare type MeshTransformContext = {
6
- file: string;
7
- config: Config;
8
- };
9
- /**
10
- * Which compression type for a model should be used. This should be respected when creating LOD meshes and the appropriate extension should be added to the LOD mesh so it receives the same mesh compression as the parent mesh
11
- */
12
- export declare function determineMeshCompression(document: Document, filePath: string): NEEDLE_mesh_compression_model_root;
13
- export declare const needle_mesh_transform: (context: MeshTransformContext) => Transform;
14
- export declare function compressPrimitive(document: Document, mesh: Mesh, prim: Primitive, index: number, weldOptions: Required<WeldOptions>, meshOptions: Required<SimplifyOptions>): Promise<Primitive>;
15
- export {};
1
+ import { Transform, Document, Primitive, Mesh } from "@gltf-transform/core";
2
+ import { SimplifyOptions, WeldOptions } from "@gltf-transform/functions";
3
+ import { NEEDLE_mesh_compression_model_root } from "../extensions/index.js";
4
+ import { Config } from "../config/index.js";
5
+ declare type MeshTransformContext = {
6
+ file: string;
7
+ config: Config;
8
+ };
9
+ /**
10
+ * Which compression type for a model should be used. This should be respected when creating LOD meshes and the appropriate extension should be added to the LOD mesh so it receives the same mesh compression as the parent mesh
11
+ */
12
+ export declare function determineMeshCompression(document: Document, filePath: string): NEEDLE_mesh_compression_model_root;
13
+ export declare const needle_mesh_transform: (context: MeshTransformContext) => Transform;
14
+ export declare function compressPrimitive(document: Document, mesh: Mesh, prim: Primitive, index: number, weldOptions: Required<WeldOptions>, meshOptions: Required<SimplifyOptions>): Promise<Primitive>;
15
+ export {};