nx_body_winding_gate_t365.nx source
↩ module page · 49 lines · 4589 B
1import "nx_body_gen_winding_candidate_t365.nx"
2import "nx_solid_actual_loft_gate_t365.nx"
3import "nx_meshprofile.nx"
4func bw_same_corner(a:*u8,b:*u8,ai:i64,bi:i64)->i64{return bag_equal(bag_at(a,ai*12),bag_at(b,bi*12),12)&bag_equal(bag_at(a,36+ai*12),bag_at(b,36+bi*12),12)}
5func bw_part(b:*u8,start:i64,count:i64,g:*i64)->i64{
6 var opposed:i64=0;var degenerate:i64=0;var volume6:i64=0;var t:i64=0
7 let v:*i64=sys_mmap_try(9*__size_of(i64)) as *i64;if (v as i64)<=0{return -1}
8 while t<count{let off:i64=88+(start+t)*84;var j:i64=0;while j<9{v[j]=mp_f32(bag_u32(b,off+j*4),1);j=j+1}
9 let ux:i64=v[3]-v[0];let uy:i64=v[4]-v[1];let uz:i64=v[5]-v[2];let vx:i64=v[6]-v[0];let vy:i64=v[7]-v[1];let vz:i64=v[8]-v[2]
10 let nx:i64=uy*vz-uz*vy;let ny:i64=uz*vx-ux*vz;let nz:i64=ux*vy-uy*vx
11 volume6=volume6+v[0]*(v[4]*v[8]-v[5]*v[7])+v[1]*(v[5]*v[6]-v[3]*v[8])+v[2]*(v[3]*v[7]-v[4]*v[6])
12 if nx==0&&ny==0&&nz==0{degenerate=degenerate+1}else{var ax:i64=0;var ay:i64=0;var az:i64=0;j=0;while j<3{ax=ax+mp_f32(bag_u32(b,off+36+j*12),16384);ay=ay+mp_f32(bag_u32(b,off+40+j*12),16384);az=az+mp_f32(bag_u32(b,off+44+j*12),16384);j=j+1};if nx*ax+ny*ay+nz*az<0{opposed=opposed+1}}
13 t=t+1}
14 gv_kv("part_triangle_start",start);gv_kv("part_triangle_count",count);gv_kv("opposed_mean_normals",opposed);gv_kv("degenerate_faces",degenerate);gv_kv("signed_volume_times6_mm3",volume6)
15 gv_check("part coherent outward mean normals",opposed==0,g)
16 let freed:i64=sys_munmap_direct(v as *u8,9*__size_of(i64));if freed!=0{return -1};return degenerate
17}
18func main(argc:i64,argv:*i64)->i64{
19 if argc!=3{return 2};let g:*i64=gv_ctr();gv_head("Complete body local-axis winding and corner preservation")
20 var an:i64=0;var bn:i64=0;let a:*u8=sys_read_file(argv[1] as *u8,&an);let b:*u8=sys_read_file(argv[2] as *u8,&bn)
21 if bag_header(a,an)!=1||bag_header(b,bn)!=1{sys_free_file(a,an);sys_free_file(b,bn);return 3}
22 gv_check("whole source and candidate extent identical",an==bn&&an==9136600,g);gv_check("headers and layer identities unchanged",bag_equal(a,b,88)==1&&bag_equal(bag_at(a,88+103824*84),bag_at(b,88+103824*84),103824*4)==1,g)
23 var same:i64=0;var swapped:i64=0;var invalid:i64=0;var i:i64=0;while i<103824{let aa:*u8=bag_at(a,88+i*84);let bb:*u8=bag_at(b,88+i*84);if bag_equal(aa,bb,84)==1{same=same+1}else{if bw_same_corner(aa,bb,0,0)==1&&bw_same_corner(aa,bb,1,2)==1&&bw_same_corner(aa,bb,2,1)==1&&bag_equal(bag_at(aa,72),bag_at(bb,72),12)==1{swapped=swapped+1}else{invalid=invalid+1}};i=i+1}
24 gv_kv("unchanged_triangles_all_layers",same);gv_kv("swapped_triangles_all_layers",swapped);gv_check("all geometry normals colors preserved by complete corner permutation",invalid==0&&same==55440&&swapped==48384,g)
25 var degenerate:i64=0;
26degenerate=degenerate+bw_part(b,0,2296,g)
27degenerate=degenerate+bw_part(b,2296,4592,g)
28degenerate=degenerate+bw_part(b,6888,3248,g)
29degenerate=degenerate+bw_part(b,10136,2352,g)
30degenerate=degenerate+bw_part(b,12488,1456,g)
31degenerate=degenerate+bw_part(b,13944,1456,g)
32degenerate=degenerate+bw_part(b,15400,1456,g)
33degenerate=degenerate+bw_part(b,16856,1456,g)
34degenerate=degenerate+bw_part(b,18312,1456,g)
35degenerate=degenerate+bw_part(b,19768,2072,g)
36degenerate=degenerate+bw_part(b,21840,1456,g)
37degenerate=degenerate+bw_part(b,23296,1456,g)
38degenerate=degenerate+bw_part(b,24752,1456,g)
39degenerate=degenerate+bw_part(b,26208,1456,g)
40degenerate=degenerate+bw_part(b,27664,1456,g)
41degenerate=degenerate+bw_part(b,29120,1904,g)
42degenerate=degenerate+bw_part(b,31024,728,g)
43degenerate=degenerate+bw_part(b,31752,952,g)
44degenerate=degenerate+bw_part(b,32704,952,g)
45degenerate=degenerate+bw_part(b,33656,952,g)
46 gv_check("original 357 skin degenerates retained explicitly",degenerate==357,g)
47 let vals:*i64=sys_mmap_try(4*__size_of(i64)) as *i64;if (vals as i64)<=0{sys_free_file(a,an);sys_free_file(b,bn);return 4};vals[0]=1;vals[1]=2;vals[2]=3;vals[3]=4;gv_check("ascending local frame",bg_ring_direction(vals,0,4)==1,g);vals[0]=4;vals[1]=3;vals[2]=2;vals[3]=1;gv_check("descending local frame",bg_ring_direction(vals,0,4)==-1,g);vals[2]=3;gv_check("plateau refused",bg_ring_direction(vals,0,4)==0,g);vals[2]=5;gv_check("axis reversal refused",bg_ring_direction(vals,0,4)==0,g);gv_check("insufficient rows refused",bg_ring_direction(vals,0,1)==0,g)
48 let released:i64=sys_munmap_direct(vals as *u8,4*__size_of(i64));gv_check("fixture workspace released",released==0,g);sys_free_file(a,an);sys_free_file(b,bn);return gv_verdict("body_winding",g,"same actual full figure; shared-edge and signed-volume independent oracle separate; degenerates and anatomical quality not repaired")
49}