/* Copyright (c) 2016 Jesper Öqvist <jesper@llbit.se>
*
* This file is part of Chunky.
*
* Chunky is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Chunky 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.
* You should have received a copy of the GNU General Public License
* along with Chunky. If not, see <http://www.gnu.org/licenses/>.
*/
package se.llbit.chunky.ui;
import se.llbit.chunky.map.MapTile;
import se.llbit.chunky.world.Chunk;
import se.llbit.chunky.world.ChunkView;
import java.util.HashSet;
import java.util.Set;
/**
* View mode for the 2D map.
*/
public enum MapViewMode {
/**
* Switches between surface, layer and biome modes.
*/
AUTO("Auto") {
@Override public void render(Chunk chunk, MapTile tile) {
if (tile.scale >= 10) {
chunk.renderSurface(tile);
} else {
chunk.renderBiomes(tile);
}
}
@Override public int getLayers(ChunkView view) {
if (view.scale >= 10) {
return Chunk.SURFACE_LAYER | Chunk.BIOME_LAYER;
} else {
return Chunk.BIOME_LAYER;
}
}
@Override
public boolean bufferValid(ChunkView oldView, ChunkView newView, int oldLayer, int newLayer) {
return super.bufferValid(oldView, newView, oldLayer, newLayer) && (
oldView.scale >= 10 && newView.scale >= 10 || oldView.scale < 10 && newView.scale < 10);
}
@Override public int getChunkColor(Chunk chunk) {
return chunk.biomeColor();
}
},
/**
* Renders a single layer.
*/
LAYER("Layer") {
@Override public void render(Chunk chunk, MapTile tile) {
chunk.renderLayer(tile);
}
@Override public int getLayers(ChunkView view) {
return Chunk.BLOCK_LAYER;
}
@Override
public boolean bufferValid(ChunkView oldView, ChunkView newView, int oldLayer, int newLayer) {
return super.bufferValid(oldView, newView, oldLayer, newLayer) && oldLayer == newLayer;
}
@Override public int getChunkColor(Chunk chunk) {
return chunk.layerColor();
}
},
/**
* Renders the default surface view
*/
SURFACE("Surface") {
@Override public void render(Chunk chunk, MapTile tile) {
chunk.renderSurface(tile);
}
@Override public int getLayers(ChunkView view) {
return Chunk.SURFACE_LAYER;
}
@Override public int getChunkColor(Chunk chunk) {
return chunk.surfaceColor();
}
},
/**
* Visualizes underground cavities.
*/
CAVES("Caves") {
@Override public void render(Chunk chunk, MapTile tile) {
chunk.renderCaves(tile);
}
@Override public int getLayers(ChunkView view) {
return Chunk.CAVE_LAYER;
}
@Override public int getChunkColor(Chunk chunk) {
return chunk.caveColor();
}
},
/**
* Renders biome values only.
*/
BIOMES("Biomes") {
@Override public void render(Chunk chunk, MapTile tile) {
chunk.renderBiomes(tile);
}
@Override public int getLayers(ChunkView view) {
return Chunk.BIOME_LAYER;
}
@Override public int getChunkColor(Chunk chunk) {
return chunk.biomeColor();
}
};
private final String name;
MapViewMode(String name) {
this.name = name;
}
@Override public String toString() {
return name;
}
/**
* Render the chunk to a map tile.
*/
abstract public void render(Chunk chunk, MapTile tile);
/**
* Layers to be loaded for this renderer.
*/
abstract public int getLayers(ChunkView view);
public Set<String> getRequest(ChunkView view) {
int layers = getLayers(view);
Set<String> request = new HashSet<>();
request.add(Chunk.LEVEL_SECTIONS);
if ((layers & Chunk.BLOCK_LAYER) != 0 || (layers & Chunk.SURFACE_LAYER) != 0
|| (layers & Chunk.BIOME_LAYER) != 0) {
request.add(Chunk.LEVEL_BIOMES);
}
if ((layers & Chunk.SURFACE_LAYER) != 0 || (layers & Chunk.CAVE_LAYER) != 0) {
request.add(Chunk.LEVEL_HEIGHTMAP);
}
return request;
}
/**
* @return {@code true} if the render buffer is still valid
*/
public boolean bufferValid(ChunkView oldView, ChunkView newView, int oldLayer, int newLayer) {
return oldView.chunkScale == newView.chunkScale;
}
public abstract int getChunkColor(Chunk chunk);
}