Blender V4.3
editmesh_utils.cc File Reference
#include "MEM_guardedalloc.h"
#include "DNA_key_types.h"
#include "DNA_mesh_types.h"
#include "DNA_object_types.h"
#include "BLI_array.hh"
#include "BLI_kdtree.h"
#include "BLI_listbase.h"
#include "BLI_math_matrix.h"
#include "BLI_math_vector.h"
#include "BKE_context.hh"
#include "BKE_customdata.hh"
#include "BKE_editmesh.hh"
#include "BKE_editmesh_bvh.hh"
#include "BKE_layer.hh"
#include "BKE_mesh.hh"
#include "BKE_mesh_mapping.hh"
#include "BKE_report.hh"
#include "DEG_depsgraph.hh"
#include "WM_api.hh"
#include "WM_types.hh"
#include "ED_mesh.hh"
#include "ED_screen.hh"
#include "ED_transform_snap_object_context.hh"
#include "ED_uvedit.hh"
#include "ED_view3d.hh"
#include "mesh_intern.hh"

Go to the source code of this file.

Macros

#define VERT_INTPTR(_v, _i)    (r_index ? &r_index[_i] : static_cast<int *>(BM_ELEM_CD_GET_VOID_P(_v, cd_vmirr_offset)))
 

Functions

Redo API
BMBackup EDBM_redo_state_store (BMEditMesh *em)
 
void EDBM_redo_state_restore (BMBackup *backup, BMEditMesh *em, bool recalc_looptris)
 
void EDBM_redo_state_restore_and_free (BMBackup *backup, BMEditMesh *em, bool recalc_looptris)
 
void EDBM_redo_state_free (BMBackup *backup)
 
BMesh Operator (BMO) API Wrapper
bool EDBM_op_init (BMEditMesh *em, BMOperator *bmop, wmOperator *op, const char *fmt,...)
 
bool EDBM_op_finish (BMEditMesh *em, BMOperator *bmop, wmOperator *op, const bool do_report)
 
bool EDBM_op_callf (BMEditMesh *em, wmOperator *op, const char *fmt,...)
 
bool EDBM_op_call_and_selectf (BMEditMesh *em, wmOperator *op, const char *select_slot_out, const bool select_extend, const char *fmt,...)
 
bool EDBM_op_call_silentf (BMEditMesh *em, const char *fmt,...)
 
Edit BMesh API

Make/Clear/Free functions.

void EDBM_mesh_make (Object *ob, const int select_mode, const bool add_key_index)
 
void EDBM_mesh_make_from_mesh (Object *ob, Mesh *src_mesh, const int select_mode, const bool add_key_index)
 
void EDBM_mesh_load_ex (Main *bmain, Object *ob, bool free_data)
 
void EDBM_mesh_load (Main *bmain, Object *ob)
 
void EDBM_mesh_free_data (BMEditMesh *em)
 
Selection Utilities
void EDBM_selectmode_to_scene (bContext *C)
 
void EDBM_selectmode_flush_ex (BMEditMesh *em, const short selectmode)
 
void EDBM_selectmode_flush (BMEditMesh *em)
 
void EDBM_deselect_flush (BMEditMesh *em)
 
void EDBM_select_flush (BMEditMesh *em)
 
void EDBM_select_more (BMEditMesh *em, const bool use_face_step)
 
void EDBM_select_less (BMEditMesh *em, const bool use_face_step)
 
void EDBM_flag_disable_all (BMEditMesh *em, const char hflag)
 
void EDBM_flag_enable_all (BMEditMesh *em, const char hflag)
 
Data Layer Checks
BMFaceEDBM_uv_active_face_get (BMEditMesh *em, const bool sloppy, const bool selected)
 
bool EDBM_uv_check (BMEditMesh *em)
 
bool EDBM_vert_color_check (BMEditMesh *em)
 
Hide/Reveal API
bool EDBM_mesh_hide (BMEditMesh *em, bool swap)
 
bool EDBM_mesh_reveal (BMEditMesh *em, bool select)
 
