Luanti 5.17.0-dev
Loading...
Searching...
No Matches
mesh_generator_thread.h
Go to the documentation of this file.
1// Luanti
2// SPDX-License-Identifier: LGPL-2.1-or-later
3// Copyright (C) 2013, 2017 celeron55, Perttu Ahola <celeron55@gmail.com>
4
5#pragma once
6
7#include <ctime>
8#include <mutex>
9#include <unordered_set>
12#include "util/thread.h"
13#include <vector>
14#include <memory>
15
16class Map;
17class MapBlock;
18class MapBlockMesh;
19struct MeshMakeData;
20class Client;
21
23{
24 v3s16 p = v3s16(-1337, -1337, -1337);
25 std::vector<v3s16> ack_list;
26 int crack_level = -1;
28 MeshMakeData *data = nullptr; // This is generated in MeshUpdateQueue::pop()
29 std::vector<MapBlock*> map_blocks;
30 bool urgent = false;
31
32 QueuedMeshUpdate() = default;
34
41 void retrieveBlocks(Map *map, u16 cell_size);
46 void dropBlocks();
53 bool checkSkip(u16 cell_size);
54};
55
56/*
57 A thread-safe queue of mesh update tasks and a cache of MapBlock data
58*/
60{
66
67public:
69
71
81 bool addBlock(Map *map, v3s16 p, bool ack_to_server, bool urgent, bool from_neighbor);
82
83 // Returned pointer must be deleted
84 // Returns NULL if queue is empty
86
87 // Marks a position as finished, unblocking the next update
88 void done(v3s16 pos);
89
90 size_t size()
91 {
93 return m_queue.size();
94 }
95
97 void clear(bool finish = false);
98
99private:
101 std::vector<QueuedMeshUpdate *> m_queue;
102 std::unordered_set<v3s16> m_urgents;
103 std::unordered_set<v3s16> m_inflight_blocks;
104 std::mutex m_mutex;
105
106 // TODO: Add callback to update these when g_settings changes, and update all meshes
110
112};
113
115{
116 v3s16 p = v3s16(-1338, -1338, -1338);
117 std::unique_ptr<MapBlockMesh> mesh;
119 std::vector<v3s16> ack_list;
120 bool urgent = false;
121 std::vector<MapBlock*> map_blocks;
122
123 MeshUpdateResult() = default;
124};
125
127
129{
130public:
132
133protected:
134 virtual void doUpdate();
135
136private:
140
141 // TODO: Add callback to update these when g_settings changes
143};
144
146{
147public:
149
150 // Caches the block at p and its neighbors (if needed) and queues a mesh
151 // update for the block at p
152 void updateBlock(Map *map, v3s16 p, bool ack_block_to_server, bool urgent,
153 bool update_neighbors = false);
154
155 void putResult(MeshUpdateResult &&r);
156
159
161 void clearAllQueues(bool finish = false);
162
163 void start();
164 void stop();
165 void wait();
166
167 bool isRunning();
168
169private:
171
172 void deferUpdate();
173
177
178 std::vector<std::unique_ptr<MeshUpdateWorkerThread>> m_workers;
179};
Definition client.h:107
Definition mapblock_mesh.h:177
Definition mapblock.h:58
Definition map.h:104
Definition mesh_generator_thread.h:146
MeshUpdateManager(Client *client)
Definition mesh_generator_thread.cpp:292
void deferUpdate()
Definition mesh_generator_thread.cpp:381
void clearAllQueues(bool finish=false)
Definition mesh_generator_thread.cpp:355
bool isRunning()
Definition mesh_generator_thread.cpp:405
MeshUpdateQueue m_queue_in
Definition mesh_generator_thread.h:174
void stop()
Definition mesh_generator_thread.cpp:393
ResultQueue m_queue_out_urgent
Definition mesh_generator_thread.h:176
bool getNextResult(MeshUpdateResult &r)
Definition mesh_generator_thread.cpp:340
void updateBlock(Map *map, v3s16 p, bool ack_block_to_server, bool urgent, bool update_neighbors=false)
Definition mesh_generator_thread.cpp:309
void putResult(MeshUpdateResult &&r)
Definition mesh_generator_thread.cpp:332
ResultQueue m_queue_out
Definition mesh_generator_thread.h:175
void start()
Definition mesh_generator_thread.cpp:387
std::vector< std::unique_ptr< MeshUpdateWorkerThread > > m_workers
Definition mesh_generator_thread.h:178
void wait()
Definition mesh_generator_thread.cpp:399
MutexedQueue< MeshUpdateResult > ResultQueue
Definition mesh_generator_thread.h:170
Definition mesh_generator_thread.h:60
std::unordered_set< v3s16 > m_urgents
Definition mesh_generator_thread.h:102
~MeshUpdateQueue()
Definition mesh_generator_thread.cpp:97
bool addBlock(Map *map, v3s16 p, bool ack_to_server, bool urgent, bool from_neighbor)
Caches the block at p and its neighbors (if needed) and queues a mesh update for the block p.
Definition mesh_generator_thread.cpp:102
std::mutex m_mutex
Definition mesh_generator_thread.h:104
std::vector< QueuedMeshUpdate * > m_queue
Definition mesh_generator_thread.h:101
bool m_cache_enable_waving_water
Definition mesh_generator_thread.h:109
void done(v3s16 pos)
Definition mesh_generator_thread.cpp:199
void clear(bool finish=false)
Definition mesh_generator_thread.cpp:205
MeshUpdateQueue(Client *client)
Definition mesh_generator_thread.cpp:89
void fillDataFromMapBlocks(QueuedMeshUpdate *q)
Definition mesh_generator_thread.cpp:224
bool m_cache_smooth_lighting
Definition mesh_generator_thread.h:107
UpdateMode
Definition mesh_generator_thread.h:62
@ SKIP_UPDATE_IF_ALREADY_CACHED
Definition mesh_generator_thread.h:64
@ FORCE_UPDATE
Definition mesh_generator_thread.h:63
bool m_cache_enable_water_reflections
Definition mesh_generator_thread.h:108
size_t size()
Definition mesh_generator_thread.h:90
QueuedMeshUpdate * pop()
Definition mesh_generator_thread.cpp:171
std::unordered_set< v3s16 > m_inflight_blocks
Definition mesh_generator_thread.h:103
Client * m_client
Definition mesh_generator_thread.h:100
MeshUpdateManager * m_manager
Definition mesh_generator_thread.h:139
MeshUpdateQueue * m_queue_in
Definition mesh_generator_thread.h:138
Client * m_client
Definition mesh_generator_thread.h:137
int m_generation_interval
Definition mesh_generator_thread.h:142
MeshUpdateWorkerThread(Client *client, MeshUpdateQueue *queue_in, MeshUpdateManager *manager)
Definition mesh_generator_thread.cpp:250
virtual void doUpdate()
Definition mesh_generator_thread.cpp:257
Definition container.h:126
UpdateThread(const std::string &name)
Definition thread.h:177
core::vector3d< s16 > v3s16
Definition irr_v3d.h:13
std::lock_guard< std::mutex > MutexAutoLock
Definition mutex_auto_lock.h:31
Definition activeobjectmgr.cpp:11
Definition mapblock_mesh.h:34
Definition mesh_generator_thread.h:115
std::vector< MapBlock * > map_blocks
Definition mesh_generator_thread.h:121
bool urgent
Definition mesh_generator_thread.h:120
u8 solid_sides
Definition mesh_generator_thread.h:118
MeshUpdateResult()=default
v3s16 p
Definition mesh_generator_thread.h:116
std::vector< v3s16 > ack_list
Definition mesh_generator_thread.h:119
std::unique_ptr< MapBlockMesh > mesh
Definition mesh_generator_thread.h:117
Definition mesh_generator_thread.h:23
void dropBlocks()
Drop block references.
Definition mesh_generator_thread.cpp:63
QueuedMeshUpdate()=default
void retrieveBlocks(Map *map, u16 cell_size)
Get blocks needed for this mesh update from the map.
Definition mesh_generator_thread.cpp:24
~QueuedMeshUpdate()
Definition mesh_generator_thread.cpp:19
int crack_level
Definition mesh_generator_thread.h:26
v3s16 p
Definition mesh_generator_thread.h:24
std::vector< MapBlock * > map_blocks
Definition mesh_generator_thread.h:29
MeshMakeData * data
Definition mesh_generator_thread.h:28
std::vector< v3s16 > ack_list
Definition mesh_generator_thread.h:25
bool urgent
Definition mesh_generator_thread.h:30
v3s16 crack_pos
Definition mesh_generator_thread.h:27
bool checkSkip(u16 cell_size)
Check if the blocks that would comprise the mesh are all air, so the update can be skipped entirely.
Definition mesh_generator_thread.cpp:49
static std::string p(std::string path)
Definition test_filesys.cpp:66