Luanti 5.16.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
109
111};
112
114{
115 v3s16 p = v3s16(-1338, -1338, -1338);
116 std::unique_ptr<MapBlockMesh> mesh;
118 std::vector<v3s16> ack_list;
119 bool urgent = false;
120 std::vector<MapBlock*> map_blocks;
121
122 MeshUpdateResult() = default;
123};
124
126
128{
129public:
131
132protected:
133 virtual void doUpdate();
134
135private:
139
140 // TODO: Add callback to update these when g_settings changes
142};
143
145{
146public:
148
149 // Caches the block at p and its neighbors (if needed) and queues a mesh
150 // update for the block at p
151 void updateBlock(Map *map, v3s16 p, bool ack_block_to_server, bool urgent,
152 bool update_neighbors = false);
153
154 void putResult(MeshUpdateResult &&r);
155
158
160 void clearAllQueues(bool finish = false);
161
162 void start();
163 void stop();
164 void wait();
165
166 bool isRunning();
167
168private:
170
171 void deferUpdate();
172
176
177 std::vector<std::unique_ptr<MeshUpdateWorkerThread>> m_workers;
178};
Definition client.h:107
Definition mapblock_mesh.h:176
Definition mapblock.h:58
Definition map.h:104
Definition mesh_generator_thread.h:145
MeshUpdateManager(Client *client)
Definition mesh_generator_thread.cpp:290
void deferUpdate()
Definition mesh_generator_thread.cpp:379
void clearAllQueues(bool finish=false)
Definition mesh_generator_thread.cpp:353
bool isRunning()
Definition mesh_generator_thread.cpp:403
MeshUpdateQueue m_queue_in
Definition mesh_generator_thread.h:173
void stop()
Definition mesh_generator_thread.cpp:391
ResultQueue m_queue_out_urgent
Definition mesh_generator_thread.h:175
bool getNextResult(MeshUpdateResult &r)
Definition mesh_generator_thread.cpp:338
void updateBlock(Map *map, v3s16 p, bool ack_block_to_server, bool urgent, bool update_neighbors=false)
Definition mesh_generator_thread.cpp:307
void putResult(MeshUpdateResult &&r)
Definition mesh_generator_thread.cpp:330
ResultQueue m_queue_out
Definition mesh_generator_thread.h:174
void start()
Definition mesh_generator_thread.cpp:385
std::vector< std::unique_ptr< MeshUpdateWorkerThread > > m_workers
Definition mesh_generator_thread.h:177
void wait()
Definition mesh_generator_thread.cpp:397
MutexedQueue< MeshUpdateResult > ResultQueue
Definition mesh_generator_thread.h:169
Definition mesh_generator_thread.h:60
std::unordered_set< v3s16 > m_urgents
Definition mesh_generator_thread.h:102
~MeshUpdateQueue()
Definition mesh_generator_thread.cpp:96
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:101
std::mutex m_mutex
Definition mesh_generator_thread.h:104
std::vector< QueuedMeshUpdate * > m_queue
Definition mesh_generator_thread.h:101
void done(v3s16 pos)
Definition mesh_generator_thread.cpp:198
void clear(bool finish=false)
Definition mesh_generator_thread.cpp:204
MeshUpdateQueue(Client *client)
Definition mesh_generator_thread.cpp:89
void fillDataFromMapBlocks(QueuedMeshUpdate *q)
Definition mesh_generator_thread.cpp:223
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:170
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:138
MeshUpdateQueue * m_queue_in
Definition mesh_generator_thread.h:137
Client * m_client
Definition mesh_generator_thread.h:136
int m_generation_interval
Definition mesh_generator_thread.h:141
MeshUpdateWorkerThread(Client *client, MeshUpdateQueue *queue_in, MeshUpdateManager *manager)
Definition mesh_generator_thread.cpp:248
virtual void doUpdate()
Definition mesh_generator_thread.cpp:255
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:114
std::vector< MapBlock * > map_blocks
Definition mesh_generator_thread.h:120
bool urgent
Definition mesh_generator_thread.h:119
u8 solid_sides
Definition mesh_generator_thread.h:117
MeshUpdateResult()=default
v3s16 p
Definition mesh_generator_thread.h:115
std::vector< v3s16 > ack_list
Definition mesh_generator_thread.h:118
std::unique_ptr< MapBlockMesh > mesh
Definition mesh_generator_thread.h:116
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:64