code wiki / (root) / nx_skullskin.nx

nx_skullskin.nx source

↩ module page · 227 lines · 13462 B

1// nx_skullskin.nx -- FROM THE GENERATED SKULL TO A SKIN THAT SITS ON IT, RENDERED (aesthetictwin AT46, 2026-09-18). 2// 3// Composes nx_skullsdf (the skull as a fused shell, run as a child or supplied as a mesh) -> nx_tissuefield_lib (landmarks 4// located on the skull, the forensic tissue-depth field, controllable fat compartments, the offset skin, the eye, nose and 5// vermilion patches) -> nx_trimesh (the rasteriser) -> nx_png. Emits the skin as NXMSH2 (for nx_facemark) and five renders: 6// skin close, skin three-quarter, skull close, skull|skin side by side, and a cutaway (the subject's left half of the skin 7// removed so the skull shows under it). Every derived number is printed on the receipt with its inputs. 8// 9// nx_skullskin <sex 0-1000> <seed> <out.nxmesh> [key=value ...] 10// keys: skull=<in.nxmesh> (else ./nx_skullsdf.elf is run from the estate root with cell=2000 um) 11// conf=<path> (default knowledge/tissue_depth.conf) png=<prefix> (default the out path without .nxmesh) 12// malar=<mm10> nasolabial=<mm10> jowl=<mm10> (compartment magnitudes; the conf rows are the defaults) 13// tilt=<deg10> (canthal tilt of the fissure almond; 0 = the canon) robust=<0-1000> cell=<um> skin=<r,g,b> 14// seed is RESERVED for the identity layer (the skull generator takes sex and robust; announced, never silently ignored) 15// exit: 0 built | 2 usage | 3 conf unreadable | 4 skull unavailable | 5 landmarks refused | 6 mesh write refused 16// license_tier: ORIGINAL expect_exit: 0 No hw writes (Rule 26). 17import "nx_syscalls.nx" 18import "nx_tissuefield_lib.nx" 19 20const SKN_EXIT_USAGE: i64 = 2 21const SKN_EXIT_CONF: i64 = 3 22const SKN_EXIT_SKULL: i64 = 4 23const SKN_EXIT_LOCATE: i64 = 5 24const SKN_EXIT_WRITE: i64 = 6 25const SKN_ARGC_MIN: i64 = 4 26const SKN_W: i64 = 512 // the frame nx_sdfrender renders the results boards at (W 512, H 384) 27const SKN_H: i64 = 384 28const SKN_YAW_THREEQUARTER: i64 = 2145 // thirty degrees in rad*4096, the results lane's three-quarter view 29const SKN_ROBUST_DEFAULT: i64 = 500 30const SKN_CELL_UM_DEFAULT: i64 = 2000 // 2 mm cells: nx_skullsdf's measured resolution floor (G 160..319 all yield cell 2) 31const SKN_EQ: i64 = 61 32const SKN_COMMA: i64 = 44 33const SKN_PATHB: i64 = 512 34const SKN_KEY_CAP: i64 = 64 35const SKN_I64: i64 = 8 36 37static SKN_T0: i64 38 39func skn_puts(s: *u8) -> i64 { return tfl_puts(s) } 40func skn_kv(k: *u8, v: i64) -> i64 { return tfl_kv(k, v) } 41func skn_ms() -> i64 { return sys_now_ms() - SKN_T0 } 42// key=value scan over argv[from..argc): returns the value pointer for key, or 0 43func skn_arg(argc: i64, argv: *i64, from: i64, key: *u8) -> *u8 { 44 let kl: i64 = tfl_slen(key) 45 var i: i64 = from 46 while i < argc { 47 let a: *u8 = argv[i] as *u8 48 var k: i64 = 0 49 var ok: i64 = 1 50 while k < kl { if a[k] != key[k] { ok = 0; k = kl } else { k = k + 1 } } 51 if ok == 1 { if a[kl] == (SKN_EQ as u8) { return ((a as i64) + kl + 1) as *u8 } } 52 i = i + 1 53 } 54 return 0 as *u8 55} 56func skn_argn(argc: i64, argv: *i64, from: i64, key: *u8, dflt: i64) -> i64 { 57 let v: *u8 = skn_arg(argc, argv, from, key) 58 if (v as i64) == 0 { return dflt } 59 return tfl_atoi(v) 60} 61// r,g,b -> packed r + g*256 + b*65536 (the rasteriser's pixel order) 62func skn_rgb(s: *u8) -> i64 { 63 let n: i64 = tfl_slen(s) 64 let buf: *u8 = sys_mmap(n + 2) 65 var i: i64 = 0 66 while i <= n { buf[i] = s[i]; i = i + 1 } 67 var parts: i64 = 0 68 var start: i64 = 0 69 var r: i64 = 0; var g: i64 = 0; var b: i64 = 0 70 i = 0 71 while i <= n { 72 if buf[i] == (SKN_COMMA as u8) { buf[i] = 0 as u8 } 73 if buf[i] == (0 as u8) { 74 let v: i64 = tfl_atoi(((buf as i64) + start) as *u8) 75 if parts == 0 { r = v } if parts == 1 { g = v } if parts == 2 { b = v } 76 parts = parts + 1 77 start = i + 1 78 } 79 i = i + 1 80 } 81 return r + g * 256 + b * 256 * 256 82} 83func skn_render_to(fb: *i64, prefix: *u8, suffix: *u8, w: i64, h: i64) -> i64 { 84 let p: *u8 = sys_mmap(SKN_PATHB) 85 var o: i64 = tfl_cat(p, 0, prefix) 86 o = tfl_cat(p, o, suffix) 87 let bytes: i64 = png_publish(fb, w, h, p, 1) 88 return bytes 89} 90// build the scene for one view: which = 0 skin, 1 skull, 2 cutaway (skin x>=centre + skull) 91func skn_scene(which: i64, M: *i64, S: *i64, T: *i64, tilt10: i64, skin_col: i64, eyes_out: *i64, nose_out: *i64) -> i64 { 92 tm_reset() 93 var tris: i64 = 0 94 if which == 1 { tris = tris + tfl_push_mesh(M, TFL_COL_BONE, 0) } 95 if which == 2 { tris = tris + tfl_push_mesh(M, TFL_COL_BONE, 0) } 96 if which != 1 { 97 var side: i64 = 0 98 if which == 2 { side = 1 } 99 let base: i64 = tm_nv() 100 tris = tris + tfl_push_mesh(S, skin_col, side) 101 tfl_paint_skin(S, T, base, skin_col) 102 tfl_push_eyes(M, S, T, tilt10, skin_col, eyes_out) 103 tris = tris + tfl_push_nose(S, T, skin_col, nose_out) 104 } 105 return tris 106} 107func main(argc: i64, argv: *i64) -> i64 { 108 SKN_T0 = sys_now_ms() 109 if argc < SKN_ARGC_MIN { 110 skn_puts("usage: nx_skullskin <sex 0-1000> <seed> <out.nxmesh> [skull=<in.nxmesh>] [conf=<path>] [png=<prefix>] [malar=<mm10>] [nasolabial=<mm10>] [jowl=<mm10>] [tilt=<deg10>] [robust=<0-1000>] [cell=<um>] [skin=<r,g,b>]\n" as *u8) 111 return SKN_EXIT_USAGE 112 } 113 let sex: i64 = tfl_atoi(argv[1] as *u8) 114 let seed: i64 = tfl_atoi(argv[2] as *u8) 115 let outp: *u8 = argv[3] as *u8 116 var conf: *u8 = "knowledge/tissue_depth.conf" as *u8 117 let cv: *u8 = skn_arg(argc, argv, 4, "conf" as *u8) 118 if (cv as i64) != 0 { conf = cv } 119 let T: *i64 = tfl_tab_new() 120 if tfl_conf_load(conf, T) == 0 { skn_puts("SKULLSKIN REFUSED conf unreadable: " as *u8); skn_puts(conf); skn_puts("\n" as *u8); return SKN_EXIT_CONF } 121 skn_puts("SKULLSKIN conf=" as *u8); skn_puts(conf) 122 skn_kv(" depth_rows=" as *u8, T[TFL_T_NROWS]); skn_kv(" fat_rows=" as *u8, T[TFL_T_NFAT]); skn_kv(" patch_rows=" as *u8, T[TFL_T_NPATCH]) 123 skn_kv(" pending_ref_rows=" as *u8, T[TFL_T_NPENDING]); skn_kv(" malformed=" as *u8, T[TFL_T_MALFORMED]); skn_puts("\n" as *u8) 124 // the parameter vector: conf defaults overridden by argv, printed 125 let malar: i64 = skn_argn(argc, argv, 4, "malar" as *u8, 0 - 1) 126 let naso: i64 = skn_argn(argc, argv, 4, "nasolabial" as *u8, 0 - 1) 127 let jowl: i64 = skn_argn(argc, argv, 4, "jowl" as *u8, 0 - 1) 128 if malar >= 0 { tfl_fat_set(T, "malar_l" as *u8, malar); tfl_fat_set(T, "malar_r" as *u8, malar) } 129 if naso >= 0 { tfl_fat_set(T, "nasolabial_l" as *u8, naso); tfl_fat_set(T, "nasolabial_r" as *u8, naso) } 130 if jowl >= 0 { tfl_fat_set(T, "jowl_l" as *u8, jowl); tfl_fat_set(T, "jowl_r" as *u8, jowl) } 131 let tilt10: i64 = skn_argn(argc, argv, 4, "tilt" as *u8, 0) 132 let robust: i64 = skn_argn(argc, argv, 4, "robust" as *u8, SKN_ROBUST_DEFAULT) 133 let cell_um: i64 = skn_argn(argc, argv, 4, "cell" as *u8, SKN_CELL_UM_DEFAULT) 134 var skin_col: i64 = tfl_patch(T, "skin_r" as *u8) + tfl_patch(T, "skin_g" as *u8) * 256 + tfl_patch(T, "skin_b" as *u8) * 256 * 256 135 let sv: *u8 = skn_arg(argc, argv, 4, "skin" as *u8) 136 if (sv as i64) != 0 { skin_col = skn_rgb(sv) } 137 skn_puts("SKULLSKIN params:" as *u8) 138 var fi: i64 = 0 139 while fi < T[TFL_T_NFAT] { let fr: *i64 = tfl_fatrow(T, fi); skn_puts(" " as *u8); skn_puts(fr[TFL_R_NAME] as *u8); skn_kv("=" as *u8, fr[TFL_R_DEPTH]); fi = fi + 1 } 140 skn_kv(" tilt_deg10=" as *u8, tilt10); skn_kv(" sex=" as *u8, sex); skn_kv(" robust=" as *u8, robust); skn_kv(" cell_um=" as *u8, cell_um) 141 skn_kv(" seed=" as *u8, seed); skn_puts(" (seed RESERVED for the identity layer: the skull generator takes sex and robust)" as *u8) 142 skn_kv(" skin_rgb_packed=" as *u8, skin_col); skn_puts("\n" as *u8) 143 // the skull: supplied, or generated by the promoted organ as a child 144 var skullp: *u8 = skn_arg(argc, argv, 4, "skull" as *u8) 145 if (skullp as i64) == 0 { 146 let gen: *u8 = sys_mmap(SKN_PATHB) 147 var o: i64 = tfl_cat(gen, 0, outp) 148 o = tfl_cat(gen, o, ".skull.nxmesh" as *u8) 149 let t0: i64 = skn_ms() 150 let rc: i64 = tfl_run_skullsdf(gen, sex, robust, cell_um) 151 skn_puts("SKULLSKIN skullsdf=" as *u8); skn_puts(gen); skn_kv(" rc=" as *u8, rc); skn_kv(" ms=" as *u8, skn_ms() - t0); skn_puts("\n" as *u8) 152 if rc != 0 { skn_puts("SKULLSKIN REFUSED skull generator failed (is ./nx_skullsdf.elf in the CWD?)\n" as *u8); return SKN_EXIT_SKULL } 153 skullp = gen 154 } 155 // THE ONE CALL: skull mesh -> located landmarks -> depth field -> offset, smoothed skin (the board's contract sks_surface) 156 let M: *i64 = tfl_mesh_new() 157 let K: *i64 = sys_mmap(TFL_K_N * SKN_I64) as *i64 158 let dslot: *i64 = sys_mmap(SKN_I64) as *i64 159 let t1: i64 = skn_ms() 160 let S: *i64 = sks_surface(skullp, T, M, dslot, K) 161 if (S as i64) == 0 { return SKN_EXIT_LOCATE } 162 skn_puts("SKULLSKIN skull=" as *u8); skn_puts(skullp) 163 skn_kv(" tris=" as *u8, M[TFL_M_NT]); skn_kv(" raw_verts=" as *u8, M[TFL_M_RAW]); skn_kv(" welded_verts=" as *u8, M[TFL_M_NV]); skn_kv(" edge_u10=" as *u8, M[TFL_M_EDGE]) 164 skn_kv(" bbox_u10=" as *u8, M[TFL_M_X1] - M[TFL_M_X0]); skn_kv("," as *u8, M[TFL_M_Y1] - M[TFL_M_Y0]); skn_kv("," as *u8, M[TFL_M_Z1] - M[TFL_M_Z0]) 165 skn_kv(" surface_ms=" as *u8, skn_ms() - t1); skn_puts("\n" as *u8) 166 // renders: the camera frames the head (vertex to gnathion) at frame_head_permil, looking at the face front 167 var prefix: *u8 = skn_arg(argc, argv, 4, "png" as *u8) 168 if (prefix as i64) == 0 { 169 let pb: *u8 = sys_mmap(SKN_PATHB) 170 let n: i64 = tfl_slen(outp) 171 var cut: i64 = n 172 if n > 7 { cut = n - 7 } // strip ".nxmesh" 173 var i: i64 = 0 174 while i < cut { pb[i] = outp[i]; i = i + 1 } 175 pb[cut] = 0 as u8 176 prefix = pb 177 } 178 let vt: *i64 = sys_mmap(3 * SKN_I64) as *i64 179 let gn: *i64 = sys_mmap(3 * SKN_I64) as *i64 180 tfl_get(T, "vertex" as *u8, vt); tfl_get(T, "gnathion" as *u8, gn) 181 let head: i64 = vt[1] - gn[1] + K[TFL_K_DMED] 182 let frame: i64 = tfl_patch(T, "frame_head_permil" as *u8) 183 let xc: i64 = (M[TFL_M_X0] + M[TFL_M_X1]) / 2 184 let yc: i64 = (vt[1] + gn[1]) / 2 185 // the camera looks at the skin's front at the nasion (the mid-face), never at the most anterior vertex (a chin) 186 let nsn: *i64 = sys_mmap(3 * SKN_I64) as *i64 187 tfl_get(T, "nasion" as *u8, nsn) 188 var zf: i64 = tfl_front_at(S, xc, nsn[1], 3) 189 if zf <= TFL_ZNONE { zf = S[TFL_M_Z1] } 190 let eyes: *i64 = sys_mmap(4 * SKN_I64) as *i64 191 let nose: *i64 = sys_mmap(4 * SKN_I64) as *i64 192 let fbA: *i64 = sys_mmap(SKN_W * SKN_H * SKN_I64) as *i64 193 let fbB: *i64 = sys_mmap(SKN_W * SKN_H * SKN_I64) as *i64 194 let fbP: *i64 = sys_mmap(2 * SKN_W * SKN_H * SKN_I64) as *i64 195 let t4: i64 = skn_ms() 196 var tris: i64 = skn_scene(0, M, S, T, tilt10, skin_col, eyes, nose) 197 // the skin WITH its patches is the exported mesh (nx_facemark reads it in the skull's own frame) 198 let SX: *i64 = tfl_scene_to_mesh() 199 let wb: i64 = tfl_mesh_write(SX, outp, 910, 890, 845) 200 if wb < 0 { skn_puts("SKULLSKIN REFUSED skin mesh write: " as *u8); skn_puts(outp); skn_puts("\n" as *u8); return SKN_EXIT_WRITE } 201 skn_puts("SKULLSKIN skin=" as *u8); skn_puts(outp); skn_kv(" bytes=" as *u8, wb); skn_kv(" verts=" as *u8, SX[TFL_M_NV]); skn_kv(" tris=" as *u8, SX[TFL_M_NT]); skn_puts("\n" as *u8) 202 tfl_recentre(0 - xc, yc, 0 - zf) 203 let camz: i64 = tfl_render(fbA, SKN_W, SKN_H, 0, head, frame) 204 let b1: i64 = skn_render_to(fbA, prefix, "_skin.png" as *u8, SKN_W, SKN_H) 205 skn_kv("SKULLSKIN render skin tris=" as *u8, tris); skn_kv(" eyes=" as *u8, eyes[0]); skn_kv(" rim_z_l=" as *u8, eyes[1]); skn_kv(" rim_z_r=" as *u8, eyes[2]) 206 skn_kv(" nose_tip=" as *u8, nose[0]); skn_kv("," as *u8, nose[1]); skn_kv("," as *u8, nose[2]); skn_kv(" camz_u10=" as *u8, camz); skn_kv(" head_u10=" as *u8, head); skn_kv(" png_bytes=" as *u8, b1); skn_kv(" ms=" as *u8, skn_ms() - t4); skn_puts("\n" as *u8) 207 let t5: i64 = skn_ms() 208 tfl_render(fbB, SKN_W, SKN_H, SKN_YAW_THREEQUARTER, head, frame) 209 let b2: i64 = skn_render_to(fbB, prefix, "_skin_threequarter.png" as *u8, SKN_W, SKN_H) 210 skn_kv("SKULLSKIN render skin_threequarter png_bytes=" as *u8, b2); skn_kv(" ms=" as *u8, skn_ms() - t5); skn_puts("\n" as *u8) 211 let t6: i64 = skn_ms() 212 tris = skn_scene(1, M, S, T, tilt10, skin_col, eyes, nose) 213 tfl_recentre(0 - xc, yc, 0 - zf) 214 tfl_render(fbB, SKN_W, SKN_H, 0, head, frame) 215 let b3: i64 = skn_render_to(fbB, prefix, "_skull.png" as *u8, SKN_W, SKN_H) 216 tfl_pair(fbB, fbA, SKN_W, SKN_H, fbP) 217 let b4: i64 = skn_render_to(fbP, prefix, "_pair.png" as *u8, 2 * SKN_W, SKN_H) 218 skn_kv("SKULLSKIN render skull tris=" as *u8, tris); skn_kv(" png_bytes=" as *u8, b3); skn_kv(" pair_png_bytes=" as *u8, b4); skn_kv(" ms=" as *u8, skn_ms() - t6); skn_puts("\n" as *u8) 219 let t7: i64 = skn_ms() 220 tris = skn_scene(2, M, S, T, tilt10, skin_col, eyes, nose) 221 tfl_recentre(0 - xc, yc, 0 - zf) 222 tfl_render(fbB, SKN_W, SKN_H, 0, head, frame) 223 let b5: i64 = skn_render_to(fbB, prefix, "_cutaway.png" as *u8, SKN_W, SKN_H) 224 skn_kv("SKULLSKIN render cutaway tris=" as *u8, tris); skn_kv(" png_bytes=" as *u8, b5); skn_kv(" ms=" as *u8, skn_ms() - t7); skn_puts("\n" as *u8) 225 skn_kv("SKULLSKIN total_ms=" as *u8, skn_ms()); skn_kv(" peak_rss_kb=" as *u8, tfl_peak_rss_kb()); skn_puts(" verdict=BUILT\n" as *u8) 226 return 0 227}