1use oxihuman_morph::presets::BodyPreset;
7use oxihuman_morph::ExpressionPreset;
8
9pub fn print_help() {
10 println!(
11 "OxiHuman CLI v{} — Copyright (C) 2026 COOLJAPAN OU (Team KitaSan)",
12 env!("CARGO_PKG_VERSION")
13 );
14 println!();
15 println!("SUBCOMMANDS:");
16 println!(" generate Build a morphed .glb file");
17 println!(" pack-build Scan targets directory and build manifest");
18 println!(" validate Validate a single .target file or a pack manifest");
19 println!(" info Print mesh/GLB/manifest info");
20 println!(" session Print info about a saved session JSON");
21 println!(" stats Parse an OBJ file and print mesh statistics");
22 println!(" workspace Print workspace/build info (version, crates, features)");
23 println!(" quantize Quantize a base OBJ mesh into a compact QMSH binary");
24 println!(" morph-export Export morph targets directory to OXMD binary format");
25 println!(" zip-pack Pack base mesh + targets into a self-contained ZIP");
26 println!(" stl Export mesh to STL (ASCII or binary)");
27 println!(" collada Export mesh to COLLADA (.dae)");
28 println!(" gltf-sep Export mesh to glTF + separate .bin file");
29 println!(" svg Export mesh wireframe/UV to SVG");
30 println!(" lod-export Export LOD pack (multiple decimation levels)");
31 println!(" variant-pack Export multiple character variants as a named pack");
32 println!(" report Generate an HTML pipeline report");
33 println!(" asset-bundle Pack base mesh + targets into an OXB asset bundle");
34 println!(" pc2 Bake a base mesh (optionally animated) to a PC2 point cache");
35 println!(" mdd Bake a base mesh (optionally animated) to an MDD point cache");
36 println!(" anim-bake Bake an animated params source to PC2/MDD");
37 println!(" stream-export Stream-export mesh positions in chunks");
38 println!(" plugin-list List built-in plugin descriptors");
39 println!(
40 " remesh Remesh an OBJ via voxelization + Marching Cubes (--voxel-size)"
41 );
42 println!(" physics-export Export physics scene (gltf-physics or openxr)");
43 println!(" camera-info Print default camera rig JSON");
44 println!(" pack-dist-manifest Generate SHA-256 distribution manifest for a pack directory");
45 println!(" pack-verify-dist Verify a pack directory against a distribution manifest");
46 println!(" pack-wizard Interactive wizard to build an .oxp asset pack step by step");
47 println!(" pack-core Curate MakeHuman CC0 assets into an OHPK v1 core/full pack");
48 println!();
49 println!("GENERATE OPTIONS:");
50 println!(" --base <PATH> Base .obj mesh file (required)");
51 println!(" --targets <DIR> Directory of .target morph files");
52 println!(" --params <JSON|PATH> Inline JSON or path to params JSON file");
53 println!(" --preset <NAME> Body preset (average/athletic/slender/heavy/tall/petite/senior/child)");
54 println!(
55 " --expression <NAME> Expression preset (neutral/smile/frown/surprised/angry/sad)"
56 );
57 println!(" --output <PATH> Output .glb file (required)");
58 println!(" --output-obj <PATH> Also export as Wavefront .obj");
59 println!(" --max-targets <N> Limit targets loaded (default: all)");
60 println!(" --strict Use strict policy profile");
61 println!(" --measurements Print body measurements JSON to stdout");
62 println!(" --save-session <PATH> Save current params as a session JSON");
63 println!(" --load-session <PATH> Load params from a session JSON file");
64 println!(" --quantize <PATH> Also export a quantized QMSH binary");
65 println!();
66 println!("SESSION OPTIONS:");
67 println!(" <FILE> Path to session .json file");
68 println!();
69 println!("PACK-BUILD OPTIONS:");
70 println!(" --targets <DIR> Targets directory to scan (required)");
71 println!(" --output <PATH> Output manifest .toml file");
72 println!(" --max-targets <N> Limit files scanned");
73 println!();
74 println!("VALIDATE OPTIONS:");
75 println!(" <FILE> Path to .target file");
76 println!(" --pack <MANIFEST> Path to pack manifest .toml file");
77 println!();
78 println!("INFO OPTIONS:");
79 println!(" <FILE> Path to .glb, .obj, or .toml manifest");
80 println!();
81 println!("STATS OPTIONS:");
82 println!(" <FILE> Path to Wavefront .obj file (required)");
83 println!(" --full Show full statistics (aspect ratios, face area range)");
84 println!(" --json Output as JSON instead of human-readable text");
85 println!();
86 println!("PRESETS: {}", BodyPreset::all_names().join(", "));
87 println!("EXPRESSIONS: {}", ExpressionPreset::all_names().join(", "));
88 println!();
89 println!("PROXIES OPTIONS:");
90 println!(" --base <PATH> Wavefront .obj mesh file (required)");
91 println!(" --output <PATH> Write JSON output to file (default: stdout)");
92 println!(" --json Force JSON output (always on for this command)");
93 println!();
94 println!("QUANTIZE OPTIONS:");
95 println!(" --base <PATH> Base .obj mesh file (required)");
96 println!(" --output <PATH> Output .qmsh binary file (required)");
97 println!(" --stats Print quantization statistics to stdout");
98 println!();
99 println!("MORPH-EXPORT OPTIONS:");
100 println!(" --base <PATH> Base .obj mesh file (required)");
101 println!(" --targets <DIR> Directory of .target morph files (required)");
102 println!(" --output <PATH> Output .oxmd binary file (required)");
103 println!(" --max-targets <N> Limit number of targets exported (default: all)");
104 println!();
105 println!("ZIP-PACK OPTIONS:");
106 println!(" --base <PATH> Base .obj mesh file (required)");
107 println!(" --targets <DIR> Directory of .target morph files (required)");
108 println!(" --output <PATH> Output .zip archive file (required)");
109 println!();
110 println!("STL OPTIONS:");
111 println!(" --base <PATH> Base .obj mesh file (required)");
112 println!(" --output <PATH> Output .stl file (required)");
113 println!(" --binary Write binary STL (default: ASCII)");
114 println!(" --targets <DIR> Directory of .target morph files");
115 println!(" --params <JSON|PATH> Inline JSON or path to params JSON file");
116 println!(" --preset <NAME> Body preset name");
117 println!();
118 println!("COLLADA OPTIONS:");
119 println!(" --base <PATH> Base .obj mesh file (required)");
120 println!(" --output <PATH> Output .dae file (required)");
121 println!(" --targets <DIR> Directory of .target morph files");
122 println!(" --params <JSON|PATH> Inline JSON or path to params JSON file");
123 println!(" --preset <NAME> Body preset name");
124 println!(" --author <STRING> Author metadata string (default: OxiHuman)");
125 println!();
126 println!("GLTF-SEP OPTIONS:");
127 println!(" --base <PATH> Base .obj mesh file (required)");
128 println!(" --output <PATH> Output .gltf file (required)");
129 println!(" --bin <PATH> Separate .bin path (default: same stem + .bin)");
130 println!(" --targets <DIR> Directory of .target morph files");
131 println!(" --params <JSON|PATH> Inline JSON or path to params JSON file");
132 println!();
133 println!("SVG OPTIONS:");
134 println!(" --base <PATH> Base .obj mesh file (required)");
135 println!(" --output <PATH> Output .svg file (required)");
136 println!(" --projection <front|side|top> Projection axis (default: front)");
137 println!(" --uv Export UV map instead of projected wireframe");
138 println!(" --width <N> Canvas width in pixels (default: 800)");
139 println!(" --height <N> Canvas height in pixels (default: 600)");
140 println!();
141 println!("LOD-EXPORT OPTIONS:");
142 println!(" --base <PATH> Base .obj mesh file (required)");
143 println!(" --output-dir <DIR> Output directory for LOD GLBs (required)");
144 println!(" --targets <DIR> Directory of .target morph files");
145 println!(" --params <JSON|PATH> Inline JSON or path to params JSON file");
146 println!(" --preset <NAME> Body preset name");
147 println!(" --levels <N> Number of LOD levels (default: 3, uses built-in)");
148 println!();
149 println!("VARIANT-PACK OPTIONS:");
150 println!(" --params-list <JSON_FILE> JSON array of param objects (required)");
151 println!(" --base <PATH> Base .obj mesh file (required)");
152 println!(" --targets <DIR> Directory of .target morph files");
153 println!(" --output-dir <DIR> Output directory for the pack (required)");
154 println!(" --pack-name <NAME> Pack name (default: oxihuman_variants)");
155 println!();
156 println!("REPORT OPTIONS:");
157 println!(" --base <PATH> Base .obj mesh file (required)");
158 println!(" --output <HTML> Output .html report file (required)");
159 println!(" --targets <DIR> Directory of .target morph files (optional)");
160 println!(" --pack <MANIFEST> Path to manifest JSON file (optional)");
161 println!(" --title <STRING> Report title (default: OxiHuman Report)");
162 println!();
163 println!("ASSET-BUNDLE OPTIONS:");
164 println!(" --base <PATH> Base .obj mesh file (required)");
165 println!(" --targets <DIR> Directory of .target morph files (required)");
166 println!(" --output <BUNDLE> Output .oxb bundle file (required)");
167 println!(" --manifest <TOML> Optional manifest TOML file");
168 println!();
169 println!("PC2 OPTIONS:");
170 println!(" --input <PATH> Base .obj mesh file (required)");
171 println!(" --output <PATH> Output .pc2 file (required)");
172 println!(" --targets <DIR> Directory of .target morph files (optional)");
173 println!(
174 " --anim <JSON> Keyframed or snapshot params JSON (optional; see anim-bake)"
175 );
176 println!(" --frames <N> Frame count when --anim doesn't fix it (default: 10)");
177 println!(" --fps <F32> Sample rate stored in the header (default: 24.0)");
178 println!(" --start-time <F32> Start time stored in the header (default: 0.0)");
179 println!();
180 println!("MDD OPTIONS:");
181 println!(" --input <PATH> Base .obj mesh file (required)");
182 println!(" --output <PATH> Output .mdd file (required)");
183 println!(" --targets <DIR> Directory of .target morph files (optional)");
184 println!(
185 " --anim <JSON> Keyframed or snapshot params JSON (optional; see anim-bake)"
186 );
187 println!(" --frames <N> Frame count when --anim doesn't fix it (default: 10)");
188 println!(" --fps <F32> Playback rate; also drives per-frame timestamps (default: 24.0)");
189 println!();
190 println!("ANIM-BAKE OPTIONS:");
191 println!(" --input <PATH> Base .obj mesh file (required)");
192 println!(" --params-json <JSON> Params JSON: dense per-frame array, or");
193 println!(" {{\"keyframes\":[{{\"time\":f32,\"params\":{{...}}}}]}} (required)");
194 println!(" --targets <DIR> Directory of .target morph files (optional; needed for");
195 println!(" animated params to actually displace vertices)");
196 println!(" --output <PATH> Output cache file (required)");
197 println!(" --format <pc2|mdd> Output format (default: pc2)");
198 println!(" --fps <F32> Sample rate (default: 30.0)");
199 println!(" --frames <N> Frame count for keyframe sources (default: derived from duration)");
200 println!();
201 println!("PACK-CORE OPTIONS:");
202 println!(" --upstream <DIR> MakeHuman data tree (default: assets/upstream/makehuman)");
203 println!(" --tier <core|full> core = curated adult-only budget pack; full = everything (default: core)");
204 println!(
205 " --out <FILE> Output .ohpk file (default: assets/packs or dist per tier)"
206 );
207 println!(" --manifest <TOML> Asset manifest reference (default: assets/alpha_pack/oxihuman_assets.toml)");
208 println!(" --budget-gzip-bytes <N> Core-tier on-disk byte budget (default: 2097152)");
209 println!(" --report <MD> Reconstruction-error report path (core tier)");
210 println!();
211 println!("PACK-DIST-MANIFEST OPTIONS:");
212 println!(" --pack-dir <DIR> Directory to scan (required)");
213 println!();
214 println!("PACK-VERIFY-DIST OPTIONS:");
215 println!(" --manifest <FILE> Distribution manifest JSON file (required)");
216 println!(" --pack-dir <DIR> Pack directory to verify (required)");
217}