code wiki / (root) / nx_hairdyn_pose_batch_gate_t284.nx

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}