]> git.lizzy.rs Git - minetest.git/blobdiff - src/mapblock_mesh.cpp
Fix a crash (assert) when client set serial version < 24 in INIT
[minetest.git] / src / mapblock_mesh.cpp
index e4c561a64d9187c75c789e576bc507e78fcca99e..cf311acba1a54454eeaab7e904fd5897c2483bb3 100644 (file)
@@ -259,8 +259,8 @@ static u16 getSmoothLightCombined(v3s16 p, MeshMakeData *data)
                        light_source_max = f.light_source;
                // Check f.solidness because fast-style leaves look better this way
                if (f.param_type == CPT_LIGHT && f.solidness != 2) {
-                       light_day += decode_light(n.getLight(LIGHTBANK_DAY, ndef));
-                       light_night += decode_light(n.getLight(LIGHTBANK_NIGHT, ndef));
+                       light_day += decode_light(n.getLightNoChecks(LIGHTBANK_DAY, &f));
+                       light_night += decode_light(n.getLightNoChecks(LIGHTBANK_NIGHT, &f));
                        light_count++;
                } else {
                        ambient_occlusion++;
@@ -288,9 +288,15 @@ static u16 getSmoothLightCombined(v3s16 p, MeshMakeData *data)
 
        if (ambient_occlusion > 4)
        {
-               //table of precalculated gamma space multiply factors
-               //light^2.2 * factor (0.75, 0.5, 0.25, 0.0), so table holds factor ^ (1 / 2.2)
-               static const float light_amount[4] = { 0.877424315, 0.729740053, 0.532520545, 0.0 };
+               static const float ao_gamma = rangelim(
+                       g_settings->getFloat("ambient_occlusion_gamma"), 0.25, 4.0);
+
+               // Table of gamma space multiply factors.
+               static const float light_amount[3] = {
+                       powf(0.75, 1.0 / ao_gamma),
+                       powf(0.5,  1.0 / ao_gamma),
+                       powf(0.25, 1.0 / ao_gamma)
+               };
 
                //calculate table index for gamma space multiplier
                ambient_occlusion -= 5;
@@ -340,15 +346,15 @@ void finalColorBlend(video::SColor& result,
                1, 4, 6, 6, 6, 5, 4, 3, 2, 1, 0, 0, 0, 0, 0, 0,
                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
        };
-       b += emphase_blue_when_dark[b / 8];
-       b = irr::core::clamp (b, 0, 255);
+       b += emphase_blue_when_dark[irr::core::clamp(b, 0, 255) / 8];
+       b = irr::core::clamp(b, 0, 255);
 
        // Artificial light is yellow-ish
        static const u8 emphase_yellow_when_artificial[16] = {
                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 10, 15, 15, 15
        };
        rg += emphase_yellow_when_artificial[night/16];
-       rg = irr::core::clamp (rg, 0, 255);
+       rg = irr::core::clamp(rg, 0, 255);
 
        result.setRed(rg);
        result.setGreen(rg);
@@ -693,8 +699,7 @@ TileSpec getNodeTile(MapNode mn, v3s16 p, v3s16 dir, MeshMakeData *data)
 
        // Get rotation for things like chests
        u8 facedir = mn.getFaceDir(ndef);
-       if (facedir > 23)
-               facedir = 0;
+
        static const u16 dir_to_tile[24 * 16] =
        {
                // 0     +X    +Y    +Z           -Z    -Y    -X   ->   value=tile,rotation
@@ -1136,7 +1141,7 @@ MapBlockMesh::MapBlockMesh(MeshMakeData *data, v3s16 camera_offset):
                                m_animation_frame_offsets[i] = 0;
                        }
                        // Replace tile texture with the first animation frame
-                       FrameSpec animation_frame = p.tile.frames.find(0)->second;
+                       FrameSpec animation_frame = p.tile.frames[0];
                        p.tile.texture = animation_frame.texture;
                }
 
@@ -1162,12 +1167,16 @@ MapBlockMesh::MapBlockMesh(MeshMakeData *data, v3s16 camera_offset):
                                        applyFacesShading (vc, 0.836660);
                                }
                        }
-                       // - Classic lighting
-                       // Set initial real color and store for later updates
-                       u8 day = vc.getRed();
-                       u8 night = vc.getGreen();
-                       finalColorBlend(vc, day, night, 1000);
-                       m_daynight_diffs[i][j] = std::make_pair(day, night);
+                       if(!m_enable_shaders)
+                       {
+                               // - Classic lighting (shaders handle this by themselves)
+                               // Set initial real color and store for later updates
+                               u8 day = vc.getRed();
+                               u8 night = vc.getGreen();
+                               finalColorBlend(vc, day, night, 1000);
+                               if(day != night)
+                                       m_daynight_diffs[i][j] = std::make_pair(day, night);
+                       }
                }
 
                // Create material
@@ -1318,7 +1327,7 @@ bool MapBlockMesh::animate(bool faraway, float time, int crack, u32 daynight_rat
                scene::IMeshBuffer *buf = m_mesh->getMeshBuffer(i->first);
                ITextureSource *tsrc = m_gamedef->getTextureSource();
 
-               FrameSpec animation_frame = tile.frames.find(frame)->second;
+               FrameSpec animation_frame = tile.frames[frame];
                buf->getMaterial().setTexture(0, animation_frame.texture);
                if (m_enable_shaders) {
                        if (animation_frame.normal_texture) {
@@ -1331,7 +1340,7 @@ bool MapBlockMesh::animate(bool faraway, float time, int crack, u32 daynight_rat
        }
 
        // Day-night transition
-       if(daynight_ratio != m_last_daynight_ratio)
+       if(!m_enable_shaders && (daynight_ratio != m_last_daynight_ratio))
        {
                for(std::map<u32, std::map<u32, std::pair<u8, u8> > >::iterator
                                i = m_daynight_diffs.begin();