[Bf-blender-cvs] [9a64c8b8ef3] temp-T97352-3d-texturing-seam-bleeding-b2: WIP. Starting changes in pbvh_pixels.

Jeroen Bakker noreply at git.blender.org
Wed Jun 8 13:05:53 CEST 2022


Commit: 9a64c8b8ef351ec115090ae72349a3c9c1aa2d2e
Author: Jeroen Bakker
Date:   Wed Jun 8 13:05:48 2022 +0200
Branches: temp-T97352-3d-texturing-seam-bleeding-b2
https://developer.blender.org/rB9a64c8b8ef351ec115090ae72349a3c9c1aa2d2e

WIP. Starting changes in pbvh_pixels.

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

M	source/blender/blenkernel/BKE_pbvh.h
M	source/blender/blenkernel/BKE_pbvh_pixels.hh
M	source/blender/blenkernel/intern/pbvh.c
M	source/blender/blenkernel/intern/pbvh_intern.h
M	source/blender/blenkernel/intern/pbvh_pixels.cc
M	source/blender/blenkernel/intern/uv_islands.cc

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

diff --git a/source/blender/blenkernel/BKE_pbvh.h b/source/blender/blenkernel/BKE_pbvh.h
index 291b9b6b778..7af280361ac 100644
--- a/source/blender/blenkernel/BKE_pbvh.h
+++ b/source/blender/blenkernel/BKE_pbvh.h
@@ -51,6 +51,15 @@ typedef struct {
   float (*color)[4];
 } PBVHColorBufferNode;
 
+typedef struct PBVHPixels {
+  /**
+   * Contains data constant for each UVPrimitive.
+   *
+   * #blender::bke::pbvh::pixels::PBVHData
+   */
+  void *data;
+} PBVHPixels;
+
 typedef struct PBVHPixelsNode {
   /**
    * Contains triangle/pixel data used during texture painting.
diff --git a/source/blender/blenkernel/BKE_pbvh_pixels.hh b/source/blender/blenkernel/BKE_pbvh_pixels.hh
index e73950e6299..3cb6151e076 100644
--- a/source/blender/blenkernel/BKE_pbvh_pixels.hh
+++ b/source/blender/blenkernel/BKE_pbvh_pixels.hh
@@ -205,7 +205,16 @@ struct NodeData {
   }
 };
 
+struct PBVHData {
+  /* Per UVPRimitive contains the paint data. */
+
+  void clear_data()
+  {
+  }
+};
+
 NodeData &BKE_pbvh_pixels_node_data_get(PBVHNode &node);
 void BKE_pbvh_pixels_mark_image_dirty(PBVHNode &node, Image &image, ImageUser &image_user);
+PBVHData &BKE_pbvh_pixels_data_get(PBVH &pbvh);
 
 }  // namespace blender::bke::pbvh::pixels
diff --git a/source/blender/blenkernel/intern/pbvh.c b/source/blender/blenkernel/intern/pbvh.c
index 1d4fbb92fa0..421c5ec6545 100644
--- a/source/blender/blenkernel/intern/pbvh.c
+++ b/source/blender/blenkernel/intern/pbvh.c
@@ -688,7 +688,7 @@ void BKE_pbvh_free(PBVH *pbvh)
         BLI_gset_free(node->bm_other_verts, NULL);
       }
 
-      pbvh_pixels_free(node);
+      pbvh_node_pixels_free(node);
     }
   }
 
@@ -714,6 +714,8 @@ void BKE_pbvh_free(PBVH *pbvh)
 
   MEM_SAFE_FREE(pbvh->vert_bitmap);
 
+  pbvh_pixels_free(pbvh);
+
   MEM_freeN(pbvh);
 }
 
