nx_material_normal_shader_candidate_t301.nx source
↩ module page · 34 lines · 2585 B
1// Candidate additions to existing nx_cast_shader_src.nx; not a second renderer.
2import "nx_wgsl.nx"
3// Input tangent is already posed; xyz is orthogonalized to inverse-transpose normal,
4// w includes source UV handedness and sign of the linear pose determinant.
5func cs_material_mapped_normal_decl(m:*i64)->i64{
6 let f:i64=sir_func(m,"materialMappedNormal",T_V3F)
7 sir_param(m,f,"normal",T_V3F);sir_param(m,f,"tangent",T_V4F)
8 sir_param(m,f,"decoded",T_V3F);sir_param(m,f,"scale",T_F32)
9 ws_st(m,f,sir_var(m,"frameN",T_V3F,ws_c1(m,"materialUnit",cs_v3(m,"normal"),T_V3F)))
10 let orthogonal:i64=cs_v3sub(m,cs_xyz(m,"tangent"),cs_v3mul(m,cs_v3(m,"frameN"),cs_dot(m,cs_v3(m,"frameN"),cs_xyz(m,"tangent"))))
11 ws_st(m,f,sir_var(m,"frameT",T_V3F,ws_c1(m,"materialUnit",orthogonal,T_V3F)))
12 ws_st(m,f,sir_var(m,"frameB",T_V3F,cs_v3mul(m,cs_cross(m,cs_v3(m,"frameN"),cs_v3(m,"frameT")),cs_sx4(m,"tangent","w"))))
13 let x:i64=cs_v3mul(m,cs_v3(m,"frameT"),cs_fmul(m,cs_sx3(m,"decoded","x"),cs_fl(m,"scale")))
14 let y:i64=cs_v3mul(m,cs_v3(m,"frameB"),cs_fmul(m,cs_sx3(m,"decoded","y"),cs_fl(m,"scale")))
15 let z:i64=cs_v3mul(m,cs_v3(m,"frameN"),cs_sx3(m,"decoded","z"))
16 ws_st(m,f,sir_return(m,ws_c1(m,"materialUnit",cs_v3add(m,cs_v3add(m,x,y),z),T_V3F)));return f
17}
18// Emits into cs_lbs_slice only after lc0..2 and ldet are available.
19func cs_material_lbs_tangent(m:*i64,f:i64)->i64{
20 let x:i64=cs_v3mul(m,cs_xyz(m,"lc0"),cs_sx4(m,"aT","x"))
21 let y:i64=cs_v3mul(m,cs_xyz(m,"lc1"),cs_sx4(m,"aT","y"))
22 let z:i64=cs_v3mul(m,cs_xyz(m,"lc2"),cs_sx4(m,"aT","z"))
23 ws_st(m,f,sir_var(m,"lt",T_V3F,cs_v3add(m,cs_v3add(m,x,y),z)))
24 ws_st(m,f,sir_var(m,"lyt",T_V3F,sir_select(m,cs_ieq(m,"uAssetBasis","1"),cs_v3(m,"lt"),cs_yup(m,"lt"),T_V3F)))
25 let hand:i64=cs_fmul(m,cs_sx4(m,"aT","w"),ws_c1(m,"sign",cs_fl(m,"ldet"),T_F32))
26 ws_st(m,f,ws_set(m,cs_v4(m,"vT"),ws_vt2(m,T_V4F,cs_yaw(m,"lyt"),hand)));return 0
27}
28func cs_material_mapped_call(m:*i64,normal:i64,tangent:i64,decoded:i64,scale:i64)->i64{
29 if normal<=0||tangent<=0||decoded<=0||scale<=0{sir_refuse(m,"mapped normal missing input");return 0}
30 if normal>=m[M_NCOUNT]||tangent>=m[M_NCOUNT]||decoded>=m[M_NCOUNT]||scale>=m[M_NCOUNT]{sir_refuse(m,"mapped normal input outside module");return 0}
31 if sir_get(m,normal,SIR_TY)!=T_V3F||sir_get(m,tangent,SIR_TY)!=T_V4F||sir_get(m,decoded,SIR_TY)!=T_V3F||sir_get(m,scale,SIR_TY)!=T_F32{sir_refuse(m,"mapped normal input type mismatch");return 0}
32 let call:i64=sir_call(m,"materialMappedNormal",T_V3F)
33 sir_arg(m,call,normal);sir_arg(m,call,tangent);sir_arg(m,call,decoded);sir_arg(m,call,scale);return call
34}