66 scene, view_layer, v3d);
67 for (
Object *ob_iter : objects) {
87 if (gzgroup !=
nullptr) {
105 if (gzgroup !=
nullptr) {
120 return (*r_ele !=
nullptr);
139 Base *basact =
nullptr;
140 BMElem *ele_act =
nullptr;
167 params.calc_looptris =
true;
168 params.calc_normals =
true;
169 params.is_destructive =
true;
171 if (basact !=
nullptr) {
185 ot->name =
"Poly Build Transform at Cursor";
186 ot->idname =
"MESH_OT_polybuild_transform_at_cursor";
203 bool changed =
false;
204 Base *basact =
nullptr;
205 BMElem *ele_act =
nullptr;
240 "dissolve_verts verts=%hv use_face_split=%b use_boundary_tear=%b",
253 params.calc_looptris =
true;
254 params.calc_normals =
true;
255 params.is_destructive =
true;
257 if (basact !=
nullptr) {
272 ot->name =
"Poly Build Delete at Cursor";
273 ot->idname =
"MESH_OT_polybuild_delete_at_cursor";
297 bool changed =
false;
299 Base *basact =
nullptr;
300 BMElem *ele_act =
nullptr;
325 BMFace *f_reference = e_act->
l ? e_act->
l->
f :
nullptr;
341 v_tri[0] = e_act->
v1;
342 v_tri[1] = e_act->
v2;
344 if (e_act->
l && e_act->
l->
v == v_tri[0]) {
345 std::swap(v_tri[0], v_tri[1]);
356 BMEdge *e_pair[2] = {
nullptr};
358 if (v_act->
e !=
nullptr) {
359 for (
uint allow_wire = 0; allow_wire < 2 && (e_pair[1] ==
nullptr); allow_wire++) {
367 e_pair[0] = e_pair[1] =
nullptr;
370 e_pair[
i++] = e_iter;
376 if (e_pair[1] !=
nullptr) {
379 std::swap(e_pair[0], e_pair[1]);
382 BMFace *f_reference = e_pair[0]->
l ? e_pair[0]->
l->
f :
nullptr;
393 if (e_pair[0]->
l && e_pair[0]->
l->v == v_quad[0]) {
394 std::swap(v_quad[1], v_quad[3]);
422 params.calc_looptris =
true;
423 params.calc_normals =
true;
424 params.is_destructive =
true;
427 if (basact !=
nullptr) {
444 ot->name =
"Poly Build Face at Cursor";
445 ot->idname =
"MESH_OT_polybuild_face_at_cursor";
458 "Automatically split edges in triangles to maintain quad topology");
474 bool changed =
false;
476 Base *basact =
nullptr;
477 BMElem *ele_act =
nullptr;
513 params.calc_looptris =
true;
514 params.calc_normals =
true;
515 params.is_destructive =
true;
533 ot->name =
"Poly Build Split at Cursor";
534 ot->idname =
"MESH_OT_polybuild_split_at_cursor";
557 bool changed =
false;
559 Base *basact =
nullptr;
560 BMElem *ele_act =
nullptr;
565 if (ele_act ==
nullptr) {
576 "Doubled face detected at " AT ". Resulting mesh may be corrupt.");
597 "dissolve_verts verts=%hv use_face_split=%b use_boundary_tear=%b",
629 ot->name =
"Poly Build Dissolve at Cursor";
630 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)
#define BLI_assert_msg(a, msg)
BLI_INLINE bool BLI_listbase_is_empty(const ListBase *lb)
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, short selectmode)
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)
@ WM_GIZMOMAP_DRAWSTEP_3D
#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)
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, BMFace **r_double)
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 wmOperatorStatus edbm_polybuild_transform_at_cursor_invoke(bContext *C, wmOperator *, const wmEvent *)
static wmOperatorStatus edbm_polybuild_split_at_cursor_invoke(bContext *C, wmOperator *, const wmEvent *event)
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 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 wmOperatorStatus edbm_polybuild_delete_at_cursor_invoke(bContext *C, wmOperator *op, const wmEvent *)
static wmOperatorStatus edbm_polybuild_face_at_cursor_invoke(bContext *C, wmOperator *op, const wmEvent *event)
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)
static wmOperatorStatus edbm_polybuild_dissolve_at_cursor_invoke(bContext *C, wmOperator *op, const wmEvent *)
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)
ARegionRuntimeHandle * runtime
ObjectRuntimeHandle * runtime
struct ToolSettings * toolsettings
void WM_event_add_mousemove(wmWindow *win)
bool WM_gizmo_context_check_drawstep(const bContext *C, eWM_GizmoFlagMapDrawStep step)
wmGizmoGroup * WM_gizmomap_group_find(wmGizmoMap *gzmap, const char *idname)