[Bf-blender-cvs] [d176c5789b7] temp-T97352-3d-texturing-seam-bleeding-b2: Temp commit before removing UVBorderVert.
Jeroen Bakker
noreply at git.blender.org
Tue Jun 7 14:45:24 CEST 2022
Commit: d176c5789b7ac911e83fa789b1b04a3789e03dc3
Author: Jeroen Bakker
Date: Tue Jun 7 11:37:29 2022 +0200
Branches: temp-T97352-3d-texturing-seam-bleeding-b2
https://developer.blender.org/rBd176c5789b7ac911e83fa789b1b04a3789e03dc3
Temp commit before removing UVBorderVert.
===================================================================
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 b90fee409bb..33aecaceca9 100644
--- a/source/blender/blenkernel/BKE_uv_islands.hh
+++ b/source/blender/blenkernel/BKE_uv_islands.hh
@@ -31,6 +31,8 @@ struct MeshPrimitive;
struct UVPrimitive;
struct UVPrimitiveEdge;
struct UVBorder;
+struct UVVertex;
+struct UVEdge;
struct MeshEdge;
struct MeshPrimitive;
@@ -56,8 +58,8 @@ struct MeshEdge {
struct MeshPrimitive {
int64_t index;
int64_t poly;
- Vector<MeshEdge *> edges;
- Vector<MeshUVVert> vertices;
+ Vector<MeshEdge *, 3> edges;
+ Vector<MeshUVVert, 3> vertices;
const MeshUVVert &get_uv_vert(const MeshVertex *vert)
{
@@ -173,6 +175,9 @@ struct UVVertex {
/* Position in uv space. */
float2 uv;
+ /* uv edges that are connected to this uvvertex. */
+ Vector<UVEdge *> uv_edges;
+
explicit UVVertex()
{
}
@@ -207,6 +212,13 @@ struct UVEdge {
{
return uv_primitives.size() == 1;
}
+
+ void append_to_uv_vertices()
+ {
+ for (UVVertex *vertex : vertices) {
+ vertex->uv_edges.append_non_duplicates(this);
+ }
+ }
};
struct UVPrimitive {
@@ -220,6 +232,19 @@ struct UVPrimitive {
{
}
+ void append_to_uv_edges()
+ {
+ for (UVEdge *uv_edge : edges) {
+ uv_edge->uv_primitives.append_non_duplicates(this);
+ }
+ }
+ void append_to_uv_vertices()
+ {
+ for (UVEdge *uv_edge : edges) {
+ uv_edge->append_to_uv_vertices();
+ }
+ }
+
Vector<std::pair<UVEdge *, UVEdge *>> shared_edges(UVPrimitive &other)
{
Vector<std::pair<UVEdge *, UVEdge *>> result;
@@ -284,10 +309,10 @@ struct UVBorderVert {
struct UVBorderEdge {
UVEdge *edge;
bool tag = false;
- int64_t uv_prim_index;
+ UVPrimitive *uv_primitive;
- explicit UVBorderEdge(UVEdge *edge, int64_t uv_prim_index)
- : edge(edge), uv_prim_index(uv_prim_index)
+ explicit UVBorderEdge(UVEdge *edge, UVPrimitive *uv_primitive)
+ : edge(edge), uv_primitive(uv_primitive)
{
}
};
@@ -340,6 +365,7 @@ struct UVIsland {
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->append_to_uv_vertices();
uv_edge->uv_primitives.append(uv_primitive_ptr);
}
return uv_primitive_ptr;
@@ -355,6 +381,7 @@ struct UVIsland {
uv_vertices.append(vertex);
UVVertex *result = &uv_vertices.last();
+ result->uv_edges.clear();
return result;
}
@@ -390,6 +417,7 @@ struct UVIsland {
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]->append_to_uv_vertices();
new_prim_ptr->edges[i]->uv_primitives.append(new_prim_ptr);
}
}
diff --git a/source/blender/blenkernel/intern/uv_islands.cc b/source/blender/blenkernel/intern/uv_islands.cc
index ce66658e757..58e758a56d7 100644
--- a/source/blender/blenkernel/intern/uv_islands.cc
+++ b/source/blender/blenkernel/intern/uv_islands.cc
@@ -15,7 +15,7 @@ void UVIsland::extract_border()
UVPrimitive &prim = uv_primitives[prim_index];
for (UVEdge *edge : prim.edges) {
if (edge->is_border_edge()) {
- edges.append(UVBorderEdge(edge, prim_index));
+ edges.append(UVBorderEdge(edge, &prim));
}
}
}
@@ -218,36 +218,84 @@ static void extend_at_vert(UVIsland &island, UVBorderVert &vert, const MeshData
fan.init_uv_coordinates(vert, island);
print(fan);
-#if 0
- // add all verts that arent connected to the given border vert to the UVIsland.
- for (FanTri &tri : fan.tris) {
- tri.flags.found = false;
- int2 test_edge(tri.v[0], tri.v[1]);
- for (UVPrimitive &prim : island.uv_primitives) {
- for (UVEdge &edge : prim.edges) {
- if (edge.vertices[0].uv == vert.uv || edge.vertices[1].uv == vert.uv) {
- int2 o(mesh_data.mloop[edge.vertices[0].loop].v,
- mesh_data.mloop[edge.vertices[1].loop].v);
- if ((test_edge.x == o.x && test_edge.y == o.y) ||
- (test_edge.x == o.y && test_edge.y == o.x)) {
- tri.flags.found = true;
- }
- }
+ for (FanSegment &segment : fan.segments) {
+ segment.flags.found = false;
+ MeshVertex *v0 = segment.primitive->vertices[segment.vert_order[0]].vertex;
+ MeshVertex *v1 = segment.primitive->vertices[segment.vert_order[1]].vertex;
+ for (UVEdge *edge : vert.uv_vertex->uv_edges) {
+ if ((edge->vertices[0]->vertex == v0 && edge->vertices[1]->vertex == v1) ||
+ (edge->vertices[0]->vertex == v1 && edge->vertices[1]->vertex == v0)) {
+ segment.flags.found = true;
+ break;
}
}
}
print(fan);
+
// tag them as being 'not fixed in uv space'. count them and determine a position in uv space.
// add UV primitives for them.
// recalc the border.
int num_to_add = 0;
- for (FanTri &tri : fan.tris) {
- if (!tri.flags.found) {
+ for (FanSegment &segment : fan.segments) {
+ if (!segment.flags.found) {
num_to_add++;
}
}
printf("Found %d new edges to add\n", num_to_add);
+ if (num_to_add == 0) {
+ // no new triangles found. In this case we should extend the exising borders.
+ UVBorder &border = island.borders[vert.border_index];
+
+ UVVertex center_vertex;
+ center_vertex.loop = border.verts[vert.next_index].uv_vertex->loop;
+ center_vertex.uv = (border.verts[vert.next_index].uv_vertex->uv +
+ border.verts[vert.prev_index].uv_vertex->uv) /
+ 2.0f;
+ center_vertex.vertex = border.verts[vert.next_index].uv_vertex->vertex;
+ center_vertex.uv_edges.clear();
+ UVVertex *center_vertex_ptr = island.lookup_or_create(center_vertex);
+
+ // What is the mesh primitive of the next
+
+ UVPrimitive prim1(0);
+ UVEdge edge_template;
+ edge_template.vertices[0] = border.verts[vert.index].uv_vertex;
+ edge_template.vertices[1] = border.verts[vert.prev_index].uv_vertex;
+ prim1.edges.append(island.lookup_or_create(edge_template));
+ edge_template.vertices[0] = border.verts[vert.prev_index].uv_vertex;
+ edge_template.vertices[1] = center_vertex_ptr;
+ prim1.edges.append(island.lookup_or_create(edge_template));
+ edge_template.vertices[0] = center_vertex_ptr;
+ edge_template.vertices[1] = border.verts[vert.index].uv_vertex;
+ prim1.edges.append(island.lookup_or_create(edge_template));
+ prim1.append_to_uv_edges();
+ prim1.append_to_uv_vertices();
+ island.uv_primitives.append(prim1);
+
+#if 0
+ prim1.edges[0].vertices[0].uv = border.verts[vert.index].uv;
+ prim1.edges[0].vertices[1].uv = border.verts[vert.prev_index].uv;
+ prim1.edges[1].vertices[0].uv = border.verts[vert.prev_index].uv;
+ prim1.edges[1].vertices[1].uv = center_uv;
+ prim1.edges[2].vertices[0].uv = center_uv;
+ prim1.edges[2].vertices[1].uv = border.verts[vert.index].uv;
+ island.uv_primitives.append(prim1);
+
+ UVPrimitive prim2(0);
+ prim2.edges[0].vertices[0].uv = border.verts[vert.index].uv;
+ prim2.edges[0].vertices[1].uv = center_uv;
+ prim2.edges[1].vertices[0].uv = center_uv;
+ prim2.edges[1].vertices[1].uv = border.verts[vert.next_index].uv;
+ prim2.edges[2].vertices[0].uv = border.verts[vert.next_index].uv;
+ prim2.edges[2].vertices[1].uv = border.verts[vert.index].uv;
+ island.uv_primitives.append(prim2);
+#endif
+ }
+ else {
+ }
+#if 0
+
if (num_to_add > 0) {
UVBorder &border = island.borders[vert.border_index];
int i = 0;
@@ -355,7 +403,7 @@ void UVIsland::extend_border(const UVIslandsMask &mask,
svg(of, *this, step++);
#endif
- int i = 5;
+ int i = 1;
while (i) {
int64_t border_index = 0;
for (UVBorder &border : borders) {
@@ -717,9 +765,11 @@ void svg(std::ostream &ss, const UVPrimitive &primitive)
}
}
center /= 3 * 2;
- ss << "<text x=\"" << center.x * 1024 << "\"";
- ss << " y=\"" << center.y * 1024 << "\">";
- ss << primitive.primitive->index;
+ if (primitive.primitive) {
+ ss << "<text x=\"" << center.x * 1024 << "\"";
+ ss << " y=\"" << center.y * 1024 << "\">";
+ 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;
More information about the Bf-blender-cvs
mailing list