nx_hairdyn_pose_batch_gate_t284.nx source
↩ module page · 44 lines · 3192 B
1import "nx_hairdyn_pose_batch_candidate_t284.nx"
2import "nx_hairdyn_lib.nx"
3import "nx_gate_verdict.nx"
4func hp_seat(st:*i64,rest:*i64,n:i64)->i64 {
5 var i:i64=0
6 while i<n {
7 let b:i64=i*SD_STRIDE;let r:i64=(i+1)*3
8 st[b]=rest[r];st[b+1]=rest[r+1];st[b+2]=rest[r+2]
9 st[b+3]=0;st[b+4]=0;st[b+5]=0;i=i+1
10 }
11 return 0
12}
13
14func main()->i64{
15 let ctr:*i64=gv_ctr();gv_head("posed guide batch composition" as *u8)
16 let rest:*i64=sys_mmap(48*8) as *i64
17 rest[0]=5937*SD_Q8;rest[1]=5160*SD_Q8;rest[2]=159683*SD_Q8;rest[3]=4851*SD_Q8;rest[4]=5818*SD_Q8;rest[5]=157344*SD_Q8;rest[6]=4320*SD_Q8;rest[7]=6311*SD_Q8;rest[8]=153526*SD_Q8;rest[9]=4376*SD_Q8;rest[10]=6311*SD_Q8;rest[11]=148302*SD_Q8;rest[12]=3917*SD_Q8;rest[13]=6311*SD_Q8;rest[14]=141772*SD_Q8;rest[15]=4138*SD_Q8;rest[16]=6311*SD_Q8;rest[17]=133936*SD_Q8;rest[18]=4414*SD_Q8;rest[19]=6311*SD_Q8;rest[20]=124794*SD_Q8;rest[21]=3700*SD_Q8;rest[22]=6311*SD_Q8;rest[23]=114346*SD_Q8
18 var i:i64=0
19 while i<24{rest[24+i]=rest[i];i=i+1}
20 let st:*i64=hd_alloc(14);let ref:*i64=hd_alloc(7);let scratch:*i64=sys_mmap(24) as *i64
21 hp_seat(st,rest,7);hp_seat(((st as i64)+42*8) as *i64,((rest as i64)+24*8) as *i64,7)
22 let radius:i64=vm_isqrt((rest[3]-rest[0])*(rest[3]-rest[0])+(rest[4]-rest[1])*(rest[4]-rest[1])+(rest[5]-rest[2])*(rest[5]-rest[2]))/4
23 let caps:*i64=sys_mmap(56) as *i64
24 caps[0]=rest[3];caps[1]=rest[4];caps[2]=rest[5];caps[3]=rest[3];caps[4]=rest[4];caps[5]=rest[5];caps[6]=radius
25 hp_seat(ref,rest,7)
26 let one:i64=hd_tick_posed_collide(ref,7,rest,SB_K_HAIR,SB_C_HAIR,SB_MAXD_HAIR,caps,1,scratch)
27 let count:i64=hd_tick_batch_posed_collide(st,84,rest,48,2,7,SB_K_HAIR,SB_C_HAIR,SB_MAXD_HAIR,caps,7,1,scratch,3)
28 gv_check_eq("batch contacts equal independent calls" as *u8,count,one*2,ctr)
29 var err:i64=0;i=0
30 while i<42{if st[i]!=ref[i]{err=err+1};if st[42+i]!=ref[i]{err=err+1};i=i+1}
31 gv_check_eq("all position and velocity words equal" as *u8,err,0,ctr)
32 let before:i64=st[0]
33 gv_check_eq("short state rejected" as *u8,hd_tick_batch_posed_collide(st,83,rest,48,2,7,1,1,1,caps,7,1,scratch,3),0-2,ctr)
34 gv_check_eq("short pose rejected" as *u8,hd_tick_batch_posed_collide(st,84,rest,47,2,7,1,1,1,caps,7,1,scratch,3),0-2,ctr)
35 gv_check_eq("short capsule rejected" as *u8,hd_tick_batch_posed_collide(st,84,rest,48,2,7,1,1,1,caps,6,1,scratch,3),0-2,ctr)
36 gv_check_eq("short scratch rejected" as *u8,hd_tick_batch_posed_collide(st,84,rest,48,2,7,1,1,1,caps,7,1,scratch,2),0-2,ctr)
37 gv_check_eq("zero segments rejected before division" as *u8,hd_tick_batch_posed_collide(st,84,rest,48,2,0,1,1,1,caps,7,1,scratch,3),0-1,ctr)
38 gv_check_eq("null state rejected" as *u8,hd_tick_batch_posed_collide(0 as *i64,84,rest,48,2,7,1,1,1,caps,7,1,scratch,3),0-3,ctr)
39 gv_check_eq("empty batch does no work" as *u8,hd_tick_batch_posed_collide(0 as *i64,0,0 as *i64,0,0,7,1,1,1,0 as *i64,0,0,0 as *i64,0),0,ctr)
40 err=0;i=0
41 while i<42{if st[i]!=ref[i]{err=err+1};if st[42+i]!=ref[i]{err=err+1};i=i+1}
42 gv_check_eq("invalid inputs preserve all state words" as *u8,err,0,ctr)
43 return gv_verdict("nx_hairdyn_pose_batch_gate_t284" as *u8,ctr,"batch matches existing single solver; real guide fixture, no anatomical or runtime-contact claim" as *u8)
44}