while (! meshgen.cancel) {
MapBlock *block;
if ((block = dequeue_callback(meshgen.queue, &set_block_ready)))
- make_block_mesh(block, client->scene);
+ make_block_mesh(block, client->map, client->scene);
else
sched_yield();
}
pthread_join(meshgen.thread, NULL);
}
-void clientmap_block_changed(MapBlock *block)
+static void schedule_update_block(MapBlock *block)
{
+ if (! block)
+ return;
+
pthread_mutex_lock(&block->mtx);
- if (block->state == MBS_MODIFIED) {
+ if (block->state != MBS_PROCESSING) {
block->state = MBS_PROCESSING;
enqueue(meshgen.queue, block);
}
pthread_mutex_unlock(&block->mtx);
}
+
+void clientmap_block_changed(MapBlock *block)
+{
+ schedule_update_block(block);
+
+ schedule_update_block(map_get_block(client->map, (v3s32) {block->pos.x + 1, block->pos.y + 0, block->pos.z + 0}, false));
+ schedule_update_block(map_get_block(client->map, (v3s32) {block->pos.x + 0, block->pos.y + 1, block->pos.z + 0}, false));
+ schedule_update_block(map_get_block(client->map, (v3s32) {block->pos.x + 0, block->pos.y + 0, block->pos.z + 1}, false));
+ schedule_update_block(map_get_block(client->map, (v3s32) {block->pos.x - 1, block->pos.y - 0, block->pos.z - 0}, false));
+ schedule_update_block(map_get_block(client->map, (v3s32) {block->pos.x - 0, block->pos.y - 1, block->pos.z - 0}, false));
+ schedule_update_block(map_get_block(client->map, (v3s32) {block->pos.x - 0, block->pos.y - 0, block->pos.z - 1}, false));
+}