code wiki / (root) / nx_nxa_affine_bake_gate_t35.nx

nx_nxa_affine_bake_gate_t35.nx source

↩ module page · 59 lines · 4982 B

1// Real Knight AFM1 bake + decoded consumer qualification, private artifact. 2import "nx_nxa_affine_asset_t35.nx" 3func main()->i64{ 4 let fn:i64=8769868;let n:i64=11279224;let fb:*u8=sys_mmap(fn);let asset:*u8=sys_mmap(n);let state:*i64=sys_mmap(24) as *i64 5 if rc_read_file_into("/tmp/nx_bind_source_t29.fbx" as *u8,fb,fn,state)!=fn||rc_complete(state)==0{return 2} 6 if rc_read_file_into("/tmp/nx_bind_bounded_t29.nxa" as *u8,asset,n,state)!=n||rc_complete(state)==0{return 3} 7 let sk:i64=nxa_counted_section(asset,n,nxa_tag4("SKEL" as *u8),8);let vs:i64=nxa_counted_section(asset,n,nxa_tag4("VERT" as *u8),3) 8 let skin:i64=nxa_counted_section(asset,n,nxa_tag4("SKIN" as *u8),8);if sk<0||vs<0||skin<0{return 4} 9 let ah:*i64=asset as *i64;let nj:i64=ah[sk];if nj!=113||ah[skin]!=ah[vs]{return 5} 10 let scene:*FbxAffineScene=sys_mmap(__size_of(FbxAffineScene)) as *FbxAffineScene 11 if af_load(fb,fn,463784955,10125520,6,147,4893,scene)!=0{return 6} 12 let mapping:*i64=sys_mmap(nj*8) as *i64;let ids:*i64=sys_mmap(nj*8) as *i64;let node:*i64=sys_mmap(FBXC_OUTN*8) as *i64 13 var ji:i64=0;var i:i64=0;let big:i64=fbxc_big(fbxc_version(fb,fn)) 14 while i<scene.graph.count{let object:*FbxClipObject=fc_object(scene.graph,i);if object.kind==FC_MODEL{ 15 if fbb_node(fb,fn,object.offset,fn,big,node)!=1{return 7} 16 let po:i64=node[FBXC_PROPSOFF];let pe:i64=po+node[FBXC_PLEN];let subtype:i64=po+9+fbb_property_size(fb,po+9,pe) 17 if fbb_string(fb,subtype,pe,"LimbNode" as *u8)==1{ 18 if ji>=nj{return 8};mapping[ji]=af_find(scene,object.id);ids[ji]=object.id;if mapping[ji]<0{return 9};ji=ji+1} 19 };i=i+1} 20 if ji!=nj{return 10} 21 // Retained SKEL order must agree with the source joint encounter and parent relation. 22 i=0;while i<nj{let parent:i64=af_model(scene,mapping[i]).parent;var found:i64=0-1;var j:i64=0;while j<nj{if mapping[j]==parent{found=j};j=j+1} 23 if ah[sk+1+i*8]!=found{return 11};i=i+1} 24 let bind:*FbxBindScene=sys_mmap(__size_of(FbxBindScene)) as *FbxBindScene 25 bind.count=scene.count;bind.objects=sys_mmap(scene.count*__size_of(FbxBindObject)) as *FbxBindObject 26 i=0;while i<scene.count{let ob:*FbxBindObject=fbb_object(bind,i);ob.id=af_model(scene,i).id;ob.kind=FBB_MODEL;i=i+1} 27 if fbb_pose_models(fb,fn,bind)!=0{return 12} 28 let inverses:*i64=sys_mmap(nj*128) as *i64;let report:*i64=sys_mmap(16) as *i64 29 i=0;while i<nj{let pose:*i64=fbb_object(bind,mapping[i]).matrix as *i64;if (pose as i64)==0{return 13} 30 if af_inverse_bind(pose,((inverses as i64)+i*128) as *i64,65536,report)!=0{return 14};i=i+1} 31 let frames:i64=51;let frame_ticks:i64=AFM_TICKS_SECOND/40 32 let words:i64=AFM_HEADER+nj+frames*(1+nj*AFM_COEFF);let payload:*i64=sys_mmap(words*8) as *i64 33 let unit:i64=fbxc_unit_scale_micro(fb,fn);if unit!=1000000{return 15} 34 payload[0]=AFM_VERSION;payload[1]=463784955;payload[2]=nj;payload[3]=frames;payload[4]=AFM_TICKS_SECOND;payload[5]=unit/1000;payload[6]=1;payload[7]=1 35 i=0;while i<nj{payload[AFM_HEADER+i]=ids[i];i=i+1} 36 let world:*i64=sys_mmap(scene.count*128) as *i64;let palette:*i64=sys_mmap(128) as *i64 37 var frame:i64=0;while frame<frames{ 38 if af_evaluate(scene,frame*frame_ticks,1,world,scene.count*16)!=0{return 16} 39 let at:i64=AFM_HEADER+nj+frame*(1+nj*AFM_COEFF);payload[at]=frame*frame_ticks 40 i=0;while i<nj{ 41 if af_palette_matrix(((world as i64)+mapping[i]*128) as *i64,((inverses as i64)+i*128) as *i64,palette)!=0{return 17} 42 var c:i64=0;while c<4{var r:i64=0;while r<3{var v:i64=palette[c*4+r];if c==3{v=v*payload[5]};payload[at+1+i*AFM_COEFF+c*3+r]=v;r=r+1};c=c+1};i=i+1 43 };frame=frame+1} 44 if afm_validate(payload,words,nj)!=0{return 18} 45 let cap:i64=n+32+words*8;let output:*u8=sys_mmap(cap) 46 if afm_append(asset,n,payload,words,output,cap)!=cap{return 19} 47 let e:i64=nxa_section_entry(output,cap,nxa_tag4("AFM1" as *u8));if e<0{return 20} 48 let h:*i64=output as *i64;let decoded:*i64=((output as i64)+h[e+1]) as *i64 49 let sampled:*i64=sys_mmap(nj*128) as *i64;let normals:*i64=sys_mmap(72) as *i64 50 frame=0;var qualified:i64=0 51 while frame<frames{if afm_sample(decoded,h[e+2],nj,frame*frame_ticks,sampled,nj*16)!=0{return 21} 52 i=0;while i<nj{if af_normal_matrix(((sampled as i64)+i*128) as *i64,normals,65536,report)!=0{return 22};qualified=qualified+1;i=i+1};frame=frame+1} 53 // Every preexisting section remains byte-identical, including skin influence weights. 54 i=0;while i<ah[2]{let old:i64=4+i*4;let now:i64=nxa_section_entry(output,cap,ah[old]);if now<0||h[now+2]!=ah[old+2]{return 23} 55 var j:i64=0;while j<ah[old+2]*8{if output[h[now+1]+j]!=asset[ah[old+1]+j]{return 24};j=j+1};i=i+1} 56 let saved:i64=nb_save_new("/tmp/dark-knight-affine-walk-t35.nxa" as *u8,output,cap);if saved!=cap{return 25} 57 nb_text("PASS AFM1 version=1 joints=" as *u8);nb_num(nj);nb_text(" frames=" as *u8);nb_num(frames);nb_text(" decoded_normal_transforms=" as *u8);nb_num(qualified);nb_text(" bytes=" as *u8);nb_num(cap);nb_text(" preserved_sections=" as *u8);nb_num(ah[2]);nb_text(" source_step_ms=25 interpolation=LINEAR_AFFINE playback=UNQUALIFIED\n" as *u8) 58 return 0 59}