[Bf-blender-cvs] [0132873a37b] temp-T97352-3d-texturing-seam-bleeding-b2: Flipping borders.
Jeroen Bakker
noreply at git.blender.org
Wed Jun 15 08:49:22 CEST 2022
Commit: 0132873a37b8386b22ba52cb8d9e103082b540f9
Author: Jeroen Bakker
Date: Wed Jun 15 08:49:18 2022 +0200
Branches: temp-T97352-3d-texturing-seam-bleeding-b2
https://developer.blender.org/rB0132873a37b8386b22ba52cb8d9e103082b540f9
Flipping borders.
===================================================================
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 db32ca18c4f..6690b856ae9 100644
--- a/source/blender/blenkernel/BKE_uv_islands.hh
+++ b/source/blender/blenkernel/BKE_uv_islands.hh
@@ -127,11 +127,11 @@ struct MeshData {
init_edges();
for (const MeshVertex &v : vertices) {
- printf("Vert {v%d}\n", v.v);
+ printf("Vert {v%lld}\n", v.v);
for (const MeshEdge *e : v.edges) {
- printf("-Edge {v%d v%d}\n", e->vert1->v, e->vert2->v);
+ printf("-Edge {v%lld v%lld}\n", e->vert1->v, e->vert2->v);
for (const MeshPrimitive *p : e->primitives) {
- printf(" -Prim {p%d, v%d v%d v%d}\n",
+ printf(" -Prim {p%lld, v%lld v%lld v%lld}\n",
p->index,
p->vertices[0].vertex->v,
p->vertices[1].vertex->v,
@@ -395,6 +395,33 @@ struct UVPrimitive {
return nullptr;
}
+ const bool contains_uv_vertex(const UVVertex *uv_vertex) const
+ {
+ for (UVEdge *edge : edges) {
+ if (std::find(edge->vertices.begin(), edge->vertices.end(), uv_vertex) !=
+ edge->vertices.end()) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ const UVVertex *get_other_uv_vertex(const UVVertex *v1, const UVVertex *v2) const
+ {
+ BLI_assert(contains_uv_vertex(v1));
+ BLI_assert(contains_uv_vertex(v2));
+
+ for (const UVEdge *edge : edges) {
+ for (const UVVertex *uv_vertex : edge->vertices) {
+ if (uv_vertex != v1 && uv_vertex != v2) {
+ return uv_vertex;
+ }
+ }
+ }
+ BLI_assert_unreachable();
+ return nullptr;
+ }
+
UVBorder extract_border() const;
};
@@ -426,12 +453,21 @@ struct UVBorderEdge {
int actual_index = reverse_order ? 1 - index : index;
return edge->vertices[actual_index];
}
+
const UVVertex *get_uv_vertex(int index) const
{
int actual_index = reverse_order ? 1 - index : index;
return edge->vertices[actual_index];
}
+ /**
+ * Get the uv vertex from the primitive that is not part of the edge.
+ */
+ const UVVertex *get_other_uv_vertex() const
+ {
+ return uv_primitive->get_other_uv_vertex(edge->vertices[0], edge->vertices[1]);
+ }
+
float length() const
{
return len_v2v2(edge->vertices[0]->uv, edge->vertices[1]->uv);
@@ -468,10 +504,15 @@ struct UVBorder {
// TODO: support multiple rings + order (CW, CCW)
Vector<UVBorderEdge> edges;
+ /**
+ * Check if the border is counter clock wise from its island.
+ */
+ bool is_ccw() const;
+
/**
* Flip the order of the verts, changing the order between CW and CCW.
*/
- void flip_order();
+ void flip();
/**
* Calculate the outside angle of the given vert.
diff --git a/source/blender/blenkernel/intern/uv_islands.cc b/source/blender/blenkernel/intern/uv_islands.cc
index fa1c9b379b1..59df6cd7a18 100644
--- a/source/blender/blenkernel/intern/uv_islands.cc
+++ b/source/blender/blenkernel/intern/uv_islands.cc
@@ -29,6 +29,9 @@ void UVIsland::extract_borders()
if (!border.has_value()) {
break;
}
+ if (border->is_ccw()) {
+ border->flip();
+ }
borders.append(*border);
}
}
@@ -594,11 +597,28 @@ std::optional<UVBorder> UVBorder::extract_from_edges(Vector<UVBorderEdge> &edges
return border;
}
-void UVBorder::flip_order()
+bool UVBorder::is_ccw() const
+{
+ const UVBorderEdge &edge = edges.first();
+ const UVVertex *uv_vertex1 = edge.get_uv_vertex(0);
+ const UVVertex *uv_vertex2 = edge.get_uv_vertex(1);
+ const UVVertex *uv_vertex3 = edge.get_other_uv_vertex();
+ float poly[3][2];
+ copy_v2_v2(poly[0], uv_vertex1->uv);
+ copy_v2_v2(poly[1], uv_vertex2->uv);
+ copy_v2_v2(poly[2], uv_vertex3->uv);
+ const bool ccw = cross_poly_v2(poly, 3) < 0.0;
+ return ccw;
+}
+
+void UVBorder::flip()
{
+ uint64_t border_index = edges.first().border_index;
for (UVBorderEdge &edge : edges) {
edge.reverse_order = !edge.reverse_order;
}
+ std::reverse(edges.begin(), edges.end());
+ update_indexes(border_index);
}
float UVBorder::outside_angle(const UVBorderEdge &edge) const
More information about the Bf-blender-cvs
mailing list