Team Fortress 2 Source Code as on 22/4/2020
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

70 lines
2.3 KiB

  1. //========= Copyright Valve Corporation, All rights reserved. ============//
  2. //
  3. // Purpose:
  4. //
  5. //=============================================================================//
  6. #include "cbase.h"
  7. #include "predicted_viewmodel.h"
  8. // memdbgon must be the last include file in a .cpp file!!!
  9. #include "tier0/memdbgon.h"
  10. LINK_ENTITY_TO_CLASS( predicted_viewmodel, CPredictedViewModel );
  11. IMPLEMENT_NETWORKCLASS_ALIASED( PredictedViewModel, DT_PredictedViewModel )
  12. BEGIN_NETWORK_TABLE( CPredictedViewModel, DT_PredictedViewModel )
  13. END_NETWORK_TABLE()
  14. //-----------------------------------------------------------------------------
  15. // Purpose:
  16. //-----------------------------------------------------------------------------
  17. #ifdef CLIENT_DLL
  18. CPredictedViewModel::CPredictedViewModel() : m_LagAnglesHistory("CPredictedViewModel::m_LagAnglesHistory")
  19. {
  20. m_vLagAngles.Init();
  21. m_LagAnglesHistory.Setup( &m_vLagAngles, 0 );
  22. }
  23. #else
  24. CPredictedViewModel::CPredictedViewModel()
  25. {
  26. }
  27. #endif
  28. //-----------------------------------------------------------------------------
  29. // Purpose:
  30. //-----------------------------------------------------------------------------
  31. CPredictedViewModel::~CPredictedViewModel()
  32. {
  33. }
  34. #ifdef CLIENT_DLL
  35. ConVar cl_wpn_sway_interp( "cl_wpn_sway_interp", "0.1", FCVAR_CLIENTDLL );
  36. ConVar cl_wpn_sway_scale( "cl_wpn_sway_scale", "1.0", FCVAR_CLIENTDLL|FCVAR_CHEAT );
  37. #endif
  38. void CPredictedViewModel::CalcViewModelLag( Vector& origin, QAngle& angles, QAngle& original_angles )
  39. {
  40. #ifdef CLIENT_DLL
  41. // Calculate our drift
  42. Vector forward, right, up;
  43. AngleVectors( angles, &forward, &right, &up );
  44. // Add an entry to the history.
  45. m_vLagAngles = angles;
  46. m_LagAnglesHistory.NoteChanged( gpGlobals->curtime, cl_wpn_sway_interp.GetFloat(), false );
  47. // Interpolate back 100ms.
  48. m_LagAnglesHistory.Interpolate( gpGlobals->curtime, cl_wpn_sway_interp.GetFloat() );
  49. // Now take the 100ms angle difference and figure out how far the forward vector moved in local space.
  50. Vector vLaggedForward;
  51. QAngle angleDiff = m_vLagAngles - angles;
  52. AngleVectors( -angleDiff, &vLaggedForward, 0, 0 );
  53. Vector vForwardDiff = Vector(1,0,0) - vLaggedForward;
  54. // Now offset the origin using that.
  55. vForwardDiff *= cl_wpn_sway_scale.GetFloat();
  56. origin += forward*vForwardDiff.x + right*-vForwardDiff.y + up*vForwardDiff.z;
  57. #endif
  58. }