code wiki / (root) / nx_gltf_skin_geometry_pack_t321.nx

nx_gltf_skin_geometry_pack_t321.nx source

↩ module page · 16 lines · 2468 B

1// Native source-geometry packet for the existing authored palette evaluator. 2import "nx_gltf_render_descriptor_candidate_t181.nx" 3import "nx_atomic_rewrite.nx" 4import "nx_itoa_lib.nx" 5func gltf_skin_geometry_pack(cx:*i64,position:i64,jointattr:i64,weightattr:i64,joints:i64,result:*i64)->i64{ 6 result[0]=0;result[1]=0;let st:*i64=cx[5] as *i64;let views:*i64=sys_mmap(GLD_VIEW_WORDS*24) as *i64;let pv:*i64=views;let jv:*i64=(pv as i64+GLD_VIEW_WORDS*8) as *i64;let wv:*i64=(jv as i64+GLD_VIEW_WORDS*8) as *i64;var rc:i64=0 7 if gltf_accessor_view(cx,position,st[2],pv)!=0||gltf_accessor_view(cx,jointattr,st[2],jv)!=0||gltf_accessor_view(cx,weightattr,st[2],wv)!=0{rc=-1} 8 if rc==0{if pv[3]!=5126||pv[5]!=3||jv[5]!=4||wv[5]!=4||wv[3]!=5126||pv[1]!=jv[1]||pv[1]!=wv[1]||pv[1]<1||pv[1]>GLD_I64_MAX/88||joints<1{rc=-1};if jv[3]!=5121&&jv[3]!=5123{rc=-1}} 9 if rc!=0{sys_munmap_direct(views as *u8,GLD_VIEW_WORDS*24);return rc} 10 let count:i64=pv[1];let out:*i64=sys_mmap_try(count*88) as *i64;if (out as i64)==0{sys_munmap_direct(views as *u8,GLD_VIEW_WORDS*24);return -7} 11 let bin:*u8=cx[8] as *u8;var i:i64=0;while i<count&&rc==0{var k:i64=0;while k<3{rc=gld_view_float(cx,pv,i,k,FBB_Q,(out as i64+(i*11+k)*8) as *i64);if rc!=0{break};k=k+1};k=0;while k<4&&rc==0{let at:i64=jv[0]+i*jv[2]+k*jv[4];var joint:i64=bin[at] as i64;if jv[3]==5123{joint=joint+(bin[at+1] as i64)*256};if joint<0||joint>=joints{rc=-1;break};out[i*11+3+k]=joint;rc=gld_view_float(cx,wv,i,k,VM_Q30,(out as i64+(i*11+7+k)*8) as *i64);if rc==0{if out[i*11+7+k]<0||out[i*11+7+k]>VM_Q30{rc=-1}};k=k+1};i=i+1} 12 sys_munmap_direct(views as *u8,GLD_VIEW_WORDS*24);if rc!=0{sys_munmap_direct(out as *u8,count*88);return rc};result[0]=out as i64;result[1]=count;return 0 13} 14func main(argc:i64,argv:*i64)->i64{ 15 if argc!=3{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};let cx:*i64=sys_mmap(GLD_CONTEXT_WORDS*8) as *i64;if gltf_view_open(src,ln[0],cx)!=0{return 4};let sk:i64=gld_nth(cx,0,"skins",0);if sk<0{return 5};let joints:i64=gli_array(cx,sk,"joints",0);let result:*i64=sys_mmap(16) as *i64;if gltf_skin_geometry_pack(cx,0,1,2,joints,result)!=0{return 6};if atomic_rewrite_checked(argv[2] as *u8,result[0] as *u8,result[1]*88)!=0{return 7};sys_write(1,"SKIN_GEOMETRY_PACK_OK vertices=",30);nxi_out(result[1]);sys_write(1,"\n",1);sys_munmap_direct(result[0] as *u8,result[1]*88);gltf_view_close(cx);sys_free_file(src,ln[0]);return 0 16}