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}