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}