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}