]> git.lizzy.rs Git - dragonblocks_alpha.git/commitdiff
Redesign MapBlock deserialisation
authorElias Fleckenstein <eliasfleckenstein@web.de>
Sun, 28 Mar 2021 08:31:06 +0000 (10:31 +0200)
committerElias Fleckenstein <eliasfleckenstein@web.de>
Sun, 28 Mar 2021 08:31:06 +0000 (10:31 +0200)
src/clientcommands.c
src/map.c
src/map.h

index 4f68ffdf2754280bc4542b679133e39f54fb9dc4..5b99d34a8b0e7f0601216ff4f16b1eefa478de16 100644 (file)
@@ -33,19 +33,7 @@ static bool auth_handler(Client *client, bool good)
 
 static bool block_handler(Client *client, bool good)
 {
-       MapBlock *block = map_deserialize_block(client->fd);
-
-       if (! block)
-               return false;
-
-       if (good) {
-               //mapblock_meshgen_enqueue(client->mapblock_meshgen, block->pos);
-               map_add_block(client->map, block);
-       } else {
-               map_free_block(block);
-       }
-
-       return true;
+       return map_deserialize_block(client->fd, client->map, ! good);
 }
 
 CommandHandler command_handlers[CLIENT_COMMAND_COUNT] = {
index 08ee6a8a9bb1a5e1e4cdc8bb952bb77741c3596d..b0df6f3b2172bc31264590f8bdfaa59aa063721b 100644 (file)
--- a/src/map.c
+++ b/src/map.c
@@ -27,14 +27,14 @@ static MapBlock *allocate_block(v3s32 pos)
        return block;
 }
 
-static MapBlock **get_block_ptr(MapSector *sector, size_t idx)
+static MapBlock *get_block(MapSector *sector, size_t idx)
 {
-       return (MapBlock **) sector->blocks.ptr + idx;
+       return ((MapBlock **) sector->blocks.ptr)[idx];
 }
 
-static MapSector **get_sector_ptr(Map *map, size_t idx)
+static MapSector *get_sector(Map *map, size_t idx)
 {
-       return (MapSector **) map->sectors.ptr + idx;
+       return ((MapSector **) map->sectors.ptr)[idx];
 }
 
 Map *map_create()
@@ -48,9 +48,9 @@ Map *map_create()
 void map_delete(Map *map)
 {
        for (size_t s = 0; s < map->sectors.siz; s++) {
-               MapSector *sector = *get_sector_ptr(map, s);
+               MapSector *sector = get_sector(map, s);
                for (size_t b = 0; b < sector->blocks.siz; b++)
-                       map_free_block(*get_block_ptr(sector, b));
+                       map_free_block(get_block(sector, b));
                if (sector->blocks.ptr)
                        free(sector->blocks.ptr);
                free(sector);
@@ -66,7 +66,7 @@ MapSector *map_get_sector(Map *map, v2s32 pos, bool create)
        ArraySearchResult res = array_search(&map->sectors, &hash);
 
        if (res.success)
-               return *get_sector_ptr(map, res.index);
+               return get_sector(map, res.index);
        if (! create)
                return NULL;
 
@@ -92,14 +92,13 @@ MapBlock *map_get_block(Map *map, v3s32 pos, bool create)
        MapBlock *block = NULL;
 
        if (res.success) {
-               block = *get_block_ptr(sector, res.index);
+               block = get_block(sector, res.index);
        } else if (create) {
                block = allocate_block(pos);
+               array_insert(&sector->blocks, &block, res.index);
 
                if (map->on_block_create)
                        map->on_block_create(block);
-
-               array_insert(&sector->blocks, &block, res.index);
        } else {
                return NULL;
        }
@@ -107,33 +106,9 @@ MapBlock *map_get_block(Map *map, v3s32 pos, bool create)
        return block->ready ? block : NULL;
 }
 
-void map_add_block(Map *map, MapBlock *block)
-{
-       MapSector *sector = map_get_sector(map, (v2s32) {block->pos.x, block->pos.z}, true);
-       ArraySearchResult res = array_search(&sector->blocks, &block->pos.y);
-       block->ready = true;
-       if (res.success) {
-               MapBlock **ptr = get_block_ptr(sector, res.index);
-               map_free_block(*ptr);
-               *ptr = block;
-       } else {
-               array_insert(&sector->blocks, &block, res.index);
-       }
-       if (map->on_block_add)
-               map->on_block_add(block);
-}
-
-void map_clear_block(MapBlock *block, v3u8 init_state)
-{
-       for (u8 x = 0; x <= init_state.x; x++)
-               for (u8 y = 0; y <= init_state.y; y++)
-                       for (u8 z = 0; z <= init_state.z; z++)
-                               map_node_clear(&block->data[x][y][z]);
-}
-
 void map_free_block(MapBlock *block)
 {
-       map_clear_block(block, (v3u8) {15, 15, 15});
+       ITERATE_MAPBLOCK map_node_clear(&block->data[x][y][z]);
        free(block);
 }
 
@@ -165,32 +140,50 @@ bool map_serialize_block(int fd, MapBlock *block)
        return true;
 }
 
