Luanti 5.15.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
96private:
98 std::vector<QueuedMeshUpdate *> m_queue;
99 std::unordered_set<v3s16> m_urgents;
100 std::unordered_set<v3s16> m_inflight_blocks;
101 std::mutex m_mutex;
102
103 // TODO: Add callback to update these when g_settings changes, and update all meshes
106
108};
109
111{
112 v3s16 p = v3s16(-1338, -1338, -1338);
113 MapBlockMesh *mesh = nullptr;
115 std::vector<v3s16> ack_list;
116 bool urgent = false;
117 std::vector<MapBlock*> map_blocks;
118
119 MeshUpdateResult() = default;
120};
121
123
125{
126public:
128
129protected:
130 virtual void doUpdate();
131
132private:
136
137 // TODO: Add callback to update these when g_settings changes
139};
140
142{
143public:
145
146 // Caches the block at p and its neighbors (if needed) and queues a mesh
147 // update for the block at p
148 void updateBlock(Map *map, v3s16 p, bool ack_block_to_server, bool urgent,
149 bool update_neighbors = false);
150 void putResult(const MeshUpdateResult &r);
153
154
155 void start();
156 void stop();
157 void wait();
158
159 bool isRunning();
160
161private:
162 void deferUpdate();
163
164
168
169 std::vector<std::unique_ptr<MeshUpdateWorkerThread>> m_workers;
170};
Definition client.h:106
Definition mapblock_mesh.h:176
Definition mapblock.h:58
Definition map.h:100
Definition mesh_generator_thread.h:142
MeshUpdateManager(Client *client)
Definition mesh_generator_thread.cpp:276
void deferUpdate()
Definition mesh_generator_thread.cpp:339
void putResult(const MeshUpdateResult &r)
Definition mesh_generator_thread.cpp:316
bool isRunning()
Definition mesh_generator_thread.cpp:363
MeshUpdateQueue m_queue_in
Definition mesh_generator_thread.h:165
void stop()
Definition mesh_generator_thread.cpp:351
bool getNextResult(MeshUpdateResult &r)
Definition mesh_generator_thread.cpp:324
void updateBlock(Map *map, v3s16 p, bool ack_block_to_server, bool urgent, bool update_neighbors=false)
Definition mesh_generator_thread.cpp:293
MutexedQueue< MeshUpdateResult > m_queue_out_urgent
Definition mesh_generator_thread.h:167
void start()
Definition mesh_generator_thread.cpp:345
std::vector< std::unique_ptr< MeshUpdateWorkerThread > > m_workers
Definition mesh_generator_thread.h:169
MutexedQueue< MeshUpdateResult > m_queue_out
Definition mesh_generator_thread.h:166
void wait()
Definition mesh_generator_thread.cpp:357
Definition mesh_generator_thread.h:60
std::unordered_set< v3s16 > m_urgents
Definition mesh_generator_thread.h:99
~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:106
std::mutex m_mutex
Definition mesh_generator_thread.h:101
std::vector< QueuedMeshUpdate * > m_queue
Definition mesh_generator_thread.h:98
void done(v3s16 pos)
Definition mesh_generator_thread.cpp:203
MeshUpdateQueue(Client *client)
Definition mesh_generator_thread.cpp:89
void fillDataFromMapBlocks(QueuedMeshUpdate *q)
Definition mesh_generator_thread.cpp:210
bool m_cache_smooth_lighting
Definition mesh_generator_thread.h:104
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:105
size_t size()
Definition mesh_generator_thread.h:90
QueuedMeshUpdate * pop()
Definition mesh_generator_thread.cpp:175
std::unordered_set< v3s16 > m_inflight_blocks
Definition mesh_generator_thread.h:100
Client * m_client
Definition mesh_generator_thread.h:97
Definition mesh_generator_thread.h:125
MeshUpdateManager * m_manager
Definition mesh_generator_thread.h:135
MeshUpdateQueue * m_queue_in
Definition mesh_generator_thread.h:134
Client * m_client
Definition mesh_generator_thread.h:133
int m_generation_interval
Definition mesh_generator_thread.h:138
MeshUpdateWorkerThread(Client *client, MeshUpdateQueue *queue_in, MeshUpdateManager *manager)
Definition mesh_generator_thread.cpp:234
virtual void doUpdate()
Definition mesh_generator_thread.cpp:241
Definition container.h:126
Definition thread.h:175
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:111
std::vector< MapBlock * > map_blocks
Definition mesh_generator_thread.h:117
bool urgent
Definition mesh_generator_thread.h:116
u8 solid_sides
Definition mesh_generator_thread.h:114
MeshUpdateResult()=default
v3s16 p
Definition mesh_generator_thread.h:112
std::vector< v3s16 > ack_list
Definition mesh_generator_thread.h:115
MapBlockMesh * mesh
Definition mesh_generator_thread.h:113
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