make_blur.ts 5.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. function make_blur_run(vert: node_shader_t, frag: node_shader_t) {
  2. ///if (krom_direct3d11 || krom_direct3d12 || krom_metal || krom_vulkan)
  3. node_shader_write(frag, "vec2 texCoordInp = texelFetch(gbuffer2, ivec2(sp.x * gbufferSize.x, sp.y * gbufferSize.y), 0).ba;");
  4. ///else
  5. node_shader_write(frag, "vec2 texCoordInp = texelFetch(gbuffer2, ivec2(sp.x * gbufferSize.x, (1.0 - sp.y) * gbufferSize.y), 0).ba;");
  6. ///end
  7. node_shader_write(frag, "vec3 basecol = vec3(0.0, 0.0, 0.0);");
  8. node_shader_write(frag, "float roughness = 0.0;");
  9. node_shader_write(frag, "float metallic = 0.0;");
  10. node_shader_write(frag, "float occlusion = 0.0;");
  11. node_shader_write(frag, "vec3 nortan = vec3(0.0, 0.0, 0.0);");
  12. node_shader_write(frag, "float height = 0.0;");
  13. node_shader_write(frag, "float mat_opacity = 1.0;");
  14. let is_mask: bool = slot_layer_is_mask(context_raw.layer);
  15. if (is_mask) {
  16. node_shader_write(frag, "float opacity = 1.0;");
  17. }
  18. else {
  19. node_shader_write(frag, "float opacity = 0.0;");
  20. }
  21. if (context_raw.material.paint_emis) {
  22. node_shader_write(frag, "float emis = 0.0;");
  23. }
  24. if (context_raw.material.paint_subs) {
  25. node_shader_write(frag, "float subs = 0.0;");
  26. }
  27. node_shader_add_uniform(frag, "vec2 texpaintSize", "_texpaintSize");
  28. node_shader_write(frag, "float blur_step = 1.0 / texpaintSize.x;");
  29. if (context_raw.tool == workspace_tool_t.SMUDGE) {
  30. ///if (krom_direct3d11 || krom_direct3d12 || krom_metal)
  31. node_shader_write(frag, "const float blur_weight[7] = {1.0 / 28.0, 2.0 / 28.0, 3.0 / 28.0, 4.0 / 28.0, 5.0 / 28.0, 6.0 / 28.0, 7.0 / 28.0};");
  32. ///else
  33. node_shader_write(frag, "const float blur_weight[7] = float[](1.0 / 28.0, 2.0 / 28.0, 3.0 / 28.0, 4.0 / 28.0, 5.0 / 28.0, 6.0 / 28.0, 7.0 / 28.0);");
  34. ///end
  35. node_shader_add_uniform(frag, "vec3 brushDirection", "_brushDirection");
  36. node_shader_write(frag, "vec2 blur_direction = brushDirection.yx;");
  37. node_shader_write(frag, "for (int i = 0; i < 7; ++i) {");
  38. ///if (krom_direct3d11 || krom_direct3d12 || krom_metal || krom_vulkan)
  39. node_shader_write(frag, "vec2 texCoordInp2 = texelFetch(gbuffer2, ivec2((sp.x + blur_direction.x * blur_step * float(i)) * gbufferSize.x, (sp.y + blur_direction.y * blur_step * float(i)) * gbufferSize.y), 0).ba;");
  40. ///else
  41. node_shader_write(frag, "vec2 texCoordInp2 = texelFetch(gbuffer2, ivec2((sp.x + blur_direction.x * blur_step * float(i)) * gbufferSize.x, (1.0 - (sp.y + blur_direction.y * blur_step * float(i))) * gbufferSize.y), 0).ba;");
  42. ///end
  43. node_shader_write(frag, "vec4 texpaint_sample = texture(texpaint_undo, texCoordInp2);");
  44. node_shader_write(frag, "opacity += texpaint_sample.a * blur_weight[i];");
  45. node_shader_write(frag, "basecol += texpaint_sample.rgb * blur_weight[i];");
  46. node_shader_write(frag, "vec4 texpaint_pack_sample = texture(texpaint_pack_undo, texCoordInp2) * blur_weight[i];");
  47. node_shader_write(frag, "roughness += texpaint_pack_sample.g;");
  48. node_shader_write(frag, "metallic += texpaint_pack_sample.b;");
  49. node_shader_write(frag, "occlusion += texpaint_pack_sample.r;");
  50. node_shader_write(frag, "height += texpaint_pack_sample.a;");
  51. node_shader_write(frag, "nortan += texture(texpaint_nor_undo, texCoordInp2).rgb * blur_weight[i];");
  52. node_shader_write(frag, "}");
  53. }
  54. else {
  55. ///if (krom_direct3d11 || krom_direct3d12 || krom_metal)
  56. node_shader_write(frag, "const float blur_weight[15] = {0.034619 / 2.0, 0.044859 / 2.0, 0.055857 / 2.0, 0.066833 / 2.0, 0.076841 / 2.0, 0.084894 / 2.0, 0.090126 / 2.0, 0.09194 / 2.0, 0.090126 / 2.0, 0.084894 / 2.0, 0.076841 / 2.0, 0.066833 / 2.0, 0.055857 / 2.0, 0.044859 / 2.0, 0.034619 / 2.0};");
  57. ///else
  58. node_shader_write(frag, "const float blur_weight[15] = float[](0.034619 / 2.0, 0.044859 / 2.0, 0.055857 / 2.0, 0.066833 / 2.0, 0.076841 / 2.0, 0.084894 / 2.0, 0.090126 / 2.0, 0.09194 / 2.0, 0.090126 / 2.0, 0.084894 / 2.0, 0.076841 / 2.0, 0.066833 / 2.0, 0.055857 / 2.0, 0.044859 / 2.0, 0.034619 / 2.0);");
  59. ///end
  60. // X
  61. node_shader_write(frag, "for (int i = -7; i <= 7; ++i) {");
  62. node_shader_write(frag, "vec4 texpaint_sample = texture(texpaint_undo, texCoordInp + vec2(blur_step * float(i), 0.0));");
  63. node_shader_write(frag, "opacity += texpaint_sample.a * blur_weight[i + 7];");
  64. node_shader_write(frag, "basecol += texpaint_sample.rgb * blur_weight[i + 7];");
  65. node_shader_write(frag, "vec4 texpaint_pack_sample = texture(texpaint_pack_undo, texCoordInp + vec2(blur_step * float(i), 0.0)) * blur_weight[i + 7];");
  66. node_shader_write(frag, "roughness += texpaint_pack_sample.g;");
  67. node_shader_write(frag, "metallic += texpaint_pack_sample.b;");
  68. node_shader_write(frag, "occlusion += texpaint_pack_sample.r;");
  69. node_shader_write(frag, "height += texpaint_pack_sample.a;");
  70. node_shader_write(frag, "nortan += texture(texpaint_nor_undo, texCoordInp + vec2(blur_step * float(i), 0.0)).rgb * blur_weight[i + 7];");
  71. node_shader_write(frag, "}");
  72. // Y
  73. node_shader_write(frag, "for (int j = -7; j <= 7; ++j) {");
  74. node_shader_write(frag, "vec4 texpaint_sample = texture(texpaint_undo, texCoordInp + vec2(0.0, blur_step * float(j)));");
  75. node_shader_write(frag, "opacity += texpaint_sample.a * blur_weight[j + 7];");
  76. node_shader_write(frag, "basecol += texpaint_sample.rgb * blur_weight[j + 7];");
  77. node_shader_write(frag, "vec4 texpaint_pack_sample = texture(texpaint_pack_undo, texCoordInp + vec2(0.0, blur_step * float(j))) * blur_weight[j + 7];");
  78. node_shader_write(frag, "roughness += texpaint_pack_sample.g;");
  79. node_shader_write(frag, "metallic += texpaint_pack_sample.b;");
  80. node_shader_write(frag, "occlusion += texpaint_pack_sample.r;");
  81. node_shader_write(frag, "height += texpaint_pack_sample.a;");
  82. node_shader_write(frag, "nortan += texture(texpaint_nor_undo, texCoordInp + vec2(0.0, blur_step * float(j))).rgb * blur_weight[j + 7];");
  83. node_shader_write(frag, "}");
  84. }
  85. node_shader_write(frag, "opacity *= brushOpacity;");
  86. }