aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/mapblock_mesh.cpp12
-rw-r--r--src/nodedef.cpp25
-rw-r--r--src/tile.h48
3 files changed, 54 insertions, 31 deletions
diff --git a/src/mapblock_mesh.cpp b/src/mapblock_mesh.cpp
index c871b6dbe..a9f14f8f0 100644
--- a/src/mapblock_mesh.cpp
+++ b/src/mapblock_mesh.cpp
@@ -1081,14 +1081,10 @@ MapBlockMesh::MapBlockMesh(MeshMakeData *data):
material.MaterialType
= video::EMT_TRANSPARENT_ALPHA_CHANNEL_REF;
material.setTexture(0, p.tile.texture.atlas);
- p.tile.applyMaterialOptions(material);
-
- if(enable_shaders){
- if(material.MaterialType == video::EMT_TRANSPARENT_ALPHA_CHANNEL_REF)
- material.MaterialType = shadermat1;
- if(material.MaterialType == video::EMT_TRANSPARENT_VERTEX_ALPHA)
- material.MaterialType = shadermat2;
- }
+ if(enable_shaders)
+ p.tile.applyMaterialOptionsWithShaders(material, shadermat1, shadermat2);
+ else
+ p.tile.applyMaterialOptions(material);
// Create meshbuffer
diff --git a/src/nodedef.cpp b/src/nodedef.cpp
index c48e2ff97..36fa798fd 100644
--- a/src/nodedef.cpp
+++ b/src/nodedef.cpp
@@ -555,6 +555,7 @@ public:
tiledef[j].name = "unknown_block.png";
}
+ bool is_liquid = false;
switch(f->drawtype){
default:
case NDT_NORMAL:
@@ -573,12 +574,14 @@ public:
f->solidness = 1;
f->backface_culling = false;
}
+ is_liquid = true;
break;
case NDT_FLOWINGLIQUID:
assert(f->liquid_type == LIQUID_FLOWING);
f->solidness = 0;
if(opaque_water)
f->alpha = 255;
+ is_liquid = true;
break;
case NDT_GLASSLIKE:
f->solidness = 0;
@@ -611,16 +614,24 @@ public:
break;
}
+ u8 material_type = 0;
+ if(is_liquid){
+ if(f->alpha == 255)
+ material_type = TILE_MATERIAL_LIQUID_OPAQUE;
+ else
+ material_type = TILE_MATERIAL_LIQUID_TRANSPARENT;
+ } else{
+ material_type = TILE_MATERIAL_BASIC;
+ }
+
// Tiles (fill in f->tiles[])
for(u16 j=0; j<6; j++){
// Texture
f->tiles[j].texture = tsrc->getTexture(tiledef[j].name);
// Alpha
f->tiles[j].alpha = f->alpha;
- if(f->alpha == 255)
- f->tiles[j].material_type = MATERIAL_ALPHA_SIMPLE;
- else
- f->tiles[j].material_type = MATERIAL_ALPHA_VERTEX;
+ // Material type
+ f->tiles[j].material_type = material_type;
// Material flags
f->tiles[j].material_flags = 0;
if(f->backface_culling)
@@ -661,10 +672,8 @@ public:
tsrc->getTexture(f->tiledef_special[j].name);
// Alpha
f->special_tiles[j].alpha = f->alpha;
- if(f->alpha == 255)
- f->special_tiles[j].material_type = MATERIAL_ALPHA_SIMPLE;
- else
- f->special_tiles[j].material_type = MATERIAL_ALPHA_VERTEX;
+ // Material type
+ f->special_tiles[j].material_type = material_type;
// Material flags
f->special_tiles[j].material_flags = 0;
if(f->tiledef_special[j].backface_culling)
diff --git a/src/tile.h b/src/tile.h
index 12c40c833..b00c1c6c6 100644
--- a/src/tile.h
+++ b/src/tile.h
@@ -161,10 +161,9 @@ public:
IWritableTextureSource* createTextureSource(IrrlichtDevice *device);
enum MaterialType{
- MATERIAL_ALPHA_NONE,
- MATERIAL_ALPHA_VERTEX,
- MATERIAL_ALPHA_SIMPLE, // >127 = opaque
- MATERIAL_ALPHA_BLEND,
+ TILE_MATERIAL_BASIC,
+ TILE_MATERIAL_LIQUID_TRANSPARENT,
+ TILE_MATERIAL_LIQUID_OPAQUE,
};
// Material flags
@@ -178,6 +177,8 @@ enum MaterialType{
// Animation made up by splitting the texture to vertical frames, as
// defined by extra parameters
#define MATERIAL_FLAG_ANIMATION_VERTICAL_FRAMES 0x08
+// Whether liquid shader should be used
+#define MATERIAL_FLAG_
/*
This fully defines the looks of a tile.
@@ -188,9 +189,7 @@ struct TileSpec
TileSpec():
texture(0),
alpha(255),
- //material_type(MATERIAL_ALPHA_NONE),
- // Use this so that leaves don't need a separate material
- material_type(MATERIAL_ALPHA_SIMPLE),
+ material_type(TILE_MATERIAL_BASIC),
material_flags(
//0 // <- DEBUG, Use the one below
MATERIAL_FLAG_BACKFACE_CULLING
@@ -218,15 +217,34 @@ struct TileSpec
// Sets everything else except the texture in the material
void applyMaterialOptions(video::SMaterial &material) const
{
- if(material_type == MATERIAL_ALPHA_NONE)
- material.MaterialType = video::EMT_SOLID;
- else if(material_type == MATERIAL_ALPHA_VERTEX)
- material.MaterialType = video::EMT_TRANSPARENT_VERTEX_ALPHA;
- else if(material_type == MATERIAL_ALPHA_SIMPLE)
+ switch(material_type){
+ case TILE_MATERIAL_BASIC:
material.MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL_REF;
- else if(material_type == MATERIAL_ALPHA_BLEND)
- material.MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL;
-
+ break;
+ case TILE_MATERIAL_LIQUID_TRANSPARENT:
+ material.MaterialType = video::EMT_TRANSPARENT_VERTEX_ALPHA;
+ break;
+ case TILE_MATERIAL_LIQUID_OPAQUE:
+ material.MaterialType = video::EMT_SOLID;
+ break;
+ }
+ material.BackfaceCulling = (material_flags & MATERIAL_FLAG_BACKFACE_CULLING) ? true : false;
+ }
+ void applyMaterialOptionsWithShaders(video::SMaterial &material,
+ const video::E_MATERIAL_TYPE &basic,
+ const video::E_MATERIAL_TYPE &liquid) const
+ {
+ switch(material_type){
+ case TILE_MATERIAL_BASIC:
+ material.MaterialType = basic;
+ break;
+ case TILE_MATERIAL_LIQUID_TRANSPARENT:
+ material.MaterialType = liquid;
+ break;
+ case TILE_MATERIAL_LIQUID_OPAQUE:
+ material.MaterialType = liquid;
+ break;
+ }
material.BackfaceCulling = (material_flags & MATERIAL_FLAG_BACKFACE_CULLING) ? true : false;
}