Fix T85470: Simple deform modifier causes artifacts at low angles

The formula used to compute the bend did subtraction of two big numbers
to get the position. Changed to find the delta and add that,
by rearranging the formula into a more numerically stable form.

Reviewed By: mano-wii, campbellbarton

Ref D11074
This commit is contained in:
Henrik Dick
2021-04-30 23:38:31 +10:00
committed by Campbell Barton
parent 0d07cfd940
commit a58a8296d9

View File

@@ -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];