]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/client/csqcmodel_hooks.qc
Merge branch 'master' into Mario/monsters
[xonotic/xonotic-data.pk3dir.git] / qcsrc / client / csqcmodel_hooks.qc
index 1dfc006c353d57ea8d6722a891097517703f5ed2..87e577c9cea454869acfc3b34ea9ab65110014b6 100644 (file)
 .int lodmodelindex0;
 .int lodmodelindex1;
 .int lodmodelindex2;
-void CSQCPlayer_LOD_Apply(entity this)
+void CSQCPlayer_LOD_Apply(entity this, bool isplayer)
 {
+       int detailreduction = ((isplayer) ? autocvar_cl_playerdetailreduction : autocvar_cl_modeldetailreduction);
+
        // LOD model loading
        if(this.lodmodelindex0 != this.modelindex)
        {
@@ -62,19 +64,19 @@ 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 f = (distance * current_viewzoom + 100.0) * detailreduction;
                f *= 1.0 / bound(0.01, view_quality, 1);
                if(f > autocvar_cl_loddistance2)
                        this.modelindex = this.lodmodelindex2;
@@ -542,7 +544,7 @@ void CSQCModel_Effects_Apply(entity this)
        {
                // This will be hard to replace with MAKE_VECTORS because it's called as part of the predraw function
                // as documented in csprogs.h in the engine. The globals can then be read in many places in the engine.
-               // However MR_ROTATE is currently only used in one place - might be possible to get rid of it entirely.
+               // However MF_ROTATE is currently only used in one place - might be possible to get rid of it entirely.
                this.renderflags |= RF_USEAXIS;
                makevectors(this.angles + '0 100 0' * fmod(time, 3.6));
        }
@@ -617,7 +619,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);
+               CSQCPlayer_LOD_Apply(this, true);
 
                if(!isplayer)
                {
@@ -693,6 +695,8 @@ void CSQCModel_Hook_PreDraw(entity this, bool isplayer)
                        }
                }
        }
+       else
+               CSQCPlayer_LOD_Apply(this, false);
 
        CSQCModel_AutoTagIndex_Apply(this);