From f6d9b62101bd0194b63c5cc2fcbb65555e54811e Mon Sep 17 00:00:00 2001 From: Mike Primm Date: Mon, 23 Jan 2012 10:37:27 +0800 Subject: [PATCH] Add smooth-biome-shading option (1.1-style swamp biome shading) --- .../org/dynmap/bukkit/NewMapChunkCache.java | 76 ++++++++++++++----- src/main/resources/configuration.txt | 10 +-- 2 files changed, 60 insertions(+), 26 deletions(-) diff --git a/src/main/java/org/dynmap/bukkit/NewMapChunkCache.java b/src/main/java/org/dynmap/bukkit/NewMapChunkCache.java index 4dae0617..4fe5a882 100644 --- a/src/main/java/org/dynmap/bukkit/NewMapChunkCache.java +++ b/src/main/java/org/dynmap/bukkit/NewMapChunkCache.java @@ -57,7 +57,6 @@ public class NewMapChunkCache implements MapChunkCache { private boolean do_save = false; private boolean isempty = true; private ChunkSnapshot[] snaparray; /* Index = (x-x_min) + ((z-z_min)*x_dim) */ - private BiomeMap[][] snapbiomes; /* Biome cache - getBiome() is expensive */ private TreeSet ourticklist; private int chunks_read; /* Number of chunks actually loaded */ @@ -75,11 +74,14 @@ public class NewMapChunkCache implements MapChunkCache { * Iterator for traversing map chunk cache (base is for non-snapshot) */ public class OurMapIterator implements MapIterator { - private int x, y, z, chunkindex, bx, bz; + private int x, y, z, chunkindex, bx, bz, off; private ChunkSnapshot snap; private BlockStep laststep; private int typeid = -1; private int blkdata = -1; + private int lastbiome_x = Integer.MIN_VALUE, lastbiome_z = Integer.MIN_VALUE; + private BiomeMap lastbiome; + private int lastcountswamp_x = Integer.MIN_VALUE, lastcountswamp_z = Integer.MIN_VALUE, lastcountswamp; OurMapIterator(int x0, int y0, int z0) { initialize(x0, y0, z0); @@ -91,6 +93,7 @@ public class NewMapChunkCache implements MapChunkCache { this.chunkindex = ((x >> 4) - x_min) + (((z >> 4) - z_min) * x_dim); this.bx = x & 0xF; this.bz = z & 0xF; + this.off = bx + (bz << 4); try { snap = snaparray[chunkindex]; } catch (ArrayIndexOutOfBoundsException aioobx) { @@ -120,26 +123,56 @@ public class NewMapChunkCache implements MapChunkCache { return snap.getBlockEmittedLight(bx, y, bz); } public final BiomeMap getBiome() { - BiomeMap[] b = snapbiomes[chunkindex]; - if(b == null) { - b = snapbiomes[chunkindex] = new BiomeMap[256]; - } - int off = bx + (bz << 4); - BiomeMap bio = b[off]; - if(bio == null) { - Biome bb = snap.getBiome(bx, bz); - if(bb != null) - bio = biome_to_bmap[bb.ordinal()]; - else - bio = BiomeMap.NULL; - b[off] = bio; + if((x == lastbiome_x) && (z == lastbiome_z)) { + return lastbiome; } + BiomeMap bio; + Biome bb = snap.getBiome(bx, bz); + if(bb != null) + bio = biome_to_bmap[bb.ordinal()]; + else + bio = BiomeMap.NULL; + lastbiome_x = x; + lastbiome_z = z; + lastbiome = bio; return bio; } - public double getRawBiomeTemperature() { + public final int countSmoothedSwampBiomes() { + if((lastcountswamp_x == x) && (lastcountswamp_z == z)) + return lastcountswamp; + int cnt = 0; + BlockStep s_bak = laststep; + if(getBiome() == BiomeMap.SWAMPLAND) cnt++; + stepPosition(BlockStep.X_MINUS); + if(getBiome() == BiomeMap.SWAMPLAND) cnt++; + stepPosition(BlockStep.Z_MINUS); + if(getBiome() == BiomeMap.SWAMPLAND) cnt++; + stepPosition(BlockStep.X_PLUS); + if(getBiome() == BiomeMap.SWAMPLAND) cnt++; + stepPosition(BlockStep.X_PLUS); + if(getBiome() == BiomeMap.SWAMPLAND) cnt++; + stepPosition(BlockStep.Z_PLUS); + if(getBiome() == BiomeMap.SWAMPLAND) cnt++; + stepPosition(BlockStep.Z_PLUS); + if(getBiome() == BiomeMap.SWAMPLAND) cnt++; + stepPosition(BlockStep.X_MINUS); + if(getBiome() == BiomeMap.SWAMPLAND) cnt++; + stepPosition(BlockStep.X_MINUS); + if(getBiome() == BiomeMap.SWAMPLAND) cnt++; + stepPosition(BlockStep.X_PLUS); + stepPosition(BlockStep.Z_MINUS); + laststep = s_bak; + + lastcountswamp_x = x; + lastcountswamp_z = z; + lastcountswamp = cnt; + + return cnt; + } + public final double getRawBiomeTemperature() { return snap.getRawBiomeTemperature(bx, bz); } - public double getRawBiomeRainfall() { + public final double getRawBiomeRainfall() { return snap.getRawBiomeRainfall(bx, bz); } /** @@ -150,9 +183,11 @@ public class NewMapChunkCache implements MapChunkCache { case 0: x++; bx++; + off++; if(bx == 16) { /* Next chunk? */ try { bx = 0; + off -= 16; chunkindex++; snap = snaparray[chunkindex]; } catch (ArrayIndexOutOfBoundsException aioobx) { @@ -167,9 +202,11 @@ public class NewMapChunkCache implements MapChunkCache { case 2: z++; bz++; + off+=16; if(bz == 16) { /* Next chunk? */ try { bz = 0; + off -= 256; chunkindex += x_dim; snap = snaparray[chunkindex]; } catch (ArrayIndexOutOfBoundsException aioobx) { @@ -181,9 +218,11 @@ public class NewMapChunkCache implements MapChunkCache { case 3: x--; bx--; + off--; if(bx == -1) { /* Next chunk? */ try { bx = 15; + off += 16; chunkindex--; snap = snaparray[chunkindex]; } catch (ArrayIndexOutOfBoundsException aioobx) { @@ -198,9 +237,11 @@ public class NewMapChunkCache implements MapChunkCache { case 5: z--; bz--; + off-=16; if(bz == -1) { /* Next chunk? */ try { bz = 15; + off += 256; chunkindex -= x_dim; snap = snaparray[chunkindex]; } catch (ArrayIndexOutOfBoundsException aioobx) { @@ -486,7 +527,6 @@ public class NewMapChunkCache implements MapChunkCache { } snaparray = new ChunkSnapshot[x_dim * (z_max-z_min+1)]; - snapbiomes = new BiomeMap[x_dim * (z_max-z_min+1)][]; } private ChunkSnapshot checkSpoutData(Chunk c, ChunkSnapshot ss) { diff --git a/src/main/resources/configuration.txt b/src/main/resources/configuration.txt index b13aa217..7aa33d00 100644 --- a/src/main/resources/configuration.txt +++ b/src/main/resources/configuration.txt @@ -195,6 +195,8 @@ enabletilehash: true use-generated-textures: true correct-water-lighting: true correct-biome-shading: true +# To enable smooth biome shading (as done in MC 1.1.0+), set this to true (this does increase render processing about 10%) +smooth-biome-shading: true # Control loading of player faces (if set to false, skins are never fetched) #fetchskins: false @@ -321,14 +323,6 @@ msg: maptypes: "Map Types" players: "Players" -# NOTE: the 'templates' section is now found in the 'templates' directory -# Templates CAN still be defined in configuration.txt, as before 0.20 -templates: - -# NOTE: the 'worlds' section is now found in the worlds.txt (example custom settings can be found in worlds.txt.sample) -# Worlds CAN still be defined in configuration.txt, as before 0.20 -worlds: - # Set to true to enable verbose startup messages - can help with debugging map configuration problems # Set to false for a much quieter startup log verbose: false