]> git.lizzy.rs Git - dragonblocks_alpha.git/commitdiff
Update meshgen threads to use queue waiting
authorElias Fleckenstein <eliasfleckenstein@web.de>
Sun, 13 Feb 2022 16:32:16 +0000 (17:32 +0100)
committerElias Fleckenstein <eliasfleckenstein@web.de>
Sun, 13 Feb 2022 16:32:16 +0000 (17:32 +0100)
deps/dragonstd
src/client/blockmesh.c
src/client/client_map.c
src/client/client_map.h
src/server/server.c

index 4e1758fbf2261950df0d323460e7fbf35d402dd5..04c93844e4e4185d91950f0f5473bc88a84b5461 160000 (submodule)
@@ -1 +1 @@
-Subproject commit 4e1758fbf2261950df0d323460e7fbf35d402dd5
+Subproject commit 04c93844e4e4185d91950f0f5473bc88a84b5461
index 59b60c2aa47ebc9bc6ca5ee4d6166ea65ee6bff7..8af015131a0aecc37ad8993c297a8de96859ce37 100644 (file)
@@ -102,7 +102,7 @@ void blockmesh_make(MapBlock *block)
        Object *obj = object_create();
 
        obj->pos = (v3f32) {block->pos.x * MAPBLOCK_SIZE + half_block_size + 0.5f, block->pos.y * MAPBLOCK_SIZE + half_block_size + 0.5f, block->pos.z * MAPBLOCK_SIZE + half_block_size + 0.5f};
-       obj->scale = extra->obj ? extra->obj->scale : (v3f32) {0.1f, 0.1f, 0.1f};
+       obj->scale = (v3f32) {0.1f, 0.1f, 0.1f};
        obj->frustum_culling = true;
        obj->box = (aabb3f32) {{-half_block_size - 1.0f, -half_block_size - 1.0f, -half_block_size - 1.0f}, {half_block_size + 1.0f, half_block_size + 1.0f, half_block_size + 1.0f}};
        obj->on_render = (obj->scale.x == 1.0f) ? NULL : &animate_mapblock_mesh;
@@ -115,8 +115,14 @@ void blockmesh_make(MapBlock *block)
                obj = NULL;
        }
 
-       if (extra->obj)
+       pthread_mutex_lock(&block->mtx);
+       if (extra->obj) {
                extra->obj->remove = true;
 
+               obj->scale = extra->obj->scale;
+               object_transform(obj);
+       }
+
        extra->obj = obj;
+       pthread_mutex_unlock(&block->mtx);
 }
index 23952a1364569a52eb912b7ddad5212629a3c382..12a7a94638cf38cdd7eb2c3743651375fc1744a2 100644 (file)
@@ -13,10 +13,8 @@ struct ClientMap client_map;
 // meshgen functions
 
 // dequeue callback to thread-safely update
-static void set_dequeued(void *arg)
+static void set_dequeued(MapBlock *block)
 {
-       MapBlock *block = arg;
-
        pthread_mutex_lock(&block->mtx);
        ((MapBlockExtraData *) block->extra)->queue = false;
        pthread_mutex_unlock(&block->mtx);
@@ -25,12 +23,10 @@ static void set_dequeued(void *arg)
 // mesh generator step
 static void meshgen_step()
 {
-       MapBlock *block;
+       MapBlock *block = queue_dequeue_callback(client_map.queue, (void *) &set_dequeued);
 
-       if ((block = queue_dequeue_callback(client_map.queue, &set_dequeued)))
+       if (block)
                blockmesh_make(block);
-       else
-               sched_yield();
 }
 
 // pthread start routine for meshgen thread
@@ -193,6 +189,7 @@ void client_map_start()
 void client_map_stop()
 {
        client_map.cancel = true;
+       queue_cancel(client_map.queue);
 
        for (int i = 0; i < NUM_MESHGEN_THREADS; i++)
                if (client_map.meshgen_threads[i])
index b9e06168531385c4c6f5bc7ebb65c742f5bd5f42..34998b5a8172299bbeb4c0d20d5e926aae63cdb1 100644 (file)
@@ -27,7 +27,7 @@ extern struct ClientMap
 {
        Map *map;                                       // map object
        Queue *queue;                                   // MapBlock * queue (thread safe)
-       bool cancel;                                    // used to notify meshgen and sync thread about quit
+       atomic_bool cancel;                             // used to notify meshgen and sync thread about quit
        pthread_t meshgen_threads[NUM_MESHGEN_THREADS]; // consumer threads for meshgen queue
        pthread_t sync_thread;                          // this thread requests new / changed blocks from server
        u32 simulation_distance;                        // simulation distance sent by server
index 37974fb5ba453a3a2d102310c3ad8769f8a90b74..22308dea7964a62d134a641cbbde0be3e3ae991f 100644 (file)
@@ -70,9 +70,9 @@ int main(int argc, char **argv)
        server->on_recv_type[DRAGONNET_TYPE_ToServerRequestBlock] = (void *) &on_ToServerRequestBlock;
 
        interrupt_init();
-       server_player_init();
        database_init();
        server_map_init();
+       server_player_init();
 
        server_map_prepare_spawn();
        dragonnet_listener_run(server);
@@ -82,9 +82,9 @@ int main(int argc, char **argv)
        printf("Shutting down\n");
        dragonnet_listener_close(server);
 
+       server_player_deinit();
        server_map_deinit();
        database_deinit();
-       server_player_deinit();
        interrupt_deinit();
 
        dragonnet_listener_delete(server);