summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaxime Leroy <lisacintosh@gmail.com>2019-05-01 20:47:38 +0200
committerGitHub <noreply@github.com>2019-05-01 20:47:38 +0200
commit6bd271139d8192bdac9c9cf0e5fd2d007b967598 (patch)
tree8be0ec55b2a4b9c50a2e554d70b025a11af557a9
parent9f49e50d6d6ba8ad54e1106ab3954177ecc794c2 (diff)
Fixing Curve2D/3D baked interpolated values
If bake interval is a multiple of the curve length, the curve would return NaN for some offset values (when `frac == 0.0`, it matches the start and end of the curve segment so `fmod == 0.0`, `frac` becomes NaN) ``` # Godot 3.1.1 var c = Curve3D.new() c.add_point(Vector3()) c.add_point(Vector3(0.5,0,0)) c.add_point(Vector3(1,0,0)) c.bake_interval = 0.5 c.interpolate_baked(0.5) == Vector3(NAN, NAN, NAN) ```
-rw-r--r--scene/resources/curve.cpp9
1 files changed, 6 insertions, 3 deletions
diff --git a/scene/resources/curve.cpp b/scene/resources/curve.cpp
index ece8ad4bb0..950518aa6e 100644
--- a/scene/resources/curve.cpp
+++ b/scene/resources/curve.cpp
@@ -782,7 +782,8 @@ Vector2 Curve2D::interpolate_baked(float p_offset, bool p_cubic) const {
if (idx >= bpc - 1) {
return r[bpc - 1];
} else if (idx == bpc - 2) {
- frac /= Math::fmod(baked_max_ofs, bake_interval);
+ if (frac > 0)
+ frac /= Math::fmod(baked_max_ofs, bake_interval);
} else {
frac /= bake_interval;
}
@@ -1352,7 +1353,8 @@ Vector3 Curve3D::interpolate_baked(float p_offset, bool p_cubic) const {
if (idx >= bpc - 1) {
return r[bpc - 1];
} else if (idx == bpc - 2) {
- frac /= Math::fmod(baked_max_ofs, bake_interval);
+ if (frac > 0)
+ frac /= Math::fmod(baked_max_ofs, bake_interval);
} else {
frac /= bake_interval;
}
@@ -1396,7 +1398,8 @@ float Curve3D::interpolate_baked_tilt(float p_offset) const {
if (idx >= bpc - 1) {
return r[bpc - 1];
} else if (idx == bpc - 2) {
- frac /= Math::fmod(baked_max_ofs, bake_interval);
+ if (frac > 0)
+ frac /= Math::fmod(baked_max_ofs, bake_interval);
} else {
frac /= bake_interval;
}