nx_eye_rim_probe_t207.nx source
↩ module page · 13 lines · 3045 B
1import "nx_quicksort.nx"
2import "nx_nxa_surface_anchor_t140.nx"
3import "nx_surface_anchor_gate_t140.nx"
4func main(argc:i64,argv:*i64)->i64{
5 if argc!=2{return 2};let len:*i64=sys_mmap(16) as *i64;let b:*u8=sys_map_file(argv[1] as *u8,len);if (b as i64)==0{return 3};let n:i64=len[0];let valid:i64=ngb_attach_source_v1(b,n);if valid<0{return 4}
6 let h:*i64=b as *i64;let va:i64=nxa_counted_section(b,n,nxa_tag4("VERT"),3);let ta:i64=nxa_counted_section(b,n,nxa_tag4("TRIS"),3);let nv:i64=h[va];let nt:i64=h[ta];let p:*i64=((b as i64)+(va+1)*8) as *i64;let idx:*i64=((b as i64)+(ta+1)*8) as *i64
7 let labels:*i64=sys_mmap(nv*8) as *i64;let nc:i64=nsa_component_labels_v1(b,n,labels,nv);if nc<0{return 5}
8 sa_put("SOURCE bytes=");sa_num(n);sa_put(" vertices=");sa_num(nv);sa_put(" triangles=");sa_num(nt);sa_put(" components=");sa_num(nc);sa_put("\n")
9 let bounds:*i64=sys_mmap(48) as *i64;var root:i64=0;while root<nv{if labels[root]==root{var k:i64=0;while k<3{bounds[k]=NGB_ATTACH_COORD_MAX;bounds[k+3]=0-NGB_ATTACH_COORD_MAX;k=k+1};var count:i64=0;var v:i64=0;while v<nv{if labels[v]==root{count=count+1;k=0;while k<3{let value:i64=p[v*3+k];if value<bounds[k]{bounds[k]=value};if value>bounds[k+3]{bounds[k+3]=value};k=k+1}};v=v+1};sa_put("COMPONENT root=");sa_num(root);sa_put(" vertices=");sa_num(count);sa_put(" bounds=");k=0;while k<6{sa_num(bounds[k]);sa_put(" ");k=k+1};sa_put(" rigid_joint=");sa_num(nsa_rigid_component_joint_v1(b,n,root,labels,nv));sa_put("\n")};root=root+1}
10
11 let edges:*i64=sys_mmap(nt*24) as *i64;var eroot:i64=1;while eroot<nv{if labels[eroot]==eroot{var count:i64=0;var t:i64=0;while t<nt{if labels[idx[t*3]]==eroot{var k:i64=0;while k<3{let a:i64=idx[t*3+k];let c:i64=idx[t*3+(k+1)%3];if a<c{edges[count]=a*nv+c}else{edges[count]=c*nv+a};count=count+1;k=k+1}};t=t+1};nx_quicksort(edges as *nx_int,count);var at:i64=0;var boundary:i64=0;var nonmanifold:i64=0;while at<count{var end:i64=at+1;while end<count&&edges[end]==edges[at]{end=end+1};if end-at==1{boundary=boundary+1;let a:i64=edges[at]/nv;let c:i64=edges[at]%nv;sa_put("EDGE root=");sa_num(eroot);sa_put(" a=");sa_num(a);sa_put(" b=");sa_num(c);sa_put(" xyz_a=");var k:i64=0;while k<3{sa_num(p[a*3+k]);sa_put(",");k=k+1};sa_put(" xyz_b=");k=0;while k<3{sa_num(p[c*3+k]);sa_put(",");k=k+1};sa_put("\n")};if end-at>2{nonmanifold=nonmanifold+1};at=end};sa_put("BOUNDARY root=");sa_num(eroot);sa_put(" edges=");sa_num(boundary);sa_put(" nonmanifold=");sa_num(nonmanifold);sa_put("\n")};eroot=eroot+1}
12let out:*i64=sys_mmap(40) as *i64;let work:*i64=sys_mmap(96) as *i64;var side:i64=-1;while side<=1{let qx:i64=side*3156;let rc:i64=nsa_landmark_y_v1(b,n,qx,163055,-1,out,5,work,12);sa_put("QUERY x=");sa_num(qx);sa_put(" z=163055 rc=");sa_num(rc);if rc==0{sa_put(" record=");var k:i64=0;while k<5{sa_num(out[k]);sa_put(" ");k=k+1};sa_put(" vertices=");k=0;while k<3{let v:i64=idx[out[0]*3+k];sa_num(v);sa_put(":");sa_num(labels[v]);sa_put(":");var a:i64=0;while a<3{sa_num(p[v*3+a]);sa_put(",");a=a+1};sa_put(" ");k=k+1}};sa_put("\n");side=side+2};return 0
13}