code wiki / (root) / nx_nxa_affine_palette_gate_t34.nx

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}