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}