[Bf-blender-cvs] [198bcbb4d53] temp-T97352-3d-texturing-seam-bleeding-b2: Fix issue where input mesh wasn't compact.
Jeroen Bakker
noreply at git.blender.org
Tue Jun 14 14:57:00 CEST 2022
Commit: 198bcbb4d5336b3ea943642831065decabe315ff
Author: Jeroen Bakker
Date: Tue Jun 14 14:53:04 2022 +0200
Branches: temp-T97352-3d-texturing-seam-bleeding-b2
https://developer.blender.org/rB198bcbb4d5336b3ea943642831065decabe315ff
Fix issue where input mesh wasn't compact.
===================================================================
M source/blender/blenkernel/BKE_uv_islands.hh
M source/blender/blenkernel/intern/uv_islands.cc
===================================================================
diff --git a/source/blender/blenkernel/BKE_uv_islands.hh b/source/blender/blenkernel/BKE_uv_islands.hh
index 31f0144539a..db32ca18c4f 100644
--- a/source/blender/blenkernel/BKE_uv_islands.hh
+++ b/source/blender/blenkernel/BKE_uv_islands.hh
@@ -125,6 +125,20 @@ struct MeshData {
init_vertices();
init_primitives();
init_edges();
+
+ for (const MeshVertex &v : vertices) {
+ printf("Vert {v%d}\n", v.v);
+ for (const MeshEdge *e : v.edges) {
+ printf("-Edge {v%d v%d}\n", e->vert1->v, e->vert2->v);
+ for (const MeshPrimitive *p : e->primitives) {
+ printf(" -Prim {p%d, v%d v%d v%d}\n",
+ p->index,
+ p->vertices[0].vertex->v,
+ p->vertices[1].vertex->v,
+ p->vertices[2].vertex->v);
+ }
+ }
+ }
}
void init_vertices()
{
@@ -166,11 +180,12 @@ struct MeshData {
for (int j = 0; j < 3; j++) {
int v1 = mloop[tri.tri[j]].v;
int v2 = mloop[tri.tri[(j + 1) % 3]].v;
+ /* TODO: Use lookup_ptr to be able to store edge 0. */
void *v = BLI_edgehash_lookup(eh, v1, v2);
int64_t edge_index;
if (v == nullptr) {
edge_index = edges.size();
- BLI_edgehash_insert(eh, v1, v2, POINTER_FROM_INT(edge_index));
+ BLI_edgehash_insert(eh, v1, v2, POINTER_FROM_INT(edge_index + 1));
MeshEdge edge;
edge.vert1 = &vertices[v1];
edge.vert2 = &vertices[v2];
@@ -180,7 +195,7 @@ struct MeshData {
vertices[v2].edges.append(edge_ptr);
}
else {
- edge_index = POINTER_AS_INT(v);
+ edge_index = POINTER_AS_INT(v) - 1;
}
MeshEdge *edge = &edges[edge_index];
@@ -367,6 +382,19 @@ struct UVPrimitive {
return nullptr;
}
+ UVEdge *get_uv_edge(const MeshVertex *v1, const MeshVertex *v2) const
+ {
+ for (UVEdge *uv_edge : edges) {
+ const MeshVertex *e1 = uv_edge->vertices[0]->vertex;
+ const MeshVertex *e2 = uv_edge->vertices[1]->vertex;
+ if ((e1 == v1 && e2 == v2) || (e1 == v2 && e2 == v1)) {
+ return uv_edge;
+ }
+ }
+ BLI_assert_unreachable();
+ return nullptr;
+ }
+
UVBorder extract_border() const;
};
@@ -649,7 +677,7 @@ void svg(std::ostream &ss, const UVIslands &islands, int step);
void svg(std::ostream &ss, const UVPrimitive &primitive);
void svg(std::ostream &ss, const UVPrimitive &primitive, int step);
void svg(std::ostream &ss, const UVIslandsMask &mask, int step);
-void svg(std::ostream &ss, const UVBorder &border);
+void svg(std::ostream &ss, const UVBorder &border, int step);
void svg_footer(std::ostream &ss);
struct UVIslands {
@@ -692,7 +720,7 @@ struct UVIslands {
for (UVBorder &border : island.borders) {
border.update_indexes(index);
index++;
- svg(of, border);
+ svg(of, border, 0);
}
}
svg_footer(of);
@@ -713,7 +741,7 @@ struct UVIslands {
svg_header(of);
for (const UVIsland &island : islands) {
for (const UVBorder &border : island.borders) {
- svg(of, border);
+ svg(of, border, 0);
}
}
svg_footer(of);
diff --git a/source/blender/blenkernel/intern/uv_islands.cc b/source/blender/blenkernel/intern/uv_islands.cc
index 4728a3e85f1..fa1c9b379b1 100644
--- a/source/blender/blenkernel/intern/uv_islands.cc
+++ b/source/blender/blenkernel/intern/uv_islands.cc
@@ -384,6 +384,9 @@ static void extend_at_vert(UVIsland &island, UVBorderCorner &corner, const MeshD
}
else {
UVEdge *current_edge = corner.first->edge;
+
+ Vector<UVBorderEdge> new_border_edges;
+
for (int i = 0; i < num_to_add; i++) {
float2 old_uv = current_edge->get_other_uv_vertex(uv_vertex->vertex)->uv;
MeshVertex *shared_edge_vertex =
@@ -425,10 +428,11 @@ static void extend_at_vert(UVIsland &island, UVBorderCorner &corner, const MeshD
segment.flags.found = true;
- /* TODO: should be done based on meshvertex */
UVPrimitive &new_prim = island.uv_primitives[island.uv_primitives.size() - 1];
- current_edge = new_prim.get_uv_edge(uv_vertex->uv, new_uv);
-
+ current_edge = new_prim.get_uv_edge(uv_vertex->vertex, other_prim_vertex);
+ UVBorderEdge new_border(new_prim.get_uv_edge(shared_edge_vertex, other_prim_vertex),
+ &new_prim);
+ new_border_edges.append(new_border);
break;
}
}
@@ -455,7 +459,28 @@ static void extend_at_vert(UVIsland &island, UVBorderCorner &corner, const MeshD
uv_vertex_template.uv = corner.second->get_uv_vertex(1)->uv;
UVVertex *vertex_3_ptr = island.lookup_or_create(uv_vertex_template);
add_uv_primitive_fill(island, *vertex_1_ptr, *vertex_2_ptr, *vertex_3_ptr, *fill_primitive);
+
+ UVPrimitive &new_prim = island.uv_primitives[island.uv_primitives.size() - 1];
+ UVBorderEdge new_border(new_prim.get_uv_edge(shared_edge_vertex, other_prim_vertex),
+ &new_prim);
+ new_border_edges.append(new_border);
+ }
+
+ int border_index = corner.first->border_index;
+ UVBorder &border = island.borders[border_index];
+ int border_insert = corner.first->index;
+ int border_next = corner.second->index;
+ border.remove(border_insert);
+ if (border_next != 0) {
+ border_next--;
}
+ border.remove(border_next);
+ for (UVBorderEdge &edge : new_border_edges) {
+ edge.flags.extendable = false;
+ }
+ border.edges.insert(border_insert, new_border_edges);
+
+ border.update_indexes(border_index);
}
}
@@ -471,6 +496,10 @@ void UVIsland::extend_border(const UVIslandsMask &mask,
of.open("/tmp/extend.svg");
svg_header(of);
svg(of, *this, step++);
+ for (UVBorder &border : borders) {
+ svg(of, border, step);
+ }
+ step++;
#endif
int64_t border_index = 0;
@@ -480,7 +509,7 @@ void UVIsland::extend_border(const UVIslandsMask &mask,
// Debug setting to reduce the extension to a number of iterations as long as not all corner
// cases have been implemented.
- int num_iterations = 7;
+ int num_iterations = 999999;
while (num_iterations) {
if (num_iterations == 1) {
printf("Last iteration");
@@ -498,13 +527,17 @@ void UVIsland::extend_border(const UVIslandsMask &mask,
// TODO: extend
extend_at_vert(*this, *extension_corner, mesh_data);
- // validate_border();
+ validate_border();
/* Mark that the vert is extended. Unable to extend twice. */
extension_corner->second->flags.extendable = false;
num_iterations--;
#ifdef DEBUG_SVG
svg(of, *this, step++);
+ for (UVBorder &border : borders) {
+ svg(of, border, step);
+ }
+ step++;
#endif
}
#ifdef DEBUG_SVG
@@ -926,11 +959,11 @@ void svg(std::ostream &ss, const UVPrimitive &primitive, int step)
ss << "</g>\n";
}
-void svg(std::ostream &ss, const UVBorder &border)
+void svg(std::ostream &ss, const UVBorder &border, int step)
{
- ss << "<g>\n";
+ ss << "<g transform=\"translate(" << step * 1024 << " 0)\">\n";
- ss << " <g stroke=\"lightgrey\">\n";
+ ss << " <g stroke=\"grey\">\n";
for (const UVBorderEdge &edge : border.edges) {
float2 v1 = edge.get_uv_vertex(0)->uv;
float2 v2 = edge.get_uv_vertex(1)->uv;
@@ -939,7 +972,7 @@ void svg(std::ostream &ss, const UVBorder &border)
}
ss << " </g>\n";
- ss << " <g fill=\"red\">\n";
+ ss << " <g fill=\"black\">\n";
for (const UVBorderEdge &edge : border.edges) {
float2 v1 = edge.get_uv_vertex(0)->uv;
ss << " <text x=\"" << svg_x(v1) << "\" y=\"" << svg_y(v1) << "\">"
More information about the Bf-blender-cvs
mailing list