code wiki / (root) / nx_uv_quality_packet_candidate_t282.nx

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}