[Bf-blender-cvs] [27fd506501b] temp-pbvh-split: temp-pbvh-split: Fix pixel row splitting

Joseph Eagar noreply at git.blender.org
Tue May 10 01:35:54 CEST 2022


Commit: 27fd506501bab6a0b9be51b291a7da38d1c9427a
Author: Joseph Eagar
Date:   Mon May 9 16:35:39 2022 -0700
Branches: temp-pbvh-split
https://developer.blender.org/rB27fd506501bab6a0b9be51b291a7da38d1c9427a

temp-pbvh-split: Fix pixel row splitting

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

M	source/blender/blenkernel/intern/pbvh.c
M	source/blender/blenkernel/intern/pbvh_pixels.cc
M	source/blender/editors/sculpt_paint/sculpt_paint_image.cc

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

diff --git a/source/blender/blenkernel/intern/pbvh.c b/source/blender/blenkernel/intern/pbvh.c
index db6ab27f62a..129624d0885 100644
--- a/source/blender/blenkernel/intern/pbvh.c
+++ b/source/blender/blenkernel/intern/pbvh.c
@@ -687,7 +687,9 @@ void BKE_pbvh_free(PBVH *pbvh)
       if (node->bm_other_verts) {
         BLI_gset_free(node->bm_other_verts, NULL);
       }
+    }
 
+    if (node->flag & PBVH_TexLeaf) {
       pbvh_pixels_free(node);
     }
   }
diff --git a/source/blender/blenkernel/intern/pbvh_pixels.cc b/source/blender/blenkernel/intern/pbvh_pixels.cc
index a35f7267161..c962bc5c35d 100644
--- a/source/blender/blenkernel/intern/pbvh_pixels.cc
+++ b/source/blender/blenkernel/intern/pbvh_pixels.cc
@@ -68,14 +68,18 @@ int count_node_pixels(PBVHNode &node)
   return totpixel;
 }
 
