]> git.lizzy.rs Git - dragonblocks_alpha.git/blobdiff - src/clientmap.c
Optimize MapBlock meshes
[dragonblocks_alpha.git] / src / clientmap.c
index 8c8a62dc4e3c8dd0eb651600277ed831175bda44..dd72ec36717b4d0df5f112ebe9fbc10a67131233 100644 (file)
@@ -22,7 +22,7 @@ static void *meshgen_thread(__attribute__((unused)) void *unused)
        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();
        }
@@ -49,12 +49,27 @@ void clientmap_deinit()
                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));
+}