Gridarta Editor
IsoMapRenderer.java
Go to the documentation of this file.
1 /*
2  * Gridarta MMORPG map editor for Crossfire, Daimonin and similar games.
3  * Copyright (C) 2000-2023 The Gridarta Developers.
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 2 of the License, or
8  * (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License along
16  * with this program; if not, write to the Free Software Foundation, Inc.,
17  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18  */
19 
20 package net.sf.gridarta.gui.map.renderer;
21 
22 import java.awt.Color;
23 import java.awt.Graphics;
24 import java.awt.Graphics2D;
25 import java.awt.Point;
26 import javax.swing.Icon;
41 import org.jetbrains.annotations.NotNull;
42 
47 public class IsoMapRenderer<G extends DefaultIsoGameObject<G, A, R>, A extends MapArchObject<A>, R extends Archetype<G, A, R>> extends AbstractIsoMapRenderer<G, A, R> {
48 
52  private static final long serialVersionUID = 1L;
53 
54  @NotNull
56 
57  @NotNull
58  private final Color @NotNull [] highLightMask = { new Color(1.0f, 0.0f, 0.0f, 0.33f), new Color(0.0f, 1.0f, 0.0f, 0.33f), new Color(0.0f, 1.0f, 1.0f, 0.33f), };
59 
60  @NotNull
61  private final Icon emptySquareIcon;
62 
66  @NotNull
68 
72  @NotNull
74 
78  @NotNull
79  private final FilterState filterState = new FilterState();
80 
84  private final int @NotNull [] xPoints = new int[4];
85 
89  private final int @NotNull [] yPoints = new int[4];
90 
94  @NotNull
95  private final Point point = new Point();
96 
101  @NotNull
102  private final FilterConfigListener filterConfigListener = (filterConfigChangeType, filterConfig) -> forceRepaint();
103 
119  public IsoMapRenderer(final int spawnPointTypeNo, @NotNull final MapViewSettings mapViewSettings, @NotNull final FilterControl<G, A, R> filterControl, @NotNull final MapModel<G, A, R> mapModel, @NotNull final MapGrid mapGrid, @NotNull final MultiPositionData multiPositionData, @NotNull final IsoMapSquareInfo isoMapSquareInfo, @NotNull final GridMapSquarePainter gridMapSquarePainter, @NotNull final GameObjectParser<G, A, R> gameObjectParser, @NotNull final ResourceIcons resourceIcons) {
121  this.filterControl = filterControl;
122  emptySquareIcon = resourceIcons.getResourceIcon(ResourceIcons.SQUARE_EMPTY);
123  this.mapViewSettings = mapViewSettings;
124  this.isoMapSquareInfo = isoMapSquareInfo;
125  this.filterControl.addConfigListener(filterConfigListener);
126  }
127 
128  @Override
129  public void closeNotify() {
130  super.closeNotify();
132  }
133 
134  @Override
135  protected void clearBackground(@NotNull final Graphics g) {
136  }
137 
138  @Override
139  protected boolean isGameObjectVisible(@NotNull final G gameObject) {
140  return mapViewSettings.isEditType(gameObject);
141  }
142 
143  @Override
144  protected void paintSquare(@NotNull final Graphics2D g, final int x, final int y, @NotNull final MapSquare<G, A, R> square) {
145  point.setLocation(square.getMapX(), square.getMapY());
146  final int[] yOffsets = tileStretchingOffsets(point, foundSubLayers);
147  int highestSubLayer = 0;
148  for (int subLayer = 0; subLayer < yOffsets.length; subLayer++) {
149  if (yOffsets[subLayer] < yOffsets[highestSubLayer]) {
150  highestSubLayer = subLayer;
151  }
152  }
154  if (square.isEmpty()) {
155  emptySquareIcon.paintIcon(this, g, x, y + yOffsets[0]);
156  } else {
157  for (final G node : square) {
159  if (filterControl.canShow(node)) {
160  final G head = node.getHead();
161  final int subLayer;
162  if (head.getAttributeInt(DefaultIsoGameObject.LAYER) == 0) {
163  subLayer = highestSubLayer;
164  } else {
165  subLayer = head.getAttributeInt(DefaultIsoGameObject.SUB_LAYER);
166  }
167  paintGameObjectIfVisible(g, x, y + yOffsets[subLayer], node);
168  }
169  }
170  }
171  for (int subLayer = 0; subLayer < yOffsets.length; subLayer++) {
172  if (!foundSubLayers[subLayer]) {
173  continue;
174  }
175 
176  for (int i = 0; i < FilterControl.MAX_HIGHLIGHT; i++) {
178  final Color color = g.getColor();
179  g.setColor(highLightMask[i]);
180  xPoints[0] = x + isoMapSquareInfo.getXLen() / 2;
181  xPoints[1] = x + isoMapSquareInfo.getXLen() - 1;
182  xPoints[2] = xPoints[0];
183  xPoints[3] = x;
184  yPoints[0] = y + yOffsets[subLayer];
185  yPoints[1] = y + yOffsets[subLayer] + isoMapSquareInfo.getYLen() / 2;
186  yPoints[2] = y + yOffsets[subLayer] + isoMapSquareInfo.getYLen() - 1;
187  yPoints[3] = yPoints[1];
188  g.fillPolygon(xPoints, yPoints, 4);
189  g.setColor(color);
190  }
191  }
192  }
193  }
194 
195 }
net.sf.gridarta.gui.map.renderer.IsoMapRenderer.yPoints
final int[] yPoints
The y-coordinates for painting highlighted squares.
Definition: IsoMapRenderer.java:89
net.sf.gridarta.gui.map.renderer.IsoMapRenderer.filterState
final FilterState filterState
The filter state instance for this map renderer.
Definition: IsoMapRenderer.java:79
net.sf.gridarta.model.mapmodel.MapModel
A MapModel reflects the data of a map.
Definition: MapModel.java:75
net.sf.gridarta.model.gameobject.DefaultIsoGameObject
Default implementation for GameObject implementing classes.
Definition: DefaultIsoGameObject.java:38
net.sf.gridarta.gui.map.renderer.IsoMapRenderer.clearBackground
void clearBackground(@NotNull final Graphics g)
Definition: IsoMapRenderer.java:135
net.sf.gridarta.gui.map.renderer.IsoMapRenderer.isGameObjectVisible
boolean isGameObjectVisible(@NotNull final G gameObject)
Definition: IsoMapRenderer.java:139
net.sf.gridarta.gui.filter.FilterControl.newSquare
void newSquare(@NotNull FilterState filterState)
net.sf.gridarta.gui.map.renderer.AbstractIsoMapRenderer< G, A, R >::multiPositionData
final MultiPositionData multiPositionData
The MultiPositionData instance to query for multi-part objects.
Definition: AbstractIsoMapRenderer.java:142
net.sf.gridarta
Base package of all Gridarta classes.
net.sf.gridarta.gui.filter.FilterState
The highlighted state while using a FilterControl instance.
Definition: FilterState.java:29
net.sf.gridarta.gui.map.renderer.AbstractIsoMapRenderer< G, A, R >::tileStretchingOffsets
int[] tileStretchingOffsets( @NotNull final Point point, final boolean @NotNull[] foundSubLayers)
Calculates the tile stretching Y offset.
Definition: AbstractIsoMapRenderer.java:823
net.sf.gridarta.model.mapmodel.MapSquare
A single Map Square.
Definition: MapSquare.java:45
net.sf.gridarta.gui.map.renderer.AbstractIsoMapRenderer< G, A, R >::mapGrid
final MapGrid mapGrid
The MapGrid to render.
Definition: AbstractIsoMapRenderer.java:113
net.sf.gridarta.model.mapviewsettings
Definition: AbstractMapViewSettings.java:20
net.sf.gridarta.model.gameobject.IsoMapSquareInfo
Provides information about isometric map squares.
Definition: IsoMapSquareInfo.java:26
net.sf
net.sf.gridarta.gui.map.renderer.IsoMapRenderer.isoMapSquareInfo
final IsoMapSquareInfo isoMapSquareInfo
The IsoMapSquareInfo to use.
Definition: IsoMapRenderer.java:73
net.sf.gridarta.gui.map.renderer.IsoMapRenderer.xPoints
final int[] xPoints
The x-coordinates for painting highlighted squares.
Definition: IsoMapRenderer.java:84
net.sf.gridarta.model.mapmodel
Definition: AboveFloorInsertionMode.java:20
net.sf.gridarta.gui.map.renderer.AbstractIsoMapRenderer< G, A, R >::paintGameObjectIfVisible
void paintGameObjectIfVisible( @NotNull final Graphics2D g, final int xStart, final int yStart, @NotNull final G gameObject)
Paints a single game object if it is visible according to current editor settings.
Definition: AbstractIsoMapRenderer.java:550
net.sf.gridarta.gui.map.renderer.IsoMapRenderer.filterControl
final FilterControl< G, A, R > filterControl
Definition: IsoMapRenderer.java:55
net.sf.gridarta.model.gameobject.DefaultIsoGameObject.SUB_LAYER
static final String SUB_LAYER
The name of the "sub_layer" attribute.
Definition: DefaultIsoGameObject.java:67
net.sf.gridarta.gui.map.renderer.IsoMapRenderer.highLightMask
final Color[] highLightMask
Definition: IsoMapRenderer.java:58
net.sf.gridarta.model.archetype
Definition: AbstractArchetype.java:20
net.sf.gridarta.utils.ResourceIcons.SQUARE_EMPTY
static final String SQUARE_EMPTY
Definition: ResourceIcons.java:80
net.sf.gridarta.model.mapviewsettings.MapViewSettings
Container for settings that affect the rendering of maps.
Definition: MapViewSettings.java:30
net.sf.gridarta.gui.map.renderer.IsoMapRenderer.point
final Point point
Used for calculations in paintSquare.
Definition: IsoMapRenderer.java:95
net.sf.gridarta.gui.map.renderer.AbstractIsoMapRenderer< G, A, R >::spawnPointTypeNo
final int spawnPointTypeNo
The game object type number of spawn points.
Definition: AbstractIsoMapRenderer.java:82
net.sf.gridarta.gui.map.renderer.GridMapSquarePainter
Paints overlays for map grids.
Definition: GridMapSquarePainter.java:34
net.sf.gridarta.model.filter.FilterConfigListener
Interface for listeners interested in FilterConfig related changes.
Definition: FilterConfigListener.java:30
net.sf.gridarta.gui
Graphical User Interface of Gridarta.
net.sf.gridarta.gui.filter
Classes for Filters.
Definition: BtnPopup.java:20
net.sf.gridarta.model.gameobject.IsoMapSquareInfo.getXLen
int getXLen()
Returns the horizontal size of a square.
Definition: IsoMapSquareInfo.java:66
net.sf.gridarta.model.gameobject
GameObjects are the objects based on Archetypes found on maps.
Definition: AbstractGameObject.java:20
net
net.sf.gridarta.gui.map.renderer.AbstractIsoMapRenderer< G, A, R >::mapModel
final MapModel< G, A, R > mapModel
The MapModel to render.
Definition: AbstractIsoMapRenderer.java:101
net.sf.gridarta.gui.map.renderer.IsoMapRenderer.serialVersionUID
static final long serialVersionUID
Serial Version UID.
Definition: IsoMapRenderer.java:52
net.sf.gridarta.gui.filter.FilterControl.canShow
boolean canShow(@NotNull G gameObject)
net.sf.gridarta.gui.filter.FilterControl.isHighlightedSquare
boolean isHighlightedSquare(@NotNull FilterState filterState, int path)
net.sf.gridarta.model.maparchobject.MapArchObject
Interface for MapArchObjects.
Definition: MapArchObject.java:40
net.sf.gridarta.model.mapviewsettings.MapViewSettings.isEditType
boolean isEditType(int editType)
Get information on the current state of edit type.
net.sf.gridarta.model.filter
Definition: AbstractFilterConfig.java:20
net.sf.gridarta.gui.filter.FilterControl.objectInSquare
void objectInSquare(@NotNull FilterState filterState, @NotNull G gameObject)
net.sf.gridarta.model.gameobject.DefaultIsoGameObject.LAYER
static final String LAYER
The name of the "layer" attribute.
Definition: DefaultIsoGameObject.java:61
net.sf.gridarta.model.io
Reading and writing of maps, handling of paths.
Definition: AbstractAnimationObjectsReader.java:20
net.sf.gridarta.utils.ResourceIcons.SQUARE_UNKNOWN
static final String SQUARE_UNKNOWN
Definition: ResourceIcons.java:83
net.sf.gridarta.model.mapgrid.MapGrid
2D-Grid containing flags for selection, pre-selection, cursor, warnings and errors.
Definition: MapGrid.java:46
net.sf.gridarta.gui.map.renderer.AbstractIsoMapRenderer< G, A, R >::forceRepaint
void forceRepaint()
Definition: AbstractIsoMapRenderer.java:455
net.sf.gridarta.gui.map.renderer.IsoMapRenderer.IsoMapRenderer
IsoMapRenderer(final int spawnPointTypeNo, @NotNull final MapViewSettings mapViewSettings, @NotNull final FilterControl< G, A, R > filterControl, @NotNull final MapModel< G, A, R > mapModel, @NotNull final MapGrid mapGrid, @NotNull final MultiPositionData multiPositionData, @NotNull final IsoMapSquareInfo isoMapSquareInfo, @NotNull final GridMapSquarePainter gridMapSquarePainter, @NotNull final GameObjectParser< G, A, R > gameObjectParser, @NotNull final ResourceIcons resourceIcons)
Creates a new instance.
Definition: IsoMapRenderer.java:119
net.sf.gridarta.model.gameobject.IsoMapSquareInfo.getYLen
int getYLen()
Returns the vertical size of a square.
Definition: IsoMapSquareInfo.java:82
net.sf.gridarta.model.mapgrid
Definition: MapGrid.java:20
net.sf.gridarta.gui.map.renderer.IsoMapRenderer.paintSquare
void paintSquare(@NotNull final Graphics2D g, final int x, final int y, @NotNull final MapSquare< G, A, R > square)
Definition: IsoMapRenderer.java:144
net.sf.gridarta.gui.filter.FilterControl
Definition: FilterControl.java:33
net.sf.gridarta.gui.map.renderer.AbstractIsoMapRenderer< G, A, R >::foundSubLayers
final boolean[] foundSubLayers
Boolean array for tileStretchingOffsets to avoid allocating lots of arrays.
Definition: AbstractIsoMapRenderer.java:170
net.sf.gridarta.model
net.sf.gridarta.model.archetype.Archetype
Reflects an Archetype.
Definition: Archetype.java:41
net.sf.gridarta.gui.filter.FilterControl.removeConfigListener
void removeConfigListener(@NotNull FilterConfigListener listener)
Removes a FilterConfigListener to be notified about changes.
net.sf.gridarta.gui.filter.FilterControl.MAX_HIGHLIGHT
int MAX_HIGHLIGHT
Definition: FilterControl.java:35
net.sf.gridarta.model.gameobject.MultiPositionData
The MultiPositionData class stores an array of numbers which is required in order to calculate displa...
Definition: MultiPositionData.java:44
net.sf.gridarta.model.maparchobject
Definition: AbstractMapArchObject.java:20
net.sf.gridarta.utils.ResourceIcons
Creates ImageIcon instances from resources.
Definition: ResourceIcons.java:46
net.sf.gridarta.gui.map.renderer.IsoMapRenderer.filterConfigListener
final FilterConfigListener filterConfigListener
The FilterConfigListener attached to filterControl to repaint all after config changes.
Definition: IsoMapRenderer.java:102
net.sf.gridarta.model.io.GameObjectParser
Interface for classes that read or write GameObject instances.
Definition: GameObjectParser.java:37
net.sf.gridarta.gui.map.renderer.IsoMapRenderer.closeNotify
void closeNotify()
Definition: IsoMapRenderer.java:129
net.sf.gridarta.gui.map.renderer.AbstractIsoMapRenderer< G, A, R >::gridMapSquarePainter
final GridMapSquarePainter gridMapSquarePainter
The GridMapSquarePainter to use.
Definition: AbstractIsoMapRenderer.java:154
net.sf.gridarta.utils
Definition: ActionBuilderUtils.java:20
net.sf.gridarta.gui.map.renderer.AbstractIsoMapRenderer
A MapRenderer that renders isometric squares.
Definition: AbstractIsoMapRenderer.java:66
net.sf.gridarta.gui.map.renderer.IsoMapRenderer.mapViewSettings
final MapViewSettings mapViewSettings
The map view settings instance.
Definition: IsoMapRenderer.java:67
net.sf.gridarta.gui.map.renderer.IsoMapRenderer
A AbstractIsoMapRenderer to render map files.
Definition: IsoMapRenderer.java:47
net.sf.gridarta.gui.map.renderer.IsoMapRenderer.emptySquareIcon
final Icon emptySquareIcon
Definition: IsoMapRenderer.java:61