Blender V5.0
uvedit_select.cc File Reference
#include <cmath>
#include <cstdlib>
#include <cstring>
#include "MEM_guardedalloc.h"
#include "DNA_node_types.h"
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
#include "DNA_space_types.h"
#include "BLI_hash.h"
#include "BLI_heap.h"
#include "BLI_kdopbvh.hh"
#include "BLI_kdtree.h"
#include "BLI_lasso_2d.hh"
#include "BLI_listbase.h"
#include "BLI_math_geom.h"
#include "BLI_math_matrix.h"
#include "BLI_math_vector.h"
#include "BLI_memarena.h"
#include "BLI_polyfill_2d.h"
#include "BLI_polyfill_2d_beautify.h"
#include "BLI_utildefines.h"
#include "BLI_vector_list.hh"
#include "BLT_translation.hh"
#include "BKE_context.hh"
#include "BKE_customdata.hh"
#include "BKE_editmesh.hh"
#include "BKE_layer.hh"
#include "BKE_material.hh"
#include "BKE_mesh.hh"
#include "BKE_mesh_mapping.hh"
#include "BKE_report.hh"
#include "DEG_depsgraph.hh"
#include "DEG_depsgraph_query.hh"
#include "ED_image.hh"
#include "ED_mesh.hh"
#include "ED_screen.hh"
#include "ED_select_utils.hh"
#include "ED_uvedit.hh"
#include "RNA_access.hh"
#include "RNA_define.hh"
#include "RNA_enum_types.hh"
#include "WM_api.hh"
#include "WM_types.hh"
#include "UI_view2d.hh"
#include "uvedit_intern.hh"

Go to the source code of this file.

Classes

struct  UVOverlapData

Namespaces

namespace  blender
namespace  blender::ed
namespace  blender::ed::uv

Macros

#define SET_SELECTION(value)
#define NEIGHBORING_FACE_IS_SEL   1
#define CURR_FACE_IS_UNSEL   2

Typedefs

using int2

Enumerations

enum  eUVSelectSimilar {
  UV_SSIM_AREA_UV = 1000 , UV_SSIM_AREA_3D , UV_SSIM_FACE , UV_SSIM_LENGTH_UV ,
  UV_SSIM_LENGTH_3D , UV_SSIM_MATERIAL , UV_SSIM_OBJECT , UV_SSIM_PIN ,
  UV_SSIM_SIDES , UV_SSIM_WINDING
}

Functions

static void uv_select_all_perform_multi_ex (const Scene *scene, Span< Object * > objects, int action, const Object *ob_exclude)
(De)Select All Operator
static void uv_select_all_perform_multi (const Scene *scene, Span< Object * > objects, int action)
bool uvedit_select_is_any_selected (const Scene *scene, BMesh *bm)
bool uvedit_select_is_any_selected_multi (const Scene *scene, const Span< Object * > objects)
static void uv_select_all (const Scene *scene, BMEditMesh *em, bool select_all)
static void uv_select_toggle_all (const Scene *scene, BMEditMesh *em)
static void uv_select_invert (const Scene *scene, BMEditMesh *em)
void ED_uvedit_deselect_all (const Scene *scene, Object *obedit, int action)
static void uv_select_all_perform_multi_ex (const Scene *scene, const Span< Object * > objects, int action, const Object *ob_exclude)
static wmOperatorStatus uv_select_all_exec (bContext *C, wmOperator *op)
void UV_OT_select_all (wmOperatorType *ot)
Select/Tag Flushing Utils

Utility functions to flush the uv-selection from tags.

static void uv_select_flush_from_tag_face (const Scene *scene, Object *obedit, const bool select)
static void uv_select_flush_from_tag_loop (const Scene *scene, Object *obedit, const bool select)
static void uv_select_flush_from_loop_edge_flag (const Scene *scene, BMesh *bm)
static void uv_select_tag_update_for_object (Depsgraph *depsgraph, const ToolSettings *ts, Object *obedit)
static void uv_select_sync_update (const Scene *scene, Object *obedit)
static void uvedit_uv_select_flush_from_tag_sticky_loc_internal (const Scene *scene, BMesh *bm, BMLoop *l, const bool select, const BMUVOffsets &offsets)
static void uvedit_edge_select_flush_from_tag_sticky_loc_internal (const Scene *scene, BMesh *bm, BMLoop *l, const bool select, const BMUVOffsets &offsets)
Active Selection Tracking

Currently we don't store loops in the selection history, store face/edge/vert combinations (needed for UV path selection).

void ED_uvedit_active_vert_loop_set (BMesh *bm, BMLoop *l)
BMLoopED_uvedit_active_vert_loop_get (const ToolSettings *ts, BMesh *bm)
void ED_uvedit_active_edge_loop_set (BMesh *bm, BMLoop *l)
BMLoopED_uvedit_active_edge_loop_get (const ToolSettings *ts, BMesh *bm)
Visibility and Selection Utilities
bool ED_uvedit_sync_uvselect_ignore (const ToolSettings *ts)
bool ED_uvedit_sync_uvselect_is_valid_or_ignore (const ToolSettings *ts, const BMesh *bm)
static void uvedit_sync_uvselect_flush_from_v3d (const ToolSettings *ts, BMesh *bm)
void ED_uvedit_sync_uvselect_ensure_if_needed (const ToolSettings *ts, BMesh *bm)
char ED_uvedit_select_mode_get (const Scene *scene)
bool ED_uvedit_select_island_check (const ToolSettings *ts)
void ED_uvedit_select_sync_flush (const ToolSettings *ts, BMesh *bm, const bool select)
static void uvedit_vertex_select_tagged (BMesh *bm, const Scene *scene, bool select)
bool uvedit_face_visible_test_ex (const ToolSettings *ts, const BMFace *efa)
bool uvedit_face_visible_test (const Scene *scene, const BMFace *efa)
bool uvedit_face_select_test_ex (const ToolSettings *ts, const BMesh *bm, const BMFace *efa)
bool uvedit_face_select_test (const Scene *scene, const BMesh *bm, const BMFace *efa)
void uvedit_face_select_set_with_sticky (const Scene *scene, BMesh *bm, BMFace *efa, const bool select, const BMUVOffsets &offsets)
void uvedit_face_select_shared_vert (const Scene *scene, BMesh *bm, BMFace *efa, const bool select, const BMUVOffsets &offsets)
void uvedit_face_select_set (const Scene *scene, BMesh *bm, BMFace *efa, const bool select)
 Select UV Face.
void uvedit_face_select_enable (const Scene *scene, BMesh *bm, BMFace *efa)
void uvedit_face_select_disable (const Scene *scene, BMesh *bm, BMFace *efa)
bool uvedit_edge_select_test_ex (const ToolSettings *ts, const BMesh *bm, const BMLoop *l, const BMUVOffsets &offsets)
bool uvedit_edge_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, const bool select, const BMUVOffsets &offsets)
static bool UNUSED_FUNCTION bm_loop_select_vert_check_internal (const Scene *scene, BMesh *bm, BMLoop *l)
static bool bm_loop_select_edge_check_internal (const Scene *scene, BMesh *bm, BMLoop *l)
void uvedit_edge_select_shared_vert (const Scene *scene, BMesh *bm, BMLoop *l, const bool select, const int sticky_flag, const BMUVOffsets &offsets)
void uvedit_edge_select_set_noflush (const Scene *scene, BMesh *bm, BMLoop *l, const bool select, const int sticky_flag, const BMUVOffsets &offsets)
void uvedit_edge_select_set (const Scene *scene, BMesh *bm, BMLoop *l, const bool select)
 Select UV Edge.
void uvedit_edge_select_enable (const Scene *scene, BMesh *bm, BMLoop *l)
void uvedit_edge_select_disable (const Scene *scene, BMesh *bm, BMLoop *l)
bool uvedit_uv_select_test_ex (const ToolSettings *ts, const BMesh *bm, const BMLoop *l, const BMUVOffsets &offsets)
bool uvedit_uv_select_test (const Scene *scene, const BMesh *bm, const BMLoop *l, const BMUVOffsets &offsets)
void uvedit_uv_select_set_with_sticky (const Scene *scene, BMesh *bm, BMLoop *l, const bool select, const BMUVOffsets &offsets)
void uvedit_uv_select_shared_vert (const Scene *scene, BMesh *bm, BMLoop *l, const bool select, const int sticky_flag, const BMUVOffsets &offsets)
void uvedit_uv_select_set (const Scene *scene, BMesh *bm, BMLoop *l, const bool select)
 Select UV Vertex.
