[Bf-blender-cvs] [ab8c9803656] temp-T97352-3d-texturing-seam-bleeding: Seam extraction.
Jeroen Bakker
noreply at git.blender.org
Tue Apr 19 16:01:05 CEST 2022
Commit: ab8c98036569fc8c49606e602392bab6dc7f40b1
Author: Jeroen Bakker
Date: Tue Apr 19 16:00:50 2022 +0200
Branches: temp-T97352-3d-texturing-seam-bleeding
https://developer.blender.org/rBab8c98036569fc8c49606e602392bab6dc7f40b1
Seam extraction.
===================================================================
M source/blender/blenkernel/BKE_pbvh_pixels.hh
M source/blender/blenkernel/intern/pbvh_pixels_seams.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 5964959b761..128b8d0f3d7 100644
--- a/source/blender/blenkernel/BKE_pbvh_pixels.hh
+++ b/source/blender/blenkernel/BKE_pbvh_pixels.hh
@@ -212,6 +212,6 @@ void BKE_pbvh_pixels_mark_image_dirty(PBVHNode &node, Image &image, ImageUser &i
void BKE_pbvh_pixels_rebuild_seams(
PBVH *pbvh, Mesh *me, Image *image, ImageUser *image_user, int cd_loop_uv_offset);
-void BKE_pbvh_pixels_fix_seams(PBVH *pbvh, Image *image, ImageUser *image_user);
+void BKE_pbvh_pixels_fix_seams(PBVHNode *node, Image *image, ImageUser *image_user);
} // namespace blender::bke::pbvh::pixels
diff --git a/source/blender/blenkernel/intern/pbvh_pixels_seams.cc b/source/blender/blenkernel/intern/pbvh_pixels_seams.cc
index 5a0dffad919..8d44cb33358 100644
--- a/source/blender/blenkernel/intern/pbvh_pixels_seams.cc
+++ b/source/blender/blenkernel/intern/pbvh_pixels_seams.cc
@@ -182,7 +182,7 @@ Bitmaps create_tile_bitmap(const PBVH &pbvh, Image &image, ImageUser &image_user
int2 find_source_pixel()
{
- return int2(0, 0);
+ return int2(50, 50);
}
static void BKE_pbvh_pixels_clear_seams(PBVH *pbvh)
@@ -264,8 +264,8 @@ void BKE_pbvh_pixels_rebuild_seams(
}
else {
- for (int v = uvbounds_i.ymin; v < uvbounds_i.ymax; v++) {
- for (int u = uvbounds_i.xmin; u < uvbounds_i.xmax; u++) {
+ for (int v = uvbounds_i.ymin; v <= uvbounds_i.ymax; v++) {
+ for (int u = uvbounds_i.xmin; u <= uvbounds_i.xmax; u++) {
if (u < 0 || u > bitmap.resolution[0] || v < 0 || v > bitmap.resolution[1]) {
/** Pixel not part of this tile. */
continue;
@@ -282,10 +282,23 @@ void BKE_pbvh_pixels_rebuild_seams(
float2 closest_point;
float lambda = closest_to_line_v2(closest_point, uv, luv_1->uv, luv_2->uv);
+ /* Calcualte the distance in pixel space. */
+ float2 uv_coord(u, v);
+ float2 closest_coord(closest_point.x * bitmap.resolution.x,
+ closest_point.y * bitmap.resolution.y);
+ float distance_to_edge = len_v2v2(uv_coord, closest_coord);
+ if (distance_to_edge > 2.5f) {
+ continue;
+ }
+
int2 source_pixel = find_source_pixel();
int2 destination_pixel(u, v);
- int source_node = bitmap.get_pixel_info(source_pixel).get_node_index();
- PBVHNode &node = pbvh->nodes[source_node];
+
+ PixelInfo src_pixel_info = bitmap.get_pixel_info(source_pixel);
+ BLI_assert(src_pixel_info.is_extracted());
+ int src_node = src_pixel_info.get_node_index();
+
+ PBVHNode &node = pbvh->nodes[src_node];
add_seam_fix(node,
bitmap.image_tile.get_tile_number(),
source_pixel,
@@ -301,8 +314,30 @@ void BKE_pbvh_pixels_rebuild_seams(
BM_mesh_free(bm);
}
-void BKE_pbvh_pixels_fix_seams(PBVH *pbvh, Image *image, ImageUser *image_user)
+void BKE_pbvh_pixels_fix_seams(PBVHNode *node, Image *image, ImageUser *image_user)
{
+ NodeData &node_data = BKE_pbvh_pixels_node_data_get(*node);
+ ImageUser iuser = *image_user;
+
+ for (UDIMSeamFixes &fixes : node_data.seams) {
+ iuser.tile = fixes.dst_tile_number;
+ ImBuf *image_buffer = BKE_image_acquire_ibuf(image, &iuser, nullptr);
+ if (image_buffer == nullptr) {
+ continue;
+ }
+
+ for (SeamFix &fix : fixes.pixels) {
+ int src_offset = fix.src_pixel.y * image_buffer->x + fix.src_pixel.x;
+ int dst_offset = fix.dst_pixel.y * image_buffer->x + fix.dst_pixel.x;
+ if (image_buffer->rect_float != nullptr) {
+ copy_v4_fl4(&image_buffer->rect_float[dst_offset * 4], 1.0, 0.0, 0.0, 1.0);
+ }
+ }
+ /* TODO: should be narrowed to the part of the image that needs to be updated. Requires
+ * access to the image tile.*/
+ BKE_image_partial_update_mark_full_update(image);
+ BKE_image_release_ibuf(image, image_buffer, nullptr);
+ }
}
} // namespace blender::bke::pbvh::pixels
diff --git a/source/blender/editors/sculpt_paint/sculpt_paint_image.cc b/source/blender/editors/sculpt_paint/sculpt_paint_image.cc
index df1ccc0fbe9..51fde3f0887 100644
--- a/source/blender/editors/sculpt_paint/sculpt_paint_image.cc
+++ b/source/blender/editors/sculpt_paint/sculpt_paint_image.cc
@@ -366,6 +366,8 @@ static void do_mark_dirty_regions(void *__restrict userdata,
{
TexturePaintingUserData *data = static_cast<TexturePaintingUserData *>(userdata);
PBVHNode *node = data->nodes[n];
+ /* TODO: we should test if we want to postpone the seam fixing to reduce overhead. */
+ BKE_pbvh_pixels_fix_seams(node, data->image_data.image, data->image_data.image_user);
BKE_pbvh_pixels_mark_image_dirty(*node, *data->image_data.image, *data->image_data.image_user);
}
More information about the Bf-blender-cvs
mailing list