Created
September 1, 2024 16:49
-
-
Save waldnercharles/4dc444dbde282d5073251dd1e6389192 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#define SPRITEBATCH_CHECK_BUFFER_GROW(ctx, count, capacity, data, type) \ | |
do { \ | |
if ((ctx->count) >= ctx->capacity) \ | |
{ \ | |
int new_capacity = (ctx->count) * 2; \ | |
void* new_data = SPRITEBATCH_MALLOC(sizeof(type) * new_capacity, ctx->mem_ctx); \ | |
if (!new_data) return 0; \ | |
SPRITEBATCH_MEMCPY(new_data, ctx->data, sizeof(type) * (ctx->count)); \ | |
SPRITEBATCH_FREE(ctx->data, ctx->mem_ctx); \ | |
ctx->data = (type*)new_data; \ | |
ctx->capacity = new_capacity; \ | |
} \ | |
} while (0) | |
int spritebatch_internal_fill_internal_sprite(spritebatch_t* sb, spritebatch_sprite_t *sprites, int sprites_count) | |
{ | |
SPRITEBATCH_CHECK_BUFFER_GROW(sb, input_count + sprites_count, input_capacity, input_buffer, spritebatch_internal_sprite_t); | |
spritebatch_internal_sprite_t *out = sb->input_buffer + sb->input_count; | |
for (int i = 0; i < sprites_count; i++) { | |
spritebatch_sprite_t sprite = sprites[i]; | |
SPRITEBATCH_ASSERT(sprite.w <= sb->atlas_width_in_pixels); | |
SPRITEBATCH_ASSERT(sprite.h <= sb->atlas_height_in_pixels); | |
out->image_id = sprite.image_id; | |
out->sort_bits = sprite.sort_bits; | |
out->geom = sprite.geom; | |
out->w = sprite.w; | |
out->h = sprite.h; | |
#ifdef SPRITEBATCH_SPRITE_GEOMETRY_DEFAULT | |
out->geom.sx = sprite.geom.sx + (sb->atlas_use_border_pixels ? (sprite.geom.sx / (float)sprite.w) * 2.0f : 0); | |
out->geom.sy = sprite.geom.sy + (sb->atlas_use_border_pixels ? (sprite.geom.sy / (float)sprite.h) * 2.0f : 0); | |
#endif | |
out->premade_minx = sprite.minx; | |
out->premade_miny = sprite.miny; | |
out->premade_maxx = sprite.maxx; | |
out->premade_maxy = sprite.maxy; | |
#ifdef SPRITEBATCH_SPRITE_USERDATA | |
out->udata = sprite.udata; | |
#endif | |
out++; | |
} | |
sb->input_count += sprites_count; | |
return 1; | |
} | |
void spritebatch_push(spritebatch_t* sb, spritebatch_sprite_t sprite) | |
{ | |
spritebatch_internal_fill_internal_sprite(sb, &sprite, 1); | |
} | |
void spritebatch_push_arr(spritebatch_t *sb, spritebatch_sprite_t *sprites, int sprites_count) | |
{ | |
spritebatch_internal_fill_internal_sprite(sb, sprites, sprites_count); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment