package org.dynmap.hdmap; import org.dynmap.ConfigurationNode; import org.dynmap.DynmapCore; import org.dynmap.utils.BlockStep; import org.dynmap.utils.LightLevels; import org.dynmap.utils.MapChunkCache; import org.dynmap.utils.MapIterator; public class TexturePackHDCaveShader extends TexturePackHDShader { private int maxskylevel; private int minemittedlevel; class CaveShaderState extends TexturePackHDShader.ShaderState { private boolean ready; private LightLevels ll = new LightLevels(); protected CaveShaderState(MapIterator mapiter, HDMap map, MapChunkCache cache, int scale) { super(mapiter, map, cache, scale); } @Override public void reset(HDPerspectiveState ps) { super.reset(ps); ready = false; } /** * Process next ray step - called for each block on route * @return true if ray is done, false if ray needs to continue */ public boolean processBlock(HDPerspectiveState ps) { if(ready) return super.processBlock(ps); if((ps.getLastBlockStep() == BlockStep.Y_MINUS) && (ps.getBlockTypeID() == 0)) { /* In air? */ ps.getLightLevels(ll); if((ll.sky <= maxskylevel) && (ll.emitted > minemittedlevel)) { ready = true; } } return false; } } public TexturePackHDCaveShader(DynmapCore core, ConfigurationNode configuration) { super(core, configuration); maxskylevel = configuration.getInteger("max-sky-light", 0); minemittedlevel = configuration.getInteger("min-emitted-light", 1); } @Override public HDShaderState getStateInstance(HDMap map, MapChunkCache cache, MapIterator mapiter, int scale) { return new CaveShaderState(mapiter, map, cache, scale); } }