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}