]> git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Some viewmodel_draw() optimisations
authorbones_was_here <bones_was_here@xonotic.au>
Tue, 22 Nov 2022 03:50:15 +0000 (13:50 +1000)
committerbones_was_here <bones_was_here@xonotic.au>
Tue, 13 Dec 2022 01:18:23 +0000 (11:18 +1000)
qcsrc/client/view.qc
qcsrc/common/weapons/all.qc
qcsrc/common/weapons/all.qh

index c61a86e2d069a63a5d62c1d684b4847ddbe67475..df10883257e78e077bbcb33580ccafe32a70cf15 100644 (file)
@@ -269,7 +269,6 @@ void viewmodel_animate(entity this)
                this.origin += bobmodel_ofs(view);
 }
 
-.vector viewmodel_origin, viewmodel_angles;
 .float weapon_nextthink;
 .float weapon_eta_last;
 .float weapon_switchdelay;
@@ -278,8 +277,6 @@ void viewmodel_animate(entity this)
 
 void viewmodel_draw(entity this)
 {
-       if(!this.activeweapon || !autocvar_r_drawviewmodel)
-               return;
        int mask = (intermission || (STAT(HEALTH) <= 0) || autocvar_chase_active) ? 0 : MASK_NORMAL;
        float a = ((autocvar_cl_viewmodel_alpha) ? bound(-1, autocvar_cl_viewmodel_alpha, this.m_alpha) : this.m_alpha);
        int wepskin = this.m_skin;
@@ -314,8 +311,6 @@ void viewmodel_draw(entity this)
                        this.name_last = name;
                        CL_WeaponEntity_SetModel(this, name, swap);
                        this.origin += autocvar_cl_gunoffset;
-                       this.viewmodel_origin = this.origin;
-                       this.viewmodel_angles = this.angles;
                }
                anim_update(this);
                if ((!this.animstate_override && !this.animstate_looping) || time > this.animstate_endtime)
@@ -344,8 +339,6 @@ void viewmodel_draw(entity this)
                }
        }
        this.weapon_eta_last = f;
-       this.origin = this.viewmodel_origin;
-       this.angles = this.viewmodel_angles;
        this.angles_x = (-90 * f * f);
        viewmodel_animate(this);
        MUTATOR_CALLHOOK(DrawViewModel, this);
@@ -1609,8 +1602,10 @@ void CSQC_UpdateView(entity this, float w, float h)
 
        // run viewmodel_draw before updating view_angles to the angles calculated by WarpZone_FixView
        // viewmodel_draw needs to use the view_angles set by the engine on every CSQC_UpdateView call
-       for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot)
-               viewmodel_draw(viewmodels[slot]);
+       if(autocvar_r_drawviewmodel)
+               for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot)
+                       if(viewmodels[slot].activeweapon)
+                               viewmodel_draw(viewmodels[slot]);
 
        // Render the Scene
        view_origin = getpropertyvec(VF_ORIGIN);
index 6bf2d105f8d85c4c82299c9a216f3e20cd818062..5d029d6dad5d9e8e162b1bd5737762ad9128ba90 100644 (file)
@@ -394,6 +394,7 @@ vector shotorg_adjust_values(vector vecs, bool y_is_right, bool visual, int algn
  *   this.origin, this.angles
  *   this.weaponchild
  *   this.movedir, this.view_ofs, this.movedir_aligned
+ *   this.spawnorigin (SVQC only)
  *   attachment stuff
  *   anim stuff
  * to free:
@@ -410,7 +411,9 @@ void CL_WeaponEntity_SetModel(entity this, string name, bool _anim)
                if (this.weaponchild) delete(this.weaponchild);
                this.weaponchild = NULL;
                this.movedir = '0 0 0';
+#ifdef SVQC
                this.spawnorigin = '0 0 0';
+#endif
                this.oldorigin = '0 0 0';
                this.anim_fire1  = '0 1 0.01';
                this.anim_fire2  = '0 1 0.01';
@@ -482,6 +485,7 @@ void CL_WeaponEntity_SetModel(entity this, string name, bool _anim)
                                this.movedir = '0 0 0';
                        }
                }
+#ifdef SVQC
                {
                        int idx = 0;
                        // v_ model attached to invisible h_ model
@@ -501,6 +505,7 @@ void CL_WeaponEntity_SetModel(entity this, string name, bool _anim)
                                this.spawnorigin = this.movedir;
                        }
                }
+#endif
                if (v_shot_idx)
                {
                        this.oldorigin = '0 0 0';  // use regular attachment
@@ -547,7 +552,7 @@ void CL_WeaponEntity_SetModel(entity this, string name, bool _anim)
                vector v = this.movedir;
                this.movedir = shotorg_adjust(v, false, false, algn);
                this.movedir_aligned = shotorg_adjust(v, false, true, algn);
-               this.view_ofs = shotorg_adjust(v, false, true, algn) - v;
+               this.view_ofs = this.movedir_aligned - v;
        }
        int compressed_shotorg = compressShotOrigin(this.movedir);
        // make them match perfectly
@@ -557,7 +562,9 @@ void CL_WeaponEntity_SetModel(entity this, string name, bool _anim)
 #endif
        this.movedir = decompressShotOrigin(compressed_shotorg);
 
+#ifdef SVQC
        this.spawnorigin += this.view_ofs;  // offset the casings origin by the same amount
+#endif
 
        // check if an instant weapon switch occurred
        setorigin(this, this.view_ofs);
index 286b7a3d3dbfdde33e21975131c2214a691082c6..2931207135cbcfdf1bacddb435f38eae4cc9a39a 100644 (file)
@@ -356,7 +356,9 @@ vector weaponentity_glowmod(Weapon wep, entity actor, int c, entity wepent)
 //.int weapon; // current weapon
 .string weaponname; // name of .weapon
 
+#ifdef SVQC
 .vector spawnorigin; // for casings
+#endif
 
 .vector movedir_aligned; // shot origin based on weapon alignment (unaffected by shootfromeye)