diff --git a/src/engine/util/MapLoader.java b/src/engine/util/MapLoader.java index ce187965..779080bd 100644 --- a/src/engine/util/MapLoader.java +++ b/src/engine/util/MapLoader.java @@ -103,31 +103,38 @@ public enum MapLoader { if (Files.isRegularFile(filePath)) { File imageFile = filePath.toFile(); + BufferedImage heightmapImage; + try { - BufferedImage heightmapImage = ImageIO.read(imageFile); - - // Generate pixel data for this heightmap. RPG channels are all the same - // in this greyscale TGA heightmap. We will choose red. - - short[][] colorData = new short[heightmapImage.getWidth()][heightmapImage.getHeight()]; - - for (int y = 0; y < heightmapImage.getHeight(); y++) - for (int x = 0; x < heightmapImage.getWidth(); x++) { - - Color color = new Color(heightmapImage.getRGB(x, y)); - colorData[x][y] = (short) color.getRed(); - } - - // Insert color data into lookup table - - int heightMapID = Integer.parseInt(imageFile.getName().substring(0, imageFile.getName().lastIndexOf("."))); - Terrain._heightmap_pixel_cache.put(heightMapID, colorData); - + heightmapImage = ImageIO.read(imageFile); } catch (IOException e) { - Logger.error(e); + throw new RuntimeException(e); } + int fileName = Integer.parseInt(imageFile.getName().substring(0, imageFile.getName().lastIndexOf("."))); + boolean singleBandRaster = heightmapImage.getRaster().getNumBands() == 1; + int color; + + // Generate pixel data for this heightmap. + + short[][] colorData = new short[heightmapImage.getWidth()][heightmapImage.getHeight()]; + + for (int y = 0; y < heightmapImage.getHeight(); y++) + for (int x = 0; x < heightmapImage.getWidth(); x++) { + + if (singleBandRaster) + color = heightmapImage.getRaster().getSample(x, y, 0); + else + color = new Color(heightmapImage.getRGB(x, y)).getRed(); + + colorData[x][y] = (short) color; + } + + // Add pixel for this TGA image into the collection + + Terrain._heightmap_pixel_cache.put(fileName, colorData); } + }); // Try with resources block } catch (IOException e) {