]> git.xonotic.org Git - xonotic/darkplaces.git/commitdiff
Don't lerp nailgun and super nailgun. Trades smoothness for better muzzle flash
authorcloudwalk <cloudwalk@d7cf8633-e32d-0410-b094-e92efae38249>
Wed, 24 Jun 2020 01:03:59 +0000 (01:03 +0000)
committercloudwalk <cloudwalk@d7cf8633-e32d-0410-b094-e92efae38249>
Wed, 24 Jun 2020 01:03:59 +0000 (01:03 +0000)
Added a cvar to define models that should not be lerped. Taken from
Quakespasm.

Todo: Use a proper EF_ flag

git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@12724 d7cf8633-e32d-0410-b094-e92efae38249

gl_rmain.c
model_alias.c
model_shared.h
prvm_cmds.c

index 2bb72a67a0d4bfa985ca7ffd924ec2b3441fa302..a205c10ddec063b2a4a12160cc0bb5be39179d99 100644 (file)
@@ -204,6 +204,7 @@ cvar_t r_water_hideplayer = {CVAR_CLIENT | CVAR_SAVE, "r_water_hideplayer", "0",
 
 cvar_t r_lerpsprites = {CVAR_CLIENT | CVAR_SAVE, "r_lerpsprites", "0", "enables animation smoothing on sprites"};
 cvar_t r_lerpmodels = {CVAR_CLIENT | CVAR_SAVE, "r_lerpmodels", "1", "enables animation smoothing on models"};
+cvar_t r_nolerp_list = {CVAR_CLIENT | CVAR_SAVE, "r_nolerp_list", "progs/v_nail.mdl,progs/v_nail2.mdl,progs/flame.mdl,progs/flame2.mdl,progs/braztall.mdl,progs/brazshrt.mdl,progs/longtrch.mdl,progs/flame_pyre.mdl,progs/v_saw.mdl,progs/v_xfist.mdl,progs/h2stuff/newfire.mdl", "comma separated list of models that will not have their animations smoothed"};
 cvar_t r_lerplightstyles = {CVAR_CLIENT | CVAR_SAVE, "r_lerplightstyles", "0", "enable animation smoothing on flickering lights"};
 cvar_t r_waterscroll = {CVAR_CLIENT | CVAR_SAVE, "r_waterscroll", "1", "makes water scroll around, value controls how much"};
 
@@ -3420,6 +3421,7 @@ void GL_Main_Init(void)
 
        Cvar_RegisterVariable(&r_lerpsprites);
        Cvar_RegisterVariable(&r_lerpmodels);
+       Cvar_RegisterVariable(&r_nolerp_list);
        Cvar_RegisterVariable(&r_lerplightstyles);
        Cvar_RegisterVariable(&r_waterscroll);
        Cvar_RegisterVariable(&r_bloom);
@@ -9473,6 +9475,8 @@ static void R_DecalSystem_SplatEntity(entity_render_t *ent, const vec3_t worldor
                        surfaceindex = bih_surfaces[triangleindex];
                        surface = surfaces + surfaceindex;
                        texture = surface->texture;
+                       if (!texture)
+                               continue;
                        if (texture->currentmaterialflags & (MATERIALFLAG_BLENDED | MATERIALFLAG_NODEPTHTEST | MATERIALFLAG_SKY | MATERIALFLAG_SHORTDEPTHRANGE | MATERIALFLAG_WATERSHADER | MATERIALFLAG_REFRACTION))
                                continue;
                        if (texture->surfaceflags & Q3SURFACEFLAG_NOMARKS)
@@ -9491,6 +9495,8 @@ static void R_DecalSystem_SplatEntity(entity_render_t *ent, const vec3_t worldor
                                continue;
                        // skip transparent surfaces
                        texture = surface->texture;
+                       if (!texture)
+                               continue;
                        if (texture->currentmaterialflags & (MATERIALFLAG_BLENDED | MATERIALFLAG_NODEPTHTEST | MATERIALFLAG_SKY | MATERIALFLAG_SHORTDEPTHRANGE | MATERIALFLAG_WATERSHADER | MATERIALFLAG_REFRACTION))
                                continue;
                        if (texture->surfaceflags & Q3SURFACEFLAG_NOMARKS)
index be300a1bb346a6bf6abca3c058a6863d9614262b..04bc821f107e377b9d507e86e16265d8b07390b5 100644 (file)
@@ -966,7 +966,7 @@ void Mod_BuildAliasSkinsFromSkinFiles(texture_t *skin, skinfile_t *skinfile, con
                Mod_LoadTextureFromQ3Shader(loadmodel->mempool, loadmodel->name, skin, stripbuf, true, true, (r_mipskins.integer ? TEXF_MIPMAP : 0) | TEXF_ALPHA | TEXF_PICMIP | TEXF_COMPRESS, MATERIALFLAG_WALL);
        }
 }
-
+extern cvar_t r_nolerp_list;
 #define BOUNDI(VALUE,MIN,MAX) if (VALUE < MIN || VALUE >= MAX) Host_Error("model %s has an invalid ##VALUE (%d exceeds %d - %d)", loadmodel->name, VALUE, MIN, MAX);
 #define BOUNDF(VALUE,MIN,MAX) if (VALUE < MIN || VALUE >= MAX) Host_Error("model %s has an invalid ##VALUE (%f exceeds %f - %f)", loadmodel->name, VALUE, MIN, MAX);
 void Mod_IDP0_Load(dp_model_t *mod, void *buffer, void *bufferend)
@@ -1044,6 +1044,9 @@ void Mod_IDP0_Load(dp_model_t *mod, void *buffer, void *bufferend)
        i = LittleLong (pinmodel->flags);
        loadmodel->effects = ((i & 255) << 24) | (i & 0x00FFFF00);
 
+       if (strstr(r_nolerp_list.string, loadmodel->name))
+               loadmodel->nolerp = true;
+
        for (i = 0;i < 3;i++)
        {
                loadmodel->surfmesh.num_morphmdlframescale[i] = LittleFloat (pinmodel->scale[i]);
index 0226e7015ead54ea9326f6985e11822d387634b5..03456a02089abdb064bce89f65314240f3ba2c77 100644 (file)
@@ -1060,6 +1060,8 @@ typedef struct model_s
        // if set, the model contains light information (lightmap, or vertexlight)
        qboolean lit;
        float lightmapscale;
+
+       qboolean nolerp;
 }
 dp_model_t;
 
index 2723076c73dc0d881b78eec47d09af8bd299e135..81898814220ea84544a34924fb3505d86734c26b 100644 (file)
@@ -108,7 +108,7 @@ void VM_FrameBlendFromFrameGroupBlend(frameblend_t *frameblend, const framegroup
                return;
        }
 
-       nolerp = (model->type == mod_sprite) ? !r_lerpsprites.integer : !r_lerpmodels.integer;
+       nolerp = ((model->type == mod_sprite) ? !r_lerpsprites.integer : !r_lerpmodels.integer) || (model->nolerp == true);
        numframes = model->numframes;
        for (k = 0, g = framegroupblend;k < MAX_FRAMEGROUPBLENDS;k++, g++)
        {