[Bf-blender-cvs] [145edbe4e03] temp-3d-texturing-brush-b: Rename members + adding operators.

Jeroen Bakker noreply at git.blender.org
Wed Mar 16 14:10:47 CET 2022


Commit: 145edbe4e036805b5a1f469202f23e701e2a91f4
Author: Jeroen Bakker
Date:   Wed Mar 16 08:14:54 2022 +0100
Branches: temp-3d-texturing-brush-b
https://developer.blender.org/rB145edbe4e036805b5a1f469202f23e701e2a91f4

Rename members + adding operators.

===================================================================

M	release/scripts/addons
M	source/blender/editors/sculpt_paint/sculpt_texture_paint_d.cc
M	source/blender/editors/sculpt_paint/sculpt_texture_paint_intern.hh
M	source/blender/editors/sculpt_paint/sculpt_texture_paint_pixel_extraction_d.cc
M	source/tools

===================================================================

diff --git a/release/scripts/addons b/release/scripts/addons
index c34f0b90d49..1cf57247c7c 160000
--- a/release/scripts/addons
+++ b/release/scripts/addons
@@ -1 +1 @@
-Subproject commit c34f0b90d49938eccf9c1a9ae59b055155e00f9b
+Subproject commit 1cf57247c7ca13c5dc185baae2201f554f85df50
diff --git a/source/blender/editors/sculpt_paint/sculpt_texture_paint_d.cc b/source/blender/editors/sculpt_paint/sculpt_texture_paint_d.cc
index f4dc3f74504..6232ca7c7dd 100644
--- a/source/blender/editors/sculpt_paint/sculpt_texture_paint_d.cc
+++ b/source/blender/editors/sculpt_paint/sculpt_texture_paint_d.cc
@@ -64,7 +64,7 @@ static Pixel get_start_pixel(const PixelsPackage &encoded_pixels,
                              const MVert *mvert,
                              const MLoopUV *ldata_uv)
 {
-  return init_pixel(triangle, encoded_pixels.start_edge_coord, mvert, ldata_uv);
+  return init_pixel(triangle, encoded_pixels.start_barycentric_coord, mvert, ldata_uv);
 }
 
 static Pixel get_delta_pixel(const PixelsPackage &encoded_pixels,
@@ -76,16 +76,8 @@ static Pixel get_delta_pixel(const PixelsPackage &encoded_pixels,
 )
 {
   Pixel result = init_pixel(
-      triangle, encoded_pixels.start_edge_coord + triangle.add_edge_coord_x, mvert, ldata_uv);
-  result.pos -= start_pixel.pos;
-  result.uv -= start_pixel.uv;
-  return result;
-}
-
-static void add(Pixel &dst, const Pixel &lh)
-{
-  dst.pos += lh.pos;
-  dst.uv += lh.uv;
+      triangle, encoded_pixels.start_barycentric_coord + triangle.add_barycentric_coord_x, mvert, ldata_uv);
+  return result - start_pixel;
 }
 
 static void do_vertex_brush_test(void *__restrict userdata,
@@ -184,13 +176,13 @@ static void do_task_cb_ex(void *__restrict userdata,
     Triangle &triangle = node_data->triangles[encoded_pixels.triangle_index];
     int pixel_offset = encoded_pixels.start_image_coordinate.y * image_buffer->x +
                        encoded_pixels.start_image_coordinate.x;
-    float3 edge_coord = encoded_pixels.start_edge_coord;
+    float3 edge_coord = encoded_pixels.start_barycentric_coord;
     Pixel pixel = get_start_pixel(encoded_pixels, triangle, mvert, ldata_uv);
     const Pixel add_pixel = get_delta_pixel(encoded_pixels, triangle, pixel, mvert, ldata_uv);
     bool pixels_painted = false;
     for (int x = 0; x < encoded_pixels.num_pixels; x++) {
       if (!sculpt_brush_test_sq_fn(&test, pixel.pos)) {
-        add(pixel, add_pixel);
+        pixel += add_pixel;
         pixel_offset += 1;
         continue;
       }
@@ -213,8 +205,8 @@ static void do_task_cb_ex(void *__restrict userdata,
       blend_color_interpolate_float(color, color, brush_linear, falloff_strength * brush_strength);
       pixels_painted = true;
 
-      edge_coord += triangle.add_edge_coord_x;
-      add(pixel, add_pixel);
+      edge_coord += triangle.add_barycentric_coord_x;
+      pixel += add_pixel;
       pixel_offset++;
     }
 
diff --git a/source/blender/editors/sculpt_paint/sculpt_texture_paint_intern.hh b/source/blender/editors/sculpt_paint/sculpt_texture_paint_intern.hh
index e287d04b676..eba2c1aeff6 100644
--- a/source/blender/editors/sculpt_paint/sculpt_texture_paint_intern.hh
+++ b/source/blender/editors/sculpt_paint/sculpt_texture_paint_intern.hh
@@ -7,20 +7,52 @@ struct Triangle {
   int3 loop_indices;
   int3 vert_indices;
   int poly_index;
-  float3 add_edge_coord_x;
+  float3 add_barycentric_coord_x;
   float automasking_factor;
 };
 
+/**
+ * Encode multiple sequential pixels to reduce memory footprint.
+ * 
+ * Memory footprint can be reduced more.
+ * - Only store 2 barycentric coordinates. the third one can be extracted
+ *   from the 2 known ones.
+ * - start_image_coordinate can be a delta encoded with the previous package.
+ *   initial coordinate could be at the triangle level or pbvh.
+ * - num_pixels could be delta encoded or at least be a short.
+ * - triangle index could be delta encoded.
+ * - encode everything in using variable bits per structure.
+ *   first byte would indicate the number of bytes used per element.
+ */
 struct PixelsPackage {
+  /** Image coordinate starting of the first encoded pixel. */
   int2 start_image_coordinate;
-  float3 start_edge_coord;
+  /** Barycentric coordinate of the first encoded pixel. */
+  float3 start_barycentric_coord;
+  /** Number of sequetial pixels encoded in this package. */
   int num_pixels;
+  /** Reference to the pbvh triangle index. */
   int triangle_index;
 };
 
 struct Pixel {
   float3 pos;
   float2 uv;
+
+  Pixel &operator+=(const Pixel &other)
+  {
+    pos += other.pos;
+    uv += other.uv;
+    return *this;
+  }
+
+  Pixel operator-(const Pixel &other)
+  {
+    Pixel result;
+    result.pos = pos - other.pos;
+    result.uv = uv - other.uv;
+    return result;
+  }
 };
 
 struct PixelData {
diff --git a/source/blender/editors/sculpt_paint/sculpt_texture_paint_pixel_extraction_d.cc b/source/blender/editors/sculpt_paint/sculpt_texture_paint_pixel_extraction_d.cc
index 389650d6472..87b1cb5708a 100644
--- a/source/blender/editors/sculpt_paint/sculpt_texture_paint_pixel_extraction_d.cc
+++ b/source/blender/editors/sculpt_paint/sculpt_texture_paint_pixel_extraction_d.cc
@@ -80,18 +80,18 @@ static void extract_barycentric_edges(NodeData *node_data,
   const float add_v = 1.0 / image_buffer->y;
 
   float2 min_uv(minu, minv);
-  float3 start_edge_coord = barycentric_weights(uvs[0], uvs[1], uvs[2], min_uv);
-  float3 add_edge_coord_x = barycentric_weights(
+  float3 start_barycentric_coord = barycentric_weights(uvs[0], uvs[1], uvs[2], min_uv);
+  float3 add_barycentric_coord_x = barycentric_weights(
                                 uvs[0], uvs[1], uvs[2], min_uv + float2(add_u, 0.0)) -
-                            start_edge_coord;
+                            start_barycentric_coord;
   float3 add_edge_coord_y = barycentric_weights(
                                 uvs[0], uvs[1], uvs[2], min_uv + float2(0.0, add_v)) -
-                            start_edge_coord;
+                            start_barycentric_coord;
 
-  triangle.add_edge_coord_x = add_edge_coord_x;
+  triangle.add_barycentric_coord_x = add_barycentric_coord_x;
 
   for (int y = miny; y < maxy; y++) {
-    float3 start_y_edge_coord = start_edge_coord + add_edge_coord_y * (y - miny);
+    float3 start_y_edge_coord = start_barycentric_coord + add_edge_coord_y * (y - miny);
     float3 edge_coord = start_y_edge_coord;
 
     int start_x = -1;
@@ -102,15 +102,15 @@ static void extract_barycentric_edges(NodeData *node_data,
         start_x = x;
         break;
       }
-      edge_coord += add_edge_coord_x;
+      edge_coord += add_barycentric_coord_x;
     }
-    edge_coord += add_edge_coord_x;
+    edge_coord += add_barycentric_coord_x;
     x += 1;
     for (; x < maxx; x++) {
       if (!is_inside_triangle(edge_coord)) {
         break;
       }
-      edge_coord += add_edge_coord_x;
+      edge_coord += add_barycentric_coord_x;
     }
     end_x = x;
 
@@ -122,7 +122,7 @@ static void extract_barycentric_edges(NodeData *node_data,
 
     PixelsPackage package;
     package.start_image_coordinate = int2(start_x, y);
-    package.start_edge_coord = start_y_edge_coord + add_edge_coord_x * (start_x - minx);
+    package.start_barycentric_coord = start_y_edge_coord + add_barycentric_coord_x * (start_x - minx);
     package.triangle_index = triangle_index;
     package.num_pixels = num_pixels;
     node_data->encoded_pixels.append(package);
@@ -155,7 +155,7 @@ static void extract_barycentric_pixels(NodeData *node_data,
       if (!start_detected && is_inside) {
         start_detected = true;
         package.start_image_coordinate = int2(x, y);
-        package.start_edge_coord = barycentric;
+        package.start_barycentric_coord = barycentric;
       }
       else if (start_detected && !is_inside) {
         break;
@@ -167,7 +167,7 @@ static void extract_barycentric_pixels(NodeData *node_data,
     }
     package.num_pixels = x - package.start_image_coordinate.x;
     if (package.num_pixels > best_num_pixels) {
-      triangle.add_edge_coord_x = (barycentric - package.start_edge_coord) / package.num_pixels;
+      triangle.add_barycentric_coord_x = (barycentric - package.start_barycentric_coord) / package.num_pixels;
       best_num_pixels = package.num_pixels;
     }
     node_data->encoded_pixels.append(package);
diff --git a/source/tools b/source/tools
index 91c5bc34c0a..5715a567950 160000
--- a/source/tools
+++ b/source/tools
@@ -1 +1 @@
-Subproject commit 91c5bc34c0a49f89f19e1c656c195968617cff61
+Subproject commit 5715a567950258c17089c9b9cb175a6ef8c602ce



More information about the Bf-blender-cvs mailing list