Welcome to mirror list, hosted at ThFree Co, Russian Federation.

sculpt_paint_image_comp.glsl « sculpt_paint « shaders « gpu « blender « source - git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 2f3a4e3e1c8b8c5e7de32e30667115daf55cbcc5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#pragma BLENDER_REQUIRE(sculpt_paint_image_lib.glsl)

bool SCULPT_brush_test(PaintBrushTestData test_data,
                       PaintStepData step_data,
                       vec3 co,
                       out float dist)
{
#if defined(BRUSH_TEST_SPHERE)
  return SCULPT_brush_test_sphere(test_data, step_data, co, dist);
#elif defined(BRUSH_TEST_CIRCLE)
  return SCULPT_brush_test_circle(test_data, step_data, co, dist);
#else
  dist = 0.0;
  return true;
#endif
}

void main()
{
  PackedPixelRow row = pixel_row_buf[gl_GlobalInvocationID.x + pixel_row_offset];
  TrianglePaintInput triangle = paint_input[PIXEL_ROW_PRIM_INDEX(row)];
  ivec2 image_coord = PIXEL_ROW_START_IMAGE_COORD(row);

  uint row_len = PIXEL_ROW_LEN(row);

  vec3 co1 = vec3(vert_coord_buf[triangle.vert_indices.x]);
  vec3 co2 = vec3(vert_coord_buf[triangle.vert_indices.y]);
  vec3 co3 = vec3(vert_coord_buf[triangle.vert_indices.z]);

  vec3 pos;
  vec3 delta;
  SCULPT_get_row_pos_and_delta(co1, co2, co3, triangle, row, pos, delta);

  for (int x = 0; x < row_len; x++) {
    /* TODO: Do clipping test. */
    vec4 color;
    bool color_read = false;

    for (int step_index = paint_step_range[0]; step_index < paint_step_range[1]; step_index++) {
      PaintStepData step_data = paint_step_buf[step_index];

      float distance;
      bool test_result = SCULPT_brush_test(paint_brush_buf.test, step_data, pos, distance);
      if (test_result) {
        if (!color_read) {
          color = imageLoad(out_img, image_coord);
          color_read = true;
        }
        // TODO: blend with color...
        float factor = SCULPT_hardness_factor(distance, step_data.hardness, step_data.radius);
        float curve_factor = SCULPT_curve_strength(factor, paint_brush_buf.falloff_shape);
        vec4 final_paint_color = SCULPT_blend_color(
            color, paint_brush_buf.color * curve_factor * step_data.strength);
        final_paint_color *= paint_brush_buf.alpha;
        color = SCULPT_blend_color(color, final_paint_color);
      }
    }
    if (color_read) {
      imageStore(out_img, image_coord, color);
    }
    image_coord.x += 1;
    pos += delta;
  }
}