[Bf-blender-cvs] [66b03b7e3bc] temp-T96710-pbvh-pixels: Change the tile painting loop to use node data first.

Jeroen Bakker noreply at git.blender.org
Tue Apr 12 12:10:47 CEST 2022


Commit: 66b03b7e3bcaeb76865c0b1e34a68c1a754277f4
Author: Jeroen Bakker
Date:   Tue Apr 12 12:07:37 2022 +0200
Branches: temp-T96710-pbvh-pixels
https://developer.blender.org/rB66b03b7e3bcaeb76865c0b1e34a68c1a754277f4

Change the tile painting loop to use node data first.

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

M	source/blender/blenkernel/BKE_pbvh_pixels.hh
M	source/blender/blenkernel/intern/pbvh_pixels.cc
M	source/blender/editors/sculpt_paint/sculpt_paint_image.cc

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

diff --git a/source/blender/blenkernel/BKE_pbvh_pixels.hh b/source/blender/blenkernel/BKE_pbvh_pixels.hh
index 26d90639fc0..92d5b84be72 100644
--- a/source/blender/blenkernel/BKE_pbvh_pixels.hh
+++ b/source/blender/blenkernel/BKE_pbvh_pixels.hh
@@ -222,9 +222,7 @@ struct NodeData {
   }
 };
 
-Triangles &BKE_pbvh_pixels_triangles_get(PBVHNode &node);
-UDIMTilePixels *BKE_pbvh_pixels_tile_data_get(PBVHNode &node,
-                                              const image::ImageTileWrapper &image_tile);
+NodeData &BKE_pbvh_pixels_node_data_get(PBVHNode &node);
 void BKE_pbvh_pixels_mark_dirty(PBVHNode &node);
 void BKE_pbvh_pixels_mark_image_dirty(PBVHNode &node, Image &image, ImageUser &image_user);
 /** Extend pixels to fix uv seams for the given nodes. */
diff --git a/source/blender/blenkernel/intern/pbvh_pixels.cc b/source/blender/blenkernel/intern/pbvh_pixels.cc
index b4f8c6f8265..bcb97624566 100644
--- a/source/blender/blenkernel/intern/pbvh_pixels.cc
+++ b/source/blender/blenkernel/intern/pbvh_pixels.cc
@@ -367,19 +367,11 @@ static void update_pixels(PBVH *pbvh,
 #endif
 }
 
-Triangles &BKE_pbvh_pixels_triangles_get(PBVHNode &node)
+NodeData &BKE_pbvh_pixels_node_data_get(PBVHNode &node)
 {
   BLI_assert(node.pixels.node_data != nullptr);
   NodeData *node_data = static_cast<NodeData *>(node.pixels.node_data);
-  return node_data->triangles;
-}
-
-UDIMTilePixels *BKE_pbvh_pixels_tile_data_get(PBVHNode &node,
-                                              const image::ImageTileWrapper &image_tile)
-{
-  BLI_assert(node.pixels.node_data != nullptr);
-  NodeData *node_data = static_cast<NodeData *>(node.pixels.node_data);
-  return node_data->find_tile_data(image_tile);
+  return *node_data;
 }
 
 void BKE_pbvh_pixels_mark_dirty(PBVHNode &node)
