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}