[Bf-blender-cvs] [44126f76ea7] temp-T97352-3d-texturing-seam-bleeding: Determine region to update from changed pixels.
Jeroen Bakker
noreply at git.blender.org
Fri Apr 22 10:51:45 CEST 2022
Commit: 44126f76ea7bca07c2eb2ab2f3c709e17a7c5d8d
Author: Jeroen Bakker
Date: Fri Apr 22 09:45:12 2022 +0200
Branches: temp-T97352-3d-texturing-seam-bleeding
https://developer.blender.org/rB44126f76ea7bca07c2eb2ab2f3c709e17a7c5d8d
Determine region to update from changed pixels.
===================================================================
M source/blender/blenkernel/BKE_pbvh_pixels.hh
M source/blender/blenkernel/intern/pbvh_pixels.cc
M source/blender/blenkernel/intern/pbvh_pixels_seams.cc
===================================================================
diff --git a/source/blender/blenkernel/BKE_pbvh_pixels.hh b/source/blender/blenkernel/BKE_pbvh_pixels.hh
index 63e110775e9..07c17279a44 100644
--- a/source/blender/blenkernel/BKE_pbvh_pixels.hh
+++ b/source/blender/blenkernel/BKE_pbvh_pixels.hh
@@ -141,13 +141,10 @@ struct UDIMSeamFixes {
uint16_t src_tile_number;
uint16_t dst_tile_number;
Vector<SeamFix> pixels;
- /* Region of the dst image buffer for partial update. Should cover all `pixels.dst_pixels`. */
- rcti dst_partial_region;
UDIMSeamFixes(uint16_t src_tile_number, uint16_t dst_tile_number)
: src_tile_number(src_tile_number), dst_tile_number(dst_tile_number)
{
- BLI_rcti_init_minmax(&dst_partial_region);
}
};
diff --git a/source/blender/blenkernel/intern/pbvh_pixels.cc b/source/blender/blenkernel/intern/pbvh_pixels.cc
index 6f32451e71f..d3c1f71931a 100644
--- a/source/blender/blenkernel/intern/pbvh_pixels.cc
+++ b/source/blender/blenkernel/intern/pbvh_pixels.cc
@@ -259,16 +259,35 @@ static void apply_watertight_check(PBVH *pbvh, Image *image, ImageUser *image_us
pixel_row.start_image_coordinate.x;
for (int x = 0; x < pixel_row.num_pixels; x++) {
if (image_buffer->rect_float) {
- copy_v4_fl(&image_buffer->rect_float[pixel_offset * 4], 1.0);
+ copy_v4_fl4(&image_buffer->rect_float[pixel_offset * 4], 0.0f, 0.5f, 0.0f, 1.0f);
}
if (image_buffer->rect) {
uint8_t *dest = static_cast<uint8_t *>(
static_cast<void *>(&image_buffer->rect[pixel_offset]));
- copy_v4_uchar(dest, 255);
+ static uint8_t color[] = {0, 128, 0, 255};
+ copy_v4_v4_uchar(dest, color);
}
pixel_offset += 1;
}
}
+
+ for (UDIMSeamFixes &fixes : node_data->seams) {
+ if (fixes.dst_tile_number != image_tile.get_tile_number()) {
+ continue;
+ }
+ for (SeamFix &fix : fixes.pixels) {
+ int pixel_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[pixel_offset * 4], 1.0f, 0.0f, 0.0f, 1.0f);
+ }
+ else if (image_buffer->rect != nullptr) {
+ uint8_t *dest = static_cast<uint8_t *>(
+ static_cast<void *>(&image_buffer->rect[pixel_offset]));
+ static uint8_t seam_color[] = {255, 0, 0, 255};
+ copy_v4_v4_uchar(dest, seam_color);
+ }
+ }
+ }
}
BKE_image_release_ibuf(image, image_buffer, nullptr);
}
@@ -303,13 +322,14 @@ static void update_pixels(PBVH *pbvh, Mesh *mesh, Image *image, ImageUser *image
TaskParallelSettings settings;
BKE_pbvh_parallel_range_settings(&settings, true, nodes_to_update.size());
BLI_task_parallel_range(0, nodes_to_update.size(), &user_data, do_encode_pixels, &settings);
- if (USE_WATERTIGHT_CHECK) {
- apply_watertight_check(pbvh, image, image_user);
- }
int cd_loop_uv_offset = CustomData_get_offset(&mesh->ldata, CD_MLOOPUV);
BKE_pbvh_pixels_rebuild_seams(pbvh, mesh, image, image_user, cd_loop_uv_offset);
+ if (USE_WATERTIGHT_CHECK) {
+ apply_watertight_check(pbvh, image, image_user);
+ }
+
/* Clear the UpdatePixels flag. */
for (PBVHNode *node : nodes_to_update) {
node->flag = static_cast<PBVHNodeFlags>(node->flag & ~PBVH_RebuildPixels);
diff --git a/source/blender/blenkernel/intern/pbvh_pixels_seams.cc b/source/blender/blenkernel/intern/pbvh_pixels_seams.cc
index 5b973c5092c..9982888a5b7 100644
--- a/source/blender/blenkernel/intern/pbvh_pixels_seams.cc
+++ b/source/blender/blenkernel/intern/pbvh_pixels_seams.cc
@@ -234,7 +234,6 @@ static void add_seam_fix(PBVHNode &node,
{
NodeData &node_data = BKE_pbvh_pixels_node_data_get(node);
UDIMSeamFixes &seam_fixes = node_data.ensure_seam_fixes(src_tile_number, dst_tile_number);
- BLI_rcti_do_minmax_v(&seam_fixes.dst_partial_region, dst_pixel);
seam_fixes.pixels.append(SeamFix{src_pixel, dst_pixel});
}
@@ -275,7 +274,7 @@ static void build_fixes(PBVH &pbvh,
/* Distance to the edge in pixel space. */
float distance_to_edge = len_v2v2(closest_coord, uv_coord);
- if (distance_to_edge > 2.5f) {
+ if (distance_to_edge > 3.5f) {
continue;
}
@@ -342,7 +341,7 @@ static void build_fixes(PBVH &pbvh,
for (Bitmap &bitmap : bitmaps.bitmaps) {
rcti uvbounds_i;
- const int MARGIN = 1;
+ const int MARGIN = 2;
uvbounds_i.xmin = (uvbounds.xmin - bitmap.image_tile.get_tile_x_offset()) *
bitmap.resolution[0] -
MARGIN;
@@ -507,10 +506,20 @@ void BKE_pbvh_pixels_fix_seams(PBVHNode *node, Image *image, ImageUser *image_us
continue;
}
+ /** Determine the region to update by checking actual changes. */
+ rcti region_to_update;
+ BLI_rcti_init_minmax(®ion_to_update);
+
if (src_image_buffer->rect_float != nullptr && dst_image_buffer->rect_float != nullptr) {
for (SeamFix &fix : fixes.pixels) {
int src_offset = fix.src_pixel.y * src_image_buffer->x + fix.src_pixel.x;
int dst_offset = fix.dst_pixel.y * dst_image_buffer->x + fix.dst_pixel.x;
+
+ if (equals_v4v4(&dst_image_buffer->rect_float[dst_offset * 4],
+ &src_image_buffer->rect_float[src_offset * 4])) {
+ continue;
+ }
+ BLI_rcti_do_minmax_v(®ion_to_update, fix.dst_pixel);
copy_v4_v4(&dst_image_buffer->rect_float[dst_offset * 4],
&src_image_buffer->rect_float[src_offset * 4]);
}
@@ -519,19 +528,25 @@ void BKE_pbvh_pixels_fix_seams(PBVHNode *node, Image *image, ImageUser *image_us
for (SeamFix &fix : fixes.pixels) {
int src_offset = fix.src_pixel.y * src_image_buffer->x + fix.src_pixel.x;
int dst_offset = fix.dst_pixel.y * dst_image_buffer->x + fix.dst_pixel.x;
+ if (dst_image_buffer->rect[dst_offset] == src_image_buffer->rect[src_offset]) {
+ continue;
+ }
+ BLI_rcti_do_minmax_v(®ion_to_update, fix.dst_pixel);
dst_image_buffer->rect[dst_offset] = src_image_buffer->rect[src_offset];
}
}
/* Mark dst_image_buffer region dirty covering each dst_pixel. */
- LISTBASE_FOREACH (ImageTile *, image_tile, &image->tiles) {
- if (image_tile->tile_number != fixes.dst_tile_number) {
- continue;
- }
+ if (BLI_rcti_is_valid(®ion_to_update)) {
+ LISTBASE_FOREACH (ImageTile *, image_tile, &image->tiles) {
+ if (image_tile->tile_number != fixes.dst_tile_number) {
+ continue;
+ }
- BKE_image_partial_update_mark_region(
- image, image_tile, dst_image_buffer, &fixes.dst_partial_region);
- break;
+ BKE_image_partial_update_mark_region(
+ image, image_tile, dst_image_buffer, ®ion_to_update);
+ break;
+ }
}
BKE_image_release_ibuf(image, src_image_buffer, nullptr);
BKE_image_release_ibuf(image, dst_image_buffer, nullptr);
More information about the Bf-blender-cvs
mailing list