diff --git a/source/blender/blenkernel/intern/pbvh_intern.h b/source/blender/blenkernel/intern/pbvh_intern.h
index a86663a9c74..267f41f44c1 100644
--- a/source/blender/blenkernel/intern/pbvh_intern.h
+++ b/source/blender/blenkernel/intern/pbvh_intern.h
@@ -204,6 +204,8 @@ struct PBVH {
 
   /* Used by DynTopo to invalidate the draw cache. */
   bool draw_cache_invalid;
+
+  PBVHPixels pixels;
 };
 
 /* pbvh.c */
@@ -276,7 +278,8 @@ void pbvh_bmesh_normals_update(PBVHNode **nodes, int totnode);
 
 /* pbvh_pixels.hh */
 
-void pbvh_pixels_free(PBVHNode *node);
+void pbvh_node_pixels_free(PBVHNode *node);
+void pbvh_pixels_free(PBVH *pbvh);
 void pbvh_pixels_free_brush_test(PBVHNode *node);
 void pbvh_free_draw_buffers(PBVH *pbvh, PBVHNode *node);
 
diff --git a/source/blender/blenkernel/intern/pbvh_pixels.cc b/source/blender/blenkernel/intern/pbvh_pixels.cc
index 0ad1842cf5c..377013527f8 100644
--- a/source/blender/blenkernel/intern/pbvh_pixels.cc
+++ b/source/blender/blenkernel/intern/pbvh_pixels.cc
@@ -130,6 +130,7 @@ struct EncodePixelsUserData {
   PBVH *pbvh;
   Vector<PBVHNode *> *nodes;
   const MLoopUV *ldata_uv;
+  const uv_islands::UVIslands *uv_islands;
 };
 
 static void do_encode_pixels(void *__restrict userdata,
@@ -155,6 +156,26 @@ static void do_encode_pixels(void *__restrict userdata,
 
     Triangles &triangles = node_data->triangles;
     for (int triangle_index = 0; triangle_index < triangles.size(); triangle_index++) {
+      int mesh_prim_index = node->prim_indices[triangle_index];
+      for (const uv_islands::UVIsland &island : data->uv_islands->islands) {
+        for (const uv_islands::UVPrimitive &uv_primitive : island.uv_primitives) {
+          if (uv_primitive.primitive->index == mesh_prim_index) {
+            float2 uvs[3] = {
+                uv_primitive.edges[0]->vertices[0]->uv - tile_offset,
+                uv_primitive.edges[1]->vertices[0]->uv - tile_offset,
+                uv_primitive.edges[2]->vertices[0]->uv - tile_offset,
+            };
+            const float minv = clamp_f(min_fff(uvs[0].y, uvs[1].y, uvs[2].y), 0.0f, 1.0f);
+            const int miny = floor(minv * image_buffer->y);
+            const float maxv = clamp_f(max_fff(uvs[0].y, uvs[1].y, uvs[2].y), 0.0f, 1.0f);
+            const int maxy = min_ii(ceil(maxv * image_buffer->y), image_buffer->y);
+            const float minu = clamp_f(min_fff(uvs[0].x, uvs[1].x, uvs[2].x), 0.0f, 1.0f);
+            const int minx = floor(minu * image_buffer->x);
+            const float maxu = clamp_f(max_fff(uvs[0].x, uvs[1].x, uvs[2].x), 0.0f, 1.0f);
+            const int maxx = min_ii(ceil(maxu * image_buffer->x), image_buffer->x);
+          }
+        }
+      }
       const MLoopTri *lt = &pbvh->looptri[node->prim_indices[triangle_index]];
       float2 uvs[3] = {
           float2(data->ldata_uv[lt->tri[0]].uv) - tile_offset,
@@ -231,6 +252,16 @@ static bool find_nodes_to_update(PBVH *pbvh, Vector<PBVHNode *> &r_nodes_to_upda
     return false;
   }
 
+  /* Init or reset PBVH pixel data when changes detected. */
+  if (pbvh->pixels.data == nullptr) {
+    PBVHData *pbvh_data = MEM_new<PBVHData>(__func__);
+    pbvh->pixels.data = pbvh_data;
+  }
+  else {
+    PBVHData *pbvh_data = static_cast<PBVHData *>(pbvh->pixels.data);
+    pbvh_data->clear_data();
+  }
+
   r_nodes_to_update.reserve(nodes_to_update_len);
 
   for (int n = 0; n < pbvh->totnode; n++) {
@@ -323,6 +354,7 @@ static void update_pixels(PBVH *pbvh, Mesh *mesh, Image *image, ImageUser *image
   user_data.image_user = image_user;
   user_data.ldata_uv = ldata_uv;
   user_data.nodes = &nodes_to_update;
+  user_data.uv_islands = &islands;
 
   TaskParallelSettings settings;
   BKE_pbvh_parallel_range_settings(&settings, true, nodes_to_update.size());
@@ -377,6 +409,13 @@ NodeData &BKE_pbvh_pixels_node_data_get(PBVHNode &node)
   return *node_data;
 }
 
+PBVHData &BKE_pbvh_pixels_data_get(PBVH &pbvh)
+{
+  BLI_assert(pbvh.pixels.data != nullptr);
+  PBVHData *data = static_cast<PBVHData *>(pbvh.pixels.data);
+  return *data;
+}
+
 void BKE_pbvh_pixels_mark_image_dirty(PBVHNode &node, Image &image, ImageUser &image_user)
 {
   BLI_assert(node.pixels.node_data != nullptr);
@@ -408,10 +447,17 @@ void BKE_pbvh_build_pixels(PBVH *pbvh, Mesh *mesh, Image *image, ImageUser *imag
   update_pixels(pbvh, mesh, image, image_user);
 }
 
-void pbvh_pixels_free(PBVHNode *node)
+void pbvh_node_pixels_free(PBVHNode *node)
 {
   NodeData *node_data = static_cast<NodeData *>(node->pixels.node_data);
   MEM_delete(node_data);
   node->pixels.node_data = nullptr;
 }
+
+void pbvh_pixels_free(PBVH *pbvh)
+{
+  PBVHData *pbvh_data = static_cast<PBVHData *>(pbvh->pixels.data);
+  MEM_delete(pbvh_data);
+  pbvh->pixels.data = nullptr;
+}
 }
diff --git a/source/blender/blenkernel/intern/uv_islands.cc b/source/blender/blenkernel/intern/uv_islands.cc
index 5b12a1d8e5b..129ce693d79 100644
--- a/source/blender/blenkernel/intern/uv_islands.cc
+++ b/source/blender/blenkernel/intern/uv_islands.cc
@@ -268,25 +268,6 @@ static void extend_at_vert(UVIsland &island, UVBorderCorner &corner, const MeshD
       prim1.append_to_uv_vertices();
       island.uv_primitives.append(prim1);
     }
-
-#if 0
-    prim1.edges[0].vertices[0].uv = border.verts[vert.index].uv;
-    prim1.edges[0].vertices[1].uv = border.verts[vert.prev_index].uv;
-    prim1.edges[1].vertices[0].uv = border.verts[vert.prev_index].uv;
-    prim1.edges[1].vertices[1].uv = center_uv;
-    prim1.edges[2].vertices[0].uv = center_uv;
-    prim1.edges[2].vertices[1].uv = border.verts[vert.index].uv;
-    island.uv_primitives.append(prim1);
-
-    UVPrimitive prim2(0);
-    prim2.edges[0].vertices[0].uv = border.verts[vert.index].uv;
-    prim2.edges[0].vertices[1].uv = center_uv;
-    prim2.edges[1].vertices[0].uv = center_uv;
-    prim2.edges[1].vertices[1].uv = border.verts[vert.next_index].uv;
-    prim2.edges[2].vertices[0].uv = border.verts[vert.next_index].uv;
-    prim2.edges[2].vertices[1].uv = border.verts[vert.index].uv;
-    island.uv_primitives.append(prim2);
-#endif
   }
   else {
   }



More information about the Bf-blender-cvs mailing list