[Bf-blender-cvs] [9d04934ed49] temp-T101739-fix-seam-bleeding-non-manifold: Fix incorrect bound selection.
Jeroen Bakker
noreply at git.blender.org
Thu Jan 12 16:03:25 CET 2023
Commit: 9d04934ed49a349e68488513f74228172cdbfd32
Author: Jeroen Bakker
Date: Thu Jan 12 16:03:20 2023 +0100
Branches: temp-T101739-fix-seam-bleeding-non-manifold
https://developer.blender.org/rB9d04934ed49a349e68488513f74228172cdbfd32
Fix incorrect bound selection.
===================================================================
M source/blender/blenkernel/BKE_pbvh_pixels.hh
M source/blender/blenkernel/intern/pbvh_pixels_copy.cc
===================================================================
diff --git a/source/blender/blenkernel/BKE_pbvh_pixels.hh b/source/blender/blenkernel/BKE_pbvh_pixels.hh
index 06cc75f3bc2..29e94a28835 100644
--- a/source/blender/blenkernel/BKE_pbvh_pixels.hh
+++ b/source/blender/blenkernel/BKE_pbvh_pixels.hh
@@ -268,6 +268,11 @@ struct PixelCopyItem {
char2 delta_source_1;
char2 delta_source_2;
uint8_t mix_factor;
+
+ PixelCopyItem(char2 delta_source_1, char2 delta_source_2, uint8_t mix_factor)
+ : delta_source_1(delta_source_1), delta_source_2(delta_source_2), mix_factor(mix_factor)
+ {
+ }
};
struct PixelCopyGroup {
@@ -312,6 +317,13 @@ struct PixelCopyCommand {
source_2 = source_1 + int2(item.delta_source_2);
mix_factor = float(item.mix_factor) / 255.0f;
}
+
+ PixelCopyItem encode_delta(const PixelCopyCommand &next_command) const
+ {
+ return PixelCopyItem(char2(next_command.source_1 - source_1),
+ char2(next_command.source_2 - next_command.source_1),
+ uint8_t(next_command.mix_factor * 255));
+ }
};
struct PixelCopyTile {
@@ -341,6 +353,13 @@ struct PixelCopyTile {
PixelCopyCommand copy_command(group);
for (const PixelCopyItem &item : group.items) {
copy_command.apply(item);
+ /*
+ printf("| %d,%d | %d,%d | %d,%d | %f |\n",
+ UNPACK2(copy_command.destination),
+ UNPACK2(copy_command.source_1),
+ UNPACK2(copy_command.source_2),
+ copy_command.mix_factor);
+ */
copy_command.mix_source_and_write_destination<T>(image_buffer);
}
}
diff --git a/source/blender/blenkernel/intern/pbvh_pixels_copy.cc b/source/blender/blenkernel/intern/pbvh_pixels_copy.cc
index 96887b537fc..0ee8088eb5c 100644
--- a/source/blender/blenkernel/intern/pbvh_pixels_copy.cc
+++ b/source/blender/blenkernel/intern/pbvh_pixels_copy.cc
@@ -323,8 +323,8 @@ struct Rows {
* first_source. */
int2 found_source = first_source;
float found_distance = std::numeric_limits<float>().max();
- for (int sy : IndexRange(search_bounds.ymin, BLI_rcti_size_y(&search_bounds))) {
- for (int sx : IndexRange(search_bounds.xmin, BLI_rcti_size_x(&search_bounds))) {
+ for (int sy : IndexRange(search_bounds.ymin, BLI_rcti_size_y(&search_bounds) + 1)) {
+ for (int sx : IndexRange(search_bounds.xmin, BLI_rcti_size_x(&search_bounds) + 1)) {
int2 source(sx, sy);
/* Skip first source as it should be the closest and already selected. */
if (source == first_source) {
@@ -334,7 +334,7 @@ struct Rows {
continue;
}
- float new_distance = blender::math::distance(destination, source);
+ float new_distance = blender::math::distance(float2(destination), float2(source));
if (new_distance < found_distance) {
found_distance = new_distance;
found_source = source;
@@ -346,6 +346,9 @@ struct Rows {
float determine_mix_factor(int2 destination, int2 source_1, int2 source_2)
{
+ if (source_1 == source_2) {
+ return 0.0f;
+ }
return dist_to_line_segment_v2(float2(destination), float2(source_1), float2(source_2));
}
@@ -413,10 +416,8 @@ struct Rows {
static void extend_with(PixelCopyGroup &group, const PixelCopyCommand &command)
{
PixelCopyCommand last_command = last_copy_command(group);
- PixelCopyItem new_item = {char2(command.source_1 - last_command.source_1),
- char2(command.source_2 - command.source_1),
- uint8_t(command.mix_factor * 255)};
- group.items.append(new_item);
+ PixelCopyItem delta_command = last_command.encode_delta(command);
+ group.items.append(delta_command);
}
static PixelCopyCommand last_copy_command(const PixelCopyGroup &group)
More information about the Bf-blender-cvs
mailing list