]> git.lizzy.rs Git - dragonblocks_alpha.git/blobdiff - src/client/blockmesh.c
Add grow animation for newly created block meshes
[dragonblocks_alpha.git] / src / client / blockmesh.c
index 26ca2bacea878275bc7d2a41debd408afcbb445b..f822092d7b71577812e4484ea139b4bcc7ef446c 100644 (file)
@@ -14,7 +14,7 @@ static v3s8 fdir[6] = {
 
 static s32 half_block_size = MAPBLOCK_SIZE / 2;
 
-static void make_vertices(Object *object, MapBlock *block)
+static void make_vertices(Object *object, MapBlock *block, bool hide_edges)
 {
        v3s32 node_bp = {block->pos.x * MAPBLOCK_SIZE, block->pos.y * MAPBLOCK_SIZE, block->pos.z * MAPBLOCK_SIZE};
 
@@ -23,7 +23,7 @@ static void make_vertices(Object *object, MapBlock *block)
                ClientNodeDefintion *def = &client_node_definitions[node->type];
 
                if (def->visibility != NV_NONE) {
-                       v3f32 offset = {x + (f32) MAPBLOCK_SIZE / 2.0f, y + (f32) MAPBLOCK_SIZE / 2.0f, z + (f32) MAPBLOCK_SIZE / 2.0f};
+                       v3f32 offset = {x - half_block_size - 0.5, y - half_block_size - 0.5, z - half_block_size - 0.5};
 
                        for (int f = 0; f < 6; f++) {
                                v3s8 npos = {
@@ -36,9 +36,11 @@ static void make_vertices(Object *object, MapBlock *block)
 
                                if (npos.x >= 0 && npos.x < MAPBLOCK_SIZE && npos.y >= 0 && npos.y < MAPBLOCK_SIZE && npos.z >= 0 && npos.z < MAPBLOCK_SIZE)
                                        neighbor = block->data[npos.x][npos.y][npos.z].type;
-                               else {
+                               else if (hide_edges) {
                                        MapNode nn = map_get_node(client_map.map, (v3s32) {npos.x + node_bp.x, npos.y + node_bp.y, npos.z + node_bp.z});
                                        neighbor = nn.type;
+                               } else {
+                                       neighbor = NODE_AIR;
                                }
 
                                if (neighbor != NODE_UNLOADED && client_node_definitions[neighbor].visibility != NV_SOLID && (def->visibility != NV_TRANSPARENT || neighbor != node->type)) {
@@ -61,23 +63,40 @@ static void make_vertices(Object *object, MapBlock *block)
        }
 }
 
+static void animate_mapblock_mesh(Object *obj, f64 dtime)
+{
+       obj->scale.x += dtime * 2.0;
+
+       if (obj->scale.x > 1.0f) {
+               obj->scale.x = 1.0f;
+               client_map_schedule_update_block_mesh(obj->extra);
+       }
+
+       obj->scale.z = obj->scale.y = obj->scale.x;
+
+       object_transform(obj);
+}
+
 void blockmesh_make(MapBlock *block)
 {
+       MapBlockExtraData *extra = block->extra;
+
        Object *obj = object_create();
 
-       obj->pos = (v3f32) {block->pos.x * MAPBLOCK_SIZE - half_block_size, block->pos.y * MAPBLOCK_SIZE - half_block_size, block->pos.z * MAPBLOCK_SIZE - half_block_size};
+       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->frustum_culling = false;
        obj->box = (aabb3f32) {{-half_block_size, -half_block_size, -half_block_size}, {half_block_size, half_block_size, half_block_size}};
+       obj->on_render = (obj->scale.x == 1.0f) ? NULL : &animate_mapblock_mesh;
+       obj->extra = block;
 
-       make_vertices(obj, block);
+       make_vertices(obj, block, obj->scale.x == 1.0f);
 
        if (! object_add_to_scene(obj)) {
                object_delete(obj);
                obj = NULL;
        }
 
-       MapBlockExtraData *extra = block->extra;
-
        if (extra->obj)
                extra->obj->remove = true;