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}