code wiki / (root) / nx_material_cast_candidate_t302.nx

nx_material_cast_candidate_t302.nx source

↩ module page · 53 lines · 2847 B

1import "nx_material_normal_shader_candidate_t301.nx" 2// Candidate composition over canonical cast IR; no copied shader or page. 3// The source deltas are reviewed separately before adoption. 4func mn_unique_var(m:*i64,name:*u8)->i64{ 5 var found:i64=0;var i:i64=1 6 while i<m[M_NCOUNT]{ 7 if sir_get(m,i,SIR_KIND)==S_VAR{if wg_name_is(m,i,name)==1{if found!=0{return 0};found=i}} 8 i=i+1 9 };return found 10} 11func mn_after(m:*i64,anchor:i64,body:i64)->i64{ 12 if anchor<=0||body<=0{return sir_refuse(m,"mapped material insertion missing")} 13 let head:i64=sir_get(m,body,SIR_B);let tail:i64=sir_get(m,body,SIR_D) 14 if head<=0||tail<=0{return sir_refuse(m,"mapped material insertion empty")} 15 sir_set(m,tail,SIR_NEXT,sir_get(m,anchor,SIR_NEXT));sir_set(m,anchor,SIR_NEXT,head);return 1 16} 17func mn_next_location(m:*i64,kind:i64)->i64{ 18 var d:i64=m[M_DECLH];var next:i64=0 19 while d!=0{if sir_get(m,d,SIR_KIND)==kind{let loc:i64=sir_get(m,d,SIR_A);if loc>=next{next=loc+1}};d=sir_get(m,d,SIR_NEXT)} 20 return next 21} 22func mn_cast_fs(m:*i64)->i64{ 23 shsrc_cast_fs_decls(m) 24 sir_vary(m,"vT",T_V4F,mn_next_location(m,K_VARY),0) 25 sir_uniform(m,"uNrmScale",T_F32,0) 26 shsrc_cast_fs_vxm(m);shsrc_cast_fs_vmarch(m);cs_material_unit_decl(m);cs_material_mapped_normal_decl(m) 27 if shsrc_cast_fs_main(m)<0{return -1} 28 let anchor:i64=mn_unique_var(m,"litN");if anchor==0{return sir_refuse(m,"unique lit normal missing")} 29 let body:i64=sir_node(m,K_FUNC,T_VOID,0,0,0,0) 30 let mapped:i64=sir_node(m,K_FUNC,T_VOID,0,0,0,0) 31 let tex:i64=ws_sw(m,sir_texsample(m,sir_ident(m,"uNrm",T_TEX2F),sir_ident(m,"vUV",T_V2F)),"xyz",T_V3F) 32 ws_st(m,mapped,sir_var(m,"litNormalTexel",T_V3F,tex)) 33 let decoded:i64=cs_normal_decode_rgb(m,cs_v3(m,"litNormalTexel"),cs_i(m,"uNrmEncoding")) 34 let n:i64=cs_material_mapped_call(m,cs_v3(m,"vN"),cs_v4(m,"vT"),decoded,cs_fl(m,"uNrmScale")) 35 ws_st(m,mapped,ws_set(m,cs_v3(m,"litN"),n)) 36 ws_st(m,body,ws_if(m,cs_ieq(m,"uNrmOn","1"),sir_get(m,mapped,SIR_B),0)) 37 if mn_after(m,anchor,body)<0{return -1} 38 if m[M_OVER]!=0||m[M_REFUSE]!=0{return -1};return 0 39} 40func mn_cast_vs(m:*i64)->i64{ 41 if shsrc_cast_vs(m)<0{return -1} 42 sir_attrib(m,"aT",T_V4F,mn_next_location(m,K_ATTRIB)) 43 sir_vary(m,"vT",T_V4F,mn_next_location(m,K_VARY),0) 44 let anchor:i64=mn_unique_var(m,"lyn");if anchor==0{return sir_refuse(m,"unique authored normal basis missing")} 45 let body:i64=sir_node(m,K_FUNC,T_VOID,0,0,0,0);cs_material_lbs_tangent(m,body) 46 if mn_after(m,anchor,body)<0{return -1} 47 var f:i64=m[M_FUNCH];var main:i64=0 48 while f!=0{if wg_name_is(m,f,"main")==1{main=f};f=sir_get(m,f,SIR_NEXT)} 49 if main==0{return sir_refuse(m,"cast main missing")} 50 let init:i64=ws_set(m,cs_v4(m,"vT"),ws_v4(m,ws_f(m,"0.0"),ws_f(m,"0.0"),ws_f(m,"0.0"),ws_f(m,"1.0"))) 51 sir_set(m,init,SIR_NEXT,sir_get(m,main,SIR_B));sir_set(m,main,SIR_B,init) 52 if m[M_OVER]!=0||m[M_REFUSE]!=0{return -1};return 0 53}