From 42900a55bd97d36a949d0c95146c5921dc1a12de Mon Sep 17 00:00:00 2001 From: bones_was_here Date: Tue, 22 Nov 2022 13:50:15 +1000 Subject: [PATCH] Some viewmodel_draw() optimisations --- qcsrc/client/view.qc | 13 ++++--------- qcsrc/common/weapons/all.qc | 9 ++++++++- qcsrc/common/weapons/all.qh | 2 ++ 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/qcsrc/client/view.qc b/qcsrc/client/view.qc index c61a86e2d0..df10883257 100644 --- a/qcsrc/client/view.qc +++ b/qcsrc/client/view.qc @@ -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); diff --git a/qcsrc/common/weapons/all.qc b/qcsrc/common/weapons/all.qc index 6bf2d105f8..5d029d6dad 100644 --- a/qcsrc/common/weapons/all.qc +++ b/qcsrc/common/weapons/all.qc @@ -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); diff --git a/qcsrc/common/weapons/all.qh b/qcsrc/common/weapons/all.qh index 286b7a3d3d..2931207135 100644 --- a/qcsrc/common/weapons/all.qh +++ b/qcsrc/common/weapons/all.qh @@ -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) -- 2.39.2