Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2014-04-03 11:57:37 +0400
committerCampbell Barton <ideasman42@gmail.com>2014-04-03 11:57:37 +0400
commitd5ce2b5466619f429f6ffeef27a1802beb860eb3 (patch)
tree8cdec24d61cae2ae5c87f781b5fafae7b78d1e5a /source/blender/modifiers
parent0e3e4c90b1503f8c0af69c5db210071828549f64 (diff)
Fix T39567: simple deform modifier error
Diffstat (limited to 'source/blender/modifiers')
-rw-r--r--source/blender/modifiers/intern/MOD_simpledeform.c22
1 files changed, 15 insertions, 7 deletions
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);