Clean up HDMap dither, fix tile update events

This commit is contained in:
Mike Primm 2011-07-07 00:35:59 -05:00
parent ee8718d083
commit 4f73d2cbd6
4 changed files with 16 additions and 13 deletions

View File

@ -188,6 +188,7 @@ public class MapManager {
found.clear(); found.clear();
rendered.clear(); rendered.clear();
rendercnt = 0; rendercnt = 0;
timeaccum = 0;
map_index++; /* Next map */ map_index++; /* Next map */
if(map_index >= world.maps.size()) { /* Last one done? */ if(map_index >= world.maps.size()) { /* Last one done? */
sender.sendMessage("Full render of '" + world.world.getName() + "' finished."); sender.sendMessage("Full render of '" + world.world.getName() + "' finished.");

View File

@ -16,6 +16,7 @@ import org.dynmap.kzedmap.KzedMapTile;
import org.dynmap.kzedmap.DefaultTileRenderer.BiomeColorOption; import org.dynmap.kzedmap.DefaultTileRenderer.BiomeColorOption;
import org.dynmap.utils.MapChunkCache; import org.dynmap.utils.MapChunkCache;
import org.dynmap.utils.MapIterator; import org.dynmap.utils.MapIterator;
import org.dynmap.utils.Vector3D;
import org.json.simple.JSONObject; import org.json.simple.JSONObject;
public class DefaultHDShader implements HDShader { public class DefaultHDShader implements HDShader {
@ -103,11 +104,11 @@ public class DefaultHDShader implements HDShader {
/** /**
* Reset renderer state for new ray * Reset renderer state for new ray
*/ */
public void reset(int x, int y) { public void reset(int x, int y, Vector3D raystart, double scale) {
color.setTransparent(); color.setTransparent();
if(daycolor != null) if(daycolor != null)
daycolor.setTransparent(); daycolor.setTransparent();
pixelodd = x ^ y; pixelodd = (x & 0x3) + (y<<1);
} }
protected Color[] getBlockColors(int blocktype, int blockdata) { protected Color[] getBlockColors(int blocktype, int blockdata) {
if((blockdata != 0) && (colorScheme.datacolors[blocktype] != null)) if((blockdata != 0) && (colorScheme.datacolors[blocktype] != null))
@ -136,10 +137,10 @@ public class DefaultHDShader implements HDShader {
seq = 1; seq = 1;
else if((laststep == BlockStep.Z_PLUS) || (laststep == BlockStep.Z_MINUS)) else if((laststep == BlockStep.Z_PLUS) || (laststep == BlockStep.Z_MINUS))
seq = 3; seq = 3;
else if(((mapiter.getX() ^ mapiter.getZ() ^ pixelodd) & 0x01) == 0) else if(((pixelodd + mapiter.getY()) & 0x03) == 0)
seq = 0;
else
seq = 2; seq = 2;
else
seq = 0;
Color c = colors[seq]; Color c = colors[seq];
if (c.getAlpha() > 0) { if (c.getAlpha() > 0) {

View File

@ -373,7 +373,7 @@ public class HDMap extends MapType {
map_to_world.transform(top); /* Transform to world coordinates */ map_to_world.transform(top); /* Transform to world coordinates */
map_to_world.transform(bottom); map_to_world.transform(bottom);
for(int i = 0; i < shaders.length; i++) { for(int i = 0; i < shaders.length; i++) {
shaderstate[i].reset(x, y); shaderstate[i].reset(x, y, top, scale);
} }
raytrace(cache, mapiter, top, bottom, shaderstate, shaderdone); raytrace(cache, mapiter, top, bottom, shaderstate, shaderdone);
for(int i = 0; i < shaders.length; i++) { for(int i = 0; i < shaders.length; i++) {
@ -402,7 +402,8 @@ public class HDMap extends MapType {
boolean tile_update = false; boolean tile_update = false;
String shadername = shaders[i].getName(); String shadername = shaders[i].getName();
if(rendered[i]) { if(rendered[i]) {
File f = new File(t.getDynmapWorld().worldtilepath, t.getFilename(shadername)); String fname = t.getFilename(shadername);
File f = new File(t.getDynmapWorld().worldtilepath, fname);
FileLockManager.getWriteLock(f); FileLockManager.getWriteLock(f);
try { try {
if((!f.exists()) || (crc != hashman.getImageHashCode(tile.getKey(), shadername, t.tx, t.ty))) { if((!f.exists()) || (crc != hashman.getImageHashCode(tile.getKey(), shadername, t.tx, t.ty))) {
@ -417,7 +418,7 @@ public class HDMap extends MapType {
} catch (java.lang.NullPointerException e) { } catch (java.lang.NullPointerException e) {
Debug.error("Failed to save image (NullPointerException): " + f.getPath(), e); Debug.error("Failed to save image (NullPointerException): " + f.getPath(), e);
} }
MapManager.mapman.pushUpdate(tile.getWorld(), new Client.Tile(f.getPath())); MapManager.mapman.pushUpdate(tile.getWorld(), new Client.Tile(fname));
hashman.updateHashCode(tile.getKey(), shadername, t.tx, t.ty, crc); hashman.updateHashCode(tile.getKey(), shadername, t.tx, t.ty, crc);
tile.getDynmapWorld().enqueueZoomOutUpdate(f); tile.getDynmapWorld().enqueueZoomOutUpdate(f);
tile_update = true; tile_update = true;
@ -433,7 +434,8 @@ public class HDMap extends MapType {
MapManager.mapman.updateStatistics(tile, shadername, true, tile_update, !rendered[i]); MapManager.mapman.updateStatistics(tile, shadername, true, tile_update, !rendered[i]);
/* Handle day image, if needed */ /* Handle day image, if needed */
if(dayim[i] != null) { if(dayim[i] != null) {
f = new File(t.getDynmapWorld().worldtilepath, t.getDayFilename(shadername)); fname = t.getDayFilename(shadername);
f = new File(t.getDynmapWorld().worldtilepath, fname);
FileLockManager.getWriteLock(f); FileLockManager.getWriteLock(f);
shadername = shadername+"_day"; shadername = shadername+"_day";
tile_update = false; tile_update = false;
@ -450,7 +452,7 @@ public class HDMap extends MapType {
} catch (java.lang.NullPointerException e) { } catch (java.lang.NullPointerException e) {
Debug.error("Failed to save image (NullPointerException): " + f.getPath(), e); Debug.error("Failed to save image (NullPointerException): " + f.getPath(), e);
} }
MapManager.mapman.pushUpdate(tile.getWorld(), new Client.Tile(f.getPath())); MapManager.mapman.pushUpdate(tile.getWorld(), new Client.Tile(fname));
hashman.updateHashCode(tile.getKey(), shadername, t.tx, t.ty, crc); hashman.updateHashCode(tile.getKey(), shadername, t.tx, t.ty, crc);
tile.getDynmapWorld().enqueueZoomOutUpdate(f); tile.getDynmapWorld().enqueueZoomOutUpdate(f);
tile_update = true; tile_update = true;

View File

@ -1,8 +1,7 @@
package org.dynmap.hdmap; package org.dynmap.hdmap;
import org.dynmap.Color; import org.dynmap.Color;
import org.dynmap.utils.MapChunkCache; import org.dynmap.utils.Vector3D;
import org.dynmap.utils.MapIterator;
/** /**
* This interface is used to define the operational state of a renderer during raytracing * This interface is used to define the operational state of a renderer during raytracing
@ -12,7 +11,7 @@ public interface HDShaderState {
/** /**
* Reset renderer state for new ray - passes in pixel coordinate for ray * Reset renderer state for new ray - passes in pixel coordinate for ray
*/ */
void reset(int x, int y); void reset(int x, int y, Vector3D raystart, double scale);
/** /**
* Process next ray step - called for each block on route * Process next ray step - called for each block on route
* @param blocktype - block type of current block * @param blocktype - block type of current block