code wiki / (root) / nx_material_normal_shader_candidate_t301.nx

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}