hedgewars/uVisualGears.pas
branchui-scaling
changeset 15283 c4fd2813b127
parent 14584 ab79cd4a7382
child 15585 f8c1492601fe
--- a/hedgewars/uVisualGears.pas	Wed May 16 18:22:28 2018 +0200
+++ b/hedgewars/uVisualGears.pas	Wed Jul 31 23:14:27 2019 +0200
@@ -35,7 +35,7 @@
 procedure freeModule;
 
 procedure ProcessVisualGears(Steps: Longword);
-procedure DrawVisualGears(Layer: LongWord);
+procedure DrawVisualGears(Layer: LongWord; worldIsShifted: boolean);
 
 procedure AddClouds;
 procedure AddFlakes;
@@ -74,7 +74,7 @@
 
 for i:= 0 to 6 do
     begin
-    t:= VisualGearLayers[i];
+    t:= VisualGearLayersStart[i];
     while t <> nil do
         begin
         Gear:= t;
@@ -93,7 +93,7 @@
 for i:= 2 to 6 do
     if i <> 3 then
         begin
-        t:= VisualGearLayers[i];
+        t:= VisualGearLayersStart[i];
         while t <> nil do
             begin
             Gear:= t;
@@ -138,7 +138,7 @@
     exit(@SpritesData[GetSprite(sprite, SDsprite)]);
 end;
 
-procedure DrawVisualGears(Layer: LongWord);
+procedure DrawVisualGears(Layer: LongWord; worldIsShifted: boolean);
 var Gear: PVisualGear;
     tinted, speedlessFlakes: boolean;
     tmp: real;
@@ -154,7 +154,7 @@
 case Layer of
     // this layer is very distant in the background when stereo
     0: begin
-        Gear:= VisualGearLayers[0];
+        Gear:= VisualGearLayersStart[0];
         while Gear <> nil do
             begin
             if Gear^.Tint <> $FFFFFFFF then Tint(Gear^.Tint);
@@ -163,23 +163,24 @@
                         spriteData:= GetSpriteData(GetSpriteByWind(sprCloud, sprCloudL), GetSpriteByWind(sprSDCloud, sprSDCloudL));
                         DrawTextureF(spriteData^.Texture, Gear^.Scale, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, spriteData^.Width, spriteData^.Height)
                         end;
-               vgtFlake: begin
-                         sprite:= GetSpriteByWind(GetSprite(sprFlake, sprSDFlake), GetSprite(sprFlakeL, sprSDFlakeL));
-                         if cFlattenFlakes then
+               vgtFlake: if (not worldIsShifted) then
                              begin
-                             if speedlessFlakes then
-                                 DrawSprite(sprite, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame)
+                             sprite:= GetSpriteByWind(GetSprite(sprFlake, sprSDFlake), GetSprite(sprFlakeL, sprSDFlakeL));
+                             if cFlattenFlakes then
+                                 begin
+                                 if speedlessFlakes then
+                                     DrawSprite(sprite, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame)
+                                 else
+                                     DrawSpriteRotatedF(sprite, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, Gear^.Angle);
+                                 end
                              else
-                                 DrawSpriteRotatedF(sprite, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, Gear^.Angle);
-                             end
-                         else
-                             begin
-                             if speedlessFlakes then
-                                 DrawTextureF(SpritesData[sprite].Texture, Gear^.Scale, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, SpritesData[sprFlake].Width, SpritesData[sprFlake].Height)
-                             else
-                                 DrawTextureRotatedF(SpritesData[sprite].Texture, Gear^.Scale, 0, 0, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, SpritesData[sprFlake].Width, SpritesData[sprFlake].Height, Gear^.Angle);
+                                 begin
+                                 if speedlessFlakes then
+                                     DrawTextureF(SpritesData[sprite].Texture, Gear^.Scale, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, SpritesData[sprFlake].Width, SpritesData[sprFlake].Height)
+                                 else
+                                     DrawTextureRotatedF(SpritesData[sprite].Texture, Gear^.Scale, 0, 0, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, SpritesData[sprFlake].Width, SpritesData[sprFlake].Height, Gear^.Angle);
+                                 end;
                              end;
-                         end;
                end;
            if Gear^.Tint <> $FFFFFFFF then
                untint;
@@ -188,20 +189,20 @@
        end;
     // this layer is on the land level (which is close but behind the screen plane) when stereo
     1: begin
