Index: 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 =========================