code wiki / (root) / nx_uv_dual_partition_gate_t280.nx

nx_uv_dual_partition_gate_t280.nx source

↩ module page · 36 lines · 3694 B

1import "nx_uv_dual_partition_candidate_t280.nx" 2import "nx_uv_disk_validation_candidate_t280.nx" 3import "nx_gate_verdict.nx" 4func ud_fixture()->*i64{ 5 let m:*i64=ncp_model_new(5,4) 6 uv_set_vert(m,0,0,0,0);uv_set_vert(m,1,1000,0,0);uv_set_vert(m,2,1000,1000,0);uv_set_vert(m,3,0,1000,0);uv_set_vert(m,4,500,500,1000) 7 uv_set_tri(m,0,0,1,4);uv_set_tri(m,1,1,2,4);uv_set_tri(m,2,2,3,4);uv_set_tri(m,3,3,0,4);return m 8} 9func main(argc:i64,argv:*i64)->i64{ 10 let ctr:*i64=gv_ctr();let r:*i64=sys_mmap_try(48) as *i64 11 let a:*i64=ud_fixture();var b:*i64=ud_fixture();uv_chart_build(a) 12 let cut:*i64=uvd_partition(a,0,b,r);gv_check("curved fixture returns cut",cut!=(0 as *i64),ctr) 13 if cut!=(0 as *i64){gv_check_eq("first seed touches chart boundary",uvd_boundary(a,r[1],0),1,ctr);gv_check_eq("second seed touches chart boundary",uvd_boundary(a,r[2],0),1,ctr);gv_check_eq("fixture face partition preserves all faces",r[3]+r[4],4,ctr);gv_check_eq("fixture chart rebuild",uv_chart_build(b),UV_OK,ctr);gv_check_eq("fixture has two charts",uv_chart_count(b),2,ctr);let q:*i64=uds_prepare(b);gv_check("fixture split retains disk fans",q!=(0 as *i64),ctr);if q!=(0 as *i64){ncp_model_free(q)};sys_munmap_direct(cut as *u8,r[0]*8)} 14 ncp_model_free(b);b=ud_fixture();uv_set_vert(b,4,500,500,1001) 15 gv_check("different source geometry refused",uvd_partition(a,0,b,r)==(0 as *i64),ctr) 16 gv_check("null receipt refused",uvd_partition(a,0,b,0 as *i64)==(0 as *i64),ctr);ncp_model_free(a);ncp_model_free(b) 17 if argc==4{ 18 let lens:*i64=sys_mmap_try(16) as *i64;let src:*u8=sys_read_file(argv[1] as *u8,lens);if src==(0 as *u8){return 3};let bytes:i64=lens[0] 19 let m:*i64=ncp_model_nxa(src,bytes);let target:*i64=ncp_model_nxa(src,bytes);if m==(0 as *i64){return 4};if target==(0 as *i64){return 4} 20 let seams:*u8=sys_read_file(argv[2] as *u8,lens);if seams==(0 as *u8){return 5};let seamBytes:i64=lens[0];if seamBytes%8!=0{return 5} 21 if ncp_seams(m,seams as *i64,seamBytes/8)!=UV_OK{return 6};if ncp_seams(target,seams as *i64,seamBytes/8)!=UV_OK{return 6};if uv_chart_build(m)!=UV_OK{return 7} 22 let out:*i64=uvd_partition(m,0,target,r);gv_check("actual failed chart split returns cut",out!=(0 as *i64),ctr) 23 if out!=(0 as *i64){ 24 gv_check_eq("actual faces retained across partition",r[3]+r[4],m[m[UV_O_CSTART]+1]-m[m[UV_O_CSTART]],ctr) 25 gv_check_eq("actual split rebuild",uv_chart_build(target),UV_OK,ctr) 26 gv_check_eq("actual split adds only one chart",uv_chart_count(target),uv_chart_count(m)+1,ctr) 27 let q:*i64=uds_prepare(target);gv_check("actual all charts still disk fans",q!=(0 as *i64),ctr);if q!=(0 as *i64){ncp_model_free(q)} 28 gv_puts("DUAL facesA=");gv_num(r[3]);gv_puts(" facesB=");gv_num(r[4]);gv_puts(" addedEdges=");gv_num(out[0]);gv_puts(" seedA=");gv_num(r[1]);gv_puts(" seedB=");gv_num(r[2]);gv_puts(" distanceQ12=");gv_num(r[5]);gv_puts("\n") 29 let prior:*i64=seams as *i64;let total:i64=prior[0]+out[0];let size:i64=(1+total*2)*8;let combined:*i64=sys_mmap_try(size) as *i64;combined[0]=total;var i:i64=0 30 while i<prior[0]*2{combined[1+i]=prior[1+i];i=i+1};i=0;while i<out[0]*2{combined[1+prior[0]*2+i]=out[1+i];i=i+1} 31 let fd:i64=sys_openat_exclusive(argv[3] as *u8,MODE_0600);if fd<0{return 8};var written:i64=0;while written<size{let n:i64=sys_write(fd,((combined as i64)+written) as *u8,size-written);if n<=0{return 9};written=written+n};sys_close(fd) 32 sys_munmap_direct(combined as *u8,size);sys_munmap_direct(out as *u8,r[0]*8) 33 };ncp_model_free(m);ncp_model_free(target);sys_munmap_direct(lens as *u8,16) 34 };sys_munmap_direct(r as *u8,48) 35 return gv_verdict("UV-DUAL-T280",ctr,"Topology and source preservation only; UV distortion acceptance remains separate") 36}