summaryrefslogtreecommitdiff
path: root/scene/2d
diff options
context:
space:
mode:
authorPedro J. Estébanez <pedrojrulez@gmail.com>2016-06-27 10:32:14 +0200
committerPedro J. Estébanez <pedrojrulez@gmail.com>2016-06-27 10:40:33 +0200
commit6ce47d9b51f6f540a8d3b6aece32ec0efdf2a37f (patch)
tree24b5d0bd777713a5350622242441c56337e1a4ca /scene/2d
parent2c59f778850dc4450481680e859efd66660c9119 (diff)
Improve parallax mirroring algorithm
Replaces the iterative approach currently used by an equivalent direct computation. Also fixes infinite looping that happens when the mirroring value is negative.
Diffstat (limited to 'scene/2d')
-rw-r--r--scene/2d/parallax_layer.cpp19
1 files changed, 4 insertions, 15 deletions
diff --git a/scene/2d/parallax_layer.cpp b/scene/2d/parallax_layer.cpp
index e9378b1d02..05136de5d6 100644
--- a/scene/2d/parallax_layer.cpp
+++ b/scene/2d/parallax_layer.cpp
@@ -123,26 +123,15 @@ 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+motion_offset;
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 -= den*ceil(new_ofs.x/den);
}
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 -= den*ceil(new_ofs.y/den);
}
-
set_pos(new_ofs);
set_scale(Vector2(1,1)*p_scale);