@helix3/helix-cli 0.1.4-helix3.24
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/LICENSE +21 -0
- package/README.md +64 -0
- package/dist/ability.d.ts +73 -0
- package/dist/ability.js +120 -0
- package/dist/ability.js.map +1 -0
- package/dist/api.d.ts +24 -0
- package/dist/api.js +83 -0
- package/dist/api.js.map +1 -0
- package/dist/browserLogin.d.ts +22 -0
- package/dist/browserLogin.js +148 -0
- package/dist/browserLogin.js.map +1 -0
- package/dist/bundle.d.ts +15 -0
- package/dist/bundle.js +98 -0
- package/dist/bundle.js.map +1 -0
- package/dist/character/canonicalSkeleton.d.ts +3 -0
- package/dist/character/canonicalSkeleton.js +23 -0
- package/dist/character/canonicalSkeleton.js.map +1 -0
- package/dist/character/canonicalSkeletonData.d.ts +6 -0
- package/dist/character/canonicalSkeletonData.js +92 -0
- package/dist/character/canonicalSkeletonData.js.map +1 -0
- package/dist/character/esm.d.ts +1 -0
- package/dist/character/esm.js +6 -0
- package/dist/character/esm.js.map +1 -0
- package/dist/character/importCharacter.d.ts +88 -0
- package/dist/character/importCharacter.js +293 -0
- package/dist/character/importCharacter.js.map +1 -0
- package/dist/character/mat4.d.ts +29 -0
- package/dist/character/mat4.js +103 -0
- package/dist/character/mat4.js.map +1 -0
- package/dist/character/meshyToHelixMap.d.ts +2 -0
- package/dist/character/meshyToHelixMap.js +40 -0
- package/dist/character/meshyToHelixMap.js.map +1 -0
- package/dist/character/quat.d.ts +15 -0
- package/dist/character/quat.js +137 -0
- package/dist/character/quat.js.map +1 -0
- package/dist/character/stages/bakeTexture.d.ts +20 -0
- package/dist/character/stages/bakeTexture.js +396 -0
- package/dist/character/stages/bakeTexture.js.map +1 -0
- package/dist/character/stages/conform.d.ts +56 -0
- package/dist/character/stages/conform.js +292 -0
- package/dist/character/stages/conform.js.map +1 -0
- package/dist/character/stages/ktx2.d.ts +22 -0
- package/dist/character/stages/ktx2.js +97 -0
- package/dist/character/stages/ktx2.js.map +1 -0
- package/dist/character/stages/mergeLods.d.ts +15 -0
- package/dist/character/stages/mergeLods.js +42 -0
- package/dist/character/stages/mergeLods.js.map +1 -0
- package/dist/character/stages/report.d.ts +2 -0
- package/dist/character/stages/report.js +19 -0
- package/dist/character/stages/report.js.map +1 -0
- package/dist/character/stages/resizeTextures.d.ts +11 -0
- package/dist/character/stages/resizeTextures.js +62 -0
- package/dist/character/stages/resizeTextures.js.map +1 -0
- package/dist/character/stages/retarget.d.ts +49 -0
- package/dist/character/stages/retarget.js +105 -0
- package/dist/character/stages/retarget.js.map +1 -0
- package/dist/character/stages/retargetClip.d.ts +27 -0
- package/dist/character/stages/retargetClip.js +237 -0
- package/dist/character/stages/retargetClip.js.map +1 -0
- package/dist/character/stages/simplifyMesh.d.ts +15 -0
- package/dist/character/stages/simplifyMesh.js +37 -0
- package/dist/character/stages/simplifyMesh.js.map +1 -0
- package/dist/character/stages/splitFacePrimitive.d.ts +30 -0
- package/dist/character/stages/splitFacePrimitive.js +115 -0
- package/dist/character/stages/splitFacePrimitive.js.map +1 -0
- package/dist/character/stages/weldedSimplify.d.ts +32 -0
- package/dist/character/stages/weldedSimplify.js +202 -0
- package/dist/character/stages/weldedSimplify.js.map +1 -0
- package/dist/character/testutil/syntheticRig.d.ts +9 -0
- package/dist/character/testutil/syntheticRig.js +84 -0
- package/dist/character/testutil/syntheticRig.js.map +1 -0
- package/dist/config.d.ts +25 -0
- package/dist/config.js +103 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +378 -0
- package/dist/index.js.map +1 -0
- package/dist/init.d.ts +1 -0
- package/dist/init.js +87 -0
- package/dist/init.js.map +1 -0
- package/dist/initAbility.d.ts +1 -0
- package/dist/initAbility.js +71 -0
- package/dist/initAbility.js.map +1 -0
- package/dist/install.d.ts +51 -0
- package/dist/install.js +201 -0
- package/dist/install.js.map +1 -0
- package/dist/lib.d.ts +88 -0
- package/dist/lib.js +347 -0
- package/dist/lib.js.map +1 -0
- package/dist/package.d.ts +11 -0
- package/dist/package.js +136 -0
- package/dist/package.js.map +1 -0
- package/dist/prompt.d.ts +2 -0
- package/dist/prompt.js +55 -0
- package/dist/prompt.js.map +1 -0
- package/dist/resolve.d.ts +57 -0
- package/dist/resolve.js +103 -0
- package/dist/resolve.js.map +1 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -0
- package/package.json +58 -0
- package/vendor/ability-manifest.mjs +558 -0
- package/vendor/installed-index.mjs +71 -0
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// PORTED from helix-web-engine-new/tools/character-pipeline — the source of truth for the character
|
|
3
|
+
// pipeline. SYNC OBLIGATION: fix bugs there first, then mirror the change here; do not diverge.
|
|
4
|
+
// This file folds the engine tool's four drivers (retarget-cli, conform-cli, retarget-clip-cli,
|
|
5
|
+
// package-cli) into the one `helix character import` flow; the stage code itself is ported verbatim.
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.CANONICAL_BODY_FILENAME = void 0;
|
|
8
|
+
exports.findCanonicalBody = findCanonicalBody;
|
|
9
|
+
exports.importCharacter = importCharacter;
|
|
10
|
+
const node_fs_1 = require("node:fs");
|
|
11
|
+
const node_path_1 = require("node:path");
|
|
12
|
+
const core_1 = require("@gltf-transform/core");
|
|
13
|
+
const extensions_1 = require("@gltf-transform/extensions");
|
|
14
|
+
const functions_1 = require("@gltf-transform/functions");
|
|
15
|
+
const install_1 = require("../install");
|
|
16
|
+
const esm_1 = require("./esm");
|
|
17
|
+
const meshyToHelixMap_1 = require("./meshyToHelixMap");
|
|
18
|
+
const retarget_1 = require("./stages/retarget");
|
|
19
|
+
const conform_1 = require("./stages/conform");
|
|
20
|
+
const canonicalSkeleton_1 = require("./canonicalSkeleton");
|
|
21
|
+
const retargetClip_1 = require("./stages/retargetClip");
|
|
22
|
+
const simplifyMesh_1 = require("./stages/simplifyMesh");
|
|
23
|
+
const weldedSimplify_1 = require("./stages/weldedSimplify");
|
|
24
|
+
const bakeTexture_1 = require("./stages/bakeTexture");
|
|
25
|
+
const splitFacePrimitive_1 = require("./stages/splitFacePrimitive");
|
|
26
|
+
const mergeLods_1 = require("./stages/mergeLods");
|
|
27
|
+
const resizeTextures_1 = require("./stages/resizeTextures");
|
|
28
|
+
const ktx2_1 = require("./stages/ktx2");
|
|
29
|
+
exports.CANONICAL_BODY_FILENAME = 'body-m-default.web.glb';
|
|
30
|
+
const DEFAULT_CLIP_NAME = 'locomotion.warriorWalk';
|
|
31
|
+
/** Canonical bones the conform cannot approximate from neighbours — the map must cover every one
|
|
32
|
+
* (plus at least one spine link) or the fitted skeleton loses whole limbs. Judged in canonical terms
|
|
33
|
+
* so a custom --map is held to the same bar as the bundled Meshy map. */
|
|
34
|
+
const REQUIRED_TARGETS = [
|
|
35
|
+
'pelvis', 'head',
|
|
36
|
+
'upperarm_l', 'lowerarm_l', 'hand_l', 'upperarm_r', 'lowerarm_r', 'hand_r',
|
|
37
|
+
'thigh_l', 'calf_l', 'foot_l', 'thigh_r', 'calf_r', 'foot_r',
|
|
38
|
+
];
|
|
39
|
+
/** Throws a diagnosis-quality error when the source rig is not what the bone map expects. */
|
|
40
|
+
function assertMapCoverage(body, boneMap, log) {
|
|
41
|
+
const coverage = (0, retarget_1.checkMapCoverage)(body, boneMap);
|
|
42
|
+
if (coverage.sourceJoints === 0) {
|
|
43
|
+
throw new Error('character import: the source GLB has no skinned character (no skin joints found) — export the character WITH its rig');
|
|
44
|
+
}
|
|
45
|
+
if (coverage.matched.length === 0) {
|
|
46
|
+
const sample = coverage.extra.slice(0, 8).join(', ') + (coverage.extra.length > 8 ? ', …' : '');
|
|
47
|
+
throw new Error(`character import: the source rig matches none of the '${boneMap.name}' bone map — ` +
|
|
48
|
+
(coverage.mixamoPrefixed
|
|
49
|
+
? "this is a raw Mixamo download ('mixamorig:'-prefixed bones); re-export with bare bone names or pass a custom --map"
|
|
50
|
+
: 'this does not look like a Meshy/Mixamo-style rig; pass a custom --map describing it') +
|
|
51
|
+
`. Source joints: [${sample}]`);
|
|
52
|
+
}
|
|
53
|
+
const missing = REQUIRED_TARGETS.filter((t) => !coverage.coveredTargets.has(t));
|
|
54
|
+
const hasSpine = [...coverage.coveredTargets].some((t) => t.startsWith('spine_'));
|
|
55
|
+
if (missing.length > 0 || !hasSpine) {
|
|
56
|
+
throw new Error(`character import: the bone map covers too little of this rig to conform it — no source bone maps to ` +
|
|
57
|
+
`[${[...missing, ...(hasSpine ? [] : ['spine_*'])].join(', ')}]. Check the rig's naming or fix the --map.`);
|
|
58
|
+
}
|
|
59
|
+
if (coverage.extra.length > 0) {
|
|
60
|
+
log(`⚠ ${coverage.extra.length} source bone(s) not covered by the map (kept as-is; their deformation is unverified): [${coverage.extra.join(', ')}]`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Finds the canonical helix body GLB inside the world's installed packs. First-party installs copy
|
|
65
|
+
* whole bundles (code AND assets) into <world>/helix_modules/<id>/; consumer installs are code-only
|
|
66
|
+
* under <world>/public/helix_modules/ (assets stream from the CDN), so only a first-party install of
|
|
67
|
+
* the humanoid-character pack can satisfy the default — otherwise the caller must pass --canonical.
|
|
68
|
+
*/
|
|
69
|
+
function findCanonicalBody(cwd) {
|
|
70
|
+
const roots = [(0, node_path_1.join)(cwd, install_1.MODULES_DIR), (0, node_path_1.join)(cwd, 'public', install_1.MODULES_DIR)];
|
|
71
|
+
const search = (dir, depth) => {
|
|
72
|
+
if (depth > 6 || !(0, node_fs_1.existsSync)(dir))
|
|
73
|
+
return null;
|
|
74
|
+
for (const entry of (0, node_fs_1.readdirSync)(dir, { withFileTypes: true })) {
|
|
75
|
+
if (entry.isFile() && entry.name === exports.CANONICAL_BODY_FILENAME)
|
|
76
|
+
return (0, node_path_1.join)(dir, entry.name);
|
|
77
|
+
if (entry.isDirectory() && entry.name !== 'node_modules') {
|
|
78
|
+
const hit = search((0, node_path_1.join)(dir, entry.name), depth + 1);
|
|
79
|
+
if (hit !== null)
|
|
80
|
+
return hit;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return null;
|
|
84
|
+
};
|
|
85
|
+
for (const root of roots) {
|
|
86
|
+
const hit = search(root, 0);
|
|
87
|
+
if (hit !== null)
|
|
88
|
+
return hit;
|
|
89
|
+
}
|
|
90
|
+
return null;
|
|
91
|
+
}
|
|
92
|
+
function sceneTris(doc) {
|
|
93
|
+
return doc.getRoot().listScenes().map((scene) => {
|
|
94
|
+
let tris = 0;
|
|
95
|
+
scene.traverse((n) => { const m = n.getMesh?.(); if (m)
|
|
96
|
+
for (const p of m.listPrimitives()) {
|
|
97
|
+
const idx = p.getIndices();
|
|
98
|
+
tris += (idx ? idx.getCount() : p.getAttribute('POSITION').getCount()) / 3;
|
|
99
|
+
} });
|
|
100
|
+
return Math.round(tris);
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
/** Fail loud if any LOD lost its skin, has a malformed JOINTS_0, or decimated to nothing — so a level
|
|
104
|
+
* that would load but not deform (or render empty) becomes a build error, not a silent ship. */
|
|
105
|
+
function assertSkinnedLods(doc) {
|
|
106
|
+
doc.getRoot().listScenes().forEach((scene, i) => {
|
|
107
|
+
let hasSkin = false, bad = false, tris = 0;
|
|
108
|
+
scene.traverse((n) => {
|
|
109
|
+
const mesh = n.getMesh?.();
|
|
110
|
+
const skin = n.getSkin?.();
|
|
111
|
+
if (!mesh || !skin)
|
|
112
|
+
return;
|
|
113
|
+
hasSkin = true;
|
|
114
|
+
const joints = skin.listJoints().length;
|
|
115
|
+
for (const p of mesh.listPrimitives()) {
|
|
116
|
+
const pos = p.getAttribute('POSITION');
|
|
117
|
+
const j0 = p.getAttribute('JOINTS_0');
|
|
118
|
+
const idx = p.getIndices();
|
|
119
|
+
tris += (idx ? idx.getCount() : pos.getCount()) / 3;
|
|
120
|
+
if (joints === 0 || j0 === null || j0.getCount() !== pos.getCount())
|
|
121
|
+
bad = true;
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
if (!hasSkin)
|
|
125
|
+
throw new Error(`package: LOD${i} has no skinned mesh — skin was lost during decimate/merge`);
|
|
126
|
+
if (bad)
|
|
127
|
+
throw new Error(`package: LOD${i} skin is malformed (missing/short JOINTS_0)`);
|
|
128
|
+
if (tris < 1)
|
|
129
|
+
throw new Error(`package: LOD${i} decimated to 0 triangles — --lod-tris target is too aggressive`);
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Converts an external biped character GLB into a helix-humanoid@1 drop-in, chaining the engine
|
|
134
|
+
* pipeline's stages: rename the rig (retargetSkeleton) -> embed the canonical skeleton at the source's
|
|
135
|
+
* proportions (conformToHelixRest) -> LODs (rebake route for micro-chart atlases) -> merge -> resize ->
|
|
136
|
+
* KTX2 -> <out>/<name>.web.glb. With `anim`, also retargets the clip -> <out>/anims/<clipName>.glb.
|
|
137
|
+
*/
|
|
138
|
+
async function importCharacter(opts) {
|
|
139
|
+
const log = opts.onProgress ?? ((message) => console.log(message));
|
|
140
|
+
const cwd = opts.cwd ?? process.cwd();
|
|
141
|
+
const lodTris = opts.lodTris ?? [10_000, 5000, 1500];
|
|
142
|
+
const texCap = opts.texSize ?? 1024;
|
|
143
|
+
const error = opts.simplifyError ?? 0.02;
|
|
144
|
+
const lockBorder = opts.lockBorder ?? false;
|
|
145
|
+
const weld = opts.weld ?? true;
|
|
146
|
+
if (lodTris.length === 0)
|
|
147
|
+
throw new Error('character import: --lod-tris needs at least one triangle target');
|
|
148
|
+
if (!(0, node_fs_1.existsSync)(opts.body))
|
|
149
|
+
throw new Error(`character import: body GLB not found: ${opts.body}`);
|
|
150
|
+
const boneMap = opts.map !== undefined ? JSON.parse((0, node_fs_1.readFileSync)(opts.map, 'utf8')) : meshyToHelixMap_1.MESHY_TO_HELIX_MAP;
|
|
151
|
+
// Canonical skeleton: explicit --canonical > the world's installed pack > the embedded
|
|
152
|
+
// helix-humanoid@1 snapshot. The snapshot makes the command fully STANDALONE (no engine checkout,
|
|
153
|
+
// no installed assets) — the skeleton is a frozen contract, so the embedded copy is authoritative
|
|
154
|
+
// whenever no on-disk body overrides it.
|
|
155
|
+
const canonicalPath = opts.canonical ?? findCanonicalBody(cwd);
|
|
156
|
+
if (opts.canonical !== undefined && !(0, node_fs_1.existsSync)(opts.canonical))
|
|
157
|
+
throw new Error(`character import: canonical body GLB not found: ${opts.canonical}`);
|
|
158
|
+
const outDir = (0, node_path_1.resolve)(cwd, opts.output ?? './character-out');
|
|
159
|
+
const name = opts.name ?? (0, node_path_1.basename)(opts.body).replace(/\.(glb|gltf)$/i, '');
|
|
160
|
+
(0, node_fs_1.mkdirSync)(outDir, { recursive: true });
|
|
161
|
+
const io = new core_1.NodeIO().registerExtensions(extensions_1.ALL_EXTENSIONS);
|
|
162
|
+
const canon = canonicalPath !== null ? (0, conform_1.extractCanonicalSkeleton)(await io.read(canonicalPath)) : (0, canonicalSkeleton_1.vendoredCanonicalSkeleton)();
|
|
163
|
+
const canonSource = canonicalPath !== null ? (0, node_path_1.basename)(canonicalPath) : 'embedded helix-humanoid@1 snapshot';
|
|
164
|
+
log(`canonical skeleton: ${canon.jointNames.length} joints, ${canon.nodes.length} subtree nodes, root '${canon.skeletonRootName}' (${canonSource})`);
|
|
165
|
+
log(`bone map: ${boneMap.name} (${Object.keys(boneMap.map).length} bones, drop [${(boneMap.drop ?? []).join(', ')}])`);
|
|
166
|
+
// 1. Rename the source rig onto helix bone names (drops the map's childless leaf helpers).
|
|
167
|
+
// Preflight FIRST: fail with a diagnosis while the rig still has its source names.
|
|
168
|
+
const body = await io.read(opts.body);
|
|
169
|
+
assertMapCoverage(body, boneMap, log);
|
|
170
|
+
const ret = (0, retarget_1.retargetSkeleton)(body, boneMap);
|
|
171
|
+
log(`retarget: renamed ${Object.keys(ret.renamed).length}, dropped [${ret.dropped.join(', ')}], unmapped [${ret.unmapped.join(', ')}]`);
|
|
172
|
+
// 2. Conform (embed): fit the canonical skeleton into the source proportions and rebind the mesh.
|
|
173
|
+
// conformToHelixRest resolves joints by their CURRENT names; after the rename those are helix names,
|
|
174
|
+
// so augment the map with identity entries over its own values (source-name entries stay for any
|
|
175
|
+
// joint the rename left untouched).
|
|
176
|
+
const conformMap = {
|
|
177
|
+
...boneMap,
|
|
178
|
+
map: { ...boneMap.map, ...Object.fromEntries(Object.values(boneMap.map).map((helix) => [helix, helix])) },
|
|
179
|
+
};
|
|
180
|
+
const conf = (0, conform_1.conformToHelixRest)(body, canon, conformMap);
|
|
181
|
+
log(`conform: ${(0, node_path_1.basename)(opts.body)} [mode: ${conf.mode}]`);
|
|
182
|
+
log(` ${conf.mode === 'embed' ? 'embedded canonical skeleton into' : 're-posed'} ${conf.verticesProcessed} verts · ${conf.jointsRebuilt} canonical joints`);
|
|
183
|
+
// 3. Package (the engine package-cli flow). The conformed doc is serialized once so each LOD level
|
|
184
|
+
// decimates a fresh copy, exactly like package-cli re-reading its --body input per level.
|
|
185
|
+
const conformedBytes = await io.writeBinary(body);
|
|
186
|
+
const source = await io.readBinary(conformedBytes);
|
|
187
|
+
const seams = (0, weldedSimplify_1.analyzeSeams)(source);
|
|
188
|
+
const bake = opts.bake ?? seams.microChartAtlas;
|
|
189
|
+
let watlas = null;
|
|
190
|
+
if (bake) {
|
|
191
|
+
log(`atlas: ${seams.charts} charts / ${seams.tris} tris (${seams.verts} verts, ${seams.positions} positions) -> ${opts.bake === true ? 'bake forced' : 'micro-chart, rebake route'}`);
|
|
192
|
+
watlas = (await (0, esm_1.importEsm)('watlas'));
|
|
193
|
+
await watlas.Initialize();
|
|
194
|
+
}
|
|
195
|
+
// Resize + KTX2 happen PER LEVEL so each LOD can carry its own codec (UASTC near, ETC1S far).
|
|
196
|
+
// On the plain (non-bake) route, levels sharing a mode produce byte-identical textures that
|
|
197
|
+
// merge-lods dedup still collapses; a mixed chain keeps one texture per distinct encoding.
|
|
198
|
+
const ktxModes = opts.ktxModes !== undefined && opts.ktxModes.length > 0 ? opts.ktxModes : ['uastc', 'etc1s'];
|
|
199
|
+
const modeFor = (level) => ktxModes[Math.min(level, ktxModes.length - 1)];
|
|
200
|
+
const kb = (n) => Math.round(n / 1024);
|
|
201
|
+
const textureSizes = [];
|
|
202
|
+
const lods = [];
|
|
203
|
+
let ktxBefore = 0, ktxAfter = 0;
|
|
204
|
+
let encoder = 'basis-wasm';
|
|
205
|
+
for (const [level, target] of lodTris.entries()) {
|
|
206
|
+
let doc = await io.readBinary(conformedBytes);
|
|
207
|
+
if (bake) {
|
|
208
|
+
const w = await (0, weldedSimplify_1.weldedSimplify)(doc, target, error);
|
|
209
|
+
await doc.transform((0, functions_1.unwrap)({ watlas: watlas, overwrite: true }));
|
|
210
|
+
const texSize = Math.max(128, texCap >> level); // halve per level, like a mip chain
|
|
211
|
+
const b = await (0, bakeTexture_1.bakeBaseColor)(doc, source, texSize);
|
|
212
|
+
log(`lod: ${w.before} -> ${w.after} tris (target ${target}) rebaked ${texSize}px (${b.sampled} texels, ${b.far} far)`);
|
|
213
|
+
textureSizes.push(texSize);
|
|
214
|
+
}
|
|
215
|
+
else {
|
|
216
|
+
const r = await (0, simplifyMesh_1.simplifyToTarget)(doc, target, error, lockBorder);
|
|
217
|
+
const missed = r.after > target * 1.15;
|
|
218
|
+
if (missed && weld && level > 0) {
|
|
219
|
+
doc = await io.readBinary(conformedBytes);
|
|
220
|
+
const w = await (0, weldedSimplify_1.weldedSimplify)(doc, target, error);
|
|
221
|
+
log(`lod: ${w.before} -> ${w.after} tris (target ${target}) seam-weld fallback, uv-coherent ${(w.uvCoherence * 100).toFixed(0)}%`);
|
|
222
|
+
}
|
|
223
|
+
else {
|
|
224
|
+
log(`lod: ${r.before} -> ${r.after} tris (target ${target})${missed ? ' ⚠ floored above target' : ''}`);
|
|
225
|
+
if (missed)
|
|
226
|
+
log(` seam-locked mesh (micro-chart atlas / disconnected islands). Try --bake, raise --simplify-error, or accept the floor.`);
|
|
227
|
+
}
|
|
228
|
+
const resized = await (0, resizeTextures_1.resizeTextures)(doc, texCap);
|
|
229
|
+
if (level === 0 && resized.resized.length > 0)
|
|
230
|
+
log(`resize-textures: ${resized.resized.join('; ')}`);
|
|
231
|
+
}
|
|
232
|
+
const ktx = await (0, ktx2_1.encodeKtx2)(doc, { mode: modeFor(level), ...(opts.ktxQuality !== undefined && { quality: opts.ktxQuality }) });
|
|
233
|
+
const before = ktx.encoded.reduce((s, e) => s + e.before, 0), after = ktx.encoded.reduce((s, e) => s + e.after, 0);
|
|
234
|
+
ktxBefore += before;
|
|
235
|
+
ktxAfter += after;
|
|
236
|
+
encoder = ktx.encoder;
|
|
237
|
+
log(`ktx2 lod${level} (${ktx.mode}, ${ktx.encoder}): ${ktx.encoded.length} texture(s), ${kb(before)}KB -> ${kb(after)}KB`);
|
|
238
|
+
lods.push(doc);
|
|
239
|
+
}
|
|
240
|
+
if (!bake)
|
|
241
|
+
textureSizes.push(texCap);
|
|
242
|
+
const merged = await (0, mergeLods_1.mergeLods)(lods);
|
|
243
|
+
log(`merge-lods: ${lods.length} LODs -> scenes [${merged.scenes.join(', ')}], textures ${merged.texturesBefore} -> ${merged.texturesAfter}`);
|
|
244
|
+
const out = merged.document;
|
|
245
|
+
// AFTER merge-lods: its material dedup would fold the face's cloned material back into the body's.
|
|
246
|
+
if (opts.splitFace ?? true) {
|
|
247
|
+
const s = (0, splitFacePrimitive_1.splitFacePrimitive)(out);
|
|
248
|
+
if (s.split)
|
|
249
|
+
log(`split-face: ${s.faceTris} head tris -> 'FaceMesh' per level (${s.headJoints} head-subtree joints), bodies keep ${s.bodyTris}`);
|
|
250
|
+
else
|
|
251
|
+
log(`⚠ split-face: no head-weighted triangles found — first-person mode cannot hide this character's head`);
|
|
252
|
+
}
|
|
253
|
+
assertSkinnedLods(out); // every LOD must still be a valid, non-empty skinned mesh
|
|
254
|
+
await out.transform((0, functions_1.prune)({ keepSolidTextures: true }));
|
|
255
|
+
const modes = lodTris.map((_, level) => modeFor(level));
|
|
256
|
+
const bodyPath = (0, node_path_1.join)(outDir, `${name}.web.glb`);
|
|
257
|
+
await io.write(bodyPath, out);
|
|
258
|
+
log(`\npackage: ${(0, node_path_1.basename)(opts.body)} -> ${bodyPath} | LOD tris ${sceneTris(out).join(' / ')} | ${texCap}px KTX2 (${modes.join('/')})`);
|
|
259
|
+
// 4. Optional clip retarget (the engine retarget-clip-cli flow) — works on the RAW source anim + map.
|
|
260
|
+
let clip = null;
|
|
261
|
+
if (opts.anim !== undefined) {
|
|
262
|
+
const clipName = opts.clipName ?? DEFAULT_CLIP_NAME;
|
|
263
|
+
const r = (0, retargetClip_1.retargetClip)(await io.read(opts.anim), canon, boneMap, clipName);
|
|
264
|
+
const animsDir = (0, node_path_1.join)(outDir, 'anims');
|
|
265
|
+
(0, node_fs_1.mkdirSync)(animsDir, { recursive: true });
|
|
266
|
+
const clipPath = (0, node_path_1.join)(animsDir, `${clipName}.glb`);
|
|
267
|
+
await io.write(clipPath, r.document);
|
|
268
|
+
log(`retarget-clip: ${(0, node_path_1.basename)(opts.anim)} -> ${clipPath}`);
|
|
269
|
+
log(` ${r.frames} frames · ${r.meta.duration}s · ${r.animatedBones.length} animated bones: ${r.animatedBones.join(', ')}`);
|
|
270
|
+
// Merge into clip-meta.json (so it can be loaded like the platform clip set).
|
|
271
|
+
const metaPath = (0, node_path_1.join)(animsDir, 'clip-meta.json');
|
|
272
|
+
let metas = [];
|
|
273
|
+
try {
|
|
274
|
+
metas = JSON.parse((0, node_fs_1.readFileSync)(metaPath, 'utf8'));
|
|
275
|
+
}
|
|
276
|
+
catch { /* fresh */ }
|
|
277
|
+
metas = metas.filter((m) => m.name !== r.meta.name);
|
|
278
|
+
metas.push(r.meta);
|
|
279
|
+
(0, node_fs_1.writeFileSync)(metaPath, JSON.stringify(metas, null, 2));
|
|
280
|
+
log(` clip-meta -> ${metaPath}`);
|
|
281
|
+
clip = { name: clipName, path: clipPath, metaPath, frames: r.frames, duration: r.meta.duration, animatedBones: r.animatedBones };
|
|
282
|
+
}
|
|
283
|
+
return {
|
|
284
|
+
bodyPath,
|
|
285
|
+
lodTris: sceneTris(out),
|
|
286
|
+
textureSizes,
|
|
287
|
+
retarget: { renamed: Object.keys(ret.renamed).length, unmapped: ret.unmapped, dropped: ret.dropped },
|
|
288
|
+
conform: { mode: conf.mode, verticesProcessed: conf.verticesProcessed, jointsRebuilt: conf.jointsRebuilt },
|
|
289
|
+
ktx2: { encoder, modes, before: ktxBefore, after: ktxAfter },
|
|
290
|
+
clip,
|
|
291
|
+
};
|
|
292
|
+
}
|
|
293
|
+
//# sourceMappingURL=importCharacter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"importCharacter.js","sourceRoot":"","sources":["../../src/character/importCharacter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/** Column-major 4x4 multiply (glTF convention): out = a * b. */
|
|
2
|
+
export declare function mul4(a: readonly number[], b: readonly number[]): number[];
|
|
3
|
+
/** Full 4x4 inverse (column-major), via cofactor expansion (gl-matrix). Throws on a singular matrix. */
|
|
4
|
+
export declare function invert4(m: readonly number[]): number[];
|
|
5
|
+
/** Transform a point (w=1) by a column-major 4x4; returns [x,y,z] (affine, no perspective divide). */
|
|
6
|
+
export declare function transformPoint(m: readonly number[], p: readonly [number, number, number]): [number, number, number];
|
|
7
|
+
/** Transform a direction (w=0) by the upper 3x3 of a column-major 4x4 (no translation). */
|
|
8
|
+
export declare function transformDir(m: readonly number[], d: readonly [number, number, number]): [number, number, number];
|
|
9
|
+
/**
|
|
10
|
+
* Strips scale from a column-major TRS matrix: normalizes the three basis columns (leaving pure
|
|
11
|
+
* rotation) and keeps the translation. Used to build scale-free world frames for retargeting, so a
|
|
12
|
+
* rig authored at a non-unit armature scale (e.g. Meshy's 0.01) doesn't leak its scale into the
|
|
13
|
+
* rest-to-rest delta.
|
|
14
|
+
*/
|
|
15
|
+
export declare function rigidize(m: readonly number[]): number[];
|
|
16
|
+
export type Vec3 = readonly [number, number, number];
|
|
17
|
+
export declare const sub3: (a: Vec3, b: Vec3) => [number, number, number];
|
|
18
|
+
export declare const dot3: (a: Vec3, b: Vec3) => number;
|
|
19
|
+
export declare const cross3: (a: Vec3, b: Vec3) => [number, number, number];
|
|
20
|
+
export declare function normalize3(a: Vec3): [number, number, number];
|
|
21
|
+
/**
|
|
22
|
+
* Builds an orthonormal world frame (column-major 4x4) from a bone's geometric DIRECTION and position,
|
|
23
|
+
* NOT its stored local axes — the key to convention-free retargeting. The primary column X = `axis`
|
|
24
|
+
* (the bone's world direction); a roll reference (world-up, or world-forward when the axis is
|
|
25
|
+
* near-vertical) is Gram-Schmidt'd against X for Y; Z = X×Y. Building this identically for the source
|
|
26
|
+
* and target rigs makes frameDst·frameSrc⁻¹ cancel the bone-axis convention, leaving only the real
|
|
27
|
+
* direction/pose/position difference.
|
|
28
|
+
*/
|
|
29
|
+
export declare function frameFromAxis(axis: Vec3, pos: Vec3): number[];
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// PORTED from helix-web-engine-new/tools/character-pipeline — the source of truth for the character
|
|
3
|
+
// pipeline. SYNC OBLIGATION: fix bugs there first, then mirror the change here; do not diverge.
|
|
4
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
+
exports.cross3 = exports.dot3 = exports.sub3 = void 0;
|
|
6
|
+
exports.mul4 = mul4;
|
|
7
|
+
exports.invert4 = invert4;
|
|
8
|
+
exports.transformPoint = transformPoint;
|
|
9
|
+
exports.transformDir = transformDir;
|
|
10
|
+
exports.rigidize = rigidize;
|
|
11
|
+
exports.normalize3 = normalize3;
|
|
12
|
+
exports.frameFromAxis = frameFromAxis;
|
|
13
|
+
/** Column-major 4x4 multiply (glTF convention): out = a * b. */
|
|
14
|
+
function mul4(a, b) {
|
|
15
|
+
const out = new Array(16);
|
|
16
|
+
for (let col = 0; col < 4; col++) {
|
|
17
|
+
for (let row = 0; row < 4; row++) {
|
|
18
|
+
let sum = 0;
|
|
19
|
+
for (let k = 0; k < 4; k++)
|
|
20
|
+
sum += a[k * 4 + row] * b[col * 4 + k];
|
|
21
|
+
out[col * 4 + row] = sum;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
return out;
|
|
25
|
+
}
|
|
26
|
+
/** Full 4x4 inverse (column-major), via cofactor expansion (gl-matrix). Throws on a singular matrix. */
|
|
27
|
+
function invert4(m) {
|
|
28
|
+
const a00 = m[0], a01 = m[1], a02 = m[2], a03 = m[3];
|
|
29
|
+
const a10 = m[4], a11 = m[5], a12 = m[6], a13 = m[7];
|
|
30
|
+
const a20 = m[8], a21 = m[9], a22 = m[10], a23 = m[11];
|
|
31
|
+
const a30 = m[12], a31 = m[13], a32 = m[14], a33 = m[15];
|
|
32
|
+
const b00 = a00 * a11 - a01 * a10, b01 = a00 * a12 - a02 * a10, b02 = a00 * a13 - a03 * a10;
|
|
33
|
+
const b03 = a01 * a12 - a02 * a11, b04 = a01 * a13 - a03 * a11, b05 = a02 * a13 - a03 * a12;
|
|
34
|
+
const b06 = a20 * a31 - a21 * a30, b07 = a20 * a32 - a22 * a30, b08 = a20 * a33 - a23 * a30;
|
|
35
|
+
const b09 = a21 * a32 - a22 * a31, b10 = a21 * a33 - a23 * a31, b11 = a22 * a33 - a23 * a32;
|
|
36
|
+
let det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;
|
|
37
|
+
if (det === 0)
|
|
38
|
+
throw new Error('invert4: singular matrix');
|
|
39
|
+
det = 1 / det;
|
|
40
|
+
return [
|
|
41
|
+
(a11 * b11 - a12 * b10 + a13 * b09) * det, (a02 * b10 - a01 * b11 - a03 * b09) * det, (a31 * b05 - a32 * b04 + a33 * b03) * det, (a22 * b04 - a21 * b05 - a23 * b03) * det,
|
|
42
|
+
(a12 * b08 - a10 * b11 - a13 * b07) * det, (a00 * b11 - a02 * b08 + a03 * b07) * det, (a32 * b02 - a30 * b05 - a33 * b01) * det, (a20 * b05 - a22 * b02 + a23 * b01) * det,
|
|
43
|
+
(a10 * b10 - a11 * b08 + a13 * b06) * det, (a01 * b08 - a00 * b10 - a03 * b06) * det, (a30 * b04 - a31 * b02 + a33 * b00) * det, (a21 * b02 - a20 * b04 - a23 * b00) * det,
|
|
44
|
+
(a11 * b07 - a10 * b09 - a12 * b06) * det, (a00 * b09 - a01 * b07 + a02 * b06) * det, (a31 * b01 - a30 * b03 - a32 * b00) * det, (a20 * b03 - a21 * b01 + a22 * b00) * det,
|
|
45
|
+
];
|
|
46
|
+
}
|
|
47
|
+
/** Transform a point (w=1) by a column-major 4x4; returns [x,y,z] (affine, no perspective divide). */
|
|
48
|
+
function transformPoint(m, p) {
|
|
49
|
+
const [x, y, z] = p;
|
|
50
|
+
return [
|
|
51
|
+
m[0] * x + m[4] * y + m[8] * z + m[12],
|
|
52
|
+
m[1] * x + m[5] * y + m[9] * z + m[13],
|
|
53
|
+
m[2] * x + m[6] * y + m[10] * z + m[14],
|
|
54
|
+
];
|
|
55
|
+
}
|
|
56
|
+
/** Transform a direction (w=0) by the upper 3x3 of a column-major 4x4 (no translation). */
|
|
57
|
+
function transformDir(m, d) {
|
|
58
|
+
const [x, y, z] = d;
|
|
59
|
+
return [m[0] * x + m[4] * y + m[8] * z, m[1] * x + m[5] * y + m[9] * z, m[2] * x + m[6] * y + m[10] * z];
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Strips scale from a column-major TRS matrix: normalizes the three basis columns (leaving pure
|
|
63
|
+
* rotation) and keeps the translation. Used to build scale-free world frames for retargeting, so a
|
|
64
|
+
* rig authored at a non-unit armature scale (e.g. Meshy's 0.01) doesn't leak its scale into the
|
|
65
|
+
* rest-to-rest delta.
|
|
66
|
+
*/
|
|
67
|
+
function rigidize(m) {
|
|
68
|
+
const norm = (a, b, c) => {
|
|
69
|
+
const len = Math.hypot(m[a], m[b], m[c]) || 1;
|
|
70
|
+
return [m[a] / len, m[b] / len, m[c] / len];
|
|
71
|
+
};
|
|
72
|
+
const [x0, x1, x2] = norm(0, 1, 2);
|
|
73
|
+
const [y0, y1, y2] = norm(4, 5, 6);
|
|
74
|
+
const [z0, z1, z2] = norm(8, 9, 10);
|
|
75
|
+
return [x0, x1, x2, 0, y0, y1, y2, 0, z0, z1, z2, 0, m[12], m[13], m[14], 1];
|
|
76
|
+
}
|
|
77
|
+
const sub3 = (a, b) => [a[0] - b[0], a[1] - b[1], a[2] - b[2]];
|
|
78
|
+
exports.sub3 = sub3;
|
|
79
|
+
const dot3 = (a, b) => a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
|
|
80
|
+
exports.dot3 = dot3;
|
|
81
|
+
const cross3 = (a, b) => [a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0]];
|
|
82
|
+
exports.cross3 = cross3;
|
|
83
|
+
function normalize3(a) {
|
|
84
|
+
const len = Math.hypot(a[0], a[1], a[2]) || 1;
|
|
85
|
+
return [a[0] / len, a[1] / len, a[2] / len];
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Builds an orthonormal world frame (column-major 4x4) from a bone's geometric DIRECTION and position,
|
|
89
|
+
* NOT its stored local axes — the key to convention-free retargeting. The primary column X = `axis`
|
|
90
|
+
* (the bone's world direction); a roll reference (world-up, or world-forward when the axis is
|
|
91
|
+
* near-vertical) is Gram-Schmidt'd against X for Y; Z = X×Y. Building this identically for the source
|
|
92
|
+
* and target rigs makes frameDst·frameSrc⁻¹ cancel the bone-axis convention, leaving only the real
|
|
93
|
+
* direction/pose/position difference.
|
|
94
|
+
*/
|
|
95
|
+
function frameFromAxis(axis, pos) {
|
|
96
|
+
const x = normalize3(axis);
|
|
97
|
+
const ref = Math.abs(x[1]) > 0.9 ? [0, 0, 1] : [0, 1, 0];
|
|
98
|
+
const yRaw = (0, exports.sub3)(ref, [x[0] * (0, exports.dot3)(ref, x), x[1] * (0, exports.dot3)(ref, x), x[2] * (0, exports.dot3)(ref, x)]);
|
|
99
|
+
const y = normalize3(yRaw);
|
|
100
|
+
const z = (0, exports.cross3)(x, y);
|
|
101
|
+
return [x[0], x[1], x[2], 0, y[0], y[1], y[2], 0, z[0], z[1], z[2], 0, pos[0], pos[1], pos[2], 1];
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=mat4.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mat4.js","sourceRoot":"","sources":["../../src/character/mat4.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// PORTED from helix-web-engine-new/tools/character-pipeline — the source of truth for the character
|
|
3
|
+
// pipeline. SYNC OBLIGATION: fix bugs there first, then mirror the change here; do not diverge.
|
|
4
|
+
// Embedded copy of assets/meshy-to-helix.json as a typed module (the CLI ships no loose asset files).
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.MESHY_TO_HELIX_MAP = void 0;
|
|
7
|
+
exports.MESHY_TO_HELIX_MAP = {
|
|
8
|
+
name: 'meshy-biped -> helix-humanoid@1',
|
|
9
|
+
version: '1.0.0',
|
|
10
|
+
comment: "Bone map for Meshy AI / Mixamo-style biped rigs (24-bone, Blender glTF export, no fingers, single-bone hands) onto the helix-humanoid@1 core skeleton. " +
|
|
11
|
+
"Mapped BY HIERARCHY ROLE, not by name: Meshy's spine numbering is INVERTED vs UE (its 'Spine02' is the bottom spine bone, child of Hips; its 'Spine' is " +
|
|
12
|
+
"the top, parent of the shoulders). Unmapped helix bones (spine_02/04, neck_02, twists, fingers, FACIAL_C_FacialRoot) have no source and are left at rest. " +
|
|
13
|
+
'head_end/headfront are Meshy leaf helpers with no target and are dropped.',
|
|
14
|
+
map: {
|
|
15
|
+
Hips: 'pelvis',
|
|
16
|
+
Spine02: 'spine_01',
|
|
17
|
+
Spine01: 'spine_03',
|
|
18
|
+
Spine: 'spine_05',
|
|
19
|
+
neck: 'neck_01',
|
|
20
|
+
Head: 'head',
|
|
21
|
+
LeftShoulder: 'clavicle_l',
|
|
22
|
+
LeftArm: 'upperarm_l',
|
|
23
|
+
LeftForeArm: 'lowerarm_l',
|
|
24
|
+
LeftHand: 'hand_l',
|
|
25
|
+
RightShoulder: 'clavicle_r',
|
|
26
|
+
RightArm: 'upperarm_r',
|
|
27
|
+
RightForeArm: 'lowerarm_r',
|
|
28
|
+
RightHand: 'hand_r',
|
|
29
|
+
LeftUpLeg: 'thigh_l',
|
|
30
|
+
LeftLeg: 'calf_l',
|
|
31
|
+
LeftFoot: 'foot_l',
|
|
32
|
+
LeftToeBase: 'ball_l',
|
|
33
|
+
RightUpLeg: 'thigh_r',
|
|
34
|
+
RightLeg: 'calf_r',
|
|
35
|
+
RightFoot: 'foot_r',
|
|
36
|
+
RightToeBase: 'ball_r',
|
|
37
|
+
},
|
|
38
|
+
drop: ['head_end', 'headfront'],
|
|
39
|
+
};
|
|
40
|
+
//# sourceMappingURL=meshyToHelixMap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"meshyToHelixMap.js","sourceRoot":"","sources":["../../src/character/meshyToHelixMap.ts"],"names":[],"mappings":";AAAA,oGAAoG;AACpG,gGAAgG;AAChG,sGAAsG;;;AAIzF,QAAA,kBAAkB,GAAY;IACzC,IAAI,EAAE,iCAAiC;IACvC,OAAO,EAAE,OAAO;IAChB,OAAO,EACL,yJAAyJ;QACzJ,0JAA0J;QAC1J,4JAA4J;QAC5J,2EAA2E;IAC7E,GAAG,EAAE;QACH,IAAI,EAAE,QAAQ;QAEd,OAAO,EAAE,UAAU;QACnB,OAAO,EAAE,UAAU;QACnB,KAAK,EAAE,UAAU;QAEjB,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,MAAM;QAEZ,YAAY,EAAE,YAAY;QAC1B,OAAO,EAAE,YAAY;QACrB,WAAW,EAAE,YAAY;QACzB,QAAQ,EAAE,QAAQ;QAElB,aAAa,EAAE,YAAY;QAC3B,QAAQ,EAAE,YAAY;QACtB,YAAY,EAAE,YAAY;QAC1B,SAAS,EAAE,QAAQ;QAEnB,SAAS,EAAE,SAAS;QACpB,OAAO,EAAE,QAAQ;QACjB,QAAQ,EAAE,QAAQ;QAClB,WAAW,EAAE,QAAQ;QAErB,UAAU,EAAE,SAAS;QACrB,QAAQ,EAAE,QAAQ;QAClB,SAAS,EAAE,QAAQ;QACnB,YAAY,EAAE,QAAQ;KACvB;IACD,IAAI,EAAE,CAAC,UAAU,EAAE,WAAW,CAAC;CAChC,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export type Quat = readonly [number, number, number, number];
|
|
2
|
+
export declare function mul(a: Quat, b: Quat): [number, number, number, number];
|
|
3
|
+
/** Inverse of a unit quaternion (conjugate). */
|
|
4
|
+
export declare const conj: (q: Quat) => [number, number, number, number];
|
|
5
|
+
export declare function normalize(q: Quat): [number, number, number, number];
|
|
6
|
+
/** Quaternion from the upper-3x3 of a column-major matrix (assumed a pure rotation). three.js algorithm. */
|
|
7
|
+
export declare function fromMat(m: readonly number[]): [number, number, number, number];
|
|
8
|
+
/** Rotate a 3-vector by a unit quaternion (q · v · q⁻¹). */
|
|
9
|
+
export declare function rotateVec(q: Quat, v: readonly [number, number, number]): [number, number, number];
|
|
10
|
+
/** Spherical linear interpolation with double-cover (shortest-arc) handling. */
|
|
11
|
+
export declare function slerp(a: Quat, b: Quat, t: number): [number, number, number, number];
|
|
12
|
+
/** Sample a rotation track (sorted `times`, flat VEC4 `quats`) at time `t` with slerp. */
|
|
13
|
+
export declare function sampleQuat(times: ArrayLike<number>, quats: ArrayLike<number>, t: number): [number, number, number, number];
|
|
14
|
+
/** Sample a VEC3 track (translation) at time `t` with linear interpolation. */
|
|
15
|
+
export declare function sampleVec3(times: ArrayLike<number>, vals: ArrayLike<number>, t: number): [number, number, number];
|