]> git.lizzy.rs Git - dragonblocks_alpha.git/blobdiff - src/blockmesh.c
Optimize MapBlock meshes
[dragonblocks_alpha.git] / src / blockmesh.c
index 7ea1368a5d8919c3edbf539cb9c3299a29430af6..d590fe06e20340f06f6462da73753e397af68ab0 100644 (file)
@@ -61,15 +61,12 @@ static v3s8 fdir[6] = {
        {+0, +1, +0},
 };
 
-#define VISIBLE(block, x, y, z) node_definitions[block->data[x][y][z].type].visible
-#define VALIDPOS(pos) (pos.x >= 0 && pos.x < 16 && pos.y >= 0 && pos.y < 16 && pos.z >= 0 && pos.z < 16)
-
-static VertexBuffer make_vertices(MapBlock *block)
+static VertexBuffer make_vertices(MapBlock *block, Map *map)
 {
        VertexBuffer buffer = vertexbuffer_create();
 
        ITERATE_MAPBLOCK {
-               if (VISIBLE(block, x, y, z)) {
+               if (node_definitions[block->data[x][y][z].type].visible) {
                        v3f offset = {x + 8.5f, y + 8.5f, z + 8.5f};
 
                        vertexbuffer_set_texture(&buffer, client_node_definitions[block->data[x][y][z].type].texture);
@@ -81,7 +78,14 @@ static VertexBuffer make_vertices(MapBlock *block)
                                        z + fdir[f].z,
                                };
 
-                               if (! VALIDPOS(npos) || ! VISIBLE(block, npos.x, npos.y, npos.z)) {
+                               Node neighbor;
+
+                               if (npos.x >= 0 && npos.x < 16 && npos.y >= 0 && npos.y < 16 && npos.z >= 0 && npos.z < 16)
+                                       neighbor = block->data[npos.x][npos.y][npos.z].type;
+                               else
+                                       neighbor = map_get_node(map, (v3s32) {npos.x + block->pos.x * 16, npos.y + block->pos.y * 16, npos.z + block->pos.z * 16}).type;
+
+                               if (neighbor != NODE_UNLOADED && ! node_definitions[neighbor].visible) {
                                        for (int v = 0; v < 6; v++) {
                                                Vertex vertex = cube_vertices[f][v];
                                                vertex.x += offset.x;
@@ -101,9 +105,9 @@ static VertexBuffer make_vertices(MapBlock *block)
 #undef GNODDEF
 #undef VALIDPOS
 
-void make_block_mesh(MapBlock *block, Scene *scene)
+void make_block_mesh(MapBlock *block, Map *map, Scene *scene)
 {
        if (block->extra)
                ((MeshObject *) block->extra)->remove = true;
-       block->extra = meshobject_create(make_vertices(block), scene, (v3f) {block->pos.x * 16.0f - 8.0f, block->pos.y * 16.0f - 8.0f, block->pos.z * 16.0f - 8.0f});
+       block->extra = meshobject_create(make_vertices(block, map), scene, (v3f) {block->pos.x * 16.0f - 8.0f, block->pos.y * 16.0f - 8.0f, block->pos.z * 16.0f - 8.0f});
 }