-Subproject commit 4e1758fbf2261950df0d323460e7fbf35d402dd5
+Subproject commit 04c93844e4e4185d91950f0f5473bc88a84b5461
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;
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);
}
// 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);
// 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
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])
{
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
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);
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);