[Bf-blender-cvs] [1ce7fbca5e1] temp-pbvh-seam-texturing-tweaks: Remove MeshUVVert, use loop indices instead of "UV verts"
Hans Goudey
noreply at git.blender.org
Wed Sep 28 05:04:27 CEST 2022
Commit: 1ce7fbca5e169b3073c2138216ba75cf6f1dff74
Author: Hans Goudey
Date: Tue Sep 27 21:51:40 2022 -0500
Branches: temp-pbvh-seam-texturing-tweaks
https://developer.blender.org/rB1ce7fbca5e169b3073c2138216ba75cf6f1dff74
Remove MeshUVVert, use loop indices instead of "UV verts"
===================================================================
M source/blender/blenkernel/intern/pbvh_pixels.cc
M source/blender/blenkernel/intern/pbvh_uv_islands.cc
M source/blender/blenkernel/intern/pbvh_uv_islands.hh
===================================================================
diff --git a/source/blender/blenkernel/intern/pbvh_pixels.cc b/source/blender/blenkernel/intern/pbvh_pixels.cc
index 538a3b5618e..59a2c6c9234 100644
--- a/source/blender/blenkernel/intern/pbvh_pixels.cc
+++ b/source/blender/blenkernel/intern/pbvh_pixels.cc
@@ -107,9 +107,9 @@ static void update_geom_primitives(PBVH &pbvh, const uv_islands::MeshData &mesh_
PBVHData &pbvh_data = BKE_pbvh_pixels_data_get(pbvh);
pbvh_data.clear_data();
for (const uv_islands::MeshPrimitive &mesh_primitive : mesh_data.primitives) {
- pbvh_data.geom_primitives.append(int3(mesh_primitive.vertices[0].vertex,
- mesh_primitive.vertices[1].vertex,
- mesh_primitive.vertices[2].vertex));
+ pbvh_data.geom_primitives.append(int3(mesh_data.loops[mesh_primitive.loops[0]].v,
+ mesh_data.loops[mesh_primitive.loops[1]].v,
+ mesh_data.loops[mesh_primitive.loops[2]].v));
}
}
@@ -149,7 +149,6 @@ struct EncodePixelsUserData {
ImageUser *image_user;
PBVH *pbvh;
Vector<PBVHNode *> *nodes;
- const MLoopUV *ldata_uv;
const uv_islands::UVIslandsMask *uv_masks;
/** Lookup to retrieve the UV primitives based on the primitive index. */
const UVPrimitiveLookup *uv_primitive_lookup;
@@ -358,16 +357,16 @@ static void update_pixels(PBVH *pbvh, Mesh *mesh, Image *image, ImageUser *image
return;
}
- const MLoopUV *ldata_uv = static_cast<const MLoopUV *>(
- CustomData_get_layer(&mesh->ldata, CD_MLOOPUV));
- if (ldata_uv == nullptr) {
+ const StringRef active_uv_name = CustomData_get_active_layer_name(&mesh->ldata, CD_MLOOPUV);
+ if (active_uv_name.is_empty()) {
return;
}
- uv_islands::MeshData mesh_data({pbvh->looptri, pbvh->totprim},
- {pbvh->mloop, mesh->totloop},
- pbvh->totvert,
- {ldata_uv, mesh->totloop});
+ const AttributeAccessor attributes = mesh->attributes();
+ const VArraySpan<float2> uv_map = attributes.lookup<float2>(active_uv_name, ATTR_DOMAIN_CORNER);
+
+ uv_islands::MeshData mesh_data(
+ {pbvh->looptri, pbvh->totprim}, {pbvh->mloop, mesh->totloop}, pbvh->totvert, uv_map);
uv_islands::UVIslands islands(mesh_data);
uv_islands::UVIslandsMask uv_masks;
@@ -397,7 +396,6 @@ static void update_pixels(PBVH *pbvh, Mesh *mesh, Image *image, ImageUser *image
user_data.pbvh = pbvh;
user_data.image = image;
user_data.image_user = image_user;
- user_data.ldata_uv = ldata_uv;
user_data.nodes = &nodes_to_update;
user_data.uv_primitive_lookup = &uv_primitive_lookup;
user_data.uv_masks = &uv_masks;
diff --git a/source/blender/blenkernel/intern/pbvh_uv_islands.cc b/source/blender/blenkernel/intern/pbvh_uv_islands.cc
index cb7ce9e9ad0..41bc2510b62 100644
--- a/source/blender/blenkernel/intern/pbvh_uv_islands.cc
+++ b/source/blender/blenkernel/intern/pbvh_uv_islands.cc
@@ -31,24 +31,26 @@ static void uv_primitive_append_to_uv_vertices(UVPrimitive &uv_primitive)
/** \name MeshPrimitive
* \{ */
-int MeshPrimitive::get_other_uv_vertex(const int v1, const int v2) const
-{
- BLI_assert(vertices[0].vertex == v1 || vertices[1].vertex == v1 || vertices[2].vertex == v1);
- BLI_assert(vertices[0].vertex == v2 || vertices[1].vertex == v2 || vertices[2].vertex == v2);
- for (const MeshUVVert &uv_vertex : vertices) {
- if (uv_vertex.vertex != v1 && uv_vertex.vertex != v2) {
- return uv_vertex.vertex;
+int MeshPrimitive::get_other_uv_vertex(const MeshData &mesh_data, const int v1, const int v2) const
+{
+ const Span<MLoop> mesh_loops = mesh_data.loops;
+ BLI_assert(ELEM(v1, mesh_loops[loops[0]].v, mesh_loops[loops[1]].v, mesh_loops[loops[2]].v));
+ BLI_assert(ELEM(v2, mesh_loops[loops[0]].v, mesh_loops[loops[1]].v, mesh_loops[loops[2]].v));
+ for (const int loop : loops) {
+ const int vert = mesh_loops[loop].v;
+ if (vert != v1 && vert != v2) {
+ return vert;
}
}
return -1;
}
-bool MeshPrimitive::has_shared_uv_edge(const MeshPrimitive &other) const
+bool MeshPrimitive::has_shared_uv_edge(const Span<float2> uv_map, const MeshPrimitive &other) const
{
int shared_uv_verts = 0;
- for (const MeshUVVert &vert : vertices) {
- for (const MeshUVVert &other_vert : other.vertices) {
- if (vert.uv == other_vert.uv) {
+ for (const int loop : loops) {
+ for (const int other_loop : other.loops) {
+ if (uv_map[loop] == uv_map[other_loop]) {
shared_uv_verts += 1;
}
}
@@ -56,33 +58,38 @@ bool MeshPrimitive::has_shared_uv_edge(const MeshPrimitive &other) const
return shared_uv_verts >= 2;
}
-static const MeshUVVert &get_uv_vert(const MeshPrimitive &mesh_primitive, const int vert)
+static int get_uv_loop(const MeshData &mesh_data,
+ const MeshPrimitive &mesh_primitive,
+ const int vert)
{
- for (const MeshUVVert &uv_vert : mesh_primitive.vertices) {
- if (uv_vert.vertex == vert) {
- return uv_vert;
+ for (const int loop : mesh_primitive.loops) {
+ if (mesh_data.loops[loop].v == vert) {
+ return loop;
}
}
BLI_assert_unreachable();
- return mesh_primitive.vertices[0];
+ return mesh_primitive.loops[0];
}
-static bool has_vertex(const MeshPrimitive &mesh_primitive, const int vert)
+static bool has_vertex(const MeshData &mesh_data,
+ const MeshPrimitive &mesh_primitive,
+ const int vert)
{
for (int i = 0; i < 3; i++) {
- if (mesh_primitive.vertices[i].vertex == vert) {
+ const int vert_i = mesh_data.loops[mesh_primitive.loops[i]].v;
+ if (vert_i == vert) {
return true;
}
}
return false;
}
-rctf MeshPrimitive::uv_bounds() const
+rctf MeshPrimitive::uv_bounds(const Span<float2> uv_map) const
{
rctf result;
BLI_rctf_init_minmax(&result);
- for (const MeshUVVert &uv_vertex : vertices) {
- BLI_rctf_do_minmax_v(&result, uv_vertex.uv);
+ for (const int loop : loops) {
+ BLI_rctf_do_minmax_v(&result, uv_map[loop]);
}
return result;
}
@@ -103,11 +110,7 @@ static void mesh_data_init_primitives(MeshData &mesh_data)
primitive.poly = tri.poly;
for (int j = 0; j < 3; j++) {
- MeshUVVert uv_vert;
- uv_vert.loop = tri.tri[j];
- uv_vert.vertex = mesh_data.loops[uv_vert.loop].v;
- uv_vert.uv = mesh_data.mloopuv[uv_vert.loop].uv;
- primitive.vertices.append(uv_vert);
+ primitive.loops.append(tri.tri[j]);
}
mesh_data.primitives.append(primitive);
}
@@ -175,7 +178,7 @@ static void extract_uv_neighbors(const MeshData &mesh_data,
}
const MeshPrimitive &other_primitive = mesh_data.primitives[other_primitive_i];
- if (primitive.has_shared_uv_edge(other_primitive)) {
+ if (primitive.has_shared_uv_edge(mesh_data.uv_map, other_primitive)) {
prims_to_add.append(other_primitive_i);
}
}
@@ -217,11 +220,11 @@ static void mesh_data_init(MeshData &mesh_data)
MeshData::MeshData(const Span<MLoopTri> looptris,
const Span<MLoop> loops,
const int verts_num,
- const Span<MLoopUV> mloopuv)
+ const Span<float2> uv_map)
: looptris(looptris),
verts_num(verts_num),
loops(loops),
- mloopuv(mloopuv),
+ uv_map(uv_map),
vert_to_edge_map(verts_num),
edge_to_primitive_map(0)
{
@@ -245,7 +248,8 @@ UVVertex::UVVertex()
uv_vertex_init_flags(*this);
}
-UVVertex::UVVertex(const MeshUVVert &vert) : vertex(vert.vertex), uv(vert.uv)
+UVVertex::UVVertex(const MeshData &mesh_data, const int loop)
+ : vertex(mesh_data.loops[loop].v), uv(mesh_data.uv_map[loop])
{
uv_vertex_init_flags(*this);
}
@@ -256,10 +260,10 @@ UVVertex::UVVertex(const MeshUVVert &vert) : vertex(vert.vertex), uv(vert.uv)
/** \name UVEdge
* \{ */
-bool UVEdge::has_shared_edge(const MeshUVVert &v1, const MeshUVVert &v2) const
+bool UVEdge::has_shared_edge(const Span<float2> uv_map, const int loop_1, const int loop_2) const
{
- return (vertices[0]->uv == v1.uv && vertices[1]->uv == v2.uv) ||
- (vertices[0]->uv == v2.uv && vertices[1]->uv == v1.uv);
+ return (vertices[0]->uv == uv_map[loop_1] && vertices[1]->uv == uv_map[loop_2]) ||
+ (vertices[0]->uv == uv_map[loop_2] && vertices[1]->uv == uv_map[loop_1]);
}
bool UVEdge::has_shared_edge(const UVVertex &v1, const UVVertex &v2) const
@@ -391,11 +395,11 @@ bool UVIsland::has_shared_edge(const UVPrimitive &primitive) const
return false;
}
-bool UVIsland::has_shared_edge(const MeshPrimitive &primitive) const
+bool UVIsland::has_shared_edge(const Span<float2> uv_map, const MeshPrimitive &primitive) const
{
for (const VectorList<UVPrimitive>::UsedVector &primitives : uv_primitives) {
for (const UVPrimitive &prim : primitives) {
- if (prim.has_shared_edge(primitive)) {
+ if (prim.has_shared_edge(uv_map, primitive)) {
return true;
}
}
@@ -424,11 +428,11 @@ static UVPrimitive *add_primitive(const MeshData &mesh_data,
UVPrimitive *uv_primitive_ptr = &uv_island.uv_primitives.last();
for (const int edge_i : primitive.edges) {
const MeshEdge &edge = mesh_data.edges[edge_i];
- const MeshUVVert &v1 = get_uv_vert(primitive, edge.vert1);
- const MeshUVVert &v2 = get_uv_vert(primitive, edge.vert2);
+ const int loop_1 = get_uv_loop(mesh_data, primitive, edge.vert1);
+ const int loop_2 = get_uv_loop(mesh_data, primitive, edge.vert2);
UVEdge uv_edge_template;
- uv_edge_template.vertices[0] = uv_island.lookup_or_create(UVVertex(v1));
- uv_edge_template.vertices[1] = uv_island.lookup_or_create(UVVertex(v2));
+ uv_edge_template.vertices[0] = uv_island.lookup_or_create(UVVertex(mesh_data, loop_1));
+ uv_edge_template.vertices[1] = uv_island.lookup_or_create(UVVertex(mesh_data, loop_2));
UVEdge *uv_edge = uv_island.lookup_or_create(uv_edge_template);
uv_primitive_ptr->edges.append(uv_edge);
uv_edge_append_to_uv_vertices(*uv_edge);
@@ -509,23 +513,24 @@ struct InnerEdge {
bool found : 1;
} flags;
- InnerEdge(const Mesh
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list