-
Notifications
You must be signed in to change notification settings - Fork 8
/
Copy pathTrackballControls.h
150 lines (96 loc) · 2.33 KB
/
TrackballControls.h
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
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
/**
* Initial @author Eberhard Graether / http://egraether.com/
* C++ port by Michael Ivanov (sasmaster)
*/
#pragma once
#ifndef TRACKBALL_CONTROLLS_H
#define TRACKBALL_CONTROLLS_H
#include "GL/glew.h"
#include "glm.hpp"
#include <stdint.h>
struct GLFWwindow;
namespace sasmaster{
class Camera3D{
public:
glm::vec3 m_eye, m_up;
glm::mat4 m_viewMatr;
Camera3D(const glm::vec3& pos);
void LookAt(const glm::vec3& target);
};
/**
* The class is a singleton.
*/
class TrackballControls
{
public:
/**
* @param cam = pointer to active camera object.
* @param screenSize - size of the window screen.
*/
static TrackballControls& GetInstance(Camera3D* cam,glm::vec4 screenSize);
void Init(GLFWwindow *win);
void Update();
void MouseUp();
void KeyUp();
void MouseDown(int button, int action, int mods,int xpos,int ypos);
void MouseMove(int xpos, int ypos);
void KeyDown(int key);
void MouseWheel(double xoffset ,double yoffset);
float m_rotateSpeed;
float m_zoomSpeed;
float m_panSpeed;
float m_dynamicDampingFactor;
float m_minDistance;
float m_maxDistance;
bool m_enabled;
bool m_noRotate;
bool m_noZoom;
bool m_noPan;
bool m_noRoll;
bool m_staticMoving;
private:
TrackballControls(Camera3D* cam,glm::vec4 screenSize);
glm::vec3 GetMouseProjectionOnBall(int clientX, int clientY);
glm::vec2 GetMouseOnScreen(int clientX, int clientY);
void RotateCamera();
void ZoomCamera();
void PanCamera();
void CheckDistances();
enum class TCB_STATE:uint8_t{
NONE,
ROTATE,
ZOOM,
PAN
};
Camera3D* m_pCam;
glm::vec4 m_screen;
glm::vec3 m_target;
glm::vec3 m_lastPos;
glm::vec3 m_eye;
glm::vec3 m_rotStart;
glm::vec3 m_rotEnd;
glm::vec2 m_zoomStart;
glm::vec2 m_zoomEnd;
glm::vec2 m_panStart;
glm::vec2 m_panEnd;
TCB_STATE m_state;
TCB_STATE m_prevState;
static uint32_t m_keys[3];
};
inline glm::vec2 TrackballControls::GetMouseOnScreen(int clientX, int clientY)
{
return glm::vec2(
(float)(clientX - m_screen.x) / m_screen.z,
(float)(clientY - m_screen.y) / m_screen.w
);
}
inline void TrackballControls::MouseUp(){
if(!m_enabled)return;
m_state = TCB_STATE::NONE;
}
inline void TrackballControls::KeyUp(){
if (!m_enabled) { return; }
m_state = m_prevState;
}
}
#endif//TRACKBALL_CONTROLLS_H