From 7c207b778868586579fdc03a8d0d6b8f8002cd52 Mon Sep 17 00:00:00 2001 From: rlk Date: Sun, 3 Apr 2011 19:25:33 +0000 Subject: [PATCH] Optional use of vertex arrays in the particle system. git-svn-id: https://s.snth.net/svn/neverball/branches/gles@3553 78b8d119-cf0a-0410-b17c-f493084dd1d7 --- share/geom.c | 6 ------ share/part.c | 27 ++++++++++++++++++++++++--- share/part.h | 2 +- 3 files changed, 25 insertions(+), 10 deletions(-) diff --git a/share/geom.c b/share/geom.c index 80bc6c3..3e624ee 100644 --- a/share/geom.c +++ b/share/geom.c @@ -348,12 +348,6 @@ void shad_draw_set(void) glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); } glActiveTexture_(GL_TEXTURE0); - - glMatrixMode(GL_TEXTURE); - { - glLoadIdentity(); - } - glMatrixMode(GL_MODELVIEW); } void shad_draw_clr(void) diff --git a/share/part.c b/share/part.c index 0239b36..e3ae7f8 100644 --- a/share/part.c +++ b/share/part.c @@ -23,6 +23,8 @@ #include "vec3.h" #include "image.h" +#define PARTICLEVBO 1 + /*---------------------------------------------------------------------------*/ struct part_vary @@ -50,7 +52,7 @@ static struct b_mtrl coin_base_mtrl = { 0.2f, 0.2f, 0.2f, 1.0f }, { 0.0f, 0.0f, 0.0f, 1.0f }, { 0.0f, 0.0f, 0.0f, 1.0f }, - { 0.0f }, 0.0f, 0, "" + { 0.0f }, 0.0f, M_TRANSPARENT, "" }; static struct d_mtrl coin_draw_mtrl = @@ -115,9 +117,11 @@ void part_lerp_apply(float a) /* this upload to only active particles, but it's more important to do */ /* it all in a single call. */ +#ifdef PARTICLEVBO glBindBuffer (GL_ARRAY_BUFFER, coin_vbo); glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof (coin_draw), coin_draw); glBindBuffer (GL_ARRAY_BUFFER, 0); +#endif } /*---------------------------------------------------------------------------*/ @@ -139,11 +143,13 @@ void part_init(void) memset(coin_vary, 0, PART_MAX_COIN * sizeof (struct part_vary)); memset(coin_draw, 0, PART_MAX_COIN * sizeof (struct part_draw)); +#ifdef PARTICLEVBO glGenBuffers(1, &coin_vbo); glBindBuffer(GL_ARRAY_BUFFER, coin_vbo); glBufferData(GL_ARRAY_BUFFER, sizeof (coin_draw), coin_draw, GL_DYNAMIC_DRAW); glBindBuffer(GL_ARRAY_BUFFER, 0); +#endif part_reset(); } @@ -227,16 +233,29 @@ const struct d_mtrl *part_draw_coin(const struct d_mtrl *mq) /* Draw the entire buffer. Dead particles have zero opacity anyway. */ +#ifdef PARTICLEVBO glBindBuffer(GL_ARRAY_BUFFER, coin_vbo); +#else + glBindBuffer(GL_ARRAY_BUFFER, 0); +#endif + glClientActiveTexture(GL_TEXTURE1); glDisableClientState(GL_TEXTURE_COORD_ARRAY); + glClientActiveTexture(GL_TEXTURE0); + glDisableClientState(GL_TEXTURE_COORD_ARRAY); + glDisableClientState(GL_NORMAL_ARRAY); glEnableClientState(GL_COLOR_ARRAY); { +#ifdef PARTICLEVBO glColorPointer (4, GL_FLOAT, sizeof (struct part_draw), (GLvoid *) offsetof (struct part_draw, c)); glVertexPointer(3, GL_FLOAT, sizeof (struct part_draw), (GLvoid *) offsetof (struct part_draw, p)); +#else + glColorPointer (4, GL_FLOAT, sizeof (struct part_draw), coin_draw[0].c); + glVertexPointer(3, GL_FLOAT, sizeof (struct part_draw), coin_draw[0].p); +#endif glEnable(GL_POINT_SPRITE); { @@ -250,9 +269,11 @@ const struct d_mtrl *part_draw_coin(const struct d_mtrl *mq) } glDisableClientState(GL_COLOR_ARRAY); glEnableClientState(GL_NORMAL_ARRAY); - glEnableClientState(GL_TEXTURE_COORD_ARRAY); - glBindBuffer(GL_ARRAY_BUFFER, 0); + glEnableClientState(GL_TEXTURE_COORD_ARRAY); + glClientActiveTexture(GL_TEXTURE1); + glEnableClientState(GL_TEXTURE_COORD_ARRAY); + glClientActiveTexture(GL_TEXTURE0); return mq; } diff --git a/share/part.h b/share/part.h index e532c92..78b4da7 100644 --- a/share/part.h +++ b/share/part.h @@ -8,7 +8,7 @@ #define IMG_PART_STAR "png/part.png" #define IMG_PART_SQUIGGLE "png/squiggle.png" -#define PART_MAX_COIN 256 +#define PART_MAX_COIN 64 #define PART_MAX_GOAL 64 #define PART_MAX_JUMP 64 -- 1.7.9.5