From c81c8cbaa66eef565e4c9000661d764e0d3ae4c6 Mon Sep 17 00:00:00 2001 From: Mike Primm Date: Tue, 12 Jul 2011 23:32:18 -0500 Subject: [PATCH] More models (beds, etc), proper fence support, lighting fixes for steps and slabs --- models.txt | 460 ++++++++++++++++-- .../org/dynmap/hdmap/DefaultHDShader.java | 7 +- .../java/org/dynmap/hdmap/HDBlockModels.java | 4 + .../org/dynmap/hdmap/IsoHDPerspective.java | 66 ++- 4 files changed, 492 insertions(+), 45 deletions(-) diff --git a/models.txt b/models.txt index 6f1c3b44..8ded23da 100644 --- a/models.txt +++ b/models.txt @@ -20,11 +20,13 @@ rotate:id=53,data=0,rot=90 block:id=53,id=67,data=3,scale=2 rotate:id=53,data=0,rot=270 # Slab (stone, sandstone, wood, cobblestone) -block:id=44,data=*,scale=2 -layer:0 -** -** -layer:1 +block:id=44,data=*,scale=4 +layer:0,1 +**** +**** +**** +**** +layer:2,3 -- -- # Snow @@ -93,26 +95,236 @@ rotate:id=50,data=1,rot=90 # Redstone torch off - pointing east block:id=50,id=75,id=76,data=4,scale=8 rotate:id=50,data=1,rot=270 -# Fence -block:id=85,data=*,scale=8 -layer:0,1,3,4,6 --------- --------- --------- ----**--- ----**--- --------- --------- --------- -layer:2,5 ----**--- ----**--- ----**--- -******** -******** ----**--- ----**--- ----**--- +# Fence - (data is faked: 1=north,2=east,4=south,8=west) +# Fence - no neighbors +block:id=85,data=0,scale=16 +layer:0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 +---------------- +---------------- +---------------- +---------------- +---------------- +---------------- +------****------ +------****------ +------****------ +------****------ +---------------- +---------------- +---------------- +---------------- +---------------- +---------------- +# Fence - just north neighbor +block:id=85,data=1,scale=16 +layer:0,1,2,3,4,5,9,10,11,15 +---------------- +---------------- +---------------- +---------------- +---------------- +---------------- +------****------ +------****------ +------****------ +------****------ +---------------- +---------------- +---------------- +---------------- +---------------- +---------------- +layer:6,7,8,12,13,14 +-------**------- +-------**------- +-------**------- +-------**------- +-------**------- +-------**------- +------****------ +------****------ +------****------ +------****------ +---------------- +---------------- +---------------- +---------------- +---------------- +---------------- +# Fence - just east neighbor +block:id=85,data=2,scale=16 +rotate:id=85,data=1,rot=90 +# Fence - just south neighbor +block:id=85,data=4,scale=16 +rotate:id=85,data=1,rot=180 +# Fence - just south neighbor +block:id=85,data=8,scale=16 +rotate:id=85,data=1,rot=270 +# Fence - north and east neighbor +block:id=85,data=3,scale=16 +layer:0,1,2,3,4,5,9,10,11,15 +---------------- +---------------- +---------------- +---------------- +---------------- +---------------- +------****------ +------****------ +------****------ +------****------ +---------------- +---------------- +---------------- +---------------- +---------------- +---------------- +layer:6,7,8,12,13,14 +-------**------- +-------**------- +-------**------- +-------**------- +-------**------- +-------**------- +------****------ +------********** +------********** +------****------ +---------------- +---------------- +---------------- +---------------- +---------------- +---------------- +# Fence - east and south neighbor +block:id=85,data=6,scale=16 +rotate:id=85,data=3,rot=90 +# Fence - south and west neighbor +block:id=85,data=12,scale=16 +rotate:id=85,data=3,rot=180 +# Fence - west and north neighbor +block:id=85,data=9,scale=16 +rotate:id=85,data=3,rot=270 +# Fence - north and south neighbor +block:id=85,data=5,scale=16 +layer:0,1,2,3,4,5,9,10,11,15 +---------------- +---------------- +---------------- +---------------- +---------------- +---------------- +------****------ +------****------ +------****------ +------****------ +---------------- +---------------- +---------------- +---------------- +---------------- +---------------- +layer:6,7,8,12,13,14 +-------**------- +-------**------- +-------**------- +-------**------- +-------**------- +-------**------- +------****------ +------****------ +------****------ +------****------ +-------**------- +-------**------- +-------**------- +-------**------- +-------**------- +-------**------- +# Fence - east and west neighbor +block:id=85,data=10,scale=16 +rotate:id=85,data=5,rot=90 +# Fence - north, east and south neighbor +block:id=85,data=7,scale=16 +layer:0,1,2,3,4,5,9,10,11,15 +---------------- +---------------- +---------------- +---------------- +---------------- +---------------- +------****------ +------****------ +------****------ +------****------ +---------------- +---------------- +---------------- +---------------- +---------------- +---------------- +layer:6,7,8,12,13,14 +-------**------- +-------**------- +-------**------- +-------**------- +-------**------- +-------**------- +------****------ +------********** +------********** +------****------ +-------**------- +-------**------- +-------**------- +-------**------- +-------**------- +-------**------- +# Fence - east, south and west neighbor +block:id=85,data=14,scale=16 +rotate:id=85,data=7,rot=90 +# Fence - south, west and north neighbor +block:id=85,data=13,scale=16 +rotate:id=85,data=7,rot=180 +# Fence - west, north and east neighbor +block:id=85,data=11,scale=16 +rotate:id=85,data=7,rot=270 +# Fence - north, south, east, west neightbors +block:id=85,data=15,scale=16 +layer:0,1,2,3,4,5,9,10,11,15 +---------------- +---------------- +---------------- +---------------- +---------------- +---------------- +------****------ +------****------ +------****------ +------****------ +---------------- +---------------- +---------------- +---------------- +---------------- +---------------- +layer:6,7,8,12,13,14 +-------**------- +-------**------- +-------**------- +-------**------- +-------**------- +-------**------- +------****------ +**************** +**************** +------****------ +-------**------- +-------**------- +-------**------- +-------**------- +-------**------- +-------**------- # Trapdoor # Stone pressure plate # Wooden pressure plate @@ -606,12 +818,16 @@ rotate:id=65,data=2,rot=270 block:id=65,data=5,scale=16 rotate:id=65,data=2,rot=90 # Wall sign - facing east -block:id=68,data=2,scale=4 -layer:1,2 -*--- -*--- -*--- -*--- +block:id=68,data=2,scale=8 +layer:2,3,4,5 +*------- +*------- +*------- +*------- +*------- +*------- +*------- +*------- # Wall sign - facing west block:id=68,data=3,scale=4 rotate:id=68,data=2,rot=180 @@ -996,7 +1212,7 @@ layer:3 --**-**- --**---- -------- -layer:4 +layer:4,5 -------- --*----- --*--**- @@ -1005,12 +1221,188 @@ layer:4 -**--*-- -----*-- -------- +layer:6,7 +-------- +-------- +--*--*-- +-------- +-------- +--*--*-- +-------- +-------- + Tall grass +block:id=31,data=1,scale=16 +layer:0,1 +-*-*-*-*-*-*-*-* +*-*-*-*-*-*-*-*- +-*-*-*-*-*-*-*-* +*-*-*-*-*-*-*-*- +-*-*-*-*-*-*-*-* +*-*-*-*-*-*-*-*- +-*-*-*-*-*-*-*-* +*-*-*-*-*-*-*-*- +-*-*-*-*-*-*-*-* +*-*-*-*-*-*-*-*- +-*-*-*-*-*-*-*-* +*-*-*-*-*-*-*-*- +-*-*-*-*-*-*-*-* +*-*-*-*-*-*-*-*- +-*-*-*-*-*-*-*-* +*-*-*-*-*-*-*-*- +layer:2,3 +---*---*---*---* +-*---*---*---*-- +---*---*---*---* +-*---*---*---*-- +---*---*---*---* +-*---*---*---*-- +---*---*---*---* +-*---*---*---*-- +---*---*---*---* +-*---*---*---*-- +---*---*---*---* +-*---*---*---*-- +---*---*---*---* +-*---*---*---*-- +---*---*---*---* +-*---*---*---*-- +layer:4 +-----*-------*-- +-*-------*------ +-----*-------*-- +-*-------*------ +-----*-------*-- +-*-------*------ +-----*-------*-- +-*-------*------ +-----*-------*-- +-*-------*------ +-----*-------*-- +-*-------*------ +-----*-------*-- +-*-------*------ +-----*-------*-- +-*-------*------ +# Sapling +block:id=6,data=*,scale=8 +layer:0 +-------- +-------- +-------- +---**--- +---**--- +-------- +-------- +-------- +layer:1 +-------- +-------- +---*---- +---**--- +---***-- +--*----- +-------- +-------- +layer:2 +-------- +---*---- +-------- +--***--- +---**-*- +----*--- +-*------ +-------- +layer:3 +-------- +---*---- +-------- +-*-**--- +---**-*- +-------- +-*---*-- +-------- +layer:4 +-------- +---**--- +-*-*-*-- +**--**-- +---*---- +-*--**-- +-**--*-- +-------- layer:5 -------- +---**--- +**-***-- +**--**-- +---*---- +-**-**-- +-**-**-- -------- ---*--*-- +# Bed - head - pointing west +block:id=26,data=8,scale=8 +layer:0,1 -------- +*------- +*------- +*------- +*------- +*------- +*------- -------- ---*--*-- +layer:2,3 -------- +******** +******** +******** +******** +******** +******** -------- +layer:4 +-------- +*------- +*-**---- +*-**---- +*-**---- +*-**---- +*------- +-------- +# Bed - head - pointing north +block:id=26,data=9,scale=8 +rotate:id=26,data=8,rot=90 +# Bed - head - pointing east +block:id=26,data=10,scale=8 +rotate:id=26,data=8,rot=180 +# Bed - head - pointing south +block:id=26,data=11,scale=8 +rotate:id=26,data=8,rot=270 +# Bed - foot - pointing west +block:id=26,data=0,scale=8 +layer:0,1 +-------- +------*- +------*- +------*- +------*- +------*- +------*- +-------- +layer:2,3 +-------- +*******- +*******- +*******- +*******- +*******- +*******- +-------- +# Bed - foot - pointing north +block:id=26,data=1,scale=8 +rotate:id=26,data=0,rot=90 +# Bed - foot - pointing east +block:id=26,data=2,scale=8 +rotate:id=26,data=0,rot=180 +# Bed - foot - pointing south +block:id=26,data=3,scale=8 +rotate:id=26,data=0,rot=270 diff --git a/src/main/java/org/dynmap/hdmap/DefaultHDShader.java b/src/main/java/org/dynmap/hdmap/DefaultHDShader.java index 784b3ad8..c29da3fa 100644 --- a/src/main/java/org/dynmap/hdmap/DefaultHDShader.java +++ b/src/main/java/org/dynmap/hdmap/DefaultHDShader.java @@ -154,9 +154,10 @@ public class DefaultHDShader implements HDShader { seq = 0; break; default: - if(subalpha >= 0) /* We hit a block in a model */ - seq = 4; /* Use smooth top */ - else if(((pixelodd + mapiter.getY()) & 0x03) == 0) + //if(subalpha >= 0) /* We hit a block in a model */ + // seq = 4; /* Use smooth top */ + //else + if(((pixelodd + mapiter.getY()) & 0x03) == 0) seq = 3; else seq = 1; diff --git a/src/main/java/org/dynmap/hdmap/HDBlockModels.java b/src/main/java/org/dynmap/hdmap/HDBlockModels.java index 17f4aef0..9781d00d 100644 --- a/src/main/java/org/dynmap/hdmap/HDBlockModels.java +++ b/src/main/java/org/dynmap/hdmap/HDBlockModels.java @@ -162,6 +162,8 @@ public class HDBlockModels { } } map[off] = (short)((255*raw_w) / (nativeres*nativeres*nativeres)); + if(map[off] > 255) map[off] = 255; + if(map[off] < 0) map[off] = 0; } } } @@ -214,6 +216,8 @@ public class HDBlockModels { } for(int i = 0; i < map.length; i++) { map[i] = (short)(255*map[i]/(nativeres*nativeres*nativeres)); + if(map[i] > 255) map[i] = 255; + if(map[i] < 0) map[i] = 0; } } scaledblocks.put(Integer.valueOf(res), map); diff --git a/src/main/java/org/dynmap/hdmap/IsoHDPerspective.java b/src/main/java/org/dynmap/hdmap/IsoHDPerspective.java index b996f81a..689c7231 100644 --- a/src/main/java/org/dynmap/hdmap/IsoHDPerspective.java +++ b/src/main/java/org/dynmap/hdmap/IsoHDPerspective.java @@ -216,14 +216,39 @@ public class IsoHDPerspective implements HDPerspective { */ private boolean visit_block(MapIterator mapiter, HDShaderState[] shaderstate, boolean[] shaderdone) { blocktypeid = mapiter.getBlockTypeID(); + boolean skip_light_update = false; if(nonairhit || (blocktypeid != 0)) { blockdata = mapiter.getBlockData(); + if(blocktypeid == 85) { /* Special case for fence - need to fake data so we can render properly */ + mapiter.decrementX(); /* Look north */ + blockdata = 0; + if(mapiter.getBlockTypeID() == 85) { /* Fence? */ + blockdata |= 1; + } + mapiter.incrementX(); + mapiter.decrementZ(); /* Look east */ + if(mapiter.getBlockTypeID() == 85) { /* Fence? */ + blockdata |= 2; + } + mapiter.incrementZ(); + mapiter.incrementX(); /* Look south */ + if(mapiter.getBlockTypeID() == 85) { /* Fence? */ + blockdata |= 4; + } + mapiter.decrementX(); /* Look west */ + mapiter.incrementZ(); + if(mapiter.getBlockTypeID() == 85) { /* Fence? */ + blockdata |= 8; + } + mapiter.decrementZ(); + } boolean missed = false; /* Look up to see if block is modelled */ short[] model = scalemodels.getScaledModel(blocktypeid, blockdata); if(model != null) { missed = raytraceSubblock(model); + skip_light_update = true; /* Some blocks are light blocking, but not fully blocking - this sucks */ } else { subalpha = -1; @@ -241,10 +266,26 @@ public class IsoHDPerspective implements HDPerspective { nonairhit = true; } } - if(need_skylightlevel) - skylightlevel = mapiter.getBlockSkyLight(); - if(need_emittedlightlevel) - emittedlightlevel = mapiter.getBlockEmittedLight(); + if(skip_light_update) { /* If considering skipping, do so if block is unlit */ + int ll; + if(need_skylightlevel) { + ll = mapiter.getBlockSkyLight(); + if(ll > 0) + skylightlevel = ll; + } + if(need_emittedlightlevel) { + ll = mapiter.getBlockEmittedLight(); + if(ll > 0) { + emittedlightlevel = ll; + } + } + } + else { + if(need_skylightlevel) + skylightlevel = mapiter.getBlockSkyLight(); + if(need_emittedlightlevel) + emittedlightlevel = mapiter.getBlockEmittedLight(); + } return false; } /** @@ -314,7 +355,7 @@ public class IsoHDPerspective implements HDPerspective { private boolean raytraceSubblock(short[] model) { int mx = 0, my = 0, mz = 0; double xx, yy, zz; - double mt = t + 0.00000001; + double mt = t + 0.0000001; xx = top.x + mt *(bottom.x - top.x); yy = top.y + mt *(bottom.y - top.y); zz = top.z + mt *(bottom.z - top.z); @@ -357,11 +398,14 @@ public class IsoHDPerspective implements HDPerspective { mt_next_x += mdt_dx; if(x_inc > 0) { laststep = BlockStep.X_PLUS; + if(mx >= modscale) + return true; } else { laststep = BlockStep.X_MINUS; if(mx < 0) - mx += modscale; + //mx += modscale; + return true; } } /* If Y step is next best */ @@ -371,11 +415,14 @@ public class IsoHDPerspective implements HDPerspective { mt_next_y += mdt_dy; if(y_inc > 0) { laststep = BlockStep.Y_PLUS; + if(my >= modscale) + return true; } else { laststep = BlockStep.Y_MINUS; if(my < 0) - my += modscale; + //my += modscale; + return true; } } /* Else, Z step is next best */ @@ -385,11 +432,14 @@ public class IsoHDPerspective implements HDPerspective { mt_next_z += mdt_dz; if(z_inc > 0) { laststep = BlockStep.Z_PLUS; + if(mz >= modscale) + return true; } else { laststep = BlockStep.Z_MINUS; if(mz < 0) - mz += modscale; + //mz += modscale; + return true; } } }