diff options
author | RĂ©mi Verschelde <rverschelde@gmail.com> | 2018-10-07 18:56:26 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-10-07 18:56:26 +0200 |
commit | cebbb2a325cc028f8311e18ea050f91801385597 (patch) | |
tree | 39f41a73d31ca995413ba0964fbb7d22121c0d56 /core/variant_op.cpp | |
parent | 3b6c5f737926a0a4d2432b385a57856691e1cbc8 (diff) | |
parent | 50fae2b1a7a7a5f3029c50f9884ccdde0762c8a3 (diff) |
Merge pull request #22827 from qonnop/optimize-interpolation
Optimize interpolation algorithms
Diffstat (limited to 'core/variant_op.cpp')
-rw-r--r-- | core/variant_op.cpp | 13 |
1 files changed, 6 insertions, 7 deletions
diff --git a/core/variant_op.cpp b/core/variant_op.cpp index f230f12b5d..d193858966 100644 --- a/core/variant_op.cpp +++ b/core/variant_op.cpp @@ -3521,7 +3521,7 @@ void Variant::interpolate(const Variant &a, const Variant &b, float c, Variant & //not as efficient but.. real_t va = a; real_t vb = b; - r_dst = (1.0 - c) * va + vb * c; + r_dst = va + (vb - va) * c; } else { r_dst = a; @@ -3542,16 +3542,13 @@ void Variant::interpolate(const Variant &a, const Variant &b, float c, Variant & case INT: { int64_t va = a._data._int; int64_t vb = b._data._int; - if (va != vb) - r_dst = int((1.0 - c) * va + vb * c); - else //avoid int casting issues - r_dst = a; + r_dst = int(va + (vb - va) * c); } return; case REAL: { real_t va = a._data._real; real_t vb = b._data._real; - r_dst = (1.0 - c) * va + vb * c; + r_dst = va + (vb - va) * c; } return; case STRING: { @@ -3559,7 +3556,9 @@ void Variant::interpolate(const Variant &a, const Variant &b, float c, Variant & String sa = *reinterpret_cast<const String *>(a._data._mem); String sb = *reinterpret_cast<const String *>(b._data._mem); String dst; - int csize = sb.length() * c + sa.length() * (1.0 - c); + int sa_len = sa.length(); + int sb_len = sb.length(); + int csize = sa_len + (sb_len - sa_len) * c; if (csize == 0) { r_dst = ""; return; |