/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package org.pepsoft.worldpainter.layers.tunnel;
import org.pepsoft.util.ColourUtils;
import org.pepsoft.worldpainter.Dimension;
import org.pepsoft.worldpainter.layers.renderers.DimensionAwareRenderer;
import org.pepsoft.worldpainter.layers.renderers.TransparentColourRenderer;
/**
*
* @author pepijn
*/
public class TunnelLayerRenderer extends TransparentColourRenderer implements DimensionAwareRenderer {
public TunnelLayerRenderer(TunnelLayer layer) {
super(layer.getColour());
this.layer = layer;
}
@Override
public int getPixelColour(int x, int y, int underlyingColour, boolean value) {
if (! value) {
return underlyingColour;
} else if (dimension != null) {
switch (getEffect(x, y)) {
case BREAKS_SURFACE:
return layer.getColour();
case NONE:
return ColourUtils.mix(layer.getColour(), underlyingColour, 64);
case UNDERGROUND:
return ColourUtils.mix(layer.getColour(), underlyingColour, 160);
default:
throw new InternalError();
}
} else {
return super.getPixelColour(x, y, underlyingColour, true);
}
}
@Override
public void setDimension(Dimension dimension) {
this.dimension = dimension;
}
private Effect getEffect(int x, int y) {
final int terrainHeight = dimension.getIntHeightAt(x, y);
final int floorLevel;
switch (layer.getFloorMode()) {
case CONSTANT_DEPTH:
floorLevel = terrainHeight - layer.getFloorLevel();
break;
case FIXED_HEIGHT:
floorLevel = layer.getFloorLevel();
break;
case INVERTED_DEPTH:
floorLevel = layer.getFloorLevel() - (terrainHeight - layer.getFloorLevel());
break;
default:
throw new InternalError();
}
if (floorLevel >= terrainHeight) {
return Effect.NONE;
}
final int roofLevel;
switch (layer.getRoofMode()) {
case CONSTANT_DEPTH:
roofLevel = terrainHeight - layer.getRoofLevel();
break;
case FIXED_HEIGHT:
roofLevel = layer.getRoofLevel();
break;
case INVERTED_DEPTH:
roofLevel = layer.getRoofLevel()- (terrainHeight - layer.getRoofLevel());
break;
default:
throw new InternalError();
}
if (floorLevel >= roofLevel) {
return Effect.NONE;
} else if (terrainHeight <= roofLevel) {
return Effect.BREAKS_SURFACE;
} else {
return Effect.UNDERGROUND;
}
}
private final TunnelLayer layer;
private Dimension dimension;
enum Effect {NONE, BREAKS_SURFACE, UNDERGROUND}
}