From d5ce2b5466619f429f6ffeef27a1802beb860eb3 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 3 Apr 2014 18:57:37 +1100 Subject: Fix T39567: simple deform modifier error --- source/blender/modifiers/intern/MOD_simpledeform.c | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) (limited to 'source/blender/modifiers/intern/MOD_simpledeform.c') diff --git a/source/blender/modifiers/intern/MOD_simpledeform.c b/source/blender/modifiers/intern/MOD_simpledeform.c index fdc5578c049..5a9c2b4ffe1 100644 --- a/source/blender/modifiers/intern/MOD_simpledeform.c +++ b/source/blender/modifiers/intern/MOD_simpledeform.c @@ -51,6 +51,8 @@ #include "MOD_util.h" +#define BEND_EPS 0.000001f + /* Clamps/Limits the given coordinate to: limits[0] <= co[axis] <= limits[1] * The amount of clamp is saved on dcut */ static void axis_limit(int axis, const float limits[2], float co[3], float dcut[3]) @@ -122,15 +124,15 @@ static void simpleDeform_bend(const float factor, const float dcut[3], float r_c float x = r_co[0], y = r_co[1], z = r_co[2]; float theta, sint, cost; + BLI_assert(!(fabsf(factor) < BEND_EPS)); + theta = x * factor; sint = sinf(theta); cost = cosf(theta); - if (fabsf(factor) > 1e-7f) { - 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] = -(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]; @@ -196,8 +198,6 @@ static void SimpleDeformModifier_do(SimpleDeformModifierData *smd, struct Object smd_factor = smd->factor / max_ff(FLT_EPSILON, smd_limit[1] - smd_limit[0]); } - modifier_get_vgroup(ob, dm, smd->vgroup_name, &dvert, &vgroup); - switch (smd->mode) { case MOD_SIMPLEDEFORM_MODE_TWIST: simpleDeform_callback = simpleDeform_twist; break; case MOD_SIMPLEDEFORM_MODE_BEND: simpleDeform_callback = simpleDeform_bend; break; @@ -207,6 +207,14 @@ static void SimpleDeformModifier_do(SimpleDeformModifierData *smd, struct Object return; /* No simpledeform mode? */ } + if (smd->mode == MOD_SIMPLEDEFORM_MODE_BEND) { + if (fabsf(smd_factor) < BEND_EPS) { + return; + } + } + + modifier_get_vgroup(ob, dm, smd->vgroup_name, &dvert, &vgroup); + for (i = 0; i < numVerts; i++) { float weight = defvert_array_find_weight_safe(dvert, i, vgroup); -- cgit v1.2.3