Update API
void EDBM_mesh_normals_update_ex (BMEditMesh *em, const BMeshNormalsUpdate_Params *params)
 
void EDBM_mesh_normals_update (BMEditMesh *em)
 
void EDBM_stats_update (BMEditMesh *em)
 
void EDBM_update (Mesh *mesh, const EDBMUpdate_Params *params)
 
void EDBM_update_extern (Mesh *mesh, const bool do_tessellation, const bool is_destructive)
 
Operator Helpers
bool EDBM_view3d_poll (bContext *C)
 
BMesh Element API
BMElemEDBM_elem_from_selectmode (BMEditMesh *em, BMVert *eve, BMEdge *eed, BMFace *efa)
 
int EDBM_elem_to_index_any (BMEditMesh *em, BMElem *ele)
 
BMElemEDBM_elem_from_index_any (BMEditMesh *em, uint index)
 
int EDBM_elem_to_index_any_multi (const Scene *scene, ViewLayer *view_layer, BMEditMesh *em, BMElem *ele, int *r_object_index)
 
BMElemEDBM_elem_from_index_any_multi (const Scene *scene, ViewLayer *view_layer, uint object_index, uint elem_index, Object **r_obedit)
 
BMesh BVH API
static BMFaceedge_ray_cast (const BMBVHTree *tree, const float co[3], const float dir[3], float *r_hitout, const BMEdge *e)
 
static void scale_point (float c1[3], const float p[3], const float s)
 
bool BMBVH_EdgeVisible (const BMBVHTree *tree, const BMEdge *e, const Depsgraph *depsgraph, const ARegion *region, const View3D *v3d, const Object *obedit)
 
BMesh Vertex Projection API
void EDBM_project_snap_verts (bContext *C, Depsgraph *depsgraph, ARegion *region, Object *obedit, BMEditMesh *em)
 

UV Vertex Map API

#define INVALID_ISLAND   uint(-1)
 
UvVertMapBM_uv_vert_map_create (BMesh *bm, const bool use_select)
 
UvMapVertBM_uv_vert_map_at_index (UvVertMap *vmap, uint v)
 
UvElement ** BM_uv_element_map_ensure_head_table (UvElementMap *element_map)
 
intBM_uv_element_map_ensure_unique_index (UvElementMap *element_map)
 
int BM_uv_element_get_unique_index (UvElementMap *element_map, UvElement *child)
 
static void bm_uv_assign_island (UvElementMap *element_map, UvElement *element, int nisland, uint *map, UvElement *islandbuf, int islandbufsize)
 
static int bm_uv_edge_select_build_islands (UvElementMap *element_map, const Scene *scene, UvElement *islandbuf, uint *map, bool uv_selected, const BMUVOffsets offsets)
 
static void bm_uv_build_islands (UvElementMap *element_map, BMesh *bm, const Scene *scene, bool uv_selected)
 
static bool loop_uv_match (BMLoop *loop, const float luv_a[2], const float luv_b[2], int cd_loop_uv_offset)
 
static bool seam_connected_recursive (BMEdge *edge, const float luv_anchor[2], const float luv_fan[2], const BMLoop *needle, GSet *visited, const int cd_loop_uv_offset)
 
static bool seam_connected (BMLoop *loop_a, BMLoop *loop_b, GSet *visited, int cd_loop_uv_offset)
 
UvElementMapBM_uv_element_map_create (BMesh *bm, const Scene *scene, const bool uv_selected, const bool use_winding, const bool use_seams, const bool do_islands)
 
void BM_uv_vert_map_free (UvVertMap *vmap)
 
void BM_uv_element_map_free (UvElementMap *element_map)
 
UvElementBM_uv_element_get (const UvElementMap *element_map, const BMLoop *l)
 
UvElementBM_uv_element_get_head (UvElementMap *element_map, UvElement *child)
 

Mirror Cache API

#define BM_SEARCH_MAXDIST_MIRR   0.00002f
 
#define BM_CD_LAYER_ID   "__mirror_index"
 
