فهرست منبع

Improve parallax mirroring algorithm
Replaces the iterative approach currently used by the standard fmod() function.
Also fixes infinite looping that happens when the mirroring value is negative.

Pedro J. Estébanez 9 سال پیش
والد
کامیت
fbddc0b747
1فایلهای تغییر یافته به همراه4 افزوده شده و 14 حذف شده
  1. 4 14
      scene/2d/parallax_layer.cpp

+ 4 - 14
scene/2d/parallax_layer.cpp

@@ -92,23 +92,13 @@ void ParallaxLayer::set_base_offset_and_scale(const Point2& p_offset,float p_sca
 	Point2 new_ofs = ((orig_offset+p_offset)*motion_scale)*p_scale;
 
 	if (mirroring.x) {
-
-		while( new_ofs.x>=0) {
-			new_ofs.x -= mirroring.x*p_scale;
-		}
-		while(new_ofs.x < -mirroring.x*p_scale) {
-			new_ofs.x += mirroring.x*p_scale;
-		}
+		double den = mirroring.x*p_scale;
+		new_ofs.x = fmod(new_ofs.x,den) - (mirroring.x > 0 ? den : 0);
 	}
 
 	if (mirroring.y) {
-
-		while( new_ofs.y>=0) {
-			new_ofs.y -= mirroring.y*p_scale;
-		}
-		while(new_ofs.y < -mirroring.y*p_scale) {
-			new_ofs.y += mirroring.y*p_scale;
-		}
+		double den = mirroring.y*p_scale;
+		new_ofs.y = fmod(new_ofs.y,den) - (mirroring.y > 0 ? den : 0);
 	}