code wiki / _hdl_build / nx_quad_gaits_gate.nx

nx_quad_gaits_gate.nx source

↩ module page · 122 lines · 6203 B

1// nx_quad_gaits_gate.nx -- DIVERSIFY the animal motion: walk/trot/gallop as data on the quadruped rig, plus a 2// HORNED creature composition (quadruped + swap slots). Proves: 3// T1 the 3 gaits are DISTINCT (FR-foot phase differs: walk=diagonal-antiphase, gallop=rotary-near-phase) 4// T2 each gait produces MOTION (rendered frame checksums differ) 5// T3 horns compose (quad_add_horns adds parts on the head) 6// T4 valid APNGs written (gallop + a horned trot) 7// Emits knowledge/synth_gallop.png + knowledge/synth_horncreature.png. license_tier: ORIGINAL expect_exit: 0 8import "nx_syscalls.nx" 9import "nx_quadruped.nx" 10import "nx_apng.nx" 11 12func hw(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 } 13func pn(v: i64) -> i64 { let b: *u8=sys_mmap(32) as *u8; var x: i64=v; var ng: i64=0; if x<0{ng=1;x=0-x} var i: i64=31; if x==0{b[i]=48 as u8;i=i-1} while x>0{b[i]=(48+x%10) as u8;x=x/10;i=i-1} if ng==1{b[i]=45 as u8;i=i-1} sys_write(1,(b as i64+i+1) as *u8,31-i); return 0 } 14func cks(fb: *i64, n: i64) -> i64 { var s: i64=1469598103; var i: i64=0; while i<n{s=(s*31+(fb[i]&0xffffff))&0x0fffffffffffffff;i=i+1} return s } 15func find4(buf: *u8, n: i64, a: i64, b: i64, c: i64, d: i64) -> i64 { var i: i64=0; while i+4<=n{ if (buf[i]&0xff)==a{ if (buf[i+1]&0xff)==b{ if (buf[i+2]&0xff)==c{ if (buf[i+3]&0xff)==d{return i}}}} i=i+1} return 0-1 } 16 17const RW: i64 = 144 18const RH: i64 = 96 19const RFOCAL: i64 = 164 20func gr_render(base: i64, fb: *i64, yaw: i64) -> i64 { 21 let R: i64 = 5 * 1024 22 let cy4: i64 = it_cos4096(yaw); let sy4: i64 = it_sin4096(yaw) 23 let rox: i64 = 0 - sy4 * R / 4096; let roz: i64 = 0 - cy4 * R / 4096 24 var y: i64 = 0 25 while y < RH { 26 let mc1: i64 = 24 + y*30/RH; let mc2: i64 = 26 + y*28/RH; let mc3: i64 = 40 + y*26/RH 27 let misscol: i64 = mc1 + mc2*256 + mc3*65536 28 var x: i64 = 0 29 while x < RW { 30 let ndcx: i64 = (2*x+1-RW)*1024/(2*RFOCAL); let ndcy: i64 = (RH-(2*y+1))*1024/(2*RFOCAL) 31 let rl: i64 = sdf_isqrt(ndcx*ndcx + ndcy*ndcy + 1024*1024) 32 let vdx: i64 = ndcx*1024/rl; let rdy: i64 = ndcy*1024/rl; let vdz: i64 = 1024*1024/rl 33 let rdx: i64 = (cy4*vdx + sy4*vdz)/4096; let rdz: i64 = (0-sy4*vdx + cy4*vdz)/4096 34 let col: i64 = sdf_shade_ray(base, rox, 0, roz, rdx, rdy, rdz, 176, 158, 138, misscol) 35 fb[y*RW+x] = col 36 x = x + 1 37 } 38 y = y + 1 39 } 40 return 0 41} 42// FR foot swing signature for a gait at peak phase (foot world-x minus hip world-x) 43func fr_sig(sk: i64, gait: i64) -> i64 { 44 quad_gait_pose_g(sk, 1024, gait); sk_update(sk) 45 let bf: *i64 = sk_bone(sk, QR_FRFOOT); let bh: *i64 = sk_bone(sk, QR_FRHIP) 46 return bf[15] - bh[15] 47} 48 49func main() -> i64 { 50 hw("=== nx_quad_gaits_gate -- walk/trot/gallop as data + horned creature (diversify the animal motion) ===\n" as *u8) 51 let base: i64 = sys_mmap(sdf_bytes()) as i64 52 let fb: *i64 = sys_mmap(RW*RH*8) as *i64 53 let sk: i64 = sys_mmap(sk_bytes()) as i64 54 quad_build(sk) 55 var fails: i64 = 0 56 57 // T1 gaits distinct via FR-foot phase 58 let gw: i64 = fr_sig(sk, 0) 59 let gt: i64 = fr_sig(sk, 1) 60 let gg: i64 = fr_sig(sk, 2) 61 hw(" FR-foot swing @peak: walk="); pn(gw); hw(" trot="); pn(gt); hw(" gallop="); pn(gg); hw("\n" as *u8) 62 var d_wg: i64 = gw - gg; if d_wg < 0 { d_wg = 0 - d_wg } 63 if d_wg > 150 { hw("T1 PASS gaits DISTINCT (walk vs gallop FR-phase differ by "); pn(d_wg); hw(")\n" as *u8) } 64 else { fails = fails + 1; hw("T1 FAIL gaits too similar ("); pn(d_wg); hw(")\n" as *u8) } 65 66 // T3 horns compose 67 quad_gait_pose_g(sk, 0, 0); sk_update(sk) 68 let nbody: i64 = quadpose_fill(base, sk) 69 let nhorn: i64 = quad_add_horns(base, nbody, sk) 70 if nhorn == nbody + 2 { hw("T3 PASS horns compose ("); pn(nbody); hw(" body + 2 horns = "); pn(nhorn); hw(" parts)\n" as *u8) } 71 else { fails = fails + 1; hw("T3 FAIL horns "); pn(nhorn); hw("\n" as *u8) } 72 73 // T2+T4 render gallop -> APNG, motion present 74 let apbuf: *u8 = sys_mmap(12*1024*1024) 75 let seq: *i64 = sys_mmap(8) as *i64 76 let nf: i64 = 8 77 var sum0: i64 = 0; var summid: i64 = 0 78 seq[0] = 0 79 var o: i64 = apng_open(apbuf, RW, RH, nf) 80 var f: i64 = 0 81 while f < nf { 82 quad_gait_pose_g(sk, f*4096/nf, 2); sk_update(sk) 83 quadpose_fill(base, sk) 84 gr_render(base, fb, 220) 85 if f == 0 { sum0 = cks(fb, RW*RH) } 86 if f == nf/2 { summid = cks(fb, RW*RH) } 87 var first: i64 = 0; if f == 0 { first = 1 } 88 o = apng_frame(apbuf, o, seq, fb, RW, RH, 6, first) 89 f = f + 1 90 } 91 o = apng_close(apbuf, o) 92 let fd: i64 = sys_openat_wr("knowledge/synth_gallop.png" as *u8, 0x1a4) 93 if fd >= 0 { sys_write(fd, apbuf, o); sys_close(fd) } 94 hw(" wrote knowledge/synth_gallop.png bytes="); pn(o); hw("\n" as *u8) 95 if sum0 != summid { hw("T2 PASS gallop produces motion\n" as *u8) } else { fails = fails + 1; hw("T2 FAIL no motion\n" as *u8) } 96 var t4: i64 = 1 97 if find4(apbuf, o, 97, 99, 84, 76) < 0 { t4 = 0 } 98 99 // horned trot render 100 seq[0] = 0 101 var o2: i64 = apng_open(apbuf, RW, RH, nf) 102 f = 0 103 while f < nf { 104 quad_gait_pose_g(sk, f*4096/nf, 1); sk_update(sk) 105 let nb: i64 = quadpose_fill(base, sk) 106 quad_add_horns(base, nb, sk) 107 gr_render(base, fb, 220) 108 var first2: i64 = 0; if f == 0 { first2 = 1 } 109 o2 = apng_frame(apbuf, o2, seq, fb, RW, RH, 6, first2) 110 f = f + 1 111 } 112 o2 = apng_close(apbuf, o2) 113 let fd2: i64 = sys_openat_wr("knowledge/synth_horncreature.png" as *u8, 0x1a4) 114 if fd2 >= 0 { sys_write(fd2, apbuf, o2); sys_close(fd2) } 115 hw(" wrote knowledge/synth_horncreature.png bytes="); pn(o2); hw("\n" as *u8) 116 if find4(apbuf, o2, 97, 99, 84, 76) < 0 { t4 = 0 } 117 if t4 == 1 { hw("T4 PASS both APNGs valid (gallop + horned trot)\n" as *u8) } else { fails = fails + 1; hw("T4 FAIL APNG invalid\n" as *u8) } 118 119 if fails == 0 { hw("QUAD-GAITS-GATE 4/4 GREEN -- walk/trot/gallop as data + horned creature, sovereign\n" as *u8); sys_exit(0); return 0 } 120 hw("QUAD-GAITS-GATE RED fails="); pn(fails); hw("\n" as *u8) 121 sys_exit(1); return 1 122}