/** * Copyright (c) 2025 Dominic Masters * * This software is released under the MIT License. * https://opensource.org/licenses/MIT */ #include "spritebatch.h" #include "assert/assert.h" #include "util/memory.h" meshvertex_t SPRITEBATCH_VERTICES[SPRITEBATCH_VERTEX_COUNT]; spritebatch_t SPRITEBATCH; void spriteBatchInit() { memoryZero(&SPRITEBATCH, sizeof(spritebatch_t)); meshInit( &SPRITEBATCH.mesh, MESH_PRIMITIVE_TRIANGLES, SPRITEBATCH_VERTEX_COUNT, &SPRITEBATCH_VERTICES[0] ); } void spriteBatchPush( texture_t *texture, const float_t minX, const float_t minY, const float_t maxX, const float_t maxY, const color_t color, const float_t u0, const float_t v0, const float_t u1, const float_t v1 ) { return spriteBatchPush3D( texture, (vec3){ minX, minY, 0 }, (vec3){ maxX, maxY, 0 }, color, (vec2){ u0, v0 }, (vec2){ u1, v1 } ); } void spriteBatchPush3D( texture_t *texture, const vec3 min, const vec3 max, const color_t color, const vec2 uv0, const vec2 uv1 ) { // Need to flush? if( SPRITEBATCH.currentTexture != texture || SPRITEBATCH.spriteCount >= SPRITEBATCH_SPRITES_MAX ) { spriteBatchFlush(); SPRITEBATCH.currentTexture = texture; } size_t vertexOffset = SPRITEBATCH.spriteCount * QUAD_VERTEX_COUNT; #if DOLPHIN vertexOffset += ( SPRITEBATCH.batchIndex * SPRITEBATCH_SPRITES_MAX * QUAD_VERTEX_COUNT ); #endif quadBuffer3D( &SPRITEBATCH_VERTICES[vertexOffset], min, max, color, uv0, uv1 ); SPRITEBATCH.spriteCount++; } void spriteBatchClear() { SPRITEBATCH.spriteCount = 0; SPRITEBATCH.currentTexture = NULL; } void spriteBatchFlush() { if(SPRITEBATCH.spriteCount == 0) return; textureBind(SPRITEBATCH.currentTexture); #if DOLPHIN meshDraw( &SPRITEBATCH.mesh, QUAD_VERTEX_COUNT * SPRITEBATCH.batchIndex * SPRITEBATCH_SPRITES_MAX, QUAD_VERTEX_COUNT * SPRITEBATCH.spriteCount ); SPRITEBATCH.batchIndex = ( (SPRITEBATCH.batchIndex + 1) % SPRITEBATCH_BATCH_COUNT ); #else meshDraw(&SPRITEBATCH.mesh, 0, QUAD_VERTEX_COUNT * SPRITEBATCH.spriteCount); #endif spriteBatchClear(); } void spriteBatchDispose() { meshDispose(&SPRITEBATCH.mesh); }