use static, fixed arrays for circle geometry data instead of allocating for each one
This commit is contained in:
parent
ffab6a3924
commit
f7f27119e1
@ -20,9 +20,9 @@ static void title_tick(State *state) {
|
||||
((float)ctx.resolution.x / 2) - ((float)320 / 2), 64, 320, 128 }));
|
||||
|
||||
/* draw the tick count as an example of dynamic text */
|
||||
size_t text_str_len = snprintf(NULL, 0, "%lu", state->ctx->frame_number) + 1;
|
||||
size_t text_str_len = snprintf(NULL, 0, "%llu", state->ctx->frame_number) + 1;
|
||||
char *text_str = cmalloc(text_str_len);
|
||||
snprintf(text_str, text_str_len, "%lu", state->ctx->frame_number);
|
||||
snprintf(text_str, text_str_len, "%llu", state->ctx->frame_number);
|
||||
|
||||
const char *font = "/fonts/kenney-pixel.ttf";
|
||||
int text_h = 32;
|
||||
@ -39,7 +39,6 @@ static void title_tick(State *state) {
|
||||
);
|
||||
|
||||
draw_text(text_str, (Vec2){ 0, 0 }, text_h, (Color) { 255, 255, 255, 255 }, font);
|
||||
|
||||
free(text_str);
|
||||
}
|
||||
|
||||
|
@ -22,6 +22,7 @@ TWN_API void draw_sprite(char const *path,
|
||||
TWN_API void draw_rectangle(Rect rect, Color color);
|
||||
|
||||
/* pushes a filled circle onto the circle render queue */
|
||||
/* note that its edges may look jagged with a radius larger than 2048 */
|
||||
TWN_API void draw_circle(Vec2 position, float radius, Color color);
|
||||
|
||||
/* TODO: have font optional, with something minimal coming embedded */
|
||||
|
@ -22,18 +22,14 @@ void draw_circle(Vec2 position, float radius, Color color) {
|
||||
arrput(ctx.render_queue_2d, primitive);
|
||||
}
|
||||
|
||||
/* TODO: caching and reuse scheme */
|
||||
/* vertices_out and indices_out MUST BE FREED */
|
||||
|
||||
void create_circle_geometry(Vec2 position,
|
||||
Color color,
|
||||
float radius,
|
||||
size_t num_vertices,
|
||||
SDL_Vertex **vertices_out,
|
||||
int **indices_out)
|
||||
SDL_Vertex vertices[],
|
||||
int indices[])
|
||||
{
|
||||
SDL_Vertex *vertices = cmalloc(sizeof *vertices * (num_vertices + 1));
|
||||
int *indices = cmalloc(sizeof *indices * (num_vertices * 3));
|
||||
|
||||
/* the angle (in radians) to rotate by on each iteration */
|
||||
float seg_rotation_angle = (360.0f / (float)num_vertices) * ((float)M_PI / 180);
|
||||
|
||||
@ -82,7 +78,4 @@ void create_circle_geometry(Vec2 position,
|
||||
index = num_vertices;
|
||||
indices[triangle_offset + 2] = (int)index;
|
||||
}
|
||||
|
||||
*vertices_out = vertices;
|
||||
*indices_out = indices;
|
||||
}
|
||||
|
@ -126,12 +126,14 @@ void render(void);
|
||||
/* clears all render queues */
|
||||
void render_queue_clear(void);
|
||||
|
||||
/* fills two existing arrays with the geometry data of a circle */
|
||||
/* the size of indices must be at least 3 times the number of vertices */
|
||||
void create_circle_geometry(Vec2 position,
|
||||
Color color,
|
||||
float radius,
|
||||
size_t num_vertices,
|
||||
SDL_Vertex **vertices_out,
|
||||
int **indices_out);
|
||||
SDL_Vertex vertices[],
|
||||
int indices[]);
|
||||
|
||||
struct SpriteBatch {
|
||||
size_t size; /* how many primitives are in current batch */
|
||||
|
@ -58,6 +58,9 @@ typedef enum {
|
||||
static Pipeline pipeline_last_used = PIPELINE_NO;
|
||||
|
||||
|
||||
#define CIRCLE_VERTICES_MAX 2048
|
||||
|
||||
|
||||
void use_space_pipeline(void) {
|
||||
if (pipeline_last_used == PIPELINE_SPACE)
|
||||
return;
|
||||
@ -164,16 +167,16 @@ void render_rectangle(const RectPrimitive *rectangle) {
|
||||
|
||||
|
||||
void render_circle(const CirclePrimitive *circle) {
|
||||
SDL_Vertex *vertices = NULL;
|
||||
int *indices = NULL;
|
||||
int num_vertices = (int)circle->radius;
|
||||
static SDL_Vertex vertices[CIRCLE_VERTICES_MAX];
|
||||
static int indices[CIRCLE_VERTICES_MAX * 3];
|
||||
int num_vertices = MIN((int)circle->radius, CIRCLE_VERTICES_MAX-1);
|
||||
|
||||
create_circle_geometry(circle->position,
|
||||
circle->color,
|
||||
circle->radius,
|
||||
num_vertices,
|
||||
&vertices,
|
||||
&indices);
|
||||
vertices,
|
||||
indices);
|
||||
|
||||
glEnableClientState(GL_VERTEX_ARRAY);
|
||||
glVertexPointer(2,
|
||||
@ -194,9 +197,6 @@ void render_circle(const CirclePrimitive *circle) {
|
||||
|
||||
glDisableClientState(GL_COLOR_ARRAY);
|
||||
glDisableClientState(GL_VERTEX_ARRAY);
|
||||
|
||||
SDL_free(vertices);
|
||||
SDL_free(indices);
|
||||
}
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user