Browse Source

Handle huge offset values in Path2D and Path3D set_offset

(cherry picked from commit 2edb59ec8896d321f12b8fa6904bf13178be8bf8)
MickeMakaron 5 years ago
parent
commit
e3ca6d87ad
2 changed files with 10 additions and 14 deletions
  1. 5 7
      scene/2d/path_2d.cpp
  2. 5 7
      scene/3d/path.cpp

+ 5 - 7
scene/2d/path_2d.cpp

@@ -322,16 +322,14 @@ void PathFollow2D::set_offset(float p_offset) {
 
 
 	offset = p_offset;
 	offset = p_offset;
 	if (path) {
 	if (path) {
-		if (path->get_curve().is_valid() && path->get_curve()->get_baked_length()) {
+		if (path->get_curve().is_valid()) {
 			float path_length = path->get_curve()->get_baked_length();
 			float path_length = path->get_curve()->get_baked_length();
 
 
 			if (loop) {
 			if (loop) {
-				while (offset > path_length)
-					offset -= path_length;
-
-				while (offset < 0)
-					offset += path_length;
-
+				offset = Math::fposmod(offset, path_length);
+				if (!Math::is_zero_approx(p_offset) && Math::is_zero_approx(offset)) {
+					offset = path_length;
+				}
 			} else {
 			} else {
 				offset = CLAMP(offset, 0, path_length);
 				offset = CLAMP(offset, 0, path_length);
 			}
 			}

+ 5 - 7
scene/3d/path.cpp

@@ -317,16 +317,14 @@ void PathFollow::set_offset(float p_offset) {
 	offset = p_offset;
 	offset = p_offset;
 
 
 	if (path) {
 	if (path) {
-		if (path->get_curve().is_valid() && path->get_curve()->get_baked_length()) {
+		if (path->get_curve().is_valid()) {
 			float path_length = path->get_curve()->get_baked_length();
 			float path_length = path->get_curve()->get_baked_length();
 
 
 			if (loop) {
 			if (loop) {
-				while (offset > path_length)
-					offset -= path_length;
-
-				while (offset < 0)
-					offset += path_length;
-
+				offset = Math::fposmod(offset, path_length);
+				if (!Math::is_zero_approx(p_offset) && Math::is_zero_approx(offset)) {
+					offset = path_length;
+				}
 			} else {
 			} else {
 				offset = CLAMP(offset, 0, path_length);
 				offset = CLAMP(offset, 0, path_length);
 			}
 			}