code wiki / (root) / nx_persongen.nx

nx_persongen.nx source

↩ module page · 68 lines · 3792 B

1// nx_persongen.nx -- ★GENERATIVE PERSON FACTORY (operator north star 2026-07-08: "generate a model from the 2// bones up ... a daz-like photoreal model WITHOUT a photo reference as a NEW generative person"). A SEED grows a 3// UNIQUE novel human FACE, built bones-up (nx_faceanat = skull landmarks + tissue-depth), by driving the 4// anatomical morphs + skin tone from a deterministic PRNG. NO photo input -- a person who never existed. Same 5// seed -> same person (a reproducible identity); different seed -> a different person. This is the DAZ-equivalent 6// GENERATION (parametric identity), sovereign. (Photoreal skin micro-detail = the texture-synthesis rung on top; 7// this rung owns the IDENTITY generation bones-up.) license_tier: ORIGINAL 8import "nx_faceanat.nx" 9const K_MAGIC_6364136223846793005: i64 = 6364136223846793005 10const K_MAGIC_1442695040888963407: i64 = 1442695040888963407 11const K_MAGIC_2147483647: i64 = 2147483647 12const K_MAGIC_2654435761: i64 = 2654435761 13const K_MAGIC_1013904223: i64 = 1013904223 14 15// deterministic LCG PRNG (Knuth MMIX constants); i64 wraps on overflow = the generator. Reproducible => identity. 16func pg_next(st: *i64) -> i64 { 17 var h: i64 = st[0] 18 h = h * K_MAGIC_6364136223846793005 + K_MAGIC_1442695040888963407 19 st[0] = h 20 return (h >> 33) & K_MAGIC_2147483647 // 31 positive bits 21} 22func pg_seed(st: *i64, seed: i64) -> i64 { 23 st[0] = seed * K_MAGIC_2654435761 + K_MAGIC_1013904223 24 pg_next(st); pg_next(st); pg_next(st) // warm up (decorrelate low seeds) 25 return 0 26} 27func pg_range(st: *i64, lo: i64, hi: i64) -> i64 { return lo + pg_next(st) % (hi - lo + 1) } 28func pg_clamp(v: i64, lo: i64, hi: i64) -> i64 { if v < lo { return lo } if v > hi { return hi } return v } 29 30// grow a novel person from a seed. Fills the sdf arena `base` with a unique face (bones-up morphs) and returns 31// its skin tone in skinout[0..2]. Also fills idout[0..7] with the identity parameter vector (for inspection). 32func persongen_build(base: i64, seed: i64, skinout: *i64, idout: *i64) -> i64 { 33 let st: *i64 = sys_mmap(16) as *i64 34 pg_seed(st, seed) 35 36 // bones-up anatomical identity: morph the skull-derived geometry. ★pct is a MULTIPLIER in percent (100 = 37 // identity, 120 = x1.2); ranges centred on 100 -> valid, distinct faces (never near-zero radius). 38 let mw: i64 = pg_range(st, 85, 118) // face width 39 let ml: i64 = pg_range(st, 88, 114) // face length 40 let mj: i64 = pg_range(st, 80, 126) // jaw 41 let me: i64 = pg_range(st, 85, 120) // eyes 42 let mp: i64 = pg_range(st, 78, 132) // lips 43 let mn: i64 = pg_range(st, 84, 122) // nose 44 let mc: i64 = pg_range(st, 82, 128) // cheek 45 faceanat_build(base) 46 faceanat_morph_width(base, mw) 47 faceanat_morph_length(base, ml) 48 faceanat_morph_jaw(base, mj) 49 faceanat_morph_eyes(base, me) 50 faceanat_morph_lips(base, mp) 51 faceanat_morph_nose(base, mn) 52 faceanat_morph_cheek(base, mc) 53 idout[0]=mw; idout[1]=ml; idout[2]=mj; idout[3]=me; idout[4]=mp; idout[5]=mn; idout[6]=mc 54 55 // skin tone: pick a realistic tone family + per-person jitter (no photo -- synthesized) 56 let fam: i64 = pg_range(st, 0, 4) 57 var sr: i64 = 232; var sg: i64 = 196; var sb: i64 = 166 58 if fam == 0 { sr=246; sg=226; sb=208 } // light 59 if fam == 1 { sr=232; sg=196; sb=166 } // fair-medium 60 if fam == 2 { sr=206; sg=162; sb=126 } // olive / tan 61 if fam == 3 { sr=168; sg=122; sb=90 } // brown 62 if fam == 4 { sr=124; sg=86; sb=62 } // deep 63 sr = pg_clamp(sr + pg_range(st, 0-12, 12), 40, 255) 64 sg = pg_clamp(sg + pg_range(st, 0-12, 12), 30, 255) 65 sb = pg_clamp(sb + pg_range(st, 0-12, 12), 25, 255) 66 skinout[0]=sr; skinout[1]=sg; skinout[2]=sb; idout[7]=fam 67 return 0 68}