code wiki / (root) / nx_uv_disk_validation_gate_t280.nx

nx_uv_disk_validation_gate_t280.nx source

↩ module page · 34 lines · 2694 B

1import "nx_uv_disk_validation_candidate_t280.nx" 2import "nx_gate_verdict.nx" 3func ucp_fixture(kind:i64)->*i64{ 4 var nv:i64=4;var nt:i64=2;if kind==1{nv=5;nt=4} 5 let m:*i64=ncp_model_new(nv,nt);if m==(0 as *i64){return m} 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) 7 if kind==0{uv_set_tri(m,0,0,1,2);uv_set_tri(m,1,0,2,3);uv_seam_set(m,0,2)} 8 if kind==1{uv_set_vert(m,4,500,500,1000);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)} 9 if uv_chart_build(m)!=UV_OK{ncp_model_free(m);return 0 as *i64};return m 10} 11func uct_octa()->*i64{ 12 let m:*i64=ncp_model_new(6,8) 13 uv_set_vert(m,0,0,0,1000);uv_set_vert(m,1,0,0,0-1000) 14 uv_set_vert(m,2,1000,0,0);uv_set_vert(m,3,0,1000,0);uv_set_vert(m,4,0-1000,0,0);uv_set_vert(m,5,0,0-1000,0) 15 uv_set_tri(m,0,0,2,3);uv_set_tri(m,1,0,3,4);uv_set_tri(m,2,0,4,5);uv_set_tri(m,3,0,5,2) 16 uv_set_tri(m,4,1,3,2);uv_set_tri(m,5,1,4,3);uv_set_tri(m,6,1,5,4);uv_set_tri(m,7,1,2,5);return m 17} 18 19func main(argc:i64,argv:*i64)->i64{ 20 let ctr:*i64=gv_ctr();let flat:*i64=ucp_fixture(0);let good:*i64=uds_prepare(flat) 21 gv_check("seamed two-disk fixture validates",good!=(0 as *i64),ctr);if good!=(0 as *i64){ncp_model_free(good)} 22 flat[flat[UV_O_UVF]+3]=flat[flat[UV_O_UVF]] 23 let bad:*i64=uds_prepare(flat);gv_check("merged disconnected vertex fans refused",bad==(0 as *i64),ctr);if bad!=(0 as *i64){ncp_model_free(bad)};ncp_model_free(flat) 24 let closed:*i64=uct_octa();uv_chart_build(closed);let closedResult:*i64=uds_prepare(closed) 25 gv_check("closed non-disk fixture refused",closedResult==(0 as *i64),ctr);if closedResult!=(0 as *i64){ncp_model_free(closedResult)};ncp_model_free(closed) 26 if argc==3{ 27 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} 28 let m:*i64=ncp_model_nxa(src,lens[0]);if m==(0 as *i64){return 4};let seam:*u8=sys_read_file(argv[2] as *u8,lens);if seam==(0 as *u8){return 5};if lens[0]%8!=0{return 5};if ncp_seams(m,seam as *i64,lens[0]/8)!=UV_OK{return 6};if uv_chart_build(m)!=UV_OK{return 7} 29 let q:*i64=uds_prepare(m);gv_check("actual cut fan topology qualifies disk checks",q!=(0 as *i64),ctr) 30 if q!=(0 as *i64){gv_check_eq("actual source triangle count preserved",q[UV_H_NT],m[UV_H_NT],ctr);gv_check_eq("actual connected chart count preserved",uv_chart_count(q),uv_chart_count(m),ctr);gv_check_eq("actual cut vertex fan identity preserved",q[UV_H_NUV],m[UV_H_NUV],ctr);ncp_model_free(q)} 31 ncp_model_free(m);sys_munmap_direct(lens as *u8,16) 32 } 33 return gv_verdict("UV-DISK-T280",ctr,"Cut topological identity and disk prerequisites; numerical UV acceptance is separate") 34}