nx_face_support_capture_t239.nx source
↩ module page · 56 lines · 2578 B
1// Controlled recombination: add explicitly selected existing anatstack support ellipsoids
2// before faceanat's subtractive apertures. Exact source dimensions retained.
3// No anatomical correctness claim. Existing index-based morph APIs need remapping before adoption.
4// Usage out.png support-indices.dat [baseline=0 / supports=1]
5import "nx_faceanat.nx"
6import "nx_anatstack.nx"
7import "nx_sdfrender_mt.nx"
8import "nx_png.nx"
9func main(argc:i64,argv:*i64)->i64{
10 if argc!=4{return 2}
11 let base:i64=sys_mmap(sdf_bytes()) as i64
12 if base==0{return 3}faceanat_build(base)
13 let mode:*u8=argv[3] as *u8
14 if mode[0]==(49 as u8){
15 let len:*i64=sys_mmap(16) as *i64;let cfg:*u8=sys_read_file(argv[2] as *u8,len)
16 if (cfg as i64)==0{return 4}
17 // Current anatstack source declares fewer rows than the existing SDF part arena.
18 let parts:*i64=sys_mmap(PARTS_CAP*AS_STRIDE*8) as *i64
19 let count:i64=anatstack_build(parts)
20 if count>PARTS_CAP{return 5}
21 let chosen:*i64=sys_mmap(PARTS_CAP*8) as *i64
22 var n:i64=0;var pos:i64=0
23 while pos<len[0]{
24 while pos<len[0]{if cfg[pos]>(32 as u8){break}pos=pos+1}
25 if pos>=len[0]{break}
26 var id:i64=0;var digits:i64=0
27 while pos<len[0]{let c:i64=cfg[pos] as i64;if c<48{break}if c>57{break}
28 id=id*10+c-48;if id>=count{return 5}digits=digits+1;pos=pos+1}
29 if digits==0{return 5}if parts[id*AS_STRIDE+1]!=AS_ELLIP{return 5}
30 if n>=PARTS_CAP{return 5}chosen[n]=id;n=n+1
31 }
32 let np:*i64=(base+O_NPART) as *i64
33 if np[0]+n>PARTS_CAP{return 5}
34 let p:*i64=(base+O_PARTS) as *i64
35 let op:*i64=(base+O_OPS) as *i64;let mt:*i64=(base+O_MATS) as *i64
36 let kb:*i64=(base+O_KB2) as *i64;let rt:*i64=(base+O_ROT) as *i64;let roll:*i64=(base+O_ROLL) as *i64
37 // Locate first carve by operation metadata, not a guessed anatomical coordinate.
38 var first:i64=0;while first<np[0]{if op[first]==1{break}first=first+1}
39 var i:i64=np[0]-1
40 while i>=first{
41 var j:i64=0;while j<SDF_PART_FIELDS{p[(i+n)*SDF_PART_FIELDS+j]=p[i*SDF_PART_FIELDS+j];j=j+1}
42 op[i+n]=op[i];mt[i+n]=mt[i];kb[i+n]=kb[i]
43 rt[(i+n)*2]=rt[i*2];rt[(i+n)*2+1]=rt[i*2+1]
44 roll[(i+n)*2]=roll[i*2];roll[(i+n)*2+1]=roll[i*2+1]
45 i=i-1
46 }
47 i=0;while i<n{
48 let dst:i64=first+i;let src:i64=chosen[i]*AS_STRIDE
49 var j:i64=0;while j<SDF_PART_FIELDS{p[dst*SDF_PART_FIELDS+j]=parts[src+2+j];j=j+1}
50 op[dst]=0;mt[dst]=0;kb[dst]=0;rt[dst*2]=0;rt[dst*2+1]=0;roll[dst*2]=0;roll[dst*2+1]=0;i=i+1
51 }
52 np[0]=np[0]+n
53 }else{if mode[0]!=(48 as u8){return 2}}
54 sdfmt_render(base,0,4,236,180,156,0)
55 return write_png((base+fb_off()) as *i64,ww(),hh(),argv[1] as *u8)
56}