]> git.lizzy.rs Git - dragonblocks_alpha.git/blob - src/client/blockmesh.c
3ee7422a3a1d39514955b0a787ae164841dee36e
[dragonblocks_alpha.git] / src / client / blockmesh.c
1 #include "client/blockmesh.h"
2 #include "client/client_map.h"
3 #include "client/client_node.h"
4 #include "client/cube.h"
5
6 static v3s8 fdir[6] = {
7         {+0, +0, -1},
8         {+0, +0, +1},
9         {-1, +0, +0},
10         {+1, +0, +0},
11         {+0, -1, +0},
12         {+0, +1, +0},
13 };
14
15 static void make_vertices(Object *object, MapBlock *block)
16 {
17         ITERATE_MAPBLOCK {
18                 MapNode *node = &block->data[x][y][z];
19
20                 if (node_definitions[node->type].visible) {
21                         v3f32 offset = {x + (f32) MAPBLOCK_SIZE / 2.0f, y + (f32) MAPBLOCK_SIZE / 2.0f, z + (f32) MAPBLOCK_SIZE / 2.0f};
22
23                         ClientNodeDefintion *client_def = &client_node_definitions[node->type];
24                         object_set_texture(object, client_def->texture);
25
26                         for (int f = 0; f < 6; f++) {
27                                 v3s8 npos = {
28                                         x + fdir[f].x,
29                                         y + fdir[f].y,
30                                         z + fdir[f].z,
31                                 };
32
33                                 Node neighbor;
34
35                                 if (npos.x >= 0 && npos.x < MAPBLOCK_SIZE && npos.y >= 0 && npos.y < MAPBLOCK_SIZE && npos.z >= 0 && npos.z < MAPBLOCK_SIZE)
36                                         neighbor = block->data[npos.x][npos.y][npos.z].type;
37                                 else {
38                                         MapNode nn = map_get_node(client_map.map, (v3s32) {npos.x + block->pos.x * MAPBLOCK_SIZE, npos.y + block->pos.y * MAPBLOCK_SIZE, npos.z + block->pos.z * MAPBLOCK_SIZE});
39                                         neighbor = nn.type;
40                                 }
41
42                                 if (neighbor != NODE_UNLOADED && ! node_definitions[neighbor].visible) {
43                                         for (int v = 0; v < 6; v++) {
44                                                 Vertex3D vertex = cube_vertices[f][v];
45                                                 vertex.position.x += offset.x;
46                                                 vertex.position.y += offset.y;
47                                                 vertex.position.z += offset.z;
48
49                                                 if (client_def->render)
50                                                         client_def->render(node, &vertex);
51
52                                                 object_add_vertex(object, &vertex);
53                                         }
54                                 }
55                         }
56                 }
57         }
58 }
59
60 void blockmesh_make(MapBlock *block)
61 {
62         Object *obj = object_create();
63         obj->pos = (v3f32) {block->pos.x * (f32) MAPBLOCK_SIZE - (f32) MAPBLOCK_SIZE / 2.0f, block->pos.y * (f32) MAPBLOCK_SIZE - (f32) MAPBLOCK_SIZE / 2.0f, block->pos.z * (f32) MAPBLOCK_SIZE - (f32) MAPBLOCK_SIZE / 2.0};
64
65         make_vertices(obj, block);
66
67         if (! object_add_to_scene(obj)) {
68                 object_delete(obj);
69                 obj = NULL;
70         }
71
72         MapBlockExtraData *extra = block->extra;
73
74         if (extra->obj)
75                 extra->obj->remove = true;
76
77         extra->obj = obj;
78 }