[Bf-blender-cvs] [0d24e8af62d] temp-pbvh-split: temp-pbvh-split: reuse triangles array.

Joseph Eagar noreply at git.blender.org
Wed May 11 03:06:15 CEST 2022


Commit: 0d24e8af62db5836da13dec0f518bb5643688506
Author: Joseph Eagar
Date:   Tue May 10 18:05:54 2022 -0700
Branches: temp-pbvh-split
https://developer.blender.org/rB0d24e8af62db5836da13dec0f518bb5643688506

temp-pbvh-split: reuse triangles array.

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

M	source/blender/blenkernel/BKE_pbvh_pixels.hh
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
M	source/tools

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

diff --git a/source/blender/blenkernel/BKE_pbvh_pixels.hh b/source/blender/blenkernel/BKE_pbvh_pixels.hh
index fdfb5fa037e..194cd7e3b07 100644
--- a/source/blender/blenkernel/BKE_pbvh_pixels.hh
+++ b/source/blender/blenkernel/BKE_pbvh_pixels.hh
@@ -138,7 +138,7 @@ struct NodeData {
   } flags;
 
   Vector<UDIMTilePixels> tiles;
-  Triangles triangles;
+  Triangles *triangles = nullptr;
 
   NodeData()
   {
@@ -168,7 +168,6 @@ struct NodeData {
   void clear_data()
   {
     tiles.clear();
-    triangles.clear();
   }
 
   static void free_func(void *instance)
diff --git a/source/blender/blenkernel/intern/pbvh.c b/source/blender/blenkernel/intern/pbvh.c
index 129624d0885..23db3b8350a 100644
--- a/source/blender/blenkernel/intern/pbvh.c
+++ b/source/blender/blenkernel/intern/pbvh.c
@@ -689,7 +689,7 @@ void BKE_pbvh_free(PBVH *pbvh)
       }
     }
 
-    if (node->flag & PBVH_TexLeaf) {
+    if (node->flag & (PBVH_Leaf | 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 c30dcbbc909..8bf691ba1fa 100644
--- a/source/blender/blenkernel/intern/pbvh_pixels.cc
+++ b/source/blender/blenkernel/intern/pbvh_pixels.cc
@@ -179,7 +179,7 @@ static void split_pixel_node(PBVH *pbvh,
       UDIMTilePixels *tile1 = &data1->tiles[i];
       UDIMTilePixels *tile2 = &data2->tiles[i];
 
-      TrianglePaintInput &tri = data.triangles.paint_input[row.triangle_index];
+      TrianglePaintInput &tri = data.triangles->paint_input[row.triangle_index];
 
       float verts[3][3];
 
@@ -242,7 +242,12 @@ static void split_pixel_node(PBVH *pbvh,
     BKE_image_release_ibuf(image, image_buffer, nullptr);
   }
 
-  pbvh_pixels_free(node);
+  if (node->flag & PBVH_Leaf) {
+    data.clear_data();
+  }
+  else {
+    pbvh_pixels_free(node);
+  }
 
   BLI_thread_queue_push(tdata->new_nodes, static_cast<void *>(split1));
   BLI_thread_queue_push(tdata->new_nodes, static_cast<void *>(split2));
@@ -440,9 +445,15 @@ static void extract_barycentric_pixels(UDIMTilePixels &tile_data,
 
 static void init_triangles(PBVH *pbvh, PBVHNode *node, NodeData *node_data, const MLoop *mloop)
 {
+  if (node_data->triangles) {
+    MEM_delete<Triangles>(node_data->triangles);
+  }
+
+  node_data->triangles = MEM_new<Triangles>("triangles");
+
   for (int i = 0; i < node->totprim; i++) {
     const MLoopTri *lt = &pbvh->looptri[node->prim_indices[i]];
-    node_data->triangles.append(
+    node_data->triangles->append(
         int3(mloop[lt->tri[0]].v, mloop[lt->tri[1]].v, mloop[lt->tri[2]].v));
   }
 }
@@ -476,7 +487,7 @@ static void do_encode_pixels(void *__restrict userdata,
     float2 tile_offset = float2(image_tile.get_tile_offset());
     UDIMTilePixels tile_data;
 
-    Triangles &triangles = node_data->triangles;
+    Triangles &triangles = *node_data->triangles;
     for (int triangle_index = 0; triangle_index < triangles.size(); triangle_index++) {
       const MLoopTri *lt = &pbvh->looptri[node->prim_indices[triangle_index]];
       float2 uvs[3] = {
@@ -574,6 +585,11 @@ static bool find_nodes_to_update(PBVH *pbvh, Vector<PBVHNode *> &r_nodes_to_upda
     else {
       NodeData *node_data = static_cast<NodeData *>(node->pixels.node_data);
       node_data->clear_data();
+
+      if (node_data->triangles && (node->flag & PBVH_Leaf)) {
+        MEM_delete<Triangles>(node_data->triangles);
+        node_data->triangles = nullptr;
+      }
     }
   }
 
@@ -746,6 +762,11 @@ void BKE_pbvh_build_pixels(PBVH *pbvh, Mesh *mesh, Image *image, ImageUser *imag
 void pbvh_pixels_free(PBVHNode *node)
 {
   NodeData *node_data = static_cast<NodeData *>(node->pixels.node_data);
+
+  if (node->flag & PBVH_Leaf) {
+    MEM_delete<Triangles>(node_data->triangles);
+  }
+
   MEM_delete(node_data);
   node->pixels.node_data = nullptr;
 }
diff --git a/source/blender/editors/sculpt_paint/sculpt_paint_image.cc b/source/blender/editors/sculpt_paint/sculpt_paint_image.cc
index 62dd85b3ed6..ba09a8f89ac 100644
--- a/source/blender/editors/sculpt_paint/sculpt_paint_image.cc
+++ b/source/blender/editors/sculpt_paint/sculpt_paint_image.cc
@@ -321,7 +321,7 @@ static void do_paint_pixels(void *__restrict userdata,
   const int thread_id = BLI_task_parallel_thread_id(tls);
   MVert *mvert = SCULPT_mesh_deformed_mverts_get(ss);
 
-  std::vector<bool> brush_test = init_triangle_brush_test(ss, node_data.triangles, mvert);
+  std::vector<bool> brush_test = init_triangle_brush_test(ss, *node_data.triangles, mvert);
 
   PaintingKernel<ImageBufferFloat4> kernel_float4(ss, brush, thread_id, mvert);
   PaintingKernel<ImageBufferByte4> kernel_byte4(ss, brush, thread_id, mvert);
@@ -368,10 +368,10 @@ static void do_paint_pixels(void *__restrict userdata,
           }
           bool pixels_painted = false;
           if (image_buffer->rect_float != nullptr) {
-            pixels_painted = kernel_float4.paint(node_data.triangles, pixel_row, image_buffer);
+            pixels_painted = kernel_float4.paint(*node_data.triangles, pixel_row, image_buffer);
           }
           else {
-            pixels_painted = kernel_byte4.paint(node_data.triangles, pixel_row, image_buffer);
+            pixels_painted = kernel_byte4.paint(*node_data.triangles, pixel_row, image_buffer);
           }
 
           if (pixels_painted) {
diff --git a/source/tools b/source/tools
index c1586ae2959..86093aef40d 160000
--- a/source/tools
+++ b/source/tools
@@ -1 +1 @@
-Subproject commit c1586ae29595713b597c22f6baa08d6cce423767
+Subproject commit 86093aef40dcda44387d32df8c4869388f4f648c



More information about the Bf-blender-cvs mailing list