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; _______________________________________________ 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