Blender V5.0
pbvh_uv_islands.hh
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2023 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
21
22#pragma once
23
24#include <optional>
25
26#include "BLI_array.hh"
27#include "BLI_map.hh"
29#include "BLI_offset_indices.hh"
30#include "BLI_vector.hh"
31#include "BLI_vector_list.hh"
32
34
35struct UVBorder;
36struct UVEdge;
37struct UVIslands;
38struct UVIslandsMask;
39struct UVPrimitive;
40struct MeshData;
41struct UVVertex;
42
44 Array<Vector<int>> edges_of_vert_;
45
46 public:
47 VertToEdgeMap() = delete;
48 VertToEdgeMap(const int verts_num)
49 {
50 edges_of_vert_.reinitialize(verts_num);
51 }
52
53 void add(const int edge_i, const int v1, const int v2)
54 {
55 edges_of_vert_[v1].append(edge_i);
56 edges_of_vert_[v2].append(edge_i);
57 }
58 Span<int> operator[](const int vert_i) const
59 {
60 return edges_of_vert_[vert_i];
61 }
62};
63
65 Array<Vector<int>> primitives_of_edge_;
66
67 public:
69 EdgeToPrimitiveMap(const int edges_num)
70 {
71 primitives_of_edge_.reinitialize(edges_num);
72 }
73
74 void add(const int primitive_i, const int edge_i)
75 {
76 primitives_of_edge_[edge_i].append(primitive_i);
77 }
78 Span<int> operator[](const int edge_i) const
79 {
80 return primitives_of_edge_[edge_i];
81 }
82};
83
85 Array<std::array<int, 3>> edges_of_triangle_;
86
87 public:
89 TriangleToEdgeMap(const int edges_num)
90 {
91 edges_of_triangle_.reinitialize(edges_num);
92 }
93
94 void add(const Span<int> edges, const int tri_i)
95 {
96 std::copy(edges.begin(), edges.end(), edges_of_triangle_[tri_i].begin());
97 }
98 Span<int> operator[](const int tri_i) const
99 {
100 return edges_of_triangle_[tri_i];
101 }
102};
103
137
138struct UVVertex {
140 /* Position in uv space. */
142
143 /* uv edges that share this UVVertex. */
145
146 struct {
147 bool is_border : 1;
148 bool is_extended : 1;
150
151 explicit UVVertex();
152 explicit UVVertex(const MeshData &mesh_data, const int loop);
153};
154
155struct UVEdge {
156 std::array<UVVertex *, 2> vertices;
158
159 UVVertex *get_other_uv_vertex(const int vertex_index);
160 bool has_shared_edge(Span<float2> uv_map, const int loop_1, const int loop_2) const;
161 bool has_shared_edge(const UVEdge &other) const;
162 bool has_same_vertices(const int2 &edge) const;
163 bool is_border_edge() const;
164
165 private:
166 bool has_shared_edge(const UVVertex &v1, const UVVertex &v2) const;
167 bool has_same_vertices(const int vert1, const int vert2) const;
168 bool has_same_uv_vertices(const UVEdge &other) const;
169};
170
175 const int primitive_i;
177
178 explicit UVPrimitive(const int primitive_i);
179
181 bool has_shared_edge(const UVPrimitive &other) const;
182 bool has_shared_edge(const MeshData &mesh_data, int other_triangle_index) const;
183
187 const UVVertex *get_uv_vertex(const MeshData &mesh_data, const uint8_t mesh_vert_index) const;
188
193 UVEdge *get_uv_edge(const float2 uv1, const float2 uv2) const;
194 UVEdge *get_uv_edge(const int v1, const int v2) const;
195
196 bool contains_uv_vertex(const UVVertex *uv_vertex) const;
197 const UVVertex *get_other_uv_vertex(const UVVertex *v1, const UVVertex *v2) const;
198
199 UVBorder extract_border() const;
200};
201
204 bool tag = false;
206 /* Should the vertices of the edge be evaluated in reverse order. */
207 bool reverse_order = false;
208
213
215
217 const UVVertex *get_uv_vertex(int index) const;
218
222 const UVVertex *get_other_uv_vertex() const;
223
224 float length() const;
225};
226
230 float angle;
231
233
240 float2 uv(float factor, float min_uv_distance);
241
248 bool connected_in_mesh() const;
249 void print_debug() const;
250};
251
252struct UVBorder {
255
259 bool is_ccw() const;
260
264 void flip_order();
265
269 float outside_angle(const UVBorderEdge &edge) const;
270
271 void update_indexes(uint64_t border_index);
272
273 static std::optional<UVBorder> extract_from_edges(Vector<UVBorderEdge> &edges);
274
276 void remove(int64_t index);
277};
278
279struct UVIsland {
285 int id;
294
300
301 UVVertex *lookup(const UVVertex &vertex);
302 UVVertex *lookup_or_create(const UVVertex &vertex);
303 UVEdge *lookup(const UVEdge &edge);
304 UVEdge *lookup_or_create(const UVEdge &edge);
305
307 void extract_borders();
309 void extend_border(const MeshData &mesh_data,
310 const UVIslandsMask &mask,
311 const short island_index);
312
313 private:
314 void append(const UVPrimitive &primitive);
315
316 public:
317 bool has_shared_edge(const UVPrimitive &primitive) const;
318 bool has_shared_edge(const MeshData &mesh_data, const int primitive_i) const;
319 void extend_border(const UVPrimitive &primitive);
320
322 void print_debug(const MeshData &mesh_data) const;
323};
324
325struct UVIslands {
327
328 explicit UVIslands(const MeshData &mesh_data);
329
330 void extract_borders();
331 void extend_borders(const MeshData &mesh_data, const UVIslandsMask &islands_mask);
332 void print_debug(const MeshData &mesh_data) const;
333};
334
337
339 struct Tile {
344
346
347 bool is_masked(const uint16_t island_index, const float2 uv) const;
348 bool contains(const float2 uv) const;
349 float get_pixel_size_in_uv_space() const;
350 };
351
353
354 void add_tile(float2 udim_offset, ushort2 resolution);
355
359 const Tile *find_tile(const float2 uv) const;
360
367 bool is_masked(const uint16_t island_index, const float2 uv) const;
368
373 void add(const MeshData &mesh_data, const UVIslands &islands);
374
375 void dilate(int max_iterations);
376};
377
378} // namespace blender::bke::pbvh::uv_islands
ATTR_WARN_UNUSED_RESULT const BMVert * v2
long long int int64_t
unsigned long long int uint64_t
constexpr const T * end() const
Definition BLI_span.hh:224
constexpr const T * begin() const
Definition BLI_span.hh:220
Span< int > operator[](const int edge_i) const
void add(const int primitive_i, const int edge_i)
void add(const Span< int > edges, const int tri_i)
Span< int > operator[](const int tri_i) const
void add(const int edge_i, const int v1, const int v2)
Span< int > operator[](const int vert_i) const
ccl_device_inline float2 mask(const MaskType mask, const float2 a)
VecBase< int32_t, 2 > int2
VecBase< float, 2 > float2
VecBase< uint16_t, 2 > ushort2
MeshData(OffsetIndices< int > faces, Span< int3 > corner_tris, Span< int > corner_verts, Span< float2 > uv_map, Span< float3 > vert_positions)
float2 uv(float factor, float min_uv_distance)
UVBorderCorner(UVBorderEdge *first, UVBorderEdge *second, float angle)
UVBorderEdge(UVEdge *edge, UVPrimitive *uv_primitive)
float outside_angle(const UVBorderEdge &edge) const
static std::optional< UVBorder > extract_from_edges(Vector< UVBorderEdge > &edges)
void update_indexes(uint64_t border_index)
bool has_same_vertices(const int2 &edge) const
bool has_shared_edge(Span< float2 > uv_map, const int loop_1, const int loop_2) const
std::array< UVVertex *, 2 > vertices
UVVertex * get_other_uv_vertex(const int vertex_index)
Map< int64_t, Vector< UVVertex * > > uv_vertex_lookup
void print_debug(const MeshData &mesh_data) const
bool has_shared_edge(const UVPrimitive &primitive) const
void extend_border(const MeshData &mesh_data, const UVIslandsMask &mask, const short island_index)
UVVertex * lookup_or_create(const UVVertex &vertex)
UVVertex * lookup(const UVVertex &vertex)
Tile(float2 udim_offset, ushort2 tile_resolution)
bool is_masked(const uint16_t island_index, const float2 uv) const
void add(const MeshData &mesh_data, const UVIslands &islands)
const Tile * find_tile(const float2 uv) const
bool is_masked(const uint16_t island_index, const float2 uv) const
void add_tile(float2 udim_offset, ushort2 resolution)
void extend_borders(const MeshData &mesh_data, const UVIslandsMask &islands_mask)
void print_debug(const MeshData &mesh_data) const
Vector< std::pair< UVEdge *, UVEdge * > > shared_edges(UVPrimitive &other)
UVEdge * get_uv_edge(const float2 uv1, const float2 uv2) const
bool has_shared_edge(const UVPrimitive &other) const
const UVVertex * get_other_uv_vertex(const UVVertex *v1, const UVVertex *v2) const
bool contains_uv_vertex(const UVVertex *uv_vertex) const
const UVVertex * get_uv_vertex(const MeshData &mesh_data, const uint8_t mesh_vert_index) const
struct blender::bke::pbvh::uv_islands::UVVertex::@146070211233272321030042025306175335142241112375 flags