static BMVertcache_mirr_intptr_as_bmvert (const intptr_t *index_lookup, int index)
 
void EDBM_verts_mirror_cache_begin_ex (BMEditMesh *em, const int axis, const bool use_self, const bool use_select, const bool respecthide, const bool use_topology, float maxdist, int *r_index)
 
void EDBM_verts_mirror_cache_begin (BMEditMesh *em, const int axis, const bool use_self, const bool use_select, const bool respecthide, const bool use_topology)
 
BMVertEDBM_verts_mirror_get (BMEditMesh *em, BMVert *v)
 
BMEdgeEDBM_verts_mirror_get_edge (BMEditMesh *em, BMEdge *e)
 
BMFaceEDBM_verts_mirror_get_face (BMEditMesh *em, BMFace *f)
 
void EDBM_verts_mirror_cache_clear (BMEditMesh *em, BMVert *v)
 
void EDBM_verts_mirror_cache_end (BMEditMesh *em)
 
void EDBM_verts_mirror_apply (BMEditMesh *em, const int sel_from, const int sel_to)
 

Macro Definition Documentation

◆ BM_CD_LAYER_ID

#define BM_CD_LAYER_ID   "__mirror_index"

Definition at line 1270 of file editmesh_utils.cc.

Referenced by EDBM_verts_mirror_cache_begin_ex().

◆ BM_SEARCH_MAXDIST_MIRR

#define BM_SEARCH_MAXDIST_MIRR   0.00002f

Mirror editing API, usage:

BM_ITER_MESH (v, &iter, em->bm, BM_VERTS_OF_MESH) {
v_mirror = EDBM_verts_mirror_get(em, v);
e_mirror = EDBM_verts_mirror_get_edge(em, e);
f_mirror = EDBM_verts_mirror_get_face(em, f);
}
BMVert * EDBM_verts_mirror_get(BMEditMesh *em, BMVert *v)
void EDBM_verts_mirror_cache_begin(BMEditMesh *em, int axis, bool use_self, bool use_select, bool respecthide, bool use_topology)
void EDBM_verts_mirror_cache_end(BMEditMesh *em)
BMEdge * EDBM_verts_mirror_get_edge(BMEditMesh *em, BMEdge *e)
BMFace * EDBM_verts_mirror_get_face(BMEditMesh *em, BMFace *f)
#define BM_ITER_MESH(ele, iter, bm, itype)
@ BM_VERTS_OF_MESH
ATTR_WARN_UNUSED_RESULT const BMVert const BMEdge * e
ATTR_WARN_UNUSED_RESULT const BMVert * v

Definition at line 1269 of file editmesh_utils.cc.

Referenced by EDBM_verts_mirror_cache_begin().

◆ INVALID_ISLAND

#define INVALID_ISLAND   uint(-1)

◆ VERT_INTPTR

#define VERT_INTPTR ( _v,
_i )    (r_index ? &r_index[_i] : static_cast<int *>(BM_ELEM_CD_GET_VOID_P(_v, cd_vmirr_offset)))

Function Documentation

◆ bm_uv_assign_island()

static void bm_uv_assign_island ( UvElementMap * element_map,
UvElement * element,
int nisland,
uint * map,
UvElement * islandbuf,
int islandbufsize )
static

◆ bm_uv_build_islands()

◆ bm_uv_edge_select_build_islands()

◆ BM_uv_element_get()

UvElement * BM_uv_element_get ( const UvElementMap * element_map,
const BMLoop * l )

Return the UvElement associated with a given BMLoop, or NULL if no association exists.

Parameters
element_mapThe UvElementMap to look in.
lThe loop to search for.
Returns
The UvElement associated with l, or NULL if not found. (e.g. the vertex is hidden.)

Definition at line 1187 of file editmesh_utils.cc.

References BM_elem_index_get, element, l, UvElement::next, BMLoop::v, and UvElementMap::vertex.

