make_blur.ts 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. function make_blur_run(kong: node_shader_t) {
  2. // node_shader_write_frag(kong, "var tex_coord_inp: float2 = gbuffer2[uint2(sp.x * constants.gbuffer_size.x, sp.y * constants.gbuffer_size.y)].ba;");
  3. node_shader_write_frag(kong, "var tex_coord_inp4: float4 = gbuffer2[uint2(uint(sp.x * constants.gbuffer_size.x), uint(sp.y * constants.gbuffer_size.y))];");
  4. node_shader_write_frag(kong, "var tex_coord_inp: float2 = tex_coord_inp4.ba;");
  5. node_shader_write_frag(kong, "var basecol: float3 = float3(0.0, 0.0, 0.0);");
  6. node_shader_write_frag(kong, "var roughness: float = 0.0;");
  7. node_shader_write_frag(kong, "var metallic: float = 0.0;");
  8. node_shader_write_frag(kong, "var occlusion: float = 0.0;");
  9. node_shader_write_frag(kong, "var nortan: float3 = float3(0.0, 0.0, 0.0);");
  10. node_shader_write_frag(kong, "var height: float = 0.0;");
  11. node_shader_write_frag(kong, "var mat_opacity: float = 1.0;");
  12. let is_mask: bool = slot_layer_is_mask(context_raw.layer);
  13. if (is_mask) {
  14. node_shader_write_frag(kong, "var opacity: float = 1.0;");
  15. }
  16. else {
  17. node_shader_write_frag(kong, "var opacity: float = 0.0;");
  18. }
  19. if (context_raw.material.paint_emis) {
  20. node_shader_write_frag(kong, "var emis: float = 0.0;");
  21. }
  22. if (context_raw.material.paint_subs) {
  23. node_shader_write_frag(kong, "var subs: float = 0.0;");
  24. }
  25. node_shader_add_constant(kong, "texpaint_size: float2", "_texpaint_size");
  26. node_shader_write_frag(kong, "var blur_step: float = 1.0 / constants.texpaint_size.x;");
  27. if (context_raw.tool == tool_type_t.SMUDGE) {
  28. // node_shader_write_frag(kong, "const blur_weight: float[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};");
  29. node_shader_add_function(kong, str_get_smudge_tool_weight);
  30. node_shader_add_constant(kong, "brush_direction: float3", "_brush_direction");
  31. node_shader_write_frag(kong, "var blur_direction: float2 = constants.brush_direction.yx;");
  32. node_shader_write_frag(kong, "for (var i: int = 0; i < 7; i += 1) {");
  33. // node_shader_write_frag(kong, "var tex_coord_inp2: float2 = gbuffer2[uint2((sp.x + blur_direction.x * blur_step * float(i)) *
  34. // constants.gbuffer_size.x, (sp.y + blur_direction.y * blur_step * float(i)) * constants.gbuffer_size.y)].ba;");
  35. node_shader_write_frag(
  36. kong,
  37. "var tex_coord_inp24: float4 = gbuffer2[uint2(uint((sp.x + blur_direction.x * blur_step * float(i)) * constants.gbuffer_size.x), uint((sp.y + blur_direction.y * blur_step * float(i)) * constants.gbuffer_size.y))];");
  38. node_shader_write_frag(kong, "var tex_coord_inp2: float2 = tex_coord_inp24.ba;");
  39. node_shader_write_frag(kong, "var texpaint_sample: float4 = sample(texpaint_undo, sampler_linear, tex_coord_inp2);");
  40. node_shader_write_frag(kong, "var blur_weight_i: float = get_smudge_tool_weight(i);");
  41. node_shader_write_frag(kong, "opacity += texpaint_sample.a * blur_weight_i;");
  42. node_shader_write_frag(kong, "basecol += texpaint_sample.rgb * blur_weight_i;");
  43. node_shader_write_frag(kong, "var texpaint_pack_sample: float4 = sample(texpaint_pack_undo, sampler_linear, tex_coord_inp2) * blur_weight_i;");
  44. node_shader_write_frag(kong, "roughness += texpaint_pack_sample.g;");
  45. node_shader_write_frag(kong, "metallic += texpaint_pack_sample.b;");
  46. node_shader_write_frag(kong, "occlusion += texpaint_pack_sample.r;");
  47. node_shader_write_frag(kong, "height += texpaint_pack_sample.a;");
  48. node_shader_write_frag(kong, "nortan += sample(texpaint_nor_undo, sampler_linear, tex_coord_inp2).rgb * blur_weight_i;");
  49. node_shader_write_frag(kong, "}");
  50. }
  51. else {
  52. // node_shader_write_frag(kong, "const blur_weight: float[15] = {0.034619 / 2.0, 0.044859 / 2.0, 0.055857 / 2.0, 0.066833 / 2.0, 0.076841 / 2.0,
  53. // 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,
  54. // 0.034619 / 2.0};");
  55. node_shader_add_function(kong, str_get_blur_tool_weight);
  56. // X
  57. node_shader_write_frag(kong, "for (var i: int = 0; i <= 14; i += 1) {");
  58. node_shader_write_frag(kong,
  59. "var texpaint_sample: float4 = sample(texpaint_undo, sampler_linear, tex_coord_inp + float2(blur_step * float(i - 7), 0.0));");
  60. node_shader_write_frag(kong, "var blur_weight_i: float = get_blur_tool_weight(i);");
  61. node_shader_write_frag(kong, "opacity += texpaint_sample.a * blur_weight_i;");
  62. node_shader_write_frag(kong, "basecol += texpaint_sample.rgb * blur_weight_i;");
  63. node_shader_write_frag(
  64. kong,
  65. "var texpaint_pack_sample: float4 = sample(texpaint_pack_undo, sampler_linear, tex_coord_inp + float2(blur_step * float(i - 7), 0.0)) * blur_weight_i;");
  66. node_shader_write_frag(kong, "roughness += texpaint_pack_sample.g;");
  67. node_shader_write_frag(kong, "metallic += texpaint_pack_sample.b;");
  68. node_shader_write_frag(kong, "occlusion += texpaint_pack_sample.r;");
  69. node_shader_write_frag(kong, "height += texpaint_pack_sample.a;");
  70. node_shader_write_frag(
  71. kong, "nortan += sample(texpaint_nor_undo, sampler_linear, tex_coord_inp + float2(blur_step * float(i - 7), 0.0)).rgb * blur_weight_i;");
  72. node_shader_write_frag(kong, "}");
  73. // Y
  74. node_shader_write_frag(kong, "for (var j: int = 0; j <= 14; j += 1) {");
  75. node_shader_write_frag(kong,
  76. "var texpaint_sample: float4 = sample(texpaint_undo, sampler_linear, tex_coord_inp + float2(0.0, blur_step * float(j - 7)));");
  77. node_shader_write_frag(kong, "var blur_weight_j: float = get_blur_tool_weight(j);");
  78. node_shader_write_frag(kong, "opacity += texpaint_sample.a * blur_weight_j;");
  79. node_shader_write_frag(kong, "basecol += texpaint_sample.rgb * blur_weight_j;");
  80. node_shader_write_frag(
  81. kong,
  82. "var texpaint_pack_sample: float4 = sample(texpaint_pack_undo, sampler_linear, tex_coord_inp + float2(0.0, blur_step * float(j - 7))) * blur_weight_j;");
  83. node_shader_write_frag(kong, "roughness += texpaint_pack_sample.g;");
  84. node_shader_write_frag(kong, "metallic += texpaint_pack_sample.b;");
  85. node_shader_write_frag(kong, "occlusion += texpaint_pack_sample.r;");
  86. node_shader_write_frag(kong, "height += texpaint_pack_sample.a;");
  87. node_shader_write_frag(
  88. kong, "nortan += sample(texpaint_nor_undo, sampler_linear, tex_coord_inp + float2(0.0, blur_step * float(j - 7))).rgb * blur_weight_j;");
  89. node_shader_write_frag(kong, "}");
  90. }
  91. node_shader_write_frag(kong, "opacity *= constants.brush_opacity;");
  92. }
  93. let str_get_smudge_tool_weight: string = "\
  94. fun get_smudge_tool_weight(i: int): float { \
  95. if (i == 0) { return 1.0 / 28.0; } \
  96. if (i == 1) { return 2.0 / 28.0; } \
  97. if (i == 2) { return 3.0 / 28.0; } \
  98. if (i == 3) { return 4.0 / 28.0; } \
  99. if (i == 4) { return 5.0 / 28.0; } \
  100. if (i == 5) { return 6.0 / 28.0; } \
  101. return 7.0 / 28.0; \
  102. } \
  103. ";
  104. let str_get_blur_tool_weight: string = "\
  105. fun get_blur_tool_weight(i: int): float { \
  106. if (i == 0) { return 0.034619 / 2.0; } \
  107. if (i == 1) { return 0.044859 / 2.0; } \
  108. if (i == 2) { return 0.055857 / 2.0; } \
  109. if (i == 3) { return 0.066833 / 2.0; } \
  110. if (i == 4) { return 0.076841 / 2.0; } \
  111. if (i == 5) { return 0.084894 / 2.0; } \
  112. if (i == 6) { return 0.090126 / 2.0; } \
  113. if (i == 7) { return 0.09194 / 2.0; } \
  114. if (i == 8) { return 0.090126 / 2.0; } \
  115. if (i == 9) { return 0.084894 / 2.0; } \
  116. if (i == 10) { return 0.076841 / 2.0; } \
  117. if (i == 11) { return 0.066833 / 2.0; } \
  118. if (i == 12) { return 0.055857 / 2.0; } \
  119. if (i == 13) { return 0.044859 / 2.0; } \
  120. return 0.034619 / 2.0; \
  121. } \
  122. ";