nx_texr_chart_gate_t279.nx source
↩ module page · 66 lines · 4642 B
1// nx_texr_chart_gate_t279.nx -- Validates and processes chart data, checking vertex and triangle integrity before exporting to a file.
2import "nx_texr_chart_candidate_t279.nx"
3import "nx_gate_verdict.nx"
4func main(argc:i64,argv:*i64)->i64{
5 if argc!=3{return 2}
6 let lp:*i64=sys_mmap_try(16) as *i64
7 let b:*u8=sys_read_file(argv[1] as *u8,lp);if b==(0 as *u8){return 3}
8 let c:*NtrChartContext=sys_mmap_try(__size_of(NtrChartContext)) as *NtrChartContext
9 let points:*NtrChartPoint=sys_mmap_try(3*__size_of(NtrChartPoint)) as *NtrChartPoint
10 let count:*i64=gv_ctr()
11 gv_check_eq("ratio half",ntr_chart_ratio_q16(1,2),32768,count)
12 gv_check_eq("ratio unwrapped repeats",ntr_chart_ratio_q16(5,2),163840,count)
13 gv_check_eq("zero denominator refuses",ntr_chart_ratio_q16(1,0),NTR_CHART_BAD,count)
14 gv_check_eq("overflow refuses",ntr_chart_ratio_q16(NTR_CHART_MAX,1),NTR_CHART_OVERFLOW,count)
15 gv_check_eq("regional floor pixel math",ntr_px_sub(32768,0,0,1,2,9,227,8,2048),32688,count)
16 let rc:i64=ntr_chart_init(b,lp[0],c)
17 gv_check_eq("actual source initializes",rc,0,count);if rc!=0{return 4}
18 var ok:i64=0;var rejected:i64=0;var micro:i64=0;var i:i64=0
19 while i<c.nv{
20 let pr:i64=ntr_chart_point(c,i,points)
21 if pr==0{ok=ok+1;if points.micro_valid==1{micro=micro+1}}else{rejected=rejected+1}
22 i=i+1
23 }
24 nt_outs("CHART vertices=");nt_outn(c.nv);nt_outs(" mapped=");nt_outn(ok);nt_outs(" rejected=");nt_outn(rejected);nt_outs(" micro=");nt_outn(micro);nt_outs("\n")
25 gv_check_eq("vertex coverage complete",ok+rejected,c.nv,count)
26 gv_check("actual mapped vertices",ok>0,count)
27 var interiors:i64=0;var straddle:i64=0;var seam:i64=0;var bad:i64=0;i=0
28 while i<c.nt{
29 let tr:i64=ntr_chart_triangle(c,i,points)
30 if tr==0{interiors=interiors+1}else{if tr==NTR_CHART_STRADDLE{straddle=straddle+1}else{if tr==NTR_CHART_SEAM{seam=seam+1}else{bad=bad+1}}}
31 i=i+1
32 }
33 nt_outs("CHART triangles=");nt_outn(c.nt);nt_outs(" interiors=");nt_outn(interiors);nt_outs(" straddle=");nt_outn(straddle);nt_outs(" seam=");nt_outn(seam);nt_outs(" invalid=");nt_outn(bad);nt_outs("\n")
34 gv_check_eq("triangle coverage complete",interiors+straddle+seam+bad,c.nt,count)
35 gv_check("interior witness",interiors>0,count)
36 gv_check("cross chart explicit witness",straddle>0,count)
37 gv_check_eq("negative vertex refuses",ntr_chart_point(c,0-1,points),NTR_CHART_BAD,count)
38 gv_check_eq("failed point not valid",points.joint,NTR_MISS,count)
39 let rowbytes:i64=__size_of(NtrChartPoint)
40 let data:*u8=sys_mmap_try(c.nv*rowbytes)
41 if (data as i64)<=0{return 3}
42 i=0;while i<c.nv{if ntr_chart_point(c,i,((data as i64)+i*rowbytes) as *NtrChartPoint)!=0{return 5};i=i+1}
43 let fd:i64=sys_openat_exclusive(argv[2] as *u8,MODE_0600);if fd<0{return 6}
44 var written:i64=0;while written<c.nv*rowbytes{let n:i64=sys_write(fd,((data as i64)+written) as *u8,c.nv*rowbytes-written);if n<=0{return 7};written=written+n};sys_close(fd);sys_munmap_direct(data,c.nv*rowbytes)
45 let w:*i64=b as *i64;let x:i64=c.x;let saved:i64=w[x+3]
46 let xe:i64=nxa_section_entry(b,lp[0],nxa_tag4("TEXC"))
47 w[x+3]=1
48 w[xe+3]=nxa_check2(1,((b as i64)+w[xe+1]) as *i64,w[xe+2]);w[3]=nxa_check2(1,((b as i64)+NT_HDR) as *i64,w[2]*4)
49 gv_check_eq("rectangle mode rejected",ntr_chart_init(b,lp[0],c),NTR_CHART_LAYOUT,count)
50 gv_check("failed init clears context",c.w==(0 as *i64),count)
51 w[x+3]=saved
52 w[xe+3]=nxa_check2(1,((b as i64)+w[xe+1]) as *i64,w[xe+2]);w[3]=nxa_check2(1,((b as i64)+NT_HDR) as *i64,w[2]*4)
53 gv_check_eq("restored source initializes",ntr_chart_init(b,lp[0],c),0,count)
54 let rr:i64=c.r;let re:i64=nxa_section_entry(b,lp[0],nxa_tag4("TEXR"))
55 let original_rank:i64=w[rr+NTR_HDR_WORDS+NTR_JOINT_WORDS+1]
56 let original_region:i64=w[rr+NTR_HDR_WORDS+NTR_JOINT_WORDS]
57 w[rr+NTR_HDR_WORDS+NTR_JOINT_WORDS]=w[rr+NTR_HDR_WORDS]
58 w[rr+NTR_HDR_WORDS+NTR_JOINT_WORDS+1]=w[rr+NTR_HDR_WORDS+1]
59 w[re+3]=nxa_check2(1,((b as i64)+w[re+1]) as *i64,w[re+2]);w[3]=nxa_check2(1,((b as i64)+NT_HDR) as *i64,w[2]*4)
60 gv_check_eq("duplicate region rank rejected",ntr_chart_init(b,lp[0],c),NTR_CHART_BAD,count)
61 w[rr+NTR_HDR_WORDS+NTR_JOINT_WORDS]=original_region;w[rr+NTR_HDR_WORDS+NTR_JOINT_WORDS+1]=original_rank
62 w[re+3]=nxa_check2(1,((b as i64)+w[re+1]) as *i64,w[re+2]);w[3]=nxa_check2(1,((b as i64)+NT_HDR) as *i64,w[2]*4)
63 gv_check_eq("null input rejected",ntr_chart_init(0 as *u8,lp[0],c),NTR_CHART_BAD,count)
64 sys_munmap_direct(points as *u8,3*__size_of(NtrChartPoint));sys_munmap_direct(c as *u8,__size_of(NtrChartContext));sys_munmap_direct(lp as *u8,16)
65 return gv_verdict("TEXR-CHART-T279",count,"Chart-interior coordinate mapping only; straddles and cylindrical seam interpolation unsupported")
66}