diff options
-rw-r--r-- | source/blender/blenkernel/intern/attribute_access.cc | 5 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/customdata.cc | 1 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/displist.cc | 5 | ||||
-rw-r--r-- | source/blender/modifiers/intern/MOD_ui_common.c | 27 |
4 files changed, 33 insertions, 5 deletions
diff --git a/source/blender/blenkernel/intern/attribute_access.cc b/source/blender/blenkernel/intern/attribute_access.cc index 544427cfdd3..e5c43a3f90e 100644 --- a/source/blender/blenkernel/intern/attribute_access.cc +++ b/source/blender/blenkernel/intern/attribute_access.cc @@ -247,11 +247,8 @@ static bool add_custom_data_layer_from_attribute_init(const AttributeIDRef &attr } case AttributeInit::Type::MoveArray: { void *source_data = static_cast<const AttributeInitMoveArray &>(initializer).data; - void *data = add_generic_custom_data_layer( + add_generic_custom_data_layer( custom_data, data_type, CD_ASSIGN, source_data, domain_num, attribute_id); - if (source_data != nullptr && data == nullptr) { - MEM_freeN(source_data); - } break; } } diff --git a/source/blender/blenkernel/intern/customdata.cc b/source/blender/blenkernel/intern/customdata.cc index 75f41dae8d3..8b791eb4a00 100644 --- a/source/blender/blenkernel/intern/customdata.cc +++ b/source/blender/blenkernel/intern/customdata.cc @@ -2800,6 +2800,7 @@ static CustomDataLayer *customData_add_layer__internal(CustomData *data, int flag = 0; if (!typeInfo->defaultname && CustomData_has_layer(data, type)) { + MEM_SAFE_FREE(layerdata); return &data->layers[CustomData_get_layer_index(data, type)]; } diff --git a/source/blender/blenkernel/intern/displist.cc b/source/blender/blenkernel/intern/displist.cc index 2b4bd3eb8f6..f8117a89198 100644 --- a/source/blender/blenkernel/intern/displist.cc +++ b/source/blender/blenkernel/intern/displist.cc @@ -532,6 +532,11 @@ static ModifierData *curve_get_tessellate_point(const Scene *scene, return pretessellatePoint; } + if (md->type == eModifierType_Smooth) { + /* Smooth modifier works with mesh edges explicitly (so needs tesselation, thus cannnot work on control points). */ + md->mode &= ~eModifierMode_ApplyOnSpline; + return pretessellatePoint; + } if (ELEM(md->type, eModifierType_Hook, eModifierType_Softbody, eModifierType_MeshDeform)) { pretessellatePoint = md; diff --git a/source/blender/modifiers/intern/MOD_ui_common.c b/source/blender/modifiers/intern/MOD_ui_common.c index c027cae8cdb..e882435077a 100644 --- a/source/blender/modifiers/intern/MOD_ui_common.c +++ b/source/blender/modifiers/intern/MOD_ui_common.c @@ -326,8 +326,33 @@ static void modifier_panel_header(const bContext *C, Panel *panel) } } /* Tessellation point for curve-typed objects. */ else if (ELEM(ob->type, OB_CURVES_LEGACY, OB_SURF, OB_FONT)) { + /* Smooth modifier can work with tessellated curves only (works on mesh edges explicitly). */ + if (md->type == eModifierType_Smooth) { + /* Add button (appearing to be OFF) and add tip why this can't be changed. */ + sub = uiLayoutRow(row, true); + uiBlock *block = uiLayoutGetBlock(sub); + static int apply_on_spline_always_off_hack = 0; + uiBut *but = uiDefIconButBitI(block, + UI_BTYPE_TOGGLE, + eModifierMode_ApplyOnSpline, + 0, + ICON_SURFACE_DATA, + 0, + 0, + UI_UNIT_X - 2, + UI_UNIT_Y, + &apply_on_spline_always_off_hack, + 0.0, + 0.0, + 0.0, + 0.0, + TIP_("Apply on Spline")); + UI_but_disable( + but, TIP_("This modifier can only deform filled curve/surface, not the control points")); + buttons_number++; + } /* Some modifiers can work with pre-tessellated curves only. */ - if (ELEM(md->type, eModifierType_Hook, eModifierType_Softbody, eModifierType_MeshDeform)) { + else if (ELEM(md->type, eModifierType_Hook, eModifierType_Softbody, eModifierType_MeshDeform)) { /* Add button (appearing to be ON) and add tip why this can't be changed. */ sub = uiLayoutRow(row, true); uiBlock *block = uiLayoutGetBlock(sub); |