[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