X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fclient%2Fcsqcmodel_hooks.qc;h=78b84fdea6f3da3801773ede0622c4bbd6207cb5;hb=5606e7035655b105545cc7fbcbffa96e653b4e82;hp=252c5032dee4f7687dd5af0d3bc04e6673274393;hpb=415aa53e6a5e50a97d95e14f48fb3589f04f64d5;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/client/csqcmodel_hooks.qc b/qcsrc/client/csqcmodel_hooks.qc index 252c5032d..78b84fdea 100644 --- a/qcsrc/client/csqcmodel_hooks.qc +++ b/qcsrc/client/csqcmodel_hooks.qc @@ -23,10 +23,14 @@ .int lodmodelindex0; .int lodmodelindex1; .int lodmodelindex2; -void CSQCPlayer_LOD_Apply(entity this) +.float loddistance1; +.float loddistance2; +void CSQCModel_LOD_Apply(entity this, bool isplayer) { + int detailreduction = ((isplayer) ? autocvar_cl_playerdetailreduction : autocvar_cl_modeldetailreduction); + // LOD model loading - if(this.lodmodelindex0 != this.modelindex) + if(this.lodmodelindex0 != this.modelindex && this.lodmodelindex1 != this.modelindex && this.lodmodelindex2 != this.modelindex) { string modelname = this.model; string s; @@ -46,7 +50,7 @@ void CSQCPlayer_LOD_Apply(entity this) precache_model(s); _setmodel(this, s); if(this.modelindex) - this.lodmodelindex1 = this.modelindex; + this.lodmodelindex2 = this.lodmodelindex1 = this.modelindex; } s = strcat(substring(modelname, 0, strlen(modelname)-4), "_lod2", substring(modelname, -4, 4)); @@ -63,23 +67,25 @@ void CSQCPlayer_LOD_Apply(entity this) } // apply LOD - if(autocvar_cl_playerdetailreduction <= 0) + if(detailreduction <= 0) { - if(autocvar_cl_playerdetailreduction <= -2) + if(detailreduction <= -2) this.modelindex = this.lodmodelindex2; - else if(autocvar_cl_playerdetailreduction <= -1) + else if(detailreduction <= -1) this.modelindex = this.lodmodelindex1; else this.modelindex = this.lodmodelindex0; } else { - float distance = vlen(this.origin - view_origin); - float f = (distance * current_viewzoom + 100.0) * autocvar_cl_playerdetailreduction; + float distance = vlen(((isplayer) ? this.origin : NearestPointOnBox(this, view_origin)) - view_origin); // TODO: perhaps it should just use NearestPointOnBox all the time, player hitbox can potentially be huge + float dist1 = (this.loddistance1 > 0) ? this.loddistance1 : autocvar_cl_loddistance1; + float dist2 = (this.loddistance2 > 0) ? this.loddistance2 : autocvar_cl_loddistance2; + float f = (distance * current_viewzoom + 100.0) * detailreduction; f *= 1.0 / bound(0.01, view_quality, 1); - if(f > autocvar_cl_loddistance2) + if(f > dist2) this.modelindex = this.lodmodelindex2; - else if(f > autocvar_cl_loddistance1) + else if(f > dist1) this.modelindex = this.lodmodelindex1; else this.modelindex = this.lodmodelindex0; @@ -236,7 +242,7 @@ void CSQCPlayer_ModelAppearance_Apply(entity this, bool islocalplayer) bool forceplayercolors_enabled = false; #define fpc autocvar_cl_forceplayercolors - if (ISGAMETYPE(DUEL)) + if (gametype.m_1v1) { if ((myteam != NUM_SPECTATOR) && (fpc == 1 || fpc == 2 || fpc == 3 || fpc == 5)) forceplayercolors_enabled = true; @@ -301,7 +307,7 @@ void CSQCPlayer_ModelAppearance_Apply(entity this, bool islocalplayer) { if(autocvar_cl_forcemyplayercolors && islocalplayer) this.colormap = 1024 + autocvar_cl_forcemyplayercolors; - else if (autocvar_cl_forceuniqueplayercolors && !islocalplayer && !ISGAMETYPE(DUEL)) + else if (autocvar_cl_forceuniqueplayercolors && !islocalplayer && !gametype.m_1v1) { // Assign each enemy unique colors // pick colors from 0 to 14 since 15 is the rainbow color @@ -328,7 +334,7 @@ void CSQCPlayer_ModelAppearance_Apply(entity this, bool islocalplayer) // GLOWMOD AND DEATH FADING if(this.colormap > 0) - this.glowmod = colormapPaletteColor(((this.colormap >= 1024) ? this.colormap : entcs_GetClientColors(this.colormap - 1)) & 0x0F, true) * 2; + this.glowmod = colormapPaletteColor(((this.colormap >= 1024) ? this.colormap : entcs_GetClientColors(this.colormap - 1)) & 0x0F, true); else this.glowmod = '1 1 1'; @@ -346,6 +352,10 @@ void CSQCPlayer_ModelAppearance_Apply(entity this, bool islocalplayer) } } + // don't let the engine increase player's glowmod + if (autocvar_r_hdr_glowintensity > 1) + this.glowmod /= autocvar_r_hdr_glowintensity; + //printf("CSQCPlayer_ModelAppearance_Apply(): state = %s, colormap = %f, glowmod = %s\n", (this.csqcmodel_isdead ? "DEAD" : "ALIVE"), this.colormap, vtos(this.glowmod)); } @@ -561,6 +571,11 @@ void CSQCModel_Effects_Apply(entity this) boxparticles(particleeffectnum(EFFECT_EF_FLAME), this, this.absmin, this.absmax, this.velocity, this.velocity, bound(0, frametime, 0.1), 0); //pointparticles(EFFECT_EF_FLAME, this.origin, '0 0 0', bound(0, frametime, 0.1)); } + if(eff & EF_SHOCK) + { + boxparticles(particleeffectnum(EFFECT_ARC_LIGHTNING), this, this.absmin, this.absmax, '0 0 0', '0 0 0', bound(0, frametime, 0.1), 0); + //pointparticles(EFFECT_ARC_LIGHTNING, this.origin, '0 0 0', bound(0, frametime, 0.1)); + } if(eff & EF_STARDUST) { boxparticles(particleeffectnum(EFFECT_EF_STARDUST), this, this.absmin, this.absmax, this.velocity, this.velocity, bound(0, frametime, 0.1), 0); @@ -663,7 +678,7 @@ void CSQCModel_Hook_PreDraw(entity this, bool isplayer) if((this.isplayermodel & ISPLAYER_MODEL) && this.drawmask) // this checks if it's a player MODEL! { CSQCPlayer_ModelAppearance_Apply(this, (this.isplayermodel & ISPLAYER_LOCAL)); - CSQCPlayer_LOD_Apply(this); + CSQCModel_LOD_Apply(this, true); if(!isplayer) { @@ -741,6 +756,8 @@ void CSQCModel_Hook_PreDraw(entity this, bool isplayer) } } } + else + CSQCModel_LOD_Apply(this, false); CSQCModel_AutoTagIndex_Apply(this);