refactor some things...
This commit is contained in:
parent
3550fad638
commit
1744e689b5
25 changed files with 2396 additions and 1307 deletions
|
|
@ -5,6 +5,27 @@
|
|||
#include "pxl8_tilemap.h"
|
||||
#include "pxl8_tilesheet.h"
|
||||
|
||||
struct pxl8_tilemap_layer {
|
||||
u32 allocated_chunks;
|
||||
u32 chunk_count;
|
||||
pxl8_tile_chunk** chunks;
|
||||
u32 chunks_high;
|
||||
u32 chunks_wide;
|
||||
u8 opacity;
|
||||
bool visible;
|
||||
};
|
||||
|
||||
struct pxl8_tilemap {
|
||||
u32 active_layers;
|
||||
i32 camera_x;
|
||||
i32 camera_y;
|
||||
u32 height;
|
||||
pxl8_tilemap_layer layers[PXL8_MAX_TILE_LAYERS];
|
||||
u32 tile_size;
|
||||
pxl8_tilesheet* tilesheet;
|
||||
u32 width;
|
||||
};
|
||||
|
||||
static inline u32 pxl8_chunk_index(u32 x, u32 y, u32 chunks_wide) {
|
||||
return (y >> 4) * chunks_wide + (x >> 4);
|
||||
}
|
||||
|
|
@ -29,13 +50,14 @@ static pxl8_tile_chunk* pxl8_get_or_create_chunk(pxl8_tilemap_layer* layer, u32
|
|||
return layer->chunks[idx];
|
||||
}
|
||||
|
||||
pxl8_result pxl8_tilemap_init(pxl8_tilemap* tilemap, u32 width, u32 height, u32 tile_size) {
|
||||
if (!tilemap) return PXL8_ERROR_NULL_POINTER;
|
||||
pxl8_tilemap* pxl8_tilemap_create(u32 width, u32 height, u32 tile_size) {
|
||||
if (width > PXL8_MAX_TILEMAP_WIDTH || height > PXL8_MAX_TILEMAP_HEIGHT) {
|
||||
return PXL8_ERROR_INVALID_SIZE;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
memset(tilemap, 0, sizeof(pxl8_tilemap));
|
||||
pxl8_tilemap* tilemap = calloc(1, sizeof(pxl8_tilemap));
|
||||
if (!tilemap) return NULL;
|
||||
|
||||
tilemap->width = width;
|
||||
tilemap->height = height;
|
||||
tilemap->tile_size = tile_size ? tile_size : PXL8_TILE_SIZE;
|
||||
|
|
@ -57,14 +79,15 @@ pxl8_result pxl8_tilemap_init(pxl8_tilemap* tilemap, u32 width, u32 height, u32
|
|||
for (u32 j = 0; j < i; j++) {
|
||||
free(tilemap->layers[j].chunks);
|
||||
}
|
||||
return PXL8_ERROR_OUT_OF_MEMORY;
|
||||
free(tilemap);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
return PXL8_OK;
|
||||
return tilemap;
|
||||
}
|
||||
|
||||
void pxl8_tilemap_free(pxl8_tilemap* tilemap) {
|
||||
void pxl8_tilemap_destroy(pxl8_tilemap* tilemap) {
|
||||
if (!tilemap) return;
|
||||
|
||||
for (u32 i = 0; i < PXL8_MAX_TILE_LAYERS; i++) {
|
||||
|
|
@ -76,14 +99,14 @@ void pxl8_tilemap_free(pxl8_tilemap* tilemap) {
|
|||
}
|
||||
}
|
||||
free(layer->chunks);
|
||||
layer->chunks = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
if (tilemap->tilesheet) {
|
||||
pxl8_tilesheet_unref(tilemap->tilesheet);
|
||||
tilemap->tilesheet = NULL;
|
||||
}
|
||||
|
||||
free(tilemap);
|
||||
}
|
||||
|
||||
pxl8_result pxl8_tilemap_set_tilesheet(pxl8_tilemap* tilemap, pxl8_tilesheet* tilesheet) {
|
||||
|
|
@ -96,10 +119,11 @@ pxl8_result pxl8_tilemap_set_tilesheet(pxl8_tilemap* tilemap, pxl8_tilesheet* ti
|
|||
tilemap->tilesheet = tilesheet;
|
||||
pxl8_tilesheet_ref(tilesheet);
|
||||
|
||||
if (tilesheet->tile_size != tilemap->tile_size) {
|
||||
u32 tilesheet_size = pxl8_tilesheet_get_tile_size(tilesheet);
|
||||
if (tilesheet_size != tilemap->tile_size) {
|
||||
pxl8_warn("Tilesheet tile size (%d) differs from tilemap tile size (%d)",
|
||||
tilesheet->tile_size, tilemap->tile_size);
|
||||
tilemap->tile_size = tilesheet->tile_size;
|
||||
tilesheet_size, tilemap->tile_size);
|
||||
tilemap->tile_size = tilesheet_size;
|
||||
}
|
||||
|
||||
return PXL8_OK;
|
||||
|
|
@ -155,13 +179,13 @@ void pxl8_tilemap_set_camera(pxl8_tilemap* tilemap, i32 x, i32 y) {
|
|||
tilemap->camera_y = y;
|
||||
}
|
||||
|
||||
void pxl8_tilemap_get_view(const pxl8_tilemap* tilemap, const pxl8_gfx_ctx* gfx, pxl8_tilemap_view* view) {
|
||||
void pxl8_tilemap_get_view(const pxl8_tilemap* tilemap, const pxl8_gfx* gfx, pxl8_tilemap_view* view) {
|
||||
if (!tilemap || !gfx || !view) return;
|
||||
|
||||
view->x = -tilemap->camera_x;
|
||||
view->y = -tilemap->camera_y;
|
||||
view->width = gfx->framebuffer_width;
|
||||
view->height = gfx->framebuffer_height;
|
||||
view->width = pxl8_gfx_get_width(gfx);
|
||||
view->height = pxl8_gfx_get_height(gfx);
|
||||
|
||||
view->tile_start_x = pxl8_max(0, tilemap->camera_x / (i32)tilemap->tile_size);
|
||||
view->tile_start_y = pxl8_max(0, tilemap->camera_y / (i32)tilemap->tile_size);
|
||||
|
|
@ -171,12 +195,12 @@ void pxl8_tilemap_get_view(const pxl8_tilemap* tilemap, const pxl8_gfx_ctx* gfx,
|
|||
(tilemap->camera_y + view->height) / (i32)tilemap->tile_size + 1);
|
||||
}
|
||||
|
||||
void pxl8_tilemap_render_tile(const pxl8_tilemap* tilemap, pxl8_gfx_ctx* gfx, u16 tile_id, i32 x, i32 y, u8 flags) {
|
||||
void pxl8_tilemap_render_tile(const pxl8_tilemap* tilemap, pxl8_gfx* gfx, u16 tile_id, i32 x, i32 y, u8 flags) {
|
||||
if (!tilemap || !gfx || !tilemap->tilesheet) return;
|
||||
pxl8_tilesheet_render_tile(tilemap->tilesheet, gfx, tile_id, x, y, flags);
|
||||
}
|
||||
|
||||
void pxl8_tilemap_render_layer(const pxl8_tilemap* tilemap, pxl8_gfx_ctx* gfx, u32 layer) {
|
||||
void pxl8_tilemap_render_layer(const pxl8_tilemap* tilemap, pxl8_gfx* gfx, u32 layer) {
|
||||
if (!tilemap || !gfx || layer >= tilemap->active_layers) return;
|
||||
if (!tilemap->tilesheet) {
|
||||
pxl8_warn("No tilesheet set for tilemap");
|
||||
|
|
@ -188,8 +212,8 @@ void pxl8_tilemap_render_layer(const pxl8_tilemap* tilemap, pxl8_gfx_ctx* gfx, u
|
|||
|
||||
i32 view_left = tilemap->camera_x / tilemap->tile_size;
|
||||
i32 view_top = tilemap->camera_y / tilemap->tile_size;
|
||||
i32 view_right = (tilemap->camera_x + gfx->framebuffer_width) / tilemap->tile_size + 1;
|
||||
i32 view_bottom = (tilemap->camera_y + gfx->framebuffer_height) / tilemap->tile_size + 1;
|
||||
i32 view_right = (tilemap->camera_x + pxl8_gfx_get_width(gfx)) / tilemap->tile_size + 1;
|
||||
i32 view_bottom = (tilemap->camera_y + pxl8_gfx_get_height(gfx)) / tilemap->tile_size + 1;
|
||||
|
||||
u32 chunk_left = pxl8_max(0, view_left >> 4);
|
||||
u32 chunk_top = pxl8_max(0, view_top >> 4);
|
||||
|
|
@ -233,7 +257,7 @@ void pxl8_tilemap_render_layer(const pxl8_tilemap* tilemap, pxl8_gfx_ctx* gfx, u
|
|||
}
|
||||
}
|
||||
|
||||
void pxl8_tilemap_render(const pxl8_tilemap* tilemap, pxl8_gfx_ctx* gfx) {
|
||||
void pxl8_tilemap_render(const pxl8_tilemap* tilemap, pxl8_gfx* gfx) {
|
||||
if (!tilemap || !gfx) return;
|
||||
|
||||
for (u32 layer = 0; layer < tilemap->active_layers; layer++) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue