nx_cast_hair_guide_lookup_t263.nx source
↩ module page · 50 lines · 3546 B
1// Additive compact-guide shader expressions for existing cast source.
2// uGD schema: texel0=(width,nodes,subdivisions,-1); texel1=(verticesPerChild,
3// verticesPerGuide,guides,instances). Following texels are bind-space deltas,
4// instance-major then guide then node. Admission owns dimensions and extents.
5func csg_rem(m:*i64,a:i64,b:i64)->i64{return ws_bin(m,"%" as *u8,a,b,T_I32)}
6func csg_add(m:*i64,q:i64,n:*u8,t:i64,e:i64)->i64{return ws_q2(m,q,sir_var(m,n,t,e))}
7func csg_load(m:*i64,index:i64,width:i64)->i64{
8 let xy:i64=ws_vt2(m,T_V2I,csg_rem(m,index,width),cs_idiv(m,index,width))
9 return cs_xyz_load(m,sir_texload(m,sir_ident(m,"uGD" as *u8,T_TEX2F),xy,ws_i(m,"0" as *u8)))
10}
11func cs_xyz_load(m:*i64,e:i64)->i64{return ws_sw(m,e,"xyz" as *u8,T_V3F)}
12func cs_hair_guide_branch(m:*i64,legacy:i64)->i64{
13 let zero:i64=ws_i(m,"0" as *u8)
14 let hdr:i64=sir_texload(m,sir_ident(m,"uGD" as *u8,T_TEX2F),ws_vt2(m,T_V2I,zero,zero),zero)
15 var all:i64=csg_add(m,0,"hgM",T_V4F,hdr)
16 let width:i64=cs_i32(m,cs_sx4(m,"hgM","x"))
17 let nodes:i64=cs_i32(m,cs_sx4(m,"hgM","y"))
18 let sub:i64=cs_i32(m,cs_sx4(m,"hgM","z"))
19 var q:i64=0
20 let mh:i64=sir_texload(m,sir_ident(m,"uGD",T_TEX2F),ws_vt2(m,T_V2I,ws_i(m,"1"),zero),zero)
21 q=csg_add(m,q,"hgL",T_V4F,mh)
22 let vertex:i64=sir_builtin(m,"vertex_index",T_I32)
23 q=csg_add(m,q,"hgV",T_I32,csg_rem(m,vertex,cs_i32(m,cs_sx4(m,"hgL","x"))))
24 q=csg_add(m,q,"hgG",T_I32,cs_idiv(m,cs_i(m,"hgV"),cs_i32(m,cs_sx4(m,"hgL","y"))))
25 q=csg_add(m,q,"hgR",T_I32,csg_rem(m,cs_i(m,"hgV"),cs_i32(m,cs_sx4(m,"hgL","y"))))
26 q=csg_add(m,q,"hgTri",T_I32,csg_rem(m,cs_i(m,"hgR"),ws_i(m,"6")))
27 q=csg_add(m,q,"hgS",T_I32,cs_idiv(m,cs_i(m,"hgR"),ws_i(m,"6")))
28 let end:i64=ws_or(m,ws_cmp(m,"==",cs_i(m,"hgTri"),ws_i(m,"2")),ws_cmp(m,">=",cs_i(m,"hgTri"),ws_i(m,"4")))
29 q=ws_q2(m,q,ws_if(m,end,ws_op(m,"hgS",T_I32,"+",ws_i(m,"1")),0))
30 q=csg_add(m,q,"hgP",T_I32,ws_c2(m,"min",cs_isub(m,nodes,ws_i(m,"2")),cs_idiv(m,cs_i(m,"hgS"),sub),T_I32))
31 q=csg_add(m,q,"hgT",T_F32,cs_fdiv(m,cs_f32(m,cs_isub(m,cs_i(m,"hgS"),cs_imul(m,cs_i(m,"hgP"),sub))),cs_f32(m,sub)))
32 let t:i64=cs_fl(m,"hgT")
33 q=csg_add(m,q,"hgT2",T_F32,cs_fmul(m,t,t))
34 q=csg_add(m,q,"hgT3",T_F32,cs_fmul(m,cs_fl(m,"hgT2"),t))
35 let t2:i64=cs_fl(m,"hgT2");let t3:i64=cs_fl(m,"hgT3")
36 q=csg_add(m,q,"hgW0",T_F32,cs_fmul(m,cs_fsub(m,cs_fsub(m,cs_fmul(m,ws_f(m,"2.0"),t2),t),t3),ws_f(m,"0.5")))
37 q=csg_add(m,q,"hgW1",T_F32,cs_fadd(m,cs_fsub(m,ws_f(m,"1.0"),cs_fmul(m,ws_f(m,"2.5"),t2)),cs_fmul(m,ws_f(m,"1.5"),t3)))
38 q=csg_add(m,q,"hgW2",T_F32,cs_fmul(m,cs_fsub(m,cs_fadd(m,t,cs_fmul(m,ws_f(m,"4.0"),t2)),cs_fmul(m,ws_f(m,"3.0"),t3)),ws_f(m,"0.5")))
39 q=csg_add(m,q,"hgW3",T_F32,cs_fmul(m,cs_fsub(m,t3,t2),ws_f(m,"0.5")))
40 q=csg_add(m,q,"hgBase",T_I32,cs_iadd(m,ws_i(m,"2"),cs_imul(m,cs_iadd(m,cs_imul(m,cs_i(m,"ii"),cs_i32(m,cs_sx4(m,"hgL","z"))),cs_i(m,"hgG")),nodes)))
41 let base:i64=cs_i(m,"hgBase");let p:i64=cs_i(m,"hgP")
42 let i0:i64=cs_iadd(m,base,ws_c2(m,"max",zero,cs_isub(m,p,ws_i(m,"1")),T_I32))
43 let i1:i64=cs_iadd(m,base,p)
44 let i2:i64=cs_iadd(m,i1,ws_i(m,"1"))
45 let i3:i64=cs_iadd(m,base,ws_c2(m,"min",cs_isub(m,nodes,ws_i(m,"1")),cs_iadd(m,p,ws_i(m,"2")),T_I32))
46 let d01:i64=cs_v3add(m,cs_v3mul(m,csg_load(m,i0,width),cs_fl(m,"hgW0")),cs_v3mul(m,csg_load(m,i1,width),cs_fl(m,"hgW1")))
47 let d23:i64=cs_v3add(m,cs_v3mul(m,csg_load(m,i2,width),cs_fl(m,"hgW2")),cs_v3mul(m,csg_load(m,i3,width),cs_fl(m,"hgW3")))
48 q=ws_q2(m,q,ws_op(m,"aP2",T_V3F,"+",cs_v3add(m,d01,d23)))
49 return ws_q2(m,all,ws_if(m,ws_cmp(m,"==",cs_sx4(m,"hgM","w"),cs_negf(m,"1.0")),q,legacy))
50}