diff --git a/src/main/java/gui/GuiMap.java b/src/main/java/gui/GuiMap.java index e61446d..9777ee3 100644 --- a/src/main/java/gui/GuiMap.java +++ b/src/main/java/gui/GuiMap.java @@ -473,4 +473,8 @@ public RegionImageHandler getRegionHandler() { public void setChunkState(Coordinate2D coords, ChunkImageState state) { regionHandler.setChunkState(coords, state); } + + public Bounds getBounds() { + return bounds; + } } diff --git a/src/main/java/gui/ZoomBehaviour.java b/src/main/java/gui/ZoomBehaviour.java index 405b7fe..5adddf1 100644 --- a/src/main/java/gui/ZoomBehaviour.java +++ b/src/main/java/gui/ZoomBehaviour.java @@ -6,7 +6,7 @@ public interface ZoomBehaviour { double initialBlocksPerPixel = 1.0; - double maxBlocksPerPixel = 64; + double maxBlocksPerPixel = 256; double minBlocksPerPixel = 1.0 / 16.0; double zoomInMultiplier = 2; diff --git a/src/main/java/gui/images/RegionImage.java b/src/main/java/gui/images/RegionImage.java index 3616204..b218fb4 100644 --- a/src/main/java/gui/images/RegionImage.java +++ b/src/main/java/gui/images/RegionImage.java @@ -59,6 +59,7 @@ public RegionImage(Path path, Coordinate2D coords) { } private RegionImage(WritableImage image, Path path, Coordinate2D coords) { + this.coordinates = coords; this.currentSize = MIN_SIZE; this.targetSize = MIN_SIZE; this.path = path; @@ -66,7 +67,6 @@ private RegionImage(WritableImage image, Path path, Coordinate2D coords) { this.image = image; this.buffer = new byte[16 * 16 * 4]; this.saved = true; - this.coordinates = coords; chunkOverlay = new WritableImage(Region.REGION_SIZE, Region.REGION_SIZE); @@ -94,7 +94,7 @@ public static RegionImage of(Path directoryPath, Coordinate2D coordinate) { WritableImage image = loadFromFile(directoryPath, coordinate, MIN_SIZE); return new RegionImage(image, directoryPath, coordinate); - } catch (IOException e) { + } catch (Exception e) { return new RegionImage(directoryPath, coordinate); } } @@ -201,8 +201,8 @@ public Image getImage() { } public void drawChunk(Coordinate2D local, Image chunkImage) { - lastUpdated = System.currentTimeMillis(); - saved = false; + this.lastUpdated = System.currentTimeMillis(); + this.saved = false; if (targetSize < SIZE || currentSize < SIZE) { targetSize = SIZE; @@ -233,7 +233,6 @@ public void save() throws IOException { if (saved) { return; } - saved = true; File f = getFile(path, NORMAL_PREFIX, coordinates); BufferedImage img = SwingFXUtils.fromFXImage(image, null); @@ -242,6 +241,8 @@ public void save() throws IOException { img = resize(img, MIN_SIZE); f = getFile(path, SMALL_PREFIX, coordinates); ImageIO.write(img, "png", f); + + saved = true; } public static File getFile(Path p, String prefix, Coordinate2D coords) { diff --git a/src/main/java/gui/images/RegionImageHandler.java b/src/main/java/gui/images/RegionImageHandler.java index e3aaff0..273f700 100644 --- a/src/main/java/gui/images/RegionImageHandler.java +++ b/src/main/java/gui/images/RegionImageHandler.java @@ -82,7 +82,9 @@ public void drawChunk(CoordinateDim2D coordinate, Map imageMap } Coordinate2D region = coordinate.chunkToRegion(); - RegionImages images = regions.computeIfAbsent(region, (coordinate2D -> loadRegion(region))); + RegionImages images = regions.computeIfAbsent(region, + coordinate2D -> RegionImages.loadRegion(activeDimension, region) + ); Coordinate2D local = coordinate.toRegionLocal(); @@ -116,16 +118,6 @@ public void markChunkSaved(CoordinateDim2D coordinate) { setChunkState(coordinate, ChunkImageState.SAVED); } - private RegionImages loadRegion(Coordinate2D coordinate) { - return RegionImages.of(activeDimension, coordinate); - } - - private void allowResample(Map regions, Dimension activeDimension) { - regions.forEach((coordinate, image) -> { - attempt(() -> image.allowResample()); - }); - } - private void save(Map regions, Dimension dim) { // if shutdown is called, wait for saving to complete if (isSaving) { @@ -151,10 +143,6 @@ public void save() { save(this.regions, this.activeDimension); } - public void allowResample() { - allowResample(this.regions, this.activeDimension); - } - private void unload() { this.regions = new ConcurrentHashMap<>(); } @@ -162,21 +150,17 @@ private void unload() { /** * Searches for all region files in a directory to load them in. */ - private void load() { - Map regionMap = regions; - + private void loadFromFile() { new Thread(() -> attemptQuiet(() -> { - for (ImageMode mode : ImageMode.values()) { - Files.walk(dimensionPath(this.activeDimension, mode), 1) - .limit(3200) - .forEach(image -> attempt(() -> load(regionMap, mode, image))); - } + // walk one of the modes, check for the others if we find one + Files.walk(dimensionPath(this.activeDimension, ImageMode.NORMAL), 1) + .limit(32000) + .forEach(image -> attempt(() -> loadFromFile(regions, this.activeDimension, image))); })).start(); } - private void load(Map regionMap, ImageMode mode, Path image) { - if (!image.toString().toLowerCase().endsWith("png") || image.getFileName().startsWith( - SMALL_PREFIX)) { + private static void loadFromFile(Map regions, Dimension dim, Path image) { + if (!image.toString().toLowerCase().endsWith("png") || image.getFileName().startsWith(SMALL_PREFIX)) { return; } @@ -186,8 +170,7 @@ private void load(Map regionMap, ImageMode mode, Pat int z = Integer.parseInt(parts[2]); Coordinate2D regionCoordinate = new Coordinate2D(x, z); - Path p = image.getParent(); - regionMap.computeIfAbsent(regionCoordinate, k -> new RegionImages(p, regionCoordinate)).set(mode, p); + regions.computeIfAbsent(regionCoordinate, coord -> RegionImages.loadRegion(dim, coord)); } public void setDimension(Dimension dimension) { @@ -201,7 +184,7 @@ public void setDimension(Dimension dimension) { } this.activeDimension = dimension; - load(); + loadFromFile(); } static Path dimensionPath(Dimension dim) { @@ -286,26 +269,19 @@ public void resetRegion(Coordinate2D region) { } class RegionImages { - Coordinate2D coordinate; - RegionImage normal; - RegionImage caves; + final RegionImage normal; + final RegionImage caves; - public RegionImages(RegionImage normal, RegionImage caves) { + public RegionImages(Coordinate2D coordinate, RegionImage normal, RegionImage caves) { this.normal = normal; this.caves = caves; } - public RegionImages(Path p, Coordinate2D coordinate2D) { - normal = new RegionImage(p, coordinate2D); - caves = new RegionImage(p, coordinate2D); - coordinate = coordinate2D; - } - - public static RegionImages of(Dimension dimension, Coordinate2D coordinate) { + public static RegionImages loadRegion(Dimension dimension, Coordinate2D coordinate) { RegionImage normal = RegionImage.of(RegionImageHandler.dimensionPath(dimension, ImageMode.NORMAL), coordinate); RegionImage caves = RegionImage.of(RegionImageHandler.dimensionPath(dimension, ImageMode.CAVES), coordinate); - return new RegionImages(normal, caves); + return new RegionImages(coordinate, normal, caves); } public RegionImage getImage(ImageMode mode) { @@ -327,13 +303,6 @@ public void save() throws IOException { caves.save(); } - public void set(ImageMode mode, Path image) { - switch (mode) { - case NORMAL -> normal = RegionImage.of(image, coordinate); - case CAVES -> caves = RegionImage.of(image, coordinate); - }; - } - public boolean updateSize(boolean isVisible, ImageMode mode, double blocksPerPixel) { boolean shouldResize = caves.setTargetSize(isVisible && mode == ImageMode.CAVES, blocksPerPixel); shouldResize |= normal.setTargetSize(isVisible && mode == ImageMode.NORMAL, blocksPerPixel);