소스 검색

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