Add 1.9 swamp biome shading, workaround chunk snapshot biome bug

This commit is contained in:
Mike Primm 2011-09-25 22:35:53 -05:00
parent 336d4e7535
commit 9b0faa1325
5 changed files with 78 additions and 24 deletions

View File

@ -46,6 +46,7 @@ public class MapManager {
private int parallelrendercnt = 0; private int parallelrendercnt = 0;
private int progressinterval = 100; private int progressinterval = 100;
private boolean saverestorepending = true; private boolean saverestorepending = true;
private boolean swampshading = false;
private int zoomout_period = DEFAULT_ZOOMOUT_PERIOD; /* Zoom-out tile processing period, in seconds */ private int zoomout_period = DEFAULT_ZOOMOUT_PERIOD; /* Zoom-out tile processing period, in seconds */
/* Which fullrenders are active */ /* Which fullrenders are active */
@ -503,6 +504,8 @@ public class MapManager {
progressinterval = configuration.getInteger("progressloginterval", 100); progressinterval = configuration.getInteger("progressloginterval", 100);
if(progressinterval < 100) progressinterval = 100; if(progressinterval < 100) progressinterval = 100;
saverestorepending = configuration.getBoolean("saverestorepending", true); saverestorepending = configuration.getBoolean("saverestorepending", true);
/* Default swamp shading off for 1.8, on after */
swampshading = configuration.getBoolean("swampshaded", !plugin.getServer().getVersion().contains("(MC: 1.8"));
this.tileQueue = new AsynchronousQueue<MapTile>( this.tileQueue = new AsynchronousQueue<MapTile>(
new Handler<MapTile>() { new Handler<MapTile>() {
@ -999,4 +1002,8 @@ public class MapManager {
sscache.resetStats(); sscache.resetStats();
sender.sendMessage("Tile Render Statistics reset"); sender.sendMessage("Tile Render Statistics reset");
} }
public boolean getSwampShading() {
return swampshading;
}
} }

View File

@ -19,6 +19,7 @@ import java.util.zip.ZipFile;
import javax.imageio.ImageIO; import javax.imageio.ImageIO;
import org.bukkit.block.Biome;
import org.dynmap.Color; import org.dynmap.Color;
import org.dynmap.DynmapPlugin; import org.dynmap.DynmapPlugin;
import org.dynmap.Log; import org.dynmap.Log;
@ -35,11 +36,11 @@ import org.dynmap.utils.MapIterator;
* misc/water.png - still water tile (required)) * misc/water.png - still water tile (required))
* misc/grasscolor.png - tone for grass color, biome sensitive (required) * misc/grasscolor.png - tone for grass color, biome sensitive (required)
* misc/foliagecolor.png - tone for leaf color, biome sensitive (required) * misc/foliagecolor.png - tone for leaf color, biome sensitive (required)
* misc/watercolor.png - tone for water color, biome sensitive (required)
* custom_lava_still.png - custom still lava animation (optional) * custom_lava_still.png - custom still lava animation (optional)
* custom_lava_flowing.png - custom flowing lava animation (optional) * custom_lava_flowing.png - custom flowing lava animation (optional)
* custom_water_still.png - custom still water animation (optional) * custom_water_still.png - custom still water animation (optional)
* custom_water_flowing.png - custom flowing water animation (optional) * custom_water_flowing.png - custom flowing water animation (optional)
* BetterGlass/*.png - mod-based improved windows (future optional)
*/ */
public class TexturePack { public class TexturePack {
/* Loaded texture packs */ /* Loaded texture packs */
@ -48,6 +49,7 @@ public class TexturePack {
private static final String TERRAIN_PNG = "terrain.png"; private static final String TERRAIN_PNG = "terrain.png";
private static final String GRASSCOLOR_PNG = "misc/grasscolor.png"; private static final String GRASSCOLOR_PNG = "misc/grasscolor.png";
private static final String FOLIAGECOLOR_PNG = "misc/foliagecolor.png"; private static final String FOLIAGECOLOR_PNG = "misc/foliagecolor.png";
private static final String WATERCOLOR_PNG = "misc/watercolor.png";
private static final String WATER_PNG = "misc/water.png"; private static final String WATER_PNG = "misc/water.png";
private static final String CUSTOMLAVASTILL_PNG = "custom_lava_still.png"; private static final String CUSTOMLAVASTILL_PNG = "custom_lava_still.png";
private static final String CUSTOMLAVAFLOWING_PNG = "custom_lava_flowing.png"; private static final String CUSTOMLAVAFLOWING_PNG = "custom_lava_flowing.png";
@ -59,7 +61,7 @@ public class TexturePack {
private static final int COLORMOD_NONE = 0; private static final int COLORMOD_NONE = 0;
private static final int COLORMOD_GRASSTONED = 1; private static final int COLORMOD_GRASSTONED = 1;
private static final int COLORMOD_FOLIAGETONED = 2; private static final int COLORMOD_FOLIAGETONED = 2;
private static final int COLORMOD_WATERTONED = 3; /* Not used */ private static final int COLORMOD_WATERTONED = 3;
private static final int COLORMOD_ROT90 = 4; private static final int COLORMOD_ROT90 = 4;
private static final int COLORMOD_ROT180 = 5; private static final int COLORMOD_ROT180 = 5;
private static final int COLORMOD_ROT270 = 6; private static final int COLORMOD_ROT270 = 6;
@ -106,7 +108,8 @@ public class TexturePack {
private static final int IMG_CUSTOMWATERSTILL = 4; private static final int IMG_CUSTOMWATERSTILL = 4;
private static final int IMG_CUSTOMLAVAMOVING = 5; private static final int IMG_CUSTOMLAVAMOVING = 5;
private static final int IMG_CUSTOMLAVASTILL = 6; private static final int IMG_CUSTOMLAVASTILL = 6;
private static final int IMG_CNT = 7; private static final int IMG_WATERCOLOR = 7;
private static final int IMG_CNT = 8;
private LoadedImage[] imgs = new LoadedImage[IMG_CNT]; private LoadedImage[] imgs = new LoadedImage[IMG_CNT];
@ -242,6 +245,18 @@ public class TexturePack {
} }
loadBiomeShadingImage(is, IMG_FOLIAGECOLOR); loadBiomeShadingImage(is, IMG_FOLIAGECOLOR);
is.close(); is.close();
/* Try to find and load misc/watercolor.png */
ze = zf.getEntry(WATERCOLOR_PNG);
if(ze == null) { /* Fall back to standard file */
/* Check for misc/watercolor.png under standard texture pack*/
File ff = new File(texturedir, STANDARDTP + "/" + WATERCOLOR_PNG);
is = new FileInputStream(ff);
}
else {
is = zf.getInputStream(ze);
}
loadBiomeShadingImage(is, IMG_WATERCOLOR);
is.close();
/* Try to find and load misc/water.png */ /* Try to find and load misc/water.png */
ze = zf.getEntry(WATER_PNG); ze = zf.getEntry(WATER_PNG);
@ -317,6 +332,14 @@ public class TexturePack {
fis = new FileInputStream(f); fis = new FileInputStream(f);
loadBiomeShadingImage(fis, IMG_FOLIAGECOLOR); loadBiomeShadingImage(fis, IMG_FOLIAGECOLOR);
fis.close(); fis.close();
/* Check for misc/watercolor.png */
f = new File(texturedir, tpname + "/" + WATERCOLOR_PNG);
if(!f.canRead()) {
f = new File(texturedir, STANDARDTP + "/" + WATERCOLOR_PNG);
}
fis = new FileInputStream(f);
loadBiomeShadingImage(fis, IMG_WATERCOLOR);
fis.close();
/* Check for misc/water.png */ /* Check for misc/water.png */
f = new File(texturedir, tpname + "/" + WATER_PNG); f = new File(texturedir, tpname + "/" + WATER_PNG);
if(!f.canRead()) { if(!f.canRead()) {
@ -817,7 +840,8 @@ public class TexturePack {
/** /**
* Read color for given subblock coordinate, with given block id and data and face * Read color for given subblock coordinate, with given block id and data and face
*/ */
public final void readColor(final HDPerspectiveState ps, final MapIterator mapiter, final Color rslt, final int blkid, final int lastblocktype, final boolean biome_shaded) { public final void readColor(final HDPerspectiveState ps, final MapIterator mapiter, final Color rslt, final int blkid, final int lastblocktype,
final boolean biome_shaded, final boolean swamp_shaded) {
int blkdata = ps.getBlockData(); int blkdata = ps.getBlockData();
HDTextureMap map = HDTextureMap.getMap(blkid, blkdata, ps.getBlockRenderData()); HDTextureMap map = HDTextureMap.getMap(blkid, blkdata, ps.getBlockRenderData());
BlockStep laststep = ps.getLastBlockStep(); BlockStep laststep = ps.getLastBlockStep();
@ -866,6 +890,10 @@ public class TexturePack {
rslt.setTransparent(); rslt.setTransparent();
return; return;
} }
/* If warer block, to watercolor tone op */
if((blkid == 8) || (blkid == 9)) {
textop = COLORMOD_WATERTONED;
}
} }
int[] texture = terrain_argb[textid]; int[] texture = terrain_argb[textid];
@ -954,27 +982,30 @@ public class TexturePack {
/* Read color from texture */ /* Read color from texture */
rslt.setARGB(texture[v*native_scale + u]); rslt.setARGB(texture[v*native_scale + u]);
LoadedImage li; LoadedImage li = null;
/* Switch based on texture modifier */ /* Switch based on texture modifier */
switch(textop) { switch(textop) {
case COLORMOD_GRASSTONED: case COLORMOD_GRASSTONED:
li = imgs[IMG_GRASSCOLOR]; li = imgs[IMG_GRASSCOLOR];
if((li.argb == null) || (!biome_shaded)) {
rslt.blendColor(li.trivial_color);
}
else {
rslt.blendColor(biomeLookup(li.argb, li.width, mapiter.getRawBiomeRainfall(), mapiter.getRawBiomeTemperature()));
}
break; break;
case COLORMOD_FOLIAGETONED: case COLORMOD_FOLIAGETONED:
li = imgs[IMG_FOLIAGECOLOR]; li = imgs[IMG_FOLIAGECOLOR];
if((li.argb == null) || (!biome_shaded)) {
rslt.blendColor(li.trivial_color);
}
else {
rslt.blendColor(biomeLookup(li.argb, li.width, mapiter.getRawBiomeRainfall(), mapiter.getRawBiomeTemperature()));
}
break; break;
case COLORMOD_WATERTONED:
li = imgs[IMG_WATERCOLOR];
break;
}
if(li != null) {
int clr;
if((li.argb == null) || (!biome_shaded)) {
clr = li.trivial_color;
}
else {
clr = biomeLookup(li.argb, li.width, mapiter.getRawBiomeRainfall(), mapiter.getRawBiomeTemperature());
}
if(swamp_shaded && (mapiter.getBiome() == Biome.SWAMPLAND))
clr = (clr & 0xFF000000) | (((clr & 0x00FEFEFE) + 0x4E0E4E) / 2);
rslt.blendColor(clr);
} }
} }

View File

@ -6,6 +6,7 @@ import org.bukkit.World.Environment;
import org.dynmap.Color; import org.dynmap.Color;
import org.dynmap.ConfigurationNode; import org.dynmap.ConfigurationNode;
import org.dynmap.Log; import org.dynmap.Log;
import org.dynmap.MapManager;
import org.dynmap.utils.MapChunkCache; import org.dynmap.utils.MapChunkCache;
import org.dynmap.utils.MapIterator; import org.dynmap.utils.MapIterator;
import org.json.simple.JSONObject; import org.json.simple.JSONObject;
@ -15,12 +16,14 @@ public class TexturePackHDShader implements HDShader {
private String name; private String name;
private TexturePack tp; private TexturePack tp;
private boolean biome_shaded; private boolean biome_shaded;
private boolean swamp_shaded;
public TexturePackHDShader(ConfigurationNode configuration) { public TexturePackHDShader(ConfigurationNode configuration) {
tpname = configuration.getString("texturepack", "minecraft"); tpname = configuration.getString("texturepack", "minecraft");
name = configuration.getString("name", tpname); name = configuration.getString("name", tpname);
tp = TexturePack.getTexturePack(tpname); tp = TexturePack.getTexturePack(tpname);
biome_shaded = configuration.getBoolean("biomeshaded", true); biome_shaded = configuration.getBoolean("biomeshaded", true);
swamp_shaded = configuration.getBoolean("swampshaded", MapManager.mapman.getSwampShading());
if(tp == null) { if(tp == null) {
Log.severe("Error: shader '" + name + "' cannot load texture pack '" + tpname + "'"); Log.severe("Error: shader '" + name + "' cannot load texture pack '" + tpname + "'");
} }
@ -28,7 +31,7 @@ public class TexturePackHDShader implements HDShader {
@Override @Override
public boolean isBiomeDataNeeded() { public boolean isBiomeDataNeeded() {
return false; return true;
} }
@Override @Override
@ -71,6 +74,7 @@ public class TexturePackHDShader implements HDShader {
private HDLighting lighting; private HDLighting lighting;
private int lastblkid; private int lastblkid;
private boolean do_biome_shading; private boolean do_biome_shading;
private boolean do_swamp_shading;
private OurShaderState(MapIterator mapiter, HDMap map, MapChunkCache cache) { private OurShaderState(MapIterator mapiter, HDMap map, MapChunkCache cache) {
this.mapiter = mapiter; this.mapiter = mapiter;
@ -88,6 +92,7 @@ public class TexturePackHDShader implements HDShader {
scaledtp = tp.resampleTexturePack(map.getPerspective().getModelScale()); scaledtp = tp.resampleTexturePack(map.getPerspective().getModelScale());
/* Biome raw data only works on normal worlds at this point */ /* Biome raw data only works on normal worlds at this point */
do_biome_shading = biome_shaded && (cache.getWorld().getEnvironment() == Environment.NORMAL); do_biome_shading = biome_shaded && (cache.getWorld().getEnvironment() == Environment.NORMAL);
do_swamp_shading = do_biome_shading && swamp_shaded;
} }
/** /**
* Get our shader * Get our shader
@ -133,7 +138,7 @@ public class TexturePackHDShader implements HDShader {
} }
/* Get color from textures */ /* Get color from textures */
scaledtp.readColor(ps, mapiter, c, blocktype, lastblocktype, do_biome_shading); scaledtp.readColor(ps, mapiter, c, blocktype, lastblocktype, do_biome_shading, do_swamp_shading);
if (c.getAlpha() > 0) { if (c.getAlpha() > 0) {
int subalpha = ps.getSubmodelAlpha(); int subalpha = ps.getSubmodelAlpha();

View File

@ -43,7 +43,8 @@ public class NewMapChunkCache implements MapChunkCache {
private boolean isempty = true; private boolean isempty = true;
private ChunkSnapshot[] snaparray; /* Index = (x-x_min) + ((z-z_min)*x_dim) */ private ChunkSnapshot[] snaparray; /* Index = (x-x_min) + ((z-z_min)*x_dim) */
private Biome[][] biomess; /* Biome snapshots (workaround) - same index as snaparray */
private static final BlockStep unstep[] = { BlockStep.X_MINUS, BlockStep.Y_MINUS, BlockStep.Z_MINUS, private static final BlockStep unstep[] = { BlockStep.X_MINUS, BlockStep.Y_MINUS, BlockStep.Z_MINUS,
BlockStep.X_PLUS, BlockStep.Y_PLUS, BlockStep.Z_PLUS }; BlockStep.X_PLUS, BlockStep.Y_PLUS, BlockStep.Z_PLUS };
@ -95,7 +96,7 @@ public class NewMapChunkCache implements MapChunkCache {
return snap.getBlockEmittedLight(bx, y, bz); return snap.getBlockEmittedLight(bx, y, bz);
} }
public Biome getBiome() { public Biome getBiome() {
return snap.getBiome(bx, bz); return biomess[chunkindex][bx | (bz<<4)];
} }
public double getRawBiomeTemperature() { public double getRawBiomeTemperature() {
return snap.getRawBiomeTemperature(bx, bz); return snap.getRawBiomeTemperature(bx, bz);
@ -404,6 +405,14 @@ public class NewMapChunkCache implements MapChunkCache {
} }
} }
} }
if(biome) {
Biome[] b = new Biome[256];
for(int ii = 0; ii < 256; ii++) {
b[ii] = w.getBiome((chunk.x<<4)+(ii & 0xF), (chunk.z<<4) + (ii >> 4));
}
if(biomess == null) biomess = new Biome[snaparray.length][];
biomess[(chunk.x-x_min) + (chunk.z - z_min)*x_dim] = b;
}
/* Check if cached chunk snapshot found */ /* Check if cached chunk snapshot found */
ChunkSnapshot ss = MapManager.mapman.sscache.getSnapshot(w.getName(), chunk.x, chunk.z, blockdata, biome, biomeraw, highesty); ChunkSnapshot ss = MapManager.mapman.sscache.getSnapshot(w.getName(), chunk.x, chunk.z, blockdata, biome, biomeraw, highesty);
if(ss != null) { if(ss != null) {
@ -498,6 +507,8 @@ public class NewMapChunkCache implements MapChunkCache {
snaparray[i] = EMPTY; snaparray[i] = EMPTY;
else if(snaparray[i] != EMPTY) else if(snaparray[i] != EMPTY)
isempty = false; isempty = false;
if(biome && biomess[i] == null)
biomess[i] = new Biome[256];
} }
} }
return cnt; return cnt;
@ -561,8 +572,8 @@ public class NewMapChunkCache implements MapChunkCache {
return ss.getBlockEmittedLight(x & 0xF, y, z & 0xF); return ss.getBlockEmittedLight(x & 0xF, y, z & 0xF);
} }
public Biome getBiome(int x, int z) { public Biome getBiome(int x, int z) {
ChunkSnapshot ss = snaparray[((x>>4) - x_min) + ((z>>4) - z_min) * x_dim]; Biome[] b = biomess[((x>>4) - x_min) + ((z>>4) - z_min) * x_dim];
return ss.getBiome(x & 0xF, z & 0xF); return b[(x & 0xF) | ((z & 0xF)<<4)];
} }
public double getRawBiomeTemperature(int x, int z) { public double getRawBiomeTemperature(int x, int z) {
ChunkSnapshot ss = snaparray[((x>>4) - x_min) + ((z>>4) - z_min) * x_dim]; ChunkSnapshot ss = snaparray[((x>>4) - x_min) + ((z>>4) - z_min) * x_dim];

View File

@ -3,7 +3,7 @@
# <index>=0-255 (index of patch in terrain.png), -1=clear, 1xxx=biome tint from grasscolor.png,257=stationary water,258=moving water, # <index>=0-255 (index of patch in terrain.png), -1=clear, 1xxx=biome tint from grasscolor.png,257=stationary water,258=moving water,
# 259=stationary lava,260=moving lava,261=extended piston side,262=piston side while extended,263=glass pane top,2xxx=biome tint from foliagecolor.png,4xxx=rotate texture 90, # 259=stationary lava,260=moving lava,261=extended piston side,262=piston side while extended,263=glass pane top,2xxx=biome tint from foliagecolor.png,4xxx=rotate texture 90,
# 5xxx=rotate texture 180, 6xxx=rotate texture 270, 7xxx=flip texture horizontally, 8xxx=shift down 1/2 block, 9=shift down 1/2,flip horiz, # 5xxx=rotate texture 180, 6xxx=rotate texture 270, 7xxx=flip texture horizontally, 8xxx=shift down 1/2 block, 9=shift down 1/2,flip horiz,
# 10xxx=inclined-torch,11xxx=grass-side,12xxx=clear if same block # 10xxx=inclined-torch,11xxx=grass-side,12xxx=clear if same block,3xxx=biome tint from watercolor.png
###### ######
# Stone # Stone
block:id=1,allfaces=1 block:id=1,allfaces=1