Referenced by bm_uv_edge_select_build_islands(), createTransUVs(), iso_index_for_loop(), relaxation_iteration_uv(), stitch_init(), stitch_process_data(), stitch_select(), stitch_uv_edge_generate_linked_edges(), uv_edge_get(), uv_element_offset_from_face_get(), uv_isolate_selected_islands(), and uv_sculpt_stroke_init().

◆ BM_uv_element_get_head()

◆ BM_uv_element_get_unique_index()

int BM_uv_element_get_unique_index ( UvElementMap * element_map,
UvElement * child )

◆ BM_uv_element_map_create()

◆ BM_uv_element_map_ensure_head_table()

◆ BM_uv_element_map_ensure_unique_index()

int * BM_uv_element_map_ensure_unique_index ( UvElementMap * element_map)

◆ BM_uv_element_map_free()

◆ BM_uv_vert_map_at_index()

UvMapVert * BM_uv_vert_map_at_index ( UvVertMap * vmap,
uint v )

Definition at line 547 of file editmesh_utils.cc.

References v, and UvVertMap::vert.

Referenced by uv_select_flush_from_tag_sticky_loc_internal(), and uv_select_linked_multi().

◆ BM_uv_vert_map_create()

◆ BM_uv_vert_map_free()

◆ BMBVH_EdgeVisible()

bool BMBVH_EdgeVisible ( const BMBVHTree * tree,
const BMEdge * e,
const Depsgraph * depsgraph,
const ARegion * region,
const View3D * v3d,
const Object * obedit )

◆ cache_mirr_intptr_as_bmvert()

static BMVert * cache_mirr_intptr_as_bmvert ( const intptr_t * index_lookup,
int index )
static

Definition at line 1246 of file editmesh_utils.cc.

Referenced by EDBM_verts_mirror_cache_begin_ex().

◆ EDBM_deselect_flush()

◆ EDBM_elem_from_index_any()

◆ EDBM_elem_from_index_any_multi()

BMElem * EDBM_elem_from_index_any_multi ( const Scene * scene,
ViewLayer * view_layer,
uint object_index,
uint elem_index,
Object ** r_obedit )

◆ EDBM_elem_from_selectmode()

BMElem * EDBM_elem_from_selectmode ( BMEditMesh * em,
BMVert * eve,
BMEdge * eed,
BMFace * efa )

◆ EDBM_elem_to_index_any()

int EDBM_elem_to_index_any ( BMEditMesh * em,
BMElem * ele )

Used when we want to store a single index for any vert/edge/face.

Intended for use with operators.

Definition at line 1742 of file editmesh_utils.cc.

References BLI_assert, bm, BMEditMesh::bm, BM_EDGE, BM_elem_index_get, BM_FACE, BM_VERT, BMesh::elem_index_dirty, BMElem::head, BMHeader::htype, BMesh::totedge, and BMesh::totvert.

Referenced by EDBM_elem_to_index_any_multi(), and edbm_shortest_path_pick_invoke().

◆ EDBM_elem_to_index_any_multi()

◆ EDBM_flag_disable_all()

◆ EDBM_flag_enable_all()

void EDBM_flag_enable_all ( BMEditMesh * em,
const char hflag )

◆ EDBM_mesh_free_data()

void EDBM_mesh_free_data ( BMEditMesh * em)

◆ EDBM_mesh_hide()

◆ EDBM_mesh_load()

void EDBM_mesh_load ( Main * bmain,
Object * ob )

◆ EDBM_mesh_load_ex()

void EDBM_mesh_load_ex ( Main * bmain,
Object * ob,
bool free_data )
Warning
This can invalidate the Mesh runtime cache of other objects (for linked duplicates). Most callers should run DEG_id_tag_update on ob->data, see: #46738, #46913. This ensures BKE_object_free_derived_caches runs on all objects that use this mesh.

Definition at line 297 of file editmesh_utils.cc.

References BLI_listbase_is_empty(), bm, BM_mesh_bm_to_me(), Object::data, free_data(), params, BMesh::shapenr, Object::shapenr, and UNLIKELY.

Referenced by EDBM_mesh_load(), and blender::ed::object::editmode_load_free_ex().

