X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=r_explosion.c;h=11455498a4cedff2d97891ae0a9c330d3e6f1b2c;hb=2075ae43356d724bae305ce8fd36ea570718b14a;hp=afb033da3ce00df5e2ad529ae7b660d9b32c0f02;hpb=c1ab987e992c1c56ed9ea09426408f7b62ae5100;p=xonotic%2Fdarkplaces.git diff --git a/r_explosion.c b/r_explosion.c index afb033da..11455498 100644 --- a/r_explosion.c +++ b/r_explosion.c @@ -50,7 +50,7 @@ explosion_t; static explosion_t explosion[MAX_EXPLOSIONS]; static rtexture_t *explosiontexture; -static rtexture_t *explosiontexturefog; +//static rtexture_t *explosiontexturefog; static rtexturepool_t *explosiontexturepool; #endif @@ -59,11 +59,14 @@ cvar_t r_explosionclip = {CVAR_SAVE, "r_explosionclip", "1", "enables collision #ifdef MAX_EXPLOSIONS static cvar_t r_drawexplosions = {0, "r_drawexplosions", "1", "enables rendering of explosion shells (see also cl_particles_explosions_shell)"}; +//extern qboolean r_loadfog; static void r_explosion_start(void) { int x, y; - unsigned char noise1[128][128], noise2[128][128], noise3[128][128], data[128][128][4]; + static unsigned char noise1[128][128], noise2[128][128], noise3[128][128], data[128][128][4]; explosiontexturepool = R_AllocTexturePool(); + explosiontexture = NULL; + //explosiontexturefog = NULL; fractalnoise(&noise1[0][0], 128, 32); fractalnoise(&noise2[0][0], 128, 4); fractalnoise(&noise3[0][0], 128, 4); @@ -83,11 +86,14 @@ static void r_explosion_start(void) data[y][x][3] = bound(0, a, 255); } } - explosiontexture = R_LoadTexture2D(explosiontexturepool, "explosiontexture", 128, 128, &data[0][0][0], TEXTYPE_BGRA, TEXF_MIPMAP | TEXF_ALPHA | TEXF_PRECACHE | TEXF_FORCELINEAR, NULL); - for (y = 0;y < 128;y++) - for (x = 0;x < 128;x++) - data[y][x][0] = data[y][x][1] = data[y][x][2] = 255; - explosiontexturefog = R_LoadTexture2D(explosiontexturepool, "explosiontexturefog", 128, 128, &data[0][0][0], TEXTYPE_BGRA, TEXF_MIPMAP | TEXF_ALPHA | TEXF_PRECACHE | TEXF_FORCELINEAR, NULL); + explosiontexture = R_LoadTexture2D(explosiontexturepool, "explosiontexture", 128, 128, &data[0][0][0], TEXTYPE_BGRA, TEXF_MIPMAP | TEXF_ALPHA | TEXF_FORCELINEAR, -1, NULL); +// if (r_loadfog) +// { +// for (y = 0;y < 128;y++) +// for (x = 0;x < 128;x++) +// data[y][x][0] = data[y][x][1] = data[y][x][2] = 255; +// explosiontexturefog = R_LoadTexture2D(explosiontexturepool, "explosiontexture_fog", 128, 128, &data[0][0][0], TEXTYPE_BGRA, TEXF_MIPMAP | TEXF_ALPHA | TEXF_FORCELINEAR, NULL); +// } // note that explosions survive the restart } @@ -147,7 +153,7 @@ void R_Explosion_Init(void) #ifdef MAX_EXPLOSIONS Cvar_RegisterVariable(&r_drawexplosions); - R_RegisterModule("R_Explosions", r_explosion_start, r_explosion_shutdown, r_explosion_newmap); + R_RegisterModule("R_Explosions", r_explosion_start, r_explosion_shutdown, r_explosion_newmap, NULL, NULL); #endif } @@ -183,7 +189,7 @@ void R_NewExplosion(const vec3_t org) // clip start origin if (e->clipping) { - trace = CL_TraceLine(e->origin, e->vert[j], MOVE_NOMONSTERS, NULL, SUPERCONTENTS_SOLID, true, false, NULL, false); + trace = CL_TraceLine(e->origin, e->vert[j], MOVE_NOMONSTERS, NULL, SUPERCONTENTS_SOLID, 0, 0, collision_extendmovelength.value, true, false, NULL, false, false); VectorCopy(trace.endpos, e->vert[i]); } } @@ -198,30 +204,23 @@ static void R_DrawExplosion_TransparentCallback(const entity_render_t *ent, cons { int surfacelistindex = 0; const int numtriangles = EXPLOSIONTRIS, numverts = EXPLOSIONVERTS; - rmeshstate_t m; GL_BlendFunc(GL_SRC_ALPHA, GL_ONE); GL_DepthMask(false); GL_DepthRange(0, 1); GL_PolygonOffset(r_refdef.polygonfactor, r_refdef.polygonoffset); GL_DepthTest(true); GL_CullFace(r_refdef.view.cullface_back); - R_Mesh_Matrix(&identitymatrix); + R_EntityMatrix(&identitymatrix); - R_SetupGenericShader(true); - R_Mesh_ColorPointer(NULL, 0, 0); - memset(&m, 0, sizeof(m)); - m.tex[0] = R_GetTexture(explosiontexture); - m.pointer_texcoord[0] = explosiontexcoord2f[0]; - R_Mesh_TextureState(&m); +// R_Mesh_ResetTextureState(); + R_SetupShader_Generic(explosiontexture, false, false, false); for (surfacelistindex = 0;surfacelistindex < numsurfaces;surfacelistindex++) { const explosion_t *e = explosion + surfacelist[surfacelistindex]; - R_Mesh_VertexPointer(e->vert[0], 0, 0); - // FIXME: fixed function path can't properly handle r_refdef.view.colorscale > 1 + // FIXME: this can't properly handle r_refdef.view.colorscale > 1 GL_Color(e->alpha * r_refdef.view.colorscale, e->alpha * r_refdef.view.colorscale, e->alpha * r_refdef.view.colorscale, 1); - GL_LockArrays(0, numverts); - R_Mesh_Draw(0, numverts, 0, numtriangles, NULL, explosiontris[0], 0, 0); - GL_LockArrays(0, 0); + R_Mesh_PrepareVertices_Generic_Arrays(numverts, e->vert[0], NULL, explosiontexcoord2f[0]); + R_Mesh_Draw(0, numverts, 0, numtriangles, NULL, NULL, 0, explosiontris[0], NULL, 0); } } @@ -246,7 +245,7 @@ static void R_MoveExplosion(explosion_t *e) VectorMA(e->vert[i], frametime, e->vertvel[i], end); if (e->clipping) { - trace = CL_TraceLine(e->vert[i], end, MOVE_NOMONSTERS, NULL, SUPERCONTENTS_SOLID, true, false, NULL, false); + trace = CL_TraceLine(e->vert[i], end, MOVE_NOMONSTERS, NULL, SUPERCONTENTS_SOLID, 0, 0, collision_extendmovelength.value, true, false, NULL, false, false); if (trace.fraction < 1) { // clip velocity against the wall @@ -276,7 +275,7 @@ void R_DrawExplosions(void) { R_MoveExplosion(&explosion[i]); if (explosion[i].alpha) - R_MeshQueue_AddTransparent(explosion[i].origin, R_DrawExplosion_TransparentCallback, NULL, i, NULL); + R_MeshQueue_AddTransparent(TRANSPARENTSORT_DISTANCE, explosion[i].origin, R_DrawExplosion_TransparentCallback, NULL, i, NULL); } } while (numexplosions > 0 && explosion[i-1].alpha <= 0)