nx_resident_pose_cadence_gate_t122.nx source
↩ module page · 113 lines · 5425 B
1// Private simulation/presentation cadence qualification using the existing native owner.
2import "_hdl_build/nx_wasm_craft_residency_t44.nx"
3import "nx_gate_verdict.nx"
4func pc_key(a:*i64,o:i64,t:i64,qz:i64,qw:i64)->i64 {
5 a[o]=(t&NA_LANE_MASK)|((qz&NA_LANE_MASK)<<NA_LANE_B3)
6 a[o+1]=qw&NA_LANE_MASK
7 return 0
8}
9func pc_load(b:i64)->i64 {
10 let sk:*i64=(b+O_NXA_SKEL) as *i64
11 var i:i64=0
12 while i<NA_SKEL_W {sk[i]=0;i=i+1}
13 sk[NA_SKEL_TZ]=NA_ROOT_Z
14 let a:*i64=(b+O_NXA_ANIM) as *i64
15 a[0]=1;a[1]=0;a[2]=NA_CH2;a[3]=2
16 pc_key(a,4,0,0,NA_Q12);pc_key(a,6,1000,NA_Q12,0)
17 let p:*i64=(b+O_NXA_POSE) as *i64
18 p[0]=1;p[1]=0;p[2]=1;p[3]=0
19 p[4]=0;p[5]=0;p[6]=0;p[7]=NA_Q12;p[8]=0;p[9]=0;p[10]=0
20 return wc_nxa_ingest(b,1,8,11)
21}
22func pc_copy(a:*i64,b:*i64,n:i64)->i64 {var i:i64=0;while i<n {b[i]=a[i];i=i+1};return 0}
23func pc_eq(a:*i64,b:*i64,n:i64)->i64 {var i:i64=0;while i<n {if a[i]!=b[i] {return 0};i=i+1};return 1}
24func pc_run(b:i64,fps:i64,out:*i64,c:*i64)->i64 {
25 pc_load(b)
26 let aux:*i64=(b+O_MOBAUX) as *i64
27 let nd:*i64=(b+O_NEED) as *i64
28 let ms:*i64=(b+O_NXA_MOB) as *i64
29 let old:*i64=sys_mmap(64) as *i64
30 nd[WC_NEED_GAIT]=0
31 aux[0]=0;aux[1]=0
32 var t:i64=0
33 var changes:i64=0
34 var walking_changes:i64=0
35 var idle_changes:i64=0
36 var budget:i64=0
37 var reads:i64=0
38 var stable:i64=1
39 var lastiw:i64=0
40 pc_copy(wc_cast_rows(b,0,0) as *i64,old,8)
41 while t<180 {
42 // First idle, then walking, then idle. Native controller outputs are the fixture inputs.
43 aux[0]=0;aux[1]=0
44 if t>=60&&t<120 {aux[0]=WC_BREATH_CUT_Q8;nd[WC_NEED_GAIT]=nd[WC_NEED_GAIT]+WC_BREATH_CUT_Q8}
45 wc_cast_pose_tick(b)
46 budget=budget+fps
47 let iw:i64=ms[NXA_M_IW]
48 let adj:i64=ms[NXA_M_CTADJ]
49 while budget>=HG_TPS {
50 wc_cast_rows(b,0,1000)
51 if ms[NXA_M_IW]!=iw||ms[NXA_M_CTADJ]!=adj {stable=0}
52 budget=budget-HG_TPS;reads=reads+1
53 }
54 let rows:*i64=wc_cast_rows(b,0,0-1) as *i64
55 if pc_eq(rows,old,8)==0 {changes=changes+1;if t>=60&&t<120 {walking_changes=walking_changes+1};if t>=120 {idle_changes=idle_changes+1}}
56 pc_copy(rows,old,8)
57 if t==59 {out[10]=iw}
58 if t==119 {out[11]=iw}
59 lastiw=iw;t=t+1
60 }
61 pc_copy(old,out,8);out[8]=ms[NXA_M_IW];out[9]=ms[NXA_M_CTADJ]
62 gv_check("presentation dt cannot mutate blend state" as *u8,stable==1,c)
63 gv_check("authored walking clip produces changed rows" as *u8,walking_changes>0,c)
64 gv_check("return to idle produces changed rows" as *u8,idle_changes>0,c)
65 gv_check("blend enters idle exits for walking and returns" as *u8,out[10]>out[11]&&lastiw>out[11],c)
66 gv_kv("fps" as *u8,fps);gv_kv("presentation_reads" as *u8,reads)
67 gv_kv("walking_pose_changes" as *u8,walking_changes);gv_kv("idle_transition_pose_changes" as *u8,idle_changes)
68 gv_kv("first_idle_iw" as *u8,out[10]);gv_kv("walking_iw" as *u8,out[11]);gv_kv("final_idle_iw" as *u8,lastiw)
69 sys_munmap(old as *u8,64)
70 return changes
71}
72func main()->i64 {
73 let c:*i64=gv_ctr()
74 gv_head("RESIDENT-POSE-CADENCE-T122" as *u8)
75 let b:i64=sys_mmap(CRAFT_EXT_TOTAL) as i64
76 gv_check("empty asset tick is a no-op" as *u8,wc_cast_pose_tick(b)==0,c)
77 gv_check_eq("empty asset read refuses by named code" as *u8,wc_cast_rows(b,0,17),NXA_RC_NOT_LOADED,c)
78 init_impl(b,42)
79 gv_check("world initialized with resident actors" as *u8,en_count(mobp(b))>0,c)
80 gv_check_eq("actual ingest accepts keyed clip and authored identity pose" as *u8,pc_load(b),0,c)
81 let ref:*i64=sys_mmap(96) as *i64
82 let now:*i64=sys_mmap(96) as *i64
83 pc_run(b,0,ref,c)
84 pc_run(b,30,now,c);gv_check("30fps equals no-presentation simulation" as *u8,pc_eq(ref,now,12)==1,c)
85 pc_run(b,60,now,c);gv_check("60fps equals no-presentation simulation" as *u8,pc_eq(ref,now,12)==1,c)
86 pc_run(b,144,now,c);gv_check("144fps equals no-presentation simulation" as *u8,pc_eq(ref,now,12)==1,c)
87 let ms:*i64=(b+O_NXA_MOB) as *i64
88 let beforeiw:i64=ms[NXA_M_IW]
89 let beforeadj:i64=ms[NXA_M_CTADJ]
90 var i:i64=0
91 while i<144 {wc_cast_rows(b,0,0-999999);wc_cast_rows(b,0,999999);i=i+1}
92 gv_check("paused simulation and negative/huge legacy dt preserve pose" as *u8,ms[NXA_M_IW]==beforeiw&&ms[NXA_M_CTADJ]==beforeadj&&pc_eq(wc_cast_rows(b,0,0) as *i64,ref,8)==1,c)
93 gv_check("actor boundary refuses negative index" as *u8,wc_cast_rows(b,0-1,17)==NXA_RC_NO_MOB,c)
94 gv_check_eq("reload remains admitted" as *u8,pc_load(b),0,c)
95 gv_check("reload resets previous blend and clip adjustment" as *u8,ms[NXA_M_IW]==0&&ms[NXA_M_CTADJ]==0,c)
96 let aux:*i64=(b+O_MOBAUX) as *i64
97 aux[0]=0;aux[1]=0
98 wc_cast_pose_tick(b)
99 gv_check("resumed simulation advances idle blend" as *u8,ms[NXA_M_IW]>0,c)
100 pc_load(b)
101 let st:*i64=wst(b)
102 let bt:i64=st[S_T]
103 step_impl(b)
104 gv_check("actual step advances one simulation tick" as *u8,st[S_T]==bt+1,c)
105 var advanced:i64=0;i=0
106 while i<en_count(mobp(b))&&i<WC_CAST_N {if ms[i*NXA_MOB_W+NXA_M_IW]>0 {advanced=advanced+1};i=i+1}
107 gv_check("actual step composes resident pose update without draw" as *u8,advanced>0,c)
108 gv_kv("actors_advanced_without_draw" as *u8,advanced)
109 gv_check("invalid reingest rejects and unloads" as *u8,wc_nxa_ingest(b,0,8,11)!=0&&wc_cast_pose_tick(b)==0&&wc_cast_rows(b,0,17)==NXA_RC_NOT_LOADED,c)
110 gv_check_eq("valid reload recovers after refused ingest" as *u8,pc_load(b),0,c)
111 sys_munmap(ref as *u8,96);sys_munmap(now as *u8,96);sys_munmap(b as *u8,CRAFT_EXT_TOTAL)
112 return gv_verdict("RESIDENT-POSE-CADENCE-T122" as *u8,c,"Native deterministic fixture only; compiled pair and actual served authored character review remain required." as *u8)
113}