X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=r_explosion.c;h=a486f42de11d42bb419728ac619240b218850411;hb=01ba19424cec267526ca273d809516ff36fe23cb;hp=74d63bfb9389a5b1a68b63c35de0e5de27c0f9a4;hpb=d3cbe906d0eedcff735096a08340d8ca90457fa9;p=xonotic%2Fdarkplaces.git diff --git a/r_explosion.c b/r_explosion.c index 74d63bfb..a486f42d 100644 --- a/r_explosion.c +++ b/r_explosion.c @@ -26,10 +26,10 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #define EXPLOSIONVERTS ((EXPLOSIONGRID+1)*(EXPLOSIONGRID+1)) #define EXPLOSIONTRIS (EXPLOSIONGRID*EXPLOSIONGRID*2) -float explosiontexcoord2f[EXPLOSIONVERTS][2]; -int explosiontris[EXPLOSIONTRIS][3]; -int explosionnoiseindex[EXPLOSIONVERTS]; -vec3_t explosionpoint[EXPLOSIONVERTS]; +static float explosiontexcoord2f[EXPLOSIONVERTS][2]; +static int explosiontris[EXPLOSIONTRIS][3]; +static int explosionnoiseindex[EXPLOSIONVERTS]; +static vec3_t explosionpoint[EXPLOSIONVERTS]; typedef struct explosion_s { @@ -45,20 +45,20 @@ typedef struct explosion_s } explosion_t; -explosion_t explosion[MAX_EXPLOSIONS]; +static explosion_t explosion[MAX_EXPLOSIONS]; -rtexture_t *explosiontexture; -rtexture_t *explosiontexturefog; +static rtexture_t *explosiontexture; +static rtexture_t *explosiontexturefog; -rtexturepool_t *explosiontexturepool; +static rtexturepool_t *explosiontexturepool; -cvar_t r_explosionclip = {CVAR_SAVE, "r_explosionclip", "1"}; -cvar_t r_drawexplosions = {0, "r_drawexplosions", "1"}; +cvar_t r_explosionclip = {CVAR_SAVE, "r_explosionclip", "1", "enables collision detection for explosion shell (so that it flattens against walls and floors)"}; +static cvar_t r_drawexplosions = {0, "r_drawexplosions", "1", "enables rendering of explosion shells (see also cl_particles_explosions_shell)"}; -void r_explosion_start(void) +static void r_explosion_start(void) { int x, y; - qbyte noise1[128][128], noise2[128][128], noise3[128][128], data[128][128][4]; + unsigned char noise1[128][128], noise2[128][128], noise3[128][128], data[128][128][4]; explosiontexturepool = R_AllocTexturePool(); fractalnoise(&noise1[0][0], 128, 32); fractalnoise(&noise2[0][0], 128, 4); @@ -87,17 +87,17 @@ void r_explosion_start(void) // note that explosions survive the restart } -void r_explosion_shutdown(void) +static void r_explosion_shutdown(void) { R_FreeTexturePool(&explosiontexturepool); } -void r_explosion_newmap(void) +static void r_explosion_newmap(void) { memset(explosion, 0, sizeof(explosion)); } -int R_ExplosionVert(int column, int row) +static int R_ExplosionVert(int column, int row) { int i; float yaw, pitch; @@ -141,17 +141,17 @@ void R_Explosion_Init(void) R_RegisterModule("R_Explosions", r_explosion_start, r_explosion_shutdown, r_explosion_newmap); } -void R_NewExplosion(vec3_t org) +void R_NewExplosion(const vec3_t org) { int i, j; float dist, n; explosion_t *e; trace_t trace; - qbyte noise[EXPLOSIONGRID*EXPLOSIONGRID]; + unsigned char noise[EXPLOSIONGRID*EXPLOSIONGRID]; fractalnoisequick(noise, EXPLOSIONGRID, 4); // adjust noise grid size according to explosion for (i = 0, e = explosion;i < MAX_EXPLOSIONS;i++, e++) { - if (e->alpha <= cl_explosions_alpha_end.value) + if (cl.time >= e->endtime) { e->starttime = cl.time; e->endtime = cl.time + cl_explosions_lifetime.value; @@ -180,37 +180,33 @@ void R_NewExplosion(vec3_t org) } } -void R_DrawExplosionCallback(const void *calldata1, int calldata2) +static void R_DrawExplosion_TransparentCallback(const entity_render_t *ent, const rtlight_t *rtlight, int numsurfaces, int *surfacelist) { - int numtriangles, numverts; - float alpha; + int surfacelistindex = 0; + const int numtriangles = EXPLOSIONTRIS, numverts = EXPLOSIONVERTS; rmeshstate_t m; - const explosion_t *e; - e = calldata1; - GL_BlendFunc(GL_SRC_ALPHA, GL_ONE); GL_DepthMask(false); GL_DepthTest(true); - R_Mesh_Matrix(&r_identitymatrix); - - numtriangles = EXPLOSIONTRIS; - numverts = EXPLOSIONVERTS; - alpha = e->alpha; + R_Mesh_Matrix(&identitymatrix); + R_Mesh_ColorPointer(NULL); memset(&m, 0, sizeof(m)); m.tex[0] = R_GetTexture(explosiontexture); m.pointer_texcoord[0] = explosiontexcoord2f[0]; - m.pointer_vertex = e->vert[0]; - R_Mesh_State(&m); - - GL_Color(alpha, alpha, alpha, 1); - - GL_LockArrays(0, numverts); - R_Mesh_Draw(0, numverts, numtriangles, explosiontris[0]); - GL_LockArrays(0, 0); + R_Mesh_TextureState(&m); + for (surfacelistindex = 0;surfacelistindex < numsurfaces;surfacelistindex++) + { + const explosion_t *e = explosion + surfacelist[surfacelistindex]; + R_Mesh_VertexPointer(e->vert[0]); + GL_Color(e->alpha, e->alpha, e->alpha, 1); + GL_LockArrays(0, numverts); + R_Mesh_Draw(0, numverts, numtriangles, explosiontris[0]); + GL_LockArrays(0, 0); + } } -void R_MoveExplosion(explosion_t *e) +static void R_MoveExplosion(explosion_t *e) { int i; float dot, end[3], frametime; @@ -245,10 +241,6 @@ void R_MoveExplosion(explosion_t *e) void R_MoveExplosions(void) { int i; - float frametime; - - frametime = cl.time - cl.oldtime; - for (i = 0;i < MAX_EXPLOSIONS;i++) if (cl.time < explosion[i].endtime) R_MoveExplosion(&explosion[i]); @@ -262,6 +254,6 @@ void R_DrawExplosions(void) return; for (i = 0;i < MAX_EXPLOSIONS;i++) if (r_refdef.time < explosion[i].endtime) - R_MeshQueue_AddTransparent(explosion[i].origin, R_DrawExplosionCallback, &explosion[i], 0); + R_MeshQueue_AddTransparent(explosion[i].origin, R_DrawExplosion_TransparentCallback, NULL, i, NULL); }