nx_gltf_fullclip_bounds_gate_t321.nx source
↩ module page · 39 lines · 4608 B
1// Arbitrary-time native reference for full authored clip evaluator qualification.
2import "nx_gltf_render_descriptor_candidate_t181.nx"
3import "nx_atomic_rewrite.nx"
4import "nx_itoa_lib.nx"
5func gcp_reference_poses(cx:*i64,animation:i64,skin:i64,position:i64,jointattr:i64,weightattr:i64,times:*i64,samples:i64,w:*i64)->i64{
6 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)
7 if count<=0||joints<=0||count>GLD_I64_MAX/368||joints>GLD_I64_MAX/128{return -1}
8 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
9 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
10 var rc:i64=0
11 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}
12 gpd_s(w,"{");if gpd_source_identity(w,cx)!=0{sys_munmap_direct(mem,bytes);return -7};gpd_s(w,"\"schema\":\"nishi-native-palette-bounds-reference/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\":[")
13 var sample:i64=0
14 while sample<samples&&rc==0{
15 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}
16 let channels:i64=gld_animate(cx,animation,times[sample],trs,count,masks);if channels<0{rc=-3;break}
17 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}
18 if gld_world_matrices(count,parents,local,world,done)!=0||gld_skin_palette(cx,skin,world,count,palette,joints)!=joints{rc=-5;break}
19 i=0;while i<pv[1]{if gld_skin_vertex(cx,pv,jv,wv,i,palette,joints,vertex)!=0{rc=-6;break};var axis:i64=0;while axis<3{if i==0||vertex[axis]<bounds[axis]{bounds[axis]=vertex[axis]};if i==0||vertex[axis]>bounds[axis+3]{bounds[axis+3]=vertex[axis]};axis=axis+1};i=i+1};if rc!=0{break}
20 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
21 while i<joints*16{if i>0{gpd_s(w,",")};gpd_i(w,palette[i]);i=i+1};gpd_s(w,"],\"jointWorld\":[");i=0
22 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,"],\"bounds6\":[");i=0;while i<6{if i>0{gpd_s(w,",")};gpd_i(w,bounds[i]);i=i+1};gpd_s(w,"],\"vertices\":");gpd_n(w,pv[1]);gpd_s(w,"}");sample=sample+1
23 }
24 gpd_s(w,"]}");sys_munmap_direct(mem,bytes);if w[3]!=0{return -3};return rc
25}
26func main(argc:i64,argv:*i64)->i64{
27 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}
28 let cx:*i64=sys_mmap(GLD_CONTEXT_WORDS*8) as *i64;if gltf_view_open(src,ln[0],cx)!=0{return 4}
29 let w:*i64=sys_mmap(32) as *i64;var i:i64=0;while i<4{w[i]=0;i=i+1}
30 let times:*i64=sys_mmap(40) as *i64
31 let duration:i64=1252698752 // Exact retained Tifa source accessor endpoint, Q30 seconds.
32 times[0]=duration*3/7
33 if gcp_reference_poses(cx,0,0,0,1,2,times,1,w)!=0{return 5}
34 let n:i64=w[2];let out:*u8=sys_mmap_try(n);if (out as i64)==0{return 6};w[0]=out as i64;w[1]=n;w[2]=0;w[3]=0
35 if gcp_reference_poses(cx,0,0,0,1,2,times,1,w)!=0||w[2]!=n{return 7}
36 if atomic_rewrite_checked(argv[2] as *u8,out,n)!=0{return 8}
37 sys_write(1,"FULL_CLIP_NATIVE_WITNESSES bytes=",32);nxi_out(n);sys_write(1,"\n",1)
38 gltf_view_close(cx);sys_free_file(src,ln[0]);sys_munmap_direct(out,n);return 0
39}