Blender V4.3
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
22#pragma once
23
24#include <fstream>
25#include <optional>
26
27#include "BLI_array.hh"
28#include "BLI_map.hh"
31#include "BLI_offset_indices.hh"
32#include "BLI_rect.h"
33#include "BLI_vector.hh"
34#include "BLI_vector_list.hh"
35#include "BLI_virtual_array.hh"
36
38
39struct UVBorder;
40struct UVEdge;
41struct UVIslands;
42struct UVIslandsMask;
43struct UVPrimitive;
44struct MeshData;
45struct UVVertex;
46
48 Array<Vector<int>> edges_of_vert_;
49
50 public:
51 VertToEdgeMap() = delete;
52 VertToEdgeMap(const int verts_num)
53 {
54 edges_of_vert_.reinitialize(verts_num);
55 }
56
57 void add(const int edge_i, const int v1, const int v2)
58 {
59 edges_of_vert_[v1].append(edge_i);
60 edges_of_vert_[v2].append(edge_i);
61 }
62 Span<int> operator[](const int vert_i) const
63 {
64 return edges_of_vert_[vert_i];
65 }
66};
67
69 Array<Vector<int>> primitives_of_edge_;
70
71 public:
73 EdgeToPrimitiveMap(const int edges_num)
74 {
75 primitives_of_edge_.reinitialize(edges_num);
76 }
77
78 void add(const int primitive_i, const int edge_i)
79 {
80 primitives_of_edge_[edge_i].append(primitive_i);
81 }
82 Span<int> operator[](const int edge_i) const
83 {
84 return primitives_of_edge_[edge_i];
85 }
86};
87
89 Array<std::array<int, 3>> edges_of_triangle_;
90
91 public:
93 TriangleToEdgeMap(const int edges_num)
94 {
95 edges_of_triangle_.reinitialize(edges_num);
96 }
97
98 void add(const Span<int> edges, const int tri_i)
99 {
100 std::copy(edges.begin(), edges.end(), edges_of_triangle_[tri_i].begin());
101 }
102 Span<int> operator[](const int tri_i) const
103 {
104 return edges_of_triangle_[tri_i];
105 }
106};
107
142
143struct UVVertex {
145 /* Position in uv space. */
147
148 /* uv edges that share this UVVertex. */
150
151 struct {
152 bool is_border : 1;
153 bool is_extended : 1;
155
156 explicit UVVertex();
157 explicit UVVertex(const MeshData &mesh_data, const int loop);
158};
159
160struct UVEdge {
161 std::array<UVVertex *, 2> vertices;
163
164 UVVertex *get_other_uv_vertex(const int vertex_index);
165 bool has_shared_edge(Span<float2> uv_map, const int loop_1, const int loop_2) const;
166 bool has_shared_edge(const UVEdge &other) const;
167 bool has_same_vertices(const int2 &edge) const;
168 bool is_border_edge() const;
169
170 private:
171 bool has_shared_edge(const UVVertex &v1, const UVVertex &v2) const;
172 bool has_same_vertices(const int v1, const int v2) const;
173 bool has_same_uv_vertices(const UVEdge &other) const;
174};
175
180 const int primitive_i;
182
183 explicit UVPrimitive(const int primitive_i);
184
186 bool has_shared_edge(const UVPrimitive &other) const;
187 bool has_shared_edge(const MeshData &mesh_data, int other_triangle_index) const;
188
192 const UVVertex *get_uv_vertex(const MeshData &mesh_data, const uint8_t mesh_vert_index) const;
193
198 UVEdge *get_uv_edge(const float2 uv1, const float2 uv2) const;
199 UVEdge *get_uv_edge(const int v1, const int v2) const;
200
201 bool contains_uv_vertex(const UVVertex *uv_vertex) const;
202 const UVVertex *get_other_uv_vertex(const UVVertex *v1, const UVVertex *v2) const;
203
204 UVBorder extract_border() const;
205};
206
209 bool tag = false;
211 /* Should the vertices of the edge be evaluated in reverse order. */
212 bool reverse_order = false;
213
214 int64_t index = -1;
218
220
221 UVVertex *get_uv_vertex(int index);
222 const UVVertex *get_uv_vertex(int index) const;
223
227 const UVVertex *get_other_uv_vertex() const;
228
229 float length() const;
230};
231
235 float angle;
236
237 explicit UVBorderCorner(UVBorderEdge *first, UVBorderEdge *second, float angle);
238
245 float2 uv(float factor, float min_uv_distance);
246
253 bool connected_in_mesh() const;
254 void print_debug() const;
255};
256
257struct UVBorder {
260
264 bool is_ccw() const;
265
269 void flip_order();
270
274 float outside_angle(const UVBorderEdge &edge) const;
275
276 void update_indexes(uint64_t border_index);
277
278 static std::optional<UVBorder> extract_from_edges(Vector<UVBorderEdge> &edges);
279
281 void remove(int64_t index);
282};
283
284struct UVIsland {
290 int id;
299
305
306 UVVertex *lookup(const UVVertex &vertex);
307 UVVertex *lookup_or_create(const UVVertex &vertex);
308 UVEdge *lookup(const UVEdge &edge);
309 UVEdge *lookup_or_create(const UVEdge &edge);
310
312 void extract_borders();
314 void extend_border(const MeshData &mesh_data,
315 const UVIslandsMask &mask,
316 const short island_index);
317
318 private:
319 void append(const UVPrimitive &primitive);
320
321 public:
322 bool has_shared_edge(const UVPrimitive &primitive) const;
323 bool has_shared_edge(const MeshData &mesh_data, const int primitive_i) const;
324 void extend_border(const UVPrimitive &primitive);
325
327 void print_debug(const MeshData &mesh_data) const;
328};
329
330struct UVIslands {
332
333 explicit UVIslands(const MeshData &mesh_data);
334
335 void extract_borders();
336 void extend_borders(const MeshData &mesh_data, const UVIslandsMask &islands_mask);
337 void print_debug(const MeshData &mesh_data) const;
338};
339
342
344 struct Tile {
349
351
352 bool is_masked(const uint16_t island_index, const float2 uv) const;
353 bool contains(const float2 uv) const;
354 float get_pixel_size_in_uv_space() const;
355 };
356
358
359 void add_tile(float2 udim_offset, ushort2 resolution);
360
364 const Tile *find_tile(const float2 uv) const;
365
372 bool is_masked(const uint16_t island_index, const float2 uv) const;
373
378 void add(const MeshData &mesh_data, const UVIslands &islands);
379
380 void dilate(int max_iterations);
381};
382
383} // namespace blender::bke::pbvh::uv_islands
ATTR_WARN_UNUSED_RESULT const BMVert * v2
void reinitialize(const int64_t new_size)
Definition BLI_array.hh:388
const T * begin() const
Definition BLI_array.hh:310
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
append
unsigned short uint16_t
Definition stdint.h:79
__int64 int64_t
Definition stdint.h:89
unsigned char uint8_t
Definition stdint.h:78
unsigned __int64 uint64_t
Definition stdint.h:90
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)
Vector< UVPrimitive *, 2 > uv_primitives
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::@96 flags