TDME2  1.9.200
CameraInputHandler.cpp
Go to the documentation of this file.
2 
3 #include <tdme/tdme.h>
4 #include <tdme/engine/Camera.h>
5 #include <tdme/engine/Engine.h>
6 #include <tdme/engine/Rotation.h>
7 #include <tdme/engine/Timing.h>
10 #include <tdme/gui/GUI.h>
11 #include <tdme/math/Quaternion.h>
12 #include <tdme/math/Vector3.h>
15 
22 using tdme::gui::GUI;
28 
29 CameraInputHandler::CameraInputHandler(Engine* engine, CameraInputHandlerEventHandler* eventHandler):
30  camLookRotationX(Vector3(1.0f, 0.0f, 0.0f), -15.0f),
31  camLookRotationY(Vector3(0.0f, 1.0f, 0.0f), 0.0f)
32 {
33  this->engine = engine;
34  this->eventHandler = eventHandler;
35  reset();
36 }
37 
39 }
40 
41 
43  resetRequested = true;
44  camLookRotationX.setAngle(-15.0f);
48  camScale = 1.0f;
49 }
50 
52  for (auto& event: engine->getGUI()->getKeyboardEvents()) {
53  if (event.isProcessed() == true) continue;
54  if (event.getType() == GUIKeyboardEvent::KEYBOARDEVENT_KEY_TYPED) continue;
55  auto isKeyDown = event.getType() == GUIKeyboardEvent::KEYBOARDEVENT_KEY_PRESSED;
56 
57  //
58  if (event.getKeyCode() == GUIKeyboardEvent::KEYCODE_LEFT) {
59  keyLeft = isKeyDown;
60  event.setProcessed(true);
61  }
62  if (event.getKeyCode() == GUIKeyboardEvent::KEYCODE_RIGHT) {
63  keyRight = isKeyDown;
64  event.setProcessed(true);
65  }
66  if (event.getKeyCode() == GUIKeyboardEvent::KEYCODE_UP) {
67  keyUp = isKeyDown;
68  event.setProcessed(true);
69  }
70  if (event.getKeyCode() == GUIKeyboardEvent::KEYCODE_DOWN) {
71  keyDown = isKeyDown;
72  event.setProcessed(true);
73  }
74  if (Character::toLowerCase(event.getKeyChar()) == 'a') {
75  keyA = isKeyDown;
76  event.setProcessed(true);
77  }
78  if (Character::toLowerCase(event.getKeyChar()) == 'd') {
79  keyD = isKeyDown;
80  event.setProcessed(true);
81  }
82  if (Character::toLowerCase(event.getKeyChar()) == 'w') {
83  keyW = isKeyDown;
84  event.setProcessed(true);
85  }
86  if (Character::toLowerCase(event.getKeyChar()) == 's') {
87  keyS = isKeyDown;
88  event.setProcessed(true);
89  }
90  if (Character::toLowerCase(event.getKeyChar()) == '+') {
91  keyPlus = isKeyDown;
92  event.setProcessed(true);
93  }
94  if (Character::toLowerCase(event.getKeyChar()) == '-') {
95  keyMinus = isKeyDown;
96  event.setProcessed(true);
97  }
98  if (Character::toLowerCase(event.getKeyChar()) == 'r') {
99  keyR = isKeyDown;
100  event.setProcessed(true);
101  }
102  }
103 
104  auto mousePanningSide = MOUSE_PANNING_NONE;
105  auto mousePanningForward = MOUSE_PANNING_NONE;
106  for (auto& event: engine->getGUI()->getMouseEvents()) {
107  if (event.isProcessed() == true) continue;
108  if (event.getType() == GUIMouseEvent::MOUSEEVENT_DRAGGED) {
109  if (mouseDragging == false) {
110  mouseDragging = true;
111  mouseDownLastX = event.getXUnscaled();
112  mouseDownLastY = event.getYUnscaled();
113  event.setProcessed(true);
114  }
115  } else {
116  if (mouseDragging == true) {
119  mouseDragging = false;
120  event.setProcessed(true);
121  }
122  }
123  if (event.getButton() == MOUSE_BUTTON_RIGHT && mouseDragging == true) {
125  mousePanningSide = event.getXUnscaled() - mouseDownLastX;
126  mousePanningForward = event.getYUnscaled() - mouseDownLastY;
127  }
128  event.setProcessed(true);
129  } else
130  if (event.getButton() == MOUSE_BUTTON_MIDDLE && mouseDragging == true) {
132  mouseRotationX = event.getXUnscaled() - mouseDownLastX;
133  mouseRotationY = event.getYUnscaled() - mouseDownLastY;
134  }
135  event.setProcessed(true);
136  }
137  if (event.getButton() != MOUSE_BUTTON_NONE) {
138  if (event.getType() == GUIMouseEvent::MOUSEEVENT_RELEASED) {
141  } else {
142  mouseDownLastX = event.getXUnscaled();
143  mouseDownLastY = event.getYUnscaled();
144  }
145  event.setProcessed(true);
146  }
147  auto mouseWheel = event.getWheelY();
148  if (mouseWheel != 0) {
149  camScale += -mouseWheel * 0.25f;
152  if (eventHandler != nullptr) eventHandler->onCameraScale();
153  event.setProcessed(true);
154  }
155  }
156 
157  //
158  auto cam = engine->getCamera();
162  mouseRotationX = 0;
163  if (eventHandler != nullptr) eventHandler->onCameraRotation();
164  }
168  mouseRotationY = 0;
169  if (eventHandler != nullptr) eventHandler->onCameraRotation();
170  }
171  if (keyA == true) camLookRotationY.setAngle(camLookRotationY.getAngle() + 1.0f);
172  if (keyD == true) camLookRotationY.setAngle(camLookRotationY.getAngle() - 1.0f);
173  if (keyW == true) camLookRotationX.setAngle(camLookRotationX.getAngle() + 1.0f);
174  if (keyS == true) camLookRotationX.setAngle(camLookRotationX.getAngle() - 1.0f);
175  if (keyMinus == true || keyPlus == true) {
176  if (keyMinus == true) camScale += 0.05f;
177  if (keyPlus == true) camScale -= 0.05f;
180  if (eventHandler != nullptr) eventHandler->onCameraScale();
181  }
182 
183  if (keyR == true) reset();
184  if (resetRequested == true) {
185  cam->setLookAt(sceneCenter);
186  camScale = 1.0f;
187  if (eventHandler != nullptr) eventHandler->onCameraTranslation();
188  resetRequested = false;
189  keyR = false;
190  }
191  if (keyA == true|| keyD == true) {
193  if (eventHandler != nullptr) eventHandler->onCameraTranslation();
194  }
195 
196  if (keyW == true || keyS == true) {
197  if (camLookRotationX.getAngle() > 89.99f) camLookRotationX.setAngle(89.99f);
198  if (camLookRotationX.getAngle() < -89.99f) camLookRotationX.setAngle(-89.99f);
200  if (eventHandler != nullptr) eventHandler->onCameraTranslation();
201  }
202 
203  //
204  auto deltaTime = engine->getTiming()->getDeltaTime();
205  if (deltaTime <= 0LL) return;
206  if (deltaTime > 33LL) deltaTime = 33LL;
207 
208  //
209  Vector3 forwardVector(0.0f, 0.0f, 1.0f);
210  Vector3 sideVector(1.0f, 0.0f, 0.0f);
211  auto forwardVectorTransformed = camLookRotationX.getQuaternion().multiply(forwardVector);
212  forwardVectorTransformed = camLookRotationY.getQuaternion().multiply(forwardVectorTransformed);
213  auto camLookAtToFromVector = forwardVectorTransformed.clone().scale(camScale * 10.0f);
214  auto camForwardVector = camLookRotationY.getQuaternion().multiply(forwardVector).scale(30.0f * (deltaTime / 1000.0f));
215  auto camSideVector = camLookRotationY.getQuaternion().multiply(sideVector).scale(30.0f * (deltaTime / 1000.0f));
216 
217  auto camLookAt = cam->getLookAt();
218  if (keyUp == true) camLookAt.sub(forwardVectorTransformed.set(camForwardVector).scale(60.0f * (deltaTime / 1000.0f)));
219  if (keyDown == true) camLookAt.add(forwardVectorTransformed.set(camForwardVector).scale(60.0f * (deltaTime / 1000.0f)));
220  if (keyLeft == true) camLookAt.sub(forwardVectorTransformed.set(camSideVector).scale(60.0f * (deltaTime / 1000.0f)));
221  if (keyRight == true) camLookAt.add(forwardVectorTransformed.set(camSideVector).scale(60.0f * (deltaTime / 1000.0f)));
222  if (mousePanningForward != MOUSE_PANNING_NONE) {
223  camLookAt.sub(forwardVectorTransformed.set(camForwardVector).scale(mousePanningForward));
224  mousePanningForward = MOUSE_PANNING_NONE;
225  if (eventHandler != nullptr) eventHandler->onCameraTranslation();
226  }
227  if (mousePanningSide != MOUSE_PANNING_NONE) {
228  camLookAt.sub(forwardVectorTransformed.set(camSideVector).scale(mousePanningSide));
229  mousePanningSide = MOUSE_PANNING_NONE;
230  if (eventHandler != nullptr) eventHandler->onCameraTranslation();
231  }
232  cam->setLookAt(camLookAt);
233  cam->setLookFrom(cam->getLookAt().clone().add(camLookAtToFromVector));
234  cam->setUpVector(cam->computeUpVector(cam->getLookFrom(), cam->getLookAt()));
235 }
#define MOUSE_BUTTON_NONE
#define MOUSE_BUTTON_MIDDLE
#define MOUSE_BUTTON_RIGHT
Engine main class.
Definition: Engine.h:131
Camera * getCamera()
Definition: Engine.h:1071
Timing * getTiming()
Definition: Engine.h:1064
Rotation representation.
Definition: Rotation.h:18
void setAngle(const float angle)
Definition: Rotation.h:102
const Quaternion & getQuaternion() const
Definition: Rotation.h:124
void update()
Computes rotation matrix.
Definition: Rotation.h:161
const float getAngle() const
Definition: Rotation.h:95
Timing class.
Definition: Timing.h:16
int64_t getDeltaTime()
Gets the time passed between last and current frame.
Definition: Timing.h:85
GUI module class.
Definition: GUI.h:64
vector< GUIMouseEvent > & getMouseEvents()
Definition: GUI.h:206
vector< GUIKeyboardEvent > & getKeyboardEvents()
Definition: GUI.h:213
Quaternion class representing quaternion mathematical structure and operations with x,...
Definition: Quaternion.h:24
Quaternion & add(const Quaternion &quaternion)
Adds quaternion.
Definition: Quaternion.h:239
Quaternion & scale(float scalar)
Scales by scalar.
Definition: Quaternion.h:265
Quaternion & multiply(const Quaternion quaternion)
Multiplies this quaternion with given quaternion.
Definition: Quaternion.h:278
Quaternion & sub(const Quaternion &quaternion)
Subtracts quaternion.
Definition: Quaternion.h:252
Quaternion clone() const
Clones this quaternion.
Definition: Quaternion.h:427
Vector3 class representing vector3 mathematical structure and operations with x, y,...
Definition: Vector3.h:20
void handleInputEvents() override
Handle input events that have not yet been processed.
CameraInputHandlerEventHandler * eventHandler
Character class.
Definition: Character.h:17
virtual void onCameraRotation()=0
On rotation event to be overloaded.
virtual void onCameraTranslation()=0
On translation event to be overloaded.
virtual void onCameraScale()=0
On scale event to be overloaded.