Fix mod_expr `clamp` function
The clamp(v,a,b) function wraps v around the interval [a,b). However prior to this commit, `clamp` was ignoring the third argument and using the second argument again in its place. This resulted in a division by zero. Hence `clamp` didn't work at all. Even if the arguments were treated correctly, `clamp` incorrectly multiplied rather than added whenever v < a. This would have produced bogus results. (Thanks to Shona McNeill for pointing this out.) Note that as implemented, `clamp` is undefined for b >= a. These errors are present in the last upstream C version, v2.7. They've been corrected in the C++ version that upstream now maintains instead. Thanks-to: Shona McNeill <prufrax@googlemail.com> FS-7070 #resolve
This commit is contained in:
parent
d88bae1a62
commit
65e678ba1d
|
@ -763,7 +763,7 @@ case EXPR_NODEFUNC_CLAMP:
|
||||||
err = exprEvalNode(obj, nodes->data.function.nodes, 1, &d1);
|
err = exprEvalNode(obj, nodes->data.function.nodes, 1, &d1);
|
||||||
|
|
||||||
if (!err)
|
if (!err)
|
||||||
err = exprEvalNode(obj, nodes->data.function.nodes, 1, &d2);
|
err = exprEvalNode(obj, nodes->data.function.nodes, 2, &d2);
|
||||||
|
|
||||||
if (!err) {
|
if (!err) {
|
||||||
EXPR_RESET_ERR();
|
EXPR_RESET_ERR();
|
||||||
|
@ -771,7 +771,7 @@ case EXPR_NODEFUNC_CLAMP:
|
||||||
EXPR_CHECK_ERR();
|
EXPR_CHECK_ERR();
|
||||||
|
|
||||||
if (tmp < 0.0)
|
if (tmp < 0.0)
|
||||||
*val = tmp * d2;
|
*val = tmp + d2;
|
||||||
else
|
else
|
||||||
*val = tmp + d1;
|
*val = tmp + d1;
|
||||||
} else
|
} else
|
||||||
|
|
Loading…
Reference in New Issue