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
|