code wiki / (root) / nx_body_winding_gate_t365.nx

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}