text: //========= Copyright Valve Corporation, All rights reserved. ============//
  //
  // Purpose: 
  //
  // $NoKeywords: $
  //
  //=============================================================================//
  #if !defined( IINPUT_H )
  #define IINPUT_H
  #ifdef _WIN32
  #pragma once
  #endif
  
  class bf_write;
  class bf_read;
  class CUserCmd;
  class C_BaseCombatWeapon;
  struct kbutton_t;
  
  struct CameraThirdData_t
  {
  	float	m_flPitch;
  	float	m_flYaw;
  	float	m_flDist;
  	float	m_flLag;
  	Vector	m_vecHullMin;
  	Vector	m_vecHullMax;
  };
  
  abstract_class IInput
  {
  public:
  	// Initialization/shutdown of the subsystem
  	virtual	void		Init_All( void ) = 0;
  	virtual void		Shutdown_All( void ) = 0;
  	// Latching button states
  	virtual int			GetButtonBits( int ) = 0;
  	// Create movement command
  	virtual void		CreateMove ( int sequence_number, float input_sample_frametime, bool active ) = 0;
  	virtual void		ExtraMouseSample( float frametime, bool active ) = 0;
  	virtual bool		WriteUsercmdDeltaToBuffer( bf_write *buf, int from, int to, bool isnewcommand ) = 0;
  	virtual void		EncodeUserCmdToBuffer( bf_write& buf, int slot ) = 0;
  	virtual void		DecodeUserCmdFromBuffer( bf_read& buf, int slot ) = 0;
  
  	virtual CUserCmd	*GetUserCmd( int sequence_number ) = 0;
  
  	virtual void		MakeWeaponSelection( C_BaseCombatWeapon *weapon ) = 0;
  
  	// Retrieve key state
  	virtual float		KeyState ( kbutton_t *key ) = 0;
  	// Issue key event
  	virtual int			KeyEvent( int eventcode, ButtonCode_t keynum, const char *pszCurrentBinding ) = 0;
  	// Look for key
  	virtual kbutton_t	*FindKey( const char *name ) = 0;
  
  	// Issue commands from controllers
  	virtual void		ControllerCommands( void ) = 0;
  	// Extra initialization for some joysticks
  	virtual void		Joystick_Advanced( void ) = 0;
  	virtual void		Joystick_SetSampleTime( float frametime ) = 0;
  	virtual void		IN_SetSampleTime( float frametime ) = 0;
  
  	// Accumulate mouse delta
  	virtual void		AccumulateMouse( void ) = 0;
  	// Activate/deactivate mouse
  	virtual void		ActivateMouse( void ) = 0;
  	virtual void		DeactivateMouse( void ) = 0;
  
  	// Clear mouse state data
  	virtual void		ClearStates( void ) = 0;
  	// Retrieve lookspring setting
  	virtual float		GetLookSpring( void ) = 0;
  
  	// Retrieve mouse position
  	virtual void		GetFullscreenMousePos( int *mx, int *my, int *unclampedx = 0, int *unclampedy = 0 ) = 0;
  	virtual void		SetFullscreenMousePos( int mx, int my ) = 0;
  	virtual void		ResetMouse( void ) = 0;
  	virtual	float		GetLastForwardMove( void ) = 0;
  	virtual	float		Joystick_GetForward( void ) = 0;
  	virtual	float		Joystick_GetSide( void ) = 0;
  	virtual	float		Joystick_GetPitch( void ) = 0;
  	virtual	float		Joystick_GetYaw( void ) = 0;
  
  	// Third Person camera ( TODO/FIXME:  Move this to a separate interface? )
  	virtual void		CAM_Think( void ) = 0;
  	virtual int			CAM_IsThirdPerson( void ) = 0;
  	virtual void		CAM_ToThirdPerson(void) = 0;
  	virtual void		CAM_ToFirstPerson(void) = 0;
  	virtual void		CAM_ToFirstPersonView(void) = 0;
  	virtual void		CAM_StartMouseMove(void) = 0;
  	virtual void		CAM_EndMouseMove(void) = 0;
  	virtual void		CAM_StartDistance(void) = 0;
  	virtual void		CAM_EndDistance(void) = 0;
  	virtual int			CAM_InterceptingMouse( void ) = 0;
  
  	// orthographic camera info	( TODO/FIXME:  Move this to a separate interface? )
  	virtual void		CAM_ToOrthographic() = 0;
  	virtual	bool		CAM_IsOrthographic() const = 0;
  	virtual	void		CAM_OrthographicSize( float& w, float& h ) const = 0;
  
  	virtual void		const GetCamViewangles(QAngle &view) = 0;
  	virtual void		SetCamViewangles(QAngle const &view) = 0;
  
  #if defined( HL2_CLIENT_DLL )
  	// IK back channel info
  	virtual void		AddIKGroundContactInfo( int entindex, float minheight, float maxheight ) = 0;
  #endif
  
  	virtual void		LevelInit( void ) = 0;
  
  	// Causes an input to have to be re-pressed to become active
  	virtual void		ClearInputButton( int bits ) = 0;
  
  	virtual	void		CAM_SetCameraThirdData( CameraThirdData_t *pCameraData, const QAngle &vecCameraOffset ) = 0;
  	virtual void		CAM_CameraThirdThink( void ) = 0;
  
  	virtual	bool		EnableJoystickMode() = 0;
  
  
  };
  
  extern ::IInput *input;
  
  #endif // IINPUT_H