◆ EDBM_mesh_make()

void EDBM_mesh_make ( Object * ob,
const int select_mode,
const bool add_key_index )

◆ EDBM_mesh_make_from_mesh()

void EDBM_mesh_make_from_mesh ( Object * ob,
Mesh * src_mesh,
int select_mode,
bool add_key_index )

Replaces the edit-mesh in the object with a new one based on the given mesh.

Definition at line 269 of file editmesh_utils.cc.

References Object::actcol, BKE_mesh_to_bmesh(), bm, Object::data, EDBM_mesh_free_data(), EDBM_selectmode_flush(), BMesh::selectmode, and BMeshCreateParams::use_toolflags.

Referenced by EDBM_mesh_make(), and blender::ed::geometry::store_result_geometry().

◆ EDBM_mesh_normals_update()

◆ EDBM_mesh_normals_update_ex()

void EDBM_mesh_normals_update_ex ( BMEditMesh * em,
const BMeshNormalsUpdate_Params * params )

Definition at line 1614 of file editmesh_utils.cc.

References BMEditMesh::bm, BM_mesh_normals_update_ex(), and params.

Referenced by EDBM_mesh_normals_update().

◆ EDBM_mesh_reveal()

◆ EDBM_op_call_and_selectf()

◆ EDBM_op_call_silentf()

bool EDBM_op_call_silentf ( BMEditMesh * em,
const char * fmt,
... )

Same as above, but doesn't report errors.

Definition at line 236 of file editmesh_utils.cc.

References bm, BMEditMesh::bm, BMO_FLAG_DEFAULTS, BMO_op_exec(), BMO_op_vinitf(), and EDBM_op_finish().

◆ EDBM_op_callf()

◆ EDBM_op_finish()

◆ EDBM_op_init()

◆ EDBM_project_snap_verts()

◆ EDBM_redo_state_free()

void EDBM_redo_state_free ( BMBackup * backup)

◆ EDBM_redo_state_restore()

void EDBM_redo_state_restore ( BMBackup * backup,
BMEditMesh * em,
bool recalc_looptris )

◆ EDBM_redo_state_restore_and_free()

void EDBM_redo_state_restore_and_free ( BMBackup * backup,
BMEditMesh * em,
bool recalc_looptris )

◆ EDBM_redo_state_store()

BMBackup EDBM_redo_state_store ( BMEditMesh * em)

Save a copy of the BMesh for restoring later.

Definition at line 54 of file editmesh_utils.cc.

References BMEditMesh::bm, BM_mesh_copy(), and BMBackup::bmcopy.

Referenced by edbm_bevel_init(), edbm_connect_vert_pair(), edbm_inset_init(), and mesh_bisect_invoke().

◆ EDBM_select_flush()

◆ EDBM_select_less()

◆ EDBM_select_more()

void EDBM_select_more ( BMEditMesh * em,
bool use_face_step )

flushes based on the current select mode. If in vertex select mode, verts select/deselect edges and faces, if in edge select mode, edges select/deselect faces and vertices, and in face select mode faces select/deselect edges and vertices.

Definition at line 376 of file editmesh_utils.cc.

References BMEditMesh::bm, BM_ALL_NOLOOP, BM_ELEM_SELECT, BMO_FLAG_DEFAULTS, BMO_op_exec(), BMO_op_finish(), BMO_op_initf(), BMO_slot_buffer_hflag_enable(), EDBM_selectmode_flush(), SCE_SELECT_FACE, BMEditMesh::selectmode, and BMOperator::slots_out.

Referenced by edbm_select_more_exec(), and uv_select_more_less().

◆ EDBM_selectmode_flush()

◆ EDBM_selectmode_flush_ex()

◆ EDBM_selectmode_to_scene()

◆ EDBM_stats_update()

◆ EDBM_update()

void EDBM_update ( Mesh * mesh,
const EDBMUpdate_Params * params )

So many tools call these that we better make it a generic function.

Definition at line 1655 of file editmesh_utils.cc.