void uvedit_uv_select_enable (const Scene *scene, BMesh *bm, BMLoop *l)
void uvedit_uv_select_disable (const Scene *scene, BMesh *bm, BMLoop *l)
static BMLoopuvedit_loop_find_other_radial_loop_with_visible_face (const Scene *scene, BMLoop *l_src, const BMUVOffsets &offsets)
static BMLoopuvedit_loop_find_other_boundary_loop_with_visible_face (const Scene *scene, BMLoop *l_edge, BMVert *v_pivot, const BMUVOffsets &offsets)
Low Level Selection API
bool uvedit_loop_vert_select_get (const ToolSettings *ts, const BMesh *bm, const BMLoop *l)
bool uvedit_loop_edge_select_get (const ToolSettings *ts, const BMesh *bm, const BMLoop *l)
void uvedit_loop_vert_select_set (const ToolSettings *ts, const BMesh *bm, BMLoop *l, const bool select)
void uvedit_loop_edge_select_set (const ToolSettings *ts, const BMesh *bm, BMLoop *l, const bool select)
Find Nearest Elements
UvNearestHit uv_nearest_hit_init_dist_px (const View2D *v2d, const float dist_px)
UvNearestHit uv_nearest_hit_init_max (const View2D *v2d)
UvNearestHit uv_nearest_hit_init_max_default ()
bool uv_find_nearest_edge (Scene *scene, Object *obedit, const float co[2], const float penalty, UvNearestHit *hit)
bool uv_find_nearest_edge_multi (Scene *scene, const Span< Object * > objects, const float co[2], const float penalty, UvNearestHit *hit)
bool uv_find_nearest_face_ex (Scene *scene, Object *obedit, const float co[2], UvNearestHit *hit, const bool only_in_face)
bool uv_find_nearest_face (Scene *scene, Object *obedit, const float co[2], UvNearestHit *hit)
bool uv_find_nearest_face_multi_ex (Scene *scene, const Span< Object * > objects, const float co[2], UvNearestHit *hit, const bool only_in_face)
bool uv_find_nearest_face_multi (Scene *scene, const Span< Object * > objects, const float co[2], UvNearestHit *hit)
static bool uv_nearest_between (const BMLoop *l, const float co[2], const int cd_loop_uv_offset)
bool uv_find_nearest_vert (Scene *scene, Object *obedit, float const co[2], const float penalty_dist, UvNearestHit *hit)
bool uv_find_nearest_vert_multi (Scene *scene, const Span< Object * > objects, float const co[2], const float penalty_dist, UvNearestHit *hit)
static bool uvedit_nearest_uv (const Scene *scene, Object *obedit, const float co[2], const float scale[2], const bool ignore_selected, float *dist_sq, float r_uv[2])
bool ED_uvedit_nearest_uv_multi (const View2D *v2d, const Scene *scene, const Span< Object * > objects, const float mval_fl[2], const bool ignore_selected, float *dist_sq, float r_uv[2])
Find Nearest to Element

These functions are quite specialized, useful when sync select is enabled and we want to pick an active UV vertex/edge from the active element which may have multiple UVs split out.

BMLoopuv_find_nearest_loop_from_vert (Scene *scene, Object *obedit, BMVert *v, const float co[2])
BMLoopuv_find_nearest_loop_from_edge (Scene *scene, Object *obedit, BMEdge *e, const float co[2])
Helper functions for UV selection.
static bool uvedit_select_pin_ok_or_report (const Scene *scene, ReportList *reports)
void uvedit_select_prepare_custom_data (const Scene *scene, BMesh *bm)
void uvedit_select_prepare_sync_select (const Scene *scene, BMesh *bm)
void uvedit_select_prepare_UNUSED (const Scene *scene, BMesh *bm)
bool uvedit_vert_is_edge_select_any_other (const ToolSettings *ts, const BMesh *bm, const BMLoop *l, const BMUVOffsets &offsets)
bool uvedit_edge_is_face_select_any_other (const ToolSettings *ts, const BMesh *bm, const BMLoop *l, const BMUVOffsets &offsets)
bool uvedit_vert_is_face_select_any_other (const ToolSettings *ts, const BMesh *bm, const BMLoop *l, const BMUVOffsets &offsets)
bool uvedit_vert_is_all_other_faces_selected (const ToolSettings *ts, const BMesh *bm, const BMLoop *l, const BMUVOffsets &offsets)
static void bm_clear_uv_vert_selection (const Scene *scene, BMesh *bm)
UV Selection Non-Sync API
Note
this is for non-sync selection, where different rules apply and there is no expectation a selected UV implies it's base mesh selection flag also be set.
bool uvedit_vert_select_get_no_sync (const ToolSettings *ts, const BMesh *bm, const BMLoop *l)
bool uvedit_edge_select_get_no_sync (const ToolSettings *ts, const BMesh *bm, const BMLoop *l)
bool uvedit_face_select_get_no_sync (const ToolSettings *ts, const BMesh *bm, const BMFace *f)
void uvedit_vert_select_set_no_sync (const ToolSettings *ts, const BMesh *bm, BMLoop *l, bool select)
void uvedit_edge_select_set_no_sync (const ToolSettings *ts, const BMesh *bm, BMLoop *l, bool select)
void uvedit_face_select_set_no_sync (const ToolSettings *ts, const BMesh *bm, BMFace *f, bool select)
UV Select-Mode Flushing
void ED_uvedit_selectmode_flush (const Scene *scene, BMesh *bm)
 UV Select Mode Flush.
UV Flush selection (up/down)
void uvedit_select_flush_from_verts (const Scene *scene, BMesh *bm, const bool select)
Face Loop Select
static int uv_select_faceloop (Scene *scene, Object *obedit, UvNearestHit *hit, const bool extend)
Edge Ring Select
static int uv_select_edgering (Scene *scene, Object *obedit, UvNearestHit *hit, const bool extend)
Select Linked
static void uv_select_linked_multi (const Scene *scene, const Span< Object * > objects, UvNearestHit *hit, const bool extend, bool deselect, const bool toggle, const bool select_faces, const char hflag)
static void uv_select_linked_multi_for_select_island (const Scene *scene, const Span< Object * > objects, Object *obedit, BMFace *efa, const bool deselect, const bool select_faces, const char hflag)
const floatuvedit_first_selected_uv_from_vertex (Scene *scene, const BMesh *bm, BMVert *eve, const BMUVOffsets &offsets)
Select More/Less Operator
static wmOperatorStatus uv_select_more_less (bContext *C, const bool select)
static wmOperatorStatus uv_select_more_exec (bContext *C, wmOperator *)
void UV_OT_select_more (wmOperatorType *ot)
static wmOperatorStatus uv_select_less_exec (bContext *C, wmOperator *)
void UV_OT_select_less (wmOperatorType *ot)
Mouse Select Operator
static bool uv_mouse_select_multi (bContext *C, const Span< Object * > objects, const float co[2], const SelectPick_Params &params)
static bool uv_mouse_select (bContext *C, const float co[2], const SelectPick_Params &params)
static wmOperatorStatus uv_select_exec (bContext *C, wmOperator *op)
static wmOperatorStatus uv_select_invoke (bContext *C, wmOperator *op, const wmEvent *event)
void UV_OT_select (wmOperatorType *ot)
Edge Loop Select Operator
static wmOperatorStatus uv_select_loop_exec (bContext *C, wmOperator *op)
static wmOperatorStatus uv_select_loop_invoke (bContext *C, wmOperator *op, const wmEvent *event)
void UV_OT_select_loop (wmOperatorType *ot)
Edge Ring Select Operator
static wmOperatorStatus uv_select_edge_ring_exec (bContext *C, wmOperator *op)
static wmOperatorStatus uv_select_edge_ring_invoke (bContext *C, wmOperator *op, const wmEvent *event)
void UV_OT_select_edge_ring (wmOperatorType *ot)
Select Linked Operator
static wmOperatorStatus uv_select_linked_internal (bContext *C, wmOperator *op, const wmEvent *event, bool pick)
static wmOperatorStatus uv_select_linked_exec (bContext *C, wmOperator *op)
void UV_OT_select_linked (wmOperatorType *ot)
Select Linked (Cursor Pick) Operator
static wmOperatorStatus uv_select_linked_pick_invoke (bContext *C, wmOperator *op, const wmEvent *event)
static wmOperatorStatus uv_select_linked_pick_exec (bContext *C, wmOperator *op)
void UV_OT_select_linked_pick (wmOperatorType *ot)
Select Split Operator
static wmOperatorStatus uv_select_split_exec (bContext *C, wmOperator *op)
void UV_OT_select_split (wmOperatorType *ot)
Box Select Operator
static wmOperatorStatus uv_box_select_invoke (bContext *C, wmOperator *op, const wmEvent *event)
static wmOperatorStatus uv_box_select_exec (bContext *C, wmOperator *op)
void UV_OT_select_box (wmOperatorType *ot)
Circle Select Operator
static bool uv_circle_select_is_point_inside (const float uv[2], const float offset[2], const float ellipse[2])
static bool uv_circle_select_is_edge_inside (const float uv_a[2], const float uv_b[2], const float offset[2], const float ellipse[2])
static wmOperatorStatus uv_circle_select_exec (bContext *C, wmOperator *op)
void UV_OT_select_circle (wmOperatorType *ot)
Lasso Select Operator
static bool do_lasso_select_mesh_uv_is_point_inside (const ARegion *region, const rcti *clip_rect, const Span< int2 > mcoords, const float co_test[2])
static bool do_lasso_select_mesh_uv_is_edge_inside (const ARegion *region, const rcti *clip_rect, const Span< int2 > mcoords, const float co_test_a[2], const float co_test_b[2])
static bool do_lasso_select_mesh_uv (bContext *C, const Span< int2 > mcoords, const eSelectOp sel_op)
static wmOperatorStatus uv_lasso_select_exec (bContext *C, wmOperator *op)
void UV_OT_select_lasso (wmOperatorType *ot)
Select Pinned UVs Operator
static wmOperatorStatus uv_select_pinned_exec (bContext *C, wmOperator *op)
void UV_OT_select_pinned (wmOperatorType *ot)
Select Overlap Operator
BLI_INLINE uint overlap_hash (const void *overlap_v)
BLI_INLINE bool overlap_cmp (const void *a_v, const void *b_v)
static bool overlap_tri_tri_uv_test (const float t1[3][2], const float t2[3][2], const float endpoint_bias)
static wmOperatorStatus uv_select_overlap (bContext *C, const bool extend)
static wmOperatorStatus uv_select_overlap_exec (bContext *C, wmOperator *op)
void UV_OT_select_overlap (wmOperatorType *ot)
Selected Elements as Arrays (Vertex, Edge & Faces)

