#define ZPL_NANO #include "zpl.h" #include "world/world.h" #include "world/blocks.h" #include "raylib.h" #include "gen/texgen.h" #include "world_view.h" #define BLOCKS_COUNT (sizeof(blocks)/sizeof(block)) ZPL_TABLE(static, blocks__chunk_tbl, blocks__chunk_tbl_, Texture2D); static blocks__chunk_tbl baked_chunks; static void chunks_unload_textures(uint64_t key, Texture2D *value) { (void)key; UnloadTexture(*value); } typedef struct { char *name; uint32_t flags; uint32_t kind; uint32_t biome; char symbol; // NOTE(zaklaus): viewer data Image img; } block; #include "blocks_list.c" int32_t blocks_setup(void) { for (uint32_t i=0; iimg = texgen_build_block(b->biome, b->kind); } blocks__chunk_tbl_init(&baked_chunks, zpl_heap()); return 0; } void blocks_destroy(void) { for (uint32_t i=0; ichunk_size; Image canvas = GenImageColor(dims, dims, RAYWHITE); for (int y = 0; y < view->chunk_size; y += 1) { for (int x = 0; x < view->chunk_size; x += 1) { Image blk = blocks[chunk_blocks[(y*view->chunk_size)+x]].img; Rectangle src = {0, 0, WORLD_BLOCK_SIZE, WORLD_BLOCK_SIZE}; Rectangle dst = {x*WORLD_BLOCK_SIZE, y*WORLD_BLOCK_SIZE, WORLD_BLOCK_SIZE, WORLD_BLOCK_SIZE}; ImageDraw(&canvas, blk, src, dst, WHITE); } } Texture2D tex = LoadTextureFromImage(canvas); UnloadImage(canvas); blocks__chunk_tbl_set(&baked_chunks, id, tex); } void *blocks_get_chunk_tex(uint64_t id) { return blocks__chunk_tbl_get(&baked_chunks, id); } void blocks_remove_chunk_tex(uint64_t id) { UnloadTexture(*blocks__chunk_tbl_get(&baked_chunks, id)); blocks__chunk_tbl_remove(&baked_chunks, id); }