Commit: fad9241b9fc3f5eb396e28e126f1a28ef410d461 Author: Jeroen Bakker Date: Tue Jun 7 09:07:45 2022 +0200 Branches: temp-T97352-3d-texturing-seam-bleeding-b2 https://developer.blender.org/rBfad9241b9fc3f5eb396e28e126f1a28ef410d461
Make UVIsland own UVVertex. =================================================================== 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 9992c0da4a9..ec9cf65af66 100644 --- a/source/blender/blenkernel/BKE_uv_islands.hh +++ b/source/blender/blenkernel/BKE_uv_islands.hh @@ -183,19 +183,24 @@ struct UVVertex { }; struct UVEdge { - UVVertex vertices[2]; + std::array<UVVertex *, 2> vertices; Vector<UVPrimitive *, 2> uv_primitives; - bool has_shared_edge(const UVEdge &other) const + bool has_shared_edge(const MeshUVVert &v1, const MeshUVVert &v2) const { - return (vertices[0].uv == other.vertices[0].uv && vertices[1].uv == other.vertices[1].uv) || - (vertices[0].uv == other.vertices[1].uv && vertices[1].uv == other.vertices[0].uv); + return (vertices[0]->uv == v1.uv && vertices[1]->uv == v2.uv) || + (vertices[0]->uv == v2.uv && vertices[1]->uv == v1.uv); } - bool has_shared_edge(const MeshUVVert &v1, const MeshUVVert &v2) const + bool has_shared_edge(const UVVertex &v1, const UVVertex &v2) const + { + return (vertices[0]->uv == v1.uv && vertices[1]->uv == v2.uv) || + (vertices[0]->uv == v2.uv && vertices[1]->uv == v1.uv); + } + + bool has_shared_edge(const UVEdge &other) const { - return (vertices[0].uv == v1.uv && vertices[1].uv == v2.uv) || - (vertices[0].uv == v2.uv && vertices[1].uv == v1.uv); + return has_shared_edge(*other.vertices[0], *other.vertices[1]); } bool is_border_edge() const @@ -337,8 +342,8 @@ struct UVIsland { const MeshUVVert &v1 = primitive.get_uv_vert(edge->vert1); const MeshUVVert &v2 = primitive.get_uv_vert(edge->vert2); UVEdge uv_edge_template; - uv_edge_template.vertices[0] = UVVertex(v1); - uv_edge_template.vertices[1] = UVVertex(v2); + uv_edge_template.vertices[0] = lookup_or_create(UVVertex(v1)); + uv_edge_template.vertices[1] = lookup_or_create(UVVertex(v2)); UVEdge *uv_edge = lookup_or_create(uv_edge_template); uv_primitive_ptr->edges.append(uv_edge); uv_edge->uv_primitives.append(uv_primitive_ptr); @@ -346,6 +351,19 @@ struct UVIsland { return uv_primitive_ptr; } + UVVertex *lookup_or_create(const UVVertex &vertex) + { + for (UVVertex &uv_vertex : uv_vertices) { + if (uv_vertex.uv == vertex.uv && uv_vertex.vertex == vertex.vertex) { + return &uv_vertex; + } + } + + uv_vertices.append(vertex); + UVVertex *result = &uv_vertices.last(); + return result; + } + UVEdge *lookup_or_create(const UVEdge &edge) { for (UVEdge &uv_edge : uv_edges) { @@ -373,7 +391,11 @@ struct UVIsland { uv_primitives.append(primitive); UVPrimitive *new_prim_ptr = &uv_primitives.last(); for (int i = 0; i < 3; i++) { - new_prim_ptr->edges[i] = lookup_or_create(*new_prim_ptr->edges[i]); + UVEdge *other_edge = primitive.edges[i]; + UVEdge uv_edge_template; + uv_edge_template.vertices[0] = lookup_or_create(*other_edge->vertices[0]); + uv_edge_template.vertices[1] = lookup_or_create(*other_edge->vertices[1]); + new_prim_ptr->edges[i] = lookup_or_create(uv_edge_template); new_prim_ptr->edges[i]->uv_primitives.append(new_prim_ptr); } } @@ -586,7 +608,7 @@ struct UVIslandsMask { float2 p; for (int i = 0; i < 10; i++) { float f = i / 10.0f; - interp_v2_v2v2(p, edge.vertices[0].uv, edge.vertices[1].uv, f); + interp_v2_v2v2(p, edge.vertices[0]->uv, edge.vertices[1]->uv, f); add(island_index, p); } } diff --git a/source/blender/blenkernel/intern/uv_islands.cc b/source/blender/blenkernel/intern/uv_islands.cc index 0bf4964aa10..6d592d84f2c 100644 --- a/source/blender/blenkernel/intern/uv_islands.cc +++ b/source/blender/blenkernel/intern/uv_islands.cc @@ -35,10 +35,10 @@ void UVIsland::extract_border() } starting_border_edge->tag = true; - float2 first_uv = starting_border_edge->edge->vertices[0].uv; - float2 current_uv = starting_border_edge->edge->vertices[1].uv; - MeshVertex *current_vert = starting_border_edge->edge->vertices[1].vertex; - border.verts.append(UVBorderVert(first_uv, starting_border_edge->edge->vertices[0].vertex)); + float2 first_uv = starting_border_edge->edge->vertices[0]->uv; + float2 current_uv = starting_border_edge->edge->vertices[1]->uv; + MeshVertex *current_vert = starting_border_edge->edge->vertices[1]->vertex; + border.verts.append(UVBorderVert(first_uv, starting_border_edge->edge->vertices[0]->vertex)); while (current_uv != first_uv) { for (UVBorderEdge &border_edge : edges) { if (border_edge.tag == true) { @@ -46,10 +46,10 @@ void UVIsland::extract_border() } int i; for (i = 0; i < 2; i++) { - if (border_edge.edge->vertices[i].uv == current_uv) { + if (border_edge.edge->vertices[i]->uv == current_uv) { border.verts.append(UVBorderVert(current_uv, current_vert)); - current_uv = border_edge.edge->vertices[1 - i].uv; - current_vert = border_edge.edge->vertices[1 - i].vertex; + current_uv = border_edge.edge->vertices[1 - i]->uv; + current_vert = border_edge.edge->vertices[1 - i]->vertex; border_edge.tag = true; break; } @@ -175,13 +175,13 @@ struct Fan { segment.primitive->vertices[segment.vert_order[1]].vertex->v); for (const UVPrimitive &uv_primitive : island.uv_primitives) { for (UVEdge *edge : uv_primitive.edges) { - int2 o(edge->vertices[0].vertex->v, edge->vertices[1].vertex->v); + int2 o(edge->vertices[0]->vertex->v, edge->vertices[1]->vertex->v); if ((test_edge.x == o.x && test_edge.y == o.y) || (test_edge.x == o.y && test_edge.y == o.x)) { segment.uvs[0] = vert.uv; for (int i = 0; i < 2; i++) { - if (edge->vertices[i].uv == vert.uv) { - segment.uvs[1] = edge->vertices[1 - i].uv; + if (edge->vertices[i]->uv == vert.uv) { + segment.uvs[1] = edge->vertices[1 - i]->uv; break; } } @@ -546,6 +546,25 @@ bool UVIslandsMask::is_masked(const short island_index, const float2 uv) const * * Debugging functions to export UV islands to SVG files. * \{ */ +static float svg_x(const float2 &uv) +{ + return uv.x * 1024; +} + +static float svg_y(const float2 &uv) +{ + return uv.y * 1024; +} + +static float svg_x(const UVVertex &vertex) +{ + return svg_x(vertex.uv); +} + +static float svg_y(const UVVertex &vertex) +{ + return svg_y(vertex.uv); +} void svg_header(std::ostream &ss) { @@ -558,9 +577,9 @@ void svg_footer(std::ostream &ss) } void svg(std::ostream &ss, const UVEdge &edge) { - ss << " <line x1=\"" << edge.vertices[0].uv.x * 1024 << "\" y1=\"" - << edge.vertices[0].uv.y * 1024 << "\" x2=\"" << edge.vertices[1].uv.x * 1024 << "\" y2=\"" - << edge.vertices[1].uv.y * 1024 << "\"/>\n"; + ss << " <line x1=\"" << svg_x(*edge.vertices[0]) << "\" y1=\"" << svg_y(*edge.vertices[0]) + << "\" x2=\"" << svg_x(*edge.vertices[1]) << "\" y2=\"" << svg_y(*edge.vertices[1]) + << "\"/>\n"; } void svg(std::ostream &ss, const UVIsland &island, int step) @@ -685,7 +704,7 @@ void svg(std::ostream &ss, const UVPrimitive &primitive) { ss << " <polygon points=\""; for (int i = 0; i < 3; i++) { - svg_coords(ss, primitive.edges[i]->vertices[0].uv); + svg_coords(ss, primitive.edges[i]->vertices[0]->uv); ss << " "; } ss << "\"/>\n"; @@ -693,7 +712,7 @@ void svg(std::ostream &ss, const UVPrimitive &primitive) float2 center(0.0, 0.0); for (int i = 0; i < 3; i++) { for (int j = 0; j < 2; j++) { - center += primitive.edges[i]->vertices[j].uv; + center += primitive.edges[i]->vertices[j]->uv; } } center /= 3 * 2; @@ -702,10 +721,10 @@ void svg(std::ostream &ss, const UVPrimitive &primitive) ss << primitive.primitive->index; ss << "</text>\n"; for (int i = 0; i < 3; i++) { - float2 co = (center + primitive.edges[i]->vertices[0].uv) / 2.0; + float2 co = (center + primitive.edges[i]->vertices[0]->uv) / 2.0; ss << "<text x=\"" << co.x * 1024 << "\""; ss << " y=\"" << co.y * 1024 << "\">"; - ss << primitive.edges[i]->vertices[0].vertex->v; + ss << primitive.edges[i]->vertices[0]->vertex->v; ss << "</text>\n"; } } _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org List details, subscription details or unsubscribe: https://lists.blender.org/mailman/listinfo/bf-blender-cvs