convertUvToCylinder.glsl 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. /* Cylinder defines (set in Scene/VoxelCylinderShape.js)
  2. #define CYLINDER_HAS_SHAPE_BOUNDS_RADIUS
  3. #define CYLINDER_HAS_SHAPE_BOUNDS_RADIUS_FLAT
  4. #define CYLINDER_HAS_SHAPE_BOUNDS_HEIGHT
  5. #define CYLINDER_HAS_SHAPE_BOUNDS_HEIGHT_FLAT
  6. #define CYLINDER_HAS_SHAPE_BOUNDS_ANGLE
  7. #define CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_RANGE_EQUAL_ZERO
  8. #define CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MIN_DISCONTINUITY
  9. #define CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MAX_DISCONTINUITY
  10. #define CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MIN_MAX_REVERSED
  11. */
  12. #if defined(CYLINDER_HAS_SHAPE_BOUNDS_RADIUS)
  13. uniform vec2 u_cylinderUvToShapeUvRadius; // x = scale, y = offset
  14. #endif
  15. #if defined(CYLINDER_HAS_SHAPE_BOUNDS_HEIGHT)
  16. uniform vec2 u_cylinderUvToShapeUvHeight; // x = scale, y = offset
  17. #endif
  18. #if defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE)
  19. uniform vec2 u_cylinderUvToShapeUvAngle; // x = scale, y = offset
  20. #endif
  21. #if defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MIN_DISCONTINUITY) || defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MAX_DISCONTINUITY)
  22. uniform vec2 u_cylinderShapeUvAngleMinMax;
  23. #endif
  24. #if defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MIN_DISCONTINUITY) || defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MAX_DISCONTINUITY) || defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MIN_MAX_REVERSED)
  25. uniform float u_cylinderShapeUvAngleRangeZeroMid;
  26. #endif
  27. vec3 convertUvToShapeUvSpace(in vec3 positionUv) {
  28. vec3 positionLocal = positionUv * 2.0 - 1.0; // [-1,+1]
  29. // Compute radius
  30. #if defined(CYLINDER_HAS_SHAPE_BOUNDS_RADIUS_FLAT)
  31. float radius = 1.0;
  32. #else
  33. float radius = length(positionLocal.xy); // [0,1]
  34. #if defined(CYLINDER_HAS_SHAPE_BOUNDS_RADIUS)
  35. radius = radius * u_cylinderUvToShapeUvRadius.x + u_cylinderUvToShapeUvRadius.y; // x = scale, y = offset
  36. #endif
  37. #endif
  38. // Compute height
  39. #if defined(CYLINDER_HAS_SHAPE_BOUNDS_HEIGHT_FLAT)
  40. float height = 1.0;
  41. #else
  42. float height = positionUv.z; // [0,1]
  43. #if defined(CYLINDER_HAS_SHAPE_BOUNDS_HEIGHT)
  44. height = height * u_cylinderUvToShapeUvHeight.x + u_cylinderUvToShapeUvHeight.y; // x = scale, y = offset
  45. #endif
  46. #endif
  47. // Compute angle
  48. #if defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_RANGE_EQUAL_ZERO)
  49. float angle = 1.0;
  50. #else
  51. float angle = (atan(positionLocal.y, positionLocal.x) + czm_pi) / czm_twoPi; // [0,1]
  52. #if defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE)
  53. #if defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MIN_MAX_REVERSED)
  54. // Comparing against u_cylinderShapeUvAngleMinMax has precision problems. u_cylinderShapeUvAngleRangeZeroMid is more conservative.
  55. angle += float(angle < u_cylinderShapeUvAngleRangeZeroMid);
  56. #endif
  57. // Avoid flickering from reading voxels from both sides of the -pi/+pi discontinuity.
  58. #if defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MIN_DISCONTINUITY)
  59. angle = angle > u_cylinderShapeUvAngleRangeZeroMid ? u_cylinderShapeUvAngleMinMax.x : angle;
  60. #elif defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MAX_DISCONTINUITY)
  61. angle = angle < u_cylinderShapeUvAngleRangeZeroMid ? u_cylinderShapeUvAngleMinMax.y : angle;
  62. #endif
  63. angle = angle * u_cylinderUvToShapeUvAngle.x + u_cylinderUvToShapeUvAngle.y; // x = scale, y = offset
  64. #endif
  65. #endif
  66. return vec3(radius, height, angle);
  67. }