diff --git a/source/blender/editors/sculpt_paint/sculpt_paint_image.cc b/source/blender/editors/sculpt_paint/sculpt_paint_image.cc
index 2c4e7553ef3..2c587656ef1 100644
--- a/source/blender/editors/sculpt_paint/sculpt_paint_image.cc
+++ b/source/blender/editors/sculpt_paint/sculpt_paint_image.cc
@@ -291,14 +291,15 @@ static void do_paint_pixels(void *__restrict userdata,
   const Brush *brush = data->brush;
   PBVHNode *node = data->nodes[n];
 
-  Triangles &triangles = BKE_pbvh_pixels_triangles_get(*node);
+  NodeData &node_data = BKE_pbvh_pixels_node_data_get(*node);
+
   /* Propagate vertex brush test to triangle. This should be extended with brush overlapping edges
    * and faces only. */
   /* TODO(jbakker) move to user data. to reduce reallocation. */
-  std::vector<bool> triangle_brush_test_results(triangles.size());
+  std::vector<bool> triangle_brush_test_results(node_data.triangles.size());
 
-  for (int triangle_index = 0; triangle_index < triangles.size(); triangle_index++) {
-    TrianglePaintInput &triangle = triangles.get_paint_input(triangle_index);
+  for (int triangle_index = 0; triangle_index < node_data.triangles.size(); triangle_index++) {
+    TrianglePaintInput &triangle = node_data.triangles.get_paint_input(triangle_index);
     int3 &vert_indices = triangle.vert_indices;
     for (int i = 0; i < 3; i++) {
       triangle_brush_test_results[triangle_index] = triangle_brush_test_results[triangle_index] ||
@@ -313,40 +314,39 @@ static void do_paint_pixels(void *__restrict userdata,
 
   ImageUser image_user = *data->image_data.image_user;
   bool pixels_updated = false;
-  LISTBASE_FOREACH (ImageTile *, tile, &data->image_data.image->tiles) {
-    ImageTileWrapper image_tile(tile);
-    image_user.tile = image_tile.get_tile_number();
-    UDIMTilePixels *tile_data = BKE_pbvh_pixels_tile_data_get(*node, image_tile);
-    if (tile_data == nullptr) {
-      /* This node doesn't paint on this tile. */
-      continue;
-    }
-
-    ImBuf *image_buffer = BKE_image_acquire_ibuf(data->image_data.image, &image_user, nullptr);
-    if (image_buffer == nullptr) {
-      continue;
-    }
-
-    for (const PackedPixelRow &pixel_row : tile_data->pixel_rows) {
-      if (!triangle_brush_test_results[pixel_row.triangle_index]) {
-        continue;
-      }
-      bool pixels_painted = false;
-      if (image_buffer->rect_float != nullptr) {
-        pixels_painted = kernel_float4.paint(triangles, pixel_row, image_buffer);
-      }
-      else {
-        pixels_painted = kernel_byte4.paint(triangles, pixel_row, image_buffer);
-      }
-
-      if (pixels_painted) {
-        tile_data->mark_dirty(pixel_row);
+  for (UDIMTilePixels &tile_data : node_data.tiles) {
+    LISTBASE_FOREACH (ImageTile *, tile, &data->image_data.image->tiles) {
+      ImageTileWrapper image_tile(tile);
+      if (image_tile.get_tile_number() == tile_data.tile_number) {
+        image_user.tile = image_tile.get_tile_number();
+
+        ImBuf *image_buffer = BKE_image_acquire_ibuf(data->image_data.image, &image_user, nullptr);
+        if (image_buffer == nullptr) {
+          continue;
+        }
+
+        for (const PackedPixelRow &pixel_row : tile_data.pixel_rows) {
+          if (!triangle_brush_test_results[pixel_row.triangle_index]) {
+            continue;
+          }
+          bool pixels_painted = false;
+          if (image_buffer->rect_float != nullptr) {
+            pixels_painted = kernel_float4.paint(node_data.triangles, pixel_row, image_buffer);
+          }
+          else {
+            pixels_painted = kernel_byte4.paint(node_data.triangles, pixel_row, image_buffer);
+          }
+
+          if (pixels_painted) {
+            tile_data.mark_dirty(pixel_row);
+          }
+        }
+
+        BKE_image_release_ibuf(data->image_data.image, image_buffer, nullptr);
+        pixels_updated |= tile_data.flags.dirty;
       }
+      break;
     }
-
-    BKE_image_release_ibuf(data->image_data.image, image_buffer, nullptr);
-
-    pixels_updated |= tile_data->flags.dirty;
   }
 
   if (pixels_updated) {



More information about the Bf-blender-cvs mailing list