Преглед изворни кода

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);
 	}