These functions return single elements per connected vertex/edge. So an edge that has two connected edge loops only assigns one loop in the array.

BMFace ** ED_uvedit_selected_faces (const Scene *scene, BMesh *bm, int len_max, int *r_faces_len)
BMLoop ** ED_uvedit_selected_edges (const Scene *scene, BMesh *bm, int len_max, int *r_edges_len)
BMLoop ** ED_uvedit_selected_verts (const Scene *scene, BMesh *bm, int len_max, int *r_verts_len)
Select Mode UV Vert/Edge/Face/Island Operator
void ED_uvedit_selectmode_clean (const Scene *scene, Object *obedit)
 UV Select Mode set.
void ED_uvedit_selectmode_clean_multi (bContext *C)
void ED_uvedit_sticky_selectmode_update (bContext *C)
void ED_uvedit_select_sync_multi (bContext *C)
static wmOperatorStatus uv_select_mode_exec (bContext *C, wmOperator *op)
static wmOperatorStatus uv_select_mode_invoke (bContext *C, wmOperator *op, const wmEvent *)
void UV_OT_select_mode (wmOperatorType *ot)
static wmOperatorStatus uv_custom_region_set_exec (bContext *C, wmOperator *op)
void UV_OT_custom_region_set (wmOperatorType *ot)

Edge Loop Select

enum  eUVEdgeLoopBoundaryMode { UV_EDGE_LOOP_BOUNDARY_LOOP = 1 , UV_EDGE_LOOP_BOUNDARY_ALL = 2 }
static BMLoopbm_select_edgeloop_double_side_next (const Scene *scene, BMLoop *l_step, BMVert *v_from, const BMUVOffsets &offsets)
static BMLoopbm_select_edgeloop_single_side_next (const Scene *scene, BMLoop *l_step, BMVert *v_from, const BMUVOffsets &offsets)
static void bm_loop_tags_clear (BMesh *bm)
static void uv_select_edgeloop_double_side_tag (const Scene *scene, BMesh *bm, BMLoop *l_init_pair[2], const BMUVOffsets &offsets)
static void uv_select_edgeloop_single_side_tag (const Scene *scene, BMesh *bm, BMLoop *l_init, const BMUVOffsets &offsets, enum eUVEdgeLoopBoundaryMode boundary_mode, int r_count_by_select[2])
static int uv_select_edgeloop (Scene *scene, Object *obedit, UvNearestHit *hit, const bool extend)

Shared Edge Loop/Ring Select Operator Functions

enum  eUVLoopGenericType { UV_LOOP_SELECT = 1 , UV_RING_SELECT = 2 }
static wmOperatorStatus uv_mouse_select_loop_generic_multi (bContext *C, const Span< Object * > objects, const float co[2], const bool extend, enum eUVLoopGenericType loop_type)
static wmOperatorStatus uv_mouse_select_loop_generic (bContext *C, const float co[2], const bool extend, enum eUVLoopGenericType loop_type)

Select Similar Operator

static EnumPropertyItem uv_select_similar_type_items []
static EnumPropertyItem prop_similar_compare_types []
static float get_uv_vert_needle (const eUVSelectSimilar type, BMVert *vert, const float ob_m3[3][3], BMLoop *loop, const BMUVOffsets &offsets)
static float get_uv_edge_needle (const eUVSelectSimilar type, BMEdge *edge, const float ob_m3[3][3], BMLoop *loop_a, BMLoop *loop_b, const BMUVOffsets &offsets)
static float get_uv_face_needle (const eUVSelectSimilar type, BMFace *face, int ob_index, const float ob_m3[3][3], const BMUVOffsets &offsets)
static float get_uv_island_needle (const eUVSelectSimilar type, const FaceIsland *island, const float ob_m3[3][3], const BMUVOffsets &offsets)
static wmOperatorStatus uv_select_similar_vert_exec (bContext *C, wmOperator *op)
static wmOperatorStatus uv_select_similar_edge_exec (bContext *C, wmOperator *op)
static wmOperatorStatus uv_select_similar_face_exec (bContext *C, wmOperator *op)
static bool uv_island_selected (const Scene *scene, const BMesh *bm, FaceIsland *island)
static wmOperatorStatus uv_select_similar_island_exec (bContext *C, wmOperator *op)
static wmOperatorStatus uv_select_similar_exec (bContext *C, wmOperator *op)
static const EnumPropertyItemuv_select_similar_type_itemf (bContext *C, PointerRNA *, PropertyRNA *, bool *r_free)
void UV_OT_select_similar (wmOperatorType *ot)

Macro Definition Documentation

◆ CURR_FACE_IS_UNSEL

#define CURR_FACE_IS_UNSEL   2

Referenced by uv_select_more_less().

◆ NEIGHBORING_FACE_IS_SEL

#define NEIGHBORING_FACE_IS_SEL   1

Referenced by uv_select_more_less().

◆ SET_SELECTION

#define SET_SELECTION ( value)
Value:
if (select_faces) { \
if (hflag == BM_ELEM_SELECT) { \
BM_face_select_set(bm, efa, value); \
} \
else { \
BM_elem_flag_set(efa, hflag, value); \
} \
} \
else { \
uvedit_face_select_set(scene, bm, efa, value); \
} \
(void)0
@ BM_ELEM_SELECT
BMesh * bm

Referenced by uv_select_linked_multi().

Typedef Documentation

◆ int2

Definition at line 601 of file BLI_math_vector_types.hh.

Enumeration Type Documentation

◆ eUVEdgeLoopBoundaryMode

Mode for selecting edge loops at boundaries.

Enumerator
UV_EDGE_LOOP_BOUNDARY_LOOP 

