]> git.lizzy.rs Git - dragonblocks_alpha.git/commitdiff
Bulk MapBlock (de-)serialisation
authorElias Fleckenstein <eliasfleckenstein@web.de>
Mon, 29 Mar 2021 19:09:10 +0000 (21:09 +0200)
committerElias Fleckenstein <eliasfleckenstein@web.de>
Mon, 29 Mar 2021 19:09:10 +0000 (21:09 +0200)
src/Makefile
src/map.c
src/map.h
src/servermap.c

index e0bc214e7d097defaeed341d0982013ee48d8ac6..13da2d5ea6e5cdf623bf6ebd6d8da9e2e2df2d8e 100644 (file)
@@ -2,7 +2,6 @@ COMMON = array.o list.o map.o signal.o util.o types.o node.o
 SERVER = $(COMMON) server.o servercommands.o servermap.o
 CLIENT = $(COMMON) client.o clientcommands.o clientmap.o mesh.o scene.o shaders.o
 LIBRARIES = -lpthread -lm
-CLIENT_LIBRARIES = -lGL -lGLEW -lglfw
 FLAGS = -g -fmax-errors=4
 
 ifdef RELEASE
@@ -12,13 +11,13 @@ endif
 all: Dragonblocks DragonblocksServer
 
 Dragonblocks: $(CLIENT)
-       cc $(FLAGS) -o Dragonblocks $(CLIENT) $(LIBRARIES) $(CLIENT_LIBRARIES)
+       cc $(FLAGS) -o Dragonblocks $(CLIENT) $(LIBRARIES) -lGL -lGLEW -lglfw
 
 DragonblocksServer: $(SERVER)
        cc $(FLAGS) -o DragonblocksServer $(SERVER) $(LIBRARIES)
 
 %.o: %.c
-       cc $(FLAGS) -o $@ -c -Wall -Wextra -Wpedantic -Werror -isystem ../deps $<
+       cc $(FLAGS) -Wall -Wextra -Wpedantic -Werror -isystem ../deps -c -o $@ $<
 
 clean:
        rm -rf *.o
index 840b6ac955fce0a301a512f31c6713cce2b46741..e40fe62bc0eb9df95c151da722551b7741773de0 100644 (file)
--- a/src/map.c
+++ b/src/map.c
@@ -1,5 +1,7 @@
 #include <stdlib.h>
 #include <stdbool.h>
+#include <unistd.h>
+#include <stdio.h>
 #include <math.h>
 #include "map.h"
 #include "util.h"
@@ -106,7 +108,7 @@ MapBlock *map_get_block(Map *map, v3s32 pos, bool create)
 
 void map_free_block(MapBlock *block)
 {
-       ITERATE_MAPBLOCK map_node_clear(&block->data[x][y][z]);
+       ITERATE_MAPBLOCK list_clear(&block->metadata[x][y][z]);
        pthread_mutex_destroy(&block->mtx);
        free(block);
 }
@@ -131,12 +133,12 @@ bool map_serialize_block(int fd, MapBlock *block)
        if (! write_v3s32(fd, block->pos))
                return false;
 
-       ITERATE_MAPBLOCK {
-               if (! write_u32(fd, block->data[x][y][z].type))
-                       return false;
-       }
+       if (write(fd, block->data, sizeof(block->data)) == -1)
+               perror("write");
+       else
+               return true;
 
-       return true;
+       return false;
 }
 
 bool map_deserialize_block(int fd, Map *map, MapBlock **blockptr, bool dummy)
@@ -160,20 +162,34 @@ bool map_deserialize_block(int fd, Map *map, MapBlock **blockptr, bool dummy)
                array_insert(&sector->blocks, &block, res.index);
        }
 
-       ITERATE_MAPBLOCK {
-               if (! map_deserialize_node(fd, &block->data[x][y][z])) {
-                       if (dummy)
-                               map_free_block(block);
-                       return false;
+       bool ret = true;
+       size_t n_read_total = 0;
+       int n_read;
+
+       while (n_read_total < sizeof(block->data)) {
+               if ((n_read = read(fd, (char *) block->data + n_read_total, sizeof(block->data) - n_read_total)) == -1) {
+                       perror("read");
+                       ret = false;
+                       break;
                }
+
+               n_read_total += n_read;
+       }
+
+       ITERATE_MAPBLOCK {
+               if (block->data[x][y][z].type >= NODE_UNLOADED)
+                       block->data[x][y][z].type = NODE_INVALID;
+               block->metadata[x][y][z] = list_create(&list_compare_string);
        }
 
+       // ToDo: Deserialize meta
+
        if (dummy)
                map_free_block(block);
        else if (blockptr)
                *blockptr = block;
 
-       return true;
+       return ret;
 }
 
 bool map_serialize(int fd, Map *map)
@@ -215,9 +231,8 @@ void map_set_node(Map *map, v3s32 pos, MapNode node)
        v3u8 offset;
        MapBlock *block = map_get_block(map, map_node_to_block_pos(pos, &offset), false);
        if (block) {
-               MapNode *current_node = &block->data[offset.x][offset.y][offset.z];
-               map_node_clear(current_node);
-               *current_node = node;
+               list_clear(&block->metadata[offset.x][offset.y][offset.z]);
+               block->data[offset.x][offset.y][offset.z] = node;
 
                block->state = MBS_MODIFIED;
        }
@@ -225,10 +240,5 @@ void map_set_node(Map *map, v3s32 pos, MapNode node)
 
 MapNode map_node_create(Node type)
 {
-       return (MapNode) {type, list_create(&list_compare_string)};
-}
-
-void map_node_clear(MapNode *node)
-{
-       list_clear(&node->meta);
+       return (MapNode) {type};
 }
index f659e2f062550bc60639b84fa98d48e47479a14a..c8b92663509d53cfde2f19d2b3ec71d59fa8df2d 100644 (file)
--- a/src/map.h
+++ b/src/map.h
@@ -13,7 +13,7 @@
 typedef struct
 {
        Node type;
-       List meta;
+       // here will be a NodeState (union)
 } MapNode;
 
 typedef enum
@@ -27,6 +27,7 @@ typedef enum
 typedef struct
 {
        MapNode data[16][16][16];
+       List metadata[16][16][16];
        v3s32 pos;
        MapBlockState state;
        pthread_mutex_t mtx;
index 3a93885eb50ee1e019c294be8c91dade98580ae4..dac8a39912788bfa941a0e573d6703b1d8cd8b23 100644 (file)
@@ -29,6 +29,7 @@ static void generate_block(MapBlock *block)
                                else
                                        type = NODE_STONE;
                                block->data[x][y][z] = map_node_create(type);
+                               block->metadata[x][y][z] = list_create(&list_compare_string);
                        }
                }
        }