-MapBlock *map_deserialize_block(int fd)
+bool map_deserialize_block(int fd, Map *map, bool dummy)
 {
        v3s32 pos;
 
        if (! read_v3s32(fd, &pos))
-               return NULL;
+               return false;
 
-       MapBlock *block = allocate_block(pos);
+       MapSector *sector = map_get_sector(map, (v2s32) {pos.x, pos.z}, true);
+       ArraySearchResult res = array_search(&sector->blocks, &pos.y);
+
+       MapBlock *block;
+
+       if (dummy) {
+               block = allocate_block(pos);
+       } else if (res.success) {
+               block = get_block(sector, res.index);
+       } else {
+               block = allocate_block(pos);
+               array_insert(&sector->blocks, &block, res.index);
+       }
 
        ITERATE_MAPBLOCK {
-               if (! map_deserialize_node(fd, &block->data[x][y][z])) {
-                       map_clear_block(block, (v3u8) {x, y, z});
-                       free(block);
-                       return NULL;
-               }
+               if (! map_deserialize_node(fd, &block->data[x][y][z]))
+                       return false;
        }
 
-       return block;
+       if (dummy) {
+               map_free_block(block);
+       } else {
+               block->ready = true;
+
+               if (map->on_block_add)
+                       map->on_block_add(block);
+       }
+
+       return true;
 }
 
 bool map_serialize(int fd, Map *map)
 {
        for (size_t s = 0; s < map->sectors.siz; s++) {
-               MapSector *sector = *get_sector_ptr(map, s);
+               MapSector *sector = get_sector(map, s);
                for (size_t b = 0; b < sector->blocks.siz; b++)
-                       if (! map_serialize_block(fd, *get_block_ptr(sector, b)))
+                       if (! map_serialize_block(fd, get_block(sector, b)))
                                return false;
        }
        return true;
@@ -198,10 +191,8 @@ bool map_serialize(int fd, Map *map)
 
 void map_deserialize(int fd, Map *map)
 {
-       MapBlock *block;
-
-       while ((block = map_deserialize_block(fd)) != NULL)
-               map_add_block(map, block);
+       while (map_deserialize_block(fd, map, false))
+               ;
 }
 
 v3s32 map_node_to_block_pos(v3s32 pos, v3u8 *offset)
index c604141fcdabcfe900aa891c252aa5fb4fedd2b2..d610d5c131bf50490b3fe869b3505d21d5c5c14b 100644 (file)
--- a/src/map.h
+++ b/src/map.h
@@ -46,13 +46,11 @@ void map_delete(Map *map);
 MapSector *map_get_sector(Map *map, v2s32 pos, bool create);
 MapBlock *map_get_block(Map *map, v3s32 pos, bool create);
 
-void map_clear_block(MapBlock *block, v3u8 init_state);
 void map_free_block(MapBlock *block);
-void map_add_block(Map *map, MapBlock *block);
 
 bool map_deserialize_node(int fd, MapNode *buf);
 bool map_serialize_block(int fd, MapBlock *block);
-MapBlock *map_deserialize_block(int fd);
+bool map_deserialize_block(int fd, Map *map, bool dummy);
 bool map_serialize(int fd, Map *map);
 void map_deserialize(int fd, Map *map);