References BKE_editmesh_looptris_and_normals_calc(), BKE_editmesh_looptris_calc(), BLI_assert, BMEditMesh::bm, BM_elem_flag_test, BM_ELEM_SELECT, BM_lnorspace_invalidate(), BM_mesh_elem_table_check(), BM_SPACEARR_BMO_SET, DEG_id_tag_update(), EDBM_mesh_normals_update(), ID_RECALC_GEOMETRY, LISTBASE_FOREACH, NC_GEOM, ND_DATA, params, BMesh::selected, BMesh::spacearr_dirty, and WM_main_add_notifier().

Referenced by add_primitive_cube_gizmo_exec(), blender::ed::object::data_xform_tag_update(), edbm_add_edge_face_exec(), EDBM_automerge(), EDBM_automerge_and_split(), edbm_average_normals_exec(), edbm_beautify_fill_exec(), edbm_bevel_calc(), edbm_bevel_cancel(), edbm_blend_from_shape_exec(), edbm_bridge_edge_loops_for_single_editmesh(), edbm_collapse_edge_exec(), edbm_connect_vert_pair(), edbm_decimate_exec(), edbm_delete_edgeloop_exec(), edbm_delete_exec(), edbm_delete_loose_exec(), edbm_dissolve_degenerate_exec(), edbm_dissolve_edges_exec(), edbm_dissolve_faces_exec(), edbm_dissolve_limited_exec(), edbm_dissolve_verts_exec(), edbm_do_smooth_laplacian_vertex_exec(), edbm_do_smooth_vertex_exec(), edbm_dupli_extrude_cursor_invoke(), edbm_duplicate_exec(), edbm_edge_rotate_selected_exec(), edbm_edge_split_selected_edges(), edbm_edge_split_selected_verts(), edbm_extrude_context_exec(), edbm_extrude_edges_exec(), edbm_extrude_faces_exec(), edbm_extrude_region_exec(), edbm_extrude_repeat_exec(), edbm_extrude_verts_exec(), edbm_face_make_planar_exec(), edbm_face_split_by_edges_exec(), edbm_faces_shade_flat_exec(), edbm_faces_shade_smooth_exec(), edbm_fill_exec(), edbm_fill_grid_exec(), edbm_fill_holes_exec(), edbm_flip_normals_custom_loop_normals(), edbm_flip_normals_face_winding(), edbm_flip_quad_tessellation(), edbm_hide_exec(), edbm_inset_calc(), edbm_inset_cancel(), edbm_intersect_select(), edbm_mark_seam_exec(), edbm_mark_sharp_exec(), edbm_merge_exec(), edbm_mod_weighted_strength_exec(), edbm_normals_make_consistent_exec(), edbm_normals_tools_exec(), edbm_offset_edgeloop_exec(), edbm_point_normals_exec(), edbm_point_normals_modal(), edbm_poke_face_exec(), edbm_polybuild_delete_at_cursor_invoke(), edbm_polybuild_dissolve_at_cursor_invoke(), edbm_polybuild_face_at_cursor_invoke(), edbm_polybuild_split_at_cursor_invoke(), edbm_polybuild_transform_at_cursor_invoke(), edbm_quads_convert_to_tris_exec(), edbm_remove_doubles_exec(), edbm_reveal_exec(), edbm_reverse_colors_exec(), edbm_reverse_uvs_exec(), edbm_rip_edge_invoke(), edbm_rip_invoke(), edbm_rotate_colors_exec(), edbm_rotate_uvs_exec(), edbm_screw_exec(), edbm_select_nth_exec(), edbm_separate_exec(), edbm_set_normals_from_faces_exec(), edbm_shape_propagate_to_all_exec(), edbm_smooth_normals_exec(), edbm_solidify_exec(), edbm_spin_exec(), edbm_split_exec(), edbm_subdivide_edge_ring_exec(), edbm_subdivide_exec(), edbm_tris_convert_to_quads_exec(), edbm_unsubdivide_exec(), EDBM_update_extern(), edbm_vert_connect_concave_exec(), edbm_vert_connect_nonplaner_exec(), edbm_vert_connect_path_exec(), edbm_wireframe_exec(), knifetool_finish_single_post(), make_prim_finish(), mesh_bisect_exec(), blender::ed::mesh::set_attribute::mesh_set_attribute_exec(), mesh_symmetrize_exec(), mesh_symmetry_snap_exec(), mouse_mesh_shortest_path_edge(), mouse_mesh_shortest_path_face(), mouse_mesh_shortest_path_vert(), normals_split_merge(), ringsel_finish(), similar_edge_select_exec(), similar_face_select_exec(), similar_vert_select_exec(), sort_bmelem_flag(), uv_hide_exec(), and uv_reveal_exec().

