aboutsummaryrefslogtreecommitdiff
path: root/mp/src/public/matsys_controls/manipulator.h
blob: f030509a24474daa63a2f1ed813cb0b0f4d4f332 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose: 
//
//=============================================================================

#ifndef MANIPULATOR_H
#define MANIPULATOR_H
#ifdef _WIN32
#pragma once
#endif

#include "vgui_controls/Panel.h"
#include "mathlib/vector.h"

//-----------------------------------------------------------------------------
// Manipulator interface
//-----------------------------------------------------------------------------
class IManipulator
{
public:
	virtual ~IManipulator(){}
	virtual void OnBeginManipulation( void ) = 0;
	virtual void OnAcceptManipulation( void ) = 0;
	virtual void OnCancelManipulation( void ) = 0;

	virtual void OnTick( void ) = 0;

	virtual void OnCursorMoved( int x, int y ) = 0;
	virtual void OnMousePressed( vgui::MouseCode code, int x, int y ) = 0;
	virtual void OnMouseReleased( vgui::MouseCode code, int x, int y ) = 0;
	virtual void OnMouseWheeled( int delta ) = 0;

	virtual void SetViewportSize( int w, int h ) = 0;
};


//-----------------------------------------------------------------------------
// Base class helper for implementing manipulators
//-----------------------------------------------------------------------------
class CBaseManipulator : public IManipulator
{
public:
	CBaseManipulator()
	{
		m_nViewport[ 0 ] = m_nViewport[ 1 ]  = 0;
	}

	virtual void OnTick( void ) {};

	virtual void OnBeginManipulation( void ) {}
	virtual void OnAcceptManipulation( void ) {};
	virtual void OnCancelManipulation( void ) {};

	virtual void OnCursorMoved( int x, int y ) {};
	virtual void OnMousePressed( vgui::MouseCode code, int x, int y ) {};
	virtual void OnMouseReleased( vgui::MouseCode code, int x, int y ) {};
	virtual void OnMouseWheeled( int delta ) {};

	virtual void SetViewportSize( int w, int h )
	{
		m_nViewport[ 0 ] = w;
        m_nViewport[ 1 ] = h;
	}

protected:
	int			m_nViewport[ 2 ];
};


//-----------------------------------------------------------------------------
// Base class for manipulators which operate on transforms
//-----------------------------------------------------------------------------
class CTransformManipulator : public CBaseManipulator
{
public:
	CTransformManipulator( matrix3x4_t *pTransform );

	void SetTransform( matrix3x4_t *transform );
	matrix3x4_t *GetTransform();

protected:
	matrix3x4_t *m_pTransform;
};


//-----------------------------------------------------------------------------
// Standard maya-like transform manipulator
//-----------------------------------------------------------------------------
class CPotteryWheelManip : public CTransformManipulator
{
public:
	CPotteryWheelManip( matrix3x4_t *pTransform );

	virtual void OnBeginManipulation( void );
	virtual void OnAcceptManipulation( void );
	virtual void OnCancelManipulation( void );

	virtual void OnTick( void );

	virtual void OnCursorMoved( int x, int y );
	virtual void OnMousePressed( vgui::MouseCode code, int x, int y );
	virtual void OnMouseReleased( vgui::MouseCode code, int x, int y );
	virtual void OnMouseWheeled( int delta );

	// Sets the zoom level
	void SetZoom( float flZoom );

protected:
	int m_lastx, m_lasty;

	float m_zoom;
	float m_altitude, m_azimuth;
	//vec3 m_lookat

	float m_prevZoom;
	float m_prevAltitude, m_prevAzimuth;

	float m_flLastMouseTime;
	float m_flLastTickTime;
	float m_flSpin;
	bool m_bSpin;

	void UpdateTransform( void );
	void UpdateZoom( float delta );
};


#endif // MANIPULATOR_H