code wiki / _hdl_build / nx_meshlit_gate.nx
nx_meshlit_gate.nx source
↩ module page · 59 lines · 4408 B
1// nx_meshlit_gate.nx -- GATE for CAP-PBR rung-1 (Lambert diffuse directional shading in nx_meshrender, over
2// nx_render_core). Proves the lighting law with HARD numbers: head-on face = full bright, perpendicular = 0,
3// 45 deg = cos45 (the measured cosine law), back-face = clamped 0 (no negative light), a perpendicular face
4// ROTATED into the light relights to full (orbit relighting), and mr_shade actually brightens a lit face vs an
5// unlit one + respects an ambient floor; teeth: amb=0 + unlit = fully black (shading really darkens). expect_exit: 0
6import "nx_syscalls.nx"
7import "nx_g_puts_lib.nx"
8import "nx_render_core.nx"
9import "nx_meshrender.nx"
10
11func g_pn(v: i64) -> i64 { let b: *u8=sys_mmap(28); var x: i64=v; if x<0{b[0]=45 as u8;sys_write(1,b,1);x=0-x} if x==0{b[0]=48 as u8;sys_write(1,b,1);return 0} var d: i64=0; var y: i64=x; while y>0{d=d+1;y=y/10} var i: i64=d-1; y=x; while i>=0{b[i]=(48+(y%10)) as u8;y=y/10;i=i-1} sys_write(1,b,d); return 0 }
12func ck(name: *u8, c: i64) -> i64 { if c==1 { g_puts(" PASS " as *u8) } else { g_puts(" FAIL " as *u8) } g_puts(name); g_puts("\n" as *u8); return c }
13
14func main() -> i64 {
15 g_puts("nx_meshlit_gate (CAP-PBR rung-1: Lambert diffuse directional shading, measured)\n" as *u8)
16 let Q: i64 = 16384 // RC_Q (1.0 in Q14)
17 let LZ: i64 = 16384 // unit light pointing +Z: L = (0,0,1)
18 // 45-degree unit normal in the xz plane: (sin45,0,cos45) = (11585,0,11585); 11585^2 * 2 == 16384^2 -> unit.
19 let headon: i64 = mr_lambert(0, 0, Q, 0, 0, LZ)
20 let perp: i64 = mr_lambert(Q, 0, 0, 0, 0, LZ)
21 let c45: i64 = mr_lambert(11585, 0, 11585, 0, 0, LZ)
22 let back: i64 = mr_lambert(0, 0, 0 - Q, 0, 0, LZ)
23 let rot: *i64 = sys_mmap(8 * 4) as *i64
24 mr_rotn(rc_cos_q14(0 - 90), rc_sin_q14(0 - 90), Q, 0, 0, rot) // perpendicular normal, orbited -90deg
25 let relit: i64 = mr_lambert(rot[0], rot[1], rot[2], 0, 0, LZ)
26 let RED: i64 = 4278190335
27 let amb: i64 = 4096 // ambient floor = 0.25
28 let litR: i64 = mr_shade(RED, Q, amb) % 256 // fully lit red -> 255
29 let unlitR: i64 = mr_shade(RED, 0, amb) % 256 // unlit but ambient -> 63
30 let darkR: i64 = mr_shade(RED, 0, 0) % 256 // unlit, no ambient -> 0
31
32 g_puts(" headon="); g_pn(headon); g_puts(" perp="); g_pn(perp); g_puts(" cos45="); g_pn(c45); g_puts(" back="); g_pn(back); g_puts(" relit="); g_pn(relit)
33 g_puts(" litR="); g_pn(litR); g_puts(" unlitR="); g_pn(unlitR); g_puts(" darkR="); g_pn(darkR); g_puts("\n" as *u8)
34
35 var pass: i64=0; var t: i64=0
36 var t1: i64=0; if headon==Q { t1=1 }
37 pass=pass+ck("T1: face head-on to the light is FULLY bright (lambert==RC_Q)" as *u8, t1); t=t+1
38 var t2: i64=0; if perp==0 { t2=1 }
39 pass=pass+ck("T2: face perpendicular to the light is dark (lambert==0)" as *u8, t2); t=t+1
40 var t3: i64=0; if c45==11585 { t3=1 }
41 pass=pass+ck("T3 (MEASURED cosine law): 45deg face == 11585 == cos45*RC_Q (0.707)" as *u8, t3); t=t+1
42 var t4: i64=0; if back==0 { t4=1 }
43 pass=pass+ck("T4: back-face (dot<0) clamps to 0 -- no negative light" as *u8, t4); t=t+1
44 var t5: i64=0; if relit==Q { t5=1 }
45 pass=pass+ck("T5: a perpendicular face ROTATED into the light relights to full (orbit relighting)" as *u8, t5); t=t+1
46 var t6: i64=0; if litR>unlitR { if unlitR>0 { t6=1 } }
47 pass=pass+ck("T6 (MEASURED): lit face brighter than unlit (255>63) AND ambient keeps it visible (63>0)" as *u8, t6); t=t+1
48 var t7: i64=0; if darkR==0 { t7=1 }
49 pass=pass+ck("T7 (teeth): with no ambient, an unlit face is FULLY black -- shading actually darkens" as *u8, t7); t=t+1
50
51 var okall: i64=0; if pass==t { okall=1 }
52 g_puts("---- nx_meshlit_gate: passed "); g_pn(pass); g_puts(" / "); g_pn(t); g_puts(" ----\n" as *u8)
53 if okall==1 {
54 let logf: i64=sys_openat_append("knowledge/status/meshlit_gate.log" as *u8, 420)
55 if logf>=0 { let msg: *u8="MESHLIT GREEN: CAP-PBR rung-1 Lambert diffuse shading -- cosine law + back-face clamp + orbit relight + ambient, measured\n" as *u8; var ml: i64=0; while msg[ml]!=(0 as u8){ml=ml+1} let z: i64=sys_write(logf,msg,ml); sys_close(logf) }
56 g_puts("verdict=GREEN (directional diffuse lighting is real + correct -- the first climb up the lineage toward MetaHuman)\n" as *u8); sys_exit(0); return 0
57 }
58 g_puts("verdict=RED\n" as *u8); sys_exit(1); return 1
59}