code wiki / (root) / nx_nxa_texbake_region_job_t278.nx

nx_nxa_texbake_region_job_t278.nx source

↩ module page · 127 lines · 5879 B

1// nx_nxa_texbake_region.nx -- CLI for the PER-REGION skin atlas + periodic micro-relief tile (TEXR): 2// nx_nxa_texbake_region measure <in.nxa> [res] the honest per-tile ruler, bakes nothing 3// nx_nxa_texbake_region bake <in.nxa> <out.nxa> [res] [seed] [hue] TEXR written additively (TEXM untouched) 4// res 0 or absent = the resolution the asset's own TEXM was baked at. Core in nx_nxa_texbake_region_lib.nx 5// (the gate imports the same implementation). Fail-closed, named reasons. EXITS: 0 OK | 2 usage | 6// 3 bad container | 4 missing section | 5 mismatch | 6 ledger missing | 1 I/O 7// license_tier: ORIGINAL No hw writes (Rule 26). 8import "nx_syscalls.nx" 9import "nx_nxa_texbake_region_capacity_t278.nx" 10const NR_E_USAGE: i64 = 2 11const NR_DEFAULT_SEED: i64 = 1 12 13func nr_atoi(s: *u8) -> i64 { 14 var v: i64 = 0 15 var i: i64 = 0 16 var neg: i64 = 0 17 if s[0] == (45 as u8) { neg = 1; i = 1 } 18 while s[i] >= (48 as u8) { 19 if s[i] > (57 as u8) { return v } 20 v = v*10 + ((s[i] as i64) - 48) 21 i = i + 1 22 } 23 if neg == 1 { return 0 - v } 24 return v 25} 26func nr_is(s: *u8, t: *u8) -> i64 { 27 var i: i64 = 0 28 while t[i] != (0 as u8) { if s[i] != t[i] { return 0 } i = i + 1 } 29 if s[i] != (0 as u8) { return 0 } 30 return 1 31} 32func nr_inspect(inp:*u8)->i64{ 33 let size:*i64=sys_mmap_try(__size_of(i64)) as *i64 34 if (size as i64)<=0{nt_outs("{\"schema\":\"nishi.texr.inspect.v1\",\"state\":\"unavailable\",\"reason\":\"allocation\"}\n");return NTR_E_IO} 35 let b:*u8=sys_map_file(inp,size) 36 if (b as i64)<=0{sys_munmap_direct(size as *u8,__size_of(i64));nt_outs("{\"schema\":\"nishi.texr.inspect.v1\",\"state\":\"unavailable\",\"reason\":\"input-map\"}\n");return NTR_E_IO} 37 let n:i64=size[0] 38 var o:i64=0-3 39 if n>=32{let header:*i64=b as *i64;if header[0]==nxa_magic(){o=ntr_texr_find(b,n)}} 40 var rc:i64=NTR_OK 41 if o<0{ 42 if o==(0-1){nt_outs("{\"schema\":\"nishi.texr.inspect.v1\",\"state\":\"absent\",\"section\":\"TEXR\"}\n");rc=NTR_E_NOSEC} 43 else{nt_outs("{\"schema\":\"nishi.texr.inspect.v1\",\"state\":\"refused\",\"validationCode\":");nt_outn(o);nt_outs("}\n");rc=NTR_E_BAD} 44 }else{ 45 let w:*i64=b as *i64 46 let ns:i64=w[o+NTR_W_NSETS];let nj:i64=w[o+NTR_W_NJ];let stride:i64=w[o+NTR_W_SETW] 47 let blob:i64=o+NTR_HDR_WORDS+nj*NTR_JOINT_WORDS+ns*stride 48 nt_outs("{\"schema\":\"nishi.texr.inspect.v1\",\"state\":\"structure-validated\",\"encodedImagesValidated\":false,\"physicalAccuracyValidated\":false,\"resolution\":") 49 nt_outn(w[o+NTR_W_RES]);nt_outs(",\"microResolution\":");nt_outn(w[o+NTR_W_MPX]) 50 nt_outs(",\"declaredMicroRepeatUm\":");nt_outn(w[o+NTR_W_MREP]) 51 nt_outs(",\"joints\":");nt_outn(nj);nt_outs(",\"sets\":[") 52 var s:i64=0 53 while s<ns{ 54 if s>0{nt_outs(",")} 55 let at:i64=o+NTR_HDR_WORDS+nj*NTR_JOINT_WORDS+s*stride 56 nt_outs("{\"region\":");nt_outn(w[at+NTR_S_REGION]);nt_outs(",\"maps\":[") 57 var m:i64=0 58 while m<NTR_NMAPS{ 59 if m>0{nt_outs(",")} 60 let rec:i64=at+NTR_SET_META+m*NTR_MAPREC 61 nt_outs("{\"kind\":");nt_outn(w[rec]);nt_outs(",\"fileByteOffset\":");nt_outn(blob*NTR_WORD+w[rec+1]) 62 nt_outs(",\"bytes\":");nt_outn(w[rec+2]);nt_outs("}");m=m+1 63 } 64 nt_outs("]}");s=s+1 65 } 66 nt_outs("]}\n") 67 } 68 let unmapped:i64=sys_munmap_direct(b,n) 69 let released:i64=sys_munmap_direct(size as *u8,__size_of(i64)) 70 if unmapped!=0||released!=0{return NTR_E_IO} 71 return rc 72} 73 74func nr_job_report(start_ms:i64)->i64 { 75 nt_outs("TEXR-JOB elapsed_ms=");nt_outn(sys_now_realtime_ms()-start_ms);nt_outs("\n") 76 let size:*i64=sys_mmap_try(__size_of(i64)) as *i64 77 if (size as i64)<=0{nt_outs("TEXR-JOB peak_memory=unknown allocation-failed\n");return 0} 78 let b:*u8=sys_read_file("/proc/self/status",size) 79 if (b as i64)<=0{nt_outs("TEXR-JOB peak_memory=unknown proc-read-failed\n");return 0} 80 var i:i64=0;var found:i64=0;let key:*u8="VmHWM:" 81 while i<size[0]{ 82 let start:i64=i;while i<size[0] && b[i]!=(10 as u8){i=i+1} 83 if i-start>=6{var k:i64=0;while k<6 && b[start+k]==key[k]{k=k+1};if k==6{sys_write(1,((b as i64)+start) as *u8,i-start);nt_outs("\n");found=1}} 84 i=i+1 85 } 86 if found==0{nt_outs("TEXR-JOB peak_memory=unknown field-absent\n")} 87 return 0 88} 89 90func main(argc: i64, argv: *i64) -> i64 { 91 if argc < 3 { 92 nt_err("usage: nx_nxa_texbake_region inspect <in.nxa> | measure <in.nxa> [res] | bake <in.nxa> <out.nxa> [res] [seed] [hue]\n" as *u8) 93 nt_err(" measure: per-region chart footprints (UV->3D Jacobian) and band adequacy, unique and micro; writes nothing\n" as *u8) 94 nt_err(" bake: per-region albedo + 16-bit height + derived normal + periodic micro tile, written as TEXR\n" as *u8) 95 sys_exit(NR_E_USAGE) 96 return NR_E_USAGE 97 } 98 let verb: *u8 = argv[1] as *u8 99 if nr_is(verb, "inspect" as *u8) == 1 { 100 if argc != 3 { return NR_E_USAGE } 101 return nr_inspect(argv[2] as *u8) 102 } 103 if nr_is(verb, "measure" as *u8) == 1 { 104 var res: i64 = 0 105 if argc >= 4 { res = nr_atoi(argv[3] as *u8) } 106 let rc: i64 = ntr_measure(argv[2] as *u8, res) 107 sys_exit(rc) 108 return rc 109 } 110 if nr_is(verb, "bake" as *u8) == 1 { 111 if argc < 4 { nt_err("usage: nx_nxa_texbake_region bake <in.nxa> <out.nxa> [res] [seed] [hue]\n" as *u8); sys_exit(NR_E_USAGE); return NR_E_USAGE } 112 var res: i64 = 0 113 if argc >= 5 { res = nr_atoi(argv[4] as *u8) } 114 var seed: i64 = NR_DEFAULT_SEED 115 if argc >= 6 { seed = nr_atoi(argv[5] as *u8) } 116 var hue: i64 = NTB_DEFAULT_HUE 117 if argc >= 7 { hue = nr_atoi(argv[6] as *u8) } 118 let started:i64=sys_now_realtime_ms() 119 let rc: i64 = ntr_apply(argv[2] as *u8, argv[3] as *u8, res, seed, hue) 120 nr_job_report(started) 121 sys_exit(rc) 122 return rc 123 } 124 nt_err("nx_nxa_texbake_region: unknown verb (inspect | measure | bake)\n" as *u8) 125 sys_exit(NR_E_USAGE) 126 return NR_E_USAGE 127}