rendered paste bodyIndex: src/animation.c
===================================================================
--- src/animation.c (Revision 3367)
+++ src/animation.c (Arbeitskopie)
@@ -425,6 +425,16 @@
int x, y;
float darken;
GLuint blendMode;
+
+ // Moved from drawParticles to get rid of spurious malloc's
+ GLfloat *vertices_cache;
+ int vertex_cache_count;
+ GLfloat *coords_cache;
+ int coords_cache_count;
+ GLfloat *colors_cache;
+ int color_cache_count;
+ GLfloat *dcolors_cache;
+ int dcolors_cache_count;
} ParticleSystem;
@@ -438,6 +448,16 @@
ps->slowdown = 1;
ps->active = FALSE;
+ // Initialize cache
+ ps->vertices_cache = NULL;
+ ps->colors_cache = NULL;
+ ps->coords_cache = NULL;
+ ps->dcolors_cache = NULL;
+ ps->vertex_cache_count = 0;
+ ps->color_cache_count = 0;
+ ps->coords_cache_count = 0;
+ ps->dcolors_cache_count = 0;
+
int i;
for (i = 0; i < numParticles; i++)
@@ -451,6 +471,7 @@
glPushMatrix();
if (w)
glTranslated(WIN_X(w) - ps->x, WIN_Y(w) - ps->y, 0);
+
glEnable(GL_BLEND);
if (ps->tex)
{
@@ -462,21 +483,38 @@
int i;
Particle *part;
- GLfloat *vertices = malloc(ps->numParticles * 4 * 3 * sizeof(GLfloat));
- GLfloat *coords = malloc(ps->numParticles * 4 * 2 * sizeof(GLfloat));
- GLfloat *colors = malloc(ps->numParticles * 4 * 4 * sizeof(GLfloat));
- GLfloat *dcolors = 0;
+ /* Check that the cache is big enough */
+ if (ps->numParticles > ps->vertex_cache_count)
+ {
+ ps->vertices_cache = realloc(ps->vertices_cache, ps->numParticles * 4 * 3 * sizeof(GLfloat));
+ ps->vertex_cache_count = ps->numParticles;
+ }
- GLfloat *vert = vertices;
- GLfloat *coord = coords;
- GLfloat *col = colors;
+ if (ps->numParticles > ps->coords_cache_count)
+ {
+ ps->coords_cache = realloc(ps->coords_cache, ps->numParticles * 4 * 2 * sizeof(GLfloat));
+ ps->coords_cache_count = ps->numParticles;
+ }
+ if (ps->numParticles > ps->color_cache_count)
+ {
+ ps->colors_cache = realloc(ps->colors_cache, ps->numParticles * 4 * 4 * sizeof(GLfloat));
+ ps->color_cache_count = ps->numParticles;
+ }
+
if (ps->darken > 0)
{
- dcolors = malloc(ps->numParticles * 4 * 4 * sizeof(GLfloat));
+ if (ps->dcolors_cache_count < ps->numParticles)
+ {
+ ps->dcolors_cache = realloc(ps->dcolors_cache, ps->numParticles * 4 * 4 * sizeof(GLfloat));
+ ps->dcolors_cache_count = ps->numParticles;
+ }
}
- GLfloat *dcol = dcolors;
+ GLfloat *dcolors = ps->dcolors_cache;
+ GLfloat *vertices = ps->vertices_cache;
+ GLfloat *coords = ps->coords_cache;
+ GLfloat *colors = ps->colors_cache;
int numActive = 0;
@@ -493,78 +531,78 @@
w += (w * part->w_mod) * part->life;
h += (h * part->h_mod) * part->life;
- vert[0] = part->x - w;
- vert[1] = part->y - h;
- vert[2] = part->z;
+ vertices[0] = part->x - w;
+ vertices[1] = part->y - h;
+ vertices[2] = part->z;
- vert[3] = part->x - w;
- vert[4] = part->y + h;
- vert[5] = part->z;
+ vertices[3] = part->x - w;
+ vertices[4] = part->y + h;
+ vertices[5] = part->z;
- vert[6] = part->x + w;
- vert[7] = part->y + h;
- vert[8] = part->z;
+ vertices[6] = part->x + w;
+ vertices[7] = part->y + h;
+ vertices[8] = part->z;
- vert[9] = part->x + w;
- vert[10] = part->y - h;
- vert[11] = part->z;
+ vertices[9] = part->x + w;
+ vertices[10] = part->y - h;
+ vertices[11] = part->z;
- vert += 12;
+ vertices += 12;
- coord[0] = 0.0;
- coord[1] = 0.0;
+ coords[0] = 0.0;
+ coords[1] = 0.0;
- coord[2] = 0.0;
- coord[3] = 1.0;
+ coords[2] = 0.0;
+ coords[3] = 1.0;
- coord[4] = 1.0;
- coord[5] = 1.0;
+ coords[4] = 1.0;
+ coords[5] = 1.0;
- coord[6] = 1.0;
- coord[7] = 0.0;
+ coords[6] = 1.0;
+ coords[7] = 0.0;
- coord += 8;
+ coords += 8;
- col[0] = part->r;
- col[1] = part->g;
- col[2] = part->b;
- col[3] = part->life * part->a;
- col[4] = part->r;
- col[5] = part->g;
- col[6] = part->b;
- col[7] = part->life * part->a;
- col[8] = part->r;
- col[9] = part->g;
- col[10] = part->b;
- col[11] = part->life * part->a;
- col[12] = part->r;
- col[13] = part->g;
- col[14] = part->b;
- col[15] = part->life * part->a;
+ colors[0] = part->r;
+ colors[1] = part->g;
+ colors[2] = part->b;
+ colors[3] = part->life * part->a;
+ colors[4] = part->r;
+ colors[5] = part->g;
+ colors[6] = part->b;
+ colors[7] = part->life * part->a;
+ colors[8] = part->r;
+ colors[9] = part->g;
+ colors[10] = part->b;
+ colors[11] = part->life * part->a;
+ colors[12] = part->r;
+ colors[13] = part->g;
+ colors[14] = part->b;
+ colors[15] = part->life * part->a;
- col += 16;
+ colors += 16;
if (ps->darken > 0)
{
- dcol[0] = part->r;
- dcol[1] = part->g;
- dcol[2] = part->b;
- dcol[3] = part->life * part->a * ps->darken;
- dcol[4] = part->r;
- dcol[5] = part->g;
- dcol[6] = part->b;
- dcol[7] = part->life * part->a * ps->darken;
- dcol[8] = part->r;
- dcol[9] = part->g;
- dcol[10] = part->b;
- dcol[11] = part->life * part->a * ps->darken;
- dcol[12] = part->r;
- dcol[13] = part->g;
- dcol[14] = part->b;
- dcol[15] = part->life * part->a * ps->darken;
+ dcolors[0] = part->r;
+ dcolors[1] = part->g;
+ dcolors[2] = part->b;
+ dcolors[3] = part->life * part->a * ps->darken;
+ dcolors[4] = part->r;
+ dcolors[5] = part->g;
+ dcolors[6] = part->b;
+ dcolors[7] = part->life * part->a * ps->darken;
+ dcolors[8] = part->r;
+ dcolors[9] = part->g;
+ dcolors[10] = part->b;
+ dcolors[11] = part->life * part->a * ps->darken;
+ dcolors[12] = part->r;
+ dcolors[13] = part->g;
+ dcolors[14] = part->b;
+ dcolors[15] = part->life * part->a * ps->darken;
- dcol += 16;
+ dcolors += 16;
}
}
}
@@ -590,15 +628,6 @@
glDisableClientState(GL_COLOR_ARRAY);
- free(vertices);
- free(coords);
- free(colors);
-
- if (ps->darken > 0)
- {
- free(dcolors);
- }
-
glPopMatrix();
glColor4usv(defaultColor);
screenTexEnvMode(s, GL_REPLACE);
@@ -643,6 +672,15 @@
free(ps->particles);
if (ps->tex)
glDeleteTextures(1, &ps->tex);
+
+ if (ps->vertices_cache)
+ free(ps->vertices_cache);
+ if (ps->colors_cache)
+ free(ps->colors_cache);
+ if (ps->coords_cache)
+ free(ps->coords_cache);
+ if (ps->dcolors_cache)
+ free(ps->dcolors_cache);
}
// ===================== END: Particle engine =========================