]> git.lizzy.rs Git - minetest.git/commitdiff
Tile material: Add 'TILE_MATERIAL_OPAQUE', use for drawtype 'NDT_NORMAL'
authorstujones11 <stujones111@gmail.com>
Wed, 7 Jun 2017 17:52:38 +0000 (18:52 +0100)
committerparamat <mat.gregory@virginmedia.com>
Sat, 1 Jul 2017 03:43:55 +0000 (04:43 +0100)
Prevents normal drawtype nodes having transparency.
Avoids clients cheating by using 'x-ray' texture packs with transparent textures.

src/client/tile.h
src/nodedef.cpp
src/shader.cpp

index b4d615427ad147d89a092cff3fd9f303f086281e..fb1c87371c55286066958848d363a2742444d937 100644 (file)
@@ -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;
index 110393d630a050fd190b7ac6859cddbe4308214b..6ccbc1557d993ba7055d68770a8cc242f13706b5 100644 (file)
@@ -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[])
index 6e89d75adca0d18739b4eefdbfe0909d8dc0a260..4f482fddbb4d0b7f1c3a9f49514ebc84fd1f9182 100644 (file)
@@ -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++){