cursor.kong 2.6 KB

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