Merge pull request #277 from mikeprimm/hdrender

More models (beds, etc), proper fence support, lighting fixes for steps and slabs
This commit is contained in:
mikeprimm 2011-07-12 21:44:42 -07:00
commit 281005f1f8
4 changed files with 492 additions and 45 deletions

View File

@ -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

View File

@ -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;

View File

@ -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);

View File

@ -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;
}
}
}