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}