diff options
author | Campbell Barton <ideasman42@gmail.com> | 2019-04-17 07:17:24 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2019-04-17 07:21:24 +0300 |
commit | e12c08e8d170b7ca40f204a5b0423c23a9fbc2c1 (patch) | |
tree | 8cf3453d12edb177a218ef8009357518ec6cab6a /source/blender/modifiers/intern/MOD_simpledeform.c | |
parent | b3dabc200a4b0399ec6b81f2ff2730d07b44fcaa (diff) |
ClangFormat: apply to source, most of intern
Apply clang format as proposed in T53211.
For details on usage and instructions for migrating branches
without conflicts, see:
https://wiki.blender.org/wiki/Tools/ClangFormat
Diffstat (limited to 'source/blender/modifiers/intern/MOD_simpledeform.c')
-rw-r--r-- | source/blender/modifiers/intern/MOD_simpledeform.c | 679 |
1 files changed, 353 insertions, 326 deletions
diff --git a/source/blender/modifiers/intern/MOD_simpledeform.c b/source/blender/modifiers/intern/MOD_simpledeform.c index 0ebeb1cd761..2434bd514f4 100644 --- a/source/blender/modifiers/intern/MOD_simpledeform.c +++ b/source/blender/modifiers/intern/MOD_simpledeform.c @@ -49,401 +49,428 @@ * exists because the deformations (excluding bend) are based on the Z axis. * Having this helps avoid long, drawn out switches. */ static const uint axis_map_table[3][3] = { - {1, 2, 0}, - {2, 0, 1}, - {0, 1, 2}, + {1, 2, 0}, + {2, 0, 1}, + {0, 1, 2}, }; BLI_INLINE void copy_v3_v3_map(float a[3], const float b[3], const uint map[3]) { - a[0] = b[map[0]]; - a[1] = b[map[1]]; - a[2] = b[map[2]]; + a[0] = b[map[0]]; + a[1] = b[map[1]]; + a[2] = b[map[2]]; } BLI_INLINE void copy_v3_v3_unmap(float a[3], const float b[3], const uint map[3]) { - a[map[0]] = b[0]; - a[map[1]] = b[1]; - a[map[2]] = b[2]; + a[map[0]] = b[0]; + a[map[1]] = b[1]; + a[map[2]] = b[2]; } /* Clamps/Limits the given coordinate to: limits[0] <= co[axis] <= limits[1] * The amount of clamp is saved on dcut */ static void axis_limit(const int axis, const float limits[2], float co[3], float dcut[3]) { - float val = co[axis]; - if (limits[0] > val) val = limits[0]; - if (limits[1] < val) val = limits[1]; - - dcut[axis] = co[axis] - val; - co[axis] = val; + float val = co[axis]; + if (limits[0] > val) + val = limits[0]; + if (limits[1] < val) + val = limits[1]; + + dcut[axis] = co[axis] - val; + co[axis] = val; } -static void simpleDeform_taper(const float factor, const int UNUSED(axis), const float dcut[3], float r_co[3]) +static void simpleDeform_taper(const float factor, + const int UNUSED(axis), + const float dcut[3], + float r_co[3]) { - float x = r_co[0], y = r_co[1], z = r_co[2]; - float scale = z * factor; + float x = r_co[0], y = r_co[1], z = r_co[2]; + float scale = z * factor; - r_co[0] = x + x * scale; - r_co[1] = y + y * scale; - r_co[2] = z; + r_co[0] = x + x * scale; + r_co[1] = y + y * scale; + r_co[2] = z; - add_v3_v3(r_co, dcut); + add_v3_v3(r_co, dcut); } -static void simpleDeform_stretch(const float factor, const int UNUSED(axis), const float dcut[3], float r_co[3]) +static void simpleDeform_stretch(const float factor, + const int UNUSED(axis), + const float dcut[3], + float r_co[3]) { - float x = r_co[0], y = r_co[1], z = r_co[2]; - float scale; + float x = r_co[0], y = r_co[1], z = r_co[2]; + float scale; - scale = (z * z * factor - factor + 1.0f); + scale = (z * z * factor - factor + 1.0f); - r_co[0] = x * scale; - r_co[1] = y * scale; - r_co[2] = z * (1.0f + factor); + r_co[0] = x * scale; + r_co[1] = y * scale; + r_co[2] = z * (1.0f + factor); - add_v3_v3(r_co, dcut); + add_v3_v3(r_co, dcut); } -static void simpleDeform_twist(const float factor, const int UNUSED(axis), const float *dcut, float r_co[3]) +static void simpleDeform_twist(const float factor, + const int UNUSED(axis), + const float *dcut, + float r_co[3]) { - float x = r_co[0], y = r_co[1], z = r_co[2]; - float theta, sint, cost; + float x = r_co[0], y = r_co[1], z = r_co[2]; + float theta, sint, cost; - theta = z * factor; - sint = sinf(theta); - cost = cosf(theta); + theta = z * factor; + sint = sinf(theta); + cost = cosf(theta); - r_co[0] = x * cost - y * sint; - r_co[1] = x * sint + y * cost; - r_co[2] = z; + r_co[0] = x * cost - y * sint; + r_co[1] = x * sint + y * cost; + r_co[2] = z; - add_v3_v3(r_co, dcut); + add_v3_v3(r_co, dcut); } -static void simpleDeform_bend(const float factor, const int axis, const float dcut[3], float r_co[3]) +static void simpleDeform_bend(const float factor, + const int axis, + const float dcut[3], + float r_co[3]) { - float x = r_co[0], y = r_co[1], z = r_co[2]; - float theta, sint, cost; - - BLI_assert(!(fabsf(factor) < BEND_EPS)); - - switch (axis) { - case 0: - ATTR_FALLTHROUGH; - case 1: - theta = z * factor; - break; - default: - theta = x * factor; - } - sint = sinf(theta); - cost = cosf(theta); - - switch (axis) { - case 0: - r_co[0] = x; - r_co[1] = (y - 1.0f / factor) * cost + 1.0f / factor; - r_co[2] = -(y - 1.0f / factor) * sint; - { - r_co[0] += dcut[0]; - r_co[1] += sint * dcut[2]; - r_co[2] += cost * dcut[2]; - } - break; - case 1: - r_co[0] = (x - 1.0f / factor) * cost + 1.0f / factor; - r_co[1] = y; - r_co[2] = -(x - 1.0f / factor) * sint; - { - r_co[0] += sint * dcut[2]; - r_co[1] += dcut[1]; - r_co[2] += cost * dcut[2]; - } - break; - default: - r_co[0] = -(y - 1.0f / factor) * sint; - r_co[1] = (y - 1.0f / factor) * cost + 1.0f / factor; - r_co[2] = z; - { - r_co[0] += cost * dcut[0]; - r_co[1] += sint * dcut[0]; - r_co[2] += dcut[2]; - } - } - + float x = r_co[0], y = r_co[1], z = r_co[2]; + float theta, sint, cost; + + BLI_assert(!(fabsf(factor) < BEND_EPS)); + + switch (axis) { + case 0: + ATTR_FALLTHROUGH; + case 1: + theta = z * factor; + break; + default: + theta = x * factor; + } + sint = sinf(theta); + cost = cosf(theta); + + switch (axis) { + case 0: + r_co[0] = x; + r_co[1] = (y - 1.0f / factor) * cost + 1.0f / factor; + r_co[2] = -(y - 1.0f / factor) * sint; + { + r_co[0] += dcut[0]; + r_co[1] += sint * dcut[2]; + r_co[2] += cost * dcut[2]; + } + break; + case 1: + r_co[0] = (x - 1.0f / factor) * cost + 1.0f / factor; + r_co[1] = y; + r_co[2] = -(x - 1.0f / factor) * sint; + { + r_co[0] += sint * dcut[2]; + r_co[1] += dcut[1]; + r_co[2] += cost * dcut[2]; + } + break; + default: + r_co[0] = -(y - 1.0f / factor) * sint; + r_co[1] = (y - 1.0f / factor) * cost + 1.0f / factor; + r_co[2] = z; + { + r_co[0] += cost * dcut[0]; + r_co[1] += sint * dcut[0]; + r_co[2] += dcut[2]; + } + } } - /* simple deform modifier */ -static void SimpleDeformModifier_do( - SimpleDeformModifierData *smd, const ModifierEvalContext *UNUSED(ctx), - struct Object *ob, struct Mesh *mesh, - float (*vertexCos)[3], int numVerts) +static void SimpleDeformModifier_do(SimpleDeformModifierData *smd, + const ModifierEvalContext *UNUSED(ctx), + struct Object *ob, + struct Mesh *mesh, + float (*vertexCos)[3], + int numVerts) { - const float base_limit[2] = {0.0f, 0.0f}; - int i; - float smd_limit[2], smd_factor; - SpaceTransform *transf = NULL, tmp_transf; - void (*simpleDeform_callback)(const float factor, const int axis, const float dcut[3], float co[3]) = NULL; /* Mode callback */ - int vgroup; - MDeformVert *dvert; - - /* This is historically the lock axis, _not_ the deform axis as the name would imply */ - const int deform_axis = smd->deform_axis; - int lock_axis = smd->axis; - if (smd->mode == MOD_SIMPLEDEFORM_MODE_BEND) { /* Bend mode shouldn't have any lock axis */ - lock_axis = 0; - } - else { - /* Don't lock axis if it is the chosen deform axis, as this flattens - * the geometry */ - if (deform_axis == 0) { - lock_axis &= ~MOD_SIMPLEDEFORM_LOCK_AXIS_X; - } - if (deform_axis == 1) { - lock_axis &= ~MOD_SIMPLEDEFORM_LOCK_AXIS_Y; - } - if (deform_axis == 2) { - lock_axis &= ~MOD_SIMPLEDEFORM_LOCK_AXIS_Z; - } - } - - - /* Safe-check */ - if (smd->origin == ob) smd->origin = NULL; /* No self references */ - - if (smd->limit[0] < 0.0f) smd->limit[0] = 0.0f; - if (smd->limit[0] > 1.0f) smd->limit[0] = 1.0f; - - smd->limit[0] = min_ff(smd->limit[0], smd->limit[1]); /* Upper limit >= than lower limit */ - - /* Calculate matrixs do convert between coordinate spaces */ - if (smd->origin != NULL) { - transf = &tmp_transf; - BLI_SPACE_TRANSFORM_SETUP(transf, ob, smd->origin); - } - - /* Update limits if needed */ - int limit_axis = deform_axis; - if (smd->mode == MOD_SIMPLEDEFORM_MODE_BEND) { - /* Bend is a special case. */ - switch (deform_axis) { - case 0: - ATTR_FALLTHROUGH; - case 1: - limit_axis = 2; - break; - default: - limit_axis = 0; - } - } - - { - float lower = FLT_MAX; - float upper = -FLT_MAX; - - for (i = 0; i < numVerts; i++) { - float tmp[3]; - copy_v3_v3(tmp, vertexCos[i]); - - if (transf) { - BLI_space_transform_apply(transf, tmp); - } - - lower = min_ff(lower, tmp[limit_axis]); - upper = max_ff(upper, tmp[limit_axis]); - } - - - /* SMD values are normalized to the BV, calculate the absolute values */ - smd_limit[1] = lower + (upper - lower) * smd->limit[1]; - smd_limit[0] = lower + (upper - lower) * smd->limit[0]; - - smd_factor = smd->factor / max_ff(FLT_EPSILON, smd_limit[1] - smd_limit[0]); - } - - switch (smd->mode) { - case MOD_SIMPLEDEFORM_MODE_TWIST: simpleDeform_callback = simpleDeform_twist; break; - case MOD_SIMPLEDEFORM_MODE_BEND: simpleDeform_callback = simpleDeform_bend; break; - case MOD_SIMPLEDEFORM_MODE_TAPER: simpleDeform_callback = simpleDeform_taper; break; - case MOD_SIMPLEDEFORM_MODE_STRETCH: simpleDeform_callback = simpleDeform_stretch; break; - default: - return; /* No simpledeform mode? */ - } - - if (smd->mode == MOD_SIMPLEDEFORM_MODE_BEND) { - if (fabsf(smd_factor) < BEND_EPS) { - return; - } - } - - MOD_get_vgroup(ob, mesh, smd->vgroup_name, &dvert, &vgroup); - const bool invert_vgroup = (smd->flag & MOD_SIMPLEDEFORM_FLAG_INVERT_VGROUP) != 0; - const uint *axis_map = axis_map_table[(smd->mode != MOD_SIMPLEDEFORM_MODE_BEND) ? deform_axis : 2]; - - for (i = 0; i < numVerts; i++) { - float weight = defvert_array_find_weight_safe(dvert, i, vgroup); - - if (invert_vgroup) { - weight = 1.0f - weight; - } - - if (weight != 0.0f) { - float co[3], dcut[3] = {0.0f, 0.0f, 0.0f}; - - if (transf) { - BLI_space_transform_apply(transf, vertexCos[i]); - } - - copy_v3_v3(co, vertexCos[i]); - - /* Apply axis limits, and axis mappings */ - if (lock_axis & MOD_SIMPLEDEFORM_LOCK_AXIS_X) { - axis_limit(0, base_limit, co, dcut); - } - if (lock_axis & MOD_SIMPLEDEFORM_LOCK_AXIS_Y) { - axis_limit(1, base_limit, co, dcut); - } - if (lock_axis & MOD_SIMPLEDEFORM_LOCK_AXIS_Z) { - axis_limit(2, base_limit, co, dcut); - } - axis_limit(limit_axis, smd_limit, co, dcut); - - /* apply the deform to a mapped copy of the vertex, and then re-map it back. */ - float co_remap[3]; - float dcut_remap[3]; - copy_v3_v3_map(co_remap, co, axis_map); - copy_v3_v3_map(dcut_remap, dcut, axis_map); - simpleDeform_callback(smd_factor, deform_axis, dcut_remap, co_remap); /* apply deform */ - copy_v3_v3_unmap(co, co_remap, axis_map); - - interp_v3_v3v3(vertexCos[i], vertexCos[i], co, weight); /* Use vertex weight has coef of linear interpolation */ - - if (transf) { - BLI_space_transform_invert(transf, vertexCos[i]); - } - } - } + const float base_limit[2] = {0.0f, 0.0f}; + int i; + float smd_limit[2], smd_factor; + SpaceTransform *transf = NULL, tmp_transf; + void (*simpleDeform_callback)(const float factor, + const int axis, + const float dcut[3], + float co[3]) = NULL; /* Mode callback */ + int vgroup; + MDeformVert *dvert; + + /* This is historically the lock axis, _not_ the deform axis as the name would imply */ + const int deform_axis = smd->deform_axis; + int lock_axis = smd->axis; + if (smd->mode == MOD_SIMPLEDEFORM_MODE_BEND) { /* Bend mode shouldn't have any lock axis */ + lock_axis = 0; + } + else { + /* Don't lock axis if it is the chosen deform axis, as this flattens + * the geometry */ + if (deform_axis == 0) { + lock_axis &= ~MOD_SIMPLEDEFORM_LOCK_AXIS_X; + } + if (deform_axis == 1) { + lock_axis &= ~MOD_SIMPLEDEFORM_LOCK_AXIS_Y; + } + if (deform_axis == 2) { + lock_axis &= ~MOD_SIMPLEDEFORM_LOCK_AXIS_Z; + } + } + + /* Safe-check */ + if (smd->origin == ob) + smd->origin = NULL; /* No self references */ + + if (smd->limit[0] < 0.0f) + smd->limit[0] = 0.0f; + if (smd->limit[0] > 1.0f) + smd->limit[0] = 1.0f; + + smd->limit[0] = min_ff(smd->limit[0], smd->limit[1]); /* Upper limit >= than lower limit */ + + /* Calculate matrixs do convert between coordinate spaces */ + if (smd->origin != NULL) { + transf = &tmp_transf; + BLI_SPACE_TRANSFORM_SETUP(transf, ob, smd->origin); + } + + /* Update limits if needed */ + int limit_axis = deform_axis; + if (smd->mode == MOD_SIMPLEDEFORM_MODE_BEND) { + /* Bend is a special case. */ + switch (deform_axis) { + case 0: + ATTR_FALLTHROUGH; + case 1: + limit_axis = 2; + break; + default: + limit_axis = 0; + } + } + + { + float lower = FLT_MAX; + float upper = -FLT_MAX; + + for (i = 0; i < numVerts; i++) { + float tmp[3]; + copy_v3_v3(tmp, vertexCos[i]); + + if (transf) { + BLI_space_transform_apply(transf, tmp); + } + + lower = min_ff(lower, tmp[limit_axis]); + upper = max_ff(upper, tmp[limit_axis]); + } + + /* SMD values are normalized to the BV, calculate the absolute values */ + smd_limit[1] = lower + (upper - lower) * smd->limit[1]; + smd_limit[0] = lower + (upper - lower) * smd->limit[0]; + + smd_factor = smd->factor / max_ff(FLT_EPSILON, smd_limit[1] - smd_limit[0]); + } + + switch (smd->mode) { + case MOD_SIMPLEDEFORM_MODE_TWIST: + simpleDeform_callback = simpleDeform_twist; + break; + case MOD_SIMPLEDEFORM_MODE_BEND: + simpleDeform_callback = simpleDeform_bend; + break; + case MOD_SIMPLEDEFORM_MODE_TAPER: + simpleDeform_callback = simpleDeform_taper; + break; + case MOD_SIMPLEDEFORM_MODE_STRETCH: + simpleDeform_callback = simpleDeform_stretch; + break; + default: + return; /* No simpledeform mode? */ + } + + if (smd->mode == MOD_SIMPLEDEFORM_MODE_BEND) { + if (fabsf(smd_factor) < BEND_EPS) { + return; + } + } + + MOD_get_vgroup(ob, mesh, smd->vgroup_name, &dvert, &vgroup); + const bool invert_vgroup = (smd->flag & MOD_SIMPLEDEFORM_FLAG_INVERT_VGROUP) != 0; + const uint *axis_map = + axis_map_table[(smd->mode != MOD_SIMPLEDEFORM_MODE_BEND) ? deform_axis : 2]; + + for (i = 0; i < numVerts; i++) { + float weight = defvert_array_find_weight_safe(dvert, i, vgroup); + + if (invert_vgroup) { + weight = 1.0f - weight; + } + + if (weight != 0.0f) { + float co[3], dcut[3] = {0.0f, 0.0f, 0.0f}; + + if (transf) { + BLI_space_transform_apply(transf, vertexCos[i]); + } + + copy_v3_v3(co, vertexCos[i]); + + /* Apply axis limits, and axis mappings */ + if (lock_axis & MOD_SIMPLEDEFORM_LOCK_AXIS_X) { + axis_limit(0, base_limit, co, dcut); + } + if (lock_axis & MOD_SIMPLEDEFORM_LOCK_AXIS_Y) { + axis_limit(1, base_limit, co, dcut); + } + if (lock_axis & MOD_SIMPLEDEFORM_LOCK_AXIS_Z) { + axis_limit(2, base_limit, co, dcut); + } + axis_limit(limit_axis, smd_limit, co, dcut); + + /* apply the deform to a mapped copy of the vertex, and then re-map it back. */ + float co_remap[3]; + float dcut_remap[3]; + copy_v3_v3_map(co_remap, co, axis_map); + copy_v3_v3_map(dcut_remap, dcut, axis_map); + simpleDeform_callback(smd_factor, deform_axis, dcut_remap, co_remap); /* apply deform */ + copy_v3_v3_unmap(co, co_remap, axis_map); + + interp_v3_v3v3(vertexCos[i], + vertexCos[i], + co, + weight); /* Use vertex weight has coef of linear interpolation */ + + if (transf) { + BLI_space_transform_invert(transf, vertexCos[i]); + } + } + } } - /* SimpleDeform */ static void initData(ModifierData *md) { - SimpleDeformModifierData *smd = (SimpleDeformModifierData *) md; + SimpleDeformModifierData *smd = (SimpleDeformModifierData *)md; - smd->mode = MOD_SIMPLEDEFORM_MODE_TWIST; - smd->axis = 0; - smd->deform_axis = 0; + smd->mode = MOD_SIMPLEDEFORM_MODE_TWIST; + smd->axis = 0; + smd->deform_axis = 0; - smd->origin = NULL; - smd->factor = DEG2RADF(45.0f); - smd->limit[0] = 0.0f; - smd->limit[1] = 1.0f; + smd->origin = NULL; + smd->factor = DEG2RADF(45.0f); + smd->limit[0] = 0.0f; + smd->limit[1] = 1.0f; } -static void requiredDataMask(Object *UNUSED(ob), ModifierData *md, CustomData_MeshMasks *r_cddata_masks) +static void requiredDataMask(Object *UNUSED(ob), + ModifierData *md, + CustomData_MeshMasks *r_cddata_masks) { - SimpleDeformModifierData *smd = (SimpleDeformModifierData *)md; + SimpleDeformModifierData *smd = (SimpleDeformModifierData *)md; - /* ask for vertexgroups if we need them */ - if (smd->vgroup_name[0] != '\0') { - r_cddata_masks->vmask |= CD_MASK_MDEFORMVERT; - } + /* ask for vertexgroups if we need them */ + if (smd->vgroup_name[0] != '\0') { + r_cddata_masks->vmask |= CD_MASK_MDEFORMVERT; + } } -static void foreachObjectLink( - ModifierData *md, Object *ob, - ObjectWalkFunc walk, void *userData) +static void foreachObjectLink(ModifierData *md, Object *ob, ObjectWalkFunc walk, void *userData) { - SimpleDeformModifierData *smd = (SimpleDeformModifierData *)md; - walk(userData, ob, &smd->origin, IDWALK_CB_NOP); + SimpleDeformModifierData *smd = (SimpleDeformModifierData *)md; + walk(userData, ob, &smd->origin, IDWALK_CB_NOP); } static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx) { - SimpleDeformModifierData *smd = (SimpleDeformModifierData *)md; - if (smd->origin != NULL) { - DEG_add_object_relation(ctx->node, smd->origin, DEG_OB_COMP_TRANSFORM, "SimpleDeform Modifier"); - DEG_add_modifier_to_transform_relation(ctx->node, "SimpleDeform Modifier"); - } + SimpleDeformModifierData *smd = (SimpleDeformModifierData *)md; + if (smd->origin != NULL) { + DEG_add_object_relation( + ctx->node, smd->origin, DEG_OB_COMP_TRANSFORM, "SimpleDeform Modifier"); + DEG_add_modifier_to_transform_relation(ctx->node, "SimpleDeform Modifier"); + } } -static void deformVerts( - ModifierData *md, const ModifierEvalContext *ctx, - struct Mesh *mesh, - float (*vertexCos)[3], - int numVerts) +static void deformVerts(ModifierData *md, + const ModifierEvalContext *ctx, + struct Mesh *mesh, + float (*vertexCos)[3], + int numVerts) { - SimpleDeformModifierData *sdmd = (SimpleDeformModifierData *)md; - Mesh *mesh_src = NULL; + SimpleDeformModifierData *sdmd = (SimpleDeformModifierData *)md; + Mesh *mesh_src = NULL; - if (ctx->object->type == OB_MESH && sdmd->vgroup_name[0] != '\0') { - /* mesh_src is only needed for vgroups. */ - mesh_src = MOD_deform_mesh_eval_get(ctx->object, NULL, mesh, NULL, numVerts, false, false); - } + if (ctx->object->type == OB_MESH && sdmd->vgroup_name[0] != '\0') { + /* mesh_src is only needed for vgroups. */ + mesh_src = MOD_deform_mesh_eval_get(ctx->object, NULL, mesh, NULL, numVerts, false, false); + } - SimpleDeformModifier_do(sdmd, ctx, ctx->object, mesh_src, vertexCos, numVerts); + SimpleDeformModifier_do(sdmd, ctx, ctx->object, mesh_src, vertexCos, numVerts); - if (!ELEM(mesh_src, NULL, mesh)) { - BKE_id_free(NULL, mesh_src); - } + if (!ELEM(mesh_src, NULL, mesh)) { + BKE_id_free(NULL, mesh_src); + } } -static void deformVertsEM( - ModifierData *md, const ModifierEvalContext *ctx, - struct BMEditMesh *editData, - struct Mesh *mesh, - float (*vertexCos)[3], - int numVerts) +static void deformVertsEM(ModifierData *md, + const ModifierEvalContext *ctx, + struct BMEditMesh *editData, + struct Mesh *mesh, + float (*vertexCos)[3], + int numVerts) { - SimpleDeformModifierData *sdmd = (SimpleDeformModifierData *)md; - Mesh *mesh_src = NULL; + SimpleDeformModifierData *sdmd = (SimpleDeformModifierData *)md; + Mesh *mesh_src = NULL; - if (ctx->object->type == OB_MESH && sdmd->vgroup_name[0] != '\0') { - /* mesh_src is only needed for vgroups. */ - mesh_src = MOD_deform_mesh_eval_get(ctx->object, editData, mesh, NULL, numVerts, false, false); - } + if (ctx->object->type == OB_MESH && sdmd->vgroup_name[0] != '\0') { + /* mesh_src is only needed for vgroups. */ + mesh_src = MOD_deform_mesh_eval_get(ctx->object, editData, mesh, NULL, numVerts, false, false); + } - SimpleDeformModifier_do(sdmd, ctx, ctx->object, mesh_src, vertexCos, numVerts); + SimpleDeformModifier_do(sdmd, ctx, ctx->object, mesh_src, vertexCos, numVerts); - if (!ELEM(mesh_src, NULL, mesh)) { - BKE_id_free(NULL, mesh_src); - } + if (!ELEM(mesh_src, NULL, mesh)) { + BKE_id_free(NULL, mesh_src); + } } - ModifierTypeInfo modifierType_SimpleDeform = { - /* name */ "SimpleDeform", - /* structName */ "SimpleDeformModifierData", - /* structSize */ sizeof(SimpleDeformModifierData), - /* type */ eModifierTypeType_OnlyDeform, - - /* flags */ eModifierTypeFlag_AcceptsMesh | - eModifierTypeFlag_AcceptsCVs | - eModifierTypeFlag_AcceptsLattice | - eModifierTypeFlag_SupportsEditmode | - eModifierTypeFlag_EnableInEditmode, - - /* copyData */ modifier_copyData_generic, - - /* deformVerts */ deformVerts, - /* deformMatrices */ NULL, - /* deformVertsEM */ deformVertsEM, - /* deformMatricesEM */ NULL, - /* applyModifier */ NULL, - - /* initData */ initData, - /* requiredDataMask */ requiredDataMask, - /* freeData */ NULL, - /* isDisabled */ NULL, - /* updateDepsgraph */ updateDepsgraph, - /* dependsOnTime */ NULL, - /* dependsOnNormals */ NULL, - /* foreachObjectLink */ foreachObjectLink, - /* foreachIDLink */ NULL, - /* foreachTexLink */ NULL, - /* freeRuntimeData */ NULL, + /* name */ "SimpleDeform", + /* structName */ "SimpleDeformModifierData", + /* structSize */ sizeof(SimpleDeformModifierData), + /* type */ eModifierTypeType_OnlyDeform, + + /* flags */ eModifierTypeFlag_AcceptsMesh | eModifierTypeFlag_AcceptsCVs | + eModifierTypeFlag_AcceptsLattice | eModifierTypeFlag_SupportsEditmode | + eModifierTypeFlag_EnableInEditmode, + + /* copyData */ modifier_copyData_generic, + + /* deformVerts */ deformVerts, + /* deformMatrices */ NULL, + /* deformVertsEM */ deformVertsEM, + /* deformMatricesEM */ NULL, + /* applyModifier */ NULL, + + /* initData */ initData, + /* requiredDataMask */ requiredDataMask, + /* freeData */ NULL, + /* isDisabled */ NULL, + /* updateDepsgraph */ updateDepsgraph, + /* dependsOnTime */ NULL, + /* dependsOnNormals */ NULL, + /* foreachObjectLink */ foreachObjectLink, + /* foreachIDLink */ NULL, + /* foreachTexLink */ NULL, + /* freeRuntimeData */ NULL, }; |