-ATTR_NO_OPT void split_pixel_node(
-    PBVH *pbvh, int node_i, Mesh *mesh, Image *image, ImageUser *image_user)
+ATTR_NO_OPT static void split_pixel_node(
+    PBVH *pbvh, int node_i, Mesh *mesh, Image *image, ImageUser *image_user, int depth)
 {
   BB cb;
   PBVHNode *node = pbvh->nodes + node_i;
 
   cb = node->vb;
 
+  if (depth >= pbvh->depth_limit || count_node_pixels(*node) <= pbvh->pixel_leaf_limit) {
+    return;
+  }
+
   /* Find widest axis and its midpoint */
   const int axis = BB_widest_axis(&cb);
   const float mid = (cb.bmax[axis] + cb.bmin[axis]) * 0.5f;
@@ -164,6 +168,8 @@ ATTR_NO_OPT void split_pixel_node(
 
         if (mid < co1[axis]) {
           t = 1.0f - (mid - co2[axis]) / (co1[axis] - co2[axis]);
+
+          SWAP(UDIMTilePixels *, tile1, tile2);
         }
         else {
           t = (mid - co1[axis]) / (co2[axis] - co1[axis]);
@@ -201,30 +207,31 @@ ATTR_NO_OPT void split_pixel_node(
   }
 
   pbvh_pixels_free(node);
+
+  split_pixel_node(pbvh, child1_i, mesh, image, image_user, depth + 1);
+  split_pixel_node(pbvh, child2_i, mesh, image, image_user, depth + 1);
 }
 
-void split_pixel_nodes(PBVH *pbvh, Mesh *mesh, Image *image, ImageUser *image_user)
+static void split_pixel_nodes(PBVH *pbvh, Mesh *mesh, Image *image, ImageUser *image_user)
 {
   if (G.debug_value == 891) {
     return;
   }
 
   if (!pbvh->depth_limit) {
-    pbvh->depth_limit = 25; /* TODO: move into a constant */
+    pbvh->depth_limit = 40; /* TODO: move into a constant */
   }
 
   if (!pbvh->pixel_leaf_limit) {
     pbvh->pixel_leaf_limit = 256 * 256; /* TODO: move into a constant */
   }
 
-  for (int i = 0; i < pbvh->totnode; i++) {
+  int totnode = pbvh->totnode;
+  for (int i = 0; i < totnode; i++) {
     PBVHNode &node = pbvh->nodes[i];
 
-    bool ok = node.flag & PBVH_TexLeaf;
-    ok = ok && (count_node_pixels(node) > pbvh->pixel_leaf_limit);
-
-    if (ok) {
-      split_pixel_node(pbvh, i, mesh, image, image_user);
+    if (node.flag & PBVH_TexLeaf) {
+      split_pixel_node(pbvh, i, mesh, image, image_user, 0);
     }
   }
 }
diff --git a/source/blender/editors/sculpt_paint/sculpt_paint_image.cc b/source/blender/editors/sculpt_paint/sculpt_paint_image.cc
index d0a071c636e..62dd85b3ed6 100644
--- a/source/blender/editors/sculpt_paint/sculpt_paint_image.cc
+++ b/source/blender/editors/sculpt_paint/sculpt_paint_image.cc
@@ -1,6 +1,9 @@
 /* SPDX-License-Identifier: GPL-2.0-or-later
  * Copyright 2022 Blender Foundation. All rights reserved. */
 
+/* Paint a color made from hash of node pointer. */
+//#define DEBUG_PIXEL_NODES
+
 #include "DNA_image_types.h"
 #include "DNA_material_types.h"
 #include "DNA_mesh_types.h"
@@ -13,6 +16,9 @@
 #include "BLI_math.h"
 #include "BLI_math_color_blend.h"
 #include "BLI_task.h"
+#ifdef DEBUG_PIXEL_NODES
+#  include "BLI_rand.h"
+#endif
 
 #include "IMB_colormanagement.h"
 #include "IMB_imbuf.h"
@@ -175,6 +181,15 @@ template<typename ImageBuffer> class PaintingKernel {
           ss, brush, pixel_pos, sqrtf(test.dist), normal, face_normal, mask, 0, thread_id);
       float4 paint_color = brush_color * falloff_strength * brush_strength;
       float4 buffer_color;
+
+#ifdef DEBUG_PIXEL_NODES
+      if ((pixel_row.start_image_coordinate.y >> 3) & 1) {
+        paint_color[0] *= 0.5f;
+        paint_color[1] *= 0.5f;
+        paint_color[2] *= 0.5f;
+      }
+#endif
+
       blend_color_mix_float(buffer_color, color, paint_color);
       buffer_color *= brush->alpha;
       IMB_blend_color_float(color, color, buffer_color, static_cast<IMB_BlendMode>(brush->blend));
@@ -187,20 +202,18 @@ template<typename ImageBuffer> class PaintingKernel {
     return pixels_painted;
   }
 
-  void init_brush_color(ImBuf *image_buffer)
+  void init_brush_color(ImBuf *image_buffer, float in_brush_color[3])
   {
     const char *to_colorspace = image_accessor.get_colorspace_name(image_buffer);
     if (last_used_color_space == to_colorspace) {
       return;
     }
-    copy_v3_v3(brush_color,
-               ss->cache->invert ? BKE_brush_secondary_color_get(ss->scene, brush) :
-                                   BKE_brush_color_get(ss->scene, brush));
+
     /* NOTE: Brush colors are stored in sRGB. We use math color to follow other areas that
      * use brush colors. From there on we use IMB_colormanagement to convert the brush color to the
      * colorspace of the texture. This isn't ideal, but would need more refactoring to make sure
      * that brush colors are stored in scene linear by default. */
-    srgb_to_linearrgb_v3_v3(brush_color, brush_color);
+    srgb_to_linearrgb_v3_v3(brush_color, in_brush_color);
     brush_color[3] = 1.0f;
 
     const char *from_colorspace = IMB_colormanagement_role_colorspace_name_get(
@@ -313,6 +326,22 @@ static void do_paint_pixels(void *__restrict userdata,
   PaintingKernel<ImageBufferFloat4> kernel_float4(ss, brush, thread_id, mvert);
   PaintingKernel<ImageBufferByte4> kernel_byte4(ss, brush, thread_id, mvert);
 
+  float brush_color[4];
+
+#ifdef DEBUG_PIXEL_NODES
+  RNG *rng = BLI_rng_new(POINTER_AS_UINT(node));
+
+  brush_color[0] = BLI_rng_get_float(rng);
+  brush_color[1] = BLI_rng_get_float(rng);
+  brush_color[2] = BLI_rng_get_float(rng);
+#else
+  copy_v3_v3(brush_color,
+             ss->cache->invert ? BKE_brush_secondary_color_get(ss->scene, brush) :
+                                 BKE_brush_color_get(ss->scene, brush));
+#endif
+
+  brush_color[3] = 1.0f;
+
   ImageUser image_user = *data->image_data.image_user;
   bool pixels_updated = false;
   for (UDIMTilePixels &tile_data : node_data.tiles) {
@@ -327,10 +356,10 @@ static void do_paint_pixels(void *__restrict userdata,
         }
 
         if (image_buffer->rect_float != nullptr) {
-          kernel_float4.init_brush_color(image_buffer);
+          kernel_float4.init_brush_color(image_buffer, brush_color);
         }
         else {
-          kernel_byte4.init_brush_color(image_buffer);
+          kernel_byte4.init_brush_color(image_buffer, brush_color);
         }
 
         for (const PackedPixelRow &pixel_row : tile_data.pixel_rows) {



More information about the Bf-blender-cvs mailing list