code wiki / _hdl_build / nx_newmoves_gate.nx
nx_newmoves_gate.nx source
↩ module page · 75 lines · 4323 B
1// nx_newmoves_gate.nx -- 4 NEW moves (clap/punch/bow/jumpingjack, ids 7-10) added to nx_movelib as DATA (the
2// operator's core ask: want a move that's not there -> build it). Proves each RENDERS, produces MOTION, and is
3// DISTINCT from the others. Writes knowledge/synth_move<id>.png (APNG). expect_exit:0 ORIGINAL
4import "nx_syscalls.nx"
5import "nx_figure_render.nx"
6import "nx_movelib.nx"
7import "nx_apng.nx"
8
9func hw(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 }
10func 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 }
11func 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 }
12func 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 }
13
14const GW: i64 = 96
15const GH: i64 = 72
16const NNEW: i64 = 4
17
18func main() -> i64 {
19 hw("=== nx_newmoves_gate -- clap/punch/bow/jumpingjack (ids 7-10), move-as-data ===\n" as *u8)
20 let sk: i64 = sys_mmap(sk_bytes()) as i64
21 let move: i64 = sys_mmap(move_bytes()) as i64
22 let fb: *i64 = sys_mmap(GW * GH * 8) as *i64
23 let zb: *i64 = sys_mmap(GW * GH * 8) as *i64
24 let apbuf: *u8 = sys_mmap(8 * 1024 * 1024)
25 let seq: *i64 = sys_mmap(8) as *i64
26 let sig: *i64 = sys_mmap(NNEW * 8) as *i64 // a mid-pose signature per move (wrist+ankle sum)
27 var fails: i64 = 0
28 var mv: i64 = 0
29 while mv < NNEW {
30 let id: i64 = 7 + mv
31 rig_build(sk)
32 move_gen(move, id)
33 let hp: *i64 = mv_hdr(move); let period: i64 = hp[1]
34 seq[0] = 0
35 var o: i64 = apng_open(apbuf, GW, GH, 8)
36 var sum0: i64 = 0; var summid: i64 = 0
37 var f: i64 = 0
38 while f < 8 {
39 let t: i64 = f * period / 8
40 move_pose_at(move, sk, t); sk_update(sk)
41 rig_draw(sk, fb, zb, GW, GH, md_deg(15), 66)
42 if f == 0 { sum0 = cks(fb, GW*GH) }
43 if f == 2 { summid = cks(fb, GW*GH) } // f2 hits the "together/up" keyframe (f0==f4 for these symmetric moves)
44 if f == 4 {
45 let bw: *i64 = sk_bone(sk, RG_WRR); let bh: *i64 = sk_bone(sk, RG_ELR); let bl: *i64 = sk_bone(sk, RG_WRL)
46 sig[mv] = bw[15]+bw[16]*7 + bh[15]*13 + bl[16]*17 // pose fingerprint
47 }
48 var first: i64 = 0; if f == 0 { first = 1 }
49 o = apng_frame(apbuf, o, seq, fb, GW, GH, 7, first)
50 f = f + 1
51 }
52 o = apng_close(apbuf, o)
53 var nm: *u8 = "knowledge/synth_move7.png" as *u8
54 if id == 8 { nm = "knowledge/synth_move8.png" as *u8 }
55 if id == 9 { nm = "knowledge/synth_move9.png" as *u8 }
56 if id == 10 { nm = "knowledge/synth_move10.png" as *u8 }
57 let fd: i64 = sys_openat_wr(nm, 0x1a4)
58 if fd >= 0 { sys_write(fd, apbuf, o); sys_close(fd) }
59 var okmove: i64 = 1
60 if sum0 == summid { okmove = 0 }
61 if find4(apbuf, o, 97, 99, 84, 76) < 0 { okmove = 0 } // acTL present
62 hw(" "); hw(move_name(id)); hw(" (id "); pn(id); hw("): "); hw(nm); hw(" "); pn(o); hw("B "); if okmove==1 { hw("[moves]") } else { fails=fails+1; hw("[STILL]") } hw("\n" as *u8)
63 mv = mv + 1
64 }
65 // distinctness: all 4 mid-pose signatures differ pairwise
66 var distinct: i64 = 0
67 var a: i64 = 0
68 while a < NNEW { var seen: i64 = 0; var b: i64 = 0; while b < a { if sig[b] == sig[a] { seen = 1 } b = b + 1 } if seen == 0 { distinct = distinct + 1 } a = a + 1 }
69 if distinct == NNEW { hw("T1 PASS all 4 new moves render + produce motion, "); pn(distinct); hw("/4 distinct poses\n" as *u8) }
70 else { fails = fails + 1; hw("T1 FAIL only "); pn(distinct); hw(" distinct\n" as *u8) }
71
72 if fails == 0 { hw("NEWMOVES-GATE GREEN -- library grew 6->10 moves (clap/punch/bow/jumpingjack), each move-as-data\n" as *u8); sys_exit(0); return 0 }
73 hw("NEWMOVES-GATE RED fails="); pn(fails); hw("\n" as *u8)
74 sys_exit(1); return 1
75}