53 if ((scene->toolsettings->selectmode & selectmode) == 0) {
54 scene->toolsettings->selectmode |= selectmode;
55 em->
selectmode = scene->toolsettings->selectmode;
67 scene, view_layer, v3d);
68 for (
Object *ob_iter : objects) {
84 wmGizmoMap *gzmap = show_gizmo ? region->gizmo_map :
nullptr;
87 if (gzgroup !=
nullptr) {
102 return (*r_ele !=
nullptr);
121 Base *basact =
nullptr;
122 BMElem *ele_act =
nullptr;
149 params.calc_looptris =
true;
150 params.calc_normals =
true;
151 params.is_destructive =
true;
153 if (basact !=
nullptr) {
167 ot->
name =
"Poly Build Transform at Cursor";
168 ot->
idname =
"MESH_OT_polybuild_transform_at_cursor";
185 bool changed =
false;
186 Base *basact =
nullptr;
187 BMElem *ele_act =
nullptr;
222 "dissolve_verts verts=%hv use_face_split=%b use_boundary_tear=%b",
235 params.calc_looptris =
true;
236 params.calc_normals =
true;
237 params.is_destructive =
true;
239 if (basact !=
nullptr) {
254 ot->
name =
"Poly Build Delete at Cursor";
255 ot->
idname =
"MESH_OT_polybuild_delete_at_cursor";
277 bool changed =
false;
279 Base *basact =
nullptr;
280 BMElem *ele_act =
nullptr;
305 BMFace *f_reference = e_act->
l ? e_act->
l->
f :
nullptr;
321 v_tri[0] = e_act->
v1;
322 v_tri[1] = e_act->
v2;
324 if (e_act->
l && e_act->
l->
v == v_tri[0]) {
325 std::swap(v_tri[0], v_tri[1]);
336 BMEdge *e_pair[2] = {
nullptr};
338 if (v_act->
e !=
nullptr) {
339 for (
uint allow_wire = 0; allow_wire < 2 && (e_pair[1] ==
nullptr); allow_wire++) {
347 e_pair[0] = e_pair[1] =
nullptr;
350 e_pair[i++] = e_iter;
356 if (e_pair[1] !=
nullptr) {
359 std::swap(e_pair[0], e_pair[1]);
362 BMFace *f_reference = e_pair[0]->
l ? e_pair[0]->
l->
f :
nullptr;
373 if (e_pair[0]->
l && e_pair[0]->
l->
v == v_quad[0]) {
374 std::swap(v_quad[1], v_quad[3]);
402 params.calc_looptris =
true;
403 params.calc_normals =
true;
404 params.is_destructive =
true;
407 if (basact !=
nullptr) {
424 ot->
name =
"Poly Build Face at Cursor";
425 ot->
idname =
"MESH_OT_polybuild_face_at_cursor";
438 "Automatically split edges in triangles to maintain quad topology");
454 bool changed =
false;
456 Base *basact =
nullptr;
457 BMElem *ele_act =
nullptr;
493 params.calc_looptris =
true;
494 params.calc_normals =
true;
495 params.is_destructive =
true;
513 ot->
name =
"Poly Build Split at Cursor";
514 ot->
idname =
"MESH_OT_polybuild_split_at_cursor";
537 bool changed =
false;
539 Base *basact =
nullptr;
540 BMElem *ele_act =
nullptr;
545 if (ele_act ==
nullptr) {
572 "dissolve_verts verts=%hv use_face_split=%b use_boundary_tear=%b",
604 ot->
name =
"Poly Build Dissolve at Cursor";
605 ot->
idname =
"MESH_OT_polybuild_dissolve_at_cursor";
Scene * CTX_data_scene(const bContext *C)
ARegion * CTX_wm_region(const bContext *C)
ViewLayer * CTX_data_view_layer(const bContext *C)
BMEditMesh * BKE_editmesh_from_object(Object *ob)
Return the BMEditMesh for a given object.
void BKE_view_layer_synced_ensure(const Scene *scene, ViewLayer *view_layer)
Base * BKE_view_layer_active_base_get(ViewLayer *view_layer)
blender::Vector< Object * > BKE_view_layer_array_from_objects_in_edit_mode_unique_data(const Scene *scene, ViewLayer *view_layer, const View3D *v3d)
float line_point_factor_v3(const float p[3], const float l1[3], const float l2[3])
void mul_m4_v3(const float M[4][4], float r[3])
void mul_v3_m4v3(float r[3], const float mat[4][4], const float vec[3])
bool invert_m4_m4(float inverse[4][4], const float mat[4][4])
MINLINE void copy_v3_v3(float r[3], const float a[3])
void mid_v3_v3v3(float r[3], const float a[3], const float b[3])
void DEG_id_tag_update(ID *id, unsigned int flags)
Object is a sort of wrapper for general info.
void EDBM_flag_disable_all(BMEditMesh *em, char hflag)
void EDBM_update(Mesh *mesh, const EDBMUpdate_Params *params)
void EDBM_selectmode_set(BMEditMesh *em)
ViewContext em_setup_viewcontext(bContext *C)
void ED_view3d_gizmo_mesh_preselect_get_active(const bContext *C, const wmGizmo *gz, Base **r_base, BMElem **r_ele)
void ED_view3d_win_to_3d_int(const View3D *v3d, const ARegion *region, const float depth_pt[3], const int mval[2], float r_out[3])
void ED_view3d_init_mats_rv3d(const Object *ob, RegionView3D *rv3d)
void ED_view3d_viewcontext_init_object(ViewContext *vc, Object *obact)
Read Guarded memory(de)allocation.
#define BM_DISK_EDGE_NEXT(e, v)
BMFace * BM_face_create_verts(BMesh *bm, BMVert **vert_arr, const int len, const BMFace *f_example, const eBMCreateFlag create_flag, const bool create_edges)
BMVert * BM_vert_create(BMesh *bm, const float co[3], const BMVert *v_example, const eBMCreateFlag create_flag)
Main function for creating a new vertex.
BMEdge * BM_edge_create(BMesh *bm, BMVert *v1, BMVert *v2, const BMEdge *e_example, const eBMCreateFlag create_flag)
Main function for creating a new edge.
#define BM_elem_flag_test(ele, hflag)
#define BM_elem_flag_enable(ele, hflag)
ATTR_WARN_UNUSED_RESULT BMesh * bm
void BM_face_select_set(BMesh *bm, BMFace *f, const bool select)
Select Face.
BMElem * BM_mesh_active_elem_get(BMesh *bm)
void BM_vert_select_set(BMesh *bm, BMVert *v, const bool select)
Select Vert.
void BM_edge_select_set(BMesh *bm, BMEdge *e, const bool select)
Select Edge.
#define BM_select_history_store(bm, ele)
BMVert * BM_edge_split(BMesh *bm, BMEdge *e, BMVert *v, BMEdge **r_e, float fac)
Edge Split.
BMFace * BM_faces_join_pair(BMesh *bm, BMLoop *l_a, BMLoop *l_b, const bool do_del)
Faces Join Pair.
BMVert * BM_edge_collapse(BMesh *bm, BMEdge *e_kill, BMVert *v_kill, const bool do_del, const bool kill_degenerate_faces)
bool BM_vert_is_wire(const BMVert *v)
bool BM_edge_loop_pair(BMEdge *e, BMLoop **r_la, BMLoop **r_lb)
float BM_edge_calc_length_squared(const BMEdge *e)
bool BM_vert_is_edge_pair(const BMVert *v)
BLI_INLINE bool BM_edge_is_boundary(const BMEdge *e) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
BLI_INLINE BMVert * BM_edge_other_vert(BMEdge *e, const BMVert *v) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
BLI_INLINE bool BM_edge_is_wire(const BMEdge *e) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
ATTR_WARN_UNUSED_RESULT const BMLoop * l
ATTR_WARN_UNUSED_RESULT const BMLoop * l_b
static bool edbm_preselect_or_active(bContext *C, const View3D *v3d, Base **r_base, BMElem **r_ele)
void MESH_OT_polybuild_transform_at_cursor(wmOperatorType *ot)
static void edbm_flag_disable_all_multi(const Scene *scene, ViewLayer *view_layer, View3D *v3d, const char hflag)
static int edbm_polybuild_split_at_cursor_invoke(bContext *C, wmOperator *, const wmEvent *event)
static int edbm_polybuild_face_at_cursor_invoke(bContext *C, wmOperator *op, const wmEvent *event)
static int edbm_polybuild_dissolve_at_cursor_invoke(bContext *C, wmOperator *op, const wmEvent *)
static ViewContext edbm_preselect_or_active_init_viewcontext(bContext *C, Base **r_base, BMElem **r_ele)
void MESH_OT_polybuild_face_at_cursor(wmOperatorType *ot)
static void edbm_selectmode_ensure(Scene *scene, BMEditMesh *em, short selectmode)
static int edbm_polybuild_transform_at_cursor_invoke(bContext *C, wmOperator *, const wmEvent *)
static int edbm_polybuild_delete_at_cursor_invoke(bContext *C, wmOperator *op, const wmEvent *)
void MESH_OT_polybuild_delete_at_cursor(wmOperatorType *ot)
void MESH_OT_polybuild_dissolve_at_cursor(wmOperatorType *ot)
void MESH_OT_polybuild_split_at_cursor(wmOperatorType *ot)
bool EDBM_op_callf(BMEditMesh *em, wmOperator *op, const char *fmt,...)
bool EDBM_view3d_poll(bContext *C)
void base_activate(bContext *C, Base *base)
bool RNA_boolean_get(PointerRNA *ptr, const char *name)
PropertyRNA * RNA_def_boolean(StructOrFunctionRNA *cont_, const char *identifier, const bool default_value, const char *ui_name, const char *ui_description)
ObjectRuntimeHandle * runtime
bool(* poll)(bContext *C) ATTR_WARN_UNUSED_RESULT
int(* invoke)(bContext *C, wmOperator *op, const wmEvent *event) ATTR_WARN_UNUSED_RESULT
void WM_event_add_mousemove(wmWindow *win)
wmGizmoGroup * WM_gizmomap_group_find(wmGizmoMap *gzmap, const char *idname)