Add decoupled viewmodel effects
This commit is contained in:
parent
4278d1fd61
commit
ed71d7a97a
|
@ -0,0 +1,79 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2016-2021 Marco Hladik <marco@icculus.org>
|
||||||
|
*
|
||||||
|
* 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;
|
||||||
|
}
|
|
@ -26,6 +26,8 @@ player.qc
|
||||||
entities.qc
|
entities.qc
|
||||||
cmds.qc
|
cmds.qc
|
||||||
game_event.qc
|
game_event.qc
|
||||||
|
../../../valve/src/client/camera.qc
|
||||||
|
../../../valve/src/client/viewmodel.qc
|
||||||
view.qc
|
view.qc
|
||||||
obituary.qc
|
obituary.qc
|
||||||
hud.qc
|
hud.qc
|
||||||
|
|
|
@ -0,0 +1,82 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2016-2021 Marco Hladik <marco@icculus.org>
|
||||||
|
*
|
||||||
|
* 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]);
|
||||||
|
}
|
|
@ -5,14 +5,13 @@ r_part ember
|
||||||
tcoords 97 97 191 191 256
|
tcoords 97 97 191 191 256
|
||||||
rgb 255 128 76
|
rgb 255 128 76
|
||||||
alpha 0
|
alpha 0
|
||||||
scale 15
|
scale 20
|
||||||
scalefactor 1
|
scalefactor 1
|
||||||
friction 8
|
die 1
|
||||||
gravity 50
|
friction 2.5
|
||||||
die 1.5
|
|
||||||
blend add
|
blend add
|
||||||
randomvel 5
|
randomvel 15
|
||||||
veladd 1
|
veladd 2
|
||||||
rampmode delta
|
rampmode delta
|
||||||
ramp 0 0 0 -0.5 0
|
ramp 0 0 0 -0.5 0
|
||||||
ramp 0 0 0 0.1 0
|
ramp 0 0 0 0.1 0
|
||||||
|
|
Loading…
Reference in New Issue