code wiki / (root) / nx_uv_closed_cut_gate_t280.nx

nx_uv_closed_cut_gate_t280.nx source

↩ module page · 75 lines · 5584 B

1// nx_uv_closed_cut_gate_t280.nx -- Validates and modifies 3D models to ensure closed, consistent geometric properties and budget constraints. 2import "nx_uv_closed_cut_candidate_t280.nx" 3import "nx_uv_cached_solver_candidate_t280.nx" 4import "nx_gate_verdict.nx" 5func uct_octa()->*i64{ 6 let m:*i64=ncp_model_new(6,8) 7 uv_set_vert(m,0,0,0,1000);uv_set_vert(m,1,0,0,0-1000) 8 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) 9 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) 10 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 11} 12func uct_write(path:*u8,data:*u8,n:i64)->i64{ 13 let fd:i64=sys_openat_exclusive(path,MODE_0600);if fd<0{return 0-1} 14 var off:i64=0;while off<n{let k:i64=sys_write(fd,((data as i64)+off) as *u8,n-off);if k<=0{sys_close(fd);return 0-2};off=off+k};return sys_close(fd) 15} 16func uct_budget(s:*u8)->i64{ 17 var v:i64=0;var i:i64=0 18 while s[i]!=(0 as u8){let c:i64=(s[i] as i64)-48;if c<0{return 0-1};if c>9{return 0-1};if v>(NCP_MAX-c)/10{return 0-1};v=v*10+c;i=i+1};if v<1{return 0-1};return v 19} 20func main(argc:i64,argv:*i64)->i64{ 21 let ctr:*i64=gv_ctr();let len:*i64=sys_mmap_try(16) as *i64 22 let original:*i64=uct_octa();let cut:*i64=uct_octa() 23 gv_check_eq("closed fixture chart builds",uv_chart_build(original),UV_OK,ctr) 24 let edges:*i64=uct_closed_path(original,0,cut,len);gv_check("closed fixture yields source edge path",edges!=(0 as *i64),ctr);if edges==(0 as *i64){return 3} 25 gv_check_eq("fixture two-edge path",edges[0],2,ctr) 26 gv_check_eq("cut fixture chart builds",uv_chart_build(cut),UV_OK,ctr) 27 let tt:*i64=uct_measure(cut);if tt==(0 as *i64){return 3} 28 gv_check_eq("cut retains all eight triangles",cut[UV_H_NT],8,ctr) 29 gv_check_eq("cut remains one chart",uv_chart_count(cut),1,ctr) 30 gv_check_eq("cut Euler characteristic is one",tt[6],1,ctr) 31 gv_check_eq("cut has one boundary component",tt[4],1,ctr) 32 gv_check_eq("cut boundary vertex degrees regular",tt[5],0,ctr) 33 sys_munmap_direct(tt as *u8,uv_chart_count(cut)*UCT_ROW*UV_I64);sys_munmap_direct(edges as *u8,len[0]*UV_I64) 34 let mismatch:*i64=uct_octa();uv_set_vert(mismatch,0,1,0,1000) 35 let refused:*i64=uct_closed_path(original,0,mismatch,len);gv_check("changed geometry refuses before seam mutation",refused==(0 as *i64),ctr);gv_check_eq("refused target remains no seams",uv_seam_count(mismatch),0,ctr) 36 ncp_model_free(original);ncp_model_free(cut);ncp_model_free(mismatch) 37 if argc==5{ 38 let budget:i64=uct_budget(argv[4] as *u8);if budget<1{return 4} 39 let src:*u8=sys_read_file(argv[1] as *u8,len);if src==(0 as *u8){return 5};let n:i64=len[0] 40 let m:*i64=ncp_model_nxa(src,n);let target:*i64=ncp_model_nxa(src,n) 41 if m==(0 as *i64){return 6};if target==(0 as *i64){return 6};if uv_chart_build(m)!=UV_OK{return 6} 42 let top:*i64=uct_measure(m);if top==(0 as *i64){return 6};var c:i64=0;var closed:i64=0 43 while c<uv_chart_count(m){ 44 if top[c*UCT_ROW+6]==2{if top[c*UCT_ROW+3]==0{ 45 gv_puts("UVCUT closed chart=");gv_num(c);gv_puts("\n") 46 let seams:*i64=uct_closed_path(m,c,target,len);if seams==(0 as *i64){return 7} 47 gv_puts("UVCUT path edges=");gv_num(seams[0]);gv_puts("\n") 48 // This actual fixture has one closed chart. Refuse output-path reuse if that changes. 49 if closed>0{return 8};if uct_write(argv[3] as *u8,seams as *u8,len[0]*UV_I64)!=0{return 9} 50 sys_munmap_direct(seams as *u8,len[0]*UV_I64);closed=closed+1 51 }};c=c+1 52 } 53 sys_munmap_direct(top as *u8,uv_chart_count(m)*UCT_ROW*UV_I64) 54 let rc:i64=uv_chart_build(target);if rc!=UV_OK{return 10} 55 let topo:*i64=uct_measure(target);if topo==(0 as *i64){return 10} 56 gv_check_eq("actual all original triangles retained",target[UV_H_NT],m[UV_H_NT],ctr) 57 gv_check_eq("actual component count preserved",uv_chart_count(target),uv_chart_count(m),ctr) 58 var all:i64=UV_OK;c=0 59 while c<uv_chart_count(target){ 60 gv_puts("UVCUT chart=");gv_num(c);gv_puts(" faces=");gv_num(topo[c*UCT_ROW+2]);gv_puts(" chi=");gv_num(topo[c*UCT_ROW+6]);gv_puts(" boundaryComponents=");gv_num(topo[c*UCT_ROW+4]);gv_puts(" badBoundary=");gv_num(topo[c*UCT_ROW+5]);gv_puts("\n") 61 if topo[c*UCT_ROW+6]!=1{all=UV_E_TOPOLOGY};if topo[c*UCT_ROW+4]!=1{all=UV_E_TOPOLOGY};if topo[c*UCT_ROW+5]!=0{all=UV_E_TOPOLOGY} 62 let st:*UvCachedSolve=uvc_begin(target,c);if st==(0 as *UvCachedSolve){return 11} 63 var result:i64=st.result;if result==UV_E_NOTRUN{result=uvc_step(st,budget)} 64 gv_puts("UVCUT solve chart=");gv_num(c);gv_puts(" iterations=");gv_num(st.used);gv_puts(" maxStep=");gv_num(st.maxmove);gv_puts(" solveUs=");gv_num(st.solveUs);gv_puts(" result=");gv_num(result);gv_puts("\n") 65 if result!=UV_OK{all=result};uvc_free(st);c=c+1 66 } 67 if all==UV_OK{all=uvi_atlas(target);if all==UV_OK{target[UV_H_STAGE]=UV_ST_SOLVED;target[UV_H_ERR]=UV_OK;all=uv_distortion(target)};if all==UV_OK{all=uv_overlap_check(target)}} 68 gv_puts("UVCUT final stage=");gv_num(uv_stage(target));gv_puts(" result=");gv_num(all);gv_puts(" flipped=");gv_num(uv_flipped(target));gv_puts(" uvDegenerate=");gv_num(uv_uvdegen(target));gv_puts("\n") 69 let packet:*u8=ncp_emit(target,src,n,all,len);if packet==(0 as *u8){return 12} 70 if uct_write(argv[2] as *u8,packet,len[0])!=0{return 13} 71 sys_munmap_direct(packet,len[0]);sys_munmap_direct(topo as *u8,uv_chart_count(target)*UCT_ROW*UV_I64);ncp_model_free(m);ncp_model_free(target) 72 } 73 sys_munmap_direct(len as *u8,16) 74 return gv_verdict("UV-CLOSED-CUT-T280",ctr,"Source geometry and topology controls; UV usability reported separately by final stage/result") 75}