From ed71d7a97a1a4a9b68982b6d1131d630738b9a9b Mon Sep 17 00:00:00 2001 From: Marco Hladik Date: Sun, 1 Aug 2021 08:54:52 +0200 Subject: [PATCH] Add decoupled viewmodel effects --- src/client/camera.qc | 79 ++++++++++++++++++++++ src/client/progs.src | 2 + src/client/viewmodel.qc | 82 +++++++++++++++++++++++ zpak001.pk3dir/particles/fx_explosion.cfg | 11 ++- 4 files changed, 168 insertions(+), 6 deletions(-) create mode 100644 src/client/camera.qc create mode 100644 src/client/viewmodel.qc diff --git a/src/client/camera.qc b/src/client/camera.qc new file mode 100644 index 0000000..3aea939 --- /dev/null +++ b/src/client/camera.qc @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2016-2021 Marco Hladik + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER + * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING + * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +struct +{ + float m_flSpeed; + float m_flFracSin; + float m_flTime; + float m_flMove; + float m_flDelta; + int m_iCycle; +} g_camBobVars[4], *pCamBob; + +/* tilts the camera for a head-bob like effect when moving */ +void +Camera_RunBob(__inout vector camera_angle) +{ + if (!autocvar(v_cambob, 0, "Enables bobbing effect for the first-person camera")) + return; + + int s = (float)getproperty(VF_ACTIVESEAT); + pCamBob = &g_camBobVars[s]; + + /* we don't really care about the vertical velocity */ + vector speed = pSeat->m_vecPredictedVelocity; + speed[2] = 0.0f; + pCamBob->m_flSpeed = vlen(speed); + + /* don't bother on low speeds */ + if ( pCamBob->m_flSpeed < 5.0f ) { + pCamBob->m_flMove = 0.0f; + pCamBob->m_flTime = 0.0f; /* progress has halted, start anew */ + return; + } else if (pSeat->m_ePlayer.flags & FL_ONGROUND) { + pCamBob->m_flMove = clframetime * (pCamBob->m_flSpeed * 0.01); + } + + pCamBob->m_flTime = (pCamBob->m_flTime += pCamBob->m_flMove); + pCamBob->m_flFracSin = fabs(sin(pCamBob->m_flTime * M_PI)); + pCamBob->m_iCycle = (int)pCamBob->m_flTime; + pCamBob->m_flDelta = (pCamBob->m_flFracSin * 0.0025f) * pCamBob->m_flSpeed; + + camera_angle[0] += pCamBob->m_flDelta; + + if (pCamBob->m_iCycle & 1) { + pCamBob->m_flDelta = -pCamBob->m_flDelta; + } + + camera_angle[2] += pCamBob->m_flDelta; +} + +/* applies a tilt to the camera for when we're strafing left to right */ +void +Camera_StrafeRoll(__inout vector camera_angle) +{ + if (!autocvar(v_camroll, 1, "Enables strafe-roll for the first-person camera")) + return; + + float roll; + makevectors(camera_angle); + + roll = dotproduct(pSeat->m_vecPredictedVelocity, v_right); + roll *= 0.015f; + + camera_angle[2] += roll; +} diff --git a/src/client/progs.src b/src/client/progs.src index a1568f3..e8f3054 100755 --- a/src/client/progs.src +++ b/src/client/progs.src @@ -26,6 +26,8 @@ player.qc entities.qc cmds.qc game_event.qc +../../../valve/src/client/camera.qc +../../../valve/src/client/viewmodel.qc view.qc obituary.qc hud.qc diff --git a/src/client/viewmodel.qc b/src/client/viewmodel.qc new file mode 100644 index 0000000..3c864b7 --- /dev/null +++ b/src/client/viewmodel.qc @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2016-2021 Marco Hladik + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER + * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING + * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +var float autocvar_v_bob = 0.01; +var float autocvar_v_bobcycle = 0.8; +var float autocvar_v_bobup = 0.5; + +struct +{ + float m_flBobTime; + float m_flBob; + float m_flBobCycle; + float m_flSpeed; +} g_viewBobVars[4], *pViewBob; + +/* bob vars are calculated separately from application, so that if there's + * more than one viewmodel we won't affect the speed of the bob by running + * the math too many times */ +void +Viewmodel_CalcBob(void) +{ + vector vecVel; + float flBob; + int s = (float)getproperty(VF_ACTIVESEAT); + pViewBob = &g_viewBobVars[s]; + + float var_bob; + float var_cycle; + float var_up; + + var_bob = autocvar_v_bob; + var_cycle = autocvar_v_bobcycle; + var_up = autocvar_v_bobup; + + pViewBob->m_flBobTime += clframetime; + pViewBob->m_flBobCycle = pViewBob->m_flBobTime - (int)(pViewBob->m_flBobTime / var_cycle) * var_cycle; + pViewBob->m_flBobCycle /= var_cycle; + + if (pViewBob->m_flBobCycle < var_up) { + pViewBob->m_flBobCycle = MATH_PI * pViewBob->m_flBobCycle / var_up; + } else { + pViewBob->m_flBobCycle = MATH_PI + MATH_PI * (pViewBob->m_flBobCycle - var_up)/(1.0 - var_up); + } + + vecVel = pSeat->m_vecPredictedVelocity; + vecVel[2] = 0; + pViewBob->m_flSpeed = vlen(vecVel); + + flBob = pViewBob->m_flSpeed * var_bob; + flBob = flBob * 0.3 + flBob * 0.7 * sin(pViewBob->m_flBobCycle); + pViewBob->m_flBob = bound(-7, flBob, 4); + + /* make sure it's adjusted for scale */ + pViewBob->m_flBob *= autocvar_r_viewmodelscale; +} + +void +Viewmodel_ApplyBob(entity gun) +{ + // Give the gun a tilt effect like in old HL/CS versions + if (autocvar(v_bobclassic, 1, "Viewmodel bob classic tilt switch") == 1) { + gun.angles[2] = -pViewBob->m_flBob; + } + + gun.origin += [0,0,-1] + (v_forward * (pViewBob->m_flBob * 0.4)) + + (v_forward * autocvar_v_gunofs[0]) + + (v_right * autocvar_v_gunofs[1]) + + (v_up * autocvar_v_gunofs[2]); +} diff --git a/zpak001.pk3dir/particles/fx_explosion.cfg b/zpak001.pk3dir/particles/fx_explosion.cfg index 33a6712..8519d57 100644 --- a/zpak001.pk3dir/particles/fx_explosion.cfg +++ b/zpak001.pk3dir/particles/fx_explosion.cfg @@ -5,14 +5,13 @@ r_part ember tcoords 97 97 191 191 256 rgb 255 128 76 alpha 0 - scale 15 + scale 20 scalefactor 1 - friction 8 - gravity 50 - die 1.5 + die 1 + friction 2.5 blend add - randomvel 5 - veladd 1 + randomvel 15 + veladd 2 rampmode delta ramp 0 0 0 -0.5 0 ramp 0 0 0 0.1 0