30#include "RNA_prototypes.hh"
51#define MVAL_PIXEL_MARGIN 5.0f
53#define PROFILE_HARD_MIN 0.0f
55#define SEGMENTS_HARD_MAX 1000
59#define OFFSET_VALUE_PERCENT 1
60#define PROFILE_VALUE 2
61#define SEGMENTS_VALUE 3
62#define NUM_VALUE_KINDS 4
65 "offset",
"offset_pct",
"profile",
"segments"};
145 const char *mode_str, *omiter_str, *imiter_str, *vmesh_str, *profile_type_str, *affect_str;
152 const std::string header_status = fmt::format(
"{}: {}, {}: {}, {}: {}",
213 desc = fmt::format(
"{} ({}) ",
IFACE_(
"Affect"), affect_str);
216 desc = fmt::format(
"{} ({}) ",
IFACE_(
"Outer"), omiter_str);
219 desc = fmt::format(
"{} ({}) ",
IFACE_(
"Inner"), imiter_str);
222 desc = fmt::format(
"{} ({}) ",
IFACE_(
"Profile Type"), profile_type_str);
225 desc = fmt::format(
"{} ({}) ",
IFACE_(
"Intersection"), vmesh_str);
241 op->
customdata = MEM_new<BevelData>(__func__);
253 scene, view_layer, v3d);
254 for (
Object *obedit : objects) {
255 float scale =
mat4_to_scale(obedit->object_to_world().ptr());
268 float pixels_per_inch =
U.dpi;
312 bool changed_multi =
false;
326 const int face_strength_mode =
RNA_enum_get(op->
ptr,
"face_strength_mode");
341 const int material = std::clamp(material_init, -1, obedit->
totcol - 1);
346 "bevel geom=%hev offset=%f segments=%i affect=%i offset_type=%i "
347 "profile_type=%i profile=%f clamp_overlap=%b material=%i loop_slide=%b "
348 "mark_seam=%b mark_sharp=%b harden_normals=%b face_strength_mode=%i "
349 "miter_outer=%i miter_inner=%i spread=%f custom_profile=%p "
373 if (offset != 0.0f) {
392 bool changed =
false;
404 params.calc_looptris =
true;
405 params.calc_normals =
true;
406 params.is_destructive =
true;
410 changed_multi |= changed;
412 return changed_multi;
455 params.calc_looptris =
false;
456 params.calc_normals =
true;
457 params.is_destructive =
true;
488 const float mlen[2] = {
489 opdata->
mcenter[0] -
event->mval[0],
490 opdata->
mcenter[1] -
event->mval[1],
500 float sc = opdata->
scale[vmode];
557 const float mdiff[2] = {
558 opdata->
mcenter[0] -
event->mval[0],
559 opdata->
mcenter[1] -
event->mval[1],
620 "OFFSET_MODE_CHANGE",
622 "Change Offset Mode",
623 "Cycle through offset modes"},
625 "CLAMP_OVERLAP_TOGGLE",
627 "Toggle Clamp Overlap",
628 "Toggle clamp overlap flag"},
632 "Change Affect Type",
633 "Change which geometry type the operation affects, edges or vertices"},
635 "HARDEN_NORMALS_TOGGLE",
637 "Toggle Harden Normals",
638 "Toggle harden normals flag"},
643 "Toggle mark seam flag"},
648 "Toggle mark sharp flag"},
650 "OUTER_MITER_CHANGE",
652 "Change Outer Miter",
653 "Cycle through outer miter kinds"},
655 "INNER_MITER_CHANGE",
657 "Change Inner Miter",
658 "Cycle through inner miter kinds"},
661 "VERTEX_MESH_CHANGE",
663 "Change Intersection Method",
664 "Cycle through intersection methods"},
665 {0,
nullptr, 0,
nullptr,
nullptr},
686 bool handled =
false;
687 short etype =
event->type;
688 short eval =
event->val;
715 float delta = 0.02f * (
event->xy[1] -
event->prev_xy[1]);
928 row = &layout->
row(
false);
948 IFACE_(
"Miter Profile Shape"),
983 row = &layout->
row(
false);
999 {
BEVEL_AMT_OFFSET,
"OFFSET", 0,
"Offset",
"Amount is offset of new edges from original"},
1000 {
BEVEL_AMT_WIDTH,
"WIDTH", 0,
"Width",
"Amount is width of new face"},
1005 "Amount is perpendicular distance from original edge to bevel face"},
1006 {
BEVEL_AMT_PERCENT,
"PERCENT", 0,
"Percent",
"Amount is percent of adjacent edge length"},
1011 "Amount is absolute distance along adjacent edge"},
1012 {0,
nullptr, 0,
nullptr,
nullptr},
1020 "The profile can be a concave or convex curve"},
1025 "The profile can be any arbitrary path between its endpoints"},
1026 {0,
nullptr, 0,
nullptr,
nullptr},
1036 "Set face strength on new and modified faces only"},
1038 {0,
nullptr, 0,
nullptr,
nullptr},
1043 {
BEVEL_MITER_PATCH,
"PATCH", 0,
"Patch",
"Outside of miter is squared-off patch"},
1045 {0,
nullptr, 0,
nullptr,
nullptr},
1051 {0,
nullptr, 0,
nullptr,
nullptr},
1060 "A cutoff at each profile's end before the intersection"},
1061 {0,
nullptr, 0,
nullptr,
nullptr},
1067 {0,
nullptr, 0,
nullptr,
nullptr},
1072 ot->description =
"Cut into selected items at an angle to create bevel or chamfer";
1073 ot->idname =
"MESH_OT_bevel";
1092 "The method for determining the size of the bevel");
1100 prop_profile_type_items,
1103 "The type of shape used to rebuild a beveled section");
1115 "Segments for curved edge",
1125 "Controls profile shape (0.5 = round)",
1134 "Affect edges or vertices");
1140 "Do not allow beveled edges/vertices to overlap each other");
1143 ot->srna,
"loop_slide",
true,
"Loop Slide",
"Prefer sliding along edges to even widths");
1146 ot->srna,
"mark_seam",
false,
"Mark Seams",
"Preserve seams along beveled edges");
1148 ot->srna,
"mark_sharp",
false,
"Mark Sharp",
"Preserve sharp edges along beveled edges");
1156 "Material for bevel faces (-1 means use adjacent faces)",
1164 "Match normals of new faces to adjacent faces");
1167 "face_strength_mode",
1168 face_strength_mode_items,
1170 "Face Strength Mode",
1171 "Whether to set face strength, and which faces to set face strength on");
1178 "Pattern to use for outside of miters");
1185 "Pattern to use for inside of miters");
1193 "Amount to spread arcs for arc inner miters",
1201 "Vertex Mesh Method",
1202 "The method to use to create meshes at intersections");
1204 prop =
RNA_def_boolean(
ot->srna,
"release_confirm",
false,
"Confirm on Release",
"");
ScrArea * CTX_wm_area(const bContext *C)
Scene * CTX_data_scene(const bContext *C)
ToolSettings * CTX_data_tool_settings(const bContext *C)
RegionView3D * CTX_wm_region_view3d(const bContext *C)
ARegion * CTX_wm_region(const bContext *C)
View3D * CTX_wm_view3d(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.
blender::Vector< Object * > BKE_view_layer_array_from_objects_in_edit_mode_unique_data(const Scene *scene, ViewLayer *view_layer, const View3D *v3d)
size_t BKE_unit_value_as_string_scaled(char *str, int str_maxncpy, double value, int prec, int type, const UnitSettings &settings, bool pad)
MINLINE float max_ff(float a, float b)
float mat4_to_scale(const float mat[4][4])
MINLINE float len_v2(const float v[2]) ATTR_WARN_UNUSED_RESULT
#define SNPRINTF_UTF8(dst, format,...)
Object is a sort of wrapper for general info.
@ V3D_AROUND_CENTER_MEDIAN
void EDBM_flag_disable_all(BMEditMesh *em, char hflag)
void void EDBM_redo_state_restore_and_free(BMBackup *backup, BMEditMesh *em, bool recalc_looptris) ATTR_NONNULL(1
void EDBM_update(Mesh *mesh, const EDBMUpdate_Params *params)
bool EDBM_uvselect_clear(BMEditMesh *em)
void void void EDBM_redo_state_free(BMBackup *backup) ATTR_NONNULL(1)
bool EDBM_automerge_connected(Object *obedit, bool update, char hflag, float dist)
void EDBM_selectmode_flush(BMEditMesh *em)
BMBackup EDBM_redo_state_store(BMEditMesh *em)
void EDBM_redo_state_restore(BMBackup *backup, BMEditMesh *em, bool recalc_looptris) ATTR_NONNULL(1
void ED_area_status_text(ScrArea *area, const char *str)
void ED_workspace_status_text(bContext *C, const char *str)
bool ED_operator_editmesh(bContext *C)
void ED_region_tag_redraw(ARegion *region)
void * ED_region_draw_cb_activate(ARegionType *art, void(*draw)(const bContext *, ARegion *, void *), void *customdata, int type)
bool ED_region_draw_cb_exit(ARegionType *art, void *handle)
#define REGION_DRAW_POST_PIXEL
void ED_region_draw_mouse_line_cb(const bContext *C, ARegion *region, void *arg_info)
float ED_view3d_pixel_size(const RegionView3D *rv3d, const float co[3])
Read Guarded memory(de)allocation.
void uiTemplateCurveProfile(uiLayout *layout, PointerRNA *ptr, blender::StringRefNull propname)
void BM_mesh_select_mode_flush_ex(BMesh *bm, const short selectmode, BMSelectFlushFlag flag)
Select Mode Flush.
void BMO_slot_buffer_hflag_enable(BMesh *bm, BMOpSlot slot_args[BMO_OP_MAX_SLOTS], const char *slot_name, char htype, char hflag, bool do_flush)
BMO_FLAG_BUFFER.
void BMO_op_exec(BMesh *bm, BMOperator *op)
BMESH OPSTACK EXEC OP.
@ BEVEL_FACE_STRENGTH_NONE
@ BEVEL_FACE_STRENGTH_AFFECTED
@ BEVEL_FACE_STRENGTH_NEW
@ BEVEL_FACE_STRENGTH_ALL
@ BEVEL_PROFILE_SUPERELLIPSE
static wmOperatorStatus edbm_bevel_exec(bContext *C, wmOperator *op)
static const float value_clamp_max[NUM_VALUE_KINDS]
static void edbm_bevel_cancel(bContext *C, wmOperator *op)
static void edbm_bevel_mouse_set_value(wmOperator *op, const wmEvent *event)
static void edbm_bevel_ui(bContext *C, wmOperator *op)
static void edbm_bevel_exit(bContext *C, wmOperator *op)
static void edbm_bevel_update_status_text(bContext *C, wmOperator *op)
static const float value_start[NUM_VALUE_KINDS]
static wmOperatorStatus edbm_bevel_modal(bContext *C, wmOperator *op, const wmEvent *event)
static bool edbm_bevel_init(bContext *C, wmOperator *op, const bool is_modal)
static const float value_clamp_min[NUM_VALUE_KINDS]
#define OFFSET_VALUE_PERCENT
static float get_bevel_offset(wmOperator *op)
wmKeyMap * bevel_modal_keymap(wmKeyConfig *keyconf)
static void edbm_bevel_numinput_set_value(wmOperator *op)
@ BEV_MODAL_PROFILE_TYPE_CHANGE
@ BEV_MODAL_MARK_SHARP_TOGGLE
@ BEV_MODAL_AFFECT_CHANGE
@ BEV_MODAL_HARDEN_NORMALS_TOGGLE
@ BEV_MODAL_VERTEX_MESH_CHANGE
@ BEV_MODAL_OFFSET_MODE_CHANGE
@ BEV_MODAL_SEGMENTS_DOWN
@ BEV_MODAL_INNER_MITER_CHANGE
@ BEV_MODAL_MARK_SEAM_TOGGLE
@ BEV_MODAL_VALUE_SEGMENTS
@ BEV_MODAL_OUTER_MITER_CHANGE
@ BEV_MODAL_CLAMP_OVERLAP_TOGGLE
@ BEV_MODAL_VALUE_PROFILE
void MESH_OT_bevel(wmOperatorType *ot)
static const char * value_rna_name[NUM_VALUE_KINDS]
static wmOperatorStatus edbm_bevel_invoke(bContext *C, wmOperator *op, const wmEvent *event)
#define SEGMENTS_HARD_MAX
static void edbm_bevel_calc_initial_length(wmOperator *op, const wmEvent *event, bool mode_changed)
#define MVAL_PIXEL_MARGIN
static bool edbm_bevel_calc(wmOperator *op)
static const float value_scale_per_inch[NUM_VALUE_KINDS]
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)
PropertyRNA * RNA_struct_find_property(PointerRNA *ptr, const char *identifier)
void RNA_boolean_set(PointerRNA *ptr, const char *name, bool value)
void RNA_int_set(PointerRNA *ptr, const char *name, int value)
bool RNA_property_enum_name_gettexted(bContext *C, PointerRNA *ptr, PropertyRNA *prop, const int value, const char **r_name)
int RNA_int_get(PointerRNA *ptr, const char *name)
float RNA_float_get(PointerRNA *ptr, const char *name)
void RNA_float_set(PointerRNA *ptr, const char *name, float value)
int RNA_property_enum_get(PointerRNA *ptr, PropertyRNA *prop)
bool RNA_boolean_get(PointerRNA *ptr, const char *name)
void RNA_enum_set(PointerRNA *ptr, const char *name, int value)
PointerRNA RNA_pointer_create_discrete(ID *id, StructRNA *type, void *data)
int RNA_enum_get(PointerRNA *ptr, const char *name)
void RNA_def_property_ui_text(PropertyRNA *prop, const char *name, const char *description)
PropertyRNA * RNA_def_float(StructOrFunctionRNA *cont_, const char *identifier, const float default_value, const float hardmin, const float hardmax, const char *ui_name, const char *ui_description, const float softmin, const float softmax)
PropertyRNA * RNA_def_enum(StructOrFunctionRNA *cont_, const char *identifier, const EnumPropertyItem *items, const int default_value, const char *ui_name, const char *ui_description)
void RNA_def_property_range(PropertyRNA *prop, double min, double max)
PropertyRNA * RNA_def_property(StructOrFunctionRNA *cont_, const char *identifier, int type, int subtype)
PropertyRNA * RNA_def_boolean(StructOrFunctionRNA *cont_, const char *identifier, const bool default_value, const char *ui_name, const char *ui_description)
void RNA_def_property_flag(PropertyRNA *prop, PropertyFlag flag)
void RNA_def_property_ui_range(PropertyRNA *prop, double min, double max, double step, int precision)
PropertyRNA * RNA_def_int(StructOrFunctionRNA *cont_, const char *identifier, const int default_value, const int hardmin, const int hardmax, const char *ui_name, const char *ui_description, const int softmin, const int softmax)
ARegionRuntimeHandle * runtime
struct BMOpSlot slots_out[BMO_OP_MAX_SLOTS]
double automerge_threshold
float shift_value[NUM_VALUE_KINDS]
Vector< BevelObjectStore > ob_store
NumInput num_input[NUM_VALUE_KINDS]
CurveProfile * custom_profile
float scale[NUM_VALUE_KINDS]
float initial_length[NUM_VALUE_KINDS]
struct ToolSettings * toolsettings
void use_property_decorate_set(bool is_sep)
uiLayout & column(bool align)
void separator(float factor=1.0f, LayoutSeparatorType type=LayoutSeparatorType::Auto)
uiLayout & row(bool align)
void use_property_split_set(bool value)
void prop(PointerRNA *ptr, PropertyRNA *prop, int index, int value, eUI_Item_Flag flag, std::optional< blender::StringRef > name_opt, int icon, std::optional< blender::StringRef > placeholder=std::nullopt)
wmEventModifierFlag modifier
struct wmOperatorType * type
int WM_userdef_event_type_from_keymap_type(int kmitype)
wmEventHandler_Op * WM_event_add_modal_handler(bContext *C, wmOperator *op)
wmKeyMap * WM_modalkeymap_ensure(wmKeyConfig *keyconf, const char *idname, const EnumPropertyItem *items)
void WM_modalkeymap_assign(wmKeyMap *km, const char *opname)
wmKeyMap * WM_modalkeymap_find(wmKeyConfig *keyconf, const char *idname)