nx_uv_chart_topology_candidate_t280.nx source
↩ module page · 46 lines · 2089 B
1import "nx_nxa_corner_prepare_candidate_t280.nx"
2// Topological measurements from the existing chart adjacency. Euler consistency
3// is not a proof of a disk: vertex-link manifold validation remains separate.
4const UCT_ROW:i64=8
5func uct_measure(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 nc:i64=uv_chart_count(m);let nv:i64=m[UV_H_NUV]
8 let rows:*i64=sys_mmap_try(nc*UCT_ROW*UV_I64) as *i64
9 let work:*i64=sys_mmap_try(nv*2*UV_I64) as *i64
10 if (rows as i64)<=0{if (work as i64)>0{sys_munmap_direct(work as *u8,nv*2*UV_I64)};return 0 as *i64}
11 if (work as i64)<=0{sys_munmap_direct(rows as *u8,nc*UCT_ROW*UV_I64);return 0 as *i64}
12 var i:i64=0
13 while i<nv{work[i]=i;let ch:i64=m[m[UV_O_UVCH]+i];rows[ch*UCT_ROW]=rows[ch*UCT_ROW]+1;i=i+1}
14 var t:i64=0
15 while t<m[UV_H_NT]{
16 let ch:i64=uv_chart_of_tri(m,t);let r:i64=ch*UCT_ROW;rows[r+2]=rows[r+2]+1
17 var k:i64=0;while k<3{
18 let a:i64=uv_ti(m,t,k);let b:i64=uv_ti(m,t,(k+1)%3)
19 let edge:i64=uvi_edge_find(m,a,b)
20 if edge<0{sys_munmap_direct(work as *u8,nv*2*UV_I64);sys_munmap_direct(rows as *u8,nc*UCT_ROW*UV_I64);return 0 as *i64}
21 let eo:i64=m[UV_O_ETAB]+edge*UV_EREC
22 var nb:i64=m[eo+UV_ED_T0]-1;if nb==t{nb=m[eo+UV_ED_T1]-1}
23 var inside:i64=0;if nb>=0{if uv_chart_of_tri(m,nb)==ch{if uv_is_seam(m,a,b)==0{inside=1}}}
24 if inside==1{if t<nb{rows[r+1]=rows[r+1]+1}}else{
25 rows[r+1]=rows[r+1]+1;rows[r+3]=rows[r+3]+1
26 let ca:i64=uv_corner_class(m,t,k);let cb:i64=uv_corner_class(m,t,(k+1)%3)
27 work[nv+ca]=work[nv+ca]+1;work[nv+cb]=work[nv+cb]+1;uvi_union(work,0,ca,cb)
28 }
29 k=k+1
30 };t=t+1
31 }
32 i=0;while i<nv{
33 if work[nv+i]>0{
34 let ch:i64=m[m[UV_O_UVCH]+i];let r:i64=ch*UCT_ROW
35 if work[nv+i]!=2{rows[r+5]=rows[r+5]+1}
36 if uvi_find(work,0,i)==i{rows[r+4]=rows[r+4]+1}
37 };i=i+1
38 }
39 i=0;while i<nc{
40 let r:i64=i*UCT_ROW;rows[r+6]=rows[r]-rows[r+1]+rows[r+2];rows[r+7]=0-1
41 let twice:i64=2-rows[r+4]-rows[r+6]
42 if rows[r+5]==0{if twice>=0{if twice%2==0{rows[r+7]=twice/2}}}
43 i=i+1
44 }
45 sys_munmap_direct(work as *u8,nv*2*UV_I64);return rows
46}