Delimit at face corners (don't walk over multiple edges in the same face).

UV_EDGE_LOOP_BOUNDARY_ALL 

Don't delimit, walk over the all connected boundary loops.

Definition at line 2047 of file uvedit_select.cc.

◆ eUVLoopGenericType

Enumerator
UV_LOOP_SELECT 
UV_RING_SELECT 

Definition at line 3682 of file uvedit_select.cc.

◆ eUVSelectSimilar

Enumerator
UV_SSIM_AREA_UV 
UV_SSIM_AREA_3D 
UV_SSIM_FACE 
UV_SSIM_LENGTH_UV 
UV_SSIM_LENGTH_3D 
UV_SSIM_MATERIAL 
UV_SSIM_OBJECT 
UV_SSIM_PIN 
UV_SSIM_SIDES 
UV_SSIM_WINDING 

Definition at line 85 of file uvedit_select.cc.

Function Documentation

◆ bm_clear_uv_vert_selection()

void bm_clear_uv_vert_selection ( const Scene * scene,
BMesh * bm )
static

◆ bm_loop_select_edge_check_internal()

◆ bm_loop_select_vert_check_internal()

◆ bm_loop_tags_clear()

◆ bm_select_edgeloop_double_side_next()

BMLoop * bm_select_edgeloop_double_side_next ( const Scene * scene,
BMLoop * l_step,
BMVert * v_from,
const BMUVOffsets & offsets )
static

◆ bm_select_edgeloop_single_side_next()

BMLoop * bm_select_edgeloop_single_side_next ( const Scene * scene,
BMLoop * l_step,
BMVert * v_from,
const BMUVOffsets & offsets )
static

◆ do_lasso_select_mesh_uv()

bool do_lasso_select_mesh_uv ( bContext * C,
const Span< int2 > mcoords,
const eSelectOp sel_op )
static

Definition at line 5106 of file uvedit_select.cc.

References BKE_editmesh_from_object(), BKE_view_layer_array_from_objects_in_edit_mode_unique_data_with_uvs(), BLI_assert, BLI_lasso_boundbox(), bm, BMEditMesh::bm, BM_ELEM_CD_GET_FLOAT_P, BM_elem_flag_disable, BM_elem_flag_enable, BM_elem_flag_test, BM_ELEM_SELECT, BM_ELEM_TAG, BM_FACE, BM_FACE_FIRST_LOOP, BM_face_uv_calc_center_median(), BM_FACES_OF_MESH, BM_ITER_ELEM, BM_ITER_MESH, BM_LOOPS_OF_FACE, BM_mesh_elem_hflag_disable_all(), BM_uv_map_offsets_get(), BM_VERT, C, CTX_data_ensure_evaluated_depsgraph(), CTX_data_scene(), CTX_data_view_layer(), CTX_wm_region(), depsgraph, do_lasso_select_mesh_uv_is_edge_inside(), do_lasso_select_mesh_uv_is_point_inside(), ED_uvedit_select_island_check(), ED_uvedit_select_mode_get(), ED_uvedit_select_sync_flush(), ED_uvedit_selectmode_flush(), l, BMLoop::prev, SEL_DESELECT, SEL_OP_SUB, SEL_OP_USE_PRE_DESELECT, select, Scene::toolsettings, BMUVOffsets::uv, ToolSettings::uv_flag, UV_FLAG_SELECT_SYNC, uv_select_all_perform_multi(), UV_SELECT_EDGE, UV_SELECT_FACE, uv_select_flush_from_tag_face(), uv_select_linked_multi_for_select_island(), uv_select_tag_update_for_object(), UV_SELECT_VERT, ToolSettings::uv_sticky, UV_STICKY_VERT, uvedit_edge_select_set_with_sticky(), uvedit_face_select_test(), uvedit_face_visible_test(), uvedit_select_prepare_custom_data(), uvedit_select_prepare_sync_select(), uvedit_uv_select_set(), uvedit_uv_select_test(), and uvedit_vertex_select_tagged().

Referenced by uv_lasso_select_exec().

◆ do_lasso_select_mesh_uv_is_edge_inside()

bool do_lasso_select_mesh_uv_is_edge_inside ( const ARegion * region,
const rcti * clip_rect,
const Span< int2 > mcoords,
const float co_test_a[2],
const float co_test_b[2] )
static

◆ do_lasso_select_mesh_uv_is_point_inside()

bool do_lasso_select_mesh_uv_is_point_inside ( const ARegion * region,
const rcti * clip_rect,
const Span< int2 > mcoords,
const float co_test[2] )
static

◆ ED_uvedit_active_edge_loop_get()

◆ ED_uvedit_active_edge_loop_set()

void ED_uvedit_active_edge_loop_set ( BMesh * bm,
BMLoop * l )

◆ ED_uvedit_active_vert_loop_get()

◆ ED_uvedit_active_vert_loop_set()

void ED_uvedit_active_vert_loop_set ( BMesh * bm,
BMLoop * l )

◆ ED_uvedit_deselect_all()

◆ ED_uvedit_nearest_uv_multi()

bool ED_uvedit_nearest_uv_multi ( const View2D * v2d,
const Scene * scene,
const Span< Object * > objects,
const float mval_fl[2],
const bool ignore_selected,
float * dist_sq,
float r_uv[2] )

◆ ED_uvedit_select_island_check()

◆ ED_uvedit_select_mode_get()

◆ ED_uvedit_select_sync_flush()

◆ ED_uvedit_select_sync_multi()

void ED_uvedit_select_sync_multi ( bContext * C)

◆ ED_uvedit_selected_edges()

◆ ED_uvedit_selected_faces()

BMFace ** ED_uvedit_selected_faces ( const Scene * scene,
BMesh * bm,
int len_max,
int * r_faces_len )

◆ ED_uvedit_selected_verts()

◆ ED_uvedit_selectmode_clean()

◆ ED_uvedit_selectmode_clean_multi()

◆ ED_uvedit_selectmode_flush()

◆ ED_uvedit_sticky_selectmode_update()

◆ ED_uvedit_sync_uvselect_ensure_if_needed()

void ED_uvedit_sync_uvselect_ensure_if_needed ( const ToolSettings * ts,
BMesh * bm )

◆ ED_uvedit_sync_uvselect_ignore()

◆ ED_uvedit_sync_uvselect_is_valid_or_ignore()

bool ED_uvedit_sync_uvselect_is_valid_or_ignore ( const ToolSettings * ts,
const BMesh * bm )

◆ get_uv_edge_needle()

◆ get_uv_face_needle()

◆ get_uv_island_needle()

◆ get_uv_vert_needle()

◆ overlap_cmp()

BLI_INLINE bool overlap_cmp ( const void * a_v,
const void * b_v )

Definition at line 5431 of file uvedit_select.cc.

References b, BLI_INLINE, BVHTreeOverlap::indexA, and BVHTreeOverlap::indexB.

Referenced by py_bvhtree_overlap(), and uv_select_overlap().

◆ overlap_hash()

BLI_INLINE uint overlap_hash ( const void * overlap_v)

◆ overlap_tri_tri_uv_test()

bool overlap_tri_tri_uv_test ( const float t1[3][2],
const float t2[3][2],
const float endpoint_bias )
static

Specialized 2D triangle intersection for detecting UV overlap:

Returns
  • false when single corners or edges touch (common for UV coordinates).
  • true when all corners touch (an exactly overlapping triangle).

Definition at line 5452 of file uvedit_select.cc.

References isect_point_tri_v2(), isect_seg_seg_v2_point_ex(), mid_v2_v2v2v2(), and UNPACK3.

Referenced by uv_select_overlap().

◆ uv_box_select_exec()

wmOperatorStatus uv_box_select_exec ( bContext * C,
wmOperator * op )
static

Definition at line 4601 of file uvedit_select.cc.

References BKE_editmesh_from_object(), BKE_view_layer_array_from_objects_in_edit_mode_unique_data_with_uvs(), BLI_assert, BLI_rctf_isect_pt_v(), BLI_rctf_isect_segment(), bm, BMEditMesh::bm, BM_ELEM_CD_GET_BOOL, BM_ELEM_CD_GET_FLOAT_P, BM_elem_flag_disable, BM_elem_flag_enable, BM_elem_flag_test, BM_ELEM_SELECT, BM_ELEM_TAG, BM_FACE, BM_FACE_FIRST_LOOP, BM_face_uv_calc_center_median(), BM_FACES_OF_MESH, BM_ITER_ELEM, BM_ITER_MESH, BM_LOOPS_OF_FACE, BM_mesh_elem_hflag_disable_all(), BM_uv_map_offsets_get(), BM_VERT, C, CTX_data_ensure_evaluated_depsgraph(), CTX_data_scene(), CTX_data_view_layer(), CTX_wm_region(), depsgraph, ED_uvedit_select_island_check(), ED_uvedit_select_mode_get(), ED_uvedit_select_sync_flush(), ED_uvedit_selectmode_flush(), false, l, OPERATOR_CANCELLED, OPERATOR_FINISHED, BMUVOffsets::pin, BMLoop::prev, wmOperator::ptr, wmOperator::reports, RNA_boolean_get(), RNA_enum_get(), SEL_DESELECT, SEL_OP_SUB, SEL_OP_USE_PRE_DESELECT, select, Scene::toolsettings, UI_view2d_region_to_view_rctf(), BMUVOffsets::uv, ToolSettings::uv_flag, UV_FLAG_SELECT_SYNC, uv_select_all_perform_multi(), UV_SELECT_EDGE, UV_SELECT_FACE, uv_select_flush_from_tag_face(), uv_select_linked_multi_for_select_island(), uv_select_tag_update_for_object(), UV_SELECT_VERT, ToolSettings::uv_sticky, UV_STICKY_VERT, uvedit_edge_select_set_with_sticky(), uvedit_face_visible_test(), uvedit_select_pin_ok_or_report(), uvedit_select_prepare_custom_data(), uvedit_select_prepare_sync_select(), uvedit_uv_select_set(), uvedit_uv_select_test(), uvedit_vertex_select_tagged(), ARegion::v2d, and WM_operator_properties_border_to_rctf().

Referenced by UV_OT_select_box().

◆ uv_box_select_invoke()

◆ uv_circle_select_exec()

wmOperatorStatus uv_circle_select_exec ( bContext * C,
wmOperator * op )
static

Definition at line 4866 of file uvedit_select.cc.

References BKE_editmesh_from_object(), BKE_view_layer_array_from_objects_in_edit_mode_unique_data_with_uvs(), BLI_assert, bm, BMEditMesh::bm, BM_ELEM_CD_GET_FLOAT_P, BM_elem_flag_disable, BM_elem_flag_enable, BM_elem_flag_test, BM_ELEM_SELECT, BM_ELEM_TAG, BM_FACE, BM_FACE_FIRST_LOOP, BM_face_uv_calc_center_median(), BM_FACES_OF_MESH, BM_ITER_ELEM, BM_ITER_MESH, BM_LOOPS_OF_FACE, BM_mesh_elem_hflag_disable_all(), BM_uv_map_offsets_get(), BM_VERT, C, CTX_data_ensure_evaluated_depsgraph(), CTX_data_scene(), CTX_data_view_layer(), CTX_wm_region(), CTX_wm_space_image(), wmOperator::customdata, depsgraph, ED_select_op_modal(), ED_space_image_get_size(), ED_space_image_get_zoom(), ED_uvedit_select_island_check(), ED_uvedit_select_mode_get(), ED_uvedit_select_sync_flush(), ED_uvedit_selectmode_flush(), l, OPERATOR_CANCELLED, OPERATOR_FINISHED, BMLoop::prev, wmOperator::ptr, RNA_enum_get(), RNA_int_get(), SEL_DESELECT, SEL_OP_SUB, SEL_OP_USE_PRE_DESELECT, select, Scene::toolsettings, UI_view2d_region_to_view(), BMUVOffsets::uv, uv_circle_select_is_edge_inside(), uv_circle_select_is_point_inside(), ToolSettings::uv_flag, UV_FLAG_SELECT_SYNC, uv_select_all_perform_multi(), UV_SELECT_EDGE, UV_SELECT_FACE, uv_select_flush_from_tag_face(), uv_select_linked_multi_for_select_island(), uv_select_tag_update_for_object(), UV_SELECT_VERT, ToolSettings::uv_sticky, UV_STICKY_VERT, uvedit_edge_select_set_with_sticky(), uvedit_face_select_test(), uvedit_face_visible_test(), uvedit_select_prepare_custom_data(), uvedit_select_prepare_sync_select(), uvedit_uv_select_set(), uvedit_uv_select_test(), uvedit_vertex_select_tagged(), ARegion::v2d, WM_gesture_is_modal_first(), x, and y.

Referenced by UV_OT_select_circle().

◆ uv_circle_select_is_edge_inside()

bool uv_circle_select_is_edge_inside ( const float uv_a[2],
const float uv_b[2],
const float offset[2],
const float ellipse[2] )
static

Definition at line 4848 of file uvedit_select.cc.

References dist_squared_to_line_segment_v2().

Referenced by uv_circle_select_exec().

◆ uv_circle_select_is_point_inside()

bool uv_circle_select_is_point_inside ( const float uv[2],
const float offset[2],
const float ellipse[2] )
static

Definition at line 4836 of file uvedit_select.cc.

References len_squared_v2().

Referenced by uv_circle_select_exec().

◆ uv_custom_region_set_exec()

◆ uv_find_nearest_edge()

◆ uv_find_nearest_edge_multi()

bool uv_find_nearest_edge_multi ( Scene * scene,
const Span< Object * > objects,
const float co[2],
const float penalty,
UvNearestHit * hit )

Definition at line 1288 of file uvedit_select.cc.

References uv_find_nearest_edge().

◆ uv_find_nearest_face()

bool uv_find_nearest_face ( Scene * scene,
Object * obedit,
const float co[2],
UvNearestHit * hit )

Definition at line 1346 of file uvedit_select.cc.

References uv_find_nearest_face_ex().

◆ uv_find_nearest_face_ex()

bool uv_find_nearest_face_ex ( Scene * scene,
Object * obedit,
const float co[2],
UvNearestHit * hit,
bool only_in_face )
Parameters
only_in_facewhen true, only hit faces which co is inside. This gives users a result they might expect, especially when zoomed in.
Note
Concave faces can cause odd behavior, although in practice this isn't often an issue. The center can be outside the face, in this case the distance to the center could cause the face to be considered too far away. If this becomes an issue we could track the distance to the faces closest edge.

Definition at line 1303 of file uvedit_select.cc.

References BKE_editmesh_from_object(), BLI_assert, bm, BMEditMesh::bm, BM_face_uv_calc_center_median(), BM_face_uv_point_inside_test(), BM_FACES_OF_MESH, BM_ITER_MESH, CD_PROP_FLOAT2, CustomData_get_offset(), UvNearestHit::dist_sq, UvNearestHit::efa, len_squared_v2(), mul_v2_v2(), UvNearestHit::ob, UvNearestHit::scale, sub_v2_v2v2(), and uvedit_face_visible_test().

Referenced by uv_find_nearest_face(), and uv_find_nearest_face_multi_ex().

◆ uv_find_nearest_face_multi()

bool uv_find_nearest_face_multi ( Scene * scene,
const Span< Object * > objects,
const float co[2],
UvNearestHit * hit )

Definition at line 1366 of file uvedit_select.cc.

References uv_find_nearest_face_multi_ex().

◆ uv_find_nearest_face_multi_ex()

bool uv_find_nearest_face_multi_ex ( Scene * scene,
const Span< Object * > objects,
const float co[2],
UvNearestHit * hit,
const bool only_in_face )

Definition at line 1351 of file uvedit_select.cc.

References uv_find_nearest_face_ex().

Referenced by uv_find_nearest_face_multi().

◆ uv_find_nearest_loop_from_edge()

◆ uv_find_nearest_loop_from_vert()

◆ uv_find_nearest_vert()

◆ uv_find_nearest_vert_multi()

bool uv_find_nearest_vert_multi ( Scene * scene,
const Span< Object * > objects,
float const co[2],
const float penalty_dist,
UvNearestHit * hit )

Definition at line 1443 of file uvedit_select.cc.

References uv_find_nearest_vert().

◆ uv_island_selected()

bool uv_island_selected ( const Scene * scene,
const BMesh * bm,
FaceIsland * island )
static

◆ uv_lasso_select_exec()

◆ uv_mouse_select()

bool uv_mouse_select ( bContext * C,
const float co[2],
const SelectPick_Params & params )
static

◆ uv_mouse_select_loop_generic()

wmOperatorStatus uv_mouse_select_loop_generic ( bContext * C,
const float co[2],
const bool extend,
enum eUVLoopGenericType loop_type )
static

◆ uv_mouse_select_loop_generic_multi()

◆ uv_mouse_select_multi()

bool uv_mouse_select_multi ( bContext * C,
const Span< Object * > objects,
const float co[2],
const SelectPick_Params & params )
static

Definition at line 3329 of file uvedit_select.cc.

References BKE_editmesh_from_object(), BLI_assert, BLI_assert_unreachable, bm, BMEditMesh::bm, BM_elem_flag_test, BM_ELEM_SELECT, BM_mesh_active_face_set(), BM_mesh_select_mode_flush(), BM_mesh_uvselect_mode_flush(), BM_mesh_uvselect_sync_to_mesh(), BM_select_history_store, BM_select_history_validate(), BM_uv_map_offsets_get(), C, CTX_data_ensure_evaluated_depsgraph(), CTX_data_scene(), CTX_wm_region(), depsgraph, UvNearestHit::dist_sq, BMLoop::e, ED_uvedit_active_edge_loop_set(), ED_uvedit_active_vert_loop_set(), ED_uvedit_select_island_check(), ED_uvedit_selectmode_flush(), UvNearestHit::efa, ELEM, FLT_MAX, UvNearestHit::l, UvNearestHit::ob, params, SCE_SELECT_EDGE, SCE_SELECT_FACE, SEL_DESELECT, SEL_OP_ADD, SEL_OP_AND, SEL_OP_SET, SEL_OP_SUB, SEL_OP_XOR, ToolSettings::selectmode, Scene::toolsettings, U, uv_find_nearest_edge_multi(), uv_find_nearest_face_multi(), uv_find_nearest_face_multi_ex(), uv_find_nearest_vert_multi(), ToolSettings::uv_flag, UV_FLAG_SELECT_SYNC, uv_nearest_hit_init_dist_px(), uv_nearest_hit_init_max_default(), uv_select_all_perform_multi(), UV_SELECT_EDGE, UV_SELECT_FACE, uv_select_linked_multi(), uv_select_tag_update_for_object(), UV_SELECT_VERT, ToolSettings::uv_selectmode, ToolSettings::uv_sticky, UV_STICKY_DISABLE, uvedit_edge_select_set_with_sticky(), uvedit_edge_select_test(), uvedit_face_select_set_with_sticky(), uvedit_face_select_test(), uvedit_select_prepare_custom_data(), uvedit_select_prepare_sync_select(), uvedit_uv_select_set_with_sticky(), uvedit_uv_select_test(), BMLoop::v, and ARegion::v2d.

Referenced by uv_mouse_select().

◆ uv_nearest_between()

bool uv_nearest_between ( const BMLoop * l,
const float co[2],
const int cd_loop_uv_offset )
static

Definition at line 1374 of file uvedit_select.cc.

References BM_ELEM_CD_GET_FLOAT_P, l, and line_point_side_v2().

Referenced by uv_find_nearest_vert().

◆ uv_nearest_hit_init_dist_px()

UvNearestHit uv_nearest_hit_init_dist_px ( const View2D * v2d,
const float dist_px )

◆ uv_nearest_hit_init_max()

◆ uv_nearest_hit_init_max_default()

UvNearestHit uv_nearest_hit_init_max_default ( )

◆ UV_OT_custom_region_set()

◆ UV_OT_select()

◆ UV_OT_select_all()

◆ UV_OT_select_box()

◆ UV_OT_select_circle()

◆ UV_OT_select_edge_ring()

◆ UV_OT_select_lasso()

◆ UV_OT_select_less()

void UV_OT_select_less ( wmOperatorType * ot)

◆ UV_OT_select_linked()

void UV_OT_select_linked ( wmOperatorType * ot)

◆ UV_OT_select_linked_pick()

◆ UV_OT_select_loop()

◆ UV_OT_select_mode()

◆ UV_OT_select_more()

void UV_OT_select_more ( wmOperatorType * ot)

◆ UV_OT_select_overlap()

void UV_OT_select_overlap ( wmOperatorType * ot)

◆ UV_OT_select_pinned()

void UV_OT_select_pinned ( wmOperatorType * ot)

◆ UV_OT_select_similar()

◆ UV_OT_select_split()

void UV_OT_select_split ( wmOperatorType * ot)

◆ uv_select_all()

◆ uv_select_all_exec()

◆ uv_select_all_perform_multi()

void uv_select_all_perform_multi ( const Scene * scene,
Span< Object * > objects,
int action )
static

◆ uv_select_all_perform_multi_ex() [1/2]

void uv_select_all_perform_multi_ex ( const Scene * scene,
const Span< Object * > objects,
int action,
const Object * ob_exclude )
static

◆ uv_select_all_perform_multi_ex() [2/2]

void uv_select_all_perform_multi_ex ( const Scene * scene,
Span< Object * > objects,
int action,
const Object * ob_exclude )
static

◆ uv_select_edge_ring_exec()

◆ uv_select_edge_ring_invoke()

◆ uv_select_edgeloop()

◆ uv_select_edgeloop_double_side_tag()

void uv_select_edgeloop_double_side_tag ( const Scene * scene,
BMesh * bm,
BMLoop * l_init_pair[2],
const BMUVOffsets & offsets )
static

◆ uv_select_edgeloop_single_side_tag()

void uv_select_edgeloop_single_side_tag ( const Scene * scene,
BMesh * bm,
BMLoop * l_init,
const BMUVOffsets & offsets,
enum eUVEdgeLoopBoundaryMode boundary_mode,
int r_count_by_select[2] )
static

Tag all loops which should be selected, the caller must select.

Parameters
r_count_by_selectCount the number of unselected and selected loops, this is needed to implement cycling between eUVEdgeLoopBoundaryMode.

Definition at line 2149 of file uvedit_select.cc.

References bm, BM_edge_other_vert(), BM_elem_flag_disable, BM_elem_flag_enable, BM_elem_flag_test, BM_ELEM_TAG, bm_loop_tags_clear(), bm_select_edgeloop_single_side_next(), BMLoop::e, BMLoop::f, UV_EDGE_LOOP_BOUNDARY_LOOP, uvedit_edge_select_test(), uvedit_face_visible_test(), uvedit_loop_find_other_radial_loop_with_visible_face(), BMEdge::v1, and BMEdge::v2.

Referenced by uv_select_edgeloop().

◆ uv_select_edgering()

◆ uv_select_exec()

◆ uv_select_faceloop()

◆ uv_select_flush_from_loop_edge_flag()

void uv_select_flush_from_loop_edge_flag ( const Scene * scene,
BMesh * bm )
static

Flush the selection from UV edges based on sticky modes.

Useful when performing edge selections in different sticky modes, since setting the required edge selection is done manually or using uvedit_edge_select_set_noflush, but dealing with sticky modes for vertex selections is best done in a separate function.

Note
Current behavior is selecting only; deselecting can be added but the behavior isn't required anywhere.

Definition at line 4512 of file uvedit_select.cc.

References bm, bm_clear_uv_vert_selection(), BM_FACES_OF_MESH, BM_ITER_ELEM, BM_ITER_MESH, BM_LOOPS_OF_FACE, BM_mesh_uvselect_flush_from_loop_edges(), BM_uv_map_offsets_get(), l, Scene::toolsettings, ToolSettings::uv_flag, UV_FLAG_SELECT_SYNC, ToolSettings::uv_sticky, UV_STICKY_DISABLE, UV_STICKY_VERT, uvedit_edge_select_get_no_sync(), uvedit_face_select_set_no_sync(), uvedit_face_visible_test(), uvedit_select_prepare_custom_data(), uvedit_select_prepare_sync_select(), uvedit_uv_select_flush_from_tag_sticky_loc_internal(), and uvedit_vert_select_set_no_sync().

Referenced by ED_uvedit_selectmode_clean(), and uv_select_invert().

◆ uv_select_flush_from_tag_face()

void uv_select_flush_from_tag_face ( const Scene * scene,
Object * obedit,
const bool select )
static

◆ uv_select_flush_from_tag_loop()

void uv_select_flush_from_tag_loop ( const Scene * scene,
Object * obedit,
const bool select )
static

Flush the selection from loop tags based on sticky and selection modes.

needed because setting the selection of a face is done in a number of places but it also needs to respect the sticky modes for the UV verts, so dealing with the sticky modes is best done in a separate function.

Note
This function is very similar to uv_select_flush_from_tag_face, be sure to update both upon changing.

Definition at line 4383 of file uvedit_select.cc.

References BKE_editmesh_from_object(), bm, BMEditMesh::bm, BM_elem_flag_enable, BM_elem_flag_test, BM_ELEM_TAG, BM_face_uvselect_set_noflush(), BM_FACES_OF_MESH, BM_ITER_ELEM, BM_ITER_MESH, BM_LOOPS_OF_FACE, BM_mesh_elem_hflag_disable_all(), BM_uv_map_offsets_get(), BM_VERT, l, select, Scene::toolsettings, ToolSettings::uv_flag, UV_FLAG_SELECT_SYNC, ToolSettings::uv_sticky, UV_STICKY_LOCATION, UV_STICKY_VERT, uvedit_face_select_set_no_sync(), uvedit_face_visible_test(), uvedit_select_prepare_custom_data(), uvedit_select_prepare_sync_select(), uvedit_uv_select_flush_from_tag_sticky_loc_internal(), and uvedit_uv_select_set().

Referenced by ED_uvedit_selectmode_clean(), and uv_select_more_less().

◆ uv_select_invert()

◆ uv_select_invoke()

◆ uv_select_less_exec()

wmOperatorStatus uv_select_less_exec ( bContext * C,
wmOperator *  )
static

Definition at line 2988 of file uvedit_select.cc.

References C, and uv_select_more_less().

Referenced by UV_OT_select_less().

◆ uv_select_linked_exec()

wmOperatorStatus uv_select_linked_exec ( bContext * C,
wmOperator * op )
static

Definition at line 3972 of file uvedit_select.cc.

References C, and uv_select_linked_internal().

Referenced by UV_OT_select_linked().

◆ uv_select_linked_internal()

◆ uv_select_linked_multi()

void uv_select_linked_multi ( const Scene * scene,
const Span< Object * > objects,
UvNearestHit * hit,
const bool extend,
bool deselect,
const bool toggle,
const bool select_faces,
const char hflag )
static

◆ uv_select_linked_multi_for_select_island()

void uv_select_linked_multi_for_select_island ( const Scene * scene,
const Span< Object * > objects,
Object * obedit,
BMFace * efa,
const bool deselect,
const bool select_faces,
const char hflag )
static

A wrapper for uv_select_linked_multi that uses defaults for UV island selection.

Definition at line 2766 of file uvedit_select.cc.

References UvNearestHit::efa, UvNearestHit::ob, and uv_select_linked_multi().

Referenced by do_lasso_select_mesh_uv(), uv_box_select_exec(), and uv_circle_select_exec().

◆ uv_select_linked_pick_exec()

wmOperatorStatus uv_select_linked_pick_exec ( bContext * C,
wmOperator * op )
static

Definition at line 4005 of file uvedit_select.cc.

References C, and uv_select_linked_internal().

Referenced by UV_OT_select_linked_pick().

◆ uv_select_linked_pick_invoke()

wmOperatorStatus uv_select_linked_pick_invoke ( bContext * C,
wmOperator * op,
const wmEvent * event )
static

Definition at line 3998 of file uvedit_select.cc.

References C, and uv_select_linked_internal().

Referenced by UV_OT_select_linked_pick().

◆ uv_select_loop_exec()

◆ uv_select_loop_invoke()

◆ uv_select_mode_exec()

◆ uv_select_mode_invoke()

◆ uv_select_more_exec()

wmOperatorStatus uv_select_more_exec ( bContext * C,
wmOperator *  )
static

Definition at line 2970 of file uvedit_select.cc.

References C, and uv_select_more_less().

Referenced by UV_OT_select_more().

◆ uv_select_more_less()

◆ uv_select_overlap()

wmOperatorStatus uv_select_overlap ( bContext * C,
const bool extend )
static

Definition at line 5491 of file uvedit_select.cc.

References BKE_editmesh_from_object(), BKE_view_layer_array_from_objects_in_edit_mode_unique_data_with_uvs(), BLI_assert, BLI_bvhtree_balance(), BLI_bvhtree_free(), BLI_bvhtree_insert(), BLI_bvhtree_new(), BLI_bvhtree_overlap_self(), BLI_gset_add(), BLI_gset_free(), BLI_gset_new_ex(), BLI_heap_clear(), BLI_heap_free(), BLI_heap_new_ex(), BLI_memarena_clear(), BLI_memarena_free(), BLI_memarena_new(), BLI_MEMARENA_STD_BUFSIZE, BLI_POLYFILL_ALLOC_NGON_RESERVE, BLI_polyfill_beautify(), BLI_polyfill_calc_arena(), bm, BMEditMesh::bm, BM_ELEM_CD_GET_FLOAT_P, BM_elem_flag_enable, BM_ELEM_TAG, BM_FACE, BM_FACES_OF_MESH, BM_ITER_ELEM_INDEX, BM_ITER_MESH, BM_ITER_MESH_INDEX, BM_LOOPS_OF_FACE, BM_mesh_elem_hflag_disable_all(), BM_mesh_elem_index_ensure(), BM_mesh_elem_table_ensure(), BM_VERT, C, CD_PROP_FLOAT2, copy_v2_v2(), CTX_data_ensure_evaluated_depsgraph(), CTX_data_scene(), CTX_data_view_layer(), CustomData_get_offset(), depsgraph, ED_uvedit_deselect_all(), ED_uvedit_select_sync_flush(), ED_uvedit_selectmode_flush(), UVOverlapData::face_index, float, BMesh::ftable, i, blender::Vector< T, InlineBufferCapacity, Allocator >::index_range(), BVHTreeOverlap::indexA, indices, l, BMFace::len, MEM_freeN(), MEM_malloc_arrayN(), MEM_mallocN(), UVOverlapData::ob_index, OPERATOR_FINISHED, overlap_cmp(), overlap_hash(), overlap_tri_tri_uv_test(), SEL_DESELECT, select, blender::Vector< T, InlineBufferCapacity, Allocator >::size(), Scene::toolsettings, UVOverlapData::tri, UNPACK2, ToolSettings::uv_flag, UV_FLAG_SELECT_SYNC, uv_select_flush_from_tag_face(), uv_select_tag_update_for_object(), uvedit_face_select_test(), uvedit_face_visible_test_ex(), uvedit_select_prepare_custom_data(), and uvedit_select_prepare_sync_select().

Referenced by uv_select_overlap_exec().

◆ uv_select_overlap_exec()

wmOperatorStatus uv_select_overlap_exec ( bContext * C,
wmOperator * op )
static

Definition at line 5709 of file uvedit_select.cc.

References C, wmOperator::ptr, RNA_boolean_get(), and uv_select_overlap().

Referenced by UV_OT_select_overlap().

◆ uv_select_pinned_exec()

◆ uv_select_similar_edge_exec()

◆ uv_select_similar_exec()

◆ uv_select_similar_face_exec()

◆ uv_select_similar_island_exec()

◆ uv_select_similar_type_itemf()

◆ uv_select_similar_vert_exec()

◆ uv_select_split_exec()

◆ uv_select_sync_update()

void uv_select_sync_update ( const Scene * scene,
Object * obedit )
static

Called when the user disables select sync.

Note
This isn't fool proof: it's always possible for an object to be linked in from another scene. Nevertheless, validate the selection in the current context as failing to do so allows edges to be selected in face-select mode or use stale UV selection data which hasn't been flushed between verts/edges/faces, see #148249.

Definition at line 4182 of file uvedit_select.cc.

References BKE_editmesh_from_object(), bm, BMEditMesh::bm, BM_mesh_uvselect_clear(), BM_mesh_uvselect_mode_flush_update(), CD_PROP_FLOAT2, CustomData_get_offset(), Scene::toolsettings, ToolSettings::uv_flag, UV_FLAG_SELECT_SYNC, ToolSettings::uv_selectmode, and uvedit_sync_uvselect_flush_from_v3d().

Referenced by ED_uvedit_select_sync_multi().

◆ uv_select_tag_update_for_object()

◆ uv_select_toggle_all()

void uv_select_toggle_all ( const Scene * scene,
BMEditMesh * em )
static

◆ uvedit_edge_is_face_select_any_other()

bool uvedit_edge_is_face_select_any_other ( const ToolSettings * ts,
const BMesh * bm,
const BMLoop * l,
const BMUVOffsets & offsets )

◆ uvedit_edge_select_disable()

◆ uvedit_edge_select_enable()

◆ uvedit_edge_select_flush_from_tag_sticky_loc_internal()

void uvedit_edge_select_flush_from_tag_sticky_loc_internal ( const Scene * scene,
BMesh * bm,
BMLoop * l,
const bool select,
const BMUVOffsets & offsets )
static

◆ uvedit_edge_select_get_no_sync()

◆ uvedit_edge_select_set()

void uvedit_edge_select_set ( const Scene * scene,
BMesh * bm,
BMLoop * l,
bool select )

Select UV Edge.

Changes selection state of a single UV Edge.

Definition at line 787 of file uvedit_select.cc.

References bm, l, select, uvedit_edge_select_disable(), and uvedit_edge_select_enable().

Referenced by uv_select_similar_edge_exec(), uvedit_edge_select_flush_from_tag_sticky_loc_internal(), and uvedit_edge_select_set_with_sticky().

◆ uvedit_edge_select_set_no_sync()

◆ uvedit_edge_select_set_noflush()

void uvedit_edge_select_set_noflush ( const Scene * scene,
BMesh * bm,
BMLoop * l,
const bool select,
const int sticky_flag,
const BMUVOffsets & offsets )

◆ uvedit_edge_select_set_with_sticky()

◆ uvedit_edge_select_shared_vert()

void uvedit_edge_select_shared_vert ( const Scene * scene,
BMesh * bm,
BMLoop * l,
const bool select,
const int sticky_flag,
const BMUVOffsets & offsets )

Selects UV edges and shared vertices according to sticky_flag.

Parameters
sticky_flag
  • UV_STICKY_LOCATION: selects all UV edges that share the same mesh vertices and UV coords.
  • UV_STICKY_VERT: selects all UV edges sharing the same mesh vertices.

Definition at line 727 of file uvedit_select.cc.

References BLI_assert, bm, bm_loop_select_edge_check_internal(), ELEM, l, BMLoop::next, BMLoop::radial_next, select, Scene::toolsettings, UV_STICKY_LOCATION, UV_STICKY_VERT, uvedit_edge_select_set_noflush(), uvedit_uv_select_shared_vert(), and uvedit_vert_is_edge_select_any_other().

Referenced by uvedit_edge_select_set_with_sticky().

◆ uvedit_edge_select_test()

◆ uvedit_edge_select_test_ex()

◆ uvedit_face_select_disable()

◆ uvedit_face_select_enable()

◆ uvedit_face_select_get_no_sync()

bool uvedit_face_select_get_no_sync ( const ToolSettings * ts,
const BMesh * bm,
const BMFace * f )
nodiscard

◆ uvedit_face_select_set()

void uvedit_face_select_set ( const Scene * scene,
BMesh * bm,
BMFace * efa,
bool select )

◆ uvedit_face_select_set_no_sync()

◆ uvedit_face_select_set_with_sticky()

◆ uvedit_face_select_shared_vert()

◆ uvedit_face_select_test()

◆ uvedit_face_select_test_ex()

◆ uvedit_face_visible_test()

bool uvedit_face_visible_test ( const Scene * scene,
const BMFace * efa )

Definition at line 407 of file uvedit_select.cc.

References Scene::toolsettings, and uvedit_face_visible_test_ex().

Referenced by bm_clear_uv_vert_selection(), blender::ed::transform::createTransUVs(), do_lasso_select_mesh_uv(), ED_uvedit_foreach_uv(), ED_uvedit_selected_edges(), ED_uvedit_selected_faces(), ED_uvedit_selected_verts(), ED_uvedit_selectmode_clean(), ED_uvedit_selectmode_flush(), edgetag_filter_cb(), facetag_filter_cb(), uv_box_select_exec(), uv_circle_select_exec(), uv_find_nearest_edge(), uv_find_nearest_face_ex(), uv_find_nearest_loop_from_edge(), uv_find_nearest_loop_from_vert(), uv_find_nearest_vert(), uv_hide_exec(), uv_mark_seam_exec(), uv_pin_exec(), uv_rip_object(), uv_seams_from_islands_exec(), uv_select_all(), uv_select_edgeloop_double_side_tag(), uv_select_edgeloop_single_side_tag(), uv_select_edgering(), uv_select_faceloop(), uv_select_flush_from_loop_edge_flag(), uv_select_flush_from_tag_loop(), uv_select_invert(), uv_select_linked_multi(), uv_select_more_less(), uv_select_pinned_exec(), uv_select_similar_edge_exec(), uv_select_similar_face_exec(), uv_select_similar_vert_exec(), uv_select_split_exec(), uv_snap_uvs_to_adjacent_unselected(), uvedit_center(), uvedit_edge_select_flush_from_tag_sticky_loc_internal(), uvedit_edge_select_set_noflush(), uvedit_edge_select_set_with_sticky(), uvedit_face_select_set_with_sticky(), uvedit_first_selected_uv_from_vertex(), uvedit_loop_find_other_radial_loop_with_visible_face(), uvedit_nearest_uv(), uvedit_select_flush_from_verts(), uvedit_select_is_any_selected(), uvedit_translate(), uvedit_uv_select_flush_from_tag_sticky_loc_internal(), uvedit_uv_select_set_with_sticky(), uvedit_uv_select_shared_vert(), and verttag_filter_cb().

◆ uvedit_face_visible_test_ex()

◆ uvedit_first_selected_uv_from_vertex()

const float * uvedit_first_selected_uv_from_vertex ( Scene * scene,
const BMesh * bm,
BMVert * eve,
const BMUVOffsets & offsets )
Warning
This returns first selected UV, not ideal in many cases since there could be multiple.

Definition at line 2783 of file uvedit_select.cc.

References bm, BM_ELEM_CD_GET_FLOAT_P, BM_ITER_ELEM, BM_LOOPS_OF_VERT, l, BMUVOffsets::uv, uvedit_face_visible_test(), and uvedit_uv_select_test().

◆ uvedit_loop_edge_select_get()

◆ uvedit_loop_edge_select_set()

void uvedit_loop_edge_select_set ( const ToolSettings * ts,
const BMesh * bm,
BMLoop * l,
const bool select )

◆ uvedit_loop_find_other_boundary_loop_with_visible_face()

BMLoop * uvedit_loop_find_other_boundary_loop_with_visible_face ( const Scene * scene,
BMLoop * l_edge,
BMVert * v_pivot,
const BMUVOffsets & offsets )
static

◆ uvedit_loop_find_other_radial_loop_with_visible_face()

◆ uvedit_loop_vert_select_get()

bool uvedit_loop_vert_select_get ( const ToolSettings * ts,
const BMesh * bm,
const BMLoop * l )

◆ uvedit_loop_vert_select_set()

void uvedit_loop_vert_select_set ( const ToolSettings * ts,
const BMesh * bm,
BMLoop * l,
const bool select )

◆ uvedit_nearest_uv()

bool uvedit_nearest_uv ( const Scene * scene,
Object * obedit,
const float co[2],
const float scale[2],
const bool ignore_selected,
float * dist_sq,
float r_uv[2] )
static

◆ uvedit_select_flush_from_verts()

void uvedit_select_flush_from_verts ( const Scene * scene,
BMesh * bm,
bool select )

◆ uvedit_select_is_any_selected()

◆ uvedit_select_is_any_selected_multi()

bool uvedit_select_is_any_selected_multi ( const Scene * scene,
const Span< Object * > objects )

◆ uvedit_select_pin_ok_or_report()

bool uvedit_select_pin_ok_or_report ( const Scene * scene,
ReportList * reports )
static

◆ uvedit_select_prepare_custom_data()

◆ uvedit_select_prepare_sync_select()

◆ uvedit_select_prepare_UNUSED()

void uvedit_select_prepare_UNUSED ( const Scene * scene,
BMesh * bm )

◆ uvedit_sync_uvselect_flush_from_v3d()

◆ uvedit_uv_select_disable()

◆ uvedit_uv_select_enable()

◆ uvedit_uv_select_flush_from_tag_sticky_loc_internal()

void uvedit_uv_select_flush_from_tag_sticky_loc_internal ( const Scene * scene,
BMesh * bm,
BMLoop * l,
const bool select,
const BMUVOffsets & offsets )
static

◆ uvedit_uv_select_set()

◆ uvedit_uv_select_set_with_sticky()

◆ uvedit_uv_select_shared_vert()

void uvedit_uv_select_shared_vert ( const Scene * scene,
BMesh * bm,
BMLoop * l,
const bool select,
const int sticky_flag,
const BMUVOffsets & offsets )

Selects shared UVs based on #sticky_flag.

Parameters
sticky_flagType of sticky selection:

Definition at line 996 of file uvedit_select.cc.

References BLI_assert, bm, BM_DISK_EDGE_NEXT, BM_loop_uv_share_vert_check(), ELEM, BMLoop::f, BMEdge::l, l, BMLoop::radial_next, select, BMUVOffsets::uv, UV_STICKY_LOCATION, UV_STICKY_VERT, uvedit_face_visible_test(), uvedit_uv_select_set(), and BMLoop::v.

Referenced by uvedit_edge_select_shared_vert(), uvedit_face_select_shared_vert(), and uvedit_uv_select_set_with_sticky().

◆ uvedit_uv_select_test()

◆ uvedit_uv_select_test_ex()

◆ uvedit_vert_is_all_other_faces_selected()

bool uvedit_vert_is_all_other_faces_selected ( const ToolSettings * ts,
const BMesh * bm,
const BMLoop * l,
const BMUVOffsets & offsets )

◆ uvedit_vert_is_edge_select_any_other()

◆ uvedit_vert_is_face_select_any_other()

◆ uvedit_vert_select_get_no_sync()

◆ uvedit_vert_select_set_no_sync()

◆ uvedit_vertex_select_tagged()

void uvedit_vertex_select_tagged ( BMesh * bm,
const Scene * scene,
bool select )
static

Variable Documentation

◆ prop_similar_compare_types

EnumPropertyItem prop_similar_compare_types[]
static
Initial value:
= {{SIM_CMP_EQ, "EQUAL", 0, "Equal", ""},
{SIM_CMP_GT, "GREATER", 0, "Greater", ""},
{SIM_CMP_LT, "LESS", 0, "Less", ""},
{0}}
@ SIM_CMP_LT
@ SIM_CMP_GT
@ SIM_CMP_EQ

Definition at line 6448 of file uvedit_select.cc.

◆ uv_select_similar_type_items

EnumPropertyItem uv_select_similar_type_items[]
static
Initial value:
= {
{UV_SSIM_PIN, "PIN", 0, "Pinned", ""},
{UV_SSIM_LENGTH_UV, "LENGTH", 0, "Length", "Edge length in UV space"},
{UV_SSIM_LENGTH_3D, "LENGTH_3D", 0, "Length 3D", "Length of edge in 3D space"},
{UV_SSIM_AREA_UV, "AREA", 0, "Area", "Face area in UV space"},
{UV_SSIM_AREA_3D, "AREA_3D", 0, "Area 3D", "Area of face in 3D space"},
{UV_SSIM_MATERIAL, "MATERIAL", 0, "Material", ""},
{UV_SSIM_OBJECT, "OBJECT", 0, "Object", ""},
{UV_SSIM_SIDES, "SIDES", 0, "Polygon Sides", ""},
"WINDING",
0,
"Winding",
"Face direction defined by (clockwise or anti-clockwise winding (facing up or facing down)"},
{UV_SSIM_FACE, "FACE", 0, "Amount of Faces in Island", ""},
{0}}
@ UV_SSIM_AREA_UV
@ UV_SSIM_LENGTH_UV
@ UV_SSIM_MATERIAL
@ UV_SSIM_PIN
@ UV_SSIM_FACE
@ UV_SSIM_OBJECT
@ UV_SSIM_WINDING
@ UV_SSIM_LENGTH_3D
@ UV_SSIM_AREA_3D
@ UV_SSIM_SIDES

Definition at line 6431 of file uvedit_select.cc.

Referenced by UV_OT_select_similar(), and uv_select_similar_type_itemf().