nx_uv_disk_validation_candidate_t280.nx source
↩ module page · 22 lines · 1813 B
1import "nx_uv_chart_topology_candidate_t280.nx"
2// Materialize the cut corner classes as a temporary topological mesh, then
3// independently rerun the existing edge/fan union and chart owner. Geometry
4// coordinates are copied unchanged from each class's original source vertex.
5func uds_prepare(m:*i64)->*i64{
6 if m==(0 as *i64){return 0 as *i64};if uv_stage(m)<UV_ST_CHARTS{return 0 as *i64}
7 let nu:i64=m[UV_H_NUV];let nt:i64=m[UV_H_NT]
8 let q:*i64=ncp_model_new(nu,nt);if q==(0 as *i64){return q}
9 var v:i64=0;while v<nu{let original:i64=m[m[UV_O_UVSRC]+v];if original<0{ncp_model_free(q);return 0 as *i64};if original>=m[UV_H_NV]{ncp_model_free(q);return 0 as *i64};uv_set_vert(q,v,uv_vx(m,original),uv_vy(m,original),uv_vz(m,original));v=v+1}
10 var t:i64=0;while t<nt{var k:i64=0;while k<3{let a:i64=uv_corner_class(m,t,k);if a<0{ncp_model_free(q);return 0 as *i64};if a>=nu{ncp_model_free(q);return 0 as *i64};k=k+1};uv_set_tri(q,t,uv_corner_class(m,t,0),uv_corner_class(m,t,1),uv_corner_class(m,t,2));t=t+1}
11 if uv_chart_build(q)!=UV_OK{ncp_model_free(q);return 0 as *i64}
12 if uv_chart_count(q)!=uv_chart_count(m){ncp_model_free(q);return 0 as *i64}
13 if q[UV_H_NUV]!=nu{ncp_model_free(q);return 0 as *i64}
14 t=0;while t<nt{
15 if uv_chart_of_tri(q,t)!=uv_chart_of_tri(m,t){ncp_model_free(q);return 0 as *i64}
16 var k:i64=0;while k<3{if uv_corner_class(q,t,k)!=uv_corner_class(m,t,k){ncp_model_free(q);return 0 as *i64};k=k+1};t=t+1
17 }
18 let topo:*i64=uct_measure(q);if topo==(0 as *i64){ncp_model_free(q);return 0 as *i64}
19 var c:i64=0;var valid:i64=1;while c<uv_chart_count(q){if topo[c*UCT_ROW+6]!=1{valid=0};if topo[c*UCT_ROW+4]!=1{valid=0};if topo[c*UCT_ROW+5]!=0{valid=0};c=c+1}
20 sys_munmap_direct(topo as *u8,uv_chart_count(q)*UCT_ROW*UV_I64)
21 if valid==0{ncp_model_free(q);return 0 as *i64};return q
22}