nx_eye_rim_artifact_t207.nx source
↩ module page · 19 lines · 4601 B
1import "nx_fs_create_lib.nx"
2func erp_put(r:*i64,s:*u8)->i64{var n:i64=0;while s[n]!=0{n=n+1};if r[3]!=0||n>r[1]-r[2]{r[3]=1;return -1};let b:*u8=r[0] as *u8;var i:i64=0;while i<n{b[r[2]+i]=s[i];i=i+1};r[2]=r[2]+n;return n}
3func erp_num(r:*i64,x:i64)->i64{let b:*u8=r[4] as *u8;var v:i64=x;var p:i64=30;b[31]=0 as u8;if v<0{erp_put(r,"-");v=0-v};if v==0{b[p]=48 as u8;p=p-1};while v>0{b[p]=(48+v%10) as u8;v=v/10;p=p-1};return erp_put(r,((b as i64)+p+1) as *u8)}
4import "nx_quicksort.nx"
5import "nx_nxa_surface_anchor_t140.nx"
6import "nx_surface_anchor_gate_t140.nx"
7func main(argc:i64,argv:*i64)->i64{
8 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}
9 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
10 // At most three edge records per triangle plus one component record per vertex.
11 // Each record has fewer than ten i64 fields (20 decimal digits each) and 56 punctuation bytes.
12 let cap:i64=(nt*3+nv+10)*256;let report:*i64=sys_mmap_try(72) as *i64;if (report as i64)<=0{return 6};let rb:*u8=sys_mmap_try(cap);if (rb as i64)<=0{return 6};report[0]=rb as i64;report[1]=cap;report[2]=0;report[3]=0;report[4]=(report as i64)+40;
13 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}
14 erp_put(report,"SOURCE bytes=");erp_num(report,n);erp_put(report," vertices=");erp_num(report,nv);erp_put(report," triangles=");erp_num(report,nt);erp_put(report," components=");erp_num(report,nc);erp_put(report,"\n")
15 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};erp_put(report,"COMPONENT root=");erp_num(report,root);erp_put(report," vertices=");erp_num(report,count);erp_put(report," bounds=");k=0;while k<6{erp_num(report,bounds[k]);erp_put(report," ");k=k+1};erp_put(report," rigid_joint=");erp_num(report,nsa_rigid_component_joint_v1(b,n,root,labels,nv));erp_put(report,"\n")};root=root+1}
16
17 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;erp_put(report,"EDGE root=");erp_num(report,eroot);erp_put(report," a=");erp_num(report,a);erp_put(report," b=");erp_num(report,c);erp_put(report," xyz_a=");var k:i64=0;while k<3{erp_num(report,p[a*3+k]);erp_put(report,",");k=k+1};erp_put(report," xyz_b=");k=0;while k<3{erp_num(report,p[c*3+k]);erp_put(report,",");k=k+1};erp_put(report,"\n")};if end-at>2{nonmanifold=nonmanifold+1};at=end};erp_put(report,"BOUNDARY root=");erp_num(report,eroot);erp_put(report," edges=");erp_num(report,boundary);erp_put(report," nonmanifold=");erp_num(report,nonmanifold);erp_put(report,"\n")};eroot=eroot+1}
18let 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);erp_put(report,"QUERY x=");erp_num(report,qx);erp_put(report," z=163055 rc=");erp_num(report,rc);if rc==0{erp_put(report," record=");var k:i64=0;while k<5{erp_num(report,out[k]);erp_put(report," ");k=k+1};erp_put(report," vertices=");k=0;while k<3{let v:i64=idx[out[0]*3+k];erp_num(report,v);erp_put(report,":");erp_num(report,labels[v]);erp_put(report,":");var a:i64=0;while a<3{erp_num(report,p[v*3+a]);erp_put(report,",");a=a+1};erp_put(report," ");k=k+1}};erp_put(report,"\n");side=side+2};if report[3]!=0{return 7};let written:i64=fxc_create("/tmp/eye-rim-source-t207.txt",rb,report[2]);sa_put("RIM-ARTIFACT bytes=");sa_num(report[2]);sa_put(" result=");sa_num(written);sa_put("\n");if written!=report[2]{return 8};return 0
19}