summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorstujones11 <stujones111@gmail.com>2017-06-07 18:52:38 +0100
committerparamat <mat.gregory@virginmedia.com>2017-07-01 04:43:55 +0100
commit6e5588c8e1a6cf79005b5e95c75cbfacf7c75589 (patch)
tree2f008e377daa84c33674099cdc0580e0479340e0
parentf3ad75691aea30d2d68aab19fbfa9031409c39d7 (diff)
downloadminetest-6e5588c8e1a6cf79005b5e95c75cbfacf7c75589.tar.gz
minetest-6e5588c8e1a6cf79005b5e95c75cbfacf7c75589.tar.bz2
minetest-6e5588c8e1a6cf79005b5e95c75cbfacf7c75589.zip
Tile material: Add 'TILE_MATERIAL_OPAQUE', use for drawtype 'NDT_NORMAL'
Prevents normal drawtype nodes having transparency. Avoids clients cheating by using 'x-ray' texture packs with transparent textures.
-rw-r--r--src/client/tile.h10
-rw-r--r--src/nodedef.cpp16
-rw-r--r--src/shader.cpp36
3 files changed, 35 insertions, 27 deletions
diff --git a/src/client/tile.h b/src/client/tile.h
index b4d615427..fb1c87371 100644
--- a/src/client/tile.h
+++ b/src/client/tile.h
@@ -156,7 +156,8 @@ enum MaterialType{
TILE_MATERIAL_LIQUID_TRANSPARENT,
TILE_MATERIAL_LIQUID_OPAQUE,
TILE_MATERIAL_WAVING_LEAVES,
- TILE_MATERIAL_WAVING_PLANTS
+ TILE_MATERIAL_WAVING_PLANTS,
+ TILE_MATERIAL_OPAQUE
};
// Material flags
@@ -216,6 +217,10 @@ struct TileLayer
void applyMaterialOptions(video::SMaterial &material) const
{
switch (material_type) {
+ case TILE_MATERIAL_OPAQUE:
+ case TILE_MATERIAL_LIQUID_OPAQUE:
+ material.MaterialType = video::EMT_SOLID;
+ break;
case TILE_MATERIAL_BASIC:
case TILE_MATERIAL_WAVING_LEAVES:
case TILE_MATERIAL_WAVING_PLANTS:
@@ -225,9 +230,6 @@ struct TileLayer
case TILE_MATERIAL_LIQUID_TRANSPARENT:
material.MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL;
break;
- case TILE_MATERIAL_LIQUID_OPAQUE:
- material.MaterialType = video::EMT_SOLID;
- break;
}
material.BackfaceCulling = (material_flags & MATERIAL_FLAG_BACKFACE_CULLING)
? true : false;
diff --git a/src/nodedef.cpp b/src/nodedef.cpp
index 110393d63..6ccbc1557 100644
--- a/src/nodedef.cpp
+++ b/src/nodedef.cpp
@@ -690,6 +690,8 @@ void ContentFeatures::updateTextures(ITextureSource *tsrc, IShaderSource *shdsrc
switch (drawtype) {
default:
case NDT_NORMAL:
+ material_type = (alpha == 255) ?
+ TILE_MATERIAL_OPAQUE : TILE_MATERIAL_ALPHA;
solidness = 2;
break;
case NDT_AIRLIKE:
@@ -786,6 +788,16 @@ void ContentFeatures::updateTextures(ITextureSource *tsrc, IShaderSource *shdsrc
tile_shader[j] = shdsrc->getShader("nodes_shader",
material_type, drawtype);
}
+ u8 overlay_material = material_type;
+ if (overlay_material == TILE_MATERIAL_OPAQUE)
+ overlay_material = TILE_MATERIAL_BASIC;
+ else if (overlay_material == TILE_MATERIAL_LIQUID_OPAQUE)
+ overlay_material = TILE_MATERIAL_LIQUID_TRANSPARENT;
+ u32 overlay_shader[6];
+ for (u16 j = 0; j < 6; j++) {
+ overlay_shader[j] = shdsrc->getShader("nodes_shader",
+ overlay_material, drawtype);
+ }
// Tiles (fill in f->tiles[])
for (u16 j = 0; j < 6; j++) {
@@ -794,8 +806,8 @@ void ContentFeatures::updateTextures(ITextureSource *tsrc, IShaderSource *shdsrc
tdef[j].backface_culling, material_type);
if (tdef_overlay[j].name != "")
fillTileAttribs(tsrc, &tiles[j].layers[1], &tdef_overlay[j],
- tile_shader[j], tsettings.use_normal_texture,
- tdef[j].backface_culling, material_type);
+ overlay_shader[j], tsettings.use_normal_texture,
+ tdef[j].backface_culling, overlay_material);
}
// Special tiles (fill in f->special_tiles[])
diff --git a/src/shader.cpp b/src/shader.cpp
index 6e89d75ad..4f482fddb 100644
--- a/src/shader.cpp
+++ b/src/shader.cpp
@@ -531,26 +531,19 @@ ShaderInfo generate_shader(const std::string &name, u8 material_type, u8 drawtyp
shaderinfo.drawtype = drawtype;
shaderinfo.material = video::EMT_SOLID;
switch (material_type) {
- case TILE_MATERIAL_BASIC:
- shaderinfo.base_material = video::EMT_TRANSPARENT_ALPHA_CHANNEL_REF;
- break;
- case TILE_MATERIAL_ALPHA:
- shaderinfo.base_material = video::EMT_TRANSPARENT_ALPHA_CHANNEL;
- break;
- case TILE_MATERIAL_LIQUID_TRANSPARENT:
- shaderinfo.base_material = video::EMT_TRANSPARENT_ALPHA_CHANNEL;
- break;
- case TILE_MATERIAL_LIQUID_OPAQUE:
- shaderinfo.base_material = video::EMT_SOLID;
- break;
- case TILE_MATERIAL_WAVING_LEAVES:
- shaderinfo.base_material = video::EMT_TRANSPARENT_ALPHA_CHANNEL_REF;
- break;
- case TILE_MATERIAL_WAVING_PLANTS:
- shaderinfo.base_material = video::EMT_TRANSPARENT_ALPHA_CHANNEL_REF;
- break;
- default:
- break;
+ case TILE_MATERIAL_OPAQUE:
+ case TILE_MATERIAL_LIQUID_OPAQUE:
+ shaderinfo.base_material = video::EMT_SOLID;
+ break;
+ case TILE_MATERIAL_ALPHA:
+ case TILE_MATERIAL_LIQUID_TRANSPARENT:
+ shaderinfo.base_material = video::EMT_TRANSPARENT_ALPHA_CHANNEL;
+ break;
+ case TILE_MATERIAL_BASIC:
+ case TILE_MATERIAL_WAVING_LEAVES:
+ case TILE_MATERIAL_WAVING_PLANTS:
+ shaderinfo.base_material = video::EMT_TRANSPARENT_ALPHA_CHANNEL_REF;
+ break;
}
bool enable_shaders = g_settings->getBool("enable_shaders");
@@ -642,7 +635,8 @@ ShaderInfo generate_shader(const std::string &name, u8 material_type, u8 drawtyp
"TILE_MATERIAL_LIQUID_TRANSPARENT",
"TILE_MATERIAL_LIQUID_OPAQUE",
"TILE_MATERIAL_WAVING_LEAVES",
- "TILE_MATERIAL_WAVING_PLANTS"
+ "TILE_MATERIAL_WAVING_PLANTS",
+ "TILE_MATERIAL_OPAQUE"
};
for (int i = 0; i < 6; i++){