code wiki / (root) / nx_gltf_pose_joints_candidate_t230.nx

nx_gltf_pose_joints_candidate_t230.nx source

↩ module page · 25 lines · 3527 B

1// Candidate additive pose observation; fold into existing pose writer after review. 2import "nx_gltf_rig_descriptor_candidate_t230.nx" 3func gltf_render_poses_with_joints(cx:*i64,animation:i64,skin:i64,position:i64,jointattr:i64,weightattr:i64,times:*i64,samples:i64,w:*i64)->i64{ 4 if samples<=0||(times as i64)<=0{return -1};let st:*i64=cx[5] as *i64;let count:i64=st[5];let sk:i64=gld_nth(cx,0,"skins",skin);if sk<0{return -1};let joints:i64=gli_array(cx,sk,"joints",0) 5 if count<=0||joints<=0||count>GLD_I64_MAX/368||joints>GLD_I64_MAX/128{return -1} 6 let need:i64=count*368;if joints*128>GLD_I64_MAX-need-GLD_VIEW_WORDS*24-72{return -1};let bytes:i64=need+joints*128+GLD_VIEW_WORDS*24+72 7 let mem:*u8=sys_mmap_try(bytes);if (mem as i64)==0{return -7};let parents:*i64=mem as *i64;let local:*i64=(mem as i64+count*8) as *i64;let world:*i64=(local as i64+count*128) as *i64;let done:*i64=(world as i64+count*128) as *i64;let trs:*i64=(done as i64+count*8) as *i64;let flags:*i64=(trs as i64+count*80) as *i64;let masks:*i64=(flags as i64+count*8) as *i64;let palette:*i64=(masks as i64+count*8) as *i64;let pv:*i64=(palette as i64+joints*128) as *i64;let jv:*i64=(pv as i64+GLD_VIEW_WORDS*8) as *i64;let wv:*i64=(jv as i64+GLD_VIEW_WORDS*8) as *i64;let vertex:*i64=(wv as i64+GLD_VIEW_WORDS*8) as *i64;let bounds:*i64=(vertex as i64+24) as *i64 8 var rc:i64=0 9 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||gld_parents(cx,count,parents)!=0{rc=-2} 10 gpd_s(w,"{");if gpd_source_identity(w,cx)!=0{sys_munmap_direct(mem,bytes);return -7};gpd_s(w,"\"schema\":\"nishi-native-discrete-lbs/1\",\"q\":");gpd_n(w,FBB_Q);gpd_s(w,",\"timeQ\":");gpd_n(w,VM_Q30);gpd_s(w,",\"animation\":");gpd_n(w,animation);gpd_s(w,",\"skin\":");gpd_n(w,skin);gpd_s(w,",\"samples\":[") 11 var sample:i64=0 12 while sample<samples&&rc==0{ 13 var i:i64=0;while i<count{flags[i]=gld_node_trs(cx,i,(trs as i64+i*80) as *i64,(local as i64+i*128) as *i64);if flags[i]<0{rc=-2;break};i=i+1};if rc!=0{break} 14 let channels:i64=gld_animate(cx,animation,times[sample],trs,count,masks);if channels<0{rc=-3;break} 15 i=0;while i<count{if flags[i]==0{if gld_trs_matrix((trs as i64+i*80) as *i64,(local as i64+i*128) as *i64)!=0{rc=-4;break}};i=i+1};if rc!=0{break} 16 if gld_world_matrices(count,parents,local,world,done)!=0||gld_skin_palette(cx,skin,world,count,palette,joints)!=joints{rc=-5;break} 17 if sample>0{gpd_s(w,",")};gpd_s(w,"{\"time\":");gpd_i(w,times[sample]);gpd_s(w,",\"channels\":");gpd_n(w,channels);gpd_s(w,",\"palette\":[");i=0 18 while i<joints*16{if i>0{gpd_s(w,",")};gpd_i(w,palette[i]);i=i+1};gpd_s(w,"],\"jointWorld\":[");i=0 19 while i<joints{let at:i64=gld_nth(cx,sk,"joints",i);let tok:*NxJsonTok=cx[2] as *NxJsonTok;glp_reset(tok,cx[0] as *u8,cx[1],at);let sourceNode:i64=gld_uint(tok);if sourceNode<0||sourceNode>=count{rc=-5;break};if i>0{gpd_s(w,",")};gpd_s(w,"[");var axis:i64=0;while axis<3{if axis>0{gpd_s(w,",")};gpd_i(w,world[sourceNode*16+12+axis]);axis=axis+1};gpd_s(w,"]");i=i+1};if rc!=0{break};gpd_s(w,"],\"bounds\":[") 20 i=0;while i<pv[1]{if gld_skin_vertex(cx,pv,jv,wv,i,palette,joints,vertex)!=0{rc=-6;break};var k:i64=0;while k<3{if i==0||vertex[k]<bounds[k]{bounds[k]=vertex[k]};if i==0||vertex[k]>bounds[k+3]{bounds[k+3]=vertex[k]};k=k+1};i=i+1};if rc!=0{break} 21 i=0;while i<6{if i>0{gpd_s(w,",")};gpd_i(w,bounds[i]);i=i+1};gpd_s(w,"]}");sample=sample+1 22 } 23 gpd_s(w,"]}");sys_munmap_direct(mem,bytes);if w[3]!=0{return -3};return rc 24} 25