nx_obj_exact_gate_t284.nx source
↩ module page · 97 lines · 8070 B
1// nx_obj_exact_gate_t284.nx -- Validates polygon and decimal data structures within the Nishi sovereign ecosystem.
2
3import "nx_obj_import.nx"
4import "nx_gate_verdict.nx"
5import "nx_meshcheck.nx"
6import "nx_sha256.nx"
7import "nx_fs_create_lib.nx"
8func oe_hash(p:*u8,n:i64)->i64{var d:*u8=sys_mmap_try(32);if (d as i64)==0{return -1};sha256_digest(p,n,d);let h:*u8="0123456789abcdef";var i:i64=0;while i<32{let b:i64=d[i] as i64;sys_write(1,(h as i64+b/16) as *u8,1);sys_write(1,(h as i64+b%16) as *u8,1);i=i+1};sys_munmap_direct(d,32);return 0}
9func oe_decimal(s:*u8,want:i64,exp:i64,rc:i64)->i64{var v:i64=991;var e:i64=992;let r:i64=oi_decimal_exact(s,vw_slen(s),&v,&e);if r!=rc{return 0};if r==0{if v!=want||e!=exp{return 0}}else{if v!=991||e!=992{return 0}};return 1}
10func oe_text(s:*u8,want:i64,vcap:i64,fcap:i64)->i64{
11 var o:OiExactView;let v:*i64=sys_mmap_try(32*__size_of(i64)) as *i64;let f:*i64=sys_mmap_try(32*__size_of(i64)) as *i64
12 if (v as i64)==0||(f as i64)==0{return 0};v[31]=7123;f[31]=7124
13 let rc:i64=oi_read_exact_bytes(s,vw_slen(s),v,f,vcap,fcap,&o)
14 var ok:i64=1;if rc!=want||o.status!=want||v[31]!=7123||f[31]!=7124{ok=0}
15 sys_munmap_direct(v as *u8,32*__size_of(i64));sys_munmap_direct(f as *u8,32*__size_of(i64));return ok
16}
17
18func oe_polygon()->i64 {
19 let s:*u8="v 0 0 0\nv 1 0 0\nv 2 0 0\nv 3 0 0\nv 4 0 0\nv 5 0 0\nv 6 0 0\nv 7 0 0\nv 8 0 0\nv 9 0 0\nv 10 0 0\nv 11 0 0\nv 12 0 0\nv 13 0 0\nv 14 0 0\nv 15 0 0\nv 16 0 0\nv 17 0 0\nv 18 0 0\nv 19 0 0\nv 20 0 0\nv 21 0 0\nv 22 0 0\nv 23 0 0\nv 24 0 0\nv 25 0 0\nv 26 0 0\nv 27 0 0\nv 28 0 0\nv 29 0 0\nv 30 0 0\nv 31 0 0\nv 32 0 0\nv 33 0 0\nv 34 0 0\nv 35 0 0\nv 36 0 0\nv 37 0 0\nv 38 0 0\nv 39 0 0\nv 40 0 0\nv 41 0 0\nv 42 0 0\nv 43 0 0\nv 44 0 0\nv 45 0 0\nv 46 0 0\nv 47 0 0\nv 48 0 0\nv 49 0 0\nv 50 0 0\nv 51 0 0\nv 52 0 0\nv 53 0 0\nv 54 0 0\nv 55 0 0\nv 56 0 0\nv 57 0 0\nv 58 0 0\nv 59 0 0\nv 60 0 0\nv 61 0 0\nv 62 0 0\nv 63 0 0\nv 64 0 0\nf 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65\n"
20 var o:OiExactView
21 let rc:i64=oi_read_exact_bytes(s,vw_slen(s),0 as *i64,0 as *i64,0,0,&o)
22 if rc!=-3||o.nv!=65||o.nt!=63||o.sourceFaces!=1||o.polygonFaces!=1||o.fanTriangles!=63||o.triangulation!=OIE_FAN_UNQUALIFIED{return 0}
23 let vb:i64=o.nv*3*__size_of(i64);let fb:i64=o.nt*3*__size_of(i64)
24 let v:*i64=sys_mmap_try(vb) as *i64;let f:*i64=sys_mmap_try(fb) as *i64
25 if (v as i64)==0||(f as i64)==0{return 0}
26 var ok:i64=1
27 if oi_read_exact_bytes(s,vw_slen(s),v,f,65,63,&o)!=0{ok=0}
28 var i:i64=0;while i<63{if f[i*3]!=0||f[i*3+1]!=i+1||f[i*3+2]!=i+2{ok=0};i=i+1}
29 sys_munmap_direct(v as *u8,vb);sys_munmap_direct(f as *u8,fb);return ok
30}
31
32func main(argc:i64,argv:*i64)->i64{
33 let ctr:*i64=gv_ctr()
34 gv_check("polygon beyond legacy64 retains63 triangles",oe_polygon(),ctr)
35 gv_check("decimal negative overflow",oe_decimal("-9223372036854775809",0,0,OIE_RANGE),ctr)
36 gv_check("decimal exponent adjustment overflow",oe_decimal("100e9223372036854775807",0,0,OIE_RANGE),ctr)
37 gv_check("decimal double point",oe_decimal("1..2",0,0,OIE_SYNTAX),ctr)
38 gv_check("decimal malformed full token",oe_decimal("1e2x",0,0,OIE_SYNTAX),ctr)
39 gv_check("face index overflow",oe_text("v 0 0 0\nf 9223372036854775808 1 1\n",OIE_RANGE,1,1),ctr)
40 gv_check("truncated vertex token",oe_text("v",OIE_SYNTAX,1,1),ctr)
41 gv_check("CRLF and slash reference",oe_text("v 0 0 0\r\nv 1 0 0\r\nv 0 1 0\r\nf 1//1 2/1/1 3/1/1\r\n",0,3,1),ctr)
42 gv_check("sign-only positive vt refused",oe_text("v 0 0 0\nv 1 0 0\nv 0 1 0\nf 1/+/1 2//1 3//1\n",OIE_SYNTAX,3,1),ctr)
43 gv_check("sign-only negative vt refused",oe_text("v 0 0 0\nv 1 0 0\nv 0 1 0\nf 1/-/1 2//1 3//1\n",OIE_SYNTAX,3,1),ctr)
44 gv_check("sign-only final normal refused",oe_text("v 0 0 0\nv 1 0 0\nv 0 1 0\nf 1/1/+ 2//1 3//1\n",OIE_SYNTAX,3,1),ctr)
45 gv_check("decimal full precision",oe_decimal("+.0000012300",123,-8,0),ctr)
46 gv_check("decimal exponent",oe_decimal("-1.234567890123456789e+2",-1234567890123456789,-16,0),ctr)
47 gv_check("decimal trailing point",oe_decimal("1.",1,0,0),ctr)
48 gv_check("decimal signed min",oe_decimal("-9223372036854775808",OIE_MIN,0,0),ctr)
49 gv_check("decimal signed max",oe_decimal("9223372036854775807",OIE_MAX,0,0),ctr)
50 gv_check("decimal zero",oe_decimal("-0.000e20",0,0,0),ctr)
51 gv_check("decimal overflow",oe_decimal("9223372036854775808",0,0,OIE_RANGE),ctr)
52 gv_check("decimal exponent overflow",oe_decimal("1e9223372036854775808",0,0,OIE_RANGE),ctr)
53 gv_check("decimal malformed exponent",oe_decimal("1e-",0,0,OIE_SYNTAX),ctr)
54 gv_check("decimal underscore refused",oe_decimal("1_2",0,0,OIE_SYNTAX),ctr)
55 gv_check("decimal suffix refused",oe_decimal("1.2f64",0,0,OIE_SYNTAX),ctr)
56 gv_check("decimal no digits",oe_decimal(".",0,0,OIE_SYNTAX),ctr)
57 let tri:*u8="v 0 0 0\nv .000001 0 0\nv 0 .000001 0\nf -3 -2 -1"
58 gv_check("triangle exact and no newline",oe_text(tri,0,3,1),ctr)
59 gv_check("vertex capacity",oe_text(tri,-3,2,1),ctr)
60 gv_check("face capacity",oe_text(tri,-4,3,0),ctr)
61 gv_check("missing axis",oe_text("v 0 0\n",-6,3,1),ctr)
62 gv_check("invalid index",oe_text("v 0 0 0\nf 1 2 3\n",-5,3,1),ctr)
63 gv_check("homogeneous coordinate unsupported",oe_text("v 0 0 0 1\n",-6,3,1),ctr)
64 gv_check("precision dynamic range",oe_text("v 1e100 1e-100 0\n",-7,1,0),ctr)
65 if argc!=2{return 2}
66 var sn:i64=0;let src:*u8=sys_map_file(argv[1] as *u8,&sn);if (src as i64)==0{return 3}
67 var o:OiExactView
68 let sizing:i64=oi_read_exact_bytes(src,sn,0 as *i64,0 as *i64,0,0,&o)
69 if sizing!=-3{return 4}
70 let vb:i64=o.nv*3*__size_of(i64);let fb:i64=o.nt*3*__size_of(i64)
71 let v:*i64=sys_mmap_try(vb) as *i64;let f:*i64=sys_mmap_try(fb) as *i64
72 if (v as i64)==0||(f as i64)==0{return 5}
73 let nv:i64=o.nv;let nt:i64=o.nt
74 let rc:i64=oi_read_exact(argv[1] as *u8,v,f,nv,nt,&o)
75 gv_check("Bunny exact import",rc==0&&o.nv==35947&&o.nt==69451&&o.exponent10==-6&&o.sourceFaces==69451&&o.polygonFaces==0&&o.fanTriangles==0&&o.triangulation==OIE_TRIANGLES_ONLY,ctr)
76 var maximum:i64=0;var i:i64=0;var safe:i64=1
77 while i<nv*3{var a:i64=v[i];if a==OIE_MIN{safe=0}else{if a<0{a=0-a};if a>maximum{maximum=a}};i=i+1}
78 // Every cross component <= 2*(2M)^2 = 8*M*M. Check via divisions before products.
79 if maximum>0{if maximum>OIE_MAX/maximum/8{safe=0}}
80 gv_check("Bunny cross-product range proved",safe==1,ctr)
81 if safe!=1{return 6}
82 let out:*i64=sys_mmap_try(MC_O_SLOTS*__size_of(i64)) as *i64
83 let list:*i64=sys_mmap_try(mc_list_slots()*__size_of(i64)) as *i64
84 if (out as i64)==0||(list as i64)==0{return 7}
85 let verdict:i64=mc_check(v,nv,f,nt,out,list)
86 gv_check("Bunny zero introduced collapsed faces",out[MC_O_DEGEN_AREA]==0,ctr)
87 fsx_puts("EXACT sourceSha256=");oe_hash(src,sn);fsx_puts(" verticesSha256=");oe_hash(v as *u8,vb);fsx_puts(" indicesSha256=");oe_hash(f as *u8,fb)
88 fsx_puts(" sourceFaces=");fsx_putn(o.sourceFaces);fsx_puts(" polygonFaces=");fsx_putn(o.polygonFaces);fsx_puts(" fanTriangles=");fsx_putn(o.fanTriangles);fsx_puts(" triangulation=");fsx_putn(o.triangulation);fsx_puts(" exponent10=");fsx_putn(o.exponent10);fsx_puts(" maxAbs=");fsx_putn(maximum);fsx_puts(" topologySlots=")
89 i=0;while i<MC_O_SLOTS{if i>0{fsx_puts(",")};fsx_putn(out[i]);i=i+1};fsx_puts("\n")
90 var counts0:i64=0;let counts:*i64=sys_mmap_try(2*__size_of(i64)) as *i64
91 let legacy:i64=oi_read(argv[1] as *u8,v,f,nv,nt,counts)
92 gv_check("legacy still callable",legacy==0&&counts[0]==nv&&counts[1]==nt&&OI_FX==1024,ctr)
93 mc_check(v,nv,f,nt,out,list);gv_check("legacy collapse remains explicit",out[MC_O_DEGEN_AREA]==2011,ctr)
94 fsx_puts("LEGACY verticesSha256=");oe_hash(v as *u8,vb);fsx_puts(" indicesSha256=");oe_hash(f as *u8,fb);fsx_puts("\n")
95 sys_munmap_direct(src,sn);sys_munmap_direct(v as *u8,vb);sys_munmap_direct(f as *u8,fb);sys_munmap_direct(out as *u8,MC_O_SLOTS*__size_of(i64));sys_munmap_direct(list as *u8,mc_list_slots()*__size_of(i64));sys_munmap_direct(counts as *u8,2*__size_of(i64))
96 return gv_verdict("OBJ-EXACT",ctr,"source-space precision only; units UV materials normals occlusion unqualified")
97}