code wiki / _hdl_build / nx_meshrender_gate.nx

nx_meshrender_gate.nx source

↩ module page · 109 lines · 6459 B

1// nx_meshrender_gate.nx -- GATE for the sovereign general-mesh renderer (nx_meshrender over nx_render_core). 2// Proves we can transform+project+z-buffer-rasterize an ARBITRARY loaded mesh through OUR pipeline (no WebGL), 3// with a MEASURED exceed over painter's-algorithm: two overlapping triangles, RED nearer + BLUE farther, and 4// the overlap shows RED *regardless of draw order* -- the exact case draw-order/painter's gets wrong. Plus 5// coverage (non-vacuous), determinism, and a teeth/neg-control (empty mesh -> nothing drawn). 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]=48;sys_write(1,b,1);return 0} if x<0{sys_write(1,"-" as *u8,1);x=0-x} 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 fill_vert(verts: *i64, i: i64, x: i64, y: i64, z: i64, c: i64) -> i64 { 15 verts[i*4+0]=x; verts[i*4+1]=y; verts[i*4+2]=z; verts[i*4+3]=c; return 0 16} 17// count framebuffer pixels that differ from the background (rendered coverage). 18func cover(fb: *i64, n: i64, bg: i64) -> i64 { var k: i64=0; var i: i64=0; while i<n { if fb[i]!=bg { k=k+1 } i=i+1 } return k } 19// order-independent XOR checksum of the framebuffer (determinism probe). 20func xchk(fb: *i64, n: i64) -> i64 { var x: i64=0; var i: i64=0; while i<n { x=x+fb[i]; i=i+1 } return x } 21 22func main() -> i64 { 23 g_puts("nx_meshrender_gate (sovereign general-mesh renderer: transform->project->z-buffer raster, no WebGL)\n" as *u8) 24 let W: i64=64 25 let H: i64=64 26 let N: i64=W*H 27 let fb: *i64=sys_mmap(N*8) as *i64 28 let zb: *i64=sys_mmap(N*8) as *i64 29 let proj: *i64=sys_mmap(16*8) as *i64 30 let roty: *i64=sys_mmap(16*8) as *i64 31 let mv: *i64=sys_mmap(16*8) as *i64 32 let trans: *i64=sys_mmap(16*8) as *i64 33 let mvp: *i64=sys_mmap(16*8) as *i64 34 let vbuf: *i64=sys_mmap(8*8) as *i64 35 let clipbuf: *i64=sys_mmap(8*8) as *i64 36 let scr: *i64=sys_mmap(6*4*8) as *i64 37 let tribuf: *i64=sys_mmap(16*8) as *i64 38 let verts: *i64=sys_mmap(6*4*8) as *i64 39 let idx: *i64=sys_mmap(6*8) as *i64 40 let idx2: *i64=sys_mmap(6*8) as *i64 41 42 // colours (packed RGBA, alpha=255=full brightness): RED, BLUE, and a distinct dark-grey BG. 43 let RED: i64=4278190335 // r255 g0 b0 a255 44 let BLU: i64=4294901760 // r0 g0 b255 a255 45 let BG: i64=4280295456 // r32 g32 b32 a255 46 47 // two big overlapping triangles (same screen footprint), RED at z=+0.5 (nearer), BLUE at z=-0.5 (farther). 48 fill_vert(verts, 0, 0-13107, 0-13107, 8192, RED) 49 fill_vert(verts, 1, 13107, 0-13107, 8192, RED) 50 fill_vert(verts, 2, 0, 13107, 8192, RED) 51 fill_vert(verts, 3, 0-13107, 0-13107, 0-8192, BLU) 52 fill_vert(verts, 4, 13107, 0-13107, 0-8192, BLU) 53 fill_vert(verts, 5, 0, 13107, 0-8192, BLU) 54 // idx draws RED first then BLUE; idx2 draws BLUE first then RED (to prove order-independence). 55 idx[0]=0; idx[1]=1; idx[2]=2; idx[3]=3; idx[4]=4; idx[5]=5 56 idx2[0]=3; idx2[1]=4; idx2[2]=5; idx2[3]=0; idx2[4]=1; idx2[5]=2 57 58 let DIST: i64=65536 // 4.0 in Q14 59 let FOVH: i64=30 // half field-of-view degrees 60 61 // ---- render with RED-first order ---- 62 let drawn: i64=mr_render(verts,6,idx,2,proj,roty,mv,trans,mvp,vbuf,clipbuf,scr,tribuf,fb,zb,W,H,0,DIST,FOVH,BG) 63 let cidx: i64=(H/2)*W+(W/2) 64 let cpix: i64=fb[cidx] 65 let cr: i64=cpix%256 66 let cb: i64=(cpix/65536)%256 67 let cov: i64=cover(fb,N,BG) 68 let chk1: i64=xchk(fb,N) 69 70 g_puts(" drawn_tris="); g_pn(drawn); g_puts(" center_R="); g_pn(cr); g_puts(" center_B="); g_pn(cb); g_puts(" coverage="); g_pn(cov); g_puts("\n" as *u8) 71 72 // ---- re-render (determinism) ---- 73 mr_render(verts,6,idx,2,proj,roty,mv,trans,mvp,vbuf,clipbuf,scr,tribuf,fb,zb,W,H,0,DIST,FOVH,BG) 74 let chk2: i64=xchk(fb,N) 75 76 // ---- render with BLUE-first order (z-buffer must STILL show RED at center) ---- 77 mr_render(verts,6,idx2,2,proj,roty,mv,trans,mvp,vbuf,clipbuf,scr,tribuf,fb,zb,W,H,0,DIST,FOVH,BG) 78 let cpix2: i64=fb[cidx] 79 let cr2: i64=cpix2%256 80 let cb2: i64=(cpix2/65536)%256 81 82 // ---- teeth/neg-control: empty mesh -> renderer must draw NOTHING (just bg) ---- 83 let drawn0: i64=mr_render(verts,6,idx,0,proj,roty,mv,trans,mvp,vbuf,clipbuf,scr,tribuf,fb,zb,W,H,0,DIST,FOVH,BG) 84 let cov0: i64=cover(fb,N,BG) 85 let cpix0: i64=fb[cidx] 86 87 var pass: i64=0; var t: i64=0 88 var t1: i64=0; if drawn==2 { t1=1 } 89 pass=pass+ck("T1: both triangles transformed+projected+drawn (drawn_tris==2)" as *u8, t1); t=t+1 90 var t2: i64=0; if cr==255 { if cb==0 { t2=1 } } 91 pass=pass+ck("T2 (z-correct): nearer RED wins the overlap at screen center (R==255, B==0)" as *u8, t2); t=t+1 92 var t3: i64=0; if cr2==255 { if cb2==0 { t3=1 } } 93 pass=pass+ck("T3 (EXCEED vs painter's): center stays RED even when BLUE is drawn LAST (order-independent z-buffer)" as *u8, t3); t=t+1 94 var t4: i64=0; if cov>100 { t4=1 } 95 pass=pass+ck("T4 (non-vacuous): rendered coverage > 100 px" as *u8, t4); t=t+1 96 var t5: i64=0; if chk1==chk2 { t5=1 } 97 pass=pass+ck("T5 (deterministic): identical framebuffer across two renders" as *u8, t5); t=t+1 98 var t6: i64=0; if drawn0==0 { if cov0==0 { if cpix0==BG { t6=1 } } } 99 pass=pass+ck("T6 (teeth): empty mesh draws NOTHING (drawn==0, coverage==0, center==bg) -- no hallucinated geometry" as *u8, t6); t=t+1 100 101 var okall: i64=0; if pass==t { okall=1 } 102 g_puts("---- nx_meshrender_gate: passed "); g_pn(pass); g_puts(" / "); g_pn(t); g_puts(" ----\n" as *u8) 103 if okall==1 { 104 let logf: i64=sys_openat_append("knowledge/status/meshrender_gate.log" as *u8, 420) 105 if logf>=0 { let msg: *u8="MESHRENDER GREEN: sovereign general-mesh renderer z-correct + order-independent (exceeds painter's) + deterministic, no WebGL\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) } 106 g_puts("verdict=GREEN (any loaded mesh renders z-correct through our own sovereign pipeline -- the emit-not-3rd-party CAD/asset foundation)\n" as *u8); sys_exit(0); return 0 107 } 108 g_puts("verdict=RED\n" as *u8); sys_exit(1); return 1 109}