Files
FC1/CryInput/XMouse.h
romkazvo 34d6c5d489 123
2023-08-07 19:29:24 +08:00

214 lines
4.7 KiB
C++

// XMouse.h: interface for the CXMouse class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_XMOUSE_H__E79C3125_5BF0_499D_B76E_6C1070554E8F__INCLUDED_)
#define AFX_XMOUSE_H__E79C3125_5BF0_499D_B76E_6C1070554E8F__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include <IInput.h>
struct ITimer;
struct ILog;
#ifdef PS2
#include "Joystick.h"
#endif
struct ICVar;
#define XMOUSE_MAX_MOUSE_EVENTS 12 // e.g. mouse buttons, axis, ..
class CXMouse :
public IMouse
{
public:
CXMouse()
{
m_exmode=false;
m_pMouse = NULL;
m_kInertia=0;
m_fAccelerationScale=0.5f;
m_bAcceleration=false;
i_mouse_buffered = NULL;
}
virtual ~CXMouse(){
}
class CInput* m_pInput;
#ifdef WIN32
bool Init(ISystem *pSystem,LPDIRECTINPUT8 &g_pdi,HINSTANCE hinst,HWND hwnd,bool dinput);
#else
////////////////////////////////////////////////////
///////////////PS2 SPECIFIC INIT ///////////////////
////////////////////////////////////////////////////
#ifdef PS2
bool m_Initialized;
bool Init(ISystem *pSystem);
bool IsInit(){return m_Initialized;}
#endif
////////////////////////////////////////////////////
///////////////END PS2 SPECIFIC ////////////////////
////////////////////////////////////////////////////
#endif
void Shutdown();
void Update(bool bPrevFocus);
void ClearKeyState();
bool MouseDown(int p_numButton);
bool MousePressed(int p_numButton);
bool MouseDblClick(int p_numButton);
bool MouseReleased(int p_numButton);
bool GetOSKeyName(int nKey, wchar_t *szwKeyName, int iBufSize);
// int GetMouseWheelRotation(bool reset = true); // get wheel state for aplication
void SetMouseWheelRotation(int value); // set wheel state from app message loop
bool SetExclusive(bool value,void *hwnd=0);
inline float GetDeltaX() { return m_Deltas[0]*(m_fSensitivity*m_fSensitivityScale); }
inline float GetDeltaY() { return m_Deltas[1]*(m_fSensitivity*m_fSensitivityScale); }
inline float GetDeltaZ()
{
m_wheelChecked = true;
return m_Deltas[2]*(m_fSensitivity*m_fSensitivityScale);
}
void SetSensitvity(float fSensitivity)
{
if(fSensitivity>0)
m_fSensitivity=fSensitivity/100;
else
m_fSensitivity=0.0f;
}
float GetSensitvity()
{
return m_fSensitivity*100;
}
void SetSensitvityScale(float fSensScale)
{
m_fSensitivityScale=fSensScale;
}
float GetSensitvityScale()
{
return m_fSensitivityScale;
}
inline void SetInertia(float kinertia) { m_kInertia=kinertia; }
void SetVScreenX(float fX);
void SetVScreenY(float fY);
float GetVScreenX();
float GetVScreenY();
private:
bool Acquire();
bool UnAcquire();
int XKEY2IDX(int nKey);
void PostEvent( int key,SInputEvent::EType type,float value=0,unsigned int timestamp=0 );
//smooth movement & mouse accel
void CapDeltas(float cap);
void SmoothDeltas(float accel,float decel=0.0f);
#ifdef WIN32
LPDIRECTINPUTDEVICE8 m_pMouse;
#else
void * m_pMouse;
#endif
HINSTANCE m_hinst;
HWND m_hwnd;
#ifndef PS2
POINT m_previouspoint;
#endif
ICVar * i_mouse_buffered;
//! mouse accel cvars
ICVar * i_mouse_accel;
ICVar * i_mouse_accel_max;
//! mouse smooth cvar
ICVar * i_mouse_smooth;
//! mouse mirror cvar
ICVar * i_mouse_mirror;
float m_fDblClickTime;
float m_Deltas[5];
float m_OldDeltas[2];//!< just old x,y, to smooth movement.
float m_DeltasInertia[2];
float m_kInertia;
unsigned char m_Events[XMOUSE_MAX_MOUSE_EVENTS]; //!<
unsigned char m_oldEvents[XMOUSE_MAX_MOUSE_EVENTS]; //!<
float m_fLastRelease[XMOUSE_MAX_MOUSE_EVENTS]; //!<
bool m_bDblClick[XMOUSE_MAX_MOUSE_EVENTS]; //!<
bool m_exmode;
bool m_dinput;
bool m_wheelChecked;
float m_fVScreenX;
float m_fVScreenY;
ILog * m_pLog;
ITimer * m_pTimer;
ISystem * m_pSystem;
float m_fSensitivity;
float m_fSensitivityScale;
float m_fAccelerationScale;
bool m_bAcceleration;
//////////////////////////////////////////////////////////////////
//////////////PS2 SPECIFIC////////////////////////////////////////
//////////////////////////////////////////////////////////////////
#ifdef PS2
int m_MousePort;
int XPos;
int YPos;
int XOldPos;
int YOldPos;
public:
//Used to simulate mouse input with pad (if needed)
void SetPad(CJoystick *pJoy){m_pJoy=pJoy;}
private:
//If no mouse connected, use pad to simulate it
CJoystick *m_pJoy;
#endif
//////////////////////////////////////////////////////////////////
//////////////END PS2 SPECIFIC////////////////////////////////////
//////////////////////////////////////////////////////////////////
};
#endif // !defined(AFX_XMOUSE_H__E79C3125_5BF0_499D_B76E_6C1070554E8F__INCLUDED_)