spheres.vert 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. /**
  2. * Copyright (c) 2019 mol* contributors, licensed under MIT, See LICENSE file for more info.
  3. *
  4. * @author Alexander Rose <alexander.rose@weirdbyte.de>
  5. */
  6. precision highp float;
  7. precision highp int;
  8. #include common
  9. #include read_from_texture
  10. #include common_vert_params
  11. #include color_vert_params
  12. #include size_vert_params
  13. uniform mat4 uModelView;
  14. uniform mat4 uInvProjection;
  15. attribute vec3 aPosition;
  16. attribute vec2 aMapping;
  17. attribute mat4 aTransform;
  18. attribute float aInstance;
  19. attribute float aGroup;
  20. varying float vRadius;
  21. varying float vRadiusSq;
  22. varying vec3 vPoint;
  23. varying vec3 vPointViewPosition;
  24. #include matrix_scale
  25. const mat4 D = mat4(
  26. 1.0, 0.0, 0.0, 0.0,
  27. 0.0, 1.0, 0.0, 0.0,
  28. 0.0, 0.0, 1.0, 0.0,
  29. 0.0, 0.0, 0.0, -1.0
  30. );
  31. /**
  32. * Compute point size and center using the technique described in:
  33. * "GPU-Based Ray-Casting of Quadratic Surfaces" http://dl.acm.org/citation.cfm?id=2386396
  34. * by Christian Sigg, Tim Weyrich, Mario Botsch, Markus Gross.
  35. */
  36. void quadraticProjection(const in float radius, const in vec3 position){
  37. vec2 xbc, ybc;
  38. mat4 T = mat4(
  39. radius, 0.0, 0.0, 0.0,
  40. 0.0, radius, 0.0, 0.0,
  41. 0.0, 0.0, radius, 0.0,
  42. position.x, position.y, position.z, 1.0
  43. );
  44. mat4 R = transpose(uProjection * uModelView * aTransform * T);
  45. float A = dot(R[3], D * R[3]);
  46. float B = -2.0 * dot(R[0], D * R[3]);
  47. float C = dot(R[0], D * R[0]);
  48. xbc[0] = (-B - sqrt(B * B - 4.0 * A * C)) / (2.0 * A);
  49. xbc[1] = (-B + sqrt(B * B - 4.0 * A * C)) / (2.0 * A);
  50. float sx = abs(xbc[0] - xbc[1]) * 0.5;
  51. A = dot(R[3], D * R[3]);
  52. B = -2.0 * dot(R[1], D * R[3]);
  53. C = dot(R[1], D * R[1]);
  54. ybc[0] = (-B - sqrt(B * B - 4.0 * A * C)) / (2.0 * A);
  55. ybc[1] = (-B + sqrt(B * B - 4.0 * A * C)) / (2.0 * A);
  56. float sy = abs(ybc[0] - ybc[1]) * 0.5;
  57. gl_Position.xy = vec2(0.5 * (xbc.x + xbc.y), 0.5 * (ybc.x + ybc.y));
  58. gl_Position.xy -= aMapping * vec2(sx, sy);
  59. gl_Position.xy *= gl_Position.w;
  60. }
  61. void main(void){
  62. #include assign_group
  63. #include assign_color_varying
  64. #include assign_marker_varying
  65. #include assign_size
  66. vRadius = size * matrixScale(uModelView);
  67. vec4 mvPosition = uModelView * aTransform * vec4(aPosition, 1.0);
  68. mvPosition.z -= vRadius; // avoid clipping, added again in fragment shader
  69. gl_Position = uProjection * vec4(mvPosition.xyz, 1.0);
  70. quadraticProjection(size, aPosition);
  71. vRadiusSq = vRadius * vRadius;
  72. vec4 vPoint4 = uInvProjection * gl_Position;
  73. vPoint = vPoint4.xyz / vPoint4.w;
  74. vPointViewPosition = -mvPosition.xyz / mvPosition.w;
  75. }