diff options
-rw-r--r-- | source/blender/modifiers/intern/MOD_simpledeform.c | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/source/blender/modifiers/intern/MOD_simpledeform.c b/source/blender/modifiers/intern/MOD_simpledeform.c index ea31bdc6e31..951eacdecda 100644 --- a/source/blender/modifiers/intern/MOD_simpledeform.c +++ b/source/blender/modifiers/intern/MOD_simpledeform.c @@ -170,10 +170,12 @@ static void simpleDeform_bend(const float factor, sint = sinf(theta); cost = cosf(theta); + /* NOTE: the operations below a susceptible to float precision errors + * regarding the order of operations, take care when changing, see: T85470 */ switch (axis) { case 0: r_co[0] = x; - r_co[1] = (y - 1.0f / factor) * cost + 1.0f / factor; + r_co[1] = y * cost + (1.0f - cost) / factor; r_co[2] = -(y - 1.0f / factor) * sint; { r_co[0] += dcut[0]; @@ -182,7 +184,7 @@ static void simpleDeform_bend(const float factor, } break; case 1: - r_co[0] = (x - 1.0f / factor) * cost + 1.0f / factor; + r_co[0] = x * cost + (1.0f - cost) / factor; r_co[1] = y; r_co[2] = -(x - 1.0f / factor) * sint; { @@ -193,7 +195,7 @@ static void simpleDeform_bend(const float factor, break; default: r_co[0] = -(y - 1.0f / factor) * sint; - r_co[1] = (y - 1.0f / factor) * cost + 1.0f / factor; + r_co[1] = y * cost + (1.0f - cost) / factor; r_co[2] = z; { r_co[0] += cost * dcut[0]; |