[Bf-blender-cvs] [f7a1433ffbf] temp-T101739-fix-seam-bleeding-non-manifold: Add support for byte textures.

Jeroen Bakker noreply at git.blender.org
Fri Jan 13 15:09:26 CET 2023


Commit: f7a1433ffbf1db4481fb187df52e19c16615f910
Author: Jeroen Bakker
Date:   Fri Jan 13 15:09:15 2023 +0100
Branches: temp-T101739-fix-seam-bleeding-non-manifold
https://developer.blender.org/rBf7a1433ffbf1db4481fb187df52e19c16615f910

Add support for byte textures.

===================================================================

M	source/blender/blenkernel/BKE_pbvh_pixels.hh

===================================================================

diff --git a/source/blender/blenkernel/BKE_pbvh_pixels.hh b/source/blender/blenkernel/BKE_pbvh_pixels.hh
index 3defa5fcbab..90cade4efa7 100644
--- a/source/blender/blenkernel/BKE_pbvh_pixels.hh
+++ b/source/blender/blenkernel/BKE_pbvh_pixels.hh
@@ -258,7 +258,8 @@ struct NodeData {
 /** \name Fix non-manifold edge bleeding.
  * \{ */
 
-/** TODO: move to image wrappers? */
+// TODO: move to image wrappers?
+// TODO: Add compile time checks.
 template<typename T, int Channels = 4> struct ImageBufferAccessor {
   ImBuf &image_buffer;
 
@@ -268,14 +269,31 @@ template<typename T, int Channels = 4> struct ImageBufferAccessor {
 
   float4 read_pixel(const int2 coordinate)
   {
-    int offset = (coordinate.y * image_buffer.x + coordinate.x) * Channels;
-    return float4(&image_buffer.rect_float[offset]);
+    if constexpr ((std::is_same_v<T, float>)) {
+      int offset = (coordinate.y * image_buffer.x + coordinate.x) * Channels;
+      return float4(&image_buffer.rect_float[offset]);
+    }
+    if constexpr ((std::is_same_v<T, int>)) {
+      int offset = (coordinate.y * image_buffer.x + coordinate.x);
+      float4 result;
+      rgba_uchar_to_float(result,
+                          static_cast<uchar *>(static_cast<void *>(&image_buffer.rect[offset])));
+      return result;
+    }
+    return float4();
   }
 
   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);
+    if constexpr ((std::is_same_v<T, float>)) {
+      int offset = (coordinate.y * image_buffer.x + coordinate.x) * Channels;
+      copy_v4_v4(&image_buffer.rect_float[offset], new_value);
+    }
+    if constexpr ((std::is_same_v<T, int>)) {
+      int offset = (coordinate.y * image_buffer.x + coordinate.x);
+      rgba_float_to_uchar(static_cast<uchar *>(static_cast<void *>(&image_buffer.rect[offset])),
+                          new_value);
+    }
   }
 };



More information about the Bf-blender-cvs mailing list