@@ -23,6 +23,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
23
23
#include " client.h"
24
24
#include " mapblock.h"
25
25
#include " map.h"
26
+ #include " util/directiontables.h"
26
27
27
28
/*
28
29
CachedMapBlockData
@@ -69,7 +70,7 @@ MeshUpdateQueue::~MeshUpdateQueue()
69
70
}
70
71
}
71
72
72
- void MeshUpdateQueue::addBlock (Map *map, v3s16 p, bool ack_block_to_server, bool urgent)
73
+ bool MeshUpdateQueue::addBlock (Map *map, v3s16 p, bool ack_block_to_server, bool urgent)
73
74
{
74
75
MutexAutoLock lock (m_mutex);
75
76
@@ -81,20 +82,15 @@ void MeshUpdateQueue::addBlock(Map *map, v3s16 p, bool ack_block_to_server, bool
81
82
*/
82
83
std::vector<CachedMapBlockData*> cached_blocks;
83
84
size_t cache_hit_counter = 0 ;
85
+ CachedMapBlockData *cached_block = cacheBlock (map, p, FORCE_UPDATE);
86
+ if (!cached_block->data )
87
+ return false ; // nothing to update
84
88
cached_blocks.reserve (3 *3 *3 );
85
- v3s16 dp;
86
- for (dp.X = -1 ; dp.X <= 1 ; dp.X ++)
87
- for (dp.Y = -1 ; dp.Y <= 1 ; dp.Y ++)
88
- for (dp.Z = -1 ; dp.Z <= 1 ; dp.Z ++) {
89
- v3s16 p1 = p + dp;
90
- CachedMapBlockData *cached_block;
91
- if (dp == v3s16 (0 , 0 , 0 ))
92
- cached_block = cacheBlock (map, p1, FORCE_UPDATE);
93
- else
94
- cached_block = cacheBlock (map, p1, SKIP_UPDATE_IF_ALREADY_CACHED,
95
- &cache_hit_counter);
96
- cached_blocks.push_back (cached_block);
97
- }
89
+ cached_blocks.push_back (cached_block);
90
+ for (v3s16 dp : g_26dirs)
91
+ cached_blocks.push_back (cacheBlock (map, p + dp,
92
+ SKIP_UPDATE_IF_ALREADY_CACHED,
93
+ &cache_hit_counter));
98
94
g_profiler->avg (" MeshUpdateQueue: MapBlocks from cache [%]" ,
99
95
100 .0f * cache_hit_counter / cached_blocks.size ());
100
96
@@ -116,7 +112,7 @@ void MeshUpdateQueue::addBlock(Map *map, v3s16 p, bool ack_block_to_server, bool
116
112
q->ack_block_to_server = true ;
117
113
q->crack_level = m_client->getCrackLevel ();
118
114
q->crack_pos = m_client->getCrackPos ();
119
- return ;
115
+ return true ;
120
116
}
121
117
}
122
118
@@ -134,6 +130,7 @@ void MeshUpdateQueue::addBlock(Map *map, v3s16 p, bool ack_block_to_server, bool
134
130
for (CachedMapBlockData *cached_block : cached_blocks) {
135
131
cached_block->refcount_from_queue ++;
136
132
}
133
+ return true ;
137
134
}
138
135
139
136
// Returned pointer must be deleted
@@ -212,10 +209,7 @@ void MeshUpdateQueue::fillDataFromMapBlockCache(QueuedMeshUpdate *q)
212
209
std::time_t t_now = std::time (0 );
213
210
214
211
// Collect data for 3*3*3 blocks from cache
215
- v3s16 dp;
216
- for (dp.X = -1 ; dp.X <= 1 ; dp.X ++)
217
- for (dp.Y = -1 ; dp.Y <= 1 ; dp.Y ++)
218
- for (dp.Z = -1 ; dp.Z <= 1 ; dp.Z ++) {
212
+ for (v3s16 dp : g_27dirs) {
219
213
v3s16 p = q->p + dp;
220
214
CachedMapBlockData *cached_block = getCachedBlock (p);
221
215
if (cached_block) {
@@ -272,10 +266,25 @@ MeshUpdateThread::MeshUpdateThread(Client *client):
272
266
}
273
267
274
268
void MeshUpdateThread::updateBlock (Map *map, v3s16 p, bool ack_block_to_server,
275
- bool urgent)
269
+ bool urgent, bool update_neighbors )
276
270
{
277
- // Allow the MeshUpdateQueue to do whatever it wants
278
- m_queue_in.addBlock (map, p, ack_block_to_server, urgent);
271
+ static thread_local const bool many_neighbors =
272
+ g_settings->getBool (" smooth_lighting" )
273
+ && !g_settings->getFlag (" performance_tradeoffs" );
274
+ if (!m_queue_in.addBlock (map, p, ack_block_to_server, urgent)) {
275
+ warningstream << " Update requested for non-existent block at ("
276
+ << p.X << " , " << p.Y << " , " << p.Z << " )" << std::endl;
277
+ return ;
278
+ }
279
+ if (update_neighbors) {
280
+ if (many_neighbors) {
281
+ for (v3s16 dp : g_26dirs)
282
+ m_queue_in.addBlock (map, p + dp, false , urgent);
283
+ } else {
284
+ for (v3s16 dp : g_6dirs)
285
+ m_queue_in.addBlock (map, p + dp, false , urgent);
286
+ }
287
+ }
279
288
deferUpdate ();
280
289
}
281
290
0 commit comments