terrain-image-brush.effect 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  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. BrushImage: { value: grey }
  23. BrushDepthOffset: { value: 0.05 }
  24. }%
  25. CCProgram terrain-brush-vs %{
  26. precision mediump float;
  27. #include <builtin/uniforms/cc-global>
  28. #include <builtin/uniforms/cc-local>
  29. in vec3 a_position;
  30. out vec4 wposition;
  31. uniform Constant {
  32. float BrushDepthOffset;
  33. };
  34. vec4 vert () {
  35. vec3 worldPos;
  36. worldPos.x = cc_matWorld[3][0] + a_position.x;
  37. worldPos.y = cc_matWorld[3][1] + a_position.y;
  38. worldPos.z = cc_matWorld[3][2] + a_position.z;
  39. worldPos.y += BrushDepthOffset; // depth increment for terrain brushes
  40. vec4 pos = vec4(worldPos, 1);
  41. pos = cc_matViewProj * pos;
  42. wposition = vec4(worldPos, 1);
  43. return pos;
  44. }
  45. }%
  46. CCProgram terrain-brush-fs %{
  47. precision mediump float;
  48. #include <legacy/output>
  49. in vec4 wposition;
  50. uniform TexCoords {
  51. vec4 BrushPos;
  52. vec4 BrushParams;
  53. };
  54. uniform sampler2D BrushImage;
  55. vec4 frag () {
  56. float Radius = BrushParams.x;
  57. float Falloff = BrushParams.y;
  58. float Rotation = BrushParams.z;
  59. float DeltaU = BrushPos.x - wposition.x;
  60. float DeltaV = BrushPos.z - wposition.z;
  61. if (Rotation != 0.0) {
  62. float sine = sin(Rotation);
  63. float cosine = cos(Rotation);
  64. float _11 = cosine, _21 = sine;
  65. float _12 = -sine, _22 = cosine;
  66. float tmpx = DeltaU * _11 + DeltaV * _21;
  67. float tmpz = DeltaU * _12 + DeltaV * _22;
  68. DeltaU = tmpx;
  69. DeltaV = tmpz;
  70. }
  71. float k = 0.0;
  72. if (abs(DeltaU) < Radius && abs(DeltaV) < Radius) {
  73. float u = DeltaU / Radius * 0.5 + 0.5;
  74. float v = DeltaV / Radius * 0.5 + 0.5;
  75. k = texture(BrushImage, vec2(u, v)).r;
  76. }
  77. vec4 color = vec4(0, 0, 0, 0);
  78. color.rgb = vec3(100, 100, 135) / 255.0;
  79. color.a = 0.85 * k;
  80. return CCFragOutput(color);
  81. }
  82. }%