[Bf-blender-cvs] [8e922806203] temp-T97352-3d-texturing-seam-bleeding-b: WIP (border extraction)
Jeroen Bakker
noreply at git.blender.org
Wed May 25 09:01:31 CEST 2022
Commit: 8e922806203eadae4860e6edc6ca1e46c5a32439
Author: Jeroen Bakker
Date: Mon May 23 12:26:56 2022 +0200
Branches: temp-T97352-3d-texturing-seam-bleeding-b
https://developer.blender.org/rB8e922806203eadae4860e6edc6ca1e46c5a32439
WIP (border extraction)
===================================================================
M source/blender/blenkernel/BKE_uv_islands.hh
M source/blender/blenkernel/intern/pbvh_pixels.cc
===================================================================
diff --git a/source/blender/blenkernel/BKE_uv_islands.hh b/source/blender/blenkernel/BKE_uv_islands.hh
index 514aac0ef6b..8273061c68f 100644
--- a/source/blender/blenkernel/BKE_uv_islands.hh
+++ b/source/blender/blenkernel/BKE_uv_islands.hh
@@ -33,6 +33,11 @@ struct UVEdge {
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);
}
+
+ bool is_border_edge() const
+ {
+ return adjacent_uv_primitive == -1;
+ }
};
struct UVPrimitive {
@@ -79,14 +84,71 @@ struct UVPrimitive {
}
};
+struct UVBorderVert {
+ float2 uv;
+ explicit UVBorderVert(float2 &uv) : uv(uv)
+ {
+ }
+};
+
+struct UVBorderEdge {
+ UVEdge *edge;
+ bool tag = false;
+
+ explicit UVBorderEdge(UVEdge *edge) : edge(edge)
+ {
+ }
+};
+
struct UVIsland {
Vector<UVPrimitive> primitives;
+ Vector<UVBorderVert> border;
UVIsland(const UVPrimitive &primitive)
{
append(primitive);
}
+ void extract_border()
+ {
+ Vector<UVBorderEdge> edges;
+
+ for (UVPrimitive &primitive : primitives) {
+ for (UVEdge &edge : primitive.edges) {
+ if (edge.is_border_edge()) {
+ edges.append(UVBorderEdge(&edge));
+ }
+ }
+ }
+
+ edges.first().tag = true;
+ UVEdge *starting_edge = edges.first().edge;
+
+ border.append(UVBorderVert(starting_edge->vertices[0].uv));
+ border.append(UVBorderVert(starting_edge->vertices[1].uv));
+ UVBorderVert &first = border.first();
+ UVBorderVert ¤t = border.last();
+
+ while (current.uv != first.uv) {
+ for (UVBorderEdge &border_edge : edges) {
+ if (border_edge.tag == true) {
+ continue;
+ }
+ int i;
+ for (i = 0; i < 2; i++) {
+ if (border_edge.edge->vertices[i].uv == current.uv) {
+ border.append(UVBorderVert(border_edge.edge->vertices[1 - i].uv));
+ border_edge.tag = true;
+ break;
+ }
+ }
+ if (i != 2) {
+ break;
+ }
+ }
+ }
+ }
+
private:
void append(const UVPrimitive &primitive)
{
@@ -183,7 +245,13 @@ struct UVIslands {
svg_footer(of);
of.close();
#endif
- // TODO: extract border.
+ }
+
+ void extract_borders()
+ {
+ for (UVIsland &island : islands) {
+ island.extract_border();
+ }
}
private:
diff --git a/source/blender/blenkernel/intern/pbvh_pixels.cc b/source/blender/blenkernel/intern/pbvh_pixels.cc
index 551393e3fd2..1c8013ae20f 100644
--- a/source/blender/blenkernel/intern/pbvh_pixels.cc
+++ b/source/blender/blenkernel/intern/pbvh_pixels.cc
@@ -41,6 +41,7 @@ static uv_islands::UVIslands build_uv_islands(const PBVH &pbvh, const MLoopUV *m
uv_islands::UVIslandsMask uv_masks(float2(0.0, 0.0), ushort2(256, 256));
uv_masks.add(islands);
uv_masks.dilate();
+ islands.extract_borders();
return islands;
}
More information about the Bf-blender-cvs
mailing list