nx_rc_probe.nx source
↩ module page · 145 lines · 5914 B
1// nx_render_core wat-clean + correctness probe. Each check is a SMALL exported function (avoids the
2// backend's large-function local-count limit). Imports the HAL-free core only; static buffers; no syscalls.
3import "nx_render_core.nx"
4const K_MAGIC_1024: i64 = 1024
5const K_MAGIC_16384: i64 = 16384
6const K_MAGIC_1152: i64 = 1152
7const K_MAGIC_1280: i64 = 1280
8const K_MAGIC_1408: i64 = 1408
9const K_MAGIC_1536: i64 = 1536
10const K_MAGIC_1664: i64 = 1664
11const K_MAGIC_1792: i64 = 1792
12const K_MAGIC_1824: i64 = 1824
13const K_MAGIC_1856: i64 = 1856
14const K_MAGIC_13418: i64 = 13418
15const K_MAGIC_9402: i64 = 9402
16const K_MAGIC_2048: i64 = 2048
17const K_MAGIC_4096: i64 = 4096
18const K_MAGIC_6144: i64 = 6144
19const K_MAGIC_4294967295: i64 = 4294967295
20const K_MAGIC_8192: i64 = 8192
21const K_MAGIC_11585: i64 = 11585
22const K_MAGIC_11400: i64 = 11400
23const K_MAGIC_11700: i64 = 11700
24const K_MAGIC_10000: i64 = 10000
25const K_MAGIC_40000: i64 = 40000
26const K_MAGIC_1200: i64 = 1200
27const K_MAGIC_1376: i64 = 1376
28const K_MAGIC_70000: i64 = 70000
29const K_MAGIC_16777216: i64 = 16777216
30const K_MAGIC_65536: i64 = 65536
31const K_MAGIC_72000: i64 = 72000
32func gi_chk_identity() -> i64 {
33 let m: *i64 = (K_MAGIC_1024 as i64) as *i64
34 rc_identity_4x4(m)
35 if m[0] == K_MAGIC_16384 { if m[5] == K_MAGIC_16384 { if m[10] == K_MAGIC_16384 { if m[15] == K_MAGIC_16384 { if m[1] == 0 { return 1 } } } } }
36 return 0
37}
38func gi_chk_translation() -> i64 {
39 let m: *i64 = (K_MAGIC_1152 as i64) as *i64
40 rc_translation_4x4(100, 200, 300, m)
41 if m[3] == 100 { if m[7] == 200 { if m[11] == 300 { if m[0] == K_MAGIC_16384 { return 1 } } } }
42 return 0
43}
44func gi_chk_mul() -> i64 {
45 let a: *i64 = (K_MAGIC_1280 as i64) as *i64
46 let b: *i64 = (K_MAGIC_1408 as i64) as *i64
47 let c: *i64 = (K_MAGIC_1536 as i64) as *i64
48 rc_identity_4x4(a)
49 rc_translation_4x4(100, 200, 300, b)
50 rc_mat4_mul(a, b, c)
51 if c[3] == 100 { if c[11] == 300 { if c[0] == K_MAGIC_16384 { return 1 } } }
52 return 0
53}
54func gi_chk_vec4() -> i64 {
55 let m: *i64 = (K_MAGIC_1664 as i64) as *i64
56 let vi: *i64 = (K_MAGIC_1792 as i64) as *i64
57 let vo: *i64 = (K_MAGIC_1824 as i64) as *i64
58 rc_identity_4x4(m)
59 vi[0] = 5 * K_MAGIC_16384
60 vi[1] = 6 * K_MAGIC_16384
61 vi[2] = 7 * K_MAGIC_16384
62 vi[3] = K_MAGIC_16384
63 rc_mat4_vec4(m, vi, vo)
64 if vo[0] == 5 * K_MAGIC_16384 { if vo[1] == 6 * K_MAGIC_16384 { if vo[3] == K_MAGIC_16384 { return 1 } } }
65 return 0
66}
67func gi_chk_perspective() -> i64 {
68 let m: *i64 = (K_MAGIC_1856 as i64) as *i64
69 rc_perspective_cs(K_MAGIC_13418, K_MAGIC_9402, K_MAGIC_16384, K_MAGIC_16384, 1000 * K_MAGIC_16384, m)
70 if m[14] == 0 - K_MAGIC_16384 { if m[5] > 0 { if m[0] > 0 { return 1 } } }
71 return 0
72}
73func gi_chk_raster() -> i64 {
74 let fb: *i64 = (K_MAGIC_2048 as i64) as *i64
75 let zb: *i64 = (K_MAGIC_4096 as i64) as *i64
76 let tri: *i64 = (K_MAGIC_6144 as i64) as *i64
77 rc_clear(fb, 8, 8, 0)
78 rc_zclear(zb, 8, 8)
79 tri[0] = 1
80 tri[1] = 1
81 tri[2] = 1000
82 tri[3] = K_MAGIC_4294967295
83 tri[4] = 6
84 tri[5] = 1
85 tri[6] = 1000
86 tri[7] = K_MAGIC_4294967295
87 tri[8] = 3
88 tri[9] = 6
89 tri[10] = 1000
90 tri[11] = K_MAGIC_4294967295
91 rc_triangle(fb, zb, 8, 8, tri)
92 var col: i64 = 0
93 var i: i64 = 0
94 while i < 64 { if fb[i] != 0 { col = col + 1 } i = i + 1 }
95 return col
96}
97func gi_chk_trig() -> i64 {
98 if rc_sin_q14(0) != 0 { return 0 }
99 if rc_sin_q14(30) != K_MAGIC_8192 { return 0 } // Bhaskara exact at 30
100 if rc_sin_q14(90) != K_MAGIC_16384 { return 0 } // exact at 90
101 if rc_cos_q14(0) != K_MAGIC_16384 { return 0 }
102 if rc_cos_q14(90) != 0 { return 0 }
103 if rc_sin_q14(270) != 0 - K_MAGIC_16384 { return 0 } // range reduction + sign
104 let s45: i64 = rc_sin_q14(405) // 405 mod 360 = 45 ; true ~K_MAGIC_11585
105 if s45 < K_MAGIC_11400 { return 0 }
106 if s45 > K_MAGIC_11700 { return 0 }
107 return 1
108}
109// ENGINE test: render a GENERIC data-driven scene (3 distinct-colour box entities) via rc_draw_scene --
110// proves the core is a reusable engine (entity table in, image out), not a hardcoded game.
111func gi_scene_test() -> i64 {
112 let fb: *i64 = (K_MAGIC_10000 as i64) as *i64
113 let zb: *i64 = (K_MAGIC_40000 as i64) as *i64
114 rc_clear(fb, 64, 48, 0)
115 rc_zclear(zb, 64, 48)
116 let T: *i64 = (K_MAGIC_1024 as i64) as *i64
117 rc_translation_4x4(0, 0, 0 - 7 * K_MAGIC_16384, T)
118 let P: *i64 = (K_MAGIC_1200 as i64) as *i64
119 rc_perspective_cs(K_MAGIC_13418, K_MAGIC_9402, K_MAGIC_16384, K_MAGIC_16384, 1000 * K_MAGIC_16384, P)
120 let mvp: *i64 = (K_MAGIC_1376 as i64) as *i64
121 rc_mat4_mul(P, T, mvp)
122 let ent: *i64 = (K_MAGIC_70000 as i64) as *i64
123 ent[0] = 0 - 4; ent[1] = 0 - 1; ent[2] = 0; ent[3] = 2; ent[4] = 2; ent[5] = 2; ent[6] = 255 + 255 * K_MAGIC_16777216 // red
124 ent[7] = 0; ent[8] = 0 - 1; ent[9] = 0; ent[10] = 2; ent[11] = 2; ent[12] = 2; ent[13] = 255 * 256 + 255 * K_MAGIC_16777216 // green
125 ent[14] = 4; ent[15] = 0 - 1; ent[16] = 0; ent[17] = 2; ent[18] = 2; ent[19] = 2; ent[20] = 255 * K_MAGIC_65536 + 255 * K_MAGIC_16777216 // blue
126 let scr: *i64 = (K_MAGIC_72000 as i64) as *i64
127 rc_draw_scene(fb, zb, 64, 48, mvp, ent, 3, 32, 24, scr)
128 var nb: i64 = 0
129 var i: i64 = 0
130 while i < 64 * 48 { if fb[i] != 0 { nb = nb + 1 } i = i + 1 }
131 return nb
132}
133func gi_scene_colors() -> i64 {
134 let fb: *i64 = (K_MAGIC_10000 as i64) as *i64
135 let red: i64 = 255 + 255 * K_MAGIC_16777216
136 let grn: i64 = 255 * 256 + 255 * K_MAGIC_16777216
137 let blu: i64 = 255 * K_MAGIC_65536 + 255 * K_MAGIC_16777216
138 var hr: i64 = 0
139 var hg: i64 = 0
140 var hb: i64 = 0
141 var i: i64 = 0
142 while i < 64 * 48 { let c: i64 = fb[i]; if c == red { hr = 1 } if c == grn { hg = 1 } if c == blu { hb = 1 } i = i + 1 }
143 return hr + hg + hb
144}
145func main() -> i64 { return 0 }