terrain-circle-brush.effect 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. // Copyright (c) 2017-2020 Xiamen Yaji Software Co., Ltd.
  2. CCEffect %{
  3. editor:
  4. hide: true
  5. techniques:
  6. - name: transparent
  7. passes:
  8. - vert: terrain-brush-vs:vert
  9. frag: terrain-brush-fs:frag
  10. depthStencilState:
  11. depthTest: true
  12. depthWrite: false
  13. blendState:
  14. targets:
  15. - blend: true
  16. blendSrc: src_alpha
  17. blendDst: one_minus_src_alpha
  18. blendDstAlpha: one_minus_src_alpha
  19. properties:
  20. BrushPos: { value: [0, 0, 0, 1] }
  21. BrushParams: { value: [2.5, 2.5, 0, 0] }
  22. BrushDepthOffset: { value: 0.05 }
  23. }%
  24. CCProgram terrain-brush-vs %{
  25. precision mediump float;
  26. #include <builtin/uniforms/cc-global>
  27. #include <builtin/uniforms/cc-local>
  28. in vec3 a_position;
  29. out vec4 wposition;
  30. uniform Constant {
  31. float BrushDepthOffset;
  32. };
  33. vec4 vert () {
  34. vec3 worldPos;
  35. worldPos.x = cc_matWorld[3][0] + a_position.x;
  36. worldPos.y = cc_matWorld[3][1] + a_position.y;
  37. worldPos.z = cc_matWorld[3][2] + a_position.z;
  38. worldPos.y += BrushDepthOffset; // depth increment for terrain brushes
  39. vec4 pos = vec4(worldPos, 1);
  40. pos = cc_matViewProj * pos;
  41. wposition = vec4(worldPos, 1);
  42. return pos;
  43. }
  44. }%
  45. CCProgram terrain-brush-fs %{
  46. precision mediump float;
  47. #include <legacy/output>
  48. in vec4 wposition;
  49. uniform TexCoords {
  50. vec4 BrushPos;
  51. vec4 BrushParams;
  52. };
  53. vec4 frag () {
  54. float Radius = BrushParams.x;
  55. float Falloff = BrushParams.y;
  56. float Distance = length(wposition.xz - BrushPos.xz);
  57. float k = 0.0;
  58. #if LINEAR
  59. if (Distance <= Radius) {
  60. k = 1.0;
  61. }
  62. else if (Distance > Radius + Falloff) {
  63. k = 0.0;
  64. }
  65. else {
  66. k = max(0.0, 1.0 - (Distance - Radius) / Falloff);
  67. }
  68. #elif SMOOTH
  69. if (Distance <= Radius) {
  70. k = 1.0;
  71. }
  72. else if (Distance > Radius + Falloff) {
  73. k = 0.0;
  74. }
  75. else {
  76. float y = (Distance - Radius) / Falloff;
  77. k = sqrt(1.0 - y * y);
  78. }
  79. #elif SPHERICAL
  80. if (Distance <= Radius) {
  81. k = 1.0;
  82. }
  83. else if (Distance > Radius + Falloff) {
  84. k = 0.0;
  85. }
  86. else {
  87. k = max(0.0, 1.0 - (Distance - Radius) / Falloff);
  88. }
  89. k = k*k*(3.0 - 2.0 * k);
  90. #elif TIP
  91. if (Distance <= Radius) {
  92. k = 1.0;
  93. }
  94. else if (Distance > Radius + Falloff) {
  95. k = 0.0;
  96. }
  97. else {
  98. float y = (Falloff + Radius - Distance) / Falloff;
  99. k = 1.0 - sqrt(1.0 - y * y);
  100. }
  101. #endif
  102. vec4 color = vec4(0.0, 0.0, 0.0, 1.0);
  103. color.rgb = vec3(100, 100, 135) / 255.0;
  104. color.a = 0.85 * k;
  105. return CCFragOutput(color);
  106. }
  107. }%