Remove extra graphical resweeps, and smooth prior to despeckling. Was getting odd desync here without Land[] seemingly incorrect at end of passes. Just removing seems to fix, and code wasn't that good an idea in its prior state anyway.
authornemo
Tue, 13 Sep 2011 00:13:01 -0400
changeset 5885 ae257409bcff
parent 5884 bd96b82e0fc8
child 5886 a4a620f68b22
Remove extra graphical resweeps, and smooth prior to despeckling. Was getting odd desync here without Land[] seemingly incorrect at end of passes. Just removing seems to fix, and code wasn't that good an idea in its prior state anyway.
hedgewars/uLandGraphics.pas
--- a/hedgewars/uLandGraphics.pas	Mon Sep 12 20:53:56 2011 -0400
+++ b/hedgewars/uLandGraphics.pas	Tue Sep 13 00:13:01 2011 -0400
@@ -29,7 +29,7 @@
 
 function  addBgColor(OldColor, NewColor: LongWord): LongWord;
 function  SweepDirty: boolean;
-function  Despeckle(X, Y: LongInt; gfxOnly: boolean): LongWord;
+function  Despeckle(X, Y: LongInt): Boolean;
 procedure Smooth(X, Y: LongInt);
 function  CheckLandValue(X, Y: LongInt; LandFlag: Word): boolean;
 function  DrawExplosion(X, Y, Radius: LongInt): Longword;
@@ -721,8 +721,7 @@
 UpdateLandTexture(x, w, y, h)
 end;
 
-// was experimenting with applying as damage occurred.
-function Despeckle(X, Y: LongInt; gfxOnly: boolean): LongWord;
+function Despeckle(X, Y: LongInt): boolean;
 var nx, ny, i, j, c, xx, yy: LongInt;
     pixelsweep: boolean;
 begin
@@ -737,8 +736,7 @@
    yy:= Y div 2;
    end;
 pixelsweep:= ((Land[Y, X] and $FF00) = 0) and (LandPixels[yy, xx] <> 0);
-if not pixelsweep and gfxOnly then exit(0);
-if ((Land[Y, X] > 255) and ((Land[Y, X] and lfIndestructible) = 0)) or pixelsweep then
+if (((Land[Y, X] and lfDamaged) <> 0) and ((Land[Y, X] and lfIndestructible) = 0)) or pixelsweep then
     begin
     c:= 0;
     for i:= -1 to 1 do
@@ -761,8 +759,8 @@
                     else if Land[ny, nx] > 255 then inc(c);
                     end
                 end;
-    if (c < 2) or
-       ((c < 4) and (((Land[Y, X] and lfDamaged) <> 0) or pixelsweep)) then
+
+    if c < 4 then // 0-3 neighbours
         begin
         if ((Land[Y, X] and lfBasic) <> 0) and not disableLandBack then
             LandPixels[yy, xx]:= LandBackPixel(X, Y)
@@ -770,11 +768,10 @@
             LandPixels[yy, xx]:= 0;
 
         Land[Y, X]:= 0;
-        if not pixelsweep then exit(1)
-        else exit(2)
+        if not pixelsweep then exit(true);
         end;
     end;
-Despeckle:= 0
+Despeckle:= false
 end;
 
 procedure Smooth(X, Y: LongInt);
@@ -827,12 +824,21 @@
 end;
 
 function SweepDirty: boolean;
-var x, y, xx, yy, ty, tx, d: LongInt;
-    bRes, updateBlock, resweepCol, resweepGfx, gfxOnly, recheck, firstpass: boolean;
+var x, y, xx, yy, ty, tx: LongInt;
+    bRes, updateBlock, resweep, recheck: boolean;
 begin
 bRes:= false;
 reCheck:= true;
-d:= 0;
+for y:= 0 to LAND_HEIGHT div 32 - 1 do
+    for x:= 0 to LAND_WIDTH div 32 - 1 do
+        if LandDirty[y, x] <> 0 then
+            begin
+            ty:= y * 32;
+            tx:= x * 32;
+            for yy:= ty to ty + 31 do
+                for xx:= tx to tx + 31 do
+                    Smooth(xx,yy)
+            end;
 
 while recheck do
     begin
@@ -844,51 +850,40 @@
             if LandDirty[y, x] <> 0 then
                 begin
                 updateBlock:= false;
-                resweepCol:= true;
-                resweepGfx:= true;
-                firstpass:= true;
+                resweep:= true;
                 ty:= y * 32;
                 tx:= x * 32;
-                while(resweepCol or resweepGfx) do
+                while(resweep) do
                     begin
-                    gfxOnly:= resweepGfx and not resweepCol;
-                    resweepCol:= false;
-                    resweepGfx:= false;
+                    resweep:= false;
                     for yy:= ty to ty + 31 do
                         for xx:= tx to tx + 31 do
-                            begin
-                            d:= Despeckle(xx, yy, gfxOnly);
-                            if d <> 0 then
+                            if Despeckle(xx, yy) then
                                 begin
                                 bRes:= true;
                                 updateBlock:= true;
-                                if d = 1 then resweepCol:= true
-                                else resweepGfx:= true;
-                                if d = 1 then
-                                    if (yy = ty) and (y > 0) then
-                                        begin
-                                        LandDirty[y-1, x]:= 1;
-                                        recheck:= true;
-                                        end
-                                    else if (yy = ty+31) and (y < LAND_HEIGHT div 32 - 1) then
-                                        begin
-                                        LandDirty[y+1, x]:= 1;
-                                        recheck:= true;
-                                        end;
-                                    if (xx = tx) and (x > 0) then
-                                        begin
-                                        LandDirty[y, x-1]:= 1;
-                                        recheck:= true;
-                                        end
-                                    else if (xx = tx+31) and (x < LAND_WIDTH div 32 - 1) then
-                                        begin
-                                        LandDirty[y, x+1]:= 1;
-                                        recheck:= true;
-                                        end
+                                resweep:= true;
+                                if (yy = ty) and (y > 0) then
+                                    begin
+                                    LandDirty[y-1, x]:= 1;
+                                    recheck:= true;
+                                    end
+                                else if (yy = ty+31) and (y < LAND_HEIGHT div 32 - 1) then
+                                    begin
+                                    LandDirty[y+1, x]:= 1;
+                                    recheck:= true;
+                                    end;
+                                if (xx = tx) and (x > 0) then
+                                    begin
+                                    LandDirty[y, x-1]:= 1;
+                                    recheck:= true;
+                                    end
+                                else if (xx = tx+31) and (x < LAND_WIDTH div 32 - 1) then
+                                    begin
+                                    LandDirty[y, x+1]:= 1;
+                                    recheck:= true;
+                                    end
                                 end;
-                            if firstpass then Smooth(xx,yy);
-                            end;
-                    firstpass:= false
                     end;
                 if updateBlock then UpdateLandTexture(tx, 32, ty, 32);
                 LandDirty[y, x]:= 0;
@@ -900,6 +895,7 @@
 SweepDirty:= bRes;
 end;
 
+
 // Return true if outside of land or not the value tested, used right now for some X/Y movement that does not use normal hedgehog movement in GSHandlers.inc
 function CheckLandValue(X, Y: LongInt; LandFlag: Word): boolean;
 begin