#define ZPL_NANO #include "zpl.h" #include "world/world.h" #include "world/blocks.h" #include "raylib.h" #include "gen/texgen.h" #include "world/world_view.h" #include "perlin.h" #define BLOCKS_COUNT (sizeof(blocks)/sizeof(block)) #define WORLD_TEXTURE_BLOCK_SCALE 0.5f ZPL_TABLE(static, blocks__chunk_tbl, blocks__chunk_tbl_, RenderTexture2D); static blocks__chunk_tbl baked_chunks; static void chunks_unload_textures(uint64_t key, RenderTexture2D *value) { (void)key; UnloadRenderTexture(*value); } typedef struct { asset_id kind; uint32_t flags; char symbol; float drag; float friction; float bounce; float velx; float vely; // NOTE(zaklaus): viewer data block_id slot; } block; #include "lists/blocks_list.c" int32_t blocks_setup(void) { for (block_id i=0; ichunk_size; RenderTexture2D canvas = LoadRenderTexture(dims, dims); BeginTextureMode(canvas); ClearBackground(WHITE); for (int y = 0; y < view->chunk_size; y += 1) { for (int x = 0; x < view->chunk_size; x += 1) { static float rots[] = { 0.0f, 90.0f, 180.f, 270.0f }; float rot = rots[(int32_t)(perlin_fbm(view->seed, x, y, 1.2f, 3) * 4.0f) % 4]; float half_block = blk_dims / 2.0f; Texture2D blk = *(Texture2D*)blocks_get_img(chunk_blocks[(y*view->chunk_size)+x]); static Rectangle src = {0, 0, WORLD_BLOCK_SIZE, WORLD_BLOCK_SIZE}; Rectangle dst = {x*blk_dims + half_block, y*blk_dims + half_block, blk_dims, blk_dims}; DrawTexturePro(blk, src, dst, (Vector2){half_block, half_block}, rot, WHITE); } } EndTextureMode(); SetTextureWrap(canvas.texture, TEXTURE_WRAP_CLAMP); blocks__chunk_tbl_set(&baked_chunks, id, canvas); } void *blocks_get_chunk_tex(uint64_t id) { return blocks__chunk_tbl_get(&baked_chunks, id); } void blocks_remove_chunk_tex(uint64_t id) { RenderTexture2D *tex = blocks__chunk_tbl_get(&baked_chunks, id); if (!tex) return; UnloadRenderTexture(*tex); blocks__chunk_tbl_remove(&baked_chunks, id); }