-       Gear:= VisualGearLayers[1];
+       Gear:= VisualGearLayersStart[1];
        while Gear <> nil do
           begin
-          //tinted:= false;
           if Gear^.Tint <> $FFFFFFFF then
               Tint(Gear^.Tint);
           case Gear^.Kind of
-              vgtFlake: begin
-                         sprite:= GetSpriteByWind(GetSprite(sprFlake, sprSDFlake), GetSprite(sprFlakeL, sprSDFlakeL));
-                         if speedlessFlakes then
-                             DrawSprite(sprite, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame)
-                         else
-                             DrawSpriteRotatedF(sprite, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, Gear^.Angle);
-                        end;
+              vgtFlake: if (not worldIsShifted) then
+                            begin
+                            sprite:= GetSpriteByWind(GetSprite(sprFlake, sprSDFlake), GetSprite(sprFlakeL, sprSDFlakeL));
+                            if speedlessFlakes then
+                                DrawSprite(sprite, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame)
+                            else
+                                DrawSpriteRotatedF(sprite, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, Gear^.Angle);
+                            end;
               vgtSmokeTrace: if Gear^.State < 8 then
                   DrawSprite(sprSmokeTrace, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy, Gear^.State);
               vgtEvilTrace: if Gear^.State < 8 then
@@ -225,14 +226,13 @@
                              if Gear^.Angle <> 0 then
                                 DrawTextureRotatedF(spriteData^.Texture, Gear^.scale, 0, 0, round(Gear^.X + WorldDx + (((spriteData^.Height+8)*Gear^.Scale)/2) * (Gear^.Angle / abs(Gear^.Angle))), round(Gear^.Y + WorldDy), 19 - (Gear^.FrameTicks div Gear^.Timer div 37), 1, spriteData^.Width, spriteData^.Height, Gear^.Angle)
                              else
-                                //DrawSprite(sprite, round(Gear^.X) + WorldDx - 40, round(Gear^.Y) + WorldDy - 58, 19 - (Gear^.FrameTicks div 37))
                                 DrawTextureF(spriteData^.Texture, Gear^.scale, round(Gear^.X + WorldDx), round(Gear^.Y + WorldDy - ((spriteData^.Height+8)*Gear^.Scale)/2), 19 - (Gear^.FrameTicks div Gear^.Timer div 37), 1, spriteData^.Width, spriteData^.Height);
                              end;
                   vgtDroplet: begin
                               sprite:= GetSprite(sprDroplet, sprSDDroplet);
                               DrawSprite(sprite, round(Gear^.X) + WorldDx - 8, round(Gear^.Y) + WorldDy - 8, Gear^.Frame);
                               end;
-                  vgtBubble: DrawSprite(sprBubbles, round(Gear^.X) + WorldDx - 8, round(Gear^.Y) + WorldDy - 8, Gear^.Frame);//(RealTicks div 64 + Gear^.Frame) mod 8);
+                  vgtBubble: DrawSprite(sprBubbles, round(Gear^.X) + WorldDx - 8, round(Gear^.Y) + WorldDy - 8, Gear^.Frame);
                vgtStraightShot: begin
                                 if Gear^.dX < 0 then
                                     i:= -1
@@ -241,7 +241,6 @@
                                 DrawTextureRotatedF(SpritesData[TSprite(Gear^.State)].Texture, Gear^.Scale, 0, 0, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy, Gear^.Frame, i, SpritesData[TSprite(Gear^.State)].Width, SpritesData[TSprite(Gear^.State)].Height, Gear^.Angle);
                                 end;
               end;
-          //if (Gear^.Tint <> $FFFFFFFF) or tinted then untint;
           if (Gear^.Tint <> $FFFFFFFF) then
               untint;
           Gear:= Gear^.NextGear
@@ -249,21 +248,13 @@
        end;
     // this layer is on the screen plane (depth = 0) when stereo
     3: begin
-       Gear:= VisualGearLayers[3];
+       Gear:= VisualGearLayersStart[3];
        while Gear <> nil do
            begin
            tinted:= false;
            if Gear^.Tint <> $FFFFFFFF then
                Tint(Gear^.Tint);
            case Gear^.Kind of
