nx_twinface.nx source
↩ module page · 72 lines · 4197 B
1// nx_twinface.nx -- aesthetictwin AT35 (2026-09-17): render the estate's own generated face (an nx_persongen identity over
2// the inside-out nx_faceanat face, the sovereign SDF renderer with its eye, lash and lip materials, our PNG writer) to a still
3// the photo ruler can read, so the SAME instrument that measures a reference photograph measures the twin's render, and the
4// outside oracle can be run on the render as the render-side liar-killer. No photo input, no third party: a seed is the
5// whole identity. The render lives in nx_twinfit_lib (tw_render_png); this is the file-door CLI.
6// nx_twinface render <seed> <yaw> <out.png> -> the identity (seven morph percents), skin tone, frame, PNG bytes on disk
7// exit: 0 ok | 2 usage | 3 png not written
8// license_tier: ORIGINAL No hw writes (Rule 26).
9import "nx_syscalls.nx"
10import "nx_twinfit_lib.nx"
11
12const TF_EXIT_USAGE: i64 = 2
13const TF_EXIT_PNG: i64 = 3
14const TF_ARGC_RENDER: i64 = 5
15const TF_ARGC_GENOME: i64 = 12
16const TF_ARGC_FITFACE: i64 = 18
17const TF_ID_FIELDS: i64 = 7 // persongen_build writes seven morph percents: width, length, jaw, eyes, lips, nose, cheek
18
19func tf_usage() -> i64 { ri_puts("usage: nx_twinface render <seed> <yaw> <out.png>\n" as *u8); return TF_EXIT_USAGE }
20
21func main(argc: i64, argv: **u8) -> i64 {
22 if argc < TF_ARGC_RENDER { return tf_usage() }
23 if ri_streq(argv[1], "fitface" as *u8) == 1 {
24 // nx_twinface fitface <7 morph pcts> <6 eye genes> <yaw> <camz> <out.png>: the thirteen-gene vector a fit printed, rendered
25 if argc < TF_ARGC_FITFACE { return tf_usage() }
26 let fbase: i64 = sys_mmap(sdf_bytes()) as i64
27 let fga: *i64 = sys_mmap(TW_ALL_GENES * TW_I64) as *i64
28 let fskin: *i64 = sys_mmap(TW_SLOTS * TW_I64) as *i64
29 tw_skin_default(fskin)
30 var fi: i64 = 0
31 while fi < TW_ALL_GENES { fga[fi] = tw_atoi(argv[2 + fi]); fi = fi + 1 }
32 let fyaw: i64 = tw_atoi(argv[2 + TW_ALL_GENES])
33 let fcamz: i64 = tw_atoi(argv[3 + TW_ALL_GENES])
34 let fn: i64 = tw_render_all_png(fbase, fga, fskin, fyaw, fcamz, argv[4 + TW_ALL_GENES])
35 tw_kv("TWINFACE fitface yaw=" as *u8, fyaw); tw_kv(" camz=" as *u8, fcamz); tw_kv(" png_bytes=" as *u8, fn); ri_puts("\n" as *u8)
36 if fn <= 0 { return TF_EXIT_PNG }
37 return 0
38 }
39 if ri_streq(argv[1], "genome" as *u8) == 1 {
40 // nx_twinface genome <w> <l> <j> <e> <p> <n> <c> <yaw> <camz> <out.png>: explicit percents, default tone, any camera distance
41 if argc < TF_ARGC_GENOME { return tf_usage() }
42 let gbase: i64 = sys_mmap(sdf_bytes()) as i64
43 let gg: *i64 = sys_mmap(TW_SLOTS * TW_I64) as *i64
44 let gskin: *i64 = sys_mmap(TW_SLOTS * TW_I64) as *i64
45 tw_skin_default(gskin)
46 var gi: i64 = 0
47 while gi < TF_ID_FIELDS { gg[gi] = tw_atoi(argv[2 + gi]); gi = gi + 1 }
48 let gyaw: i64 = tw_atoi(argv[2 + TF_ID_FIELDS])
49 let gcamz: i64 = tw_atoi(argv[3 + TF_ID_FIELDS])
50 let gn: i64 = tw_render_genome_png(gbase, gg, gskin, gyaw, gcamz, argv[4 + TF_ID_FIELDS])
51 tw_kv("TWINFACE genome yaw=" as *u8, gyaw); tw_kv(" camz=" as *u8, gcamz); tw_kv(" png_bytes=" as *u8, gn); ri_puts("\n" as *u8)
52 if gn <= 0 { return TF_EXIT_PNG }
53 return 0
54 }
55 if ri_streq(argv[1], "render" as *u8) == 0 { return tf_usage() }
56 let seed: i64 = tw_atoi(argv[2])
57 let yaw: i64 = tw_atoi(argv[3])
58 let outp: *u8 = argv[4]
59 let base: i64 = sys_mmap(sdf_bytes()) as i64
60 let skin: *i64 = sys_mmap(TW_SLOTS * TW_I64) as *i64
61 let idv: *i64 = sys_mmap(TW_SLOTS * TW_I64) as *i64
62 let n: i64 = tw_render_png(base, seed, yaw, outp, skin, idv)
63 tw_kv("TWINFACE seed=" as *u8, seed); tw_kv(" yaw=" as *u8, yaw); tw_kv(" w=" as *u8, ww()); tw_kv(" h=" as *u8, hh())
64 tw_kv(" skin=" as *u8, skin[TW_SKIN_SLOT_R]); tw_kv("," as *u8, skin[TW_SKIN_SLOT_G]); tw_kv("," as *u8, skin[TW_SKIN_SLOT_B])
65 ri_puts(" identity_pct=" as *u8)
66 var i: i64 = 0
67 while i < TF_ID_FIELDS { if i > 0 { ri_puts("," as *u8) } ri_putn(idv[i]); i = i + 1 }
68 tw_kv(" png_bytes=" as *u8, n)
69 ri_puts("\n" as *u8)
70 if n <= 0 { return TF_EXIT_PNG }
71 return 0
72}