Blender V5.0
ED_uvedit.hh
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2008 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
8
9#pragma once
10
11#include "BLI_function_ref.hh"
12#include "BLI_vector_list.hh"
13
14#include "BKE_customdata.hh"
15
16struct ARegion;
17struct ARegionType;
18struct BMEdge;
19struct BMEditMesh;
20struct BMFace;
21struct BMLoop;
22struct BMVert;
23struct BMesh;
24struct Image;
25struct ImageUser;
26struct ListBase;
27struct Main;
28struct Object;
29struct Scene;
30struct SpaceImage;
31struct ToolSettings;
32struct View2D;
33struct ViewLayer;
34struct bContext;
35struct bNode;
36struct bNodeTree;
37struct wmKeyConfig;
38struct wmTimer;
39
40/* `uvedit_ops.cc` */
41
44void ED_keymap_uvedit(wmKeyConfig *keyconf);
45
50
51void ED_uvedit_foreach_uv(const Scene *scene,
52 BMesh *bm,
53 const bool skip_invisible,
54 const bool selected,
55 blender::FunctionRef<void(float[2])> user_fn);
57 blender::Span<Object *> objects_edit,
58 const bool skip_invisible,
59 const bool skip_nonselected,
60 blender::FunctionRef<void(float[2])> user_fn);
61bool ED_uvedit_minmax_multi(const Scene *scene,
62 blender::Span<Object *> objects_edit,
63 float r_min[2],
64 float r_max[2]);
65bool ED_uvedit_center_multi(const Scene *scene,
66 blender::Span<Object *> objects_edit,
67 float r_cent[2],
68 char mode);
69
71 Scene *scene,
72 ViewLayer *view_layer,
73 float r_center[2],
74 char mode,
75 bool *r_has_select);
76
78 int mat_nr,
79 Image **r_ima,
80 ImageUser **r_iuser,
81 const bNode **r_node,
82 const bNodeTree **r_ntree);
83void ED_object_assign_active_image(Main *bmain, Object *ob, int mat_nr, Image *ima);
84
85bool ED_uvedit_test(Object *obedit);
86
87/* `uvedit_select.cc` */
88
89namespace blender::ed::uv {
90
105 private:
106 char uv_sticky_;
107 BMesh &bm_;
108
109 blender::VectorList<BMVert *> bm_verts_select_;
110 blender::VectorList<BMEdge *> bm_edges_select_;
111 blender::VectorList<BMFace *> bm_faces_select_;
112
113 blender::VectorList<BMVert *> bm_verts_deselect_;
114 blender::VectorList<BMEdge *> bm_edges_deselect_;
115 blender::VectorList<BMFace *> bm_faces_deselect_;
116
117 public:
118 UVSyncSelectFromMesh(BMesh &bm, char uv_sticky) : uv_sticky_(uv_sticky), bm_(bm) {}
120
121 static std::unique_ptr<UVSyncSelectFromMesh> create_if_needed(const ToolSettings &ts, BMesh &bm);
122 void apply();
123
124 /* Select. */
125
127 void edge_select_enable(BMEdge *f);
128 void face_select_enable(BMFace *f);
129
130 /* De-Select. */
131
135
136 /* Select set. */
137
138 void vert_select_set(BMVert *v, bool value);
139 void edge_select_set(BMEdge *f, bool value);
140 void face_select_set(BMFace *f, bool value);
141};
142
143} // namespace blender::ed::uv
144
148
149/* Visibility and selection tests. */
150
151bool uvedit_face_visible_test_ex(const ToolSettings *ts, const BMFace *efa);
152bool uvedit_face_select_test_ex(const ToolSettings *ts, const BMesh *bm, const BMFace *efa);
153
155 const BMesh *bm,
156 const BMLoop *l,
157 const BMUVOffsets &offsets);
159 const BMesh *bm,
160 const BMLoop *l,
161 const BMUVOffsets &offsets);
162
163bool uvedit_face_visible_test(const Scene *scene, const BMFace *efa);
164bool uvedit_face_select_test(const Scene *scene, const BMesh *bm, const BMFace *efa);
165bool uvedit_edge_select_test(const Scene *scene,
166 const BMesh *bm,
167 const BMLoop *l,
168 const BMUVOffsets &offsets);
169bool uvedit_uv_select_test(const Scene *scene,
170 const BMesh *bm,
171 const BMLoop *l,
172 const BMUVOffsets &offsets);
173
174/* Low level loop selection, this ignores the selection modes. */
175
176bool uvedit_loop_vert_select_get(const ToolSettings *ts, const BMesh *bm, const BMLoop *l);
177bool uvedit_loop_edge_select_get(const ToolSettings *ts, const BMesh *bm, const BMLoop *l);
179 const BMesh *bm,
180 BMLoop *l,
181 const bool select);
183 const BMesh *bm,
184 BMLoop *l,
185 const bool select);
186
187/* Individual UV element selection functions. */
188
194void uvedit_face_select_set(const Scene *scene, BMesh *bm, BMFace *efa, bool select);
200void uvedit_edge_select_set(const Scene *scene, BMesh *bm, BMLoop *l, bool select);
206void uvedit_uv_select_set(const Scene *scene, BMesh *bm, BMLoop *l, bool select);
207
208/* Low level functions for (de)selecting individual UV elements. Ensure UV face visibility before
209 * use. */
210
211void uvedit_face_select_enable(const Scene *scene, BMesh *bm, BMFace *efa);
212void uvedit_face_select_disable(const Scene *scene, BMesh *bm, BMFace *efa);
213
214void uvedit_edge_select_enable(const Scene *scene, BMesh *bm, BMLoop *l);
215void uvedit_edge_select_disable(const Scene *scene, BMesh *bm, BMLoop *l);
216
217void uvedit_uv_select_enable(const Scene *scene, BMesh *bm, BMLoop *l);
218void uvedit_uv_select_disable(const Scene *scene, BMesh *bm, BMLoop *l);
219
220/* Sticky mode UV element selection functions. */
221
223 const Scene *scene, BMesh *bm, BMFace *efa, bool select, const BMUVOffsets &offsets);
225 const Scene *scene, BMesh *bm, BMLoop *l, bool select, const BMUVOffsets &offsets);
226
228 const Scene *scene, BMesh *bm, BMLoop *l, bool select, const BMUVOffsets &offsets);
229
230/* Low level functions for sticky element selection (sticky mode independent). Type of sticky
231 * selection is specified explicitly (using sticky_flag, except for face selection). */
232
234 const Scene *scene, BMesh *bm, BMFace *efa, const bool select, const BMUVOffsets &offsets);
242void uvedit_edge_select_shared_vert(const Scene *scene,
243 BMesh *bm,
244 BMLoop *l,
245 const bool select,
246 const int sticky_flag,
247 const BMUVOffsets &offsets);
255void uvedit_uv_select_shared_vert(const Scene *scene,
256 BMesh *bm,
257 BMLoop *l,
258 const bool select,
259 const int sticky_flag,
260 const BMUVOffsets &offsets);
261
265void uvedit_edge_select_set_noflush(const Scene *scene,
266 BMesh *bm,
267 BMLoop *l,
268 const bool select,
269 const int sticky_flag,
270 const BMUVOffsets &offsets);
271
278void ED_uvedit_selectmode_clean(const Scene *scene, Object *obedit);
282
288void ED_uvedit_selectmode_flush(const Scene *scene, BMesh *bm);
289
296void uvedit_select_flush_from_verts(const Scene *scene, BMesh *bm, bool select);
297
299 const Scene *scene,
301 const float mval_fl[2],
302 const bool ignore_selected,
303 float *dist_sq,
304 float r_uv[2]);
305
306BMFace **ED_uvedit_selected_faces(const Scene *scene, BMesh *bm, int len_max, int *r_faces_len);
307BMLoop **ED_uvedit_selected_edges(const Scene *scene, BMesh *bm, int len_max, int *r_edges_len);
308BMLoop **ED_uvedit_selected_verts(const Scene *scene, BMesh *bm, int len_max, int *r_verts_len);
309
312
315
320char ED_uvedit_select_mode_get(const Scene *scene);
323
324/* `uvedit_unwrap_ops.cc` */
325
326void ED_uvedit_deselect_all(const Scene *scene, Object *obedit, int action);
327
328void ED_uvedit_get_aspect(Object *obedit, float *r_aspx, float *r_aspy);
329
334float ED_uvedit_get_aspect_y(Object *obedit);
335
337 const int material_index,
338 float *r_aspx,
339 float *r_aspy);
340
343
347void ED_uvedit_live_unwrap_begin(Scene *scene, Object *obedit, struct wmWindow *win_modal);
349void ED_uvedit_live_unwrap_end(bool cancel);
350
352void ED_uvedit_add_simple_uvs(Main *bmain, const Scene *scene, Object *ob);
353
354/* `uvedit_draw.cc` */
355
356void ED_image_draw_cursor(ARegion *region, const float cursor[2]);
357
358/* `uvedit_buttons.cc` */
359
361
362/* `uvedit_islands.cc` */
363
376
380int bm_mesh_calc_uv_islands(const Scene *scene,
381 BMesh *bm,
382 ListBase *island_list,
383 const bool only_selected_faces,
384 const bool only_selected_uvs,
385 const bool use_seams,
386 const float aspect_y,
387 const BMUVOffsets &offsets);
388
392bool uv_coords_isect_udim(const Image *image, const int udim_grid[2], const float coords[2]);
CustomData interface, see also DNA_customdata_types.h.
void uvedit_edge_select_set_noflush(const Scene *scene, BMesh *bm, BMLoop *l, const bool select, const int sticky_flag, const BMUVOffsets &offsets)
bool ED_object_get_active_image(Object *ob, int mat_nr, Image **r_ima, ImageUser **r_iuser, const bNode **r_node, const bNodeTree **r_ntree)
void ED_uvedit_foreach_uv_multi(const Scene *scene, blender::Span< Object * > objects_edit, const bool skip_invisible, const bool skip_nonselected, blender::FunctionRef< void(float[2])> user_fn)
void ED_keymap_uvedit(wmKeyConfig *keyconf)
void ED_uvedit_select_all(const ToolSettings *ts, BMesh *bm)
void ED_uvedit_selectmode_clean(const Scene *scene, Object *obedit)
UV Select Mode set.
BMLoop * ED_uvedit_active_vert_loop_get(const ToolSettings *ts, BMesh *bm)
bool uvedit_edge_select_test(const Scene *scene, const BMesh *bm, const BMLoop *l, const BMUVOffsets &offsets)
void ED_uvedit_selectmode_clean_multi(bContext *C)
bool uvedit_loop_vert_select_get(const ToolSettings *ts, const BMesh *bm, const BMLoop *l)
void ED_uvedit_add_simple_uvs(Main *bmain, const Scene *scene, Object *ob)
void ED_uvedit_live_unwrap_begin(Scene *scene, Object *obedit, struct wmWindow *win_modal)
bool ED_uvedit_nearest_uv_multi(const View2D *v2d, const Scene *scene, blender::Span< Object * > objects, const float mval_fl[2], const bool ignore_selected, float *dist_sq, float r_uv[2])
void ED_operatortypes_uvedit()
float ED_uvedit_get_aspect_y(Object *obedit)
void uvedit_uv_select_shared_vert(const Scene *scene, BMesh *bm, BMLoop *l, const bool select, const int sticky_flag, const BMUVOffsets &offsets)
void ED_uvedit_sticky_selectmode_update(bContext *C)
void ED_uvedit_active_edge_loop_set(BMesh *bm, BMLoop *l)
bool ED_uvedit_minmax_multi(const Scene *scene, blender::Span< Object * > objects_edit, float r_min[2], float r_max[2])
bool ED_uvedit_sync_uvselect_ignore(const ToolSettings *ts)
bool ED_uvedit_center_from_pivot_ex(const SpaceImage *sima, Scene *scene, ViewLayer *view_layer, float r_center[2], char mode, bool *r_has_select)
void uvedit_select_flush_from_verts(const Scene *scene, BMesh *bm, bool select)
void uvedit_face_select_set_with_sticky(const Scene *scene, BMesh *bm, BMFace *efa, bool select, const BMUVOffsets &offsets)
void ED_uvedit_get_aspect_from_material(Object *ob, const int material_index, float *r_aspx, float *r_aspy)
BMLoop ** ED_uvedit_selected_edges(const Scene *scene, BMesh *bm, int len_max, int *r_edges_len)
void ED_uvedit_foreach_uv(const Scene *scene, BMesh *bm, const bool skip_invisible, const bool selected, blender::FunctionRef< void(float[2])> user_fn)
void ED_uvedit_buttons_register(ARegionType *art)
bool ED_uvedit_live_unwrap_timer_check(const wmTimer *timer)
bool ED_uvedit_test(Object *obedit)
Definition uvedit_ops.cc:73
void uvedit_uv_select_disable(const Scene *scene, BMesh *bm, BMLoop *l)
char ED_uvedit_select_mode_get(const Scene *scene)
void ED_uvedit_selectmode_flush(const Scene *scene, BMesh *bm)
UV Select Mode Flush.
bool uvedit_edge_select_test_ex(const ToolSettings *ts, const BMesh *bm, const BMLoop *l, const BMUVOffsets &offsets)
void ED_uvedit_sync_uvselect_ensure_if_needed(const ToolSettings *ts, BMesh *bm)
void ED_uvedit_live_unwrap_re_solve()
bool uvedit_uv_select_test(const Scene *scene, const BMesh *bm, const BMLoop *l, const BMUVOffsets &offsets)
void uvedit_edge_select_set_with_sticky(const Scene *scene, BMesh *bm, BMLoop *l, bool select, const BMUVOffsets &offsets)
void uvedit_loop_vert_select_set(const ToolSettings *ts, const BMesh *bm, BMLoop *l, const bool select)
void ED_image_draw_cursor(ARegion *region, const float cursor[2])
void uvedit_uv_select_set_with_sticky(const Scene *scene, BMesh *bm, BMLoop *l, bool select, const BMUVOffsets &offsets)
void uvedit_edge_select_enable(const Scene *scene, BMesh *bm, BMLoop *l)
void uvedit_edge_select_disable(const Scene *scene, BMesh *bm, BMLoop *l)
void uvedit_face_select_enable(const Scene *scene, BMesh *bm, BMFace *efa)
bool uvedit_face_select_test_ex(const ToolSettings *ts, const BMesh *bm, const BMFace *efa)
void uvedit_uv_select_set(const Scene *scene, BMesh *bm, BMLoop *l, bool select)
Select UV Vertex.
bool ED_uvedit_select_island_check(const ToolSettings *ts)
bool uvedit_loop_edge_select_get(const ToolSettings *ts, const BMesh *bm, const BMLoop *l)
void uvedit_uv_select_enable(const Scene *scene, BMesh *bm, BMLoop *l)
bool ED_uvedit_sync_uvselect_is_valid_or_ignore(const ToolSettings *ts, const BMesh *bm)
void ED_uvedit_get_aspect(Object *obedit, float *r_aspx, float *r_aspy)
void ED_uvedit_select_sync_multi(bContext *C)
void ED_uvedit_select_sync_flush(const ToolSettings *ts, BMesh *bm, bool select)
int bm_mesh_calc_uv_islands(const Scene *scene, BMesh *bm, ListBase *island_list, const bool only_selected_faces, const bool only_selected_uvs, const bool use_seams, const float aspect_y, const BMUVOffsets &offsets)
void ED_uvedit_live_unwrap_end(bool cancel)
void uvedit_loop_edge_select_set(const ToolSettings *ts, const BMesh *bm, BMLoop *l, const bool select)
bool uvedit_face_visible_test(const Scene *scene, const BMFace *efa)
bool uvedit_uv_select_test_ex(const ToolSettings *ts, const BMesh *bm, const BMLoop *l, const BMUVOffsets &offsets)
void uvedit_edge_select_shared_vert(const Scene *scene, BMesh *bm, BMLoop *l, const bool select, const int sticky_flag, const BMUVOffsets &offsets)
void ED_object_assign_active_image(Main *bmain, Object *ob, int mat_nr, Image *ima)
void uvedit_edge_select_set(const Scene *scene, BMesh *bm, BMLoop *l, bool select)
Select UV Edge.
void uvedit_face_select_shared_vert(const Scene *scene, BMesh *bm, BMFace *efa, const bool select, const BMUVOffsets &offsets)
bool uv_coords_isect_udim(const Image *image, const int udim_grid[2], const float coords[2])
BMLoop * ED_uvedit_active_edge_loop_get(const ToolSettings *ts, BMesh *bm)
void ED_uvedit_live_unwrap(const Scene *scene, blender::Span< Object * > objects)
bool ED_uvedit_center_multi(const Scene *scene, blender::Span< Object * > objects_edit, float r_cent[2], char mode)
void ED_uvedit_deselect_all(const Scene *scene, Object *obedit, int action)
void uvedit_face_select_set(const Scene *scene, BMesh *bm, BMFace *efa, bool select)
Select UV Face.
void ED_operatormacros_uvedit()
void uvedit_face_select_disable(const Scene *scene, BMesh *bm, BMFace *efa)
BMFace ** ED_uvedit_selected_faces(const Scene *scene, BMesh *bm, int len_max, int *r_faces_len)
bool uvedit_face_select_test(const Scene *scene, const BMesh *bm, const BMFace *efa)
bool uvedit_face_visible_test_ex(const ToolSettings *ts, const BMFace *efa)
BMLoop ** ED_uvedit_selected_verts(const Scene *scene, BMesh *bm, int len_max, int *r_verts_len)
void ED_uvedit_active_vert_loop_set(BMesh *bm, BMLoop *l)
#define C
Definition RandGen.cpp:29
BMesh * bm
ATTR_WARN_UNUSED_RESULT const BMLoop * l
ATTR_WARN_UNUSED_RESULT const BMVert * v
NonCopyable(const NonCopyable &other)=delete
void vert_select_set(BMVert *v, bool value)
void face_select_set(BMFace *f, bool value)
UVSyncSelectFromMesh(const UVSyncSelectFromMesh &)=delete
UVSyncSelectFromMesh(BMesh &bm, char uv_sticky)
Definition ED_uvedit.hh:118
void edge_select_set(BMEdge *f, bool value)
static std::unique_ptr< UVSyncSelectFromMesh > create_if_needed(const ToolSettings &ts, BMesh &bm)
#define select(A, B, C)
FaceIsland * prev
Definition ED_uvedit.hh:366
float aspect_y
Definition ED_uvedit.hh:374
BMFace ** faces
Definition ED_uvedit.hh:367
FaceIsland * next
Definition ED_uvedit.hh:365
BMUVOffsets offsets
Definition ED_uvedit.hh:373
wmTimer * timer