From 2bc7dbd0fb505681037e78da63a863bd97f87ecc Mon Sep 17 00:00:00 2001 From: havoc Date: Thu, 23 Jan 2020 09:19:18 +0000 Subject: [PATCH] Remove old decal system, cl_decals_newsystem has been on by default for 10 years now, it was time to remove the old code. git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@12514 d7cf8633-e32d-0410-b094-e92efae38249 --- cl_main.c | 2 - cl_particles.c | 213 ++----------------------------------------------- client.h | 25 ------ gl_rmain.c | 23 ++---- quakedef.h | 4 - render.h | 1 - 6 files changed, 10 insertions(+), 258 deletions(-) diff --git a/cl_main.c b/cl_main.c index 84cd3239..7af224e0 100644 --- a/cl_main.c +++ b/cl_main.c @@ -141,7 +141,6 @@ void CL_ClearState(void) cl.max_lightstyle = MAX_LIGHTSTYLES; cl.max_brushmodel_entities = MAX_EDICTS; cl.max_particles = MAX_PARTICLES_INITIAL; // grows dynamically - cl.max_decals = MAX_DECALS_INITIAL; // grows dynamically cl.max_showlmps = 0; cl.num_dlights = 0; @@ -158,7 +157,6 @@ void CL_ClearState(void) cl.lightstyle = (lightstyle_t *)Mem_Alloc(cls.levelmempool, cl.max_lightstyle * sizeof(lightstyle_t)); cl.brushmodel_entities = (int *)Mem_Alloc(cls.levelmempool, cl.max_brushmodel_entities * sizeof(int)); cl.particles = (particle_t *) Mem_Alloc(cls.levelmempool, cl.max_particles * sizeof(particle_t)); - cl.decals = (decal_t *) Mem_Alloc(cls.levelmempool, cl.max_decals * sizeof(decal_t)); cl.showlmps = NULL; // LadyHavoc: have to set up the baseline info for alpha and other stuff diff --git a/cl_particles.c b/cl_particles.c index 508fd15c..a93be5e7 100644 --- a/cl_particles.c +++ b/cl_particles.c @@ -299,14 +299,12 @@ cvar_t cl_particles_visculling = {CVAR_CLIENT | CVAR_SAVE, "cl_particles_viscull cvar_t cl_particles_collisions = {CVAR_CLIENT | CVAR_SAVE, "cl_particles_collisions", "1", "allow costly collision detection on particles (sparks that bounce, particles not going through walls, blood hitting surfaces, etc)"}; cvar_t cl_particles_forcetraileffects = {CVAR_CLIENT, "cl_particles_forcetraileffects", "0", "force trails to be displayed even if a non-trail draw primitive was used (debug/compat feature)"}; cvar_t cl_decals = {CVAR_CLIENT | CVAR_SAVE, "cl_decals", "1", "enables decals (bullet holes, blood, etc)"}; -cvar_t cl_decals_visculling = {CVAR_CLIENT | CVAR_SAVE, "cl_decals_visculling", "1", "perform a very cheap check if each decal is visible before drawing"}; cvar_t cl_decals_time = {CVAR_CLIENT | CVAR_SAVE, "cl_decals_time", "20", "how long before decals start to fade away"}; cvar_t cl_decals_fadetime = {CVAR_CLIENT | CVAR_SAVE, "cl_decals_fadetime", "1", "how long decals take to fade away"}; -cvar_t cl_decals_newsystem = {CVAR_CLIENT | CVAR_SAVE, "cl_decals_newsystem", "1", "enables new advanced decal system"}; cvar_t cl_decals_newsystem_intensitymultiplier = {CVAR_CLIENT | CVAR_SAVE, "cl_decals_newsystem_intensitymultiplier", "2", "boosts intensity of decals (because the distance fade can make them hard to see otherwise)"}; cvar_t cl_decals_newsystem_immediatebloodstain = {CVAR_CLIENT | CVAR_SAVE, "cl_decals_newsystem_immediatebloodstain", "2", "0: no on-spawn blood stains; 1: on-spawn blood stains for pt_blood; 2: always use on-spawn blood stains"}; cvar_t cl_decals_newsystem_bloodsmears = {CVAR_CLIENT | CVAR_SAVE, "cl_decals_newsystem_bloodsmears", "1", "enable use of particle velocity as decal projection direction rather than surface normal"}; -cvar_t cl_decals_models = {CVAR_CLIENT | CVAR_SAVE, "cl_decals_models", "0", "enables decals on animated models (if newsystem is also 1)"}; +cvar_t cl_decals_models = {CVAR_CLIENT | CVAR_SAVE, "cl_decals_models", "0", "enables decals on animated models"}; cvar_t cl_decals_bias = {CVAR_CLIENT | CVAR_SAVE, "cl_decals_bias", "0.125", "distance to bias decals from surface to prevent depth fighting"}; cvar_t cl_decals_max = {CVAR_CLIENT | CVAR_SAVE, "cl_decals_max", "4096", "maximum number of decals allowed to exist in the world at once"}; @@ -612,10 +610,8 @@ void CL_Particles_Init (void) Cvar_RegisterVariable (&cl_particles_collisions); Cvar_RegisterVariable (&cl_particles_forcetraileffects); Cvar_RegisterVariable (&cl_decals); - Cvar_RegisterVariable (&cl_decals_visculling); Cvar_RegisterVariable (&cl_decals_time); Cvar_RegisterVariable (&cl_decals_fadetime); - Cvar_RegisterVariable (&cl_decals_newsystem); Cvar_RegisterVariable (&cl_decals_newsystem_intensitymultiplier); Cvar_RegisterVariable (&cl_decals_newsystem_immediatebloodstain); Cvar_RegisterVariable (&cl_decals_newsystem_bloodsmears); @@ -810,7 +806,7 @@ static void CL_ImmediateBloodStain(particle_t *part) int staintex; // blood creates a splash at spawn, not just at impact, this makes monsters bloody where they are shot - if (part->staintexnum >= 0 && cl_decals_newsystem.integer && cl_decals.integer) + if (part->staintexnum >= 0 && cl_decals.integer) { VectorCopy(part->vel, v); VectorNormalize(v); @@ -819,7 +815,7 @@ static void CL_ImmediateBloodStain(particle_t *part) } // blood creates a splash at spawn, not just at impact, this makes monsters bloody where they are shot - if (part->typeindex == pt_blood && cl_decals_newsystem.integer && cl_decals.integer) + if (part->typeindex == pt_blood && cl_decals.integer) { VectorCopy(part->vel, v); VectorNormalize(v); @@ -831,7 +827,6 @@ static void CL_ImmediateBloodStain(particle_t *part) void CL_SpawnDecalParticleForSurface(int hitent, const vec3_t org, const vec3_t normal, int color1, int color2, int texnum, float size, float alpha) { int l1, l2; - decal_t *decal; entity_render_t *ent = &cl.entities[hitent].render; unsigned char color[3]; if (!cl_decals.integer) @@ -845,57 +840,10 @@ void CL_SpawnDecalParticleForSurface(int hitent, const vec3_t org, const vec3_t color[1] = ((((color1 >> 8) & 0xFF) * l1 + ((color2 >> 8) & 0xFF) * l2) >> 8) & 0xFF; color[2] = ((((color1 >> 0) & 0xFF) * l1 + ((color2 >> 0) & 0xFF) * l2) >> 8) & 0xFF; - if (cl_decals_newsystem.integer) - { - if (vid.sRGB3D) - R_DecalSystem_SplatEntities(org, normal, Image_LinearFloatFromsRGB(color[0]), Image_LinearFloatFromsRGB(color[1]), Image_LinearFloatFromsRGB(color[2]), alpha*(1.0f/255.0f), particletexture[texnum].s1, particletexture[texnum].t1, particletexture[texnum].s2, particletexture[texnum].t2, size); - else - R_DecalSystem_SplatEntities(org, normal, color[0]*(1.0f/255.0f), color[1]*(1.0f/255.0f), color[2]*(1.0f/255.0f), alpha*(1.0f/255.0f), particletexture[texnum].s1, particletexture[texnum].t1, particletexture[texnum].s2, particletexture[texnum].t2, size); - return; - } - - for (;cl.free_decal < cl.max_decals && cl.decals[cl.free_decal].typeindex;cl.free_decal++); - if (cl.free_decal >= cl.max_decals) - return; - decal = &cl.decals[cl.free_decal++]; - if (cl.num_decals < cl.free_decal) - cl.num_decals = cl.free_decal; - memset(decal, 0, sizeof(*decal)); - decal->decalsequence = cl.decalsequence++; - decal->typeindex = pt_decal; - decal->texnum = texnum; - VectorMA(org, cl_decals_bias.value, normal, decal->org); - VectorCopy(normal, decal->normal); - decal->size = size; - decal->alpha = alpha; - decal->time2 = cl.time; - decal->color[0] = color[0]; - decal->color[1] = color[1]; - decal->color[2] = color[2]; if (vid.sRGB3D) - { - decal->color[0] = (unsigned char)(Image_LinearFloatFromsRGB(decal->color[0]) * 256.0f); - decal->color[1] = (unsigned char)(Image_LinearFloatFromsRGB(decal->color[1]) * 256.0f); - decal->color[2] = (unsigned char)(Image_LinearFloatFromsRGB(decal->color[2]) * 256.0f); - } - decal->owner = hitent; - decal->clusterindex = -1000; // no vis culling unless we're sure - if (hitent) - { - // these relative things are only used to regenerate p->org and p->vel if decal->owner is not world (0) - decal->ownermodel = cl.entities[decal->owner].render.model; - Matrix4x4_Transform(&cl.entities[decal->owner].render.inversematrix, org, decal->relativeorigin); - Matrix4x4_Transform3x3(&cl.entities[decal->owner].render.inversematrix, normal, decal->relativenormal); - } + R_DecalSystem_SplatEntities(org, normal, Image_LinearFloatFromsRGB(color[0]), Image_LinearFloatFromsRGB(color[1]), Image_LinearFloatFromsRGB(color[2]), alpha*(1.0f/255.0f), particletexture[texnum].s1, particletexture[texnum].t1, particletexture[texnum].s2, particletexture[texnum].t2, size); else - { - if(r_refdef.scene.worldmodel && r_refdef.scene.worldmodel->brush.PointInLeaf) - { - mleaf_t *leaf = r_refdef.scene.worldmodel->brush.PointInLeaf(r_refdef.scene.worldmodel, decal->org); - if(leaf) - decal->clusterindex = leaf->clusterindex; - } - } + R_DecalSystem_SplatEntities(org, normal, color[0]*(1.0f/255.0f), color[1]*(1.0f/255.0f), color[2]*(1.0f/255.0f), alpha*(1.0f/255.0f), particletexture[texnum].s1, particletexture[texnum].t1, particletexture[texnum].s2, particletexture[texnum].t2, size); } void CL_SpawnDecalParticleForPoint(const vec3_t org, float maxdist, float size, float alpha, int texnum, int color1, int color2) @@ -2486,157 +2434,6 @@ void R_Particles_Init (void) R_RegisterModule("R_Particles", r_part_start, r_part_shutdown, r_part_newmap, NULL, NULL); } -static void R_DrawDecal_TransparentCallback(const entity_render_t *ent, const rtlight_t *rtlight, int numsurfaces, int *surfacelist) -{ - int surfacelistindex; - const decal_t *d; - float *v3f, *t2f, *c4f; - particletexture_t *tex; - vec_t right[3], up[3], size, ca; - float alphascale = (1.0f / 65536.0f) * cl_particles_alpha.value; - - RSurf_ActiveModelEntity(r_refdef.scene.worldentity, false, false, false); - - r_refdef.stats[r_stat_drawndecals] += numsurfaces; -// R_Mesh_ResetTextureState(); - GL_DepthMask(false); - GL_DepthRange(0, 1); - GL_PolygonOffset(0, 0); - GL_DepthTest(true); - GL_CullFace(GL_NONE); - - // generate all the vertices at once - for (surfacelistindex = 0;surfacelistindex < numsurfaces;surfacelistindex++) - { - d = cl.decals + surfacelist[surfacelistindex]; - - // calculate color - c4f = particle_color4f + 16*surfacelistindex; - ca = d->alpha * alphascale; - // ensure alpha multiplier saturates properly - if (ca > 1.0f / 256.0f) - ca = 1.0f / 256.0f; - if (r_refdef.fogenabled) - ca *= RSurf_FogVertex(d->org); - Vector4Set(c4f, d->color[0] * ca, d->color[1] * ca, d->color[2] * ca, 1); - Vector4Copy(c4f, c4f + 4); - Vector4Copy(c4f, c4f + 8); - Vector4Copy(c4f, c4f + 12); - - // calculate vertex positions - size = d->size * cl_particles_size.value; - VectorVectors(d->normal, right, up); - VectorScale(right, size, right); - VectorScale(up, size, up); - v3f = particle_vertex3f + 12*surfacelistindex; - v3f[ 0] = d->org[0] - right[0] - up[0]; - v3f[ 1] = d->org[1] - right[1] - up[1]; - v3f[ 2] = d->org[2] - right[2] - up[2]; - v3f[ 3] = d->org[0] - right[0] + up[0]; - v3f[ 4] = d->org[1] - right[1] + up[1]; - v3f[ 5] = d->org[2] - right[2] + up[2]; - v3f[ 6] = d->org[0] + right[0] + up[0]; - v3f[ 7] = d->org[1] + right[1] + up[1]; - v3f[ 8] = d->org[2] + right[2] + up[2]; - v3f[ 9] = d->org[0] + right[0] - up[0]; - v3f[10] = d->org[1] + right[1] - up[1]; - v3f[11] = d->org[2] + right[2] - up[2]; - - // calculate texcoords - tex = &particletexture[d->texnum]; - t2f = particle_texcoord2f + 8*surfacelistindex; - t2f[0] = tex->s1;t2f[1] = tex->t2; - t2f[2] = tex->s1;t2f[3] = tex->t1; - t2f[4] = tex->s2;t2f[5] = tex->t1; - t2f[6] = tex->s2;t2f[7] = tex->t2; - } - - // now render the decals all at once - // (this assumes they all use one particle font texture!) - GL_BlendFunc(GL_ZERO, GL_ONE_MINUS_SRC_COLOR); - R_SetupShader_Generic(particletexture[63].texture, false, false, true); - R_Mesh_PrepareVertices_Generic_Arrays(numsurfaces * 4, particle_vertex3f, particle_color4f, particle_texcoord2f); - R_Mesh_Draw(0, numsurfaces * 4, 0, numsurfaces * 2, NULL, NULL, 0, particle_elements, NULL, 0); -} - -void R_DrawDecals (void) -{ - int i; - int drawdecals = r_drawdecals.integer; - decal_t *decal; - float frametime; - float decalfade; - float drawdist2; - unsigned int killsequence = cl.decalsequence - bound(0, (unsigned int) cl_decals_max.integer, cl.decalsequence); - - frametime = bound(0, cl.time - cl.decals_updatetime, 1); - cl.decals_updatetime = bound(cl.time - 1, cl.decals_updatetime + frametime, cl.time + 1); - - // LadyHavoc: early out conditions - if (!cl.num_decals) - return; - - decalfade = frametime * 256 / cl_decals_fadetime.value; - drawdist2 = r_drawdecals_drawdistance.value * r_refdef.view.quality; - drawdist2 = drawdist2*drawdist2; - - for (i = 0, decal = cl.decals;i < cl.num_decals;i++, decal++) - { - if (!decal->typeindex) - continue; - - if (killsequence > decal->decalsequence) - goto killdecal; - - if (cl.time > decal->time2 + cl_decals_time.value) - { - decal->alpha -= decalfade; - if (decal->alpha <= 0) - goto killdecal; - } - - if (decal->owner) - { - if (cl.entities[decal->owner].render.model == decal->ownermodel) - { - Matrix4x4_Transform(&cl.entities[decal->owner].render.matrix, decal->relativeorigin, decal->org); - Matrix4x4_Transform3x3(&cl.entities[decal->owner].render.matrix, decal->relativenormal, decal->normal); - } - else - goto killdecal; - } - - if(cl_decals_visculling.integer && decal->clusterindex > -1000 && !CHECKPVSBIT(r_refdef.viewcache.world_pvsbits, decal->clusterindex)) - continue; - - if (!drawdecals) - continue; - - if (!r_refdef.view.useperspective || (DotProduct(r_refdef.view.origin, decal->normal) > DotProduct(decal->org, decal->normal) && VectorDistance2(decal->org, r_refdef.view.origin) < drawdist2 * (decal->size * decal->size))) - R_MeshQueue_AddTransparent(TRANSPARENTSORT_DISTANCE, decal->org, R_DrawDecal_TransparentCallback, NULL, i, NULL); - continue; -killdecal: - decal->typeindex = 0; - if (cl.free_decal > i) - cl.free_decal = i; - } - - // reduce cl.num_decals if possible - while (cl.num_decals > 0 && cl.decals[cl.num_decals - 1].typeindex == 0) - cl.num_decals--; - - if (cl.num_decals == cl.max_decals && cl.max_decals < MAX_DECALS) - { - decal_t *olddecals = cl.decals; - cl.max_decals = min(cl.max_decals * 2, MAX_DECALS); - cl.decals = (decal_t *) Mem_Alloc(cls.levelmempool, cl.max_decals * sizeof(decal_t)); - memcpy(cl.decals, olddecals, cl.num_decals * sizeof(decal_t)); - Mem_Free(olddecals); - } - - r_refdef.stats[r_stat_totaldecals] = cl.num_decals; -} - static void R_DrawParticle_TransparentCallback(const entity_render_t *ent, const rtlight_t *rtlight, int numsurfaces, int *surfacelist) { vec3_t vecorg, vecvel, baseright, baseup; diff --git a/client.h b/client.h index 7bd78e02..414674e5 100644 --- a/client.h +++ b/client.h @@ -986,29 +986,6 @@ typedef enum ptype_e } ptype_t; -typedef struct decal_s -{ - // fields used by rendering: (44 bytes) - unsigned short typeindex; - unsigned short texnum; - unsigned int decalsequence; - vec3_t org; - vec3_t normal; - float size; - float alpha; // 0-255 - unsigned char color[3]; - unsigned char unused1; - int clusterindex; // cheap culling by pvs - - // fields not used by rendering: (36 bytes in 32bit, 40 bytes in 64bit) - float time2; // used for decal fade - unsigned int owner; // decal stuck to this entity - dp_model_t *ownermodel; // model the decal is stuck to (used to make sure the entity is still alive) - vec3_t relativeorigin; // decal at this location in entity's coordinate space - vec3_t relativenormal; // decal oriented this way relative to entity's coordinate space -} -decal_t; - typedef struct particle_s { // for faster batch rendering, particles are rendered in groups by effect (resulting in less perfect sorting but far less state changes) @@ -1325,7 +1302,6 @@ typedef struct client_state_s int max_lightstyle; int max_brushmodel_entities; int max_particles; - int max_decals; int max_showlmps; entity_t *entities; @@ -1338,7 +1314,6 @@ typedef struct client_state_s lightstyle_t *lightstyle; int *brushmodel_entities; particle_t *particles; - decal_t *decals; showlmp_t *showlmps; int num_entities; diff --git a/gl_rmain.c b/gl_rmain.c index 5c71f456..447d2f38 100644 --- a/gl_rmain.c +++ b/gl_rmain.c @@ -5793,7 +5793,6 @@ extern cvar_t cl_locs_show; static void R_DrawLocs(void); static void R_DrawEntityBBoxes(prvm_prog_t *prog); static void R_DrawModelDecals(void); -extern cvar_t cl_decals_newsystem; extern qboolean r_shadow_usingdeferredprepass; extern int r_shadow_shadowmapatlas_modelshadows_size; void R_RenderScene(int viewfbo, rtexture_t *viewdepthtexture, rtexture_t *viewcolortexture, int viewx, int viewy, int viewwidth, int viewheight) @@ -5920,18 +5919,9 @@ void R_RenderScene(int viewfbo, rtexture_t *viewdepthtexture, rtexture_t *viewco if (cl.csqc_vidvars.drawworld) { - if (cl_decals_newsystem.integer) - { - R_DrawModelDecals(); - if (r_timereport_active) - R_TimeReport("modeldecals"); - } - else - { - R_DrawDecals(); - if (r_timereport_active) - R_TimeReport("decals"); - } + R_DrawModelDecals(); + if (r_timereport_active) + R_TimeReport("modeldecals"); R_DrawParticles(); if (r_timereport_active) @@ -9389,9 +9379,6 @@ static void R_DecalSystem_ApplySplatEntities(const vec3_t worldorigin, const vec float worldmaxs[3]; entity_render_t *ent; - if (!cl_decals_newsystem.integer) - return; - worldmins[0] = worldorigin[0] - worldsize; worldmins[1] = worldorigin[1] - worldsize; worldmins[2] = worldorigin[2] - worldsize; @@ -9429,7 +9416,7 @@ void R_DecalSystem_SplatEntities(const vec3_t worldorigin, const vec3_t worldnor { r_decalsystem_splatqueue_t *queue; - if (!cl_decals_newsystem.integer || r_decalsystem_numqueued == MAX_DECALSYSTEM_QUEUE) + if (r_decalsystem_numqueued == MAX_DECALSYSTEM_QUEUE) return; queue = &r_decalsystem_queue[r_decalsystem_numqueued++]; @@ -9673,7 +9660,7 @@ static void R_DrawModelDecals(void) r_refdef.stats[r_stat_totaldecals] += numdecals; - if (r_showsurfaces.integer) + if (r_showsurfaces.integer || !r_drawdecals.integer) return; R_DrawModelDecals_Entity(r_refdef.scene.worldentity); diff --git a/quakedef.h b/quakedef.h index 36d19b57..4e483f93 100644 --- a/quakedef.h +++ b/quakedef.h @@ -114,8 +114,6 @@ extern char engineversion[128]; #define MAX_BINDMAPS 8 #define MAX_PARTICLES_INITIAL 8192 #define MAX_PARTICLES 8192 -#define MAX_DECALS_INITIAL 1024 -#define MAX_DECALS 1024 #define MAX_ENITIES_INITIAL 256 #define MAX_STATICENTITIES 256 #define MAX_EFFECTS 16 @@ -186,8 +184,6 @@ extern char engineversion[128]; #define MAX_BINDMAPS 8 #define MAX_PARTICLES_INITIAL 8192 ///< initial allocation for cl.particles #define MAX_PARTICLES 1048576 ///< upper limit on cl.particles size -#define MAX_DECALS_INITIAL 8192 ///< initial allocation for cl.decals -#define MAX_DECALS 1048576 ///< upper limit on cl.decals size #define MAX_ENITIES_INITIAL 256 ///< initial size of cl.entities #define MAX_STATICENTITIES 1024 ///< limit on size of cl.static_entities #define MAX_EFFECTS 256 ///< limit on size of cl.effects diff --git a/render.h b/render.h index f799d14f..ef20c14a 100644 --- a/render.h +++ b/render.h @@ -239,7 +239,6 @@ skinframe_t *R_SkinFrame_LoadInternalUsingTexture(const char *name, int texturef rtexture_t *R_GetCubemap(const char *basename); void R_View_WorldVisibility(qboolean forcenovis); -void R_DrawDecals(void); void R_DrawParticles(void); void R_DrawExplosions(void); -- 2.39.2