code wiki / _hdl_build / nx_bodybind_gate.nx
nx_bodybind_gate.nx source
↩ module page · 224 lines · 9251 B
1// nx_bodybind_gate.nx -- gate for REGION-TO-BONE BINDING (Elara bar E4): bones + flesh + contact COMPOSED.
2// T1 STATIC bind: anchor = boneWorld + boneRot*offset, hand-computed at 45deg yaw
3// T2 POSE DRIVES FLESH: sweep the bone -> nodes LAG the moving anchor (secondary motion survives binding),
4// then settle tracking it
5// T3 OCCLUSION UNDER MOTION: a fixed capsule pressed by the ROCKING bone-driven region -> never-inside holds
6// AND the far side still bulges (the law works around a MOVING anchor)
7// T4 determinism: two rigs, same script -> region state byte-identical
8// + PNG knowledge/nx_bodybind.png. Arenas are SEPARATE mmaps (sk_bytes()=188736 -- packing them in one 64KB
9// world overlapped; caught by the arena guard BEFORE running). license_tier: ORIGINAL expect_exit: 0
10import "nx_syscalls.nx"
11import "nx_png.nx"
12import "nx_bodybind.nx"
13
14func hw(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(1, s, n); return 0 }
15func pn(v: i64) -> i64 {
16 let b: *u8 = sys_mmap(32) as *u8
17 var x: i64 = v
18 var neg: i64 = 0
19 if x < 0 { neg = 1; x = 0 - x }
20 var i: i64 = 31
21 if x == 0 { b[i] = 48 as u8; i = i - 1 }
22 while x > 0 { b[i] = (48 + x % 10) as u8; x = x / 10; i = i - 1 }
23 if neg == 1 { b[i] = 45 as u8; i = i - 1 }
24 sys_write(1, (b as i64 + i + 1) as *u8, 31 - i)
25 return 0
26}
27func gabs(v: i64) -> i64 { if v < 0 { return 0 - v } return v }
28func isq(v: i64) -> i64 { if v <= 0 { return 0 } var x: i64 = v; var y: i64 = (x + 1) / 2; while y < x { x = y; y = (x + v / x) / 2 } return x }
29
30func mkrig(sk: i64, sr: i64, bb: i64) -> i64 {
31 sk_init(sk)
32 sk_add_bone(sk, 0 - 1, 0, 0, 0) // spine root
33 sk_add_bone(sk, 0, 0, 1200, 0) // chest bone 1200 up
34 sr_init(sr, 0, 0, 0)
35 sr_param(sr, 9, 0) // isolate from gravity for exactness
36 sr_ring(sr, 16, 500)
37 bb_init(bb)
38 bb_add(bb, 1, 600, 0, 0, 0) // region 600 in front of the chest; region_off=0 in the sr arena
39 return 0
40}
41// node-0 lag distance from its bound target (anchor + rest offset (500,0,0)) in the x/z plane
42func lagd(sr: i64) -> i64 {
43 let h: *i64 = sr_hdr(sr)
44 let dx: i64 = sr_pos(sr, 0, 0) - (h[2] + 500)
45 let dz: i64 = sr_pos(sr, 0, 2) - h[4]
46 return isq(dx * dx + dz * dz)
47}
48
49func main() -> i64 {
50 var fails: i64 = 0
51 let sk: i64 = sys_mmap(sk_bytes()) as i64
52 let sr: i64 = sys_mmap(sr_bytes()) as i64
53 let bb: i64 = sys_mmap(bb_bytes()) as i64
54 mkrig(sk, sr, bb)
55
56 // T1 static bind at chest yaw 45deg: anchor = (0,1200,0) + Ry45*(600,0,0) = (424,1200,-424)-ish
57 sk_pose(sk, 1, 3217, 0)
58 sk_update(sk)
59 bb_drive(bb, sk, sr)
60 let hreg: *i64 = sr_hdr(sr)
61 var t1: i64 = 1
62 if gabs(hreg[2] - 424) > 20 { t1 = 0 }
63 if gabs(hreg[3] - 1200) > 8 { t1 = 0 }
64 if gabs(hreg[4] + 424) > 20 { t1 = 0 }
65 if t1 == 1 { hw("T1 PASS static bind: anchor (424,1200,-424)-ish for chest yaw 45, got (" as *u8); pn(hreg[2]); hw("," as *u8); pn(hreg[3]); hw("," as *u8); pn(hreg[4]); hw(")\n" as *u8) }
66 else { hw("T1 FAIL anchor=(" as *u8); pn(hreg[2]); hw("," as *u8); pn(hreg[3]); hw("," as *u8); pn(hreg[4]); hw(")\n" as *u8); fails = fails + 1 }
67
68 // settle, then T2 sweep: FAST sine sweep (peak ~150 ang/tick -> anchor ~22 units/tick; the first run's
69 // gentle 32/tick sweep was fully tracked at lag~7 -- the spring is stiffer than that probe)
70 var t: i64 = 0
71 while t < 200 { sr_step(sr); t = t + 1 }
72 var lagticks: i64 = 0
73 var lastang: i64 = 0
74 t = 0
75 while t < 100 {
76 lastang = it_sin4096(t * 300) / 2
77 sk_pose(sk, 1, lastang, 0)
78 sk_update(sk)
79 bb_drive(bb, sk, sr)
80 sr_step(sr)
81 if lagd(sr) > 20 { lagticks = lagticks + 1 }
82 t = t + 1
83 }
84 var t2: i64 = 1
85 if lagticks < 30 { t2 = 0 }
86 t = 0
87 while t < 300 { sr_step(sr); t = t + 1 }
88 if lagd(sr) > 24 { t2 = 0 }
89 if t2 == 1 { hw("T2 PASS pose drives flesh: nodes LAG the sweeping bone on " as *u8); pn(lagticks); hw("/100 ticks, settle dev=" as *u8); pn(lagd(sr)); hw("\n" as *u8) }
90 else { hw("T2 FAIL lag=" as *u8); pn(lagticks); hw(" settle=" as *u8); pn(lagd(sr)); hw("\n" as *u8); fails = fails + 1 }
91
92 // ramp smoothly to T3's rocking pose (a hard pose jump would teleport the anchor and poison T3)
93 t = 0
94 while t < 60 {
95 sk_pose(sk, 1, lastang + (0 - 200 - lastang) * t / 60, 0)
96 sk_update(sk)
97 bb_drive(bb, sk, sr)
98 sr_step(sr)
99 t = t + 1
100 }
101 t = 0
102 while t < 200 {
103 sk_pose(sk, 1, 0 - 200, 0)
104 sk_update(sk)
105 bb_drive(bb, sk, sr)
106 sr_step(sr)
107 t = t + 1
108 }
109
110 // T3 occlusion under motion: fixed capsule near the settled +x side; rock the bone gently
111 let h4: *i64 = sr_hdr(sr)
112 sr_add_capsule(sr, h4[2] + 640, h4[3] - 400, 0, h4[2] + 640, h4[3] + 400, 0, 220)
113 var minr: i64 = 99999
114 var maxfar: i64 = 0
115 t = 0
116 while t < 300 {
117 sk_pose(sk, 1, 0 - 200 + it_sin4096(t * 80) / 8, 0)
118 sk_update(sk)
119 bb_drive(bb, sk, sr)
120 sr_step(sr)
121 let h5: *i64 = sr_hdr(sr)
122 let cap: *i64 = sr_cap(sr, 0)
123 var c: i64 = 0
124 while c < 16 {
125 let ny2: i64 = sr_pos(sr, c, 1)
126 if ny2 > cap[1] { if ny2 < cap[4] {
127 let dx: i64 = sr_pos(sr, c, 0) - cap[0]
128 let dz: i64 = sr_pos(sr, c, 2) - cap[2]
129 let d: i64 = isq(dx * dx + dz * dz)
130 if d < minr { minr = d }
131 } }
132 c = c + 1
133 }
134 let flx: i64 = sr_pos(sr, 8, 0) - h5[2]
135 let fly: i64 = sr_pos(sr, 8, 1) - h5[3]
136 let fl: i64 = isq(flx * flx + fly * fly)
137 if fl - 500 > maxfar { maxfar = fl - 500 }
138 t = t + 1
139 }
140 var t3: i64 = 1
141 if minr < 216 { t3 = 0 }
142 if maxfar < 12 { t3 = 0 }
143 if t3 == 1 { hw("T3 PASS occlusion under a MOVING anchor: never-inside (min-r " as *u8); pn(minr); hw("/220), far-side bulge peaks +" as *u8); pn(maxfar); hw("\n" as *u8) }
144 else { hw("T3 FAIL minr=" as *u8); pn(minr); hw(" maxfar=" as *u8); pn(maxfar); hw("\n" as *u8); fails = fails + 1 }
145
146 // T4 determinism
147 let skA: i64 = sys_mmap(sk_bytes()) as i64
148 let srA: i64 = sys_mmap(sr_bytes()) as i64
149 let bbA: i64 = sys_mmap(bb_bytes()) as i64
150 let skB: i64 = sys_mmap(sk_bytes()) as i64
151 let srB: i64 = sys_mmap(sr_bytes()) as i64
152 let bbB: i64 = sys_mmap(bb_bytes()) as i64
153 mkrig(skA, srA, bbA)
154 mkrig(skB, srB, bbB)
155 t = 0
156 while t < 200 {
157 let ang: i64 = it_sin4096(t * 100) / 4
158 sk_pose(skA, 1, ang, 0)
159 sk_pose(skB, 1, ang, 0)
160 sk_update(skA); sk_update(skB)
161 bb_drive(bbA, skA, srA)
162 bb_drive(bbB, skB, srB)
163 sr_step(srA); sr_step(srB)
164 t = t + 1
165 }
166 var diff: i64 = 0
167 var k: i64 = 0
168 while k < 16 * 16 {
169 let pa: *i64 = (srA + 128) as *i64
170 let pb: *i64 = (srB + 128) as *i64
171 if pa[k] != pb[k] { diff = diff + 1 }
172 k = k + 1
173 }
174 if diff == 0 { hw("T4 PASS determinism: bone-driven region byte-identical across worlds\n" as *u8) }
175 else { hw("T4 FAIL diff=" as *u8); pn(diff); hw("\n" as *u8); fails = fails + 1 }
176
177 // PNG: rest pose vs rocked pose with the capsule
178 let TW: i64 = 256
179 let TH: i64 = 128
180 let fb: *i64 = sys_mmap(TW * TH * 8) as *i64
181 var pi: i64 = 0
182 while pi < TW * TH { fb[pi] = 22 + 26 * 256 + 34 * 65536; pi = pi + 1 }
183 var panel: i64 = 0
184 while panel < 2 {
185 let skp: i64 = sys_mmap(sk_bytes()) as i64
186 let srp: i64 = sys_mmap(sr_bytes()) as i64
187 let bbp: i64 = sys_mmap(bb_bytes()) as i64
188 mkrig(skp, srp, bbp)
189 sk_update(skp)
190 bb_drive(bbp, skp, srp)
191 var s2: i64 = 0
192 while s2 < 200 { sr_step(srp); s2 = s2 + 1 }
193 if panel == 1 {
194 let hp: *i64 = sr_hdr(srp)
195 sr_add_capsule(srp, hp[2] + 620, hp[3] - 400, 0, hp[2] + 620, hp[3] + 400, 0, 220)
196 sk_pose(skp, 1, 800, 0)
197 var s3: i64 = 0
198 while s3 < 300 {
199 sk_update(skp)
200 bb_drive(bbp, skp, srp)
201 sr_step(srp)
202 s3 = s3 + 1
203 }
204 }
205 let hp3: *i64 = sr_hdr(srp)
206 var c2: i64 = 0
207 while c2 < 16 {
208 let px: i64 = 50 + panel * 130 + (sr_pos(srp, c2, 0) - hp3[2]) / 12
209 let py: i64 = 64 - (sr_pos(srp, c2, 1) - hp3[3]) / 12
210 if px >= 0 { if px < TW { if py >= 0 { if py < TH {
211 fb[py * TW + px] = 130 + 220 * 256 + 170 * 65536
212 if px + 1 < TW { fb[py * TW + px + 1] = 130 + 220 * 256 + 170 * 65536 }
213 } } } }
214 c2 = c2 + 1
215 }
216 panel = panel + 1
217 }
218 write_png(fb, TW, TH, "knowledge/nx_bodybind.png" as *u8)
219 hw("PNG written: knowledge/nx_bodybind.png (bound region: rest vs rocked-bone + capsule dent)\n" as *u8)
220
221 if fails == 0 { hw("VERDICT GREEN: region-to-bone binding 4/4 -- bones DRIVE flesh (lag preserved), occlusion law holds under motion, rigs are data\n" as *u8) }
222 else { hw("VERDICT RED fails=" as *u8); pn(fails); hw("\n" as *u8) }
223 return fails
224}