source-engine/game/client/touch.h

250 lines
5.6 KiB
C++

#include "utllinkedlist.h"
#include "vgui/ISurface.h"
#include "vgui/VGUI.h"
#include <vgui_controls/Panel.h>
#include "cbase.h"
#include "kbutton.h"
#include "usercmd.h"
extern ConVar touch_enable;
#define GRID_COUNT touch_grid_count.GetInt()
#define GRID_COUNT_X (GRID_COUNT)
#define GRID_COUNT_Y (GRID_COUNT * screen_h / screen_w)
#define GRID_X (1.0f/GRID_COUNT_X)
#define GRID_Y (screen_w/screen_h/GRID_COUNT_X)
#define GRID_ROUND_X(x) ((float)round( x * GRID_COUNT_X ) / GRID_COUNT_X)
#define GRID_ROUND_Y(x) ((float)round( x * GRID_COUNT_Y ) / GRID_COUNT_Y)
#define CMD_SIZE 64
#define TOUCH_FL_HIDE (1U << 0)
#define TOUCH_FL_NOEDIT (1U << 1)
#define TOUCH_FL_CLIENT (1U << 2)
#define TOUCH_FL_MP (1U << 3)
#define TOUCH_FL_SP (1U << 4)
#define TOUCH_FL_DEF_SHOW (1U << 5)
#define TOUCH_FL_DEF_HIDE (1U << 6)
#define TOUCH_FL_DRAW_ADDITIVE (1U << 7)
#define TOUCH_FL_STROKE (1U << 8)
#define TOUCH_FL_PRECISION (1U << 9)
enum ETouchButtonType
{
touch_command = 0, // Tap button
touch_move, // Like a joystick stick.
touch_joy, // Like a joystick stick, centered.
touch_dpad, // Only two directions.
touch_look, // Like a touchpad.
touch_key
};
enum ETouchState
{
state_none = 0,
state_edit,
state_edit_move
};
enum ETouchRound
{
round_none = 0,
round_grid,
round_aspect
};
struct rgba_t
{
rgba_t( unsigned char r, unsigned char g, unsigned char b, unsigned char a = 255 ) : r( r ), g( g ), b( b ), a( a ) { }
rgba_t() : r( 0 ), g( 0 ), b( 0 ), a( 0 ) { }
rgba_t( unsigned char *x ) : r( x[0] ), g( x[1] ), b( x[2] ), a( x[3] ) { }
operator unsigned char*() { return &r; }
unsigned char r, g, b, a;
};
struct event_clientcmd_t
{
char buf[CMD_SIZE];
};
struct event_s
{
int type;
float x,y,dx,dy;
int fingerid;
} typedef touch_event_t;
struct CTouchTexture
{
IVTFTexture *vtf;
float X0, Y0, X1, Y1; // position in atlas texture
int height, width;
int textureID;
bool isInAtlas;
char szName[1024];
};
class CTouchButton
{
public:
// Touch button type: tap, stick or slider
ETouchButtonType type;
// Field of button in pixels
float x1, y1, x2, y2;
rgba_t color;
char texturefile[256];
char command[256];
char name[32];
int finger;
int flags;
float fade;
float fadespeed;
float fadeend;
float aspect;
CTouchTexture* texture;
};
class CTouchPanel : public vgui::Panel
{
DECLARE_CLASS_SIMPLE( CTouchPanel, vgui::Panel );
public:
CTouchPanel( vgui::VPANEL parent );
virtual ~CTouchPanel( void ) {};
virtual void Paint();
virtual void ApplySchemeSettings(vgui::IScheme *pScheme);
protected:
MESSAGE_FUNC_INT_INT( OnScreenSizeChanged, "OnScreenSizeChanged", oldwide, oldtall );
};
abstract_class ITouchPanel
{
public:
virtual void Create( vgui::VPANEL parent ) = 0;
virtual void Destroy( void ) = 0;
};
class VTouchPanel : public ITouchPanel
{
private:
CTouchPanel *touchPanel;
public:
VTouchPanel( void )
{
touchPanel = NULL;
}
void Create( vgui::VPANEL parent )
{
touchPanel = new CTouchPanel( parent );
}
void Destroy( void )
{
if ( touchPanel )
{
touchPanel->SetParent( (vgui::Panel *)NULL );
touchPanel->MarkForDeletion();
touchPanel = NULL;
}
}
};
class CTouchControls
{
public:
void Init( );
void LevelInit( );
void Shutdown( );
void Paint( );
void Frame( );
void AddButton( const char *name, const char *texturefile, const char *command, float x1, float y1, float x2, float y2, rgba_t color = rgba_t(255, 255, 255, 255), int round = 2, float aspect = 1.f, int flags = 0 );
void RemoveButton( const char *name );
void ResetToDefaults();
void HideButton( const char *name );
void ShowButton( const char *name );
void ListButtons();
void RemoveButtons();
CTouchButton *FindButton( const char *name );
// bool FindNextButton( const char *name, CTouchButton &button );
void SetTexture( const char *name, const char *file );
void SetColor( const char *name, rgba_t color );
void SetCommand( const char *name, const char *cmd );
void SetFlags( const char *name, int flags );
void WriteConfig();
void IN_CheckCoords( float *x1, float *y1, float *x2, float *y2 );
void InitGrid();
void Move( float frametime, CUserCmd *cmd );
void IN_Look( );
void ProcessEvent( touch_event_t *ev );
void FingerPress( touch_event_t *ev );
void FingerMotion( touch_event_t *ev );
void GetTouchAccumulators( float *forward, float *side, float *yaw, float *pitch );
void GetTouchDelta( float yaw, float pitch, float *dx, float *dy );
void EditEvent( touch_event_t *ev );
void EnableTouchEdit(bool enable);
void CreateAtlasTexture();
CTouchPanel *touchPanel;
float screen_h, screen_w;
float forward, side, movecount;
float yaw, pitch;
rgba_t gridcolor;
private:
bool initialized = false;
ETouchState state;
CUtlLinkedList<CTouchButton*> btns;
CUtlVector<CTouchTexture*> textureList;
int look_finger, move_finger, wheel_finger;
CTouchButton *move_button;
float move_start_x, move_start_y;
float m_flPreviousYaw, m_flPreviousPitch;
int touchTextureID;
IMesh* m_pMesh;
CMeshBuilder meshBuilder;
// editing
CTouchButton *edit;
CTouchButton *selection;
int resize_finger;
bool showbuttons;
bool clientonly;
rgba_t scolor;
int swidth;
bool precision;
// textures
int showtexture;
int hidetexture;
int resettexture;
int closetexture;
int joytexture; // touch indicator
bool configchanged;
bool config_loaded;
vgui::HFont textfont;
int mouse_events;
bool m_bCutScene;
float m_flHideTouch;
int m_AlphaDiff;
};
extern CTouchControls gTouch;
extern VTouchPanel *touch_panel;