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!(" anim-bake Bake animation cache from params JSON array to PC2/MDD");
35 println!(" stream-export Stream-export mesh positions in chunks");
36 println!(" plugin-list List built-in plugin descriptors");
37 println!(" remesh Remesh an OBJ (isotropic, stub)");
38 println!(" physics-export Export physics scene (gltf-physics or openxr)");
39 println!(" camera-info Print default camera rig JSON");
40 println!(" pack-dist-manifest Generate SHA-256 distribution manifest for a pack directory");
41 println!(" pack-verify-dist Verify a pack directory against a distribution manifest");
42 println!(" pack-wizard Interactive wizard to build an .oxp asset pack step by step");
43 println!();
44 println!("GENERATE OPTIONS:");
45 println!(" --base <PATH> Base .obj mesh file (required)");
46 println!(" --targets <DIR> Directory of .target morph files");
47 println!(" --params <JSON|PATH> Inline JSON or path to params JSON file");
48 println!(" --preset <NAME> Body preset (average/athletic/slender/heavy/tall/petite/senior/child)");
49 println!(
50 " --expression <NAME> Expression preset (neutral/smile/frown/surprised/angry/sad)"
51 );
52 println!(" --output <PATH> Output .glb file (required)");
53 println!(" --output-obj <PATH> Also export as Wavefront .obj");
54 println!(" --max-targets <N> Limit targets loaded (default: all)");
55 println!(" --strict Use strict policy profile");
56 println!(" --measurements Print body measurements JSON to stdout");
57 println!(" --save-session <PATH> Save current params as a session JSON");
58 println!(" --load-session <PATH> Load params from a session JSON file");
59 println!(" --quantize <PATH> Also export a quantized QMSH binary");
60 println!();
61 println!("SESSION OPTIONS:");
62 println!(" <FILE> Path to session .json file");
63 println!();
64 println!("PACK-BUILD OPTIONS:");
65 println!(" --targets <DIR> Targets directory to scan (required)");
66 println!(" --output <PATH> Output manifest .toml file");
67 println!(" --max-targets <N> Limit files scanned");
68 println!();
69 println!("VALIDATE OPTIONS:");
70 println!(" <FILE> Path to .target file");
71 println!(" --pack <MANIFEST> Path to pack manifest .toml file");
72 println!();
73 println!("INFO OPTIONS:");
74 println!(" <FILE> Path to .glb, .obj, or .toml manifest");
75 println!();
76 println!("STATS OPTIONS:");
77 println!(" <FILE> Path to Wavefront .obj file (required)");
78 println!(" --full Show full statistics (aspect ratios, face area range)");
79 println!(" --json Output as JSON instead of human-readable text");
80 println!();
81 println!("PRESETS: {}", BodyPreset::all_names().join(", "));
82 println!("EXPRESSIONS: {}", ExpressionPreset::all_names().join(", "));
83 println!();
84 println!("PROXIES OPTIONS:");
85 println!(" --base <PATH> Wavefront .obj mesh file (required)");
86 println!(" --output <PATH> Write JSON output to file (default: stdout)");
87 println!(" --json Force JSON output (always on for this command)");
88 println!();
89 println!("QUANTIZE OPTIONS:");
90 println!(" --base <PATH> Base .obj mesh file (required)");
91 println!(" --output <PATH> Output .qmsh binary file (required)");
92 println!(" --stats Print quantization statistics to stdout");
93 println!();
94 println!("MORPH-EXPORT OPTIONS:");
95 println!(" --base <PATH> Base .obj mesh file (required)");
96 println!(" --targets <DIR> Directory of .target morph files (required)");
97 println!(" --output <PATH> Output .oxmd binary file (required)");
98 println!(" --max-targets <N> Limit number of targets exported (default: all)");
99 println!();
100 println!("ZIP-PACK OPTIONS:");
101 println!(" --base <PATH> Base .obj mesh file (required)");
102 println!(" --targets <DIR> Directory of .target morph files (required)");
103 println!(" --output <PATH> Output .zip archive file (required)");
104 println!();
105 println!("STL OPTIONS:");
106 println!(" --base <PATH> Base .obj mesh file (required)");
107 println!(" --output <PATH> Output .stl file (required)");
108 println!(" --binary Write binary STL (default: ASCII)");
109 println!(" --targets <DIR> Directory of .target morph files");
110 println!(" --params <JSON|PATH> Inline JSON or path to params JSON file");
111 println!(" --preset <NAME> Body preset name");
112 println!();
113 println!("COLLADA OPTIONS:");
114 println!(" --base <PATH> Base .obj mesh file (required)");
115 println!(" --output <PATH> Output .dae file (required)");
116 println!(" --targets <DIR> Directory of .target morph files");
117 println!(" --params <JSON|PATH> Inline JSON or path to params JSON file");
118 println!(" --preset <NAME> Body preset name");
119 println!(" --author <STRING> Author metadata string (default: OxiHuman)");
120 println!();
121 println!("GLTF-SEP OPTIONS:");
122 println!(" --base <PATH> Base .obj mesh file (required)");
123 println!(" --output <PATH> Output .gltf file (required)");
124 println!(" --bin <PATH> Separate .bin path (default: same stem + .bin)");
125 println!(" --targets <DIR> Directory of .target morph files");
126 println!(" --params <JSON|PATH> Inline JSON or path to params JSON file");
127 println!();
128 println!("SVG OPTIONS:");
129 println!(" --base <PATH> Base .obj mesh file (required)");
130 println!(" --output <PATH> Output .svg file (required)");
131 println!(" --projection <front|side|top> Projection axis (default: front)");
132 println!(" --uv Export UV map instead of projected wireframe");
133 println!(" --width <N> Canvas width in pixels (default: 800)");
134 println!(" --height <N> Canvas height in pixels (default: 600)");
135 println!();
136 println!("LOD-EXPORT OPTIONS:");
137 println!(" --base <PATH> Base .obj mesh file (required)");
138 println!(" --output-dir <DIR> Output directory for LOD GLBs (required)");
139 println!(" --targets <DIR> Directory of .target morph files");
140 println!(" --params <JSON|PATH> Inline JSON or path to params JSON file");
141 println!(" --preset <NAME> Body preset name");
142 println!(" --levels <N> Number of LOD levels (default: 3, uses built-in)");
143 println!();
144 println!("VARIANT-PACK OPTIONS:");
145 println!(" --params-list <JSON_FILE> JSON array of param objects (required)");
146 println!(" --base <PATH> Base .obj mesh file (required)");
147 println!(" --targets <DIR> Directory of .target morph files");
148 println!(" --output-dir <DIR> Output directory for the pack (required)");
149 println!(" --pack-name <NAME> Pack name (default: oxihuman_variants)");
150 println!();
151 println!("REPORT OPTIONS:");
152 println!(" --base <PATH> Base .obj mesh file (required)");
153 println!(" --output <HTML> Output .html report file (required)");
154 println!(" --targets <DIR> Directory of .target morph files (optional)");
155 println!(" --pack <MANIFEST> Path to manifest JSON file (optional)");
156 println!(" --title <STRING> Report title (default: OxiHuman Report)");
157 println!();
158 println!("ASSET-BUNDLE OPTIONS:");
159 println!(" --base <PATH> Base .obj mesh file (required)");
160 println!(" --targets <DIR> Directory of .target morph files (required)");
161 println!(" --output <BUNDLE> Output .oxb bundle file (required)");
162 println!(" --manifest <TOML> Optional manifest TOML file");
163 println!();
164 println!("PACK-DIST-MANIFEST OPTIONS:");
165 println!(" --pack-dir <DIR> Directory to scan (required)");
166 println!();
167 println!("PACK-VERIFY-DIST OPTIONS:");
168 println!(" --manifest <FILE> Distribution manifest JSON file (required)");
169 println!(" --pack-dir <DIR> Pack directory to verify (required)");
170}