diff --git a/core/src/io/anuke/mindustry/graphics/FogRenderer.java b/core/src/io/anuke/mindustry/graphics/FogRenderer.java index 5f65bbbbae..031abfe8c1 100644 --- a/core/src/io/anuke/mindustry/graphics/FogRenderer.java +++ b/core/src/io/anuke/mindustry/graphics/FogRenderer.java @@ -40,21 +40,40 @@ public class FogRenderer implements Disposable{ private Rectangle rect = new Rectangle(); private boolean dirty; + private boolean isOffseted; + private int offsettedX, offsettedY; + public FogRenderer(){ Events.on(WorldLoadGraphicsEvent.class, event -> { - dispose(); + if(!isOffseted){ + dispose(); + } padding = world.getSector() != null ? mapPadding + extraPadding : 0; shadowPadding = world.getSector() != null ? fshadowPadding : -1; + FrameBuffer lastBuffer = buffer; + buffer = new FrameBuffer(Format.RGBA8888, world.width() + padding*2, world.height() + padding*2, false); changeQueue.clear(); //clear buffer to black buffer.begin(); Graphics.clear(0, 0, 0, 1f); + + if(isOffseted){ + Core.batch.getProjectionMatrix().setToOrtho2D(-padding, -padding, buffer.getWidth(), buffer.getHeight()); + Core.batch.begin(); + Core.batch.draw(lastBuffer.getColorBufferTexture(), offsettedX, offsettedY + lastBuffer.getColorBufferTexture().getHeight(), + lastBuffer.getColorBufferTexture().getWidth(), -lastBuffer.getColorBufferTexture().getHeight()); + Core.batch.end(); + } buffer.end(); + if(isOffseted){ + lastBuffer.dispose(); + } + for(int x = 0; x < world.width(); x++){ for(int y = 0; y < world.height(); y++){ Tile tile = world.tile(x, y); @@ -66,6 +85,8 @@ public class FogRenderer implements Disposable{ pixelBuffer = ByteBuffer.allocateDirect(world.width() * world.height() * 4); dirty = true; + + isOffseted = false; }); Events.on(TileChangeEvent.class, event -> threads.runGraphics(() -> { @@ -75,6 +96,12 @@ public class FogRenderer implements Disposable{ })); } + public void setLoadingOffset(int x, int y){ + isOffseted = true; + offsettedX = x; + offsettedY = y; + } + public void writeFog(){ if(buffer == null) return; diff --git a/core/src/io/anuke/mindustry/maps/Sectors.java b/core/src/io/anuke/mindustry/maps/Sectors.java index 373a6bba59..f5d5083cf4 100644 --- a/core/src/io/anuke/mindustry/maps/Sectors.java +++ b/core/src/io/anuke/mindustry/maps/Sectors.java @@ -126,6 +126,10 @@ public class Sectors{ } } + if(!headless){ + renderer.fog().setLoadingOffset(shiftX, shiftY); + } + //create *new* tile array Tile[][] newTiles = new Tile[sector.width * sectorSize][sector.height * sectorSize]; @@ -150,7 +154,7 @@ public class Sectors{ for (int x = 0; x < sectorSize; x++) { for (int y = 0; y < sectorSize; y++) { GenResult result = world.generator().generateTile(sx + sector.x, sy + sector.y, x, y); - newTiles[sx * sectorSize + x][sy * sectorSize + y] = new Tile(x + sx * tilesize, y + sy*tilesize, result.floor.id, result.wall.id, (byte)0, (byte)0, result.elevation); + newTiles[sx * sectorSize + x][sy * sectorSize + y] = new Tile(x + sx * sectorSize, y + sy*sectorSize, result.floor.id, result.wall.id, (byte)0, (byte)0, result.elevation); } } }