[Bf-blender-cvs] [1986d4ac40c] temp-T101739-fix-seam-bleeding-non-manifold: Only fix seam bleeding on tiles that are painted on.

Jeroen Bakker noreply at git.blender.org
Fri Jan 13 14:09:28 CET 2023


Commit: 1986d4ac40c38d5b2e8a8556f3dee1ecea9701fb
Author: Jeroen Bakker
Date:   Fri Jan 13 14:08:58 2023 +0100
Branches: temp-T101739-fix-seam-bleeding-non-manifold
https://developer.blender.org/rB1986d4ac40c38d5b2e8a8556f3dee1ecea9701fb

Only fix seam bleeding on tiles that are painted on.

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

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 ea55c50d0f2..3defa5fcbab 100644
--- a/source/blender/blenkernel/BKE_pbvh_pixels.hh
+++ b/source/blender/blenkernel/BKE_pbvh_pixels.hh
@@ -231,6 +231,15 @@ struct NodeData {
     }
   }
 
+  void collect_dirty_tiles(Vector<image::TileNumber> &r_dirty_tiles)
+  {
+    for (UDIMTilePixels &tile : tiles) {
+      if (tile.flags.dirty) {
+        r_dirty_tiles.append_non_duplicates(tile.tile_number);
+      }
+    }
+  }
+
   void clear_data()
   {
     tiles.clear();
@@ -425,6 +434,7 @@ struct PBVHData {
 NodeData &BKE_pbvh_pixels_node_data_get(PBVHNode &node);
 void BKE_pbvh_pixels_mark_image_dirty(PBVHNode &node, Image &image, ImageUser &image_user);
 PBVHData &BKE_pbvh_pixels_data_get(PBVH &pbvh);
+void BKE_pbvh_pixels_collect_dirty_tiles(PBVHNode &node, Vector<image::TileNumber> &r_dirty_tiles);
 
 void BKE_pbvh_pixels_copy_pixels(PBVH &pbvh,
                                  Image &image,
diff --git a/source/blender/blenkernel/intern/pbvh_pixels.cc b/source/blender/blenkernel/intern/pbvh_pixels.cc
index d45dac71bf4..e826b0fbc02 100644
--- a/source/blender/blenkernel/intern/pbvh_pixels.cc
+++ b/source/blender/blenkernel/intern/pbvh_pixels.cc
@@ -485,6 +485,12 @@ void BKE_pbvh_pixels_mark_image_dirty(PBVHNode &node, Image &image, ImageUser &i
   }
 }
 
+void BKE_pbvh_pixels_collect_dirty_tiles(PBVHNode &node, Vector<image::TileNumber> &r_dirty_tiles)
+{
+  NodeData *node_data = static_cast<NodeData *>(node.pixels.node_data);
+  node_data->collect_dirty_tiles(r_dirty_tiles);
+}
+
 }  // namespace blender::bke::pbvh::pixels
 
 extern "C" {
diff --git a/source/blender/editors/sculpt_paint/sculpt_paint_image.cc b/source/blender/editors/sculpt_paint/sculpt_paint_image.cc
index 787d35be010..94563cd2c50 100644
--- a/source/blender/editors/sculpt_paint/sculpt_paint_image.cc
+++ b/source/blender/editors/sculpt_paint/sculpt_paint_image.cc
@@ -483,19 +483,40 @@ static void do_mark_dirty_regions(void *__restrict userdata,
   BKE_pbvh_pixels_mark_image_dirty(*node, *data->image_data.image, *data->image_data.image_user);
 }
 
-static void fix_none_manifold_seam_bleeding(Object &ob, TexturePaintingUserData &user_data)
+/* -------------------------------------------------------------------- */
+
+/** \name Fix non-manifold edge bleeding.
+ * \{ */
+
+static Vector<image::TileNumber> collect_dirty_tiles(Span<PBVHNode *> nodes)
 {
-  PBVH &pbvh = *ob.sculpt->pbvh;
-  LISTBASE_FOREACH (ImageTile *, tile, &user_data.image_data.image->tiles) {
-    image::ImageTileWrapper image_tile(tile);
-    // TODO: only fix seam bleeding of tiles that have been painted on.
-    BKE_pbvh_pixels_copy_pixels(pbvh,
-                                *user_data.image_data.image,
-                                *user_data.image_data.image_user,
-                                image_tile.get_tile_number());
+  Vector<image::TileNumber> dirty_tiles;
+  for (PBVHNode *node : nodes) {
+    BKE_pbvh_pixels_collect_dirty_tiles(*node, dirty_tiles);
+  }
+  return dirty_tiles;
+}
+static void fix_non_manifold_seam_bleeding(PBVH &pbvh,
+                                           TexturePaintingUserData &user_data,
+                                           Span<TileNumber> tile_numbers_to_fix)
+{
+  for (image::TileNumber tile_number : tile_numbers_to_fix) {
+    BKE_pbvh_pixels_copy_pixels(
+        pbvh, *user_data.image_data.image, *user_data.image_data.image_user, tile_number);
   }
 }
 
+static void fix_non_manifold_seam_bleeding(Object &ob,
+                                           const int totnode,
+                                           TexturePaintingUserData &user_data)
+{
+  Vector<image::TileNumber> dirty_tiles = collect_dirty_tiles(
+      Span<PBVHNode *>(user_data.nodes, totnode));
+  fix_non_manifold_seam_bleeding(*ob.sculpt->pbvh, user_data, dirty_tiles);
+}
+
+/** \} */
+
 }  // namespace blender::ed::sculpt_paint::paint::image
 
 extern "C" {
@@ -551,12 +572,10 @@ void SCULPT_do_paint_brush_image(
   BKE_pbvh_parallel_range_settings(&settings, true, totnode);
   BLI_task_parallel_range(0, totnode, &data, do_push_undo_tile, &settings);
   BLI_task_parallel_range(0, totnode, &data, do_paint_pixels, &settings);
+  fix_non_manifold_seam_bleeding(*ob, totnode, data);
 
   TaskParallelSettings settings_flush;
   BKE_pbvh_parallel_range_settings(&settings_flush, false, totnode);
   BLI_task_parallel_range(0, totnode, &data, do_mark_dirty_regions, &settings_flush);
-
-  /* TODO: should be done at the end of the stroke.*/
-  fix_none_manifold_seam_bleeding(*ob, data);
 }
 }



More information about the Bf-blender-cvs mailing list