code wiki / (root) / nx_body_proc_boundary_candidate_t345.nx

nx_body_proc_boundary_candidate_t345.nx source

↩ module page · 1110 lines · 78491 B

1// nx_body_proc.nx -- ★SOVEREIGN PROCEDURAL BODY-CANON GENERATOR (Infinigen-style). Infinigen is the CAPABILITY 2// benchmark -- infinite variety of bodies GENERATED procedurally from parameters + a seed, ZERO hand-crafted 3// or scanned assets. This is the sovereign version: it does not store a body, it stores the RULES that make 4// one. It emits a canon.dat (the P/R/F rows nx_body_gen reads) computed from anthropometric FUNCTIONS of a 5// few high-level knobs, with seeded procedural noise so no two seeds are identical. 6// 7// nx_body_proc <out.dat> <sex 0-1000> <build 0-1000> <musc 0-1000> <noise 0-1000> <seed> [stylize 0-1000] 8// sex 0=male anatomy .. 1000=female (shoulders<->hips, waist, bust) 9// build 0=lean .. 1000=heavy (girth added at waist/limbs) 10// musc 0=soft .. 1000=muscular (limb girth + muscle-relief amplitude) 11// noise individual variation amplitude, per-mille of each radius (0=canonical template) 12// seed any integer -> a specific individual 13// stylize 0=realistic .. 1000=anime/stylized (bigger head, longer legs, slimmer limps, bigger eyes) 14// license_tier: ORIGINAL expect_exit: 0 15import "nx_syscalls.nx" 16const K_MAGIC_1750: i64 = 1750 17const K_MAGIC_1000000: i64 = 1000000 18const K_MAGIC_2654435761: i64 = 2654435761 19const K_MAGIC_1013904223: i64 = 1013904223 20const K_MAGIC_65536: i64 = 65536 21// ★SKELETAL LANDMARKS THE SURFACE ANCHORS ON -- the same per-mille heights nx_skelgen places its joints at, 22// so the canon and the skeleton cannot drift apart about where a girdle is. Changing one without the other 23// now fails nx_skelgen T18/T19 rather than quietly producing a body whose bones miss its skin. 24// BP_ACROMION is LIVE: the acromion ring is anchored on it and nx_skelgen T18/T19 pin the skeleton's 25// shoulder to the same landmark, so the two artifacts can no longer drift apart about where a shoulder is. 26// BP_TROCH is the true hip landmark and is NOT used by the surface -- see the pelvis ring below for the 27// measured reason. It stays here because the number is right and the model is what cannot hold it yet. 28const BP_TROCH: i64 = 530 29const BP_ACROMION: i64 = 818 30 31// integer PRNG (xorshift-ish LCG). Seeded; deterministic per seed -> reproducible "individuals". 32func pr_step(st: *i64) -> i64 { var x: i64 = st[0]; x = x ^ (x << 13); x = x ^ ((x >> 7) & 0x1ffffffffffff); x = x ^ (x << 17); st[0] = x & 0x7fffffffffffffff; return st[0] } 33// signed perturbation in [-amp, amp] 34func pr_pm(st: *i64, amp: i64) -> i64 { if amp <= 0 { return 0 } let r: i64 = pr_step(st) % (2*amp + 1); return r - amp } 35 36func pw(fd: i64, s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n+1 } sys_write(fd, s, n); return 0 } 37// write a signed integer + trailing char c into buf at *pos 38func wint(b: *u8, pos: *i64, v: i64, c: i64) -> i64 { 39 var x: i64 = v 40 if x < 0 { b[pos[0]] = 45 as u8; pos[0] = pos[0]+1; x = 0-x } 41 let tmp: *u8 = sys_mmap(24); var i: i64 = 23 42 if x == 0 { tmp[i] = 48 as u8; i = i-1 } 43 while x > 0 { tmp[i] = (48 + x%10) as u8; x = x/10; i = i-1 } 44 var k: i64 = i+1 45 while k < 24 { b[pos[0]] = tmp[k]; pos[0] = pos[0]+1; k = k+1 } 46 b[pos[0]] = c as u8; pos[0] = pos[0]+1 47 return 0 48} 49func satoi(s: *u8) -> i64 { var i: i64=0; var n: i64=0; var sg: i64=1; if s[0]==(45 as u8){sg=0-1;i=1} 50 while s[i]!=(0 as u8){ let c: i64=s[i] as i64; if c>=48 { if c<=57 { n=n*10+(c-48) } } i=i+1 } return n*sg } 51 52// emit one R row: y xoff zoff ra rb, carrying this individual's PER-PART variation (st[1] width, st[2] depth). 53// ★INDIVIDUAL VARIATION IS A PROPERTY OF A PART, NOT OF A SLICE. Drawing an independent perturbation per 54// control ring is not anatomy, it is lumpiness: a person's head is a few percent wider or deeper AS A WHOLE. 55// An independent per-ring draw is invisible on the torso (11 rings over 480 permil of stature) and destroys 56// the head (10 rings over 150), which is exactly why the head rendered as a flat-brim MUSHROOM -- rb ran 57// 34,51,76,67,55,66,42 and ra peaked at the CROWN. Same size-dependent class as the GX-24 banding bug: a 58// per-slice error scales inversely with part size, so it hides until a small part exposes it. 59func emitR(b: *u8, pos: *i64, st: *i64, noise: i64, y: i64, xoff: i64, zoff: i64, ra: i64, rb: i64) -> i64 { 60 var a: i64 = ra + ra*st[1]/1000 61 var d: i64 = rb + rb*st[2]/1000 62 if a < 2 { a = 2 } if d < 2 { d = 2 } 63 b[pos[0]]=82 as u8; b[pos[0]+1]=32 as u8; pos[0]=pos[0]+2 // "R " 64 wint(b,pos,y,32); wint(b,pos,xoff,32); wint(b,pos,zoff,32); wint(b,pos,a,32); wint(b,pos,d,10) 65 return 0 66} 67func emitPm(b: *u8, pos: *i64, st: *i64, noise: i64, mir: i64, rot: i64, ox: i64, oy: i64, oz: i64, mat: i64) -> i64 { 68 // one draw per PART: this individual's width and depth deviation, held for every ring of the part 69 // CORRELATED, AND SMALLER. Per-part noise fixed the lumpiness of a per-slice draw but introduced a 70 // worse defect: ONE draw now shifts an ENTIRE part, so at noise=300 a whole torso could come out 30% 71 // wider while an INDEPENDENT draw made it 30% shallower -- a wide flat slab, the bell-shaped body that 72 // six numeric judges scored as normal and one contact sheet caught. Two corrections, both principled: 73 // 1. a part-wide shift needs a fraction of a per-slice amplitude, not the same one (noise/3); 74 // 2. width and depth must be CORRELATED -- real people are bigger or smaller overall, not wider and 75 // flatter at once. This is the same correlated-manifold rule the village sampler needs, appearing 76 // here at the scale of a single part. 77 let sz: i64 = pr_pm(st, noise/3) 78 st[1] = sz 79 st[2] = sz*3/4 + pr_pm(st, noise/6) 80 b[pos[0]]=80 as u8; b[pos[0]+1]=32 as u8; pos[0]=pos[0]+2 // "P " 81 wint(b,pos,mir,32); wint(b,pos,rot,32); wint(b,pos,ox,32); wint(b,pos,oy,32); wint(b,pos,oz,32); wint(b,pos,mat,10) 82 return 0 83} 84// ★emitPm + the 7th field, ROTATION ABOUT Z (F1084). Kept as a SEPARATE verb rather than widening emitPm: 85// NishiLang has no call-arity check on this path, so widening a signature silently mis-binds every existing 86// call site. Add a verb, never widen -- the same rule that protected sg_project_clip in the graphics lane. 87func emitPmZ(b: *u8, pos: *i64, st: *i64, noise: i64, mir: i64, rot: i64, ox: i64, oy: i64, oz: i64, mat: i64, rotz: i64) -> i64 { 88 let sz: i64 = pr_pm(st, noise/3) 89 st[1] = sz 90 st[2] = sz*3/4 + pr_pm(st, noise/6) 91 b[pos[0]]=80 as u8; b[pos[0]+1]=32 as u8; pos[0]=pos[0]+2 92 wint(b,pos,mir,32); wint(b,pos,rot,32); wint(b,pos,ox,32); wint(b,pos,oy,32); wint(b,pos,oz,32); wint(b,pos,mat,32); wint(b,pos,rotz,10) 93 return 0 94} 95func emitP(b: *u8, pos: *i64, st: *i64, noise: i64, mir: i64, rot: i64, ox: i64, oy: i64, oz: i64) -> i64 { 96 return emitPm(b,pos,st,noise,mir,rot,ox,oy,oz,0) // material 0 = flesh 97} 98// ★PROCEDURAL DIGIT (finger/toe): a thin tapered 4-ring tube from base to tip, its own placement part. 99// Emitted by a RULE (the hand/foot loop places N of these), not hand-modelled one by one. 100// ★PLACED digit: the same 4-ring tapered tube, but carrying its part's placement so a digit can run in a 101// direction other than DOWN. A finger hangs off the palm (rot 0); a TOE runs FORWARD off the toe line, which 102// is the foot's own rotated frame -- the reason the feet stayed blunt flippers while the hands got fingers 103// was simply that the digit rule could not be placed anywhere but straight down. 104func emitDigitP(b: *u8, pos: *i64, st: *i64, fx: i64, fz: i64, baseY: i64, tipY: i64, rad: i64, 105 rot: i64, ox: i64, oy: i64, oz: i64) -> i64 { 106 let span: i64 = baseY - tipY 107 emitP(b,pos,st,0, 1, rot, ox, oy, oz) 108 emitR(b,pos,st,0, baseY, fx, fz, rad, rad) 109 emitR(b,pos,st,0, baseY-span/3, fx, fz+1, rad, rad-1) 110 emitR(b,pos,st,0, baseY-span*2/3, fx, fz+2, rad-1, rad-2) 111 emitR(b,pos,st,0, tipY, fx, fz+2, rad-2, rad-2) 112 return 0 113} 114// ★LIMB AS A CURVE PLUS A RADIUS PROFILE -- Infinigen lofts a surface along a skeleton curve with the 115// girth read from genes, so a limb is generated, not written out ring by ring. Stations are produced by a 116// loop; each station's position comes from the limb's path and its radius from a profile evaluated at the 117// normalised station index, peaked at the muscle belly (deltoid on an arm, calf on a shank). The typed 118// table it replaces carried the same anatomy as literals -- same shape, no rule. 119func emitLimbTube(b: *u8, pos: *i64, st: *i64, noise: i64, n: i64, y0: i64, y1: i64, x0: i64, x1: i64, 120 z0: i64, z1: i64, rProx: i64, rPeak: i64, peakT: i64, rDist: i64, depth: i64) -> i64 { 121 var i: i64 = 0 122 while i < n { 123 var t: i64 = 0 124 if n > 1 { t = i*1000/(n-1) } 125 let y: i64 = y0 + (y1-y0)*t/1000 126 let x: i64 = x0 + (x1-x0)*t/1000 127 let z: i64 = z0 + (z1-z0)*t/1000 128 var r: i64 = rDist 129 var pt: i64 = peakT 130 if pt < 1 { pt = 1 } 131 if pt > 999 { pt = 999 } 132 if t <= pt { r = rProx + (rPeak-rProx)*t/pt } else { 133 let u: i64 = (t-pt)*1000/(1000-pt) 134 r = rPeak + (rDist-rPeak)*u/1000 135 } 136 emitR(b,pos,st,noise, y, x, z, r, r*depth/1000) 137 i = i+1 138 } 139 return 0 140} 141// ★RAY SET -- the Infinigen construction, not a typed list. Their creatures instantiate a PART TEMPLATE 142// from a parameter vector and ATTACH it relative to its parent (a position along the parent, not an absolute 143// coordinate), with per-instance values read off a smooth profile rather than written out one by one. A hand 144// and a foot are then the SAME rule with different parameters: n rays spread across the parent's distal 145// edge, each ray's length and radius evaluated at its normalised index from a unimodal profile peaked at the 146// longest ray (middle finger on a hand, hallux on a foot). Changing 4 fingers to 5 toes is a parameter. 147// cx/halfw : the parent's distal edge, so the rays inherit the palm or toe-line width (relative attachment) 148// peak : normalised index of the longest ray | dirn: +1 rays run down (hand), -1 forward (foot frame) 149// plane : the palmar/plantar plane (z in the part frame). ★Each digit sits at fz = plane - its radius, 150// so every ray's +z face lands EXACTLY on the plane regardless of its thickness -- a foot's 151// sole and a palm's face are FLAT by construction. nx_footcheck measured the old constant-fz 152// form leaving toes 3 units below the sole: five different radii on one z line cannot share a 153// plane, so the figure stood on its toe tips. 154func emitRaySet(b: *u8, pos: *i64, st: *i64, cx: i64, halfw: i64, baseY: i64, maxLen: i64, radB: i64, 155 n: i64, peak: i64, dirn: i64, plane: i64, rot: i64, ox: i64, oy: i64, oz: i64) -> i64 { 156 var i: i64 = 0 157 while i < n { 158 var t: i64 = 500 159 if n > 1 { t = i*1000/(n-1) } 160 let x: i64 = cx + (t-500)*2*halfw/1000 161 var d: i64 = t - peak 162 if d < 0 { d = 0-d } 163 var lf: i64 = 1000 - d*d*700/K_MAGIC_1000000 164 if lf < 200 { lf = 200 } 165 let ln: i64 = maxLen*lf/1000 166 var rd: i64 = radB*(1000 - d*350/1000)/1000 167 if rd < 3 { rd = 3 } 168 emitDigitP(b,pos,st, x, plane - rd, baseY, baseY - dirn*ln, rd, rot, ox, oy, oz) 169 i = i+1 170 } 171 return 0 172} 173func emitDigit(b: *u8, pos: *i64, st: *i64, fx: i64, fz: i64, baseY: i64, tipY: i64, rad: i64) -> i64 { 174 let span: i64 = baseY - tipY 175 emitP(b,pos,st,0, 1, 0, 0, 0, 0) 176 emitR(b,pos,st,0, baseY, fx, fz, rad, rad) 177 emitR(b,pos,st,0, baseY-span/3, fx, fz+1, rad, rad-1) 178 emitR(b,pos,st,0, baseY-span*2/3, fx, fz+2, rad-1, rad-2) 179 emitR(b,pos,st,0, tipY, fx, fz+2, rad-2, rad-2) 180 return 0 181} 182// ★★★PROCEDURAL NOSE -- a real PROTRUDING PART, not a radius bump. 183// MEASURED WHY (2026-07-25): at head scale our face benched detail 79 vs the cadaver oracle while the 184// silhouette held 828 -- head-SHAPED, surface-FEATURELESS -- and the eyeball showed NO NOSE AT ALL. A nose 185// had been declared for rungs as an F relief row (an angular RADIUS modulation of the head ellipse) at an 186// amplitude of roughly 8mm, which GX-31 measured as worth ~1 permil and GX-48 measured as BELOW the detail 187// judge's window. The lesson generalises: a protruding anatomical structure cannot be expressed as a radius 188// modulation of the surface it protrudes from -- it needs its own GEOMETRY. So the nose becomes a part, the 189// same machinery the eye already uses, generated from anthropometric ratios rather than typed coordinates. 190// Proportions (per-mille of stature, from the standing canon): nasion ~938, pronasale ~912, subnasale ~904; 191// alar width ~19; projection ~13 (a real nose projects ~23mm on a 1750mm body). Sex dimorphism: the male 192// nose is longer and more projecting; stylize (anime) shortens and narrows it. 193func emitNose(b: *u8, pos: *i64, st: *i64, sexf: i64, sty: i64, faceZ: i64, mat: i64) -> i64 { 194 // dimorphic scalars, each a RULE over the knobs -- no typed geometry 195 let proj: i64 = 15 - 3*sexf/1000 - 4*sty/1000 // forward projection at the tip 196 let alar: i64 = 10 - 2*sexf/1000 - 3*sty/1000 // half-width at the wings 197 // ★CANON Y FROM knowledge/face_tissue.dat (F1128). The nasion was at 938 and the table puts it at 948 -- 198 // and once the brow moved up to the glabella at 958, a nose root 20 below it left the bridge starting in 199 // mid-forehead. Subnasale corrected 904 -> 908. The tip was already right at 912, which is a useful 200 // negative check on the table: it agrees with what measurement had already driven us to. 201 // ⚠⚠REVERTED TO THE MEASURED VALUES, and this is the finding of the rung: THE PORTED CANON TRANSFERS FOR 202 // SOME LANDMARKS AND NOT OTHERS. The brow and eye corrections from the same table moved the binding lane 203 // 92 -> 138. Applying its nose values (nasion 938->948, subnasale 904->908) on top COST 56 of that back. 204 // Cause: the table's y-values come from the SDF lane's OWN head frame, and our head part is not the same 205 // shape -- where the two geometries agree the canon transfers, where they differ it does not. ★A CANON IS 206 // MEASURED RELATIVE TO A PARTICULAR HEAD; porting it is a HYPOTHESIS PER LANDMARK, not a global rewrite. 207 // Each value has to be A/B'd against the mesh, which is exactly what the lane judge is for. 208 let rootY: i64 = 938 // nasion (ours, measured-better than the ported 948) 209 let tipY: i64 = 912 + 3*sty/1000 // pronasale -- table and measurement AGREE here 210 let baseY: i64 = 904 + 2*sty/1000 // subnasale (ours, measured-better than 908) 211 emitPm(b,pos,st,0, 0, 0, 0, 0, faceZ, mat) // midline part, no mirror 212 // rings ASCEND: base (widest, wings) -> tip (most forward) -> dorsum -> root (sinks into the brow) 213 emitR(b,pos,st,0, baseY, 0, proj*70/100, alar, alar*60/100) 214 emitR(b,pos,st,0, tipY, 0, proj, alar*80/100, alar*80/100) 215 // ⚠ITERATION 1 (eyeball-driven, the number alone would not have caught it): the first cut made the 216 // dorsum rings narrow (55%/40% of alar) and left the root at zero projection -- so the BRIDGE sat 217 // buried inside the head surface and the nose read as a floating BUTTON rather than a nose. A real 218 // dorsum is a continuous RIDGE from the brow to the tip, so it must stay wide enough to emerge from 219 // the face and keep projecting all the way up to the nasion. 220 emitR(b,pos,st,0, (tipY+rootY)/2, 0, proj*72/100, alar*72/100, alar*72/100) 221 emitR(b,pos,st,0, rootY, 0, proj*38/100, alar*60/100, alar*60/100) 222 return 0 223} 224// ★★★THE REST OF THE FACE AS RULED PARTS (F1083). The nose (above) proved the pattern and the measurement: 225// a protruding structure cannot be an F relief row (a radius modulation of the head ellipse) -- it needs its 226// own geometry. Lips, chin, brow ridge and ears were all still PAINTED (per-triangle colour bands on a 227// smooth ovoid) or absent entirely. Each becomes a part below, generated from anthropometric ratios and the 228// sex/stylize knobs, never typed coordinates. All four are placed by the SAME machinery as the nose and eye. 229 230// LIPS: a protruding band around the mouth line. The groove BETWEEN the lips is what reads as a mouth, so 231// the mid ring pulls back while the two lip rings project -- that concavity is the whole feature. 232func emitLips(b: *u8, pos: *i64, st: *i64, sexf: i64, sty: i64, faceZ: i64, mat: i64) -> i64 { 233 let proj: i64 = 8 + 2*sexf/1000 // female lips project slightly more 234 let halfw: i64 = 15 - 2*sty/1000 235 emitPm(b,pos,st,0, 0, 0, 0, 0, faceZ, mat) 236 emitR(b,pos,st,0, 878, 0, proj*30/100, halfw*55/100, halfw*30/100) // below the lower lip 237 emitR(b,pos,st,0, 884, 0, proj*88/100, halfw*92/100, halfw*42/100) // lower lip 238 emitR(b,pos,st,0, 889, 0, proj*52/100, halfw, halfw*34/100) // the mouth groove: PULLED BACK 239 emitR(b,pos,st,0, 894, 0, proj, halfw*95/100, halfw*44/100) // upper lip 240 emitR(b,pos,st,0, 899, 0, proj*35/100, halfw*60/100, halfw*30/100) // philtrum, fading into the face 241 return 0 242} 243// CHIN: the pogonion, a protruding mass at the base of the face. Male chins are squarer and project more. 244func emitChin(b: *u8, pos: *i64, st: *i64, sexf: i64, sty: i64, faceZ: i64, mat: i64) -> i64 { 245 let proj: i64 = 13 - 4*sexf/1000 - 3*sty/1000 246 let halfw: i64 = 16 - 3*sexf/1000 - 3*sty/1000 247 emitPm(b,pos,st,0, 0, 0, 0, 0, faceZ, mat) 248 emitR(b,pos,st,0, 862, 0, proj*25/100, halfw*45/100, halfw*30/100) // under the jaw 249 emitR(b,pos,st,0, 869, 0, proj, halfw, halfw*52/100) // pogonion (most forward) 250 emitR(b,pos,st,0, 876, 0, proj*70/100, halfw*88/100, halfw*44/100) 251 emitR(b,pos,st,0, 882, 0, proj*30/100, halfw*62/100, halfw*32/100) // mentolabial sulcus 252 return 0 253} 254// ★★★THE CHIN, and WHY it is the fix for a complaint about the MOUTH. The shipped lips read as sitting too 255// low on the face, so the obvious move was to raise them -- but measuring first said otherwise: our mouth 256// centre sits ~24pct of the way up the head from the chin, and a real mouth sits ~25pct, so the HEIGHT WAS 257// ALREADY RIGHT. What was missing was the mass BELOW it. A mouth with no chin under it reads as falling off 258// the bottom of the face no matter where you put it. ★LAW: when a feature looks mispositioned, check whether 259// its NEIGHBOUR is missing before you move it -- proportion is read from what surrounds a feature, not from 260// the feature alone. 261// Built by the same rule as the brow and the lip: a horizontal Z-rotated roll, attached relative to the 262// parent skull, corners tucking with the face curve. Male chins are squarer and project more. 263func emitChinZ(b: *u8, pos: *i64, st: *i64, sexf: i64, sty: i64, headRb: i64, mat: i64) -> i64 { 264 // ⚠ITERATION: the first cut sat at 868 with mass 13 and read as a POINTED witch-chin jutting BELOW the 265 // jaw silhouette -- because the head's radius falls away fast under the jaw ring, so the same forward 266 // mass that merges at 876 protrudes past the outline at 868. A chin is a rounded eminence ON the jaw, 267 // not a spur hanging off it. Raised onto the jaw ring and its mass reduced so it stays inside the 268 // silhouette; the pogonion still leads, it just no longer leaves the face. 269 // ⚠⚠TWO iterations, and the second one MEASURED ITS OWN MISTAKE. Raising the chin onto the jaw ring at 270 // 876 cured the jut but collapsed every lane back to the pre-lip baseline -- because the chin's top edge 271 // then reached 885 and SWALLOWED the lower lip sitting at 881. The judge caught a collision the eye had 272 // not yet noticed. ★LAW: a feature part occupies a BAND, not a point; when adding one beside another, 273 // check that their extents do not overlap, and let the judge tell you when they do. 274 // So the height goes back to where it did not collide, and only the MASS is reduced to stop the jut. 275 let mass: i64 = 10 - 3*sexf/1000 - 2*sty/1000 // how far the chin comes forward 276 let half: i64 = 17 - 3*sexf/1000 - 2*sty/1000 // a male chin is squarer, a female one narrower 277 let chinY: i64 = 866 278 let faceZ: i64 = headRb - mass*40/100 279 let sweep: i64 = mass*80/100 280 emitPmZ(b,pos,st,0, 0, 0, 0, chinY, faceZ, mat, 90) 281 emitR(b,pos,st,0, 0-half, 0, 0-sweep, mass*25/100, mass*35/100) 282 emitR(b,pos,st,0, 0-half*55/100, 0, 0-sweep*30/100, mass*80/100, mass*78/100) 283 emitR(b,pos,st,0, 0, 0, 0, mass, mass*95/100) // pogonion 284 emitR(b,pos,st,0, half*55/100, 0, 0-sweep*30/100, mass*80/100, mass*78/100) 285 emitR(b,pos,st,0, half, 0, 0-sweep, mass*25/100, mass*35/100) 286 return 0 287} 288// ★★★ONE LIP, AS A RULE -- then instantiated as the pair. The operator's construction principle: perfect a 289// single unit, then aggregate it, layer on layer. A lip is a horizontal roll of tissue that is fullest at 290// the midline, tapers to the commissures, and sweeps back with the curve of the face. Build THAT once and 291// the upper and lower lips are two instantiations differing only in height, fullness and projection -- the 292// same way one digit rule gave both hands and both feet. 293// ★The MOUTH is the GAP BETWEEN the two instances: no geometry is emitted there, so the shadow line that 294// reads as a mouth is a consequence of the anatomy rather than a painted rectangle. 295func emitLipZ(b: *u8, pos: *i64, st: *i64, sty: i64, headRb: i64, mat: i64, lipY: i64, full: i64) -> i64 { 296 // ⚠SIZED BY ITERATION, and the first cut is worth recording: at full=6 with a 170pct back-sweep only the 297 // midline tip cleared the skin and the mouth read as a single nub. Both judge and eye agreed there were 298 // no lips -- the instrument correctly reported no change. A real mouth is ~50mm wide and ~18mm tall on a 299 // 1750mm figure, and its corners tuck in rather than sweeping hard back, so the roll stays proud across 300 // most of its width instead of only at its centre. 301 let half: i64 = 17 - 2*sty/1000 // half the mouth width 302 let faceZ: i64 = headRb - full*40/100 // ATTACHED RELATIVE TO THE PARENT (the skull) 303 let sweep: i64 = full*70/100 // corners tuck, they do not sweep hard back 304 emitPmZ(b,pos,st,0, 0, 0, 0, lipY, faceZ, mat, 90) 305 emitR(b,pos,st,0, 0-half, 0, 0-sweep, full*22/100, full*30/100) // commissure, right 306 emitR(b,pos,st,0, 0-half*55/100, 0, 0-sweep*28/100, full*78/100, full*80/100) 307 emitR(b,pos,st,0, 0, 0, 0, full, full) // fullest at the midline 308 emitR(b,pos,st,0, half*55/100, 0, 0-sweep*28/100, full*78/100, full*80/100) 309 emitR(b,pos,st,0, half, 0, 0-sweep, full*22/100, full*30/100) // commissure, left 310 return 0 311} 312// ★★★BROW RIDGE AS A HORIZONTAL PART (F1084 prereq 3, the mechanism unlock). The supraorbital torus runs 313// ACROSS the face -- it is one continuous ridge with a slight dip at the glabella between the brows, not two 314// vertical bumps. Every previous attempt built it as a Y-stacked tube because that was the only shape the 315// part system could express, and it read as goggles or flanges. With rotation about Z the canonical Y-tube 316// turns sideways IN the face plane and the ridge is simply what it is. 317// Anatomy carried as a RULE, not coordinates: rings run laterally from the outer tail through the brow 318// belly to the glabella; the radius profile peaks over each orbit and dips at the midline; projection and 319// heaviness scale with sex (male supraorbital ridge is markedly heavier) and flatten with stylize. 320// ★ATTACHED RELATIVE TO ITS PARENT, not placed at a typed coordinate -- Infinigen's own construction rule 321// and the one this lane keeps relearning. The first cut typed faceZ=47 and the ridge vanished: the head's 322// OWN depth radius at the brow line is 59*headScale/1000, so a ridge whose front reached 53.6 was simply 323// INSIDE the skull. Now the caller passes the parent's brow-line depth (headRb) and the attachment is 324// derived: sit the ridge's axis one burial-depth inside the skin so its base merges, and its own radius 325// then carries the belly PROUD of the surface by construction, at any head scale, for any character. 326func emitBrowZ(b: *u8, pos: *i64, st: *i64, sexf: i64, sty: i64, headRb: i64, mat: i64) -> i64 { 327 let heavy: i64 = 9 - 4*sexf/1000 - 3*sty/1000 // ridge thickness (its radius) 328 let half: i64 = 34 - 4*sty/1000 // lateral half-span, per-mille of stature 329 // ★CORRECTED FROM THE PORTED CANON (knowledge/face_tissue.dat, seq926): the supraorbital ridge belongs at 330 // the GLABELLA (958 on our head frame), not at the EYE LINE (942). It had been typed at 944 -- 14 per-mille 331 // of stature, about 25 mm, too low -- which is why it read as sitting ON the eyes instead of above them. 332 // Found by reading the sibling lane's measured table, not by rendering another attempt. 333 let browY: i64 = 958 334 let faceZ: i64 = headRb - heavy*45/100 // burial = 45pct of the ridge radius 335 // rotZ=90 turns the canonical Y axis into the lateral axis; rings must therefore be centred on y=0 and 336 // the part is then lifted to the brow line by pOy and pushed onto the face by pOz. 337 emitPmZ(b,pos,st,0, 0, 0, 0, browY, faceZ, mat, 90) 338 // ⚠ITERATION (eyeball-driven): a STRAIGHT horizontal ridge exits an ellipsoid skull at the sides, so 339 // the first cut emerged only at its two outer tails and read as a pair of small tabs. The ridge must 340 // follow the SKULL'S CURVE -- which is also what the anatomy does, the supraorbital margin sweeping back 341 // toward the temples. Per-ring zoff recedes with the square of lateral distance, so the ridge stays 342 // inside the head laterally and emerges as one continuous brow across the front. 343 let sweep: i64 = heavy*180/100 344 emitR(b,pos,st,0, 0-half, 0, 0-sweep, heavy*30/100, heavy*40/100) // outer tail, right 345 emitR(b,pos,st,0, 0-half*55/100, 0, 0-sweep*30/100, heavy, heavy*85/100) // belly over right orbit 346 emitR(b,pos,st,0, 0, 0, 0, heavy*74/100, heavy*64/100) // glabella dip, midline 347 emitR(b,pos,st,0, half*55/100, 0, 0-sweep*30/100, heavy, heavy*85/100) // belly over left orbit 348 emitR(b,pos,st,0, half, 0, 0-sweep, heavy*30/100, heavy*40/100) // outer tail, left 349 return 0 350} 351// BROW RIDGE: a projecting shelf over each orbit (mirror gives both). This is the feature that CASTS THE 352// SHADOW over the eye -- without it the eyes read as painted dots no matter how good the eyeball is. 353func emitBrow(b: *u8, pos: *i64, st: *i64, sexf: i64, sty: i64, ex: i64, faceZ: i64, mat: i64) -> i64 { 354 // ⚠AMPLITUDE CORRECTED after the eyeball: the first cut projected 11 over a 15 half-width, which is a 355 // SHELF, not a ridge -- a real supraorbital torus is a subtle swell, and an over-projecting one reads as 356 // a caveman brow (or, with the head's colour bands on it, as goggles). Halved and narrowed. 357 let proj: i64 = 6 - 3*sexf/1000 - 2*sty/1000 // male brow ridge is heavier 358 let halfw: i64 = 11 - 2*sty/1000 359 emitPm(b,pos,st,0, 1, 0, ex, 0, faceZ, mat) 360 emitR(b,pos,st,0, 938, 0, proj*45/100, halfw*70/100, halfw*30/100) 361 emitR(b,pos,st,0, 945, 0, proj, halfw, halfw*38/100) // the ridge crest 362 emitR(b,pos,st,0, 952, 0, proj*40/100, halfw*72/100, halfw*28/100) // fading into the forehead 363 return 0 364} 365// EARS: a plate on the side of the head, mirror gives both. Set BEHIND the mid-line of the skull, spanning 366// roughly brow to nose-base height -- the classic proportional rule. 367func emitEar(b: *u8, pos: *i64, st: *i64, sty: i64, ex: i64, ez: i64, mat: i64) -> i64 { 368 let h: i64 = 6 - 1*sty/1000 369 emitPm(b,pos,st,0, 1, 0, ex, 0, ez, mat) 370 emitR(b,pos,st,0, 906, 0, 0, h*40/100, h*90/100) // lobe 371 emitR(b,pos,st,0, 918, 0, 2, h*62/100, h*160/100) // concha 372 emitR(b,pos,st,0, 930, 0, 2, h*58/100, h*150/100) 373 emitR(b,pos,st,0, 940, 0, 0, h*30/100, h*80/100) // helix top 374 return 0 375} 376// ★EYEBALL: a small sphere placed in the eye socket. mirror=1 gives both eyes. A face needs eyes more than 377// anything -- a smooth egg reads as a mannequin no matter how good the body is. 378func emitEye(b: *u8, pos: *i64, st: *i64, ey: i64, ex: i64, ez: i64, r: i64, mat: i64) -> i64 { 379 emitPm(b,pos,st,0, 1, 0, ex, 0, ez, mat) // material 1..4 = EYE iris colour 380 emitR(b,pos,st,0, ey+r, 0, 0, 1, 1) 381 emitR(b,pos,st,0, ey+r/2, 0, 0, r*82/100, r*82/100) 382 emitR(b,pos,st,0, ey, 0, 0, r, r) 383 emitR(b,pos,st,0, ey-r/2, 0, 0, r*82/100, r*82/100) 384 emitR(b,pos,st,0, ey-r, 0, 0, 1, 1) 385 return 0 386} 387func emitF(b: *u8, pos: *i64, part: i64, y: i64, yw: i64, th: i64, tw: i64, amp: i64) -> i64 { 388 if amp == 0 { return 0 } 389 b[pos[0]]=70 as u8; b[pos[0]+1]=32 as u8; pos[0]=pos[0]+2 // "F " 390 wint(b,pos,part,32); wint(b,pos,y,32); wint(b,pos,yw,32); wint(b,pos,th,32); wint(b,pos,tw,32); wint(b,pos,amp,10) 391 return 0 392} 393 394// ★★★THE FIRST CONNECTIVE TISSUE IN THE STACK. Until now nx_skelgen wrote knowledge/skel_ref.dat and NOTHING 395// READ IT -- a 21-joint skeleton generated, gated 19/19, and discarded. Meanwhile this emitter carried its own 396// copies of the same landmarks as consts, kept in agreement with the skeleton by a TEST rather than by 397// construction. That is duplication of the worst kind: two artifacts holding the same fact, with a gate 398// standing between them hoping nobody edits one. 399// ★THE INVERSION: the skeleton BECOMES the source. Landmarks are read from its J rows, so the surface cannot 400// disagree with the bone -- not because a test forbids it, but because there is only one number. 401// Contract: J <idx> <parent> <side> <x_mm> <y_mm> <z_mm>, world millimetres, joint 5 = acromion, 0 = hip. 402// ABSENT FILE = the const defaults, so every existing call is bit-identical. 403const BP_SKJ: i64 = 64 404func bp_skel_load(path: *u8, J: *i64, stature: i64) -> i64 { 405 let szp: *i64 = sys_mmap(16) as *i64 406 let mb: *u8 = sys_read_file(path, szp) 407 if (mb as i64) == 0 { return 0-1 } 408 let sz: i64 = szp[0] 409 var n: i64 = 0 410 var i: i64 = 0 411 while i < sz { 412 var e: i64 = i 413 var go: i64 = 1 414 while go == 1 { if e >= sz { go = 0 } else { if mb[e] == (10 as u8) { go = 0 } else { e = e+1 } } } 415 if mb[i] == (74 as u8) { // 'J' 416 // fields: idx parent side x y z -- we want idx (0) and y (4) 417 var k: i64 = i+1 418 var fld: i64 = 0 419 var idx: i64 = 0 420 var yv: i64 = 0 421 while k < e { 422 var c: i64 = mb[k] as i64 423 var neg: i64 = 0 424 var isd: i64 = 0 425 if c == 45 { if k+1 < e { let d: i64 = mb[k+1] as i64 426 if d >= 48 { if d <= 57 { isd = 1; neg = 1 } } } } 427 else { if c >= 48 { if c <= 57 { isd = 1 } } } 428 if isd == 1 { 429 var j: i64 = k 430 if neg == 1 { j = j+1 } 431 var v: i64 = 0 432 var run: i64 = 1 433 while run == 1 { 434 var ok: i64 = 0 435 if j < e { let d2: i64 = mb[j] as i64 436 if d2 >= 48 { if d2 <= 57 { ok = 1 } } } 437 if ok == 1 { v = v*10 + ((mb[j] as i64)-48); j = j+1 } else { run = 0 } 438 } 439 if neg == 1 { v = 0-v } 440 if fld == 0 { idx = v } 441 if fld == 4 { yv = v } 442 fld = fld + 1 443 k = j 444 } else { k = k+1 } 445 } 446 // store the joint HEIGHT back in per-mille of stature, the unit the canon speaks 447 if idx >= 0 { if idx < BP_SKJ { if stature > 0 { 448 J[idx] = (yv*1000 + stature/2)/stature 449 n = n + 1 450 } } } 451 } 452 i = e+1 453 } 454 return n 455} 456const BP_NDIM: i64 = 21 457func bp_err(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(2, s, n); return 0 } 458// reads the dimorphism coefficients. Refuses rather than emitting a canon on zeroed coefficients, which 459// would produce a dimensionless body -- something that reads as a generator bug, not a missing file. 460func bp_rdint(b: *u8, pos: *i64, end: i64) -> i64 { 461 var i: i64 = pos[0] 462 var go: i64 = 1 463 while go == 1 { 464 if i >= end { go = 0 } else { 465 let c: i64 = b[i] as i64 466 if c == 45 { go = 0 } else { if c >= 48 { if c <= 57 { go = 0 } else { i = i+1 } } else { i = i+1 } } 467 } 468 } 469 var sg: i64 = 1 470 if i < end { if (b[i] as i64) == 45 { sg = 0-1; i = i+1 } } 471 var v: i64 = 0 472 var g2: i64 = 1 473 while g2 == 1 { 474 if i >= end { g2 = 0 } else { 475 let c2: i64 = b[i] as i64 476 if c2 >= 48 { if c2 <= 57 { v = v*10 + (c2-48); i = i+1 } else { g2 = 0 } } else { g2 = 0 } 477 } 478 } 479 pos[0] = i 480 return v*sg 481} 482func bp_load_dimorph_from(D: *i64, path: *u8) -> i64 { 483 var z: i64 = 0 484 while z < BP_NDIM { D[z] = 0; z = z + 1 } 485 let ln: *i64 = sys_mmap(16) as *i64 486 let b: *u8 = sys_read_file(path, ln) 487 if (b as i64) == 0 { 488 bp_err("BODYPROC-REFUSE cannot read knowledge/body_dimorphism.conf -- the dimorphism rule set is REQUIRED\n" as *u8) 489 sys_exit(7) 490 } 491 let len: i64 = ln[0] 492 let pos: *i64 = sys_mmap(16) as *i64 493 var seen: i64 = 0 494 var i: i64 = 0 495 var bol: i64 = 1 496 while i < len { 497 if bol == 1 { 498 if (b[i] as i64) == 68 { 499 pos[0] = i+1 500 let idx: i64 = bp_rdint(b, pos, len) 501 let val: i64 = bp_rdint(b, pos, len) 502 if idx >= 0 { if idx < BP_NDIM { D[idx] = val; seen = seen + 1 } } 503 i = pos[0] 504 } 505 } 506 if (b[i] as i64) == 10 { bol = 1 } else { bol = 0 } 507 i = i + 1 508 } 509 if seen < BP_NDIM { 510 bp_err("BODYPROC-REFUSE body_dimorphism.conf declares fewer coefficients than the model needs -- refusing to emit a canon with zeroed dimensions\n" as *u8) 511 sys_exit(7) 512 } 513 return seen 514} 515func bp_load_dimorph(D: *i64) -> i64 { return bp_load_dimorph_from(D, "knowledge/body_dimorphism.conf" as *u8) } 516func bp_streq(a: *u8, b2: *u8) -> i64 { var i: i64 = 0; while a[i] != (0 as u8) { if a[i] != b2[i] { return 0 } i = i + 1 } if b2[i] != (0 as u8) { return 0 } return 1 } 517func bp_pnum(v: i64) -> i64 { 518 let t: *u8 = sys_mmap(32) 519 let p: *i64 = sys_mmap(8) as *i64 520 p[0] = 0 521 wint(t, p, v, 32) 522 sys_write(1, t, p[0] - 1) 523 return 0 524} 525// AT7 (aesthetictwin): the skeletal floor under the waist. The pubic ring the torso already emits 526// (30+g at station 470) is the model's bone-anchored pelvic half-breadth; a waist dialled below its 527// own bone cannot emit. DERIVED, not typed: it moves with build through D13 exactly as the emitted 528// pubis does, and the crotch emit call below consumes THIS function so there is exactly one copy of 529// the law and the guard cannot drift from the geometry it guards. Declared imprecision: the true 530// lumbar floor is the vertebral column, which this canon does not yet carry; the pubic ring is the 531// nearest bone-anchored expression and stands in until a lumbar row exists. 532func bp_thoracic_floor(g: i64) -> i64 { return 30 + g } 533// ONE COPY OF THE WAIST AND GIRTH EXPRESSIONS: the emit path in main and the floorcheck verb both call 534// these, so the checker cannot drift from the geometry it checks (the jobclaim shared-classifier law). 535func bp_waist_of(D: *i64, sexf: i64, build: i64) -> i64 { return D[4] - D[5]*sexf/1000 + D[6]*build/1000 } 536func bp_girth_of(D: *i64, build: i64) -> i64 { return build*D[13]/1000 } 537func bp_floorcheck(sexf: i64, build: i64, dp: *u8) -> i64 { 538 let D: *i64 = sys_mmap(BP_NDIM*8) as *i64 539 bp_load_dimorph_from(D, dp) 540 let waist: i64 = bp_waist_of(D, sexf, build) 541 let g: i64 = bp_girth_of(D, build) 542 let flr: i64 = bp_thoracic_floor(g) 543 pw(1, "FLOORCHECK waist=" as *u8); bp_pnum(waist) 544 pw(1, " floor=" as *u8); bp_pnum(flr) 545 if waist < flr { pw(1, " verdict=REFUSE -- a waist below the pelvic-bone floor cannot emit\n" as *u8); return 6 } 546 pw(1, " verdict=OK\n" as *u8) 547 return 0 548} 549func bp_tok(b: *u8, pos: *i64, end: i64, out: *u8, cap: i64) -> i64 { 550 var i: i64 = pos[0] 551 var sk: i64 = 1 552 while sk == 1 { 553 if i >= end { sk = 0 } else { 554 let c: i64 = b[i] as i64 555 if c == 32 { i = i + 1 } else { if c == 9 { i = i + 1 } else { sk = 0 } } 556 } 557 } 558 var n: i64 = 0 559 var go: i64 = 1 560 while go == 1 { 561 if i >= end { go = 0 } else { 562 let c2: i64 = b[i] as i64 563 if c2 == 32 { go = 0 } else { if c2 == 9 { go = 0 } else { if c2 == 10 { go = 0 } else { if c2 == 13 { go = 0 } else { 564 if n < cap - 1 { out[n] = c2 as u8; n = n + 1 } 565 i = i + 1 566 } } } } 567 } 568 } 569 out[n] = 0 as u8 570 pos[0] = i 571 return n 572} 573func bp_find(hay: *u8, hn: i64, needle: *u8) -> i64 { 574 var nl: i64 = 0 575 while needle[nl] != (0 as u8) { nl = nl + 1 } 576 if nl == 0 { return 0 - 1 } 577 var i: i64 = 0 578 while i + nl <= hn { 579 var j: i64 = 0 580 var hit: i64 = 1 581 while j < nl { if hay[i + j] != needle[j] { hit = 0; j = nl } else { j = j + 1 } } 582 if hit == 1 { return i } 583 i = i + 1 584 } 585 return 0 - 1 586} 587func bp_ev_refuse(reason: *u8, m: *u8) -> i64 { 588 pw(1, "AESTHETIC-CANON-REFUSE " as *u8) 589 pw(1, reason) 590 pw(1, " marker=" as *u8) 591 pw(1, m) 592 pw(1, "\n" as *u8) 593 return 4 594} 595// AT1 (aesthetictwin): the evidence-graded aesthetic canon. Every target row carries a class from 596// REPLICATED, CONTESTED or REFUTED plus the key of a source pinned in aesthetictwin.refs; a REFUTED 597// row may be an axis to measure and may never be a steering target; a row whose key does not resolve 598// is refused BY NAME. The refs register is probed at the given path and then at the buildroot twin, 599// because the compare files live in the buildroot knowledge tree while this organ runs from the 600// serving root -- the browser-gate lesson: the path set is unsatisfiable from any single root. 601func bp_evidence_grade(cp: *u8, rp: *u8) -> i64 { 602 let cl: *i64 = sys_mmap(16) as *i64 603 let cb: *u8 = sys_read_file(cp, cl) 604 if (cb as i64) == 0 { return bp_ev_refuse("cannot read canon conf" as *u8, cp) } 605 let cn: i64 = cl[0] 606 let rl: *i64 = sys_mmap(16) as *i64 607 var rb: *u8 = sys_read_file(rp, rl) 608 if (rb as i64) == 0 { rb = sys_read_file("buildroot/knowledge/compare/aesthetictwin.refs" as *u8, rl) } 609 if (rb as i64) == 0 { return bp_ev_refuse("cannot read refs register from the given path or the buildroot twin" as *u8, rp) } 610 let rn: i64 = rl[0] 611 let region: *u8 = sys_mmap(64) 612 let marker: *u8 = sys_mmap(64) 613 let vals: *u8 = sys_mmap(32) 614 let spreads: *u8 = sys_mmap(32) 615 let unit: *u8 = sys_mmap(32) 616 let cls: *u8 = sys_mmap(32) 617 let kind: *u8 = sys_mmap(32) 618 let key: *u8 = sys_mmap(64) 619 let needle: *u8 = sys_mmap(96) 620 let pos: *i64 = sys_mmap(16) as *i64 621 var rows: i64 = 0 622 var nrep: i64 = 0 623 var ncon: i64 = 0 624 var nref: i64 = 0 625 var ntgt: i64 = 0 626 var i: i64 = 0 627 var bol: i64 = 1 628 while i < cn { 629 if bol == 1 { if (cb[i] as i64) == 65 { if i + 1 < cn { if (cb[i+1] as i64) == 32 { 630 pos[0] = i + 1 631 bp_tok(cb, pos, cn, region, 64) 632 bp_tok(cb, pos, cn, marker, 64) 633 bp_tok(cb, pos, cn, vals, 32) 634 bp_tok(cb, pos, cn, spreads, 32) 635 bp_tok(cb, pos, cn, unit, 32) 636 bp_tok(cb, pos, cn, cls, 32) 637 bp_tok(cb, pos, cn, kind, 32) 638 let kl: i64 = bp_tok(cb, pos, cn, key, 64) 639 if kl == 0 { return bp_ev_refuse("short row, eight fields required" as *u8, marker) } 640 var ci: i64 = 0 - 1 641 if bp_streq(cls, "REPLICATED" as *u8) == 1 { ci = 0 } 642 if bp_streq(cls, "CONTESTED" as *u8) == 1 { ci = 1 } 643 if bp_streq(cls, "REFUTED" as *u8) == 1 { ci = 2 } 644 if ci < 0 { return bp_ev_refuse("unknown evidence class" as *u8, marker) } 645 var ki: i64 = 0 - 1 646 if bp_streq(kind, "TARGET" as *u8) == 1 { ki = 0 } 647 if bp_streq(kind, "POPULATION" as *u8) == 1 { ki = 1 } 648 if bp_streq(kind, "AXIS" as *u8) == 1 { ki = 2 } 649 if ki < 0 { return bp_ev_refuse("unknown kind" as *u8, marker) } 650 if ci == 2 { if ki == 0 { return bp_ev_refuse("a REFUTED marker may be measured and may never be a steering target" as *u8, marker) } } 651 needle[0] = 124 as u8 652 var q: i64 = 0 653 while key[q] != (0 as u8) { needle[q+1] = key[q]; q = q + 1 } 654 needle[q+1] = 124 as u8 655 needle[q+2] = 0 as u8 656 if bp_find(rb, rn, needle) < 0 { return bp_ev_refuse("refkey does not resolve in the refs register" as *u8, key) } 657 pw(1, "CANON " as *u8); pw(1, region); pw(1, "/" as *u8); pw(1, marker) 658 pw(1, " class=" as *u8); pw(1, cls) 659 pw(1, " kind=" as *u8); pw(1, kind) 660 pw(1, " value=" as *u8); bp_pnum(satoi(vals)) 661 pw(1, " ref=" as *u8); pw(1, key) 662 pw(1, "\n" as *u8) 663 rows = rows + 1 664 if ci == 0 { nrep = nrep + 1 } 665 if ci == 1 { ncon = ncon + 1 } 666 if ci == 2 { nref = nref + 1 } 667 if ki == 0 { ntgt = ntgt + 1 } 668 i = pos[0] 669 } } } } 670 if i < cn { if (cb[i] as i64) == 10 { bol = 1 } else { bol = 0 } } 671 i = i + 1 672 } 673 var part: i64 = 0 674 if nrep + ncon + nref == rows { part = 1 } 675 pw(1, "AESTHETIC-CANON rows=" as *u8); bp_pnum(rows) 676 pw(1, " replicated=" as *u8); bp_pnum(nrep) 677 pw(1, " contested=" as *u8); bp_pnum(ncon) 678 pw(1, " refuted=" as *u8); bp_pnum(nref) 679 pw(1, " targets=" as *u8); bp_pnum(ntgt) 680 pw(1, " partition_ok=" as *u8); bp_pnum(part) 681 pw(1, "\n" as *u8) 682 if rows < 10 { return bp_ev_refuse("fewer than ten graded rows -- an aggregate bound to no denominator is not a canon" as *u8, cp) } 683 if part == 0 { return bp_ev_refuse("partition does not sum" as *u8, cp) } 684 return 0 685} 686// Versioned semantic ownership: derive actual serialized part IDs at emission. 687func bp_emitted_parts(b:*u8,n:i64)->i64{var i:i64=0;var count:i64=0;while i<n{if b[i]==80 as u8{if i==0{count=count+1}else{if b[i-1]==10 as u8{count=count+1}}};i=i+1};return count} 688func bp_semantic_generate(argc: i64, argv: *i64) -> i64 { 689 if argc > 1 { 690 if bp_streq(argv[1] as *u8, "evidence" as *u8) == 1 { 691 var cp: *u8 = "knowledge/aesthetic_canon.conf" as *u8 692 var rp: *u8 = "knowledge/compare/aesthetictwin.refs" as *u8 693 if argc > 2 { cp = argv[2] as *u8 } 694 if argc > 3 { rp = argv[3] as *u8 } 695 sys_exit(bp_evidence_grade(cp, rp)) 696 } 697 if bp_streq(argv[1] as *u8, "floorcheck" as *u8) == 1 { 698 if argc < 4 { pw(1, "usage: nx_body_proc floorcheck <sexf> <build> [dimorphconf]\n" as *u8); sys_exit(2) } 699 var dp: *u8 = "knowledge/body_dimorphism.conf" as *u8 700 if argc > 4 { dp = argv[4] as *u8 } 701 sys_exit(bp_floorcheck(satoi(argv[2] as *u8), satoi(argv[3] as *u8), dp)) 702 } 703 } 704 var semantic:i64=0 705 if argc>10{if bp_streq(argv[10] as *u8,"semantic-parts-v2" as *u8)!=1{pw(1,"{\x22organ\x22:\x22nx_body_proc\x22,\x22error\x22:{\x22code\x22:\x22UNKNOWN_RECIPE_VERSION\x22,\x22argument_index\x22:10,\x22accepted\x22:[\x22semantic-parts-v2\x22],\x22output_changed\x22:false,\x22next_action\x22:\x22Use the documented recipe version or omit it for legacy behavior.\x22}}\n" as *u8);return 7};semantic=1} 706 let outp: *u8 = argv[1] as *u8 707 var sex: i64 = 0; var build: i64 = 300; var musc: i64 = 400; var noise: i64 = 0; var seed: i64 = 1; var sty: i64 = 0 708 var eyecol: i64 = 0 // 0 = auto (from seed); else 1 brown 2 blue 3 green 4 amber 709 if argc > 2 { sex = satoi(argv[2] as *u8) } 710 if argc > 3 { build = satoi(argv[3] as *u8) } 711 if argc > 4 { musc = satoi(argv[4] as *u8) } 712 if argc > 5 { noise = satoi(argv[5] as *u8) } 713 if argc > 6 { seed = satoi(argv[6] as *u8) } 714 if argc > 7 { sty = satoi(argv[7] as *u8) } 715 if argc > 8 { eyecol = satoi(argv[8] as *u8) } 716 // ★argv[9]: the SKELETON this body is built on. Absent -> the const landmarks (bit-identical default). 717 let J: *i64 = sys_mmap(BP_SKJ*8) as *i64 718 var jz: i64 = 0 719 while jz < BP_SKJ { J[jz] = 0; jz = jz+1 } 720 var acromion: i64 = BP_ACROMION 721 var troch: i64 = BP_TROCH 722 var skjoints: i64 = 0 723 if argc > 9 { 724 skjoints = bp_skel_load(argv[9] as *u8, J, K_MAGIC_1750) 725 // ★FAIL LOUD, NOT QUIETLY BACK TO THE DEFAULTS. A skeleton that was asked for and could not be read 726 // must stop the run -- silently emitting the const-landmark body would look like success and would 727 // be a body built on a skeleton that was never consulted. 728 if skjoints <= 0 { pw(1, "{\x22organ\x22:\x22nx_body_proc\x22,\x22error\x22:\x22skeleton unreadable or empty\x22} 729" as *u8); return 3 } 730 if J[5] > 0 { acromion = J[5] } 731 if J[0] > 0 { troch = J[0] } 732 } 733 let st: *i64 = sys_mmap(64) as *i64 734 st[0] = seed*K_MAGIC_2654435761 + K_MAGIC_1013904223 735 if st[0] == 0 { st[0] = 1 } 736 // warm the PRNG so nearby seeds diverge 737 var w: i64 = 0 738 while w < 8 { pr_step(st); w = w+1 } 739 740 // ---- ANATOMICAL DIMORPHISM FUNCTIONS (this is the procedural rule engine's knowledge, not a stored body). 741 // ★AND KNOWLEDGE THAT CANNOT BE REVISED WITHOUT A REBUILD IS POLICY IN CODE. The 21 coefficients that 742 // were written here now live in knowledge/body_dimorphism.conf; what remains is the model SHAPE. 743 // The arithmetic order of every expression is preserved exactly -- the acceptance proof for this move 744 // is a bit-identical emitted canon. 745 // All quantities per-mille of stature. sexf in [0,1000]: 0=male, 1000=female. 746 let D: *i64 = sys_mmap(BP_NDIM*8) as *i64 747 bp_load_dimorph(D) 748 let sexf: i64 = sex 749 // biacromial (shoulder) breadth: male wider. biiliac (hip) breadth: female wider. waist: female narrower. 750 let shoulder: i64 = D[0] - D[1]*sexf/1000 751 let hip: i64 = D[2] + D[3]*sexf/1000 752 let waist: i64 = bp_waist_of(D, sexf, build) 753 let chestRa: i64 = D[7] - D[8]*sexf/1000 754 let bustD: i64 = D[9] + D[10]*sexf/1000 755 let neckRa: i64 = D[11] - D[12]*sexf/1000 756 let g: i64 = bp_girth_of(D, build) 757 let limbMul: i64 = 1000 + D[14]*musc/1000 - D[15]*sexf/1000 758 let reliefMul: i64 = D[16] + D[17]*musc/1000 759 let headScale: i64 = 1000 + D[18]*sty/1000 760 let legScale: i64 = 1000 + D[19]*sty/1000 761 let styLimb: i64 = 1000 - D[20]*sty/1000 762 763 // AT7 (aesthetictwin): refuse an anatomically impossible torso instead of emitting it in silence. 764 let bpflr: i64 = bp_thoracic_floor(g) 765 if waist < bpflr { 766 pw(1, "BODYPROC-REFUSE waist=" as *u8); bp_pnum(waist) 767 pw(1, " below the pelvic-bone floor=" as *u8); bp_pnum(bpflr) 768 pw(1, " -- a waist thinner than its own bone cannot emit (AT7)\n" as *u8) 769 sys_exit(6) 770 } 771 let b: *u8 = sys_mmap(K_MAGIC_65536) 772 let pos: *i64 = sys_mmap(8) as *i64; pos[0] = 0 773 pw(1, "{\x22organ\x22:\x22nx_body_proc\x22,\x22infinigen_style\x22:\x22procedural canon from params+seed, no hand-crafted asset\x22" as *u8) 774 775 // ============ PART 0 TORSO (fully dimorphic) ============ 776 var torsoTarget:i64=0;if semantic==1{torsoTarget=bp_emitted_parts(b,pos[0])} 777 emitP(b,pos,st,noise, 0,0,0,0,0) 778 // ★PELVIS re-proportioned by measurement: the crotch (pubic symphysis) sits at ~HALF stature (~470), 779 // NOT 430, and it is NARROW -- below it there are only the two separated legs. The old wide low crotch 780 // (ra 86 @ 430) made a solid block: silhouette 228 @ 429permil vs the oracle's 119 (legs separated). 781 emitR(b,pos,st,noise, 470, 0, 0, bp_thoracic_floor(g), 40+g) // crotch/pubis -- NARROW + high; ONE copy: the AT7 floor IS this bone ring 782 // ★★★TRIED TO ANCHOR THIS ON THE SKELETON AND THE RENDER REFUTED IT -- REVERTED, WITH THE REASON. 783 // The ring is mislabelled: it says "iliac, widest of pelvis" and sits at 496, a height at which no 784 // pelvic landmark lives (iliac crest ~600; widest hip breadth is BITROCHANTERIC at trochanterion 530). 785 // So it was moved to BP_TROCH to match the skeleton's hip joint -- and the pelvis grew a hard horizontal 786 // rim and read as a bucket. Raising the crotch instead was worse. ★THE BENCH COULD NOT SEE ANY OF IT: 787 // front IoU went 283 -> 282 for the broken shape and 285 for the reverted one, a four-point spread 788 // across four bodies that look obviously different to an eye. Metrics BESIDE the pixels, always. 789 // ★THE CAUSE, and it is structural rather than a number: this pelvis is ONE tube that narrows to a 790 // 36-wide crotch at 470. With the widest ring at 496 the cone from hip to crotch is 26 per-mille and 791 // reads as a rounded bottom; at the anatomically correct 530 it is 60 per-mille and reads as a skirt 792 // with a rim. A real pelvis does not narrow between trochanter and crotch -- it stays wide and SPLITS 793 // into two masses. So the surface cannot carry the true landmark until the pelvis becomes two lofted 794 // masses instead of one narrowing tube, which is the next rung, filed rather than faked. 795 // ★LAW: WHEN THE ANATOMICALLY RIGHT NUMBER MAKES THE SURFACE WORSE, THE MODEL IS TOO COARSE TO HOLD IT 796 // -- moving the number anyway just relocates the error into something the ruler cannot see. 797 emitR(b,pos,st,noise, 496, 0, 0-9, hip, 64+g) // surface ring, NOT the landmark 798 emitR(b,pos,st,noise, 545, 0, 0-2, waist, 60+g*6/10) // waist (dimorphic) 799 emitR(b,pos,st,noise, 620, 0, 5, 92+g*6/10, 64+g*6/10) // lower chest 800 emitR(b,pos,st,noise, 700, 0, 9, chestRa+g/2, bustD) // chest (bust depth) 801 emitR(b,pos,st,noise, 752, 0, 4, shoulder-2, 66) // upper chest / armpit level 802 emitR(b,pos,st,noise, acromion, 0, 0, shoulder, 58) // ★ACROMION -- the widest shoulder point 803 // sits HIGH (~810), not at 757; the 804 // biacromial span was measured 60 vs 805 // oracle 147 @ 833permil = too low+thin 806 emitR(b,pos,st,noise, 838, 0, 0-6, shoulder*52/100, 52) // trapezius slope down from acromion 807 emitR(b,pos,st,noise, 864, 0, 0-9, neckRa+6, neckRa+2) // trap base 808 emitR(b,pos,st,noise, 892, 0, 0-9, neckRa, neckRa) // neck 809 emitR(b,pos,st,noise, 920, 0, 0-6, neckRa-4, neckRa-3) // upper neck (into the head) 810 811 // ============ PART 1 ARM (deltoid caps just BELOW the acromion and hangs down) ============ 812 var armTarget:i64=1;if semantic==1{armTarget=bp_emitted_parts(b,pos[0])} 813 emitP(b,pos,st,noise, 1,0,0,0,0) 814 // ⚠REVERTED: generating this tube with UNIFORM stations on a LINEAR path measured 380 -> 329. The typed 815 // table is not merely a list -- it encodes NON-UNIFORM station density (four rings in the top 74 permil 816 // around the shoulder, then four across the remaining 240) and a NON-LINEAR hang path (x runs 56,76,92, 817 // 108 then only 116,130,144,154). A uniform linear generator destroys both. The rule needs a path curve 818 // and a station-distribution parameter before it can eat this table; see the ray-set rule for the shape 819 // that worked. Kept typed until the generator can reproduce it, because shipping the worse body to look 820 // more principled would be the wrong trade. 821 emitR(b,pos,st,noise, 812, 56, 0, 18*limbMul/1000*styLimb/1000, 19*limbMul/1000*styLimb/1000) 822 emitR(b,pos,st,noise, 792, 76, 0, 34*limbMul/1000*styLimb/1000, 35*limbMul/1000*styLimb/1000) 823 emitR(b,pos,st,noise, 770, 92, 0, 45*limbMul/1000*styLimb/1000, 45*limbMul/1000*styLimb/1000) 824 emitR(b,pos,st,noise, 738, 108, 0, 36*limbMul/1000*styLimb/1000, 38*limbMul/1000*styLimb/1000) 825 emitR(b,pos,st,noise, 700, 116, 0, 31*limbMul/1000*styLimb/1000, 33*limbMul/1000*styLimb/1000) 826 emitR(b,pos,st,noise, 634, 130, 0, 26*limbMul/1000*styLimb/1000, 28*limbMul/1000*styLimb/1000) 827 emitR(b,pos,st,noise, 560, 144, 0, 22*limbMul/1000*styLimb/1000, 24*limbMul/1000*styLimb/1000) 828 emitR(b,pos,st,noise, 500, 154, 0, 18*styLimb/1000, 20*styLimb/1000) // wrist 829 emitR(b,pos,st,noise, 478, 160, 0, 20*styLimb/1000, 13*styLimb/1000) // hand root 830 emitR(b,pos,st,noise, 456, 163, 2, 26*styLimb/1000, 9*styLimb/1000) // palm (wide + FLAT: rb<<ra) 831 emitR(b,pos,st,noise, 438, 163, 2, 27*styLimb/1000, 8*styLimb/1000) // knuckle line (widest, flat) 832 833 // ============ PART 2 LEG (girth + longer-leg stylization) ============ 834 var legTarget:i64=2;if semantic==1{legTarget=bp_emitted_parts(b,pos[0])} 835 emitP(b,pos,st,noise, 1,0,0,0,0) 836 emitR(b,pos,st,noise, 500*legScale/1000, 50, 0-6, 38*limbMul/1000, 50*limbMul/1000) // thigh top at the hip 837 // -- x50/ra38 leaves a 838 // perineal GAP so the 839 // legs SEPARATE (groin 840 // was a merged block) 841 emitR(b,pos,st,noise, 452*legScale/1000, 48, 0-6, 46*limbMul/1000, 56*limbMul/1000) // upper thigh (widest) 842 emitR(b,pos,st,noise, 352*legScale/1000, 45, 0-10, 43*limbMul/1000, 49*limbMul/1000) 843 emitR(b,pos,st,noise, 258*legScale/1000, 47, 0-12, 37*limbMul/1000, 43*limbMul/1000) 844 emitR(b,pos,st,noise, 190*legScale/1000, 48, 0-10, 32*limbMul/1000, 40*limbMul/1000) 845 emitR(b,pos,st,noise, 100*legScale/1000, 48, 0-4, 24*limbMul/1000, 32*limbMul/1000) 846 emitR(b,pos,st,noise, 42, 48, 2, 19, 21) 847 emitR(b,pos,st,noise, 25, 48, 2, 18, 20) 848 849 // ============ PART 3 FOOT (forward, placement rot 90) ============ 850 emitP(b,pos,st,noise, 1,90,48,40,0-41) 851 emitR(b,pos,st,noise, 0, 0, 30, 14, 10) 852 emitR(b,pos,st,noise, 16, 0, 14, 24, 26) 853 emitR(b,pos,st,noise, 42, 0, 16, 24, 24) 854 emitR(b,pos,st,noise, 71, 0, 24, 26, 16) 855 emitR(b,pos,st,noise, 96, 0, 28, 28, 12) 856 emitR(b,pos,st,noise, 118, 0, 32, 25, 8) 857 // ★TOES BY THE SAME RULE THAT GAVE FINGERS, placed in the FOOT's rotated frame so they run forward off 858 // the toe line. Great toe medial, stout and longest; the rest taper outward -- five calls, no modelling. 859 let tr: i64 = 5 + build/500 // toe radius, tracks the same build knob 860 // ⚠ toes must REPLACE the flat toe-plate, not extend past it -- and BOTH halves of that sentence are 861 // load-bearing. The first attempt ran them to 174 (~20% longer foot) and the height-normalised side 862 // silhouette fell 831 -> 723; the second attempt shortened them to fit INSIDE a plate that was never 863 // deleted, so nx_footcheck measured 27 of each toe's 34 units buried in the tube (protrusion 46 permil 864 // vs the 200 anatomical floor) -- the blunt hoof with pale nubs. So the tube now ENDS at the toe line 865 // (y118, where the toes begin) and the toes alone carry the foot from there to its unchanged tip at 866 // y152. Foot LENGTH is silhouette-critical and nx_footcheck T6 pins it: structure moved, silhouette not. 867 // 5 rays across the toe line, longest at ray 0 (hallux), running FORWARD in the foot's own frame: 868 // the SAME rule as the hand, four parameters different. plane=40 = the tube's own constant sole line 869 // (every tube ring holds zoff+rb = 40), so the toes stand flush on the same ground the heel does. 870 emitRaySet(b,pos,st, 1, 15, 118, 34, tr+2, 5, 0, 0-1, 40, 90, 48, 40, 0-41) 871 872 // ============ PART 4 HEAD (bigger for anime stylization) ============ 873 var headTarget:i64=4;if semantic==1{headTarget=bp_emitted_parts(b,pos[0])} 874 let hb: i64 = 884 // head base y (fixed to the neck) 875 emitPm(b,pos,st,noise, 0,0,0,0,0, 5) // material 5 = FACE (lips + brows coloured by region) 876 // ★FLAT FACE PLANE: the front z (rz0+rb) is kept nearly CONSTANT (~60-66) from jaw up through brow, so the 877 // face is a near-vertical plane facing forward -- not a receding ovoid. This lights the mouth (it no longer 878 // hides under a jutting chin) and de-eggs the head. Only above the brow and below the jaw does it round off. 879 emitR(b,pos,st,0, 852, 0, 0-6, 30, 34) // skull base buried in the neck (front z 28) 880 emitR(b,pos,st,noise, 876, 0, 8, 40*headScale/1000, 52*headScale/1000) // jaw (front z 60) 881 emitR(b,pos,st,noise, 894, 0, 6, 46*headScale/1000, 60*headScale/1000) // chin + mouth (front z 66) 882 emitR(b,pos,st,noise, hb+32, 0, 4, 50*headScale/1000, 62*headScale/1000) // cheek/nose base (66) 883 emitR(b,pos,st,noise, hb+46, 0, 2, 50*headScale/1000, 62*headScale/1000) // eyes (64) 884 emitR(b,pos,st,noise, hb+61, 0, 0, 48*headScale/1000, 59*headScale/1000) // brow (59) 885 emitR(b,pos,st,noise, hb+79, 0, 0-4, 45*headScale/1000, 54*headScale/1000) // forehead 886 emitR(b,pos,st,noise, hb+96, 0, 0-7, 41*headScale/1000, 47*headScale/1000) // upper skull 887 emitR(b,pos,st,noise, hb+112,0, 0-7, 30*headScale/1000, 34*headScale/1000) // high skull (crown lowered) 888 emitR(b,pos,st,noise, hb+120,0, 0-6, 16*headScale/1000, 18*headScale/1000) // crown (shorter -> less bullet) 889 890 // ============ ★PROCEDURAL HAND: 4 fingers + thumb, PLACED BY A RULE (not modelled one by one) ============ 891 // The arm tube ends in a palm at y~430,x~163; digits extend downward from it. mirror=1 gives both hands. 892 // Slimmer for the anime stylization (styLimb), a touch stouter with build. 893 let dr: i64 = 6*styLimb/1000 + build/500 // digit radius 894 // 4 rays across the knuckle line, longest at ray 1 (middle) -- one rule, not four typed fingers. 895 // plane = dr+2 keeps the middle finger byte-where it was (its fz = plane - dr = 2) while the thinner 896 // fingers rise to share its palmar plane -- the same flush rule that fixed the foot's sole. 897 emitRaySet(b,pos,st, 163, 14, 437, 52, dr, 4, 333, 1, dr+2, 0, 0, 0, 0) 898 emitDigit(b,pos,st, 137, 10, 452, 424, dr+1) // thumb (higher, forward, stout) 899 900 // ============ ★EYES: two eyeballs in the sockets (mirror gives both). r a touch bigger for anime. ============ 901 // eye colour: an explicit knob (customizer), or auto-varied from the seed so a random character gets a 902 // random-but-deterministic iris colour. This is procedural variation, not a hand-picked asset. 903 var em: i64 = eyecol 904 if em < 1 { em = 1 + (pr_step(st) % 4) } 905 // ★SECOND CANON CORRECTION (knowledge/face_tissue.dat): the eye line belongs at 942, and ours was at 928. 906 // The SAME 14 per-mille deficit the brow had -- the whole feature set was sitting low on the head, which 907 // is why raising the brow alone opened a gap above the eyes. Correcting them together keeps the 908 // brow-to-eye relationship the canon specifies. Two features, one measured offset, found by the port. 909 emitEye(b,pos,st, 942, 19, 55, 11 + 5*sty/1000, em) // canon eye line; wider + forward 910 // ★NOSE as real protruding GEOMETRY (see emitNose): the measured answer to head-scale detail 79. 911 // faceZ 46 sits the part's base just INSIDE the face surface so it merges with the head rather than 912 // floating in front of it (the same burial trick the head's base cap uses at the neck seam). 913 emitNose(b,pos,st, sexf, sty, 46, 5) 914 // ★F1083: the rest of the face as GEOMETRY. Each faceZ buries the part's base just inside the head 915 // surface so it merges rather than floats (the nose's lesson). Ears sit lateral (ex) and behind (ez). 916 // ⚠MATERIAL 0 (plain flesh), NOT 5. A part carrying material 5 inherits the HEAD's region-colouring 917 // rules -- angular colour bands calibrated for the head's geometry and radius. Applied to a small part 918 // those bands land arbitrarily: the first cut of the brow ridge rendered as a SHELF PAINTED WITH BLACK 919 // BARS (it read as goggles). The whole point of this rung is that geometry, not colour, makes a face -- 920 // so the feature parts take flesh and let the light do the work. 921 // ⚠⚠NOT SHIPPED -- REVERTED BY EYEBALL AFTER TWO CORRECTION PASSES (F1083, 2026-07-25). 922 // The four rules above are RETAINED, UNUSED (the GX-34 emitLimbTube precedent) because the mechanism is 923 // sound and the placement/shape is not. Measured detail_head rose 288 -> 333 -> 357, and the face got 924 // WORSE both times: the brow read first as a black-barred SHELF (goggles), then as pointed flanges beside 925 // the painted brow band; the chin read as a duckbill below the mouth; the lips never became visible at all. 926 // ★THE FINDING: the detail judge scores LOCAL NORMAL VARIANCE and cannot ask whether that variance is 927 // ANATOMY -- so feature-shaped bumps in the wrong places score exactly like features in the right ones. 928 // This is the GX-13 FBM Goodhart and the GX-58 bell, now reproduced in facial geometry, and it is why a 929 // rising number was not permission to ship. A bad face is worse than an honest egg. 930 // ★WHAT THE NEXT ATTEMPT NEEDS (all three, or it repeats this result): 931 // 1. the painted mat-5 brow/lip colour bands RETIRED first -- geometry and paint fight each other; 932 // 2. a HEAD-REGION judge that scores placement against oracle LANDMARKS, not variance alone; 933 // 3. features authored in the FACE PLANE, not as Y-stacked tubes: a brow ridge and a lip run 934 // HORIZONTALLY, and the part system can only stack rings along Y (rot is about X only), which is the 935 // structural reason these read as vertical blobs. Rotation about Z is the real unlock. 936 // ★F1084: the brow ridge, rebuilt as a HORIZONTAL Z-rotated part and shipped one feature at a time -- 937 // the previous rung added four at once and had to revert all four. Its painted colour band is retired 938 // in the emitter in the same change, because paint and geometry cannot both own a feature. 939 emitBrowZ(b,pos,st, sexf, sty, 59*headScale/1000, 0) 940 // ★THE PAIR, from the one rule. Upper lip sits higher and thinner; the lower is fuller and projects a 941 // little more, as it does on a real mouth. Their parent depth is the head's own ring at the mouth line 942 // (60*headScale/1000), so both ride proud of whatever skull the generator produced. Female lips fuller. 943 let lipFull: i64 = 11 + 3*sexf/1000 944 // ★CANON Y (F1128): the table puts the upper lip at 888 and the lower at 880, i.e. 8 apart. Ours were 13 945 // apart (894/881), which is why the mouth read as two separate rolls rather than one closed pair. The 946 // STOMION -- the line between them, which is what actually reads as a mouth -- lands at 882 as the canon 947 // specifies once they are this close. 948 // ⚠⚠THE CANON Y APPLIED LITERALLY CRASHED THE MIDLINE LANE 138 -> 40, AND THE CAUSE IS A LAW ALREADY IN 949 // THIS FILE: A FEATURE PART OCCUPIES A BAND, NOT A POINT. The table's 888/880 are the anatomical 950 // landmarks for the lip CENTRES as infinitesimal points; our lips are TUBES with radius ~9 and ~11, so 951 // centres 8 apart OVERLAP COMPLETELY and merge into one mass -- the groove that reads as a mouth 952 // disappears. The same collision that let the chin swallow the lips, arriving from the opposite 953 // direction. ★A LANDMARK TABLE CANNOT BE APPLIED DIRECTLY TO PARTS WITH EXTENT. 954 // ★THE DERIVED FIX: hold the canon STOMION (882, the line between the lips -- the landmark that actually 955 // reads) as the invariant, and place each lip so its INNER EDGE lands on it. Centre = stomion +/- radius. 956 // The canon is honoured where it matters and the parts stop fighting. 957 // ⚠THE STOMION-DERIVED PLACEMENT WAS ALSO REVERTED, and the numbers alone would have shipped it: mean 958 // 216 -> 222 and detail_head 277 -> 315, both up, headline only -3. But the EYEBALL said the mouth got 959 // WORSE -- the lower lip landed at 871, barely 19 above the chin, and the pair read as one flat mass at 960 // the bottom of the face instead of two lips with a groove. ★SO THE CANON'S STOMION DOES NOT TRANSFER 961 // EITHER: it is measured on the SDF lane's head, and on ours it sits too low. Same lesson as the nose, 962 // now confirmed on a second landmark -- of four values ported from the table, TWO transferred (brow, 963 // eye line: +46 headline) and TWO did not (nose, stomion). ★★A PORTED CANON IS A HYPOTHESIS PER 964 // LANDMARK, AND TWO OUT OF FOUR IS THE MEASURED HIT RATE. 965 emitLipZ(b,pos,st, sty, 60*headScale/1000, 0, 894, lipFull*80/100) // upper (measured-best) 966 emitLipZ(b,pos,st, sty, 60*headScale/1000, 0, 881, lipFull) // lower (measured-best) 967 // ★the chin: the mass a mouth is READ AGAINST. Measuring said our mouth height was already correct and 968 // the absent chin was what made it look low -- so this is the fix for that complaint, not moving the lips. 969 // ⚠⚠NOT SHIPPED after THREE measured attempts -- rule retained, unused (the emitLimbTube precedent). 970 // 868 / mass 13 -> headline 104, mean 211, detail_head 380, but a POINTED witch-chin jutting past the jaw 971 // 876 / mass 9 -> headline 69, mean 162, detail_head 352: cured the jut and SWALLOWED THE LIPS (the 972 // judge caught a collision the eye had missed -- its top edge reached 885, the lip 881) 973 // 866 / mass 10 -> headline 72, mean 201, detail_head 399 (BEST measured), still two STACKED LOBES 974 // ★★★THE ARCHITECTURAL FINDING, and it is why no amount of tuning fixed it: A CHIN IS NOT A PART. It is 975 // the FRONT OF THE JAW -- the visible end of one continuous mandible-plus-soft-tissue mass running ear to 976 // ear. Modelling a prominence of that mass as an isolated horizontal tube can only ever stack a ball 977 // under the mouth, which is exactly what all three attempts rendered. The unit to build is the JAW; the 978 // chin is then a property of its front, the way the glabella dip is a property of the brow ridge rather 979 // than a part of its own. This is the same lesson as the mouth looking low because the chin was absent, 980 // one level deeper: proportion and form are read from continuous structures, not from stacked pieces. 981 // emitChinZ(b,pos,st, sexf, sty, 52*headScale/1000, 0) 982 // emitLips(b,pos,st, sexf, sty, 44, 0) 983 // emitChin(b,pos,st, sexf, sty, 40, 0) 984 // emitBrow(b,pos,st, sexf, sty, 19, 44, 0) 985 // emitEar(b,pos,st, sty, 47, 0-6, 0) 986 987 // ============ RELIEF FEATURES (procedurally modulated by sex / muscularity / stylization) ============ 988 // TORSO front/back muscle definition scales with muscularity; the female bust is a large front feature. 989 emitF(b,pos, torsoTarget, 706, 62, 62, 34, 78*reliefMul/1000*(1000-sexf)/1000) // pectoral R (male) 990 emitF(b,pos, torsoTarget, 706, 62, 118, 34, 78*reliefMul/1000*(1000-sexf)/1000) // pectoral L 991 emitF(b,pos, torsoTarget, 698, 40, 62, 30, 60*sexf/1000) // BREAST R (female) 992 emitF(b,pos, torsoTarget, 698, 40, 118, 30, 60*sexf/1000) // BREAST L 993 emitF(b,pos, torsoTarget, 612, 70, 72, 26, 40*reliefMul/1000) // abdominal R 994 emitF(b,pos, torsoTarget, 612, 70, 108, 26, 40*reliefMul/1000) // abdominal L 995 emitF(b,pos, torsoTarget, 600, 90, 90, 13, 0-34*reliefMul/1000) // rectus groove 996 emitF(b,pos, torsoTarget, 660, 140,270, 15, 0-46) // spinal groove 997 emitF(b,pos, torsoTarget, 735, 52, 246, 32, 52*reliefMul/1000) // scapula R 998 emitF(b,pos, torsoTarget, 735, 52, 294, 32, 52*reliefMul/1000) // scapula L 999 emitF(b,pos, torsoTarget, 470, 54, 250, 40, 86 + 30*sexf/1000) // gluteal R (female fuller) 1000 emitF(b,pos, torsoTarget, 470, 54, 290, 40, 86 + 30*sexf/1000) // gluteal L 1001 emitF(b,pos, torsoTarget, 772, 44, 90, 44, 0-30) // supra-clavicular hollow 1002 // LEG 1003 emitF(b,pos, legTarget, 372, 90, 90, 52, 54*reliefMul/1000) // quadriceps 1004 emitF(b,pos, legTarget, 340, 80, 270, 46, 40*reliefMul/1000) // hamstring 1005 emitF(b,pos, legTarget, 196, 62, 270, 48, 68*reliefMul/1000) // gastrocnemius 1006 emitF(b,pos, legTarget, 258, 34, 90, 34, 30) // patella 1007 // ARM 1008 emitF(b,pos, armTarget, 690, 70, 90, 52, 44*reliefMul/1000) // biceps 1009 emitF(b,pos, armTarget, 690, 70, 270, 52, 36*reliefMul/1000) // triceps 1010 // HEAD (face) -- stylization can exaggerate the eye sockets (anime); nose softens for female 1011 emitF(b,pos, headTarget, 921, 22, 90, 17, 150 - 40*sexf/1000) // nose 1012 emitF(b,pos, headTarget, 908, 14, 90, 12, 120 - 30*sexf/1000) // nose tip 1013 emitF(b,pos, headTarget, 946, 16, 90, 40, 44) // brow 1014 emitF(b,pos, headTarget, 896, 18, 90, 26, 70 - 20*sexf/1000) // chin (softer female) 1015 emitF(b,pos, headTarget, 926, 20, 58, 24, 40) // cheekbone R 1016 emitF(b,pos, headTarget, 926, 20, 122, 24, 40) // cheekbone L 1017 emitF(b,pos, headTarget, 929, 14, 66, 16, 0-56 - 30*sty/1000) // eye socket R (holds the eyeball) 1018 emitF(b,pos, headTarget, 929, 14, 114, 16, 0-56 - 30*sty/1000) // eye socket L 1019 emitF(b,pos, headTarget, 924, 10, 90, 10, 40) // nasal bridge (between the eyes) 1020 emitF(b,pos, headTarget, 889, 9, 90, 20, 14) // lips: gentle protrusion, colour does the rest 1021 emitF(b,pos, headTarget, 906, 8, 78, 8, 0-24) // nostril R 1022 emitF(b,pos, headTarget, 906, 8, 102, 8, 0-24) // nostril L 1023 emitF(b,pos, headTarget, 963, 40, 270, 60, 46) // occiput 1024 1025 // ============ ★PROCEDURAL FINE MUSCLE STRUCTURE ============ 1026 // GENERATED BY RULES (loops emitting grids/fans), not hand-placed features. This is the surface-detail 1027 // frontier the honest DETAIL judge exposed (broad relief alone left the surface a smooth mannequin ~300). 1028 // It only appears above ~35% muscularity (real definition needs low body-fat + muscle), and its amplitude 1029 // scales with it -- so a soft body stays smooth and a lean muscular one gets a six-pack. 1030 let def: i64 = musc - 350 1031 if def > 0 { 1032 let da: i64 = def*1000/650 // 0..1000 as musc 350->1000 1033 // RECTUS ABDOMINIS "six-pack": a GRID -- two columns (L/R of the linea alba) x three rows of bulges, 1034 // with a vertical linea groove and horizontal tendinous-intersection grooves generated between them. 1035 var r6: i64 = 0 1036 while r6 < 3 { 1037 let y6: i64 = 558 + r6*36 1038 emitF(b,pos, torsoTarget, y6, 18, 79, 14, 66*da/1000) // rectus bulge R (column right) 1039 emitF(b,pos, torsoTarget, y6, 18, 101, 14, 66*da/1000) // rectus bulge L (column left) 1040 r6 = r6+1 1041 } 1042 emitF(b,pos, torsoTarget, 600, 130, 90, 7, 0-64*da/1000) // linea alba (sharp vertical groove) 1043 var h6: i64 = 0 1044 while h6 < 2 { // tendinous intersections (rows) 1045 emitF(b,pos, torsoTarget, 576 + h6*36, 7, 90, 32, 0-56*da/1000) 1046 h6 = h6+1 1047 } 1048 emitF(b,pos, torsoTarget, 676, 12, 62, 32, 0-58*da/1000) // pectoral lower border groove R 1049 emitF(b,pos, torsoTarget, 676, 12, 118, 32, 0-58*da/1000) // pectoral lower border groove L 1050 // SERRATUS ANTERIOR: a fan of finger-like slips on the lower-lateral ribcage -- generated as a series. 1051 var sv: i64 = 0 1052 while sv < 3 { 1053 let ys: i64 = 636 + sv*18 1054 emitF(b,pos, torsoTarget, ys, 14, 51, 14, 46*da/1000) // serratus slip R 1055 emitF(b,pos, torsoTarget, ys, 14, 129, 14, 46*da/1000) // serratus slip L 1056 sv = sv+1 1057 } 1058 emitF(b,pos, torsoTarget, 752, 22, 66, 17, 50*da/1000) // anterior deltoid head R 1059 emitF(b,pos, torsoTarget, 752, 22, 114, 17, 50*da/1000) // anterior deltoid head L 1060 // BACK definition: erector spinae columns either side of the spinal groove; trapezius wedge; lats. 1061 emitF(b,pos, torsoTarget, 600, 120, 258, 14, 40*da/1000) // erector R 1062 emitF(b,pos, torsoTarget, 600, 120, 282, 14, 40*da/1000) // erector L 1063 emitF(b,pos, torsoTarget, 700, 60, 270, 40, 34*da/1000) // trapezius 1064 emitF(b,pos, torsoTarget, 660, 70, 230, 20, 30*da/1000) // latissimus R 1065 emitF(b,pos, torsoTarget, 660, 70, 310, 20, 30*da/1000) // latissimus L 1066 // LIMB definition: biceps peak + brachial groove (arm); quadriceps heads + hamstring split (leg); calf heads. 1067 emitF(b,pos, armTarget, 690, 46, 90, 30, 44*da/1000) // biceps peak (sharper than base) 1068 emitF(b,pos, armTarget, 690, 46, 40, 16, 0-30*da/1000) // brachial groove (biceps/triceps sep) 1069 emitF(b,pos, armTarget, 690, 46, 140, 16, 0-30*da/1000) 1070 emitF(b,pos, legTarget, 372, 70, 70, 30, 40*da/1000) // vastus lateralis R-of-front 1071 emitF(b,pos, legTarget, 372, 70, 110, 30, 40*da/1000) // vastus medialis L-of-front 1072 emitF(b,pos, legTarget, 340, 60, 270, 20, 0-30*da/1000) // hamstring split groove 1073 emitF(b,pos, legTarget, 196, 52, 250, 22, 44*da/1000) // gastrocnemius medial head 1074 emitF(b,pos, legTarget, 196, 52, 290, 22, 44*da/1000) // gastrocnemius lateral head 1075 // FRONT-FACING limb definition (raises the front-view detail, where arm/leg fronts were still smooth) 1076 emitF(b,pos, legTarget, 372, 58, 90, 22, 42*da/1000) // rectus femoris (center front thigh) 1077 emitF(b,pos, legTarget, 300, 52, 108, 20, 34*da/1000) // vastus medialis teardrop (inner) 1078 emitF(b,pos, legTarget, 372, 54, 132, 22, 0-28*da/1000) // IT-band groove (lateral thigh) 1079 emitF(b,pos, legTarget, 150, 54, 86, 22, 32*da/1000) // tibialis anterior (shin) 1080 emitF(b,pos, legTarget, 258, 30, 90, 20, 36*da/1000) // patella (sharper) 1081 emitF(b,pos, armTarget, 560, 52, 88, 26, 36*da/1000) // forearm flexor bulge (front) 1082 emitF(b,pos, armTarget, 560, 52, 58, 18, 0-24*da/1000) // brachioradialis groove 1083 emitF(b,pos, armTarget, 500, 40, 92, 22, 0-22*da/1000) // wrist taper groove 1084 // FRONT-FACING chest: sternum groove + clavicle line, so the upper chest isn't a smooth plate 1085 emitF(b,pos, torsoTarget, 720, 70, 90, 8, 0-30*da/1000) // sternum midline groove 1086 emitF(b,pos, torsoTarget, 748, 12, 74, 22, 30*da/1000) // clavicle R 1087 emitF(b,pos, torsoTarget, 748, 12, 106, 22, 30*da/1000) // clavicle L 1088 } 1089 1090 // ---- write the canon file ---- 1091 let fd: i64 = sys_openat_wr(outp, 0x1a4) // 0644 1092 if fd < 0 { pw(1, ",\x22error\x22:\x22cannot open out\x22}\n" as *u8); return 3 } 1093 sys_write(fd, b, pos[0]) 1094 sys_close(fd) 1095 let nb: *u8 = sys_mmap(64); let np2: *i64 = sys_mmap(8) as *i64; np2[0]=0 1096 pw(1, ",\x22bytes\x22:" as *u8); wint(nb,np2,pos[0],32); sys_write(1, nb, np2[0]-1) 1097 np2[0]=0; pw(1, ",\x22sex\x22:" as *u8); wint(nb,np2,sex,32); sys_write(1, nb, np2[0]-1) 1098 np2[0]=0; pw(1, ",\x22build\x22:" as *u8); wint(nb,np2,build,32); sys_write(1, nb, np2[0]-1) 1099 np2[0]=0; pw(1, ",\x22musc\x22:" as *u8); wint(nb,np2,musc,32); sys_write(1, nb, np2[0]-1) 1100 np2[0]=0; pw(1, ",\x22seed\x22:" as *u8); wint(nb,np2,seed,32); sys_write(1, nb, np2[0]-1) 1101 np2[0]=0; pw(1, ",\x22stylize\x22:" as *u8); wint(nb,np2,sty,32); sys_write(1, nb, np2[0]-1) 1102 pw(1, "}\n" as *u8) 1103 return 0 1104} 1105 1106func main(argc:i64,argv:*i64)->i64{ 1107 if argc<2{pw(1,"usage: nx_body_proc <out.canon> [sex build muscle noise seed stylize eye rest.dat [semantic-parts-v2]]\nLegacy mode preserves positional feature ownership; semantic-parts-v2 binds generated torso/arm/leg/head feature targets. This is not anatomical qualification.\n" as *u8);return 2} 1108 if bp_streq(argv[1] as *u8,"--help" as *u8)==1{pw(1,"usage: nx_body_proc <out.canon> [sex build muscle noise seed stylize eye rest.dat [semantic-parts-v2]]\nExisting commands: evidence [canonconf refs], floorcheck sex build [dimorphconf].\n" as *u8);return 0} 1109 return bp_semantic_generate(argc,argv) 1110}