@needle-tools/gltf-build-pipeline 0.1.0
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.
- package/CHANGELOG.md +140 -0
- package/clear-caches.mjs +4 -0
- package/defaults.mjs +12 -0
- package/dist/cache/cache.d.ts +5 -0
- package/dist/cache/cache.js +82 -0
- package/dist/cache/index.d.ts +1 -0
- package/dist/cache/index.js +1 -0
- package/dist/extensions/NEEDLE_compression_texture/NEEDLE_compression_texture.d.ts +24 -0
- package/dist/extensions/NEEDLE_compression_texture/NEEDLE_compression_texture.js +54 -0
- package/dist/extensions/NEEDLE_compression_texture/index.d.ts +1 -0
- package/dist/extensions/NEEDLE_compression_texture/index.js +1 -0
- package/dist/extensions/NEEDLE_mesh_compression/NEEDLE_mesh_compression.d.ts +23 -0
- package/dist/extensions/NEEDLE_mesh_compression/NEEDLE_mesh_compression.js +43 -0
- package/dist/extensions/NEEDLE_mesh_compression/index.d.ts +1 -0
- package/dist/extensions/NEEDLE_mesh_compression/index.js +1 -0
- package/dist/extensions/NEEDLE_opaque/NEEDLE_opaque.d.ts +20 -0
- package/dist/extensions/NEEDLE_opaque/NEEDLE_opaque.js +699 -0
- package/dist/extensions/NEEDLE_opaque/index.d.ts +3 -0
- package/dist/extensions/NEEDLE_opaque/index.js +18 -0
- package/dist/extensions/NEEDLE_progressive/NEEDLE_progressive.d.ts +23 -0
- package/dist/extensions/NEEDLE_progressive/NEEDLE_progressive.js +53 -0
- package/dist/extensions/NEEDLE_progressive/index.d.ts +1 -0
- package/dist/extensions/NEEDLE_progressive/index.js +1 -0
- package/dist/extensions/NEEDLE_progressive_texture_settings/index.d.ts +21 -0
- package/dist/extensions/NEEDLE_progressive_texture_settings/index.js +39 -0
- package/dist/extensions/index.d.ts +6 -0
- package/dist/extensions/index.js +16 -0
- package/dist/extensions/utils.d.ts +6 -0
- package/dist/extensions/utils.js +72 -0
- package/dist/functions/list-texture-slots.d.ts +1 -0
- package/dist/functions/list-texture-slots.js +35 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +3 -0
- package/dist/transforms/index.d.ts +9 -0
- package/dist/transforms/index.js +9 -0
- package/dist/transforms/needle_animation_transform.d.ts +2 -0
- package/dist/transforms/needle_animation_transform.js +5 -0
- package/dist/transforms/needle_asset.d.ts +2 -0
- package/dist/transforms/needle_asset.js +28 -0
- package/dist/transforms/needle_common.d.ts +11 -0
- package/dist/transforms/needle_common.js +1 -0
- package/dist/transforms/needle_mesh_transform.d.ts +3 -0
- package/dist/transforms/needle_mesh_transform.js +83 -0
- package/dist/transforms/needle_progressive.d.ts +34 -0
- package/dist/transforms/needle_progressive.js +264 -0
- package/dist/transforms/needle_simplify.d.ts +3 -0
- package/dist/transforms/needle_simplify.js +76 -0
- package/dist/transforms/needle_texture_transform.d.ts +5 -0
- package/dist/transforms/needle_texture_transform.js +123 -0
- package/dist/transforms/needle_toktx.d.ts +24 -0
- package/dist/transforms/needle_toktx.js +144 -0
- package/dist/transforms/needle_webp.d.ts +13 -0
- package/dist/transforms/needle_webp.js +53 -0
- package/dist/transforms/toktx.d.ts +77 -0
- package/dist/transforms/toktx.js +230 -0
- package/dist/transforms/types/squoosh.d.ts +31 -0
- package/dist/transforms/types/squoosh.js +33 -0
- package/dist/transforms/util.d.ts +21 -0
- package/dist/transforms/util.js +90 -0
- package/dist/utils/fileutils.d.ts +2 -0
- package/dist/utils/fileutils.js +95 -0
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.js +1 -0
- package/fileutils.mjs +6 -0
- package/index.mjs +33 -0
- package/make-progressive.mjs +11 -0
- package/pack-gltf.mjs +119 -0
- package/package.json +60 -0
- package/tsconfig.json +15 -0
package/pack-gltf.mjs
ADDED
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import glob from 'glob';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import { NodeIO } from '@gltf-transform/core';
|
|
4
|
+
import { ALL_EXTENSIONS } from '@gltf-transform/extensions';
|
|
5
|
+
import { draco } from '@gltf-transform/functions';
|
|
6
|
+
import draco3d from 'draco3dgltf';
|
|
7
|
+
import { ALL_EXTENSIONS as NEEDLE_EXTENSIONS } from "./dist/extensions/NEEDLE_opaque/index.js";
|
|
8
|
+
import commandLineArgs from "command-line-args";
|
|
9
|
+
import { NEEDLE_mesh_compression, NEEDLE_compression_texture } from './dist/extensions/index.js';
|
|
10
|
+
import { existsSync, statSync } from 'fs';
|
|
11
|
+
import { needle_mesh_transform } from "./dist/transforms/needle_mesh_transform.js";
|
|
12
|
+
import { needle_texture_transform } from "./dist/transforms/needle_texture_transform.js";
|
|
13
|
+
import { needle_animation_transform } from "./dist/transforms/needle_animation_transform.js";
|
|
14
|
+
import { foreachGLTF } from './fileutils.mjs';
|
|
15
|
+
import { needle_asset } from './dist/transforms/needle_asset.js';
|
|
16
|
+
|
|
17
|
+
const args = process.argv;
|
|
18
|
+
const showHelp = args.includes("help");
|
|
19
|
+
|
|
20
|
+
const optionDefinitions = [
|
|
21
|
+
{ name: 'debug', type: Boolean },
|
|
22
|
+
{ name: 'toktxPath', type: String, multiple: true },
|
|
23
|
+
{ name: 'file', type: String, multiple: true },
|
|
24
|
+
];
|
|
25
|
+
let options = undefined;
|
|
26
|
+
try {
|
|
27
|
+
options = commandLineArgs(optionDefinitions);
|
|
28
|
+
}
|
|
29
|
+
catch (err) {
|
|
30
|
+
if (args?.includes("debug"))
|
|
31
|
+
console.log("Failed parsing commandline args:", err.message);
|
|
32
|
+
options = {
|
|
33
|
+
file: [...process.argv],
|
|
34
|
+
debug: args?.includes("debug"),
|
|
35
|
+
};
|
|
36
|
+
for (const arg of args) {
|
|
37
|
+
if (arg.includes("KTX-Software")) {
|
|
38
|
+
options.toktxPath = [arg];
|
|
39
|
+
break;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const toktxPaths = options?.toktxPath?.join(";");
|
|
45
|
+
if (showHelp) {
|
|
46
|
+
if (!toktxPaths) {
|
|
47
|
+
console.log("You can define a toktx search path by adding --toktxPath <path> to the command line. The command may appear multiple times");
|
|
48
|
+
}
|
|
49
|
+
else console.log("Toktx path at " + toktxPaths);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// console.log(args);
|
|
53
|
+
const debug = options?.debug ?? false;
|
|
54
|
+
if (debug) {
|
|
55
|
+
console.log(options);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
let allowCaching = true;
|
|
59
|
+
if (args.includes("no-caching")) {
|
|
60
|
+
console.log("Caching is disabled")
|
|
61
|
+
allowCaching = false;
|
|
62
|
+
}
|
|
63
|
+
else if (showHelp)
|
|
64
|
+
console.log("Caching is enabled, use \"no-caching\" to disable it");
|
|
65
|
+
|
|
66
|
+
const noToktx = args.includes("no-toktx");
|
|
67
|
+
if (noToktx)
|
|
68
|
+
console.log("Using toktx is disabled");
|
|
69
|
+
|
|
70
|
+
const packedFiles = new Set();
|
|
71
|
+
|
|
72
|
+
async function packFile(file) {
|
|
73
|
+
if (!existsSync(file)) {
|
|
74
|
+
console.error("WARN: can not pack, file does not exist: " + file);
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
if (debug && file.includes(".debug.")) {
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
if (packedFiles.has(file)) return;
|
|
82
|
+
packedFiles.add(file);
|
|
83
|
+
console.log("→ Begin packing: " + file);
|
|
84
|
+
|
|
85
|
+
const prevSize = statSync(file).size;
|
|
86
|
+
const startTime = Date.now();
|
|
87
|
+
const io = new NodeIO()
|
|
88
|
+
.registerExtensions(ALL_EXTENSIONS)
|
|
89
|
+
.registerExtensions(NEEDLE_EXTENSIONS)
|
|
90
|
+
.registerExtensions([
|
|
91
|
+
NEEDLE_compression_texture,
|
|
92
|
+
NEEDLE_mesh_compression,
|
|
93
|
+
])
|
|
94
|
+
.registerDependencies({
|
|
95
|
+
'draco3d.decoder': await draco3d.createDecoderModule(),
|
|
96
|
+
'draco3d.encoder': await draco3d.createEncoderModule(),
|
|
97
|
+
});
|
|
98
|
+
const document = await io.read(file);
|
|
99
|
+
document.getLogger().verbosity = 0;
|
|
100
|
+
await document.transform(
|
|
101
|
+
needle_asset(),
|
|
102
|
+
needle_texture_transform({ useCache: allowCaching, noToktx: noToktx }),
|
|
103
|
+
needle_mesh_transform({ ratio: 0.75, error: 0.0005 }),
|
|
104
|
+
needle_animation_transform(),
|
|
105
|
+
draco(),
|
|
106
|
+
);
|
|
107
|
+
if (debug) file += ".debug.glb";
|
|
108
|
+
await io.write(file, document);
|
|
109
|
+
const duration = Date.now() - startTime;
|
|
110
|
+
const sizeInBytes = statSync(file).size;
|
|
111
|
+
const filename = path.basename(file);
|
|
112
|
+
|
|
113
|
+
console.log(`← Compressing done in ${(duration / 1000).toFixed(1)} sec, ${(prevSize / 1024 / 1024).toFixed(1)} MB → ${(sizeInBytes / 1024 / 1024).toFixed(1)} MB: ${filename} at ${file}`);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
foreachGLTF(process.argv, async (file) => {
|
|
118
|
+
await packFile(file);
|
|
119
|
+
});
|
package/package.json
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@needle-tools/gltf-build-pipeline",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Pipeline and tools for optimizing gltf files using gltf-transform and compression settings within glTF extensions",
|
|
5
|
+
"main": "index.mjs",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"scripts": {
|
|
8
|
+
"start": "node index.mjs",
|
|
9
|
+
"dev": "npm-watch compile",
|
|
10
|
+
"transform": "node index.mjs",
|
|
11
|
+
"transform:make-progressive": "node make-progressive.mjs",
|
|
12
|
+
"transform:pack-gltf": "node --no-experimental-fetch pack-gltf.mjs",
|
|
13
|
+
"pack-gltf": "node --no-experimental-fetch pack-gltf.mjs",
|
|
14
|
+
"dev:pack-gltf": "npm run compile && node pack-gltf.mjs",
|
|
15
|
+
"clear-caches": "node clear-caches.mjs",
|
|
16
|
+
"compile": "tsc || exit 1"
|
|
17
|
+
},
|
|
18
|
+
"dependencies": {
|
|
19
|
+
"@gltf-transform/core": "^3.1.4",
|
|
20
|
+
"@gltf-transform/extensions": "^3.1.4",
|
|
21
|
+
"@gltf-transform/functions": "^3.1.4",
|
|
22
|
+
"@squoosh/lib": "^0.4.0",
|
|
23
|
+
"command-exists": "^1.2.9",
|
|
24
|
+
"command-line-args": "^5.2.1",
|
|
25
|
+
"draco3dgltf": "^1.5.3",
|
|
26
|
+
"glob": "^7.2.0",
|
|
27
|
+
"meshoptimizer": "^0.18.1",
|
|
28
|
+
"micromatch": "^4.0.5",
|
|
29
|
+
"ndarray": "^1.0.19",
|
|
30
|
+
"ndarray-lanczos": "^0.3.0",
|
|
31
|
+
"ndarray-pixels": "^2.0.1",
|
|
32
|
+
"p-limit": "3.1.0",
|
|
33
|
+
"semver": "^7.3.7",
|
|
34
|
+
"sharp": "^0.31.3",
|
|
35
|
+
"tmp": "^0.2.1"
|
|
36
|
+
},
|
|
37
|
+
"watch": {
|
|
38
|
+
"compile": {
|
|
39
|
+
"patterns": [
|
|
40
|
+
"src"
|
|
41
|
+
],
|
|
42
|
+
"extensions": "ts",
|
|
43
|
+
"quiet": false
|
|
44
|
+
}
|
|
45
|
+
},
|
|
46
|
+
"devDependencies": {
|
|
47
|
+
"@types/node": "^18.7.23",
|
|
48
|
+
"npm-watch": "^0.11.0",
|
|
49
|
+
"typescript": "^4.9.5"
|
|
50
|
+
},
|
|
51
|
+
"author": {
|
|
52
|
+
"name": "Needle",
|
|
53
|
+
"email": "help@needle.tools",
|
|
54
|
+
"url": "https://needle.tools/"
|
|
55
|
+
},
|
|
56
|
+
"repository": {
|
|
57
|
+
"type": "git",
|
|
58
|
+
"url": "git+https://github.com/needle-tools/needle-gltf-extensions.git"
|
|
59
|
+
}
|
|
60
|
+
}
|
package/tsconfig.json
ADDED