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}