/* * This file is part of the Illarion project. * * Copyright © 2015 - Illarion e.V. * * Illarion is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Illarion is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. */ package illarion.mapedit.render; import illarion.mapedit.Lang; import illarion.mapedit.data.Map; import illarion.mapedit.data.MapTile; import illarion.mapedit.resource.Overlay; import illarion.mapedit.resource.TileImg; import illarion.mapedit.resource.loaders.ImageLoader; import illarion.mapedit.resource.loaders.OverlayLoader; import illarion.mapedit.resource.loaders.TileLoader; import illarion.mapedit.util.SwingLocation; import org.pushingpixels.flamingo.api.common.icon.ResizableIcon; import org.pushingpixels.flamingo.api.ribbon.RibbonElementPriority; import javax.annotation.Nonnull; import java.awt.*; import java.awt.geom.AffineTransform; /** * This renderer should render all tiles. * * @author Tim */ public class TileRenderer extends AbstractMapRenderer { private static final Color[] TILE_COLORS = {new Color(0, 0, 0), // black new Color(182, 214, 158), // green new Color(155, 120, 90), // brown new Color(175, 183, 165), // gray new Color(126, 193, 238), // blue new Color(255, 255, 204), // yellow new Color(205, 101, 101), // red new Color(255, 255, 255), // white new Color(140, 160, 100) // dark green }; /** * Render Empty tiles */ private boolean renderEmpty; /** * Creates a new map renderer */ public TileRenderer(@Nonnull RendererManager manager) { super(manager); } @Override public void renderMap( @Nonnull Map map, @Nonnull Rectangle viewport, int level, @Nonnull Graphics2D g) { int z = map.getZ() - level; AffineTransform transform = g.getTransform(); for (int x = 0; x < map.getWidth(); ++x) { for (int y = 0; y < map.getHeight(); ++y) { int xdisp = SwingLocation.displayCoordinateX(x + map.getX(), y + map.getY(), z); int ydisp = SwingLocation.displayCoordinateY(x + map.getX(), y + map.getY(), z); if (viewport.contains((xdisp * getZoom()) + getTranslateX() + (getTileWidth() * getZoom()), (ydisp * getZoom()) + getTranslateY() + (getTileHeight() * getZoom()))) { MapTile mt = map.getTileAt(x, y); if (renderEmpty || (mt != null && mt.getId() != 0)) { TileImg t = TileLoader.getInstance().getTileFromId(mt.getId()); if (t != null) { AffineTransform tr = g.getTransform(); if (getZoom() > getMinZoom()) { renderTile(xdisp, ydisp, g, t.getImg()[0]); renderOverlay(g, mt); } else { if (t.getInfo().getMapColor() != 0) { g.translate(xdisp, ydisp); g.setColor(TILE_COLORS[t.getInfo().getMapColor()]); g.fill(getTilePolygon()); } } g.setTransform(tr); } } } } } g.setTransform(transform); } private void renderTile( int xDisp, int yDisp, @Nonnull Graphics2D graphics, @Nonnull Image image) { graphics.translate(xDisp, yDisp); graphics.drawImage(image, 0, 0, null); } private void renderOverlay(@Nonnull Graphics2D graphics, @Nonnull MapTile mapTile) { Overlay o = OverlayLoader.getInstance().getOverlayFromId(mapTile.getOverlayID()); if (o != null) { Image imageOverlay = o.getImgs()[mapTile.getShapeID() - 1]; if (imageOverlay != null) { graphics.drawImage(imageOverlay, 0, 0, null); } } } @Override protected int getRenderPriority() { return 3; } @Override public String getLocalizedName() { return Lang.getMsg("renderer.Tile"); } @Override public ResizableIcon getRendererIcon() { return ImageLoader.getResizableIcon("file_tiles"); } @Override public boolean isDefaultOn() { return true; } @Nonnull @Override public RibbonElementPriority getPriority() { return RibbonElementPriority.TOP; } public String getEmptyTileLocalizedName() { return Lang.getMsg("renderer.EmptyTile"); } public ResizableIcon getEmptyTileRendererIcon() { return ImageLoader.getResizableIcon("file_tiles"); } public boolean isEmptyTileDefaultOn() { return true; } public void setRenderEmptyTiles(boolean renderEmptyTiles) { renderEmpty = renderEmptyTiles; } @Nonnull public RibbonElementPriority getEmptyTilePriority() { return RibbonElementPriority.TOP; } }