gpu.frag 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. #version 130
  2. #define MARKER_COLOR vec4(0.75, 0.0, 0.0, 1.0)
  3. #define BEZIER_CURVE_COLOR vec3(0.0, 0.75, 0.0)
  4. // TODO: at some combinations of p1, p2, p3 nothing is drawn
  5. // TODO: explore math for 4 control points
  6. uniform vec2 p1;
  7. uniform vec2 p2;
  8. uniform vec2 p3;
  9. uniform float marker_radius;
  10. uniform float bezier_curve_threshold;
  11. void main()
  12. {
  13. if (length(gl_FragCoord.xy - p1) < marker_radius ||
  14. length(gl_FragCoord.xy - p2) < marker_radius ||
  15. length(gl_FragCoord.xy - p3) < marker_radius)
  16. {
  17. gl_FragColor = MARKER_COLOR;
  18. }
  19. else
  20. {
  21. // TODO: document this method of rendering in a LaTeX document
  22. vec2 p0 = gl_FragCoord.xy;
  23. float a = p3.x - 2 * p2.x + p1.x;
  24. float b = 2 * (p2.x - p1.x);
  25. float c = p1.x - p0.x;
  26. float dx = b * b - 4.0f * a * c;
  27. if (dx >= 0.0f) {
  28. float t1 = (-b + sqrt(dx)) / (2 * a);
  29. float t2 = (-b - sqrt(dx)) / (2 * a);
  30. float y1 = p1.y + 2 * t1 * (p2.y - p1.y) + t1 * t1 * (p3.y - 2 * p2.y + p1.y);
  31. float y2 = p1.y + 2 * t2 * (p2.y - p1.y) + t2 * t2 * (p3.y - 2 * p2.y + p1.y);
  32. if ((0.0f <= t1 && t1 <= 1.0f && abs(p0.y - y1) < bezier_curve_threshold) ||
  33. (0.0f <= t2 && t2 <= 1.0f && abs(p0.y - y2) < bezier_curve_threshold))
  34. {
  35. float r1 = abs(p0.y - y1) / bezier_curve_threshold;
  36. float r2 = abs(p0.y - y2) / bezier_curve_threshold;
  37. if (0.0 <= r1 && r1 <= 1.0) {
  38. gl_FragColor = vec4(0.0, 0.75, 0.0, mix(1.0, 0.0, r1));
  39. }
  40. if (0.0 <= r2 && r2 <= 1.0) {
  41. gl_FragColor = vec4(0.0, 0.75, 0.0, mix(1.0, 0.0, r2));
  42. }
  43. }
  44. else
  45. {
  46. gl_FragColor = vec4(0.0);
  47. }
  48. }
  49. else
  50. {
  51. gl_FragColor = vec4(0.0);
  52. }
  53. }
  54. }