cursor.kong 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. #[set(everything)]
  2. const constants: {
  3. VP: float4x4;
  4. invVP: float4x4;
  5. mouse: float2;
  6. tex_step: float2;
  7. radius: float;
  8. camera_right: float3;
  9. tint: float3;
  10. };
  11. #[set(everything)]
  12. const sampler_linear: sampler;
  13. #[set(everything)]
  14. const gbufferD: tex2d;
  15. struct vert_in {
  16. pos: float4;
  17. nor: float2;
  18. tex: float2;
  19. col: float4;
  20. }
  21. struct vert_out {
  22. pos: float4;
  23. tex: float2;
  24. }
  25. fun get_pos(uv: float2): float3 {
  26. var depth: float = sample_lod(gbufferD, sampler_linear, float2(uv.x, 1.0 - uv.y), 0.0).r;
  27. var wpos: float4 = float4(uv * 2.0 - 1.0, depth * 2.0 - 1.0, 1.0);
  28. wpos = constants.invVP * wpos;
  29. return wpos.xyz / wpos.w;
  30. }
  31. fun get_normal(p0: float3, uv: float2): float3 {
  32. var p1: float3 = get_pos(uv + float2(constants.tex_step.x * 4.0, 0.0));
  33. var p2: float3 = get_pos(uv + float2(0.0, constants.tex_step.y * 4.0));
  34. return normalize(cross(p2 - p0, p1 - p0));
  35. }
  36. // fun create_basis(normal: float3, out tangent: float3, out binormal: float3) {
  37. // tangent = normalize(constants.camera_right - normal * dot(constants.camera_right, normal));
  38. // binormal = cross(tangent, normal);
  39. // }
  40. fun cursor_vert(input: vert_in): vert_out {
  41. var keep: float = input.pos.x + input.nor.x + input.col.x; // hlsl
  42. var output: vert_out;
  43. output.tex = input.tex;
  44. var wpos: float3 = get_pos(constants.mouse);
  45. var uv1: float2 = constants.mouse + constants.tex_step * float2(4.0, 4.0);
  46. var uv2: float2 = constants.mouse - constants.tex_step * float2(4.0, 4.0);
  47. var wpos1: float3 = get_pos(uv1);
  48. var wpos2: float3 = get_pos(uv2);
  49. var n: float3 = normalize(get_normal(wpos, constants.mouse) + get_normal(wpos1, uv1) + get_normal(wpos2, uv2));
  50. var n_tan: float3;
  51. var n_bin: float3;
  52. // create_basis(n, n_tan, n_bin);
  53. n_tan = normalize(constants.camera_right - n * dot(constants.camera_right, n));
  54. n_bin = cross(n_tan, n);
  55. if (vertex_id() == 0) {
  56. wpos += normalize(-n_tan - n_bin) * 0.7 * constants.radius;
  57. }
  58. /*else */if (vertex_id() == 1) {
  59. wpos += normalize( n_tan - n_bin) * 0.7 * constants.radius;
  60. }
  61. /*else */if (vertex_id() == 2) {
  62. wpos += normalize( n_tan + n_bin) * 0.7 * constants.radius;
  63. }
  64. /*else */if (vertex_id() == 3) {
  65. wpos += normalize(-n_tan + n_bin) * 0.7 * constants.radius;
  66. }
  67. output.pos = constants.VP * float4(wpos, 1.0);
  68. return output;
  69. }
  70. fun cursor_frag(input: vert_out): float4 {
  71. var radius: float = 0.45;
  72. var thickness: float = 0.03;
  73. var dist: float = distance(input.tex, float2(0.5, 0.5));
  74. var ring: float = smoothstep(radius - thickness, radius, dist) - smoothstep(radius, radius + thickness, dist);
  75. return float4(constants.tint, min(ring, 0.6));
  76. }
  77. #[pipe]
  78. struct pipe {
  79. vertex = cursor_vert;
  80. fragment = cursor_frag;
  81. }