97 lines
2.0 KiB
C
97 lines
2.0 KiB
C
/**
|
|
* 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"
|
|
#include "console/console.h"
|
|
|
|
spritebatch_t SPRITEBATCH;
|
|
|
|
void spriteBatchInit() {
|
|
SPRITEBATCH.spriteCount = 0;
|
|
SPRITEBATCH.currentTexture = NULL;
|
|
|
|
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
|
|
) {
|
|
// Need to flush?
|
|
if(
|
|
SPRITEBATCH.currentTexture != texture ||
|
|
SPRITEBATCH.spriteCount >= SPRITEBATCH_SPRITES_MAX
|
|
) {
|
|
spriteBatchFlush();
|
|
SPRITEBATCH.currentTexture = texture;
|
|
}
|
|
|
|
quadBuffer(
|
|
&SPRITEBATCH.vertices[SPRITEBATCH.spriteCount * QUAD_VERTEX_COUNT],
|
|
minX, minY, maxX, maxY,
|
|
color,
|
|
u0, v0, u1, v1
|
|
);
|
|
|
|
SPRITEBATCH.spriteCount++;
|
|
}
|
|
|
|
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;
|
|
}
|
|
|
|
quadBuffer3D(
|
|
&SPRITEBATCH.vertices[SPRITEBATCH.spriteCount * QUAD_VERTEX_COUNT],
|
|
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);
|
|
meshDraw(&SPRITEBATCH.mesh, 0, QUAD_VERTEX_COUNT * SPRITEBATCH.spriteCount);
|
|
spriteBatchClear();
|
|
}
|
|
|
|
void spriteBatchDispose() {
|
|
meshDispose(&SPRITEBATCH.mesh);
|
|
} |