diff --git a/src/main/java/org/dynmap/MapManager.java b/src/main/java/org/dynmap/MapManager.java index 1f628b40..3649dc36 100644 --- a/src/main/java/org/dynmap/MapManager.java +++ b/src/main/java/org/dynmap/MapManager.java @@ -7,6 +7,7 @@ import java.util.List; import java.util.Map; import java.util.logging.Logger; +import org.bukkit.Chunk; import org.bukkit.Location; import org.bukkit.World; import org.bukkit.event.player.PlayerChatEvent; @@ -135,24 +136,28 @@ public class MapManager extends Thread { log.info("Map renderer has started."); while(running) { - boolean found = false; - MapTile t = staleQueue.popStaleTile(); if(t != null) { - debugger.debug("rendering tile " + t + "..."); + MapType map = t.getMap(); + World world = map.getWorld(); + + Chunk[] requiredChunks = map.getRequiredChunks(t); + debugger.debug("Loading " + requiredChunks.length + " chunks for tile " + t + "..."); + for (int i=0;i configuration) { this.debugger = debugger; - name = (String)configuration.get("prefix"); + name = (String) configuration.get("prefix"); } - - public void render(KzedMapTile tile, String path) { + + public boolean render(KzedMapTile tile, String path) { World world = tile.getMap().getWorld(); BufferedImage im = new BufferedImage(KzedMap.tileWidth, KzedMap.tileHeight, BufferedImage.TYPE_INT_RGB); WritableRaster r = im.getRaster(); + boolean isempty = true; int ix = tile.mx; int iy = tile.my; int iz = tile.mz; - + int jx, jz; int x, y; /* draw the map */ - for(y=0; y=0; x-=2) { + for (x = KzedMap.tileWidth - 1; x >= 0; x -= 2) { Color c1 = scan(world, jx, iy, jz, 0); Color c2 = scan(world, jx, iy, jz, 2); - + isempty = isempty && c1 == translucent && c2 == translucent; r.setPixel(x, y, new int[] { c1.getRed(), c1.getGreen(), c1.getBlue() }); - r.setPixel(x-1, y, new int[] { c2.getRed(), c2.getGreen(), c2.getBlue() }); + r.setPixel(x - 1, y, new int[] { c2.getRed(), c2.getGreen(), c2.getBlue() }); jx++; jz++; } - y ++; + y++; jx = ix; jz = iz - 1; - for(x=KzedMap.tileWidth-1; x>=0; x-=2) { + for (x = KzedMap.tileWidth - 1; x >= 0; x -= 2) { Color c1 = scan(world, jx, iy, jz, 2); jx++; jz++; Color c2 = scan(world, jx, iy, jz, 0); - + isempty = isempty && c1 == translucent && c2 == translucent; r.setPixel(x, y, new int[] { c1.getRed(), c1.getGreen(), c1.getBlue() }); - r.setPixel(x-1, y, new int[] { c2.getRed(), c2.getGreen(), c2.getBlue() }); + r.setPixel(x - 1, y, new int[] { c2.getRed(), c2.getGreen(), c2.getBlue() }); } - y ++; + y++; - ix ++; - iz --; + ix++; + iz--; } /* save the generated tile */ saveTile(tile, im, path); - - ((KzedMap)tile.getMap()).invalidateTile(new KzedZoomedMapTile((KzedMap)tile.getMap(), im, tile)); + + ((KzedMap) tile.getMap()).invalidateTile(new KzedZoomedMapTile((KzedMap)tile.getMap(), im, tile)); + + return !isempty; } - - protected Color scan(World world, int x, int y, int z, int seq) - { - for(;;) { - if(y < 0) - return Color.BLUE; + + protected Color scan(World world, int x, int y, int z, int seq) { + for (;;) { + if (y < 0) + return translucent; int id = world.getBlockTypeIdAt(x, y, z); - switch(seq) { + switch (seq) { case 0: x--; break; @@ -108,13 +111,13 @@ public class DefaultTileRenderer implements MapTileRenderer { seq = (seq + 1) & 3; - if(id != 0) { + if (id != 0) { Color[] colors = KzedMap.colors.get(id); - if(colors != null) { + if (colors != null) { Color c = colors[seq]; - if(c.getAlpha() > 0) { + if (c.getAlpha() > 0) { /* we found something that isn't transparent! */ - if(c.getAlpha() == 255) { + if (c.getAlpha() == 255) { /* it's opaque - the ray ends here */ return c; } @@ -137,138 +140,25 @@ public class DefaultTileRenderer implements MapTileRenderer { } } } - + /* save rendered tile, update zoom-out tile */ - public void saveTile(KzedMapTile tile, BufferedImage im, String path) - { + public void saveTile(KzedMapTile tile, BufferedImage im, String path) { String tilePath = getPath(tile, path); - + debugger.debug("saving tile " + tilePath); - + /* save image */ try { File file = new File(tilePath); ImageIO.write(im, "png", file); - } catch(IOException e) { + } catch (IOException e) { debugger.error("Failed to save tile: " + tilePath, e); - } catch(java.lang.NullPointerException e) { + } catch (java.lang.NullPointerException e) { debugger.error("Failed to save tile (NullPointerException): " + tilePath, e); } - - - - /* now update zoom-out tile */ - /*BufferedImage zIm = mgr.zoomCache.get(zoomPath); - - - if(zIm == null) { - // zoom-out tile doesn't exist - try to load it from disk - - mgr.debug("Trying to load zoom-out tile: " + zoomPath); - - try { - File file = new File(zoomPath); - zIm = ImageIO.read(file); - } catch(IOException e) { - } - - if(zIm == null) { - mgr.debug("Failed to load zoom-out tile: " + zoomPath); - // create new one - // TODO: we might use existing tiles that we could load - // to fill the zoomed out tile in... - zIm = new BufferedImage(MapManager.tileWidth, MapManager.tileHeight, BufferedImage.TYPE_INT_RGB); - } else { - mgr.debug("Loaded zoom-out tile from " + zoomPath); - } - } else { - mgr.debug("Using zoom-out tile from cache: " + zoomPath); - } - - // update zoom-out tile - - // scaled size - int scw = mgr.tileWidth / 2; - int sch = mgr.tileHeight / 2; - - // origin in zoomed-out tile - int ox = scw; - int oy = 0; - - if(zpx != px) ox = 0; - if(zpy != py) oy = sch; - - // blit scaled rendered tile onto zoom-out tile - WritableRaster zr = zIm.getRaster(); - Graphics2D g2 = zIm.createGraphics(); - g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); - g2.drawImage(im, ox, oy, scw, sch, null); - - // update zoom-out tile cache - BufferedImage oldIm = mgr.zoomCache.put(zoomPath, zIm); - if(oldIm != null && oldIm != zIm) { - oldIm.flush(); - } - - // save zoom-out tile - try { - File file = new File(zoomPath); - ImageIO.write(zIm, "png", file); - mgr.debug("saved zoom-out tile at " + zoomPath); - - //log.info("Saved tile: " + path); - } catch(IOException e) { - log.log(Level.SEVERE, "Failed to save zoom-out tile: " + zoomPath, e); - } catch(java.lang.NullPointerException e) { - log.log(Level.SEVERE, "Failed to save zoom-out tile (NullPointerException): " + zoomPath, e); - }*/ } - - public String getPath(KzedMapTile tile, String outputPath) - { + + public static String getPath(KzedMapTile tile, String outputPath) { return new File(new File(outputPath), tile.getName() + ".png").getPath(); } - - /* try to load already generated image */ - /*public BufferedImage loadTile(KzedMapTile tile) - { - try { - String path = getPath(tile); - //log.info("Loading tile from " + path); - File file = new File(path); - BufferedImage im = ImageIO.read(file); - //log.info("OK"); - return im; - } catch(IOException e) { - //log.info("failed: " + e.toString()); - } - - return null; - }*/ - - /* - // generate a path name for this map tile - public String getPath(MapManager mgr) - { - return mgr.tilepath + "t_" + px + "_" + py + ".png"; - } - - // generate a path name for the zoomed-out tile - public String getZoomPath(MapManager mgr) - { - return mgr.tilepath + "zt_" + zpx + "_" + zpy + ".png"; - } - - // generate a path name for this cave map tile - public String getCavePath(MapManager mgr) - { - return mgr.tilepath + "ct_" + px + "_" + py + ".png"; - } - - // generate a path name for the zoomed-out cave tile - public String getZoomCavePath(MapManager mgr) - { - return mgr.tilepath + "czt_" + zpx + "_" + zpy + ".png"; - } - */ } diff --git a/src/main/java/org/dynmap/kzedmap/KzedMap.java b/src/main/java/org/dynmap/kzedmap/KzedMap.java index 1fe82bdf..5e2b7b47 100644 --- a/src/main/java/org/dynmap/kzedmap/KzedMap.java +++ b/src/main/java/org/dynmap/kzedmap/KzedMap.java @@ -12,6 +12,7 @@ import java.util.Map; import java.util.Scanner; import java.util.logging.Logger; +import org.bukkit.Chunk; import org.bukkit.Location; import org.bukkit.World; import org.dynmap.MapManager; @@ -73,7 +74,7 @@ public class KzedMap extends MapType { } @Override - public void touch(Location l) { + public MapTile[] getTiles(Location l) { int x = l.getBlockX(); int y = l.getBlockY(); int z = l.getBlockZ(); @@ -87,37 +88,101 @@ public class KzedMap extends MapType { int tx = tilex(px); int ty = tiley(py); - invalidateTile(tx, ty); + ArrayList tiles = new ArrayList(); + + addTile(tiles, tx, ty); boolean ledge = tilex(px - 4) != tx; boolean tedge = tiley(py - 4) != ty; boolean redge = tilex(px + 4) != tx; boolean bedge = tiley(py + 4) != ty; - if(ledge) invalidateTile(tx - tileWidth, ty); - if(redge) invalidateTile(tx + tileWidth, ty); - if(tedge) invalidateTile(tx, ty - tileHeight); - if(bedge) invalidateTile(tx, ty + tileHeight); + if(ledge) addTile(tiles, tx - tileWidth, ty); + if(redge) addTile(tiles, tx + tileWidth, ty); + if(tedge) addTile(tiles, tx, ty - tileHeight); + if(bedge) addTile(tiles, tx, ty + tileHeight); - if(ledge && tedge) invalidateTile(tx - tileWidth, ty - tileHeight); - if(ledge && bedge) invalidateTile(tx - tileWidth, ty + tileHeight); - if(redge && tedge) invalidateTile(tx + tileWidth, ty - tileHeight); - if(redge && bedge) invalidateTile(tx + tileWidth, ty + tileHeight); + if(ledge && tedge) addTile(tiles, tx - tileWidth, ty - tileHeight); + if(ledge && bedge) addTile(tiles, tx - tileWidth, ty + tileHeight); + if(redge && tedge) addTile(tiles, tx + tileWidth, ty - tileHeight); + if(redge && bedge) addTile(tiles, tx + tileWidth, ty + tileHeight); + + MapTile[] result = new MapTile[tiles.size()]; + tiles.toArray(result); + return result; } - public void invalidateTile(int px, int py) { - for(MapTileRenderer renderer : renderers) { - invalidateTile(new KzedMapTile(this, renderer, px, py)); + @Override + public MapTile[] getAdjecentTiles(MapTile tile) { + if (tile instanceof KzedMapTile) { + KzedMapTile t = (KzedMapTile)tile; + MapTileRenderer renderer = t.renderer; + return new MapTile[] { + new KzedMapTile(this, renderer, t.px-tileWidth, t.py), + new KzedMapTile(this, renderer, t.px+tileWidth, t.py), + new KzedMapTile(this, renderer, t.px, t.py-tileHeight), + new KzedMapTile(this, renderer, t.px, t.py+tileHeight) + }; + } + return new MapTile[0]; + } + + public void addTile(ArrayList tiles, int px, int py) { + for (int i=0;i chunks = new ArrayList(); + World world = getWorld(); + for(x=x1; x