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}