-(*
-              vgtFlake: begin
-                        sprite:= GetSprite(sprFlake, sprSDFlake);
-                        if speedlessFlakes then
-                            DrawSprite(sprite, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame)
-                        else
-                            DrawSpriteRotatedF(sprite, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, Gear^.Angle)
-                        end;*)
                vgtSpeechBubble: if (Gear^.Angle <> 0) then
                                 // ^ Before this gear renders, Angle must be set to mark it ready (e.g. coordinates properly initialized)
                                     if (Gear^.Tex <> nil) and (((Gear^.State = 0) and (Gear^.Hedgehog <> nil) and (Gear^.Hedgehog^.Team <> CurrentTeam)) or (Gear^.State = 1)) then
@@ -316,7 +307,7 @@
        end;
     // this layer is outside the screen when stereo
     2: begin
-       Gear:= VisualGearLayers[2];
+       Gear:= VisualGearLayersStart[2];
        while Gear <> nil do
            begin
            tinted:= false;
@@ -368,13 +359,14 @@
                    vgtBulletHit: DrawSpriteRotatedF(sprBulletHit, round(Gear^.X) + WorldDx - 0, round(Gear^.Y) + WorldDy - 0, 7 - (Gear^.FrameTicks div 50), 1, Gear^.Angle);
                end;
            case Gear^.Kind of
-               vgtFlake: begin
-                         spriteData:= GetSpriteData(GetSpriteByWind(sprFlake, sprFlakeL), GetSpriteByWind(sprSDFlake, sprSDFlakeL));
-                         if speedlessFlakes then
-                             DrawTextureF(spriteData^.Texture, Gear^.Scale, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, spriteData^.Width, spriteData^.Height)
-                         else
-                             DrawTextureRotatedF(spriteData^.Texture, Gear^.Scale, 0, 0, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, spriteData^.Width, spriteData^.Height, Gear^.Angle);
-                         end;
+               vgtFlake: if (not worldIsShifted) then
+                         begin
+                             spriteData:= GetSpriteData(GetSpriteByWind(sprFlake, sprFlakeL), GetSpriteByWind(sprSDFlake, sprSDFlakeL));
+                             if speedlessFlakes then
+                                 DrawTextureF(spriteData^.Texture, Gear^.Scale, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, spriteData^.Width, spriteData^.Height)
+                             else
+                                 DrawTextureRotatedF(spriteData^.Texture, Gear^.Scale, 0, 0, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, spriteData^.Width, spriteData^.Height, Gear^.Angle);
+                             end;
                vgtCircle: if gear^.Angle = 1 then
                               begin
                               tmp:= Gear^.State / 100;
@@ -390,7 +382,7 @@
        end;
      // this layer is half-way between the screen plane (depth = 0) when in stereo, and the land
      4: begin
-        Gear:= VisualGearLayers[4];
+        Gear:= VisualGearLayersStart[4];
         while Gear <> nil do
             begin
             if Gear^.Tint <> $FFFFFFFF then
@@ -400,13 +392,14 @@
                          spriteData:= GetSpriteData(GetSpriteByWind(sprCloud, sprCloudL), GetSpriteByWind(sprSDCloud, sprSDCloudL));
                          DrawTextureF(spriteData^.Texture, Gear^.Scale, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, spriteData^.Width, spriteData^.Height);
                          end;
-              vgtFlake: begin
-                        spriteData:= GetSpriteData(GetSpriteByWind(sprFlake, sprFlakeL), GetSpriteByWind(sprSDFlake, sprSDFlakeL));
-                        if speedlessFlakes then
-                            DrawTextureF(spriteData^.Texture, Gear^.Scale, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, spriteData^.Width, spriteData^.Height)
-                        else
-                            DrawTextureRotatedF(spriteData^.Texture, Gear^.Scale, 0, 0, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, spriteData^.Width, spriteData^.Height, Gear^.Angle);
-                        end;
+              vgtFlake: if (not worldIsShifted) then
+                            begin
+                            spriteData:= GetSpriteData(GetSpriteByWind(sprFlake, sprFlakeL), GetSpriteByWind(sprSDFlake, sprSDFlakeL));
+                            if speedlessFlakes then
+                                DrawTextureF(spriteData^.Texture, Gear^.Scale, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, spriteData^.Width, spriteData^.Height)
+                            else
+                                DrawTextureRotatedF(spriteData^.Texture, Gear^.Scale, 0, 0, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, spriteData^.Width, spriteData^.Height, Gear^.Angle);
+                            end;
             end;
             if (Gear^.Tint <> $FFFFFFFF) then
                 untint;
