nx_gltf_skin_bounds_pack_t321.nx source
↩ module page · 19 lines · 2315 B
1// GPB1: conservative influence boxes from the qualified native full-geometry packet.
2// Retains source weights unchanged. Zero-sum vertices are refused rather than silently normalized.
3import "nx_gltf_render_descriptor_candidate_t181.nx"
4import "nx_atomic_rewrite.nx"
5import "nx_itoa_lib.nx"
6const GBP_HEADER:i64=10
7const GBP_RECORD:i64=7
8const GBP_VERTEX:i64=11
9const GBP_MAGIC:i64=0x47504231
10func gltf_skin_bounds_pack(g:*i64,vertices:i64,joints:i64,result:*i64)->i64{
11 result[0]=0;result[1]=0;if vertices<1||joints<1||joints>(GLD_I64_MAX/8-GBP_HEADER)/GBP_RECORD||vertices>GLD_I64_MAX/88{return -1}
12 let words:i64=GBP_HEADER+joints*GBP_RECORD;let p:*i64=sys_mmap_try(words*8) as *i64;if (p as i64)==0{return -7};var i:i64=0;while i<words{p[i]=0;i=i+1}
13 p[0]=GBP_MAGIC;p[1]=1;p[2]=joints;p[3]=FBB_Q;p[4]=VM_Q30;p[5]=GLD_I64_MAX
14 var rc:i64=0;i=0;while i<vertices&&rc==0{var a:i64=0;while a<3{var v:i64=g[i*GBP_VERTEX+a];if v<0-GLD_I64_MAX{rc=-2;break};if v<0{v=0-v};if v>p[7+a]{p[7+a]=v};a=a+1};var sum:i64=0;var k:i64=0;while k<4&&rc==0{let joint:i64=g[i*GBP_VERTEX+3+k];let w:i64=g[i*GBP_VERTEX+7+k];if joint<0||joint>=joints||w<0||w>VM_Q30{rc=-1;break};sum=sum+w;if w>0{let off:i64=GBP_HEADER+joint*GBP_RECORD;a=0;while a<3{let v:i64=g[i*GBP_VERTEX+a];if p[off]==0||v<p[off+1+a]{p[off+1+a]=v};if p[off]==0||v>p[off+4+a]{p[off+4+a]=v};a=a+1};p[off]=1};k=k+1};if sum==0{rc=-3};if sum<p[5]{p[5]=sum};if sum>p[6]{p[6]=sum};i=i+1}
15 if rc!=0{sys_munmap_direct(p as *u8,words*8);return rc};result[0]=p as i64;result[1]=words;return 0
16}
17func main(argc:i64,argv:*i64)->i64{
18 if argc!=4{return 2};let ln:*i64=sys_mmap(8) as *i64;let src:*u8=sys_read_file(argv[1] as *u8,ln);if (src as i64)==0{return 3};if ln[0]<=0||ln[0]%88!=0{return 4};let js:*u8=argv[3] as *u8;var joints:i64=0;var i:i64=0;while js[i]!=(0 as u8){let c:i64=js[i] as i64;if c<48||c>57||joints>(GLD_I64_MAX-(c-48))/10{return 4};joints=joints*10+c-48;i=i+1};let result:*i64=sys_mmap(16) as *i64;let rc:i64=gltf_skin_bounds_pack(src as *i64,ln[0]/88,joints,result);if rc!=0{return 5};let p:*i64=result[0] as *i64;if atomic_rewrite_checked(argv[2] as *u8,p as *u8,result[1]*8)!=0{return 6};sys_write(1,"INFLUENCE_BOUNDS_PACK_OK words=",29);nxi_out(result[1]);sys_write(1,"\n",1);sys_munmap_direct(p as *u8,result[1]*8);sys_free_file(src,ln[0]);return 0
19}