All pastes #332028 Raw Edit

Miscellany

public text v1 · immutable
#332028 ·published 2007-01-29 18:14 UTC
rendered paste body
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  =========================