code wiki / (root) / nx_obj_cohort_qualification_t282.nx

nx_obj_cohort_qualification_t282.nx source

↩ module page · 61 lines · 4883 B

1// Qualification composition over existing native OBJ import, topology and normal owners. 2// The caller supplies a retained source identity. This is not a new OBJ parser or production importer. 3import "nx_obj_import.nx" 4import "nx_meshcheck.nx" 5import "nx_vnormals_lib.nx" 6import "nx_sha256.nx" 7import "nx_fs_create_lib.nx" 8func bq_hash(p:*u8,n:i64)->i64{ 9 let d:*u8=sys_mmap_try(32);if (d as i64)==0{return -1} 10 sha256_digest(p,n,d);let h:*u8="0123456789abcdef";var i:i64=0 11 while i<32{let b:i64=d[i] as i64;sys_write(1,(h as i64+b/16) as *u8,1);sys_write(1,(h as i64+b%16) as *u8,1);i=i+1};sys_munmap_direct(d,32);return 0 12} 13func bq_match(p:*u8,n:i64,want:*u8)->i64{ 14 let d:*u8=sys_mmap_try(32);if (d as i64)==0{return 0};sha256_digest(p,n,d) 15 let h:*u8="0123456789abcdef";var i:i64=0;var ok:i64=1 16 while i<32{let b:i64=d[i] as i64;if want[i*2]!=h[b/16]||want[i*2+1]!=h[b%16]{ok=0};i=i+1} 17 if want[64]!=0{ok=0};sys_munmap_direct(d,32);return ok 18} 19func main(argc:i64,argv:*i64)->i64{ 20 if argc!=3{fsx_puts("usage: retained.obj expected_sha256\n");return 2} 21 var sn:i64=0;let source:*u8=sys_map_file(argv[1] as *u8,&sn) 22 if (source as i64)==0{return 3};if bq_match(source,sn,argv[2] as *u8)!=1{return 4} 23 var nv:i64=0;var nf:i64=0;var vn:i64=0;var vt:i64=0;var mt:i64=0;var i:i64=0 24 while i+1<sn{ 25 var lineStart:i64=0;if i==0{lineStart=1}else{if source[i-1]==10{lineStart=1}} 26 if lineStart==1{ 27 if source[i]==118{if source[i+1]==32||source[i+1]==9{nv=nv+1};if source[i+1]==110{vn=vn+1};if source[i+1]==116{vt=vt+1}} 28 if source[i]==102&&(source[i+1]==32||source[i+1]==9){nf=nf+1} 29 if i+6<sn{if source[i]==109&&source[i+1]==116&&source[i+2]==108&&source[i+3]==108&&source[i+4]==105&&source[i+5]==98{mt=mt+1}} 30 };i=i+1 31 } 32 // This fixture contains triangular f records. More output triangles than records is refused by oi_read's capacity contract. 33 if nv<=0||nf<=0{return 5} 34 let vb:i64=nv*3*__size_of(i64);let fb:i64=nf*3*__size_of(i64) 35 let v:*i64=sys_mmap_try(vb) as *i64;let f:*i64=sys_mmap_try(fb) as *i64;let n:*i64=sys_mmap_try(vb) as *i64 36 let out:*i64=sys_mmap_try(MC_O_SLOTS*__size_of(i64)) as *i64 37 let list:*i64=sys_mmap_try(mc_list_slots()*__size_of(i64)) as *i64 38 if (v as i64)==0||(f as i64)==0||(n as i64)==0||(out as i64)==0||(list as i64)==0{return 6} 39 var counts0:i64=0;let counts:*i64=sys_mmap_try(2*__size_of(i64)) as *i64;if (counts as i64)==0{return 6} 40 let imported:i64=oi_read(argv[1] as *u8,v,f,nv,nf,counts) 41 if imported!=0{fsx_puts("IMPORT refused=");fsx_putn(imported);fsx_puts("\n");return 7} 42 if counts[0]!=nv||counts[1]!=nf{return 8} 43 let verdict:i64=mc_check(v,nv,f,nf,out,list) 44 if verdict==MC_INVALID||verdict==MC_UNMEASURABLE{return 9} 45 let nr:i64=vn_smooth_area(v,f,nv,nf,n) 46 var zero:i64=0;var up:i64=0;var minlen:i64=9223372036854775807;var maxlen:i64=0 47 i=0;while i<nv{ 48 let x:i64=n[i*3];let y:i64=n[i*3+1];let z:i64=n[i*3+2];let len:i64=x*x+y*y+z*z 49 if len==0{zero=zero+1};if x==0&&y==VN_SCALE&&z==0{up=up+1};if len<minlen{minlen=len};if len>maxlen{maxlen=len};i=i+1 50 } 51 fsx_puts("{\"schema\":\"nishi.asset.native-qualification.v1\",\"sourceSha256\":\"");bq_hash(source,sn);fsx_puts("\",\"sourceBytes\":");fsx_putn(sn) 52 fsx_puts(",\"sourceRecords\":{\"vertices\":");fsx_putn(nv);fsx_puts(",\"faces\":");fsx_putn(nf);fsx_puts(",\"normals\":");fsx_putn(vn);fsx_puts(",\"uvs\":");fsx_putn(vt);fsx_puts(",\"materialLibraries\":");fsx_putn(mt) 53 fsx_puts("},\"import\":{\"owner\":\"nx_obj_import:oi_read\",\"coordinateScale\":");fsx_putn(OI_FX);fsx_puts(",\"vertices\":");fsx_putn(counts[0]);fsx_puts(",\"triangles\":");fsx_putn(counts[1]) 54 fsx_puts(",\"vertexBufferSha256\":\"");bq_hash(v as *u8,vb);fsx_puts("\",\"triangleBufferSha256\":\"");bq_hash(f as *u8,fb);fsx_puts("\"},\"topology\":{\"owner\":\"nx_meshcheck:mc_check\",\"verdict\":");fsx_putn(verdict);fsx_puts(",\"slots\":[") 55 i=0;while i<MC_O_SLOTS{if i>0{fsx_puts(",")};fsx_putn(out[i]);i=i+1} 56 fsx_puts("],\"watertight\":");fsx_putn(mc_watertight(out));fsx_puts(",\"worklistPrefix\":");fsx_putn(out[MC_O_LIST_PREFIX]) 57 fsx_puts("},\"generatedNormals\":{\"owner\":\"nx_vnormals_lib:vn_smooth_area\",\"returnCode\":");fsx_putn(nr);fsx_puts(",\"scale\":");fsx_putn(VN_SCALE);fsx_puts(",\"zeroVectors\":");fsx_putn(zero);fsx_puts(",\"positiveYVectorsIncludingPossibleFallback\":");fsx_putn(up);fsx_puts(",\"minLengthSquared\":");fsx_putn(minlen);fsx_puts(",\"maxLengthSquared\":");fsx_putn(maxlen) 58 fsx_puts(",\"bufferSha256\":\"");bq_hash(n as *u8,vb);fsx_puts("\"},\"occlusion\":{\"state\":\"unmeasured\",\"reason\":\"no-actual-renderer-or-visibility-oracle-exercised\"}}\n") 59 sys_munmap_direct(source,sn);sys_munmap_direct(v as *u8,vb);sys_munmap_direct(f as *u8,fb);sys_munmap_direct(n as *u8,vb);sys_munmap_direct(out as *u8,MC_O_SLOTS*__size_of(i64));sys_munmap_direct(list as *u8,mc_list_slots()*__size_of(i64));sys_munmap_direct(counts as *u8,2*__size_of(i64)) 60 return 0 61}