Skip to content

Instantly share code, notes, and snippets.

@waldnercharles
Created September 1, 2024 16:49
Show Gist options
  • Save waldnercharles/4dc444dbde282d5073251dd1e6389192 to your computer and use it in GitHub Desktop.
Save waldnercharles/4dc444dbde282d5073251dd1e6389192 to your computer and use it in GitHub Desktop.
#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