@@ -415,7 +408,7 @@
         end;
      // this layer is on the screen plane (depth = 0) when stereo, but just behind the land
      5: begin
-        Gear:= VisualGearLayers[5];
+        Gear:= VisualGearLayersStart[5];
         while Gear <> nil do
             begin
             if Gear^.Tint <> $FFFFFFFF then
@@ -425,13 +418,14 @@
                         sprite:= GetSpriteByWind(GetSprite(sprCloud, sprSDCloud), GetSprite(sprCloudL, sprSDCloudL));
                           DrawSprite(sprite, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame);
                           end;
-              vgtFlake: begin
-                        sprite:= GetSpriteByWind(GetSprite(sprFlake, sprSDFlake), GetSprite(sprFlakeL, sprSDFlakeL));
-                        if speedlessFlakes then
-                            DrawSprite(sprite, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame)
-                        else
-                            DrawSpriteRotatedF(sprite, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, Gear^.Angle);
-                        end;
+              vgtFlake: if not (worldIsShifted) then
+                            begin
+                            sprite:= GetSpriteByWind(GetSprite(sprFlake, sprSDFlake), GetSprite(sprFlakeL, sprSDFlakeL));
+                            if speedlessFlakes then
+                                DrawSprite(sprite, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame)
+                            else
+                                DrawSpriteRotatedF(sprite, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, Gear^.Angle);
+                            end;
                 end;
             if (Gear^.Tint <> $FFFFFFFF) then
                 untint;
@@ -440,19 +434,20 @@
         end;
      // this layer is on the screen plane (depth = 0) when stereo, but just in front of the land
     6: begin
-        Gear:= VisualGearLayers[6];
+        Gear:= VisualGearLayersStart[6];
         while Gear <> nil do
             begin
             if Gear^.Tint <> $FFFFFFFF then
                 Tint(Gear^.Tint);
             case Gear^.Kind of
-                vgtFlake: begin
-                         sprite:= GetSpriteByWind(GetSprite(sprFlake, sprSDFlake), GetSprite(sprFlakeL, sprSDFlakeL));
-                          if speedlessFlakes then
-                              DrawSprite(sprite, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame)
-                          else
-                              DrawSpriteRotatedF(sprite, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, Gear^.Angle)
-                          end;
+                vgtFlake: if (not worldIsShifted) then
+                              begin
+                              sprite:= GetSpriteByWind(GetSprite(sprFlake, sprSDFlake), GetSprite(sprFlakeL, sprSDFlakeL));
+                              if speedlessFlakes then
+                                  DrawSprite(sprite, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame)
+                              else
+                                  DrawSpriteRotatedF(sprite, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, Gear^.Angle)
+                              end;
                 vgtNoPlaceWarn:
                             DrawTexture(round(Gear^.X) + WorldDx - round(Gear^.Tex^.w * Gear^.Scale) div 2, round(Gear^.Y) + WorldDy - round(Gear^.Tex^.h * Gear^.Scale) div 2, Gear^.Tex, Gear^.Scale);
                 end;
@@ -479,7 +474,7 @@
     exit;
 for i:= 0 to 6 do
     begin
-    vg:= VisualGearLayers[i];
+    vg:= VisualGearLayersStart[i];
     while vg <> nil do
         if vg^.Kind = vgtCloud then
             begin
@@ -519,7 +514,7 @@
     exit;
 for i:= 0 to 6 do
     begin
-    vg:= VisualGearLayers[i];
+    vg:= VisualGearLayersStart[i];
     while vg <> nil do
         if vg^.Kind = vgtFlake then
             begin
@@ -542,7 +537,10 @@
 begin
 VGCounter:= 0;
 for i:= 0 to 6 do
-    VisualGearLayers[i]:= nil;
+    begin
+    VisualGearLayersStart[i]:= nil;
+    VisualGearLayersEnd[i]:= nil;
+    end;
 end;
 
 procedure freeModule;
@@ -550,7 +548,7 @@
 begin
 VGCounter:= 0;
 for i:= 0 to 6 do
-    while VisualGearLayers[i] <> nil do DeleteVisualGear(VisualGearLayers[i]);
+    while VisualGearLayersStart[i] <> nil do DeleteVisualGear(VisualGearLayersStart[i]);
 end;
 
 end.