diff options
Diffstat (limited to 'source/blender/editors/mesh/editmesh_bevel.c')
-rw-r--r-- | source/blender/editors/mesh/editmesh_bevel.c | 263 |
1 files changed, 211 insertions, 52 deletions
diff --git a/source/blender/editors/mesh/editmesh_bevel.c b/source/blender/editors/mesh/editmesh_bevel.c index 7afd72f33c9..acdf667b410 100644 --- a/source/blender/editors/mesh/editmesh_bevel.c +++ b/source/blender/editors/mesh/editmesh_bevel.c @@ -33,8 +33,10 @@ #include "BKE_unit.h" #include "BKE_layer.h" #include "BKE_mesh.h" +#include "BKE_curveprofile.h" #include "DNA_mesh_types.h" +#include "DNA_curveprofile_types.h" #include "RNA_define.h" #include "RNA_access.h" @@ -43,6 +45,7 @@ #include "WM_types.h" #include "UI_interface.h" +#include "UI_resources.h" #include "ED_mesh.h" #include "ED_numinput.h" @@ -96,6 +99,8 @@ typedef struct { short gizmo_flag; short value_mode; /* Which value does mouse movement and numeric input affect? */ float segments; /* Segments as float so smooth mouse pan works in small increments */ + + CurveProfile *custom_profile; } BevelData; enum { @@ -114,6 +119,8 @@ enum { BEV_MODAL_MARK_SHARP_TOGGLE, BEV_MODAL_OUTER_MITER_CHANGE, BEV_MODAL_INNER_MITER_CHANGE, + BEV_MODAL_CUSTOM_PROFILE_TOGGLE, + BEV_MODAL_VERTEX_MESH_CHANGE, }; static float get_bevel_offset(wmOperator *op) @@ -129,15 +136,15 @@ static float get_bevel_offset(wmOperator *op) return val; } -static void edbm_bevel_update_header(bContext *C, wmOperator *op) +static void edbm_bevel_update_status_text(bContext *C, wmOperator *op) { - char header[UI_MAX_DRAW_STR]; + char status_text[UI_MAX_DRAW_STR]; char buf[UI_MAX_DRAW_STR]; char *p = buf; int available_len = sizeof(buf); Scene *sce = CTX_data_scene(C); char offset_str[NUM_STR_REP_LEN]; - const char *mode_str, *omiter_str, *imiter_str; + const char *mode_str, *omiter_str, *imiter_str, *vmesh_str; PropertyRNA *prop; #define WM_MODALKEY(_id) \ @@ -167,22 +174,27 @@ static void edbm_bevel_update_header(bContext *C, wmOperator *op) prop = RNA_struct_find_property(op->ptr, "miter_inner"); RNA_property_enum_name_gettexted( C, op->ptr, prop, RNA_property_enum_get(op->ptr, prop), &imiter_str); - - BLI_snprintf(header, - sizeof(header), - TIP_("%s: confirm, " - "%s: cancel, " - "%s: mode (%s), " - "%s: width (%s), " - "%s: segments (%d), " - "%s: profile (%.3f), " - "%s: clamp overlap (%s), " - "%s: vertex only (%s), " - "%s: outer miter (%s), " - "%s: inner miter (%s), " - "%s: harden normals (%s), " - "%s: mark seam (%s), " - "%s: mark sharp (%s)"), + prop = RNA_struct_find_property(op->ptr, "vmesh_method"); + RNA_property_enum_name_gettexted( + C, op->ptr, prop, RNA_property_enum_get(op->ptr, prop), &vmesh_str); + + BLI_snprintf(status_text, + sizeof(status_text), + TIP_("%s: Confirm, " + "%s: Cancel, " + "%s: Mode (%s), " + "%s: Width (%s), " + "%s: Segments (%d), " + "%s: Profile (%.3f), " + "%s: Clamp Overlap (%s), " + "%s: Vertex Only (%s), " + "%s: Outer Miter (%s), " + "%s: Inner Miter (%s), " + "%s: Harden Normals (%s), " + "%s: Mark Seam (%s), " + "%s: Mark Sharp (%s), " + "%s: Custom Profile (%s), " + "%s: Intersection (%s)"), WM_MODALKEY(BEV_MODAL_CONFIRM), WM_MODALKEY(BEV_MODAL_CANCEL), WM_MODALKEY(BEV_MODAL_OFFSET_MODE_CHANGE), @@ -206,16 +218,21 @@ static void edbm_bevel_update_header(bContext *C, wmOperator *op) WM_MODALKEY(BEV_MODAL_MARK_SEAM_TOGGLE), WM_bool_as_string(RNA_boolean_get(op->ptr, "mark_seam")), WM_MODALKEY(BEV_MODAL_MARK_SHARP_TOGGLE), - WM_bool_as_string(RNA_boolean_get(op->ptr, "mark_sharp"))); + WM_bool_as_string(RNA_boolean_get(op->ptr, "mark_sharp")), + WM_MODALKEY(BEV_MODAL_CUSTOM_PROFILE_TOGGLE), + WM_bool_as_string(RNA_boolean_get(op->ptr, "use_custom_profile")), + WM_MODALKEY(BEV_MODAL_VERTEX_MESH_CHANGE), + vmesh_str); #undef WM_MODALKEY - ED_workspace_status_text(C, header); + ED_workspace_status_text(C, status_text); } static bool edbm_bevel_init(bContext *C, wmOperator *op, const bool is_modal) { Scene *scene = CTX_data_scene(C); + ToolSettings *ts = CTX_data_tool_settings(C); BevelData *opdata; ViewLayer *view_layer = CTX_data_view_layer(C); float pixels_per_inch; @@ -230,6 +247,9 @@ static bool edbm_bevel_init(bContext *C, wmOperator *op, const bool is_modal) uint objects_used_len = 0; opdata->max_obj_scale = FLT_MIN; + /* Put the Curve Profile from the toolsettings into the opdata struct */ + opdata->custom_profile = ts->custom_bevel_profile_preset; + { uint ob_store_len = 0; Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data( @@ -318,6 +338,8 @@ static bool edbm_bevel_calc(wmOperator *op) const int miter_outer = RNA_enum_get(op->ptr, "miter_outer"); const int miter_inner = RNA_enum_get(op->ptr, "miter_inner"); const float spread = RNA_float_get(op->ptr, "spread"); + const bool use_custom_profile = RNA_boolean_get(op->ptr, "use_custom_profile"); + const int vmesh_method = RNA_enum_get(op->ptr, "vmesh_method"); for (uint ob_index = 0; ob_index < opdata->ob_store_len; ob_index++) { em = opdata->ob_store[ob_index].em; @@ -344,7 +366,8 @@ static bool edbm_bevel_calc(wmOperator *op) "bevel geom=%hev offset=%f segments=%i vertex_only=%b offset_type=%i profile=%f " "clamp_overlap=%b material=%i loop_slide=%b mark_seam=%b mark_sharp=%b " "harden_normals=%b face_strength_mode=%i " - "miter_outer=%i miter_inner=%i spread=%f smoothresh=%f", + "miter_outer=%i miter_inner=%i spread=%f smoothresh=%f use_custom_profile=%b " + "custom_profile=%p vmesh_method=%i", BM_ELEM_SELECT, offset, segments, @@ -361,7 +384,10 @@ static bool edbm_bevel_calc(wmOperator *op) miter_outer, miter_inner, spread, - me->smoothresh); + me->smoothresh, + use_custom_profile, + opdata->custom_profile, + vmesh_method); BMO_op_exec(em->bm, &bmop); @@ -389,7 +415,6 @@ static bool edbm_bevel_calc(wmOperator *op) static void edbm_bevel_exit(bContext *C, wmOperator *op) { BevelData *opdata = op->customdata; - ScrArea *sa = CTX_wm_area(C); if (sa) { @@ -430,7 +455,7 @@ static void edbm_bevel_cancel(bContext *C, wmOperator *op) ED_region_tag_redraw(CTX_wm_region(C)); } -/* bevel! yay!!*/ +/* bevel! yay!! */ static int edbm_bevel_exec(bContext *C, wmOperator *op) { if (!edbm_bevel_init(C, op, false)) { @@ -500,7 +525,7 @@ static int edbm_bevel_invoke(bContext *C, wmOperator *op, const wmEvent *event) edbm_bevel_calc_initial_length(op, event, false); - edbm_bevel_update_header(C, op); + edbm_bevel_update_status_text(C, op); if (!edbm_bevel_calc(op)) { edbm_bevel_cancel(C, op); @@ -598,13 +623,9 @@ wmKeyMap *bevel_modal_keymap(wmKeyConfig *keyconf) static const EnumPropertyItem modal_items[] = { {BEV_MODAL_CANCEL, "CANCEL", 0, "Cancel", "Cancel bevel"}, {BEV_MODAL_CONFIRM, "CONFIRM", 0, "Confirm", "Confirm bevel"}, - {BEV_MODAL_VALUE_OFFSET, "VALUE_OFFSET", 0, "Value is offset", "Value changes offset"}, - {BEV_MODAL_VALUE_PROFILE, "VALUE_PROFILE", 0, "Value is profile", "Value changes profile"}, - {BEV_MODAL_VALUE_SEGMENTS, - "VALUE_SEGMENTS", - 0, - "Value is segments", - "Value changes segments"}, + {BEV_MODAL_VALUE_OFFSET, "VALUE_OFFSET", 0, "Change offset", "Value changes offset"}, + {BEV_MODAL_VALUE_PROFILE, "VALUE_PROFILE", 0, "Change profile", "Value changes profile"}, + {BEV_MODAL_VALUE_SEGMENTS, "VALUE_SEGMENTS", 0, "Change segments", "Value changes segments"}, {BEV_MODAL_SEGMENTS_UP, "SEGMENTS_UP", 0, "Increase segments", "Increase segments"}, {BEV_MODAL_SEGMENTS_DOWN, "SEGMENTS_DOWN", 0, "Decrease segments", "Decrease segments"}, {BEV_MODAL_OFFSET_MODE_CHANGE, @@ -647,12 +668,18 @@ wmKeyMap *bevel_modal_keymap(wmKeyConfig *keyconf) 0, "Change inner miter", "Cycle through inner miter kinds"}, + {BEV_MODAL_CUSTOM_PROFILE_TOGGLE, "CUSTOM_PROFILE_TOGGLE", 0, "Toggle custom profile", ""}, + {BEV_MODAL_VERTEX_MESH_CHANGE, + "VERTEX_MESH_CHANGE", + 0, + "Change intersection method", + "Cycle through intersection methods"}, {0, NULL, 0, NULL, NULL}, }; wmKeyMap *keymap = WM_modalkeymap_get(keyconf, "Bevel Modal Map"); - /* this function is called for each spacetype, only needs to add map once */ + /* This function is called for each spacetype, only needs to add map once */ if (keymap && keymap->modal_items) { return NULL; } @@ -682,14 +709,14 @@ static int edbm_bevel_modal(bContext *C, wmOperator *op, const wmEvent *event) handleNumInput(C, &opdata->num_input[opdata->value_mode], event)) { edbm_bevel_numinput_set_value(op); edbm_bevel_calc(op); - edbm_bevel_update_header(C, op); + edbm_bevel_update_status_text(C, op); return OPERATOR_RUNNING_MODAL; } else if (etype == MOUSEMOVE) { if (!has_numinput) { edbm_bevel_mouse_set_value(op, event); edbm_bevel_calc(op); - edbm_bevel_update_header(C, op); + edbm_bevel_update_status_text(C, op); handled = true; } } @@ -703,7 +730,7 @@ static int edbm_bevel_modal(bContext *C, wmOperator *op, const wmEvent *event) } RNA_int_set(op->ptr, "segments", (int)opdata->segments); edbm_bevel_calc(op); - edbm_bevel_update_header(C, op); + edbm_bevel_update_status_text(C, op); handled = true; } else if (etype == EVT_MODAL_MAP) { @@ -723,7 +750,7 @@ static int edbm_bevel_modal(bContext *C, wmOperator *op, const wmEvent *event) opdata->segments = opdata->segments + 1; RNA_int_set(op->ptr, "segments", (int)opdata->segments); edbm_bevel_calc(op); - edbm_bevel_update_header(C, op); + edbm_bevel_update_status_text(C, op); handled = true; break; @@ -731,7 +758,7 @@ static int edbm_bevel_modal(bContext *C, wmOperator *op, const wmEvent *event) opdata->segments = max_ff(opdata->segments - 1, 1); RNA_int_set(op->ptr, "segments", (int)opdata->segments); edbm_bevel_calc(op); - edbm_bevel_update_header(C, op); + edbm_bevel_update_status_text(C, op); handled = true; break; @@ -758,7 +785,7 @@ static int edbm_bevel_modal(bContext *C, wmOperator *op, const wmEvent *event) edbm_bevel_mouse_set_value(op, event); } edbm_bevel_calc(op); - edbm_bevel_update_header(C, op); + edbm_bevel_update_status_text(C, op); handled = true; break; @@ -766,7 +793,7 @@ static int edbm_bevel_modal(bContext *C, wmOperator *op, const wmEvent *event) bool clamp_overlap = RNA_boolean_get(op->ptr, "clamp_overlap"); RNA_boolean_set(op->ptr, "clamp_overlap", !clamp_overlap); edbm_bevel_calc(op); - edbm_bevel_update_header(C, op); + edbm_bevel_update_status_text(C, op); handled = true; break; } @@ -790,7 +817,7 @@ static int edbm_bevel_modal(bContext *C, wmOperator *op, const wmEvent *event) bool vertex_only = RNA_boolean_get(op->ptr, "vertex_only"); RNA_boolean_set(op->ptr, "vertex_only", !vertex_only); edbm_bevel_calc(op); - edbm_bevel_update_header(C, op); + edbm_bevel_update_status_text(C, op); handled = true; break; } @@ -799,7 +826,7 @@ static int edbm_bevel_modal(bContext *C, wmOperator *op, const wmEvent *event) bool mark_seam = RNA_boolean_get(op->ptr, "mark_seam"); RNA_boolean_set(op->ptr, "mark_seam", !mark_seam); edbm_bevel_calc(op); - edbm_bevel_update_header(C, op); + edbm_bevel_update_status_text(C, op); handled = true; break; } @@ -808,7 +835,7 @@ static int edbm_bevel_modal(bContext *C, wmOperator *op, const wmEvent *event) bool mark_sharp = RNA_boolean_get(op->ptr, "mark_sharp"); RNA_boolean_set(op->ptr, "mark_sharp", !mark_sharp); edbm_bevel_calc(op); - edbm_bevel_update_header(C, op); + edbm_bevel_update_status_text(C, op); handled = true; break; } @@ -824,7 +851,7 @@ static int edbm_bevel_modal(bContext *C, wmOperator *op, const wmEvent *event) } RNA_enum_set(op->ptr, "miter_inner", miter_inner); edbm_bevel_calc(op); - edbm_bevel_update_header(C, op); + edbm_bevel_update_status_text(C, op); handled = true; break; } @@ -837,7 +864,7 @@ static int edbm_bevel_modal(bContext *C, wmOperator *op, const wmEvent *event) } RNA_enum_set(op->ptr, "miter_outer", miter_outer); edbm_bevel_calc(op); - edbm_bevel_update_header(C, op); + edbm_bevel_update_status_text(C, op); handled = true; break; } @@ -846,7 +873,29 @@ static int edbm_bevel_modal(bContext *C, wmOperator *op, const wmEvent *event) bool harden_normals = RNA_boolean_get(op->ptr, "harden_normals"); RNA_boolean_set(op->ptr, "harden_normals", !harden_normals); edbm_bevel_calc(op); - edbm_bevel_update_header(C, op); + edbm_bevel_update_status_text(C, op); + handled = true; + break; + } + + case BEV_MODAL_CUSTOM_PROFILE_TOGGLE: { + bool use_custom_profile = RNA_boolean_get(op->ptr, "use_custom_profile"); + RNA_boolean_set(op->ptr, "use_custom_profile", !use_custom_profile); + edbm_bevel_calc(op); + edbm_bevel_update_status_text(C, op); + handled = true; + break; + } + + case BEV_MODAL_VERTEX_MESH_CHANGE: { + int vmesh_method = RNA_enum_get(op->ptr, "vmesh_method"); + vmesh_method++; + if (vmesh_method > BEVEL_VMESH_CUTOFF) { + vmesh_method = BEVEL_VMESH_ADJ; + } + RNA_enum_set(op->ptr, "vmesh_method", vmesh_method); + edbm_bevel_calc(op); + edbm_bevel_update_status_text(C, op); handled = true; break; } @@ -858,13 +907,84 @@ static int edbm_bevel_modal(bContext *C, wmOperator *op, const wmEvent *event) handleNumInput(C, &opdata->num_input[opdata->value_mode], event)) { edbm_bevel_numinput_set_value(op); edbm_bevel_calc(op); - edbm_bevel_update_header(C, op); + edbm_bevel_update_status_text(C, op); return OPERATOR_RUNNING_MODAL; } return OPERATOR_RUNNING_MODAL; } +static void edbm_bevel_ui(bContext *C, wmOperator *op) +{ + uiLayout *layout = op->layout; + uiLayout *row, *col, *split; + PointerRNA ptr, toolsettings_ptr; + PropertyRNA *prop; + const char *offset_name; + + RNA_pointer_create(NULL, op->type->srna, op->properties, &ptr); + + if (RNA_enum_get(&ptr, "offset_type") == BEVEL_AMT_PERCENT) { + uiItemR(layout, &ptr, "offset_pct", 0, NULL, ICON_NONE); + } + else { + switch (RNA_enum_get(&ptr, "offset_type")) { + case BEVEL_AMT_DEPTH: + offset_name = "Depth"; + break; + case BEVEL_AMT_WIDTH: + offset_name = "Width"; + break; + case BEVEL_AMT_OFFSET: + offset_name = "Offset"; + break; + } + prop = RNA_struct_find_property(op->ptr, "offset_type"); + RNA_property_enum_name_gettexted( + C, op->ptr, prop, RNA_property_enum_get(op->ptr, prop), &offset_name); + uiItemR(layout, &ptr, "offset", 0, offset_name, ICON_NONE); + } + row = uiLayoutRow(layout, true); + uiItemR(row, &ptr, "offset_type", UI_ITEM_R_EXPAND, NULL, ICON_NONE); + + split = uiLayoutSplit(layout, 0.5f, true); + col = uiLayoutColumn(split, true); + uiItemR(col, &ptr, "vertex_only", 0, NULL, ICON_NONE); + uiItemR(col, &ptr, "clamp_overlap", 0, NULL, ICON_NONE); + uiItemR(col, &ptr, "loop_slide", 0, NULL, ICON_NONE); + col = uiLayoutColumn(split, true); + uiItemR(col, &ptr, "mark_seam", 0, NULL, ICON_NONE); + uiItemR(col, &ptr, "mark_sharp", 0, NULL, ICON_NONE); + uiItemR(col, &ptr, "harden_normals", 0, NULL, ICON_NONE); + + uiItemR(layout, &ptr, "segments", 0, NULL, ICON_NONE); + uiItemR(layout, &ptr, "profile", UI_ITEM_R_SLIDER, NULL, ICON_NONE); + uiItemR(layout, &ptr, "material", 0, NULL, ICON_NONE); + + uiItemL(layout, "Miter Type:", ICON_NONE); + uiItemR(layout, &ptr, "miter_outer", 0, "Outer", ICON_NONE); + uiItemR(layout, &ptr, "miter_inner", 0, "Inner", ICON_NONE); + if (RNA_enum_get(&ptr, "miter_inner") == BEVEL_MITER_ARC) { + uiItemR(layout, &ptr, "spread", 0, NULL, ICON_NONE); + } + + uiItemL(layout, "Face Strength Mode:", ICON_NONE); + row = uiLayoutRow(layout, true); + uiItemR(row, &ptr, "face_strength_mode", UI_ITEM_R_EXPAND, NULL, ICON_NONE); + + uiItemL(layout, "Intersection Type:", ICON_NONE); + row = uiLayoutRow(layout, true); + uiItemR(row, &ptr, "vmesh_method", UI_ITEM_R_EXPAND, NULL, ICON_NONE); + + uiItemR(layout, &ptr, "use_custom_profile", 0, NULL, ICON_NONE); + if (RNA_boolean_get(&ptr, "use_custom_profile")) { + /* Get an RNA pointer to ToolSettings to give to the curve profile template code */ + Scene *scene = CTX_data_scene(C); + RNA_pointer_create(&scene->id, &RNA_ToolSettings, scene->toolsettings, &toolsettings_ptr); + uiTemplateCurveProfile(layout, &toolsettings_ptr, "custom_bevel_profile_preset"); + } +} + void MESH_OT_bevel(wmOperatorType *ot) { PropertyRNA *prop; @@ -906,10 +1026,19 @@ void MESH_OT_bevel(wmOperatorType *ot) {0, NULL, 0, NULL, NULL}, }; + static EnumPropertyItem vmesh_method_items[] = { + {BEVEL_VMESH_ADJ, "ADJ", 0, "Grid Fill", "Default patterned fill"}, + {BEVEL_VMESH_CUTOFF, + "CUTOFF", + 0, + "Cutoff", + "A cut-off at each profile's end before the intersection"}, + {0, NULL, 0, NULL, NULL}, + }; + /* identifiers */ ot->name = "Bevel"; - ot->description = - "Cut into selected items at an angle to create flat or rounded bevel or chamfer"; + ot->description = "Cut into selected items at an angle to create bevel or chamfer"; ot->idname = "MESH_OT_bevel"; /* api callbacks */ @@ -919,19 +1048,23 @@ void MESH_OT_bevel(wmOperatorType *ot) ot->cancel = edbm_bevel_cancel; ot->poll = ED_operator_editmesh; ot->poll_property = edbm_bevel_poll_property; + ot->ui = edbm_bevel_ui; /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_GRAB_CURSOR_XY | OPTYPE_BLOCKING; + /* properties */ RNA_def_enum( ot->srna, "offset_type", offset_type_items, 0, "Width Type", "What distance Width measures"); prop = RNA_def_property(ot->srna, "offset", PROP_FLOAT, PROP_DISTANCE); RNA_def_property_range(prop, 0.0, 1e6); - RNA_def_property_ui_range(prop, 0.0f, 100.0, 1, 3); + RNA_def_property_ui_range(prop, 0.0, 100.0, 1, 3); RNA_def_property_ui_text(prop, "Width", "Bevel amount"); + prop = RNA_def_property(ot->srna, "offset_pct", PROP_FLOAT, PROP_PERCENTAGE); RNA_def_property_range(prop, 0.0, 100); RNA_def_property_ui_text(prop, "Width Percent", "Bevel amount for percentage method"); + RNA_def_int(ot->srna, "segments", 1, @@ -941,6 +1074,7 @@ void MESH_OT_bevel(wmOperatorType *ot) "Segments for curved edge", 1, 100); + RNA_def_float(ot->srna, "profile", 0.5f, @@ -950,16 +1084,22 @@ void MESH_OT_bevel(wmOperatorType *ot) "Controls profile shape (0.5 = round)", PROFILE_HARD_MIN, 1.0f); + RNA_def_boolean(ot->srna, "vertex_only", false, "Vertex Only", "Bevel only vertices"); + RNA_def_boolean(ot->srna, "clamp_overlap", false, "Clamp Overlap", "Do not allow beveled edges/vertices to overlap each other"); + RNA_def_boolean( - ot->srna, "loop_slide", true, "Loop Slide", "Prefer slide along edge to even widths"); + ot->srna, "loop_slide", true, "Loop Slide", "Prefer sliding along edges to even widths"); + RNA_def_boolean(ot->srna, "mark_seam", false, "Mark Seams", "Mark Seams along beveled edges"); + RNA_def_boolean(ot->srna, "mark_sharp", false, "Mark Sharp", "Mark beveled edges as sharp"); + RNA_def_int(ot->srna, "material", -1, @@ -969,29 +1109,34 @@ void MESH_OT_bevel(wmOperatorType *ot) "Material for bevel faces (-1 means use adjacent faces)", -1, 100); + RNA_def_boolean(ot->srna, "harden_normals", false, "Harden Normals", "Match normals of new faces to adjacent faces"); + RNA_def_enum(ot->srna, "face_strength_mode", face_strength_mode_items, BEVEL_FACE_STRENGTH_NONE, "Face Strength Mode", "Whether to set face strength, and which faces to set face strength on"); + RNA_def_enum(ot->srna, "miter_outer", miter_outer_items, BEVEL_MITER_SHARP, "Outer Miter", "Pattern to use for outside of miters"); + RNA_def_enum(ot->srna, "miter_inner", miter_inner_items, BEVEL_MITER_SHARP, "Inner Miter", "Pattern to use for inside of miters"); + RNA_def_float(ot->srna, "spread", 0.1f, @@ -1001,6 +1146,20 @@ void MESH_OT_bevel(wmOperatorType *ot) "Amount to spread arcs for arc inner miters", 0.0f, 100.0f); + + RNA_def_boolean(ot->srna, + "use_custom_profile", + false, + "Custom Profile", + "Use a custom profile for the bevel"); + + RNA_def_enum(ot->srna, + "vmesh_method", + vmesh_method_items, + BEVEL_VMESH_ADJ, + "Vertex Mesh Method", + "The method to use to create meshes at intersections"); + prop = RNA_def_boolean(ot->srna, "release_confirm", 0, "Confirm on Release", ""); RNA_def_property_flag(prop, PROP_HIDDEN | PROP_SKIP_SAVE); } |