Noise: Prevent unittest crash caused by division by zero
[oweals/minetest.git] / src / nodedef.cpp
index 110393d630a050fd190b7ac6859cddbe4308214b..fc404f252a73da4d789e3908edfbe9bf83c1d11b 100644 (file)
@@ -637,7 +637,10 @@ void ContentFeatures::fillTileAttribs(ITextureSource *tsrc, TileLayer *tile,
                tile->material_flags &= ~MATERIAL_FLAG_ANIMATION;
        } else {
                std::ostringstream os(std::ios::binary);
-               tile->frames.resize(frame_count);
+               if (!tile->frames) {
+                       tile->frames = std::make_shared<std::vector<FrameSpec>>();
+               }
+               tile->frames->resize(frame_count);
 
                for (int i = 0; i < frame_count; i++) {
 
@@ -652,7 +655,7 @@ void ContentFeatures::fillTileAttribs(ITextureSource *tsrc, TileLayer *tile,
                        if (tile->normal_texture)
                                frame.normal_texture = tsrc->getNormalTexture(os.str());
                        frame.flags_texture = tile->flags_texture;
-                       tile->frames[i] = frame;
+                       (*tile->frames)[i] = frame;
                }
        }
 }
@@ -690,6 +693,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:
@@ -770,6 +775,9 @@ void ContentFeatures::updateTextures(ITextureSource *tsrc, IShaderSource *shdsrc
        case NDT_RAILLIKE:
                solidness = 0;
                break;
+       case NDT_PLANTLIKE_ROOTED:
+               solidness = 2;
+               break;
        }
 
        if (is_liquid) {
@@ -781,28 +789,41 @@ void ContentFeatures::updateTextures(ITextureSource *tsrc, IShaderSource *shdsrc
                        TILE_MATERIAL_LIQUID_OPAQUE : TILE_MATERIAL_LIQUID_TRANSPARENT;
        }
 
-       u32 tile_shader[6];
-       for (u16 j = 0; j < 6; j++) {
-               tile_shader[j] = shdsrc->getShader("nodes_shader",
-                       material_type, drawtype);
-       }
+       u32 tile_shader = 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 = shdsrc->getShader("nodes_shader", overlay_material, drawtype);
 
        // Tiles (fill in f->tiles[])
        for (u16 j = 0; j < 6; j++) {
-               fillTileAttribs(tsrc, &tiles[j].layers[0], &tdef[j], tile_shader[j],
+               fillTileAttribs(tsrc, &tiles[j].layers[0], &tdef[j], tile_shader,
                        tsettings.use_normal_texture,
                        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, tsettings.use_normal_texture,
+                               tdef[j].backface_culling, overlay_material);
+       }
+
+       u8 special_material = material_type;
+       if (drawtype == NDT_PLANTLIKE_ROOTED) {
+               if (waving == 1)
+                       special_material = TILE_MATERIAL_WAVING_PLANTS;
+               else if (waving == 2)
+                       special_material = TILE_MATERIAL_WAVING_LEAVES;
        }
+       u32 special_shader = shdsrc->getShader("nodes_shader", special_material, drawtype);
 
        // Special tiles (fill in f->special_tiles[])
        for (u16 j = 0; j < CF_SPECIAL_COUNT; j++) {
                fillTileAttribs(tsrc, &special_tiles[j].layers[0], &tdef_spec[j],
-                       tile_shader[j], tsettings.use_normal_texture,
-                       tdef_spec[j].backface_culling, material_type);
+                       special_shader, tsettings.use_normal_texture,
+                       tdef_spec[j].backface_culling, special_material);
        }
 
        if (param_type_2 == CPT2_COLOR ||