Commit: 8fef9b56317784e80fce72c9e3a505d8f4f659a0 Author: Jeroen Bakker Date: Fri Jan 13 08:43:16 2023 +0100 Branches: temp-T101739-fix-seam-bleeding-non-manifold https://developer.blender.org/rB8fef9b56317784e80fce72c9e3a505d8f4f659a0
Renames structs to be more readable. =================================================================== 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 29e94a28835..0ccb28a6a51 100644 --- a/source/blender/blenkernel/BKE_pbvh_pixels.hh +++ b/source/blender/blenkernel/BKE_pbvh_pixels.hh @@ -244,6 +244,12 @@ struct NodeData { } }; +/* -------------------------------------------------------------------- */ + +/** \name Fix non-manifold edge bleeding. + * \{ */ + +/** TODO: move to image wrappers? */ template<typename T, int Channels = 4> struct ImageBufferAccessor { ImBuf &image_buffer; @@ -264,25 +270,25 @@ template<typename T, int Channels = 4> struct ImageBufferAccessor { } }; -struct PixelCopyItem { +struct DeltaCopyPixelCommand { 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) + DeltaCopyPixelCommand(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 { +struct CopyPixelGroup { int2 destination; int2 source; - Vector<PixelCopyItem> items; + Vector<DeltaCopyPixelCommand> deltas; }; /** Pixel copy command to mix 2 source pixels and write to a destination pixel. */ -struct PixelCopyCommand { +struct CopyPixelCommand { /** Pixel coordinate to write to. */ int2 destination; /** Pixel coordinate to read first source from. */ @@ -292,8 +298,8 @@ struct PixelCopyCommand { /** Factor to mix between first and second source. */ float mix_factor; - PixelCopyCommand() = default; - PixelCopyCommand(const PixelCopyGroup &group) + CopyPixelCommand() = default; + CopyPixelCommand(const CopyPixelGroup &group) : destination(group.destination), source_1(group.source), source_2(group.source), @@ -310,7 +316,7 @@ struct PixelCopyCommand { tile_buffer.write_pixel(destination, destination_color); } - void apply(const PixelCopyItem &item) + void apply(const DeltaCopyPixelCommand &item) { destination.x += 1; source_1 += int2(item.delta_source_1); @@ -318,19 +324,19 @@ struct PixelCopyCommand { mix_factor = float(item.mix_factor) / 255.0f; } - PixelCopyItem encode_delta(const PixelCopyCommand &next_command) const + DeltaCopyPixelCommand encode_delta(const CopyPixelCommand &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)); + return DeltaCopyPixelCommand(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 { +struct CopyPixelTile { image::TileNumber tile_number; - Vector<PixelCopyGroup> groups; + Vector<CopyPixelGroup> groups; - PixelCopyTile(image::TileNumber tile_number) : tile_number(tile_number) + CopyPixelTile(image::TileNumber tile_number) : tile_number(tile_number) { } @@ -349,9 +355,9 @@ struct PixelCopyTile { private: template<typename T> void copy_pixels(ImageBufferAccessor<T> &image_buffer) const { - for (const PixelCopyGroup &group : groups) { - PixelCopyCommand copy_command(group); - for (const PixelCopyItem &item : group.items) { + for (const CopyPixelGroup &group : groups) { + CopyPixelCommand copy_command(group); + for (const DeltaCopyPixelCommand &item : group.deltas) { copy_command.apply(item); /* printf("| %d,%d | %d,%d | %d,%d | %f |\n", @@ -366,12 +372,12 @@ struct PixelCopyTile { } }; -struct PixelCopyTiles { - Vector<PixelCopyTile> tiles; +struct CopyPixelTiles { + Vector<CopyPixelTile> tiles; - std::optional<std::reference_wrapper<PixelCopyTile>> find_tile(image::TileNumber tile_number) + std::optional<std::reference_wrapper<CopyPixelTile>> find_tile(image::TileNumber tile_number) { - for (PixelCopyTile &tile : tiles) { + for (CopyPixelTile &tile : tiles) { if (tile.tile_number == tile_number) { return tile; } @@ -385,12 +391,14 @@ struct PixelCopyTiles { } }; +/** \} */ + struct PBVHData { /* Per UVPRimitive contains the paint data. */ PaintGeometryPrimitives geom_primitives; /** Per ImageTile the pixels to copy to fix non-manifold bleeding. */ - PixelCopyTiles tiles_copy_pixels; + CopyPixelTiles tiles_copy_pixels; void clear_data() { diff --git a/source/blender/blenkernel/intern/pbvh_pixels_copy.cc b/source/blender/blenkernel/intern/pbvh_pixels_copy.cc index 0ee8088eb5c..2c3c9aca2cd 100644 --- a/source/blender/blenkernel/intern/pbvh_pixels_copy.cc +++ b/source/blender/blenkernel/intern/pbvh_pixels_copy.cc @@ -232,7 +232,7 @@ struct Rows { struct Pixel { PixelType type = PixelType::Undecided; float distance = std::numeric_limits<float>::max(); - PixelCopyCommand copy_command; + CopyPixelCommand copy_command; Pixel() = default; @@ -397,9 +397,9 @@ struct Rows { } } - static bool can_be_extended_with(const PixelCopyGroup &group, const PixelCopyCommand &command) + static bool can_be_extended_with(const CopyPixelGroup &group, const CopyPixelCommand &command) { - PixelCopyCommand last_command = last_copy_command(group); + CopyPixelCommand last_command = last_copy_command(group); /* Can only extend when pushing the next pixel. */ if (last_command.destination.x != command.destination.x - 1 || last_command.destination.y != command.destination.y) { @@ -413,28 +413,28 @@ struct Rows { return true; } - static void extend_with(PixelCopyGroup &group, const PixelCopyCommand &command) + static void extend_with(CopyPixelGroup &group, const CopyPixelCommand &command) { - PixelCopyCommand last_command = last_copy_command(group); - PixelCopyItem delta_command = last_command.encode_delta(command); - group.items.append(delta_command); + CopyPixelCommand last_command = last_copy_command(group); + DeltaCopyPixelCommand delta_command = last_command.encode_delta(command); + group.deltas.append(delta_command); } - static PixelCopyCommand last_copy_command(const PixelCopyGroup &group) + static CopyPixelCommand last_copy_command(const CopyPixelGroup &group) { - PixelCopyCommand last_command(group); - for (const PixelCopyItem &item : group.items) { + CopyPixelCommand last_command(group); + for (const DeltaCopyPixelCommand &item : group.deltas) { last_command.apply(item); } return last_command; } - void pack_into(Vector<PixelCopyGroup> &groups) const + void pack_into(Vector<CopyPixelGroup> &groups) const { for (const Pixel &elem : pixels) { if (elem.type == PixelType::CopyFromClosestEdge) { if (groups.is_empty() || !can_be_extended_with(groups.last(), elem.copy_command)) { - PixelCopyGroup new_group = { + CopyPixelGroup new_group = { elem.copy_command.destination - int2(1, 0), elem.copy_command.source_1, {}}; groups.append(new_group); } @@ -481,7 +481,7 @@ struct Rows { } } - void pack_into(Vector<PixelCopyGroup> &groups) const + void pack_into(Vector<CopyPixelGroup> &groups) const { for (const Row &row : rows) { row.pack_into(groups); @@ -498,7 +498,7 @@ struct Rows { }; // namespace blender::bke::pbvh::pixels -static void copy_pixels_reinit(PixelCopyTiles &tiles) +static void copy_pixels_reinit(CopyPixelTiles &tiles) { tiles.clear(); } @@ -533,7 +533,7 @@ void BKE_pbvh_pixels_copy_update(PBVH &pbvh, NonManifoldTileEdges tile_edges = non_manifold_edges.extract_tile_edges(image_tile, tile_resolution); - PixelCopyTile copy_tile(image_tile.get_tile_number()); + CopyPixelTile copy_tile(image_tile.get_tile_number()); Rows rows(tile_resolution, image.seam_margin, nodes_tile_pixels); rows.mark_for_evaluation(tile_edges); @@ -551,7 +551,7 @@ void BKE_pbvh_pixels_copy_pixels(PBVH &pbvh, { // TIMEIT_START(pbvh_pixels_copy_pixels); PBVHData &pbvh_data = BKE_pbvh_pixels_data_get(pbvh); - std::optional<std::reference_wrapper<PixelCopyTile>> pixel_tile = + std::optional<std::reference_wrapper<CopyPixelTile>> pixel_tile = pbvh_data.tiles_copy_pixels.find_tile(tile_number); if (!pixel_tile.has_value()) { /* No pixels need to be copied. */ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org List details, subscription details or unsubscribe: https://lists.blender.org/mailman/listinfo/bf-blender-cvs