◆ EDBM_update_extern()

void EDBM_update_extern ( Mesh * mesh,
bool do_tessellation,
bool is_destructive )

Bad level call from Python API.

Definition at line 1698 of file editmesh_utils.cc.

References EDBM_update(), and params.

Referenced by bpy_bm_update_edit_mesh().

◆ EDBM_uv_active_face_get()

BMFace * EDBM_uv_active_face_get ( BMEditMesh * em,
bool sloppy,
bool selected )

last_sel, use em->act_face otherwise get the last selected face in the edit-selections at the moment, last_sel is mainly useful for making sure the space image doesn't flicker.

Definition at line 1215 of file editmesh_utils.cc.

References BMEditMesh::bm, BM_mesh_active_face_get(), and EDBM_uv_check().

Referenced by blender::draw::mesh_render_data_create().

◆ EDBM_uv_check()

bool EDBM_uv_check ( BMEditMesh * em)

◆ EDBM_vert_color_check()

bool EDBM_vert_color_check ( BMEditMesh * em)

◆ EDBM_verts_mirror_apply()

◆ EDBM_verts_mirror_cache_begin()

void EDBM_verts_mirror_cache_begin ( BMEditMesh * em,
const int axis,
const bool use_self,
const bool use_select,
const bool respecthide,
const bool use_topology )

◆ EDBM_verts_mirror_cache_begin_ex()

void EDBM_verts_mirror_cache_begin_ex ( BMEditMesh * em,
int axis,
bool use_self,
bool use_select,
bool respecthide,
bool use_topology,
float maxdist,
int * r_index )
Parameters
emEdit-mesh used for generating mirror data.
use_selfAllow a vertex to point to itself (middle verts).
use_selectRestrict to selected verts.
respecthideSkip hidden vertices.
use_topologyUse topology mirror.
maxdistDistance for close point test.
r_indexOptional array to write into, as an alternative to a custom-data layer (length of total verts).

Definition at line 1272 of file editmesh_utils.cc.

References BLI_assert, bm, BMEditMesh::bm, BM_CD_LAYER_ID, BM_data_layer_add_named(), BM_elem_flag_test, BM_ELEM_HIDDEN, BM_elem_index_get, BM_ELEM_SELECT, BM_ITER_MESH_INDEX, BM_mesh_elem_index_ensure(), BM_mesh_elem_table_ensure(), BM_VERT, BM_vert_at_index(), BM_VERTS_OF_MESH, cache_mirr_intptr_as_bmvert(), CD_FLAG_TEMPORARY, CD_PROP_INT32, BMVert::co, copy_v3_v3(), CustomData_get_layer_index(), CustomData_get_n_offset(), CustomData_get_named_layer_index(), ED_mesh_mirrtopo_free(), ED_mesh_mirrtopo_init(), CustomDataLayer::flag, MirrTopoStore_t::index_lookup, CustomData::layers, len_squared_v3v3(), mesh_topo_store, BMEditMesh::mirror_cdlayer, square_f(), BMesh::totvert, tree, v, BMesh::vdata, and VERT_INTPTR.

Referenced by EDBM_verts_mirror_cache_begin(), mesh_symmetry_snap_exec(), and transform_convert_mesh_mirrordata_calc().

◆ EDBM_verts_mirror_cache_clear()

