nx_nxa_affine_palette_gate_t34.nx source
↩ module page · 40 lines · 3210 B
1import "nx_nxa_affine_palette_t34.nx"
2func main()->i64{
3 let bytes:i64=8769868;let input:*u8=sys_mmap(bytes);let state:*i64=sys_mmap(24) as *i64
4 if rc_read_file_into("/tmp/nx_bind_source_t29.fbx" as *u8,input,bytes,state)!=bytes||rc_complete(state)==0{return 2}
5 let scene:*FbxAffineScene=sys_mmap(__size_of(FbxAffineScene)) as *FbxAffineScene
6 if af_load(input,bytes,463784955,10125520,6,147,4893,scene)!=0{return 3}
7 let bind:*FbxBindScene=sys_mmap(__size_of(FbxBindScene)) as *FbxBindScene
8 bind.count=scene.count;bind.objects=sys_mmap(scene.count*__size_of(FbxBindObject)) as *FbxBindObject
9 var k:i64=0;while k<scene.count{let ob:*FbxBindObject=fbb_object(bind,k);ob.id=af_model(scene,k).id;ob.kind=FBB_MODEL;k=k+1}
10 if fbb_pose_models(input,bytes,bind)!=0{return 4}
11 let world:*i64=sys_mmap(scene.count*128) as *i64
12 let inverse:*i64=sys_mmap(128) as *i64;let palette:*i64=sys_mmap(128) as *i64;let normal:*i64=sys_mmap(72) as *i64;let report:*i64=sys_mmap(16) as *i64
13 var matched:i64=0;var max_bind:i64=0;var max_inverse:i64=0;var animated:i64=0;var max_normal:i64=0
14 k=0;while k<scene.count{let ob:*FbxBindObject=fbb_object(bind,k);if ob.matrix!=0{
15 let pose:*i64=ob.matrix as *i64
16 let rc:i64=af_inverse_bind(pose,inverse,65536,report)
17 if rc!=0{nb_text("inverse refused model=" as *u8);nb_num(ob.id);nb_text(" rc=" as *u8);nb_num(rc);nb_text("\n" as *u8);return 5}
18 if report[1]>max_inverse{max_inverse=report[1]}
19 if af_palette_matrix(pose,inverse,palette)!=0{return 6}
20 var j:i64=0;while j<16{var target:i64=0;if j%5==0{target=FBB_Q};let delta:i64=fq_abs(palette[j]-target);if delta>max_bind{max_bind=delta};j=j+1}
21 matched=matched+1
22 };k=k+1}
23 if matched==0||max_bind>1024{return 7}
24 var frame:i64=0;while frame<3{
25 if af_evaluate(scene,frame*28866348750,1,world,scene.count*16)!=0{return 8}
26 k=0;while k<scene.count{let ob:*FbxBindObject=fbb_object(bind,k);if ob.matrix!=0{
27 if af_inverse_bind(ob.matrix as *i64,inverse,65536,report)!=0{return 9}
28 if af_palette_matrix(((world as i64)+k*128) as *i64,inverse,palette)!=0{return 10}
29 let normal_rc:i64=af_normal_matrix(palette,normal,65536,report);if normal_rc!=0{nb_text("normal refused model=" as *u8);nb_num(ob.id);nb_text(" frame=" as *u8);nb_num(frame);nb_text(" rc=" as *u8);nb_num(normal_rc);nb_text(" residual=" as *u8);nb_num(report[1]);nb_text("\n" as *u8);return 11}
30 if report[1]>max_normal{max_normal=report[1]};animated=animated+1
31 };k=k+1};frame=frame+1}
32 // Singular normal transforms must not change caller output.
33 k=0;while k<16{palette[k]=0;k=k+1};normal[0]=717
34 if af_normal_matrix(palette,normal,65536,report)!=LA_AFFINE_SINGULAR||normal[0]!=717{return 12}
35 // Range refusal must also preserve caller output.
36 palette[0]=LA_AFFINE_MAX
37 if af_normal_matrix(palette,normal,65536,report)!=LA_AFFINE_RANGE||normal[0]!=717{return 13}
38 nb_text("PASS authored_bind_count=" as *u8);nb_num(matched);nb_text(" bind_identity_max_q20=" as *u8);nb_num(max_bind);nb_text(" inverse_residual_max_q30=" as *u8);nb_num(max_inverse);nb_text(" animated_palettes=" as *u8);nb_num(animated);nb_text(" normal_residual_max_q30=" as *u8);nb_num(max_normal);nb_text(" singular_and_range_output_preserved=1 playback=UNQUALIFIED\n" as *u8)
39 return 0
40}