[Bf-blender-cvs] [f8bc7be60fb] temp-T101739-fix-seam-bleeding-non-manifold: Copy pixels classes.
Jeroen Bakker
noreply at git.blender.org
Tue Dec 20 15:23:44 CET 2022
Commit: f8bc7be60fbad611b0d3536f107056f4c382547b
Author: Jeroen Bakker
Date: Tue Dec 20 15:23:27 2022 +0100
Branches: temp-T101739-fix-seam-bleeding-non-manifold
https://developer.blender.org/rBf8bc7be60fbad611b0d3536f107056f4c382547b
Copy pixels classes.
===================================================================
M source/blender/blenkernel/CMakeLists.txt
A source/blender/blenkernel/intern/pbvh_pixels_copy.cc
M source/blender/blenlib/BLI_math_vec_types.hh
===================================================================
diff --git a/source/blender/blenkernel/CMakeLists.txt b/source/blender/blenkernel/CMakeLists.txt
index c12c0c06ed8..c26c5d1bc4d 100644
--- a/source/blender/blenkernel/CMakeLists.txt
+++ b/source/blender/blenkernel/CMakeLists.txt
@@ -251,6 +251,7 @@ set(SRC
intern/pbvh.cc
intern/pbvh_bmesh.c
intern/pbvh_pixels.cc
+ intern/pbvh_pixels_copy.cc
intern/pbvh_uv_islands.cc
intern/pointcache.c
intern/pointcloud.cc
diff --git a/source/blender/blenkernel/intern/pbvh_pixels_copy.cc b/source/blender/blenkernel/intern/pbvh_pixels_copy.cc
new file mode 100644
index 00000000000..a80e6606037
--- /dev/null
+++ b/source/blender/blenkernel/intern/pbvh_pixels_copy.cc
@@ -0,0 +1,109 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later
+ * Copyright 2022 Blender Foundation. All rights reserved. */
+
+#include "BLI_math_vec_types.hh"
+#include "BLI_vector.hh"
+#include "BLI_math.h"
+
+#include "IMB_imbuf.h"
+#include "IMB_imbuf_types.h"
+
+namespace blender::kernel::pbvh::pixels {
+template<typename T, int Channels = 4> struct ImageBufferAccessor {
+ ImBuf &image_buffer;
+
+ ImageBufferAccessor(ImBuf &image_buffer) : image_buffer(image_buffer)
+ {
+ }
+
+ float4 read_pixel(const int2 coordinate)
+ {
+ int offset = (coordinate.y * image_buffer.x + coordinate.x) * Channels;
+ return float4(&image_buffer.rect_float[offset]);
+ }
+
+ void write_pixel(const int2 coordinate, float4 new_value)
+ {
+ int offset = (coordinate.y * image_buffer.x + coordinate.x) * Channels;
+ copy_v4_v4(&image_buffer.rect_float[offset], new_value);
+ }
+};
+
+struct PixelCopyItem {
+ uint8_t delta_destination_x;
+ char2 delta_source_1;
+ char2 delta_source_2;
+ uint8_t mix_factor;
+};
+
+struct PixelCopyGroup {
+ int2 destination;
+ Vector<PixelCopyItem> items;
+};
+
+/** Pixel copy command to mix 2 source pixels and write to a destination pixel. */
+struct PixelCopyCommand {
+ /** Pixel coordinate to write to. */
+ int2 destination;
+ /** Pixel coordinate to read first source from. */
+ int2 source_1;
+ /** Pixel coordinate to read second source from. */
+ int2 source_2;
+ /** Factor to mix between first and second source. */
+ float mix_factor;
+
+ PixelCopyCommand(const PixelCopyGroup &group)
+ : destination(group.destination),
+ source_1(group.destination),
+ source_2(group.destination),
+ mix_factor(0.0f)
+ {
+ }
+
+ template<typename T> void mix_source_and_write_destination(ImageBufferAccessor<T> &tile_buffer) const
+ {
+ float4 source_color_1 = tile_buffer.read_pixel(source_1);
+ float4 source_color_2 = tile_buffer.read_pixel(source_2);
+ float4 destination_color = source_color_1 * (1.0f - mix_factor) + source_color_2 * mix_factor;
+ tile_buffer.write_pixel(destination, destination_color);
+ }
+};
+
+PixelCopyCommand &operator+=(PixelCopyCommand &command, const PixelCopyItem &item)
+{
+ command.destination.x += int(item.delta_destination_x);
+ command.source_1 += int2(item.delta_source_1);
+ command.source_2 += int2(item.delta_source_2);
+ command.mix_factor = float(item.mix_factor) / 255.0f;
+ return command;
+}
+
+struct PixelCopyGroups {
+ Vector<PixelCopyGroup> groups;
+
+ void copy_pixels(ImBuf &tile_buffer) const
+ {
+ if (tile_buffer.rect_float) {
+ ImageBufferAccessor<float4> accessor(tile_buffer);
+ copy_pixels<float4>(accessor);
+ }
+ else {
+ ImageBufferAccessor<int> accessor(tile_buffer);
+ copy_pixels<int>(accessor);
+ }
+ }
+
+ 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) {
+ copy_command += item;
+ copy_command.mix_source_and_write_destination<T>(image_buffer);
+ }
+ }
+ }
+};
+
+} // namespace blender::kernel::pbvh::pixels
diff --git a/source/blender/blenlib/BLI_math_vec_types.hh b/source/blender/blenlib/BLI_math_vec_types.hh
index f57b4b44e61..20a8539c67c 100644
--- a/source/blender/blenlib/BLI_math_vec_types.hh
+++ b/source/blender/blenlib/BLI_math_vec_types.hh
@@ -602,6 +602,7 @@ template<typename T, int Size> struct vec_base : public vec_struct_base<T, Size>
}
};
+using char2 = blender::vec_base<int8_t, 2>;
using char3 = blender::vec_base<int8_t, 3>;
using uchar3 = blender::vec_base<uint8_t, 3>;
More information about the Bf-blender-cvs
mailing list