text: //========= Copyright Valve Corporation, All rights reserved. ============//
  //
  // Purpose: 
  //
  // $NoKeywords: $
  //
  //===========================================================================//
  
  #if !defined( INPUT_H )
  #define INPUT_H
  #ifdef _WIN32
  #pragma once
  #endif
  
  #include "iinput.h"
  #include "mathlib/vector.h"
  #include "kbutton.h"
  #include "ehandle.h"
  #include "inputsystem/AnalogCode.h"
  
  typedef unsigned int CRC32_t;
  
  //-----------------------------------------------------------------------------
  // Purpose: 
  //-----------------------------------------------------------------------------
  class CKeyboardKey
  {
  public:
  	// Name for key
  	char				name[ 32 ];
  	// Pointer to the underlying structure
  	kbutton_t			*pkey;
  	// Next key in key list.
  	CKeyboardKey		*next;
  };
  
  class ConVar;
  
  class CInput : public IInput
  {
  // Interface
  public:
  							CInput( void );
  							~CInput( void );
  
  	virtual		void		Init_All( void );
  	virtual		void		Shutdown_All( void );
  	virtual		int			GetButtonBits( int );
  	virtual		void		CreateMove ( int sequence_number, float input_sample_frametime, bool active );
  	virtual		void		ExtraMouseSample( float frametime, bool active );
  	virtual		bool		WriteUsercmdDeltaToBuffer( bf_write *buf, int from, int to, bool isnewcommand );
  	virtual		void		EncodeUserCmdToBuffer( bf_write& buf, int slot );
  	virtual		void		DecodeUserCmdFromBuffer( bf_read& buf, int slot );
  
  	virtual		CUserCmd	*GetUserCmd( int sequence_number );
  
  	virtual		void		MakeWeaponSelection( C_BaseCombatWeapon *weapon );
  
  	virtual		float		KeyState( kbutton_t *key );
  	virtual		int			KeyEvent( int down, ButtonCode_t keynum, const char *pszCurrentBinding );
  	virtual		kbutton_t	*FindKey( const char *name );
  
  	virtual		void		ControllerCommands( void );
  	virtual		void		Joystick_Advanced( void );
  	virtual		void		Joystick_SetSampleTime(float frametime);
  	virtual		void		IN_SetSampleTime( float frametime );
  
  	virtual		void		AccumulateMouse( void );
  	virtual		void		ActivateMouse( void );
  	virtual		void		DeactivateMouse( void );
  
  	virtual		void		ClearStates( void );
  	virtual		float		GetLookSpring( void );
  
  	virtual		void		GetFullscreenMousePos( int *mx, int *my, int *unclampedx = NULL, int *unclampedy = NULL );
  	virtual		void		SetFullscreenMousePos( int mx, int my );
  	virtual		void		ResetMouse( void );
  
  //	virtual		bool		IsNoClipping( void );
  	virtual		float		GetLastForwardMove( void );
  	virtual		float		Joystick_GetForward( void );
  	virtual		float		Joystick_GetSide( void );
  	virtual		float		Joystick_GetPitch( void );
  	virtual		float		Joystick_GetYaw( void );
  	virtual		void		ClearInputButton( int bits );
  
  	virtual		void		CAM_Think( void );
  	virtual		int			CAM_IsThirdPerson( void );
  	virtual		void		CAM_ToThirdPerson(void);
  	virtual		void		CAM_ToFirstPerson(void);
  	virtual		void		CAM_StartMouseMove(void);
  	virtual		void		CAM_EndMouseMove(void);
  	virtual		void		CAM_StartDistance(void);
  	virtual		void		CAM_EndDistance(void);
  	virtual		int			CAM_InterceptingMouse( void );
  
  	// orthographic camera info
  	virtual		void		CAM_ToOrthographic();
  	virtual		bool		CAM_IsOrthographic() const;
  	virtual		void		CAM_OrthographicSize( float& w, float& h ) const;
  
  	virtual		float		CAM_CapYaw( float fVal ) { return fVal; }
  	
  #if defined( HL2_CLIENT_DLL )
  	// IK back channel info
  	virtual		void		AddIKGroundContactInfo( int entindex, float minheight, float maxheight );
  #endif
  	virtual		void		LevelInit( void );
  
  	virtual		void		CAM_SetCameraThirdData( CameraThirdData_t *pCameraData, const QAngle &vecCameraOffset );
  	virtual		void		CAM_CameraThirdThink( void );	
  
  	virtual	bool		EnableJoystickMode();
  
  // Private Implementation
  private:
  	// Implementation specific initialization
  	void		Init_Camera( void );
  	void		Init_Keyboard( void );
  	void		Init_Mouse( void );
  	void		Shutdown_Keyboard( void );
  	// Add a named key to the list queryable by the engine
  	void		AddKeyButton( const char *name, kbutton_t *pkb );
  	// Mouse/keyboard movement input helpers
  	void		ScaleMovements( CUserCmd *cmd );
  	void		ComputeForwardMove( CUserCmd *cmd );
  	void		ComputeUpwardMove( CUserCmd *cmd );
  	void		ComputeSideMove( CUserCmd *cmd );
  	void		AdjustAngles ( float frametime );
  	void		ClampAngles( QAngle& viewangles );
  	void		AdjustPitch( float speed, QAngle& viewangles );
  	virtual void AdjustYaw( float speed, QAngle& viewangles );
  	float		DetermineKeySpeed( float frametime );
  	void		GetAccumulatedMouseDeltasAndResetAccumulators( float *mx, float *my );
  	void		GetMouseDelta( float inmousex, float inmousey, float *pOutMouseX, float *pOutMouseY );
  	void		ScaleMouse( float *x, float *y );
  	void		ApplyMouse( QAngle& viewangles, CUserCmd *cmd, float mouse_x, float mouse_y );
  	void		MouseMove ( CUserCmd *cmd );
  
  	// Joystick  movement input helpers
  	void		ControllerMove ( float frametime, CUserCmd *cmd );
  	void		JoyStickMove ( float frametime, CUserCmd *cmd );
  	float		ScaleAxisValue( const float axisValue, const float axisThreshold );
  
  	// Call this to get the cursor position. The call will be logged in the VCR file if there is one.
  	void		GetMousePos(int &x, int &y);
  	void		SetMousePos(int x, int y);
  	void		GetWindowCenter( int&x, int& y );
  	// Called once per frame to allow convar overrides to acceleration settings when mouse is active
  	void		CheckMouseAcclerationVars();
  
  	void		ValidateUserCmd( CUserCmd *usercmd, int sequence_number );
  
  // Private Data
  private:
  	typedef struct
  	{
  		unsigned int AxisFlags;
  		unsigned int AxisMap;
  		unsigned int ControlMap;
  	} joy_axis_t;
  
  	void		DescribeJoystickAxis( char const *axis, joy_axis_t *mapping );
  	char const	*DescribeAxis( int index );
  
  	enum
  	{
  		GAME_AXIS_NONE = 0,
  		GAME_AXIS_FORWARD,
  		GAME_AXIS_PITCH,
  		GAME_AXIS_SIDE,
  		GAME_AXIS_YAW,
  		MAX_GAME_AXES
  	};
  
  	enum
  	{
  		CAM_COMMAND_NONE = 0,
  		CAM_COMMAND_TOTHIRDPERSON = 1,
  		CAM_COMMAND_TOFIRSTPERSON = 2
  	};
  
  	enum
  	{
  		MOUSE_ACCEL_THRESHHOLD1 = 0,	// if mouse moves > this many mickey's double it
  		MOUSE_ACCEL_THRESHHOLD2,		// if mouse moves > this many mickey's double it a second time
  		MOUSE_SPEED_FACTOR,				// 0 = disabled, 1 = threshold 1 enabled, 2 = threshold 2 enabled
  
  		NUM_MOUSE_PARAMS,
  	};
  
  	// Has the mouse been initialized?
  	bool		m_fMouseInitialized;
  	// Is the mosue active?
  	bool		m_fMouseActive;
  	// Has the joystick advanced initialization been run?
  	bool		m_fJoystickAdvancedInit;
  	// Used to support hotplugging by reinitializing the advanced joystick system when we toggle between some/none joysticks.
  	bool		m_fHadJoysticks;
  
  	// Accumulated mouse deltas
  	float		m_flAccumulatedMouseXMovement;
  	float		m_flAccumulatedMouseYMovement;
  	float		m_flPreviousMouseXPosition;
  	float		m_flPreviousMouseYPosition;
  	float		m_flRemainingJoystickSampleTime;
  	float		m_flKeyboardSampleTime;
  
  	// Flag to restore systemparameters when exiting
  	bool		m_fRestoreSPI;
  	// Original mouse parameters
  	int			m_rgOrigMouseParms[ NUM_MOUSE_PARAMS ];
  	// Current mouse parameters.
  	int			m_rgNewMouseParms[ NUM_MOUSE_PARAMS ];
  	bool		m_rgCheckMouseParam[ NUM_MOUSE_PARAMS ];
  	// Are the parameters valid
  	bool		m_fMouseParmsValid;
  	// Joystick Axis data
  	joy_axis_t m_rgAxes[ MAX_JOYSTICK_AXES ];
  	// List of queryable keys
  	CKeyboardKey *m_pKeys;
  	
  	// Is the 3rd person camera using the mouse?
  	bool		m_fCameraInterceptingMouse;
  	// Are we in 3rd person view?
  	bool		m_fCameraInThirdPerson;
  	// Should we move view along with mouse?
  	bool		m_fCameraMovingWithMouse;
  
  	
  	// Is the camera in distance moving mode?
  	bool		m_fCameraDistanceMove;
  	// Old and current mouse position readings.
  	int			m_nCameraOldX;
  	int			m_nCameraOldY;
  	int			m_nCameraX;
  	int			m_nCameraY;
  
  	// orthographic camera settings
  	bool		m_CameraIsOrthographic;
  
  	QAngle		m_angPreviousViewAngles;
  
  	float		m_flLastForwardMove;
  
  	float m_flPreviousJoystickForward;
  	float m_flPreviousJoystickSide;
  	float m_flPreviousJoystickPitch;
  	float m_flPreviousJoystickYaw;
  
  	class CVerifiedUserCmd
  	{
  	public:
  		CUserCmd	m_cmd;
  		CRC32_t		m_crc;
  	};
  				
  	CUserCmd	*m_pCommands;
  	CVerifiedUserCmd *m_pVerifiedCommands;
  
  	CameraThirdData_t	*m_pCameraThirdData;
  
  	// Set until polled by CreateMove and cleared
  	CHandle< C_BaseCombatWeapon > m_hSelectedWeapon;
  
  #if defined( HL2_CLIENT_DLL )
  	CUtlVector< CEntityGroundContact > m_EntityGroundContact;
  #endif
  };
  
  extern kbutton_t in_strafe;
  extern kbutton_t in_speed;
  extern kbutton_t in_jlook;
  extern kbutton_t in_graph;  
  extern kbutton_t in_moveleft;
  extern kbutton_t in_moveright;
  extern kbutton_t in_forward;
  extern kbutton_t in_back;
  extern kbutton_t in_joyspeed;
  
  extern class ConVar in_joystick;
  extern class ConVar joy_autosprint;
  
  extern void KeyDown( kbutton_t *b, const char *c );
  extern void KeyUp( kbutton_t *b, const char *c );
  
  
  #endif // INPUT_H
  	