[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