nx_uv_quality_packet_candidate_t282.nx source
↩ module page · 43 lines · 3613 B
1import "nx_uv_quality_candidate_t282.nx"
2func uvq_at(out:*UvQuality,stage:i64)->*UvQuality{return ((out as i64)+stage*__size_of(UvQuality)) as *UvQuality}
3// NCQ1 is the existing source-indexed diagnostic packet, not a new atlas.
4// All rows must bind to exact original source geometry; duplicate triangles
5// cannot masquerade as additional coverage.
6func uvq_packet(src:*u8,sourceBytes:i64,packet:*u8,bytes:i64,out:*UvQuality)->i64{
7 if out==(0 as *UvQuality){return UVQ_INVALID};var stage:i64=0;while stage<3{let current:*UvQuality=uvq_at(out,stage);uvq_reset(current,stage);current.unknown=1;stage=stage+1}
8 if packet==(0 as *u8){return UVQ_INVALID};if bytes<32*8{return UVQ_INVALID};if bytes%8!=0{return UVQ_INVALID}
9 let p:*i64=packet as *i64;if p[0]!=0x3151434e{return UVQ_INVALID};if p[1]!=1{return UVQ_INVALID};if p[2]!=32{return UVQ_INVALID};if p[3]!=10{return UVQ_INVALID};if p[4]!=9{return UVQ_INVALID}
10 let nv:i64=p[5];let nt:i64=p[6];let words:i64=bytes/8
11 if nv<3{return UVQ_INVALID};if nt<1{return UVQ_INVALID};if nv>(words-32)/10{return UVQ_INVALID};let start:i64=32+nv*10
12 if nt>(words-start)/9{return UVQ_INVALID};if start+nt*9!=words{return UVQ_INVALID};if p[9]!=words{return UVQ_INVALID};if p[26]!=bytes{return UVQ_INVALID}
13 if p[8]!=sourceBytes{return UVQ_INVALID}
14 let m:*i64=ncp_model_nxa(src,sourceBytes);if m==(0 as *i64){return UVQ_INVALID};var valid:i64=1
15 if p[18]!=m[UV_H_NV]{valid=0};if p[19]!=m[UV_H_NT]{valid=0};if nt>m[UV_H_NT]{valid=0}
16 let hash:*u8=sys_mmap_try(32);let scratch:*f64=sys_mmap_try(15*8) as *f64;let seen:*u8=sys_mmap_try(m[UV_H_NT])
17 if (hash as i64)<=0{valid=0};if (scratch as i64)<=0{valid=0};if (seen as i64)<=0{valid=0}
18 if valid==1{if sha256_digest_checked_native(src,sourceBytes,hash)!=0{valid=0}else{var h:i64=0;while h<32{if hash[h]!=packet[28*8+h]{valid=0;break};h=h+1}}}
19 var i:i64=0
20 if valid==1{while i<nv{let o:i64=32+i*10;let v:i64=p[o];if v<0{valid=0;break};if v>=m[UV_H_NV]{valid=0;break}
21 if p[o+1]!=uv_vx(m,v){valid=0;break};if p[o+2]!=uv_vy(m,v){valid=0;break};if p[o+3]!=uv_vz(m,v){valid=0;break}
22 var k:i64=1;while k<10{if k!=4{if k!=5{if p[o+k]>9007199254740992{valid=0;break};if p[o+k]<(0-9007199254740992){valid=0;break}}};k=k+1};if valid==0{break};i=i+1
23 }}
24 if valid==1{
25 i=0;while i<nt{let o:i64=start+i*9;let t:i64=p[o]
26 if t<0{valid=0;break};if t>=m[UV_H_NT]{valid=0;break};if seen[t]!=(0 as u8){valid=0;break};seen[t]=1 as u8
27 var k:i64=0;while k<3{if p[o+k*3]!=t{valid=0;break};if p[o+k*3+1]!=k{valid=0;break};let v:i64=p[o+k*3+2]
28 if v<0{valid=0;break};if v>=nv{valid=0;break};if p[32+v*10]!=uv_ti(m,t,k){valid=0;break};k=k+1
29 };if valid==0{break};i=i+1
30 }
31 }
32 if valid==1{
33 stage=0;while stage<3{uvq_reset(uvq_at(out,stage),stage);stage=stage+1}
34 let uv:*f64=((scratch as i64)+9*8) as *f64;let pf:*f64=packet as *f64
35 i=0;while i<nt{let o:i64=start+i*9;var k:i64=0;while k<3{let v:i64=p[o+k*3+2];let row:i64=32+v*10;scratch[k*3]=__f64_from_i64(p[row+1]);scratch[k*3+1]=__f64_from_i64(p[row+2]);scratch[k*3+2]=__f64_from_i64(p[row+3]);k=k+1}
36 stage=0;while stage<3{k=0;while k<3{let row:i64=32+p[o+k*3+2]*10;if stage==0{uv[k*2]=pf[row+4];uv[k*2+1]=pf[row+5]}else{uv[k*2]=__f64_from_i64(p[row+4+stage*2]);uv[k*2+1]=__f64_from_i64(p[row+5+stage*2])};k=k+1}
37 var mode:i64=0;if stage>0{mode=1};uvq_triangle(uvq_at(out,stage),scratch,uv,mode,p[o]);stage=stage+1
38 };i=i+1
39 }
40 }
41 if (hash as i64)>0{sys_munmap_direct(hash,32)};if (scratch as i64)>0{sys_munmap_direct(scratch as *u8,15*8)};if (seen as i64)>0{sys_munmap_direct(seen,m[UV_H_NT])};ncp_model_free(m)
42 if valid==0{return UVQ_INVALID};return UVQ_PASS
43}