|
Blender
V2.93
|
#include "MEM_guardedalloc.h"#include "DNA_key_types.h"#include "DNA_mesh_types.h"#include "DNA_object_types.h"#include "BLI_alloca.h"#include "BLI_buffer.h"#include "BLI_kdtree.h"#include "BLI_listbase.h"#include "BLI_math.h"#include "BKE_DerivedMesh.h"#include "BKE_context.h"#include "BKE_editmesh.h"#include "BKE_editmesh_bvh.h"#include "BKE_global.h"#include "BKE_layer.h"#include "BKE_main.h"#include "BKE_mesh.h"#include "BKE_mesh_mapping.h"#include "BKE_report.h"#include "DEG_depsgraph.h"#include "BKE_object.h"#include "WM_api.h"#include "WM_types.h"#include "ED_mesh.h"#include "ED_screen.h"#include "ED_transform_snap_object_context.h"#include "ED_uvedit.h"#include "ED_view3d.h"#include "mesh_intern.h"Go to the source code of this file.
Macros | |
| #define | VERT_INTPTR(_v, _i) (r_index ? &r_index[_i] : 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, int recalctess) |
| void | EDBM_redo_state_free (BMBackup *backup, BMEditMesh *em, int recalctess) |
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_load_ex (Main *bmain, Object *ob, bool free_data) |
| void | EDBM_mesh_clear (BMEditMesh *em) |
| void | EDBM_mesh_load (Main *bmain, Object *ob) |
| void | EDBM_mesh_free (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) |
UV Vertex Map API | |
| UvVertMap * | BM_uv_vert_map_create (BMesh *bm, const bool use_select, const bool use_winding) |
| UvMapVert * | BM_uv_vert_map_at_index (UvVertMap *vmap, uint v) |
| UvElementMap * | BM_uv_element_map_create (BMesh *bm, const Scene *scene, const bool face_selected, const bool uv_selected, const bool use_winding, const bool do_islands) |
| void | BM_uv_vert_map_free (UvVertMap *vmap) |
| void | BM_uv_element_map_free (UvElementMap *element_map) |
| UvElement * | BM_uv_element_get (UvElementMap *map, BMFace *efa, BMLoop *l) |
Data Layer Checks | |
| BMFace * | EDBM_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 (BMEditMesh *em) |
| void | EDBM_stats_update (BMEditMesh *em) |
| void | EDBM_update_generic (Mesh *mesh, const bool do_tessellation, const bool is_destructive) |
Operator Helpers | |
| bool | EDBM_view3d_poll (bContext *C) |
BMesh Element API | |
| BMElem * | EDBM_elem_from_selectmode (BMEditMesh *em, BMVert *eve, BMEdge *eed, BMFace *efa) |
| int | EDBM_elem_to_index_any (BMEditMesh *em, BMElem *ele) |
| BMElem * | EDBM_elem_from_index_any (BMEditMesh *em, int index) |
| int | EDBM_elem_to_index_any_multi (ViewLayer *view_layer, BMEditMesh *em, BMElem *ele, int *r_object_index) |
| BMElem * | EDBM_elem_from_index_any_multi (ViewLayer *view_layer, int object_index, int elem_index, Object **r_obedit) |
BMesh BVH API | |
| static BMFace * | edge_ray_cast (struct BMBVHTree *tree, const float co[3], const float dir[3], float *r_hitout, BMEdge *e) |
| static void | scale_point (float c1[3], const float p[3], const float s) |
| bool | BMBVH_EdgeVisible (struct BMBVHTree *tree, BMEdge *e, struct Depsgraph *depsgraph, ARegion *region, View3D *v3d, Object *obedit) |
BMesh Vertex Projection API | |
| void | EDBM_project_snap_verts (bContext *C, Depsgraph *depsgraph, ARegion *region, Object *obedit, BMEditMesh *em) |
Mirror Cache API | |
| #define | BM_SEARCH_MAXDIST_MIRR 0.00002f |
| #define | BM_CD_LAYER_ID "__mirror_index" |
| static BMVert * | cache_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) |
| BMVert * | EDBM_verts_mirror_get (BMEditMesh *em, BMVert *v) |
| BMEdge * | EDBM_verts_mirror_get_edge (BMEditMesh *em, BMEdge *e) |
| BMFace * | EDBM_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) |
| #define BM_CD_LAYER_ID "__mirror_index" |
Definition at line 1058 of file editmesh_utils.c.
| #define BM_SEARCH_MAXDIST_MIRR 0.00002f |
Mirror editing API, usage:
Definition at line 1057 of file editmesh_utils.c.
| #define VERT_INTPTR | ( | _v, | |
| _i | |||
| ) | (r_index ? &r_index[_i] : BM_ELEM_CD_GET_VOID_P(_v, cd_vmirr_offset)) |
| UvElement* BM_uv_element_get | ( | UvElementMap * | map, |
| BMFace * | efa, | ||
| BMLoop * | l | ||
| ) |
Definition at line 976 of file editmesh_utils.c.
References BM_elem_index_get, element, l, NULL, BMLoop::v, and UvElementMap::vert.
Referenced by createTransUVs(), stitch_init(), stitch_process_data(), stitch_select(), stitch_uv_edge_generate_linked_edges(), uv_edge_get(), uv_element_offset_from_face_get(), and uv_sculpt_stroke_init().
| UvElementMap* BM_uv_element_map_create | ( | BMesh * | bm, |
| const Scene * | scene, | ||
| const bool | face_selected, | ||
| const bool | uv_selected, | ||
| const bool | use_winding, | ||
| const bool | do_islands | ||
| ) |
Definition at line 673 of file editmesh_utils.c.
References BLI_buffer_declare_static, BLI_buffer_free, BLI_BUFFER_NOP, BLI_buffer_reinit_data, bm, BM_DEFAULT_NGON_STACK_SIZE, BM_ELEM_CD_GET_VOID_P, BM_elem_flag_test, BM_elem_index_get, BM_ELEM_SELECT, BM_FACE, BM_FACES_OF_MESH, BM_ITER_ELEM, BM_ITER_ELEM_INDEX, BM_ITER_MESH, BM_ITER_MESH_INDEX, BM_LOOPS_OF_FACE, BM_mesh_elem_index_ensure(), BM_VERT, BM_VERTS_OF_MESH, UvElementMap::buf, CD_MLOOPUV, compare_v2v2(), copy_v2_v2(), copy_vn_i(), cross_poly_v2(), CustomData_get_offset(), element, BMLoop::f, float(), INVALID_ISLAND, UvElement::island, UvElementMap::islandIndices, UvElement::l, l, BMesh::ldata, BMFace::len, UvElement::loop_of_poly_index, MEM_callocN, MEM_freeN, MEM_mallocN, UvElement::next, next, NULL, scene, UvElement::separate, STD_UV_CONNECT_LIMIT, UvElementMap::totalIslands, UvElementMap::totalUVs, BMesh::totface, BMesh::totvert, MLoopUV::uv, uvedit_uv_select_test(), BMLoop::v, v, and UvElementMap::vert.
| void BM_uv_element_map_free | ( | UvElementMap * | element_map | ) |
Definition at line 960 of file editmesh_utils.c.
References UvElementMap::buf, UvElementMap::islandIndices, MEM_freeN, and UvElementMap::vert.
Referenced by createTransUVs(), state_delete(), and uv_sculpt_stroke_exit().
Definition at line 667 of file editmesh_utils.c.
References v, and UvVertMap::vert.
Referenced by uv_select_flush_from_tag_sticky_loc_internal(), and uv_select_linked_multi().
Return a new UvVertMap from the edit-mesh.
Definition at line 529 of file editmesh_utils.c.
References Freestyle::a, BKE_mesh_uv_vert_map_free(), BLI_buffer_declare_static, BLI_buffer_free, BLI_BUFFER_NOP, BLI_buffer_reinit_data, bm, BM_DEFAULT_NGON_STACK_SIZE, BM_ELEM_CD_GET_VOID_P, BM_elem_flag_test, BM_elem_index_get, BM_ELEM_SELECT, BM_FACE, BM_face_at_index(), BM_FACES_OF_MESH, BM_iter_at_index(), BM_ITER_ELEM_INDEX, BM_ITER_MESH, BM_ITER_MESH_INDEX, BM_LOOPS_OF_FACE, BM_mesh_elem_index_ensure(), BM_VERT, BM_VERTS_OF_MESH, UvVertMap::buf, CD_MLOOPUV, compare_v2v2(), copy_v2_v2(), cross_poly_v2(), CustomData_get_offset(), float(), l, BMesh::ldata, BMFace::len, UvMapVert::loop_of_poly_index, MEM_callocN, MEM_freeN, UvMapVert::next, next, NULL, UvMapVert::poly_index, UvMapVert::separate, STD_UV_CONNECT_LIMIT, BMesh::totface, BMesh::totvert, MLoopUV::uv, BMLoop::v, v, and UvVertMap::vert.
Referenced by uv_select_flush_from_tag_face(), uv_select_flush_from_tag_loop(), and uv_select_linked_multi().
| void BM_uv_vert_map_free | ( | UvVertMap * | vmap | ) |
Definition at line 947 of file editmesh_utils.c.
References UvVertMap::buf, MEM_freeN, and UvVertMap::vert.
Referenced by uv_select_flush_from_tag_face(), uv_select_flush_from_tag_loop(), and uv_select_linked_multi().
| bool BMBVH_EdgeVisible | ( | struct BMBVHTree * | tree, |
| BMEdge * | e, | ||
| struct Depsgraph * | depsgraph, | ||
| ARegion * | region, | ||
| View3D * | v3d, | ||
| Object * | obedit | ||
| ) |
Definition at line 1633 of file editmesh_utils.c.
References add_v3_v3v3(), BMVert::co, copy_v3_v3(), depsgraph, e, ED_view3d_win_to_segment_clipped(), edge_ray_cast(), blender::robust_pred::epsilon, invert_m4_m4(), mid_v3_v3v3(), mul_m4_v3(), normalize_v3(), normalize_v3_length(), NULL, Object::obmat, scale_point(), sub_v3_v3v3(), tree, ARegion::winx, and ARegion::winy.
Referenced by calcEdgeSlide_mval_range().
Definition at line 1033 of file editmesh_utils.c.
References NULL.
Referenced by EDBM_verts_mirror_cache_begin_ex().
| void EDBM_deselect_flush | ( | BMEditMesh * | em | ) |
Definition at line 449 of file editmesh_utils.c.
References BMEditMesh::bm, BM_mesh_deselect_flush(), BMEditMesh::selectmode, and BMesh::selectmode.
Referenced by ED_uvedit_select_sync_flush(), edbm_select_random_exec(), uv_mouse_select_loop_generic_multi(), uv_select_linked_multi(), and vgroup_select_verts().
| BMElem* EDBM_elem_from_index_any | ( | BMEditMesh * | em, |
| int | index | ||
| ) |
Definition at line 1547 of file editmesh_utils.c.
References BMEditMesh::bm, bm, BM_edge_at_index_find_or_table(), BM_face_at_index_find_or_table(), BM_vert_at_index_find_or_table(), NULL, BMesh::totedge, and BMesh::totvert.
Referenced by EDBM_elem_from_index_any_multi(), and edbm_shortest_path_pick_exec().
| BMElem* EDBM_elem_from_index_any_multi | ( | ViewLayer * | view_layer, |
| int | object_index, | ||
| int | elem_index, | ||
| Object ** | r_obedit | ||
| ) |
Definition at line 1587 of file editmesh_utils.c.
References BKE_editmesh_from_object(), BKE_view_layer_array_from_bases_in_edit_mode, EDBM_elem_from_index_any(), MEM_freeN, NULL, and Base::object.
Referenced by edbm_select_linked_pick_exec().
| BMElem* EDBM_elem_from_selectmode | ( | BMEditMesh * | em, |
| BMVert * | eve, | ||
| BMEdge * | eed, | ||
| BMFace * | efa | ||
| ) |
Definition at line 1502 of file editmesh_utils.c.
References NULL, SCE_SELECT_EDGE, SCE_SELECT_FACE, SCE_SELECT_VERTEX, and BMEditMesh::selectmode.
Referenced by edbm_select_linked_pick_invoke().
| 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 1524 of file editmesh_utils.c.
References BLI_assert, BMEditMesh::bm, 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().
| int EDBM_elem_to_index_any_multi | ( | ViewLayer * | view_layer, |
| BMEditMesh * | em, | ||
| BMElem * | ele, | ||
| int * | r_object_index | ||
| ) |
Definition at line 1566 of file editmesh_utils.c.
References BKE_editmesh_from_object(), BKE_view_layer_array_from_bases_in_edit_mode, EDBM_elem_to_index_any(), MEM_freeN, NULL, and Base::object.
Referenced by edbm_select_linked_pick_invoke().
| void EDBM_flag_disable_all | ( | BMEditMesh * | em, |
| const char | hflag | ||
| ) |
Definition at line 510 of file editmesh_utils.c.
References BMEditMesh::bm, BM_EDGE, BM_FACE, BM_mesh_elem_hflag_disable_all(), and BM_VERT.
Referenced by do_lasso_select_mesh(), do_mesh_box_select(), edbm_bevel_calc(), edbm_bridge_edge_loops_for_single_editmesh(), edbm_delete_exec(), edbm_delete_loose_exec(), edbm_duplicate_exec(), edbm_extrude_discrete_faces(), edbm_extrude_edges_indiv(), edbm_extrude_ex(), edbm_flag_disable_all_multi(), edbm_inset_calc(), edbm_loop_to_region_exec(), edbm_merge_exec(), EDBM_mesh_deselect_all_multi_ex(), EDBM_mesh_reveal(), edbm_poke_face_exec(), edbm_polybuild_delete_at_cursor_invoke(), edbm_polybuild_dissolve_at_cursor_invoke(), edbm_region_to_loop_exec(), edbm_screw_exec(), edbm_select_all_exec(), edbm_select_face_by_sides_exec(), edbm_select_loose_exec(), EDBM_select_mirrored(), edbm_select_non_manifold_exec(), EDBM_select_pick(), EDBM_select_toggle_all(), edbm_select_ungrouped_exec(), edbm_spin_exec(), edgering_select(), knife_make_cuts(), mesh_bisect_exec(), mesh_circle_select(), mesh_symmetrize_exec(), mouse_mesh_loop(), mouse_mesh_loop_edge(), mouse_mesh_loop_edge_ring(), mouse_mesh_loop_face(), and uv_select_all_perform().
| void EDBM_flag_enable_all | ( | BMEditMesh * | em, |
| const char | hflag | ||
| ) |
Definition at line 515 of file editmesh_utils.c.
References BMEditMesh::bm, BM_EDGE, BM_FACE, BM_mesh_elem_hflag_enable_all(), and BM_VERT.
Referenced by edbm_select_all_exec(), EDBM_select_toggle_all(), and uv_select_all_perform().
| void EDBM_mesh_clear | ( | BMEditMesh * | em | ) |
Definition at line 382 of file editmesh_utils.c.
References BKE_editmesh_free_derivedmesh(), BMEditMesh::bm, BM_mesh_clear(), BMEditMesh::looptris, MEM_freeN, NULL, and BMEditMesh::tottri.
| void EDBM_mesh_free | ( | BMEditMesh * | em | ) |
Should only be called on the active editmesh, otherwise call BKE_editmesh_free
Definition at line 406 of file editmesh_utils.c.
References BKE_editmesh_free(), ED_mesh_mirror_spatial_table_end(), ED_mesh_mirror_topo_table_end(), and NULL.
Referenced by ED_object_editmode_load_free_ex(), EDBM_mesh_make(), EDBM_op_finish(), and undomesh_to_editmesh().
| bool EDBM_mesh_hide | ( | BMEditMesh * | em, |
| bool | swap | ||
| ) |
Definition at line 1296 of file editmesh_utils.c.
References BMEditMesh::bm, BM_EDGES_OF_MESH, BM_elem_flag_test, BM_ELEM_HIDDEN, BM_elem_hide_set, BM_ELEM_SELECT, BM_FACES_OF_MESH, BM_ITER_MESH, BM_VERTS_OF_MESH, EDBM_selectmode_flush(), SCE_SELECT_EDGE, SCE_SELECT_VERTEX, BMEditMesh::selectmode, and swap().
Referenced by edbm_hide_exec(), and uv_hide_exec().
Definition at line 398 of file editmesh_utils.c.
References EDBM_mesh_load_ex().
Referenced by object_hook_index_array(), and vertex_parent_set_exec().
Definition at line 343 of file editmesh_utils.c.
References BKE_object_free_derived_caches(), BLI_listbase_is_empty(), Key::block, BMEditMesh::bm, bm, BM_mesh_bm_to_me(), Object::data, Mesh::edit_mesh, ListBase::first, Mesh::key, NULL, Main::objects, BMesh::shapenr, Object::shapenr, and UNLIKELY.
Referenced by ED_object_editmode_load_free_ex(), and EDBM_mesh_load().
| void EDBM_mesh_make | ( | Object * | ob, |
| const int | select_mode, | ||
| const bool | add_key_index | ||
| ) |
Definition at line 306 of file editmesh_utils.c.
References Object::actcol, BKE_editmesh_create(), BKE_mesh_to_bmesh(), BMEditMesh::bm, bm, Object::data, EDBM_mesh_free(), EDBM_selectmode_flush(), Mesh::edit_mesh, BMEditMesh::mat_nr, MEM_freeN, BMEditMesh::selectmode, and BMesh::selectmode.
Referenced by ED_object_editmode_enter_ex(), object_hook_index_array(), and vertex_parent_set_exec().
| void EDBM_mesh_normals_update | ( | BMEditMesh * | em | ) |
Definition at line 1408 of file editmesh_utils.c.
References BMEditMesh::bm, and BM_mesh_normals_update().
Referenced by ED_object_data_xform_tag_update(), ED_object_editmode_enter_ex(), edbm_bevel_calc(), edbm_bridge_edge_loops_for_single_editmesh(), edbm_dupli_extrude_cursor_invoke(), edbm_extrude_context_exec(), edbm_extrude_region_exec(), edbm_extrude_repeat_exec(), edbm_face_split_by_edges_exec(), edbm_intersect_select(), EDBM_mesh_reveal(), 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_split_exec(), knifetool_finish_ex(), object_hook_index_array(), object_origin_set_exec(), recalcData_mesh(), recalcData_mesh_skin(), v3d_editvertex_buts(), and vertex_parent_set_exec().
| bool EDBM_mesh_reveal | ( | BMEditMesh * | em, |
| bool | select | ||
| ) |
Definition at line 1338 of file editmesh_utils.c.
References BMEditMesh::bm, BM_EDGES_OF_MESH, BM_elem_flag_disable, BM_elem_flag_enable, BM_elem_flag_test, BM_ELEM_HIDDEN, BM_elem_select_set(), BM_ELEM_TAG, BM_FACES_OF_MESH, BM_ITER_MESH, BM_VERTS_OF_MESH, EDBM_flag_disable_all(), EDBM_mesh_normals_update(), EDBM_selectmode_flush(), SCE_SELECT_EDGE, SCE_SELECT_FACE, SCE_SELECT_VERTEX, select(), and BMEditMesh::selectmode.
Referenced by edbm_reveal_exec(), and uv_reveal_exec().
| bool EDBM_op_call_and_selectf | ( | BMEditMesh * | em, |
| wmOperator * | op, | ||
| const char * | select_slot_out, | ||
| const bool | select_extend, | ||
| const char * | fmt, | ||
| ... | |||
| ) |
Definition at line 231 of file editmesh_utils.c.
References BKE_editmesh_copy(), BKE_reportf(), BLI_assert, BMEditMesh::bm, bm, BM_ALL_NOLOOP, BM_EDGE, BM_ELEM_SELECT, BM_FACE, BM_mesh_elem_hflag_disable_all(), BM_VERT, BMO_FLAG_DEFAULTS, BMO_op_exec(), BMO_op_vinitf(), BMO_slot_buffer_hflag_enable(), BMO_slot_get(), EDBM_op_finish(), eBMOpSlotSubType_Union::elem, BMEditMesh::emcopy, BMEditMesh::emcopyusers, wmOperator::reports, RPT_ERROR, BMOpSlot::slot_subtype, and BMOperator::slots_out.
Referenced by add_primitive_circle_exec(), add_primitive_cone_exec(), add_primitive_cube_exec(), add_primitive_cube_gizmo_exec(), add_primitive_cylinder_exec(), add_primitive_grid_exec(), add_primitive_icosphere_exec(), add_primitive_monkey_exec(), add_primitive_plane_exec(), add_primitive_uvsphere_exec(), edbm_beautify_fill_exec(), edbm_dissolve_faces_exec(), edbm_dissolve_limited_exec(), edbm_edge_split_selected_edges(), edbm_fill_holes_exec(), edbm_tris_convert_to_quads_exec(), edbm_vert_connect_concave_exec(), and edbm_vert_connect_nonplaner_exec().
| bool EDBM_op_call_silentf | ( | BMEditMesh * | em, |
| const char * | fmt, | ||
| ... | |||
| ) |
Definition at line 274 of file editmesh_utils.c.
References BKE_editmesh_copy(), BMEditMesh::bm, bm, BMO_FLAG_DEFAULTS, BMO_op_exec(), BMO_op_vinitf(), EDBM_op_finish(), BMEditMesh::emcopy, BMEditMesh::emcopyusers, and NULL.
| bool EDBM_op_callf | ( | BMEditMesh * | em, |
| wmOperator * | op, | ||
| const char * | fmt, | ||
| ... | |||
| ) |
Definition at line 206 of file editmesh_utils.c.
References BKE_editmesh_copy(), BKE_reportf(), BMEditMesh::bm, bm, BMO_FLAG_DEFAULTS, BMO_op_exec(), BMO_op_vinitf(), EDBM_op_finish(), BMEditMesh::emcopy, BMEditMesh::emcopyusers, wmOperator::reports, and RPT_ERROR.
Referenced by edbm_collapse_edge_exec(), edbm_delete_edgeloop_exec(), edbm_delete_exec(), edbm_dissolve_degenerate_exec(), edbm_dissolve_edges_exec(), edbm_dissolve_verts_exec(), edbm_do_smooth_laplacian_vertex_exec(), edbm_do_smooth_vertex_exec(), edbm_dupli_extrude_cursor_invoke(), edbm_edge_split_selected_verts(), edbm_face_make_planar_exec(), edbm_flip_normals_exec(), edbm_merge_exec(), edbm_normals_make_consistent_exec(), edbm_polybuild_delete_at_cursor_invoke(), edbm_polybuild_dissolve_at_cursor_invoke(), edbm_remove_doubles_exec(), edbm_subdivide_edge_ring_exec(), geometry_extract_apply(), merge_firstlast(), and merge_target().
| bool EDBM_op_finish | ( | BMEditMesh * | em, |
| BMOperator * | bmop, | ||
| wmOperator * | op, | ||
| const bool | do_report | ||
| ) |
Note, we could pass in the mesh, however this is an exceptional case, allow a slow lookup.
This is needed because the COW mesh makes a full copy of the BMEditMesh instead of sharing the pointer, tagging since this has been freed above, the BMEditMesh.emcopy needs to be flushed to the COW edit-mesh, see T55457.
Definition at line 146 of file editmesh_utils.c.
References BKE_editmesh_free(), BKE_editmesh_looptri_calc(), BKE_report(), BMEditMesh::bm, BMO_error_get(), BMO_op_finish(), DEG_id_tag_update(), EDBM_mesh_free(), Mesh::edit_mesh, BMEditMesh::emcopy, BMEditMesh::emcopyusers, ListBase::first, G_MAIN, Mesh::id, ID_RECALC_COPY_ON_WRITE, BMEditMesh::looptris, MEM_freeN, mesh, Main::meshes, ID::next, NULL, wmOperator::reports, and RPT_ERROR.
Referenced by edbm_add_edge_face_exec(), edbm_bevel_calc(), edbm_bridge_edge_loops_for_single_editmesh(), edbm_connect_vert_pair(), edbm_dupli_extrude_cursor_invoke(), edbm_duplicate_exec(), edbm_edge_rotate_selected_exec(), edbm_extrude_discrete_faces(), edbm_extrude_edges_indiv(), edbm_extrude_verts_indiv(), edbm_fill_exec(), edbm_fill_grid_exec(), edbm_inset_calc(), edbm_knife_cut_exec(), edbm_offset_edgeloop_exec(), EDBM_op_call_and_selectf(), EDBM_op_call_silentf(), EDBM_op_callf(), edbm_poke_face_exec(), edbm_quads_convert_to_tris_exec(), edbm_remove_doubles_exec(), edbm_reverse_colors_exec(), edbm_reverse_uvs_exec(), edbm_rotate_colors_exec(), edbm_rotate_uvs_exec(), edbm_screw_exec(), edbm_solidify_exec(), edbm_spin_exec(), edbm_split_exec(), edbm_unsubdivide_exec(), edbm_wireframe_exec(), mesh_bisect_exec(), and mesh_symmetrize_exec().
| bool EDBM_op_init | ( | BMEditMesh * | em, |
| BMOperator * | bmop, | ||
| wmOperator * | op, | ||
| const char * | fmt, | ||
| ... | |||
| ) |
Definition at line 122 of file editmesh_utils.c.
References BKE_editmesh_copy(), BKE_reportf(), BMEditMesh::bm, bm, BMO_FLAG_DEFAULTS, BMO_op_vinitf(), BMEditMesh::emcopy, BMEditMesh::emcopyusers, wmOperator::reports, and RPT_ERROR.
Referenced by edbm_add_edge_face_exec(), edbm_bevel_calc(), edbm_bridge_edge_loops_for_single_editmesh(), edbm_connect_vert_pair(), edbm_dupli_extrude_cursor_invoke(), edbm_duplicate_exec(), edbm_edge_rotate_selected_exec(), edbm_extrude_discrete_faces(), edbm_extrude_edges_indiv(), edbm_extrude_verts_indiv(), edbm_fill_exec(), edbm_fill_grid_exec(), edbm_inset_calc(), edbm_knife_cut_exec(), edbm_offset_edgeloop_exec(), edbm_poke_face_exec(), edbm_quads_convert_to_tris_exec(), edbm_remove_doubles_exec(), edbm_reverse_colors_exec(), edbm_reverse_uvs_exec(), edbm_rotate_colors_exec(), edbm_rotate_uvs_exec(), edbm_screw_exec(), edbm_solidify_exec(), edbm_spin_exec(), edbm_split_exec(), edbm_unsubdivide_exec(), edbm_wireframe_exec(), mesh_bisect_exec(), and mesh_symmetrize_exec().
| void EDBM_project_snap_verts | ( | bContext * | C, |
| Depsgraph * | depsgraph, | ||
| ARegion * | region, | ||
| Object * | obedit, | ||
| BMEditMesh * | em | ||
| ) |
Definition at line 1703 of file editmesh_utils.c.
References BMEditMesh::bm, BM_elem_flag_test, BM_ELEM_SELECT, BM_ITER_MESH, BM_VERTS_OF_MESH, C, BMVert::co, CTX_data_scene(), CTX_wm_view3d(), depsgraph, ED_transform_snap_object_context_create_view3d(), ED_transform_snap_object_context_destroy(), ED_transform_snap_object_project_view3d(), ED_view3d_init_mats_rv3d(), ED_view3d_project_float_object(), Object::imat, mul_v3_m4v3(), NULL, SnapObjectContext::region, ARegion::regiondata, SCE_SNAP_MODE_FACE, SNAP_NOT_ACTIVE, V3D_PROJ_RET_OK, and V3D_PROJ_TEST_NOP.
Referenced by edbm_dupli_extrude_cursor_invoke().
| void EDBM_redo_state_free | ( | BMBackup * | backup, |
| BMEditMesh * | em, | ||
| int | recalctess | ||
| ) |
Definition at line 96 of file editmesh_utils.c.
References backup, BKE_editmesh_looptri_calc(), BMEditMesh::bm, BM_mesh_data_free(), MEM_freeN, and NULL.
Referenced by edbm_bevel_cancel(), edbm_bevel_exit(), edbm_bisect_exit(), edbm_inset_cancel(), and edbm_inset_exit().
| void EDBM_redo_state_restore | ( | BMBackup | backup, |
| BMEditMesh * | em, | ||
| int | recalctess | ||
| ) |
Definition at line 78 of file editmesh_utils.c.
References backup, BKE_editmesh_looptri_calc(), BMEditMesh::bm, BM_mesh_copy(), BM_mesh_data_free(), MEM_freeN, and NULL.
Referenced by edbm_bevel_calc(), edbm_inset_calc(), and mesh_bisect_exec().
| BMBackup EDBM_redo_state_store | ( | BMEditMesh * | em | ) |
Definition at line 71 of file editmesh_utils.c.
References backup, BMEditMesh::bm, and BM_mesh_copy().
Referenced by edbm_bevel_init(), edbm_inset_init(), and mesh_bisect_invoke().
| void EDBM_select_flush | ( | BMEditMesh * | em | ) |
Definition at line 456 of file editmesh_utils.c.
References BMEditMesh::bm, BM_mesh_select_flush(), BMEditMesh::selectmode, and BMesh::selectmode.
Referenced by ED_uvedit_select_sync_flush(), edbm_dissolve_degenerate_exec(), edbm_edge_split_selected_edges(), edbm_edge_split_selected_verts(), EDBM_selectmode_set(), select_editbmesh_hook(), uv_mouse_select_loop_generic_multi(), and vgroup_select_verts().
| void EDBM_select_less | ( | BMEditMesh * | em, |
| const bool | use_face_step | ||
| ) |
Definition at line 485 of file editmesh_utils.c.
References BMEditMesh::bm, BM_ALL_NOLOOP, BM_ELEM_SELECT, BM_mesh_select_mode_clean(), BMO_FLAG_DEFAULTS, BMO_op_exec(), BMO_op_finish(), BMO_op_initf(), BMO_slot_buffer_hflag_disable(), EDBM_selectmode_flush(), SCE_SELECT_FACE, BMEditMesh::selectmode, and BMOperator::slots_out.
Referenced by edbm_select_less_exec(), and uv_select_more_less().
| void EDBM_select_more | ( | BMEditMesh * | em, |
| const bool | use_face_step | ||
| ) |
Definition at line 463 of file editmesh_utils.c.
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().
| void EDBM_selectmode_flush | ( | BMEditMesh * | em | ) |
Definition at line 444 of file editmesh_utils.c.
References EDBM_selectmode_flush_ex(), and BMEditMesh::selectmode.
Referenced by deselect_nth_active(), do_lasso_select_mesh(), do_mesh_box_select(), edbm_bevel_exit(), edbm_connect_vert_pair(), edbm_edge_rotate_selected_exec(), edbm_loop_multiselect_exec(), edbm_loop_to_region_exec(), EDBM_mesh_hide(), EDBM_mesh_make(), EDBM_mesh_reveal(), edbm_quads_convert_to_tris_exec(), edbm_remove_doubles_exec(), edbm_select_all_exec(), edbm_select_axis_exec(), edbm_select_face_by_sides_exec(), EDBM_select_less(), edbm_select_linked_exec(), edbm_select_linked_pick_ex(), edbm_select_loose_exec(), edbm_select_mirror_exec(), EDBM_select_more(), edbm_select_non_manifold_exec(), EDBM_select_pick(), edbm_select_random_exec(), edbm_select_sharp_edges_exec(), edbm_select_ungrouped_exec(), EDBM_selectmode_set(), edbm_unsubdivide_exec(), edbm_vert_connect_path_exec(), knifetool_finish_ex(), mesh_bisect_exec(), mesh_circle_select(), mesh_symmetrize_exec(), mouse_mesh_loop(), mouse_mesh_shortest_path_edge(), mouse_mesh_shortest_path_face(), mouse_mesh_shortest_path_vert(), ringsel_finish(), similar_edge_select_exec(), similar_face_select_exec(), similar_vert_select_exec(), uv_mouse_select_multi(), uv_select_all_perform(), and uv_select_linked_multi().
| void EDBM_selectmode_flush_ex | ( | BMEditMesh * | em, |
| const short | selectmode | ||
| ) |
Definition at line 439 of file editmesh_utils.c.
References BMEditMesh::bm, and BM_mesh_select_mode_flush_ex().
Referenced by add_primitive_cube_gizmo_exec(), edbm_decimate_exec(), edbm_delete_edgeloop_exec(), EDBM_selectmode_flush(), edbm_unsubdivide_exec(), make_prim_finish(), ringsel_finish(), special_aftertrans_update__mesh(), uv_hide_exec(), and walker_deselect_nth().
| void EDBM_selectmode_to_scene | ( | bContext * | C | ) |
Definition at line 423 of file editmesh_utils.c.
References BKE_editmesh_from_object(), C, CTX_data_edit_object(), CTX_data_scene(), NC_SCENE, ND_TOOLSETTINGS, scene, BMEditMesh::selectmode, ToolSettings::selectmode, Scene::toolsettings, and WM_event_add_notifier().
Referenced by edbm_region_to_loop_exec().
| void EDBM_stats_update | ( | BMEditMesh * | em | ) |
Definition at line 1413 of file editmesh_utils.c.
References BMEditMesh::bm, BM_EDGES_OF_MESH, BM_elem_flag_test, BM_ELEM_SELECT, BM_FACES_OF_MESH, BM_iter_new, BM_VERTS_OF_MESH, NULL, BMesh::totedgesel, BMesh::totfacesel, and BMesh::totvertsel.
| void EDBM_update_generic | ( | Mesh * | mesh, |
| const bool | do_tessellation, | ||
| const bool | is_destructive | ||
| ) |
Definition at line 1444 of file editmesh_utils.c.
References BKE_editmesh_free_derivedmesh(), BKE_editmesh_looptri_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(), Mesh::edit_mesh, BMEditSelection::ele, ListBase::first, Mesh::id, ID_RECALC_GEOMETRY, mesh, NC_GEOM, ND_DATA, BMEditSelection::next, BMesh::selected, BMesh::spacearr_dirty, and WM_main_add_notifier().
Referenced by add_primitive_cube_gizmo_exec(), 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_exec(), edbm_hide_exec(), edbm_inset_calc(), edbm_inset_cancel(), edbm_intersect_select(), edbm_knife_cut_exec(), 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_vert_connect_concave_exec(), edbm_vert_connect_nonplaner_exec(), edbm_vert_connect_path_exec(), edbm_wireframe_exec(), knifetool_finish_ex(), make_prim_finish(), mesh_bisect_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(), uv_hide_exec(), and uv_reveal_exec().
| BMFace* EDBM_uv_active_face_get | ( | BMEditMesh * | em, |
| const bool | sloppy, | ||
| const bool | selected | ||
| ) |
last_sel, use em->act_face otherwise get the last selected face in the editselections at the moment, last_sel is mainly useful for making sure the space image doesn't flicker.
Definition at line 997 of file editmesh_utils.c.
References BMEditMesh::bm, BM_mesh_active_face_get(), EDBM_uv_check(), and NULL.
Referenced by mesh_render_data_create().
| bool EDBM_uv_check | ( | BMEditMesh * | em | ) |
Definition at line 1015 of file editmesh_utils.c.
References BMEditMesh::bm, CD_MLOOPUV, CustomData_has_layer(), BMesh::ldata, and BMesh::totface.
Referenced by ED_space_image_show_uvedit(), ED_uvedit_test(), EDBM_uv_active_face_get(), and uv_seams_from_islands_exec().
| bool EDBM_vert_color_check | ( | BMEditMesh * | em | ) |
Definition at line 1021 of file editmesh_utils.c.
References BMEditMesh::bm, CD_MLOOPCOL, CustomData_has_layer(), BMesh::ldata, and BMesh::totface.
| void EDBM_verts_mirror_apply | ( | BMEditMesh * | em, |
| const int | sel_from, | ||
| const int | sel_to | ||
| ) |
Definition at line 1269 of file editmesh_utils.c.
References BLI_assert, BMEditMesh::bm, BM_elem_flag_test, BM_ELEM_SELECT, BM_ITER_MESH, BM_VERT, BM_VERTS_OF_MESH, BMVert::co, copy_v3_v3(), EDBM_verts_mirror_get(), BMesh::elem_table_dirty, NULL, v, and BMesh::vtable.
Referenced by edbm_do_smooth_laplacian_vertex_exec(), and edbm_do_smooth_vertex_exec().
| 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 | ||
| ) |
Definition at line 1185 of file editmesh_utils.c.
References BM_SEARCH_MAXDIST_MIRR, EDBM_verts_mirror_cache_begin_ex(), and NULL.
Referenced by ED_vgroup_mirror(), edbm_do_smooth_laplacian_vertex_exec(), edbm_do_smooth_vertex_exec(), and EDBM_select_mirrored().
| 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 | ||
| ) |
| em | Editmesh. |
| use_self | Allow a vertex to point to its self (middle verts). |
| use_select | Restrict to selected verts. |
| respecthide | Skip hidden vertices. |
| use_topology | Use topology mirror. |
| maxdist | Distance for close point test. |
| r_index | Optional array to write into, as an alternative to a customdata layer (length of total verts). |
Definition at line 1069 of file editmesh_utils.c.
References BLI_assert, BMEditMesh::bm, 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, NULL, 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().
| void EDBM_verts_mirror_cache_clear | ( | BMEditMesh * | em, |
| BMVert * | v | ||
| ) |
Definition at line 1253 of file editmesh_utils.c.
References BLI_assert, BMEditMesh::bm, CustomData_bmesh_get_layer_n(), BMHeader::data, BMVert::head, BMEditMesh::mirror_cdlayer, v, and BMesh::vdata.
| void EDBM_verts_mirror_cache_end | ( | BMEditMesh * | em | ) |
Definition at line 1264 of file editmesh_utils.c.
References BMEditMesh::mirror_cdlayer.
Referenced by ED_vgroup_mirror(), edbm_do_smooth_laplacian_vertex_exec(), edbm_do_smooth_vertex_exec(), and EDBM_select_mirrored().
| BMVert* EDBM_verts_mirror_get | ( | BMEditMesh * | em, |
| BMVert * | v | ||
| ) |
Definition at line 1203 of file editmesh_utils.c.
References BLI_assert, BMEditMesh::bm, bm, CustomData_bmesh_get_layer_n(), BMHeader::data, BMVert::head, BMEditMesh::mirror_cdlayer, NULL, BMesh::totvert, v, BMesh::vdata, and BMesh::vtable.
Referenced by ED_vgroup_mirror(), EDBM_select_mirrored(), EDBM_verts_mirror_apply(), EDBM_verts_mirror_get_edge(), and EDBM_verts_mirror_get_face().
| BMEdge* EDBM_verts_mirror_get_edge | ( | BMEditMesh * | em, |
| BMEdge * | e | ||
| ) |
Definition at line 1223 of file editmesh_utils.c.
References BM_edge_exists(), e, EDBM_verts_mirror_get(), and NULL.
Referenced by EDBM_select_mirrored().
| BMFace* EDBM_verts_mirror_get_face | ( | BMEditMesh * | em, |
| BMFace * | f | ||
| ) |
Definition at line 1236 of file editmesh_utils.c.
References BLI_array_alloca, BM_face_exists(), BM_FACE_FIRST_LOOP, EDBM_verts_mirror_get(), BMFace::len, BMLoop::next, NULL, and BMLoop::v.
Referenced by EDBM_select_mirrored().
| bool EDBM_view3d_poll | ( | bContext * | C | ) |
Definition at line 1487 of file editmesh_utils.c.
References C, ED_operator_editmesh(), and ED_operator_view3d_active().
Referenced by MESH_OT_knife_cut(), MESH_OT_polybuild_delete_at_cursor(), MESH_OT_polybuild_dissolve_at_cursor(), MESH_OT_polybuild_face_at_cursor(), MESH_OT_polybuild_split_at_cursor(), MESH_OT_polybuild_transform_at_cursor(), MESH_OT_rip(), and MESH_OT_rip_edge().
|
static |
Definition at line 1614 of file editmesh_utils.c.
References BKE_bmbvh_ray_cast(), BM_edge_in_face(), e, NULL, and tree.
Referenced by BMBVH_EdgeVisible().
Definition at line 1626 of file editmesh_utils.c.
References add_v3_v3(), mul_v3_fl(), and sub_v3_v3().
Referenced by BMBVH_EdgeVisible().