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:
@@ -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];
|
||||
|
||||
Reference in New Issue
Block a user