diff --git a/src/main/java/org/dynmap/DynmapPlugin.java b/src/main/java/org/dynmap/DynmapPlugin.java index 2bb2e39f..736cfd23 100644 --- a/src/main/java/org/dynmap/DynmapPlugin.java +++ b/src/main/java/org/dynmap/DynmapPlugin.java @@ -133,7 +133,7 @@ public class DynmapPlugin extends JavaPlugin { } /* Table of default templates - all are resources in dynmap.jar unnder templates/, and go in templates directory when needed */ private static final String[] stdtemplates = { "normal.txt", "nether.txt", "skylands.txt", "normal-lowres.txt", - "nether-lowres.txt", "skylands-lowres.txt", "normal-hires.txt", "nether-hires.txt", "skyands-hires.txt" + "nether-lowres.txt", "skylands-lowres.txt", "normal-hires.txt", "nether-hires.txt", "skylands-hires.txt" }; private static final String CUSTOM_PREFIX = "custom-"; diff --git a/src/main/java/org/dynmap/hdmap/TexturePack.java b/src/main/java/org/dynmap/hdmap/TexturePack.java index add4a66b..daea9b4d 100644 --- a/src/main/java/org/dynmap/hdmap/TexturePack.java +++ b/src/main/java/org/dynmap/hdmap/TexturePack.java @@ -374,9 +374,15 @@ public class TexturePack { } } /* All the same - no biome lookup needed */ - if(same) + if(same) { imgs[idx].argb = null; - li.trivial_color = clr; + li.trivial_color = clr; + } + else { /* Else, calculate color average for lower left quadrant */ + int[] clr_scale = new int[4]; + scaleTerrainPNGSubImage(li.width, 2, li.argb, clr_scale); + li.trivial_color = clr_scale[2]; + } } /* Patch image into texture table */ @@ -694,7 +700,7 @@ public class TexturePack { /** * Read color for given subblock coordinate, with given block id and data and face */ - public void readColor(HDPerspectiveState ps, MapIterator mapiter, Color rslt, int blkid, int lastblocktype) { + public void readColor(HDPerspectiveState ps, MapIterator mapiter, Color rslt, int blkid, int lastblocktype, boolean biome_shaded) { int blkdata = ps.getBlockData(); HDTextureMap map = HDTextureMap.getMap(blkid, blkdata); BlockStep laststep = ps.getLastBlockStep(); @@ -797,7 +803,7 @@ public class TexturePack { switch(textop) { case COLORMOD_GRASSTONED: li = imgs[IMG_GRASSCOLOR]; - if(li.argb == null) { + if((li.argb == null) || (!biome_shaded)) { rslt.blendColor(li.trivial_color); } else { @@ -806,7 +812,7 @@ public class TexturePack { break; case COLORMOD_FOLIAGETONED: li = imgs[IMG_FOLIAGECOLOR]; - if(li.argb == null) { + if((li.argb == null) || (!biome_shaded)) { rslt.blendColor(li.trivial_color); } else { diff --git a/src/main/java/org/dynmap/hdmap/TexturePackHDShader.java b/src/main/java/org/dynmap/hdmap/TexturePackHDShader.java index 38832bea..0426aae3 100644 --- a/src/main/java/org/dynmap/hdmap/TexturePackHDShader.java +++ b/src/main/java/org/dynmap/hdmap/TexturePackHDShader.java @@ -2,6 +2,7 @@ package org.dynmap.hdmap; import static org.dynmap.JSONUtils.s; +import org.bukkit.World.Environment; import org.dynmap.Color; import org.dynmap.ConfigurationNode; import org.dynmap.Log; @@ -13,11 +14,13 @@ public class TexturePackHDShader implements HDShader { private String tpname; private String name; private TexturePack tp; + private boolean biome_shaded; public TexturePackHDShader(ConfigurationNode configuration) { tpname = configuration.getString("texturepack", "minecraft"); name = configuration.getString("name", tpname); tp = TexturePack.getTexturePack(tpname); + biome_shaded = configuration.getBoolean("biomeshaded", true); if(tp == null) { Log.severe("Error: shader '" + name + "' cannot load texture pack '" + tpname + "'"); } @@ -30,7 +33,7 @@ public class TexturePackHDShader implements HDShader { @Override public boolean isRawBiomeDataNeeded() { - return true; + return biome_shaded; } @Override @@ -67,8 +70,9 @@ public class TexturePackHDShader implements HDShader { private TexturePack scaledtp; private HDLighting lighting; private int lastblkid; + private boolean do_biome_shading; - private OurShaderState(MapIterator mapiter, HDMap map) { + private OurShaderState(MapIterator mapiter, HDMap map, MapChunkCache cache) { this.mapiter = mapiter; this.map = map; this.lighting = map.getLighting(); @@ -82,6 +86,8 @@ public class TexturePackHDShader implements HDShader { } c = new Color(); scaledtp = tp.resampleTexturePack(map.getPerspective().getModelScale()); + /* Biome raw data only works on normal worlds at this point */ + do_biome_shading = biome_shaded && (cache.getWorld().getEnvironment() != Environment.NORMAL); } /** * Get our shader @@ -126,7 +132,7 @@ public class TexturePackHDShader implements HDShader { return false; } /* Get color from textures */ - scaledtp.readColor(ps, mapiter, c, blocktype, lastblocktype); + scaledtp.readColor(ps, mapiter, c, blocktype, lastblocktype, do_biome_shading); if (c.getAlpha() > 0) { int subalpha = ps.getSubmodelAlpha(); @@ -210,7 +216,7 @@ public class TexturePackHDShader implements HDShader { * @return state object to use for all rays in tile */ public HDShaderState getStateInstance(HDMap map, MapChunkCache cache, MapIterator mapiter) { - return new OurShaderState(mapiter, map); + return new OurShaderState(mapiter, map, cache); } /* Add shader's contributions to JSON for map object */ diff --git a/src/main/java/org/dynmap/utils/LegacyMapChunkCache.java b/src/main/java/org/dynmap/utils/LegacyMapChunkCache.java index d910ff34..829fab9e 100644 --- a/src/main/java/org/dynmap/utils/LegacyMapChunkCache.java +++ b/src/main/java/org/dynmap/utils/LegacyMapChunkCache.java @@ -541,4 +541,7 @@ public class LegacyMapChunkCache implements MapChunkCache { return false; return true; } + public World getWorld() { + return w; + } } diff --git a/src/main/java/org/dynmap/utils/MapChunkCache.java b/src/main/java/org/dynmap/utils/MapChunkCache.java index 797566a6..5a58906c 100644 --- a/src/main/java/org/dynmap/utils/MapChunkCache.java +++ b/src/main/java/org/dynmap/utils/MapChunkCache.java @@ -96,4 +96,8 @@ public interface MapChunkCache { * Set autogenerate - must be done after at least one visible range has been set */ public void setAutoGenerateVisbileRanges(DynmapWorld.AutoGenerateOption do_generate); + /** + * Get world + */ + public World getWorld(); } diff --git a/src/main/java/org/dynmap/utils/NewMapChunkCache.java b/src/main/java/org/dynmap/utils/NewMapChunkCache.java index 9e0e9834..ea4c4a70 100644 --- a/src/main/java/org/dynmap/utils/NewMapChunkCache.java +++ b/src/main/java/org/dynmap/utils/NewMapChunkCache.java @@ -629,4 +629,9 @@ public class NewMapChunkCache implements MapChunkCache { this.blockdata = blockdata; return true; } + @Override + public World getWorld() { + return w; + } + } diff --git a/src/main/resources/shaders.txt b/src/main/resources/shaders.txt index d9c843bf..25e2a82a 100644 --- a/src/main/resources/shaders.txt +++ b/src/main/resources/shaders.txt @@ -42,4 +42,10 @@ shaders: - class: org.dynmap.hdmap.TexturePackHDShader name: stdtexture texturepack: standard + + - class: org.dynmap.hdmap.TexturePackHDShader + name: stdtexture-nobiome + texturepack: standard + biomeshaded: false + \ No newline at end of file