]> git.lizzy.rs Git - minetest.git/blobdiff - src/client/mapblock_mesh.cpp
Fix movement in random_input mode (#11592)
[minetest.git] / src / client / mapblock_mesh.cpp
index c7790f1e47b98a0a81c28ecc4dbfaee53c2ee66c..03522eca9326db57e6a91f5c3f512b3ec2a5eb6c 100644 (file)
@@ -35,11 +35,9 @@ with this program; if not, write to the Free Software Foundation, Inc.,
        MeshMakeData
 */
 
-MeshMakeData::MeshMakeData(Client *client, bool use_shaders,
-               bool use_tangent_vertices):
+MeshMakeData::MeshMakeData(Client *client, bool use_shaders):
        m_client(client),
-       m_use_shaders(use_shaders),
-       m_use_tangent_vertices(use_tangent_vertices)
+       m_use_shaders(use_shaders)
 {}
 
 void MeshMakeData::fillBlockDataBegin(const v3s16 &blockpos)
@@ -406,26 +404,26 @@ static void getNodeVertexDirs(const v3s16 &dir, v3s16 *vertex_dirs)
 
 static void getNodeTextureCoords(v3f base, const v3f &scale, const v3s16 &dir, float *u, float *v)
 {
-       if (dir.X > 0 || dir.Y > 0 || dir.Z < 0)
+       if (dir.X > 0 || dir.Y != 0 || dir.Z < 0)
                base -= scale;
        if (dir == v3s16(0,0,1)) {
-               *u = -base.X - 1;
-               *v = -base.Y - 1;
+               *u = -base.X;
+               *v = -base.Y;
        } else if (dir == v3s16(0,0,-1)) {
                *u = base.X + 1;
-               *v = -base.Y - 2;
+               *v = -base.Y - 1;
        } else if (dir == v3s16(1,0,0)) {
                *u = base.Z + 1;
-               *v = -base.Y - 2;
-       } else if (dir == v3s16(-1,0,0)) {
-               *u = -base.Z - 1;
                *v = -base.Y - 1;
+       } else if (dir == v3s16(-1,0,0)) {
+               *u = -base.Z;
+               *v = -base.Y;
        } else if (dir == v3s16(0,1,0)) {
                *u = base.X + 1;
-               *v = -base.Z - 2;
+               *v = -base.Z - 1;
        } else if (dir == v3s16(0,-1,0)) {
-               *u = base.X;
-               *v = base.Z;
+               *u = base.X + 1;
+               *v = base.Z + 1;
        }
 }
 
@@ -862,6 +860,9 @@ static void updateFastFaceRow(
                g_settings->getBool("enable_shaders") &&
                g_settings->getBool("enable_waving_water");
 
+       static thread_local const bool force_not_tiling =
+                       g_settings->getBool("enable_dynamic_shadows");
+
        v3s16 p = startpos;
 
        u16 continuous_tiles_count = 1;
@@ -900,7 +901,8 @@ static void updateFastFaceRow(
                                        waving,
                                        next_tile);
 
-                       if (next_makes_face == makes_face
+                       if (!force_not_tiling
+                                       && next_makes_face == makes_face
                                        && next_p_corrected == p_corrected + translate_dir
                                        && next_face_dir_corrected == face_dir_corrected
                                        && memcmp(next_lights, lights, sizeof(lights)) == 0
@@ -1016,7 +1018,6 @@ MapBlockMesh::MapBlockMesh(MeshMakeData *data, v3s16 camera_offset):
        for (auto &m : m_mesh)
                m = new scene::SMesh();
        m_enable_shaders = data->m_use_shaders;
-       m_use_tangent_vertices = data->m_use_tangent_vertices;
        m_enable_vbo = g_settings->getBool("enable_vbo");
 
        if (data->m_client->getMinimap()) {
@@ -1075,8 +1076,8 @@ MapBlockMesh::MapBlockMesh(MeshMakeData *data, v3s16 camera_offset):
        */
 
        {
-               MapblockMeshGenerator generator(data, &collector);
-               generator.generate();
+               MapblockMeshGenerator(data, &collector,
+                       data->m_client->getSceneManager()->getMeshManipulator()).generate();
        }
 
        /*
@@ -1170,51 +1171,15 @@ MapBlockMesh::MapBlockMesh(MeshMakeData *data, v3s16 camera_offset):
 
                        scene::SMesh *mesh = (scene::SMesh *)m_mesh[layer];
 
-                       // Create meshbuffer, add to mesh
-                       if (m_use_tangent_vertices) {
-                               scene::SMeshBufferTangents *buf =
-                                               new scene::SMeshBufferTangents();
-                               buf->Material = material;
-                               buf->Vertices.reallocate(p.vertices.size());
-                               buf->Indices.reallocate(p.indices.size());
-                               for (const video::S3DVertex &v: p.vertices)
-                                       buf->Vertices.push_back(video::S3DVertexTangents(v.Pos, v.Color, v.TCoords));
-                               for (u16 i: p.indices)
-                                       buf->Indices.push_back(i);
-                               buf->recalculateBoundingBox();
-                               mesh->addMeshBuffer(buf);
-                               buf->drop();
-                       } else {
-                               scene::SMeshBuffer *buf = new scene::SMeshBuffer();
-                               buf->Material = material;
-                               buf->append(&p.vertices[0], p.vertices.size(),
-                                       &p.indices[0], p.indices.size());
-                               mesh->addMeshBuffer(buf);
-                               buf->drop();
-                       }
-               }
-
-               /*
-                       Do some stuff to the mesh
-               */
-               m_camera_offset = camera_offset;
-               translateMesh(m_mesh[layer],
-                       intToFloat(data->m_blockpos * MAP_BLOCKSIZE - camera_offset, BS));
-
-               if (m_use_tangent_vertices) {
-                       scene::IMeshManipulator* meshmanip =
-                               RenderingEngine::get_scene_manager()->getMeshManipulator();
-                       meshmanip->recalculateTangents(m_mesh[layer], true, false, false);
+                       scene::SMeshBuffer *buf = new scene::SMeshBuffer();
+                       buf->Material = material;
+                       buf->append(&p.vertices[0], p.vertices.size(),
+                               &p.indices[0], p.indices.size());
+                       mesh->addMeshBuffer(buf);
+                       buf->drop();
                }
 
                if (m_mesh[layer]) {
-#if 0
-                       // Usually 1-700 faces and 1-7 materials
-                       std::cout << "Updated MapBlock has " << fastfaces_new.size()
-                                       << " faces and uses " << m_mesh[layer]->getMeshBufferCount()
-                                       << " materials (meshbuffers)" << std::endl;
-#endif
-
                        // Use VBO for mesh (this just would set this for ever buffer)
                        if (m_enable_vbo)
                                m_mesh[layer]->setHardwareMappingHint(scene::EHM_STATIC);
@@ -1233,13 +1198,13 @@ MapBlockMesh::MapBlockMesh(MeshMakeData *data, v3s16 camera_offset):
 MapBlockMesh::~MapBlockMesh()
 {
        for (scene::IMesh *m : m_mesh) {
-               if (m_enable_vbo && m)
+               if (m_enable_vbo) {
                        for (u32 i = 0; i < m->getMeshBufferCount(); i++) {
                                scene::IMeshBuffer *buf = m->getMeshBuffer(i);
                                RenderingEngine::get_video_driver()->removeHardwareBuffer(buf);
                        }
+               }
                m->drop();
-               m = NULL;
        }
        delete m_minimap_mapblock;
 }
@@ -1333,19 +1298,6 @@ bool MapBlockMesh::animate(bool faraway, float time, int crack,
        return true;
 }
 
-void MapBlockMesh::updateCameraOffset(v3s16 camera_offset)
-{
-       if (camera_offset != m_camera_offset) {
-               for (scene::IMesh *layer : m_mesh) {
-                       translateMesh(layer,
-                               intToFloat(m_camera_offset - camera_offset, BS));
-                       if (m_enable_vbo)
-                               layer->setDirty();
-               }
-               m_camera_offset = camera_offset;
-       }
-}
-
 video::SColor encode_light(u16 light, u8 emissive_light)
 {
        // Get components