void EDBM_verts_mirror_cache_clear ( BMEditMesh * em,
BMVert * v )

◆ EDBM_verts_mirror_cache_end()

◆ EDBM_verts_mirror_get()

◆ EDBM_verts_mirror_get_edge()

BMEdge * EDBM_verts_mirror_get_edge ( BMEditMesh * em,
BMEdge * e )

Definition at line 1428 of file editmesh_utils.cc.

References BM_edge_exists(), e, EDBM_verts_mirror_get(), and LIKELY.

Referenced by EDBM_select_mirrored().

◆ EDBM_verts_mirror_get_face()

◆ EDBM_view3d_poll()

◆ edge_ray_cast()

static BMFace * edge_ray_cast ( const BMBVHTree * tree,
const float co[3],
const float dir[3],
float * r_hitout,
const BMEdge * e )
static

Definition at line 1827 of file editmesh_utils.cc.

References BKE_bmbvh_ray_cast(), BM_edge_in_face(), e, and tree.

Referenced by BMBVH_EdgeVisible().

◆ loop_uv_match()

static bool loop_uv_match ( BMLoop * loop,
const float luv_a[2],
const float luv_b[2],
int cd_loop_uv_offset )
static

Return true if loop has UV co-ordinates which match luv_a and luv_b.

Definition at line 851 of file editmesh_utils.cc.

References BM_ELEM_CD_GET_FLOAT_P, compare_v2v2(), BMLoop::next, and STD_UV_CONNECT_LIMIT.

Referenced by seam_connected_recursive().

◆ scale_point()

static void scale_point ( float c1[3],
const float p[3],
const float s )
static

Definition at line 1839 of file editmesh_utils.cc.

References add_v3_v3(), mul_v3_fl(), and sub_v3_v3().

Referenced by BMBVH_EdgeVisible().

◆ seam_connected()

static bool seam_connected ( BMLoop * loop_a,
BMLoop * loop_b,
GSet * visited,
int cd_loop_uv_offset )
static

Given loop_a and loop_b originate from the same vertex and share a UV,

Returns
true if there are edges that fan between them that are seam-free. return false otherwise.

Definition at line 945 of file editmesh_utils.cc.

References BLI_assert, BLI_gset_clear(), BM_ELEM_CD_GET_FLOAT_P, BMLoop::e, BMLoop::next, BMLoop::prev, result, seam_connected_recursive(), BMLoop::v, and visited.

Referenced by BM_uv_element_map_create().

◆ seam_connected_recursive()

static bool seam_connected_recursive ( BMEdge * edge,
const float luv_anchor[2],
const float luv_fan[2],
const BMLoop * needle,
GSet * visited,
const int cd_loop_uv_offset )
static

Utility function to implement seam_connected.

Given edge, luv_anchor & luv_fan find if needle is connected without seams or disjoint UVs which would delimit causing them not to be considered connected.

Note
The term anchor is used for the vertex at the center of a face-fan which is being stepped over. Even though every connected face may have a different UV, loops are only stepped onto which match the initial luv_anchor.
Parameters
edgeSearch for needle in all loops connected to edge (recursively).
luv_anchorThe UV of the anchor (vertex that's being stepped around).
luv_fanThe UV of the outer edge, this changes as the fan is stepped over.
needleSearch for this loop, also defines the vertex at the center of the face-fan.
visitedA set of edges to prevent recursing down the same edge multiple times.
cd_loop_uv_offsetThe UV layer.
Returns
true if there are edges that fan between them that are seam-free.

Definition at line 880 of file editmesh_utils.cc.

References BLI_assert, BLI_gset_add(), BM_ELEM_CD_GET_FLOAT_P, BM_elem_flag_test, BM_ELEM_SEAM, BM_ITER_ELEM, BM_LOOPS_OF_EDGE, BMLoop::e, loop_uv_match(), BMLoop::next, BMLoop::prev, seam_connected_recursive(), BMLoop::v, and visited.

Referenced by seam_connected(), and seam_connected_recursive().