Bug fix for the map's "outside" property that wasn't handled properly.

Added support for the new "colorfilter" map property. Due to Java2D
having no correct color filter support, only the "blackXX" values can be
previwed. "bw" and "invert" cannot, the performance cost was simply way
too high.
This commit is contained in:
Zukero
2016-08-08 16:31:38 +02:00
parent 57b8209b26
commit 1458fb0aaa
13 changed files with 312 additions and 32 deletions

View File

@@ -29,6 +29,7 @@
package tiled.core;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.util.Properties;
/**
@@ -36,7 +37,7 @@ import java.util.Properties;
*/
public class Tile
{
private Image image;
private BufferedImage image;
private int id = -1;
private Properties properties;
private TileSet tileset;
@@ -76,7 +77,7 @@ public class Tile
*
* @param i the new image of the tile
*/
public void setImage(Image i) {
public void setImage(BufferedImage i) {
image = i;
}
@@ -133,7 +134,7 @@ public class Tile
*
* @return Image
*/
public Image getImage() {
public BufferedImage getImage() {
if (tileset != null && tileset.sheet != null) return tileset.sheet.getImage(getId());
return image;
}

View File

@@ -161,7 +161,7 @@ public class TileSet implements Iterable<Tile>
tilesPerRow = basicTileCutter.getTilesPerRow();
}
Image tileImage = cutter.getNextTile();
BufferedImage tileImage = cutter.getNextTile();
while (tileImage != null) {
Tile tile = new Tile();
tile.setImage(tileImage);
@@ -220,7 +220,7 @@ public class TileSet implements Iterable<Tile>
tileDimensions = new Rectangle(tileCutter.getTileDimensions());
int id = 0;
Image tileImage = tileCutter.getNextTile();
BufferedImage tileImage = tileCutter.getNextTile();
while (tileImage != null) {
Tile tile = getTile(id);
tile.setImage(tileImage);

View File

@@ -31,6 +31,7 @@ package tiled.io;
import java.awt.Color;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileNotFoundException;
@@ -223,9 +224,9 @@ public class TMXMapReader
return o;
}
private Image unmarshalImage(Node t, String baseDir) throws IOException
private BufferedImage unmarshalImage(Node t, String baseDir) throws IOException
{
Image img = null;
BufferedImage img = null;
String source = getAttributeValue(t, "source");
@@ -253,7 +254,7 @@ public class TMXMapReader
// size, somehow makes drawing of the tiles a lot
// faster on various systems (seen on Linux, Windows
// and MacOS X).
img = img.getScaledInstance(
img = (BufferedImage) img.getScaledInstance(
img.getWidth(null), img.getHeight(null),
Image.SCALE_FAST);
}
@@ -534,7 +535,7 @@ public class TMXMapReader
Node child = children.item(i);
if ("image".equalsIgnoreCase(child.getNodeName())) {
int id = getAttribute(child, "id", -1);
Image img = unmarshalImage(child, baseDir);
BufferedImage img = unmarshalImage(child, baseDir);
tile.setImage(img);
} else if ("animation".equalsIgnoreCase(child.getNodeName())) {
// TODO: fill this in once TMXMapWriter is complete

View File

@@ -64,7 +64,7 @@ public class BasicTileCutter implements TileCutter
this.image = image;
}
public Image getNextTile() {
public BufferedImage getNextTile() {
if (nextY + tileHeight + tileMargin <= image.getHeight()) {
BufferedImage tile =
image.getSubimage(nextX, nextY, tileWidth, tileHeight);

View File

@@ -48,7 +48,7 @@ public interface TileCutter
* @return the next tile image, or <code>null</code> when no more tile
* images are available
*/
public Image getNextTile();
public BufferedImage getNextTile();
/**
* Resets the tile cutter so that the next call to <code>getNextTile</code>

View File

@@ -30,6 +30,7 @@ package tiled.view;
import tiled.core.TileLayer;
import java.awt.*;
import java.awt.image.BufferedImageOp;
/**
* An interface defining methods to render a map.
@@ -50,5 +51,5 @@ public interface MapRenderer
* @param g the graphics context to paint to
* @param layer the layer to paint
*/
public void paintTileLayer(Graphics2D g, TileLayer layer);
public void paintTileLayer(Graphics2D g, TileLayer layer, BufferedImageOp filter);
}

View File

@@ -32,6 +32,8 @@ import tiled.core.Tile;
import tiled.core.TileLayer;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.awt.image.BufferedImageOp;
/**
* The orthogonal map renderer. This is the most basic map renderer, dealing
@@ -51,7 +53,7 @@ public class OrthogonalRenderer implements MapRenderer
map.getHeight() * map.getTileHeight());
}
public void paintTileLayer(Graphics2D g, TileLayer layer) {
public void paintTileLayer(Graphics2D g, TileLayer layer, BufferedImageOp filter ) {
final Rectangle clip = g.getClipBounds();
final int tileWidth = map.getTileWidth();
final int tileHeight = map.getTileHeight();
@@ -74,15 +76,17 @@ public class OrthogonalRenderer implements MapRenderer
final Tile tile = layer.getTileAt(x, y);
if (tile == null)
continue;
final Image image = tile.getImage();
final BufferedImage image = tile.getImage();
if (image == null)
continue;
g.drawImage(
image,
filter,
x * tileWidth,
(y + 1) * tileHeight - image.getHeight(null),
null);
(y + 1) * tileHeight - image.getHeight(null));
}
}

View File

@@ -38,6 +38,14 @@ public class TMXMap extends GameDataElement {
public static final String ABOVE_LAYER_NAME = "Above";
public static final String WALKABLE_LAYER_NAME = "Walkable";
public enum ColorFilter {
black20,
black40,
black60,
black80,
invert,
bw
}
public File tmxFile = null;
public tiled.core.Map tmxMap = null;
@@ -46,6 +54,7 @@ public class TMXMap extends GameDataElement {
public ProjectTreeNode parent;
public Integer outside = null;
public ColorFilter colorFilter = null;
public boolean writable = false;
@@ -62,8 +71,11 @@ public class TMXMap extends GameDataElement {
usedSpritesheets = new HashSet<Spritesheet>();
try {
tmxMap = new TMXMapReader().readMap(tmxFile.getAbsolutePath(), this);
if (tmxMap.getProperties().get("outside") != null) {
outside = new Integer(((String) tmxMap.getProperties().get("outside")));
if (tmxMap.getProperties().get("outdoors") != null) {
outside = new Integer(((String) tmxMap.getProperties().get("outdoors")));
}
if (tmxMap.getProperties().get("colorfilter") != null) {
colorFilter = ColorFilter.valueOf(((String) tmxMap.getProperties().get("colorfilter")));
}
} catch (FileNotFoundException e) {
Notification.addError("Impossible to load TMX map file "+tmxFile.getAbsolutePath());
@@ -97,8 +109,11 @@ public class TMXMap extends GameDataElement {
try {
clone.usedSpritesheets = new HashSet<Spritesheet>();
clone.tmxMap = new TMXMapReader().readMap(new StringReader(this.toXml()), clone);
if (clone.tmxMap.getProperties().get("outside") != null) {
clone.outside = new Integer(((String) clone.tmxMap.getProperties().get("outside")));
if (clone.tmxMap.getProperties().get("outdoors") != null) {
clone.outside = new Integer(((String) clone.tmxMap.getProperties().get("outdoors")));
}
if (clone.tmxMap.getProperties().get("colorfilter") != null) {
clone.colorFilter = ColorFilter.valueOf(((String) tmxMap.getProperties().get("colorfilter")));
}
for (tiled.core.MapLayer layer : clone.tmxMap.getLayers()) {
if (layer instanceof tiled.core.ObjectGroup) {
@@ -210,6 +225,17 @@ public class TMXMap extends GameDataElement {
}
public String toXml() {
if (outside != null && outside == 1) {
tmxMap.getProperties().put("outdoors", Integer.toString(outside));
} else {
tmxMap.getProperties().remove("outdoors");
}
if (colorFilter != null) {
tmxMap.getProperties().put("colorfilter", colorFilter.toString());
} else {
tmxMap.getProperties().remove("colorfilter");
}
for (MapObjectGroup group : groups) {
group.pushBackToTiledProperties();
if (!tmxMap.containsLayer(group.tmxGroup)) {

View File

@@ -14,6 +14,7 @@ import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import javax.swing.AbstractListModel;
import javax.swing.ComboBoxModel;
@@ -29,6 +30,7 @@ import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSpinner;
import javax.swing.JSpinner.NumberEditor;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.ListModel;
import javax.swing.SpinnerNumberModel;
@@ -147,6 +149,51 @@ public abstract class Editor extends JPanel implements ProjectElementListener {
});
return tfField;
}
public static JTextArea addTextArea(JPanel pane, String label, String initialValue, boolean editable, final FieldUpdateListener listener) {
String text= initialValue == null ? "" : initialValue.replaceAll("\\n", "\n");
JPanel tfPane = new JPanel();
tfPane.setLayout(new JideBoxLayout(tfPane, JideBoxLayout.LINE_AXIS, 6));
JLabel tfLabel = new JLabel(label);
tfPane.add(tfLabel, JideBoxLayout.FIX);
final JTextArea tfArea = new JTextArea(text);
tfArea.setEditable(editable);
tfPane.add(new JScrollPane(tfArea), JideBoxLayout.VARY);
JButton nullify = new JButton(new ImageIcon(DefaultIcons.getNullifyIcon()));
tfPane.add(nullify, JideBoxLayout.FIX);
nullify.setEnabled(editable);
pane.add(tfPane, JideBoxLayout.FIX);
nullify.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
tfArea.setText("");
listener.valueChanged(tfArea, null);
}
});
tfArea.getDocument().addDocumentListener(new DocumentListener() {
@Override
public void removeUpdate(DocumentEvent e) {
listener.valueChanged(tfArea, tfArea.getText().replaceAll("\n", Matcher.quoteReplacement("\n")));
}
@Override
public void insertUpdate(DocumentEvent e) {
listener.valueChanged(tfArea, tfArea.getText().replaceAll("\n", Matcher.quoteReplacement("\n")));
}
@Override
public void changedUpdate(DocumentEvent e) {
listener.valueChanged(tfArea, tfArea.getText().replaceAll("\n", Matcher.quoteReplacement("\n")));
}
});
// tfArea.addActionListener(new ActionListener() {
// @Override
// public void actionPerformed(ActionEvent e) {
// listener.valueChanged(tfArea, tfArea.getText().replaceAll("\n", "\\n"));
// }
// });
return tfArea;
}
// public static JSpinner addIntegerField(JPanel pane, String label, Integer initialValue, boolean allowNegatives, boolean editable) {
// return addIntegerField(pane, label, initialValue, allowNegatives, editable, nullListener);

View File

@@ -23,6 +23,7 @@ import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSpinner;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.ListModel;
import javax.swing.ListSelectionModel;
@@ -79,7 +80,7 @@ public class DialogueEditor extends JSONElementEditor {
private static final int SHOP_INDEX = 5;
private JTextField idField;
private JTextField messageField;
private JTextArea messageField;
private MyComboBox switchToNpcBox;
private RewardsListModel rewardsListModel;
@@ -127,7 +128,7 @@ public class DialogueEditor extends JSONElementEditor {
createButtonPane(pane, dialogue.getProject(), dialogue, Dialogue.class, dialogue.getImage(), null, listener);
idField = addTextField(pane, "Internal ID: ", dialogue.id, dialogue.writable, listener);
messageField = addTextField(pane, "Message: ", dialogue.message, dialogue.writable, listener);
messageField = addTextArea(pane, "Message: ", dialogue.message, dialogue.writable, listener);
switchToNpcBox = addNPCBox(pane, dialogue.getProject(), "Switch active NPC to: ", dialogue.switch_to_npc, dialogue.writable, listener);
CollapsiblePanel rewards = new CollapsiblePanel("Reaching this phrase gives the following rewards: ");

View File

@@ -1,24 +1,32 @@
package com.gpl.rpg.atcontentstudio.ui.gamedataeditors;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;
import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.border.EmptyBorder;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableModel;
import org.fife.ui.rtextarea.ColorBackgroundPainterStrategy;
import com.gpl.rpg.atcontentstudio.ATContentStudio;
import com.gpl.rpg.atcontentstudio.model.GameDataElement;
import com.gpl.rpg.atcontentstudio.model.ProjectTreeNode;
@@ -79,6 +87,7 @@ public class QuestEditor extends JSONElementEditor {
stagesTable.getColumnModel().getColumn(3).setMinWidth(130);
stagesTable.getColumnModel().getColumn(3).setMaxWidth(130);
stagesTable.setCellSelectionEnabled(true);
stagesTable.getColumnModel().getColumn(1).setCellRenderer(new MultilineCellRenderer());
stagesPane.add(new JScrollPane(stagesTable), BorderLayout.CENTER);
if (quest.writable) {
JPanel buttonPane = new JPanel();
@@ -330,6 +339,48 @@ public class QuestEditor extends JSONElementEditor {
updateJsonViewText(quest.toJsonString());
}
}
public class MultilineCellRenderer extends JTextArea implements TableCellRenderer {
private static final long serialVersionUID = 6539816623608859506L;
public MultilineCellRenderer() {
setLineWrap(true);
setWrapStyleWord(true);
//setOpaque(true);
}
@Override
public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus,
int row, int column) {
if (isSelected) {
setForeground(stagesTable.getSelectionForeground());
setBackground(stagesTable.getSelectionBackground());
} else {
setForeground(stagesTable.getForeground());
setBackground(stagesTable.getBackground());
}
setFont(stagesTable.getFont());
if (hasFocus) {
setBorder(UIManager.getBorder("Table.focusCellHighlightBorder"));
if (stagesTable.isCellEditable(row, column)) {
setForeground(UIManager.getColor("Table.focusCellForeground"));
setBackground(UIManager.getColor("Table.focusCellBackground"));
}
} else {
setBorder(BorderFactory.createLineBorder(getBackground(), 1));
}
setText((value == null ? "" : value.toString()));
int fh = getFontMetrics(getFont()).getHeight();
// int tl = getText().length();
setSize(stagesTable.getWidth(), fh);
stagesTable.setRowHeight(row, getPreferredSize().height);
return this;
}
}

View File

@@ -10,6 +10,7 @@ import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.color.ColorSpace;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
@@ -18,8 +19,14 @@ import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.awt.event.MouseMotionListener;
import java.awt.image.BandCombineOp;
import java.awt.image.BufferedImageOp;
import java.awt.image.ByteLookupTable;
import java.awt.image.ColorConvertOp;
import java.awt.image.LookupOp;
import java.awt.image.LookupTable;
import java.awt.image.ShortLookupTable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.LinkedList;
@@ -115,6 +122,7 @@ public class TMXMapEditor extends Editor {
private RSyntaxTextArea editorPane;
private IntegerBasedCheckBox outsideBox;
private JComboBox colorFilterBox;
private LayerListModel layerListModel;
private JList layerList;
private tiled.core.MapLayer selectedLayer;
@@ -206,6 +214,7 @@ public class TMXMapEditor extends Editor {
addLabelField(pane, "TMX File: ", ((TMXMap)target).tmxFile.getAbsolutePath());
createButtonPane(pane, map.getProject(), map, listener);
outsideBox = addIntegerBasedCheckBox(pane, "Map is outdoors", map.outside, map.writable, listener);
colorFilterBox = addEnumValueBox(pane, "Color Filter", TMXMap.ColorFilter.values(), map.colorFilter, map.writable, listener);
JSplitPane layersViewSplitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
layerListModel = new LayerListModel(map);
@@ -1242,12 +1251,51 @@ public class TMXMapEditor extends Editor {
}
private static final BufferedImageOp colorFilterBlack20 = null;
private static final BufferedImageOp colorFilterBlack40 = null;
private static final BufferedImageOp colorFilterBlack60 = null;
private static final BufferedImageOp colorFilterBlack80 = null;
private static final BufferedImageOp colorFilterInvert = null;
private static final BufferedImageOp colorFilterBW = null;
// private static final BufferedImageOp colorFilterBlack20 = createGrayScaleColorFilter(0.8f);
// private static final BufferedImageOp colorFilterBlack40 = createGrayScaleColorFilter(0.6f);
// private static final BufferedImageOp colorFilterBlack60 = createGrayScaleColorFilter(0.4f);
// private static final BufferedImageOp colorFilterBlack80 = createGrayScaleColorFilter(0.2f);
// private static final BufferedImageOp colorFilterInvert = createInvertColorFilter();
// private static final BufferedImageOp colorFilterBW = createBWColorFilter();
//
// private static BufferedImageOp createGrayScaleColorFilter(float f) {
// byte[] gs = new byte[256];
// for (int i=0; i < 256; i++) {
// gs[i] = (byte)( i * f);
// }
// return new LookupOp(new ByteLookupTable(0, gs), null);
// }
//
// private static BufferedImageOp createInvertColorFilter() {
// byte[] invert = new byte[256];
// for (int i=0; i < 256; i++) {
// invert[i] = (byte) (255 - i);
// }
// return new LookupOp(new ByteLookupTable(0, invert), null);
// }
//
//
// private static BufferedImageOp createBWColorFilter() {
// return new ColorConvertOp(ColorSpace.getInstance(ColorSpace.CS_GRAY), null);
// }
public class TMXViewer extends JPanel implements Scrollable {
private static final long serialVersionUID = 2845032142029325865L;
public tiled.core.MapObject highlighted = null;
private MapRenderer renderer;
private FieldUpdateListener listener;
private TMXMap map;
public boolean resizing = false;
public boolean moving = false;
@@ -1257,7 +1305,8 @@ public class TMXMapEditor extends Editor {
return new Rectangle(selectedMapObject.x + selectedMapObject.w - 16, selectedMapObject.y + selectedMapObject.h - 16, 16, 16);
}
public Rectangle getMoveHitArea() {
public Rectangle getMoveHitArea() {
//16x16 px square in the upper left corner of area
return new Rectangle(selectedMapObject.x, selectedMapObject.y, 16, 16);
}
@@ -1270,6 +1319,7 @@ public class TMXMapEditor extends Editor {
public TMXViewer(final TMXMap map, FieldUpdateListener listener) {
this.listener = listener;
renderer = createRenderer(map.tmxMap);
this.map = map;
setPreferredSize(renderer.getMapSize());
setOpaque(true);
@@ -1383,20 +1433,86 @@ public class TMXMapEditor extends Editor {
public void paintComponent(Graphics g) {
final Graphics2D g2d = (Graphics2D) g.create();
final Rectangle clip = g2d.getClipBounds();
BufferedImageOp filter = null;
if (map.colorFilter != null) {
switch(map.colorFilter) {
case black20:
filter=colorFilterBlack20;
break;
case black40:
filter=colorFilterBlack40;
break;
case black60:
filter=colorFilterBlack60;
break;
case black80:
filter=colorFilterBlack80;
break;
case bw:
filter=colorFilterBW;
break;
case invert:
filter=colorFilterInvert;
break;
default:
break;
}
}
// Draw a gray background
g2d.setPaint(new Color(100, 100, 100));
g2d.fill(clip);
// Draw each tile map layer
boolean paintSelected = false;
for (tiled.core.MapLayer layer : ((TMXMap)target).tmxMap) {
if (layer instanceof tiled.core.TileLayer && layer.isVisible()) {
renderer.paintTileLayer(g2d, (tiled.core.TileLayer) layer);
} else if (layer instanceof tiled.core.ObjectGroup && layer.isVisible()) {
renderer.paintTileLayer(g2d, (tiled.core.TileLayer) layer, filter);
}
}
if (map.colorFilter != null) {
switch(map.colorFilter) {
case black20:
g2d.setPaint(new Color(0f, 0f, 0f, 0.2f));
g2d.fill(clip);
break;
case black40:
g2d.setPaint(new Color(0f, 0f, 0f, 0.4f));
g2d.fill(clip);
break;
case black60:
g2d.setPaint(new Color(0f, 0f, 0f, 0.6f));
g2d.fill(clip);
break;
case black80:
g2d.setPaint(new Color(0f, 0f, 0f, 0.8f));
g2d.fill(clip);
break;
case bw:
break;
case invert:
break;
default:
break;
}
}
// Draw each object map layer
boolean paintSelected = false;
for (tiled.core.MapLayer layer : ((TMXMap)target).tmxMap) {
if (layer instanceof tiled.core.ObjectGroup && layer.isVisible()) {
paintSelected |= paintObjectGroup(g2d, (tiled.core.ObjectGroup) layer);
}
}
if (paintSelected) {
//TODO make this less ugly..... visually speaking.
g2d.setColor(new Color(190, 20, 20));
@@ -1725,6 +1841,10 @@ public class TMXMapEditor extends Editor {
}
} else if (source == outsideBox) {
map.outside = (Integer)value;
} else if (source == colorFilterBox) {
map.colorFilter = (TMXMap.ColorFilter) value;
tmxViewer.revalidate();
tmxViewer.repaint();
} else if (source == droplistBox) {
if (selectedMapObject instanceof ContainerArea) {
ContainerArea area = (ContainerArea)selectedMapObject;
@@ -2050,6 +2170,34 @@ public class TMXMapEditor extends Editor {
final Graphics2D g2d = (Graphics2D) g.create();
final Rectangle clip = g2d.getClipBounds();
BufferedImageOp filter = null;
if (map.colorFilter != null) {
switch(map.colorFilter) {
case black20:
filter=colorFilterBlack20;
break;
case black40:
filter=colorFilterBlack40;
break;
case black60:
filter=colorFilterBlack60;
break;
case black80:
filter=colorFilterBlack80;
break;
case bw:
filter=colorFilterBW;
break;
case invert:
filter=colorFilterInvert;
break;
default:
break;
}
}
// Draw a gray background
g2d.setPaint(new Color(100, 100, 100));
g2d.fill(clip);
@@ -2057,19 +2205,19 @@ public class TMXMapEditor extends Editor {
// Draw each tile map layer
if (ground != null) {
renderer.paintTileLayer(g2d, ground);
renderer.paintTileLayer(g2d, ground, filter);
}
if (objects != null) {
renderer.paintTileLayer(g2d, objects);
renderer.paintTileLayer(g2d, objects, filter);
}
if (above != null) {
renderer.paintTileLayer(g2d, above);
renderer.paintTileLayer(g2d, above, filter);
}
if (walkable != null && showWalkable) {
renderer.paintTileLayer(g2d, walkable);
renderer.paintTileLayer(g2d, walkable, filter);
}
if (highlighted != null) {

View File

@@ -81,7 +81,7 @@ public class WorldMapView extends JComponent implements Scrollable {
for (tiled.core.MapLayer layer : ((TMXMap)map).tmxMap) {
if (layer instanceof tiled.core.TileLayer && layer.isVisible()) {
if (layer.getName().equalsIgnoreCase("walkable")) continue;
renderer.paintTileLayer(g2, (tiled.core.TileLayer) layer);
renderer.paintTileLayer(g2, (tiled.core.TileLayer) layer, null);
} else if (layer instanceof tiled.core.ObjectGroup && layer.isVisible()) {
// paintObjectGroup(g2, map, (tiled.core.ObjectGroup) layer);
}