TDME2  1.9.200
CameraRotationInputHandler.cpp
Go to the documentation of this file.
2 
3 #include <tdme/tdme.h>
5 #include <tdme/engine/Camera.h>
6 #include <tdme/engine/Engine.h>
7 #include <tdme/engine/Entity.h>
11 #include <tdme/gui/GUI.h>
12 #include <tdme/math/Matrix4x4.h>
13 #include <tdme/math/Quaternion.h>
14 #include <tdme/math/Vector3.h>
17 
23 using tdme::gui::GUI;
30 
31 CameraRotationInputHandler::CameraRotationInputHandler(Engine* engine, CameraRotationInputHandlerEventHandler* eventHandler)
32 {
33  this->engine = engine;
34  this->eventHandler = eventHandler;
35  keyLeft = false;
36  keyRight = false;
37  keyUp = false;
38  keyDown = false;
39  keyPeriod = false;
40  keyComma = false;
41  keyPlus = false;
42  keyMinus = false;
43  keyR = false;
44  mouseDragging = false;
45  defaultScale = 1.0f;
46  scale = 1.0f;
47  lookFromRotations.addRotation(Vector3(0.0f, 1.0f, 0.0f), -45.0f);
48  lookFromRotations.addRotation(Vector3(1.0f, 0.0f, 0.0f), -45.0f);
49  lookFromRotations.addRotation(Vector3(0.0f, 0.0f, 1.0f), 0.0f);
51  resetRequested = false;
52  mouseLastX = 0;
53  mouseLastY = 0;
54 }
55 
57 }
58 
60 {
61  return lookFromRotations;
62 }
63 
65 {
66  resetRequested = true;
67 }
68 
70 {
71  auto scaling = false;
72  auto rotation = false;
73  for (const auto& event: engine->getGUI()->getMouseEvents()) {
74  if (event.isProcessed() == true) continue;
75  if (mouseDragging == true) {
76  if (event.getButton() == MOUSE_BUTTON_MIDDLE) {
77  auto xMoved = (event.getX() - mouseLastX) / 5.0f;
78  auto yMoved = (event.getY() - mouseLastY) / 5.0f;
79  mouseLastX = event.getX();
80  mouseLastY = event.getY();
81  auto& xRotation = lookFromRotations.getRotation(0);
82  auto& yRotation = lookFromRotations.getRotation(1);
83  auto xRotationAngle = xRotation.getAngle() + xMoved;
84  auto yRotationAngle = yRotation.getAngle() + yMoved;
85  xRotation.setAngle(xRotationAngle);
86  yRotation.setAngle(yRotationAngle);
88  rotation = true;
89  } else {
90  mouseDragging = false;
91  }
92  } else {
93  if (event.getButton() == MOUSE_BUTTON_MIDDLE) {
94  mouseDragging = true;
95  mouseLastX = event.getX();
96  mouseLastY = event.getY();
97  }
98  }
99  auto mouseWheel = event.getWheelY();
100  if (mouseWheel != 0) {
101  scale += -mouseWheel * 0.1f;
102  if (scale < 0.0001f) scale = 0.0001f;
103  scaling = true;
104  }
105  }
106  for (const auto& event: engine->getGUI()->getKeyboardEvents()) {
107  if (event.isProcessed() == true) continue;
108  if (event.getType() == GUIKeyboardEvent::KEYBOARDEVENT_KEY_TYPED) continue;
109  auto isKeyDown = event.getType() == GUIKeyboardEvent::KEYBOARDEVENT_KEY_PRESSED;
110  if (event.getKeyCode() == GUIKeyboardEvent::KEYCODE_LEFT)
111  keyLeft = isKeyDown;
112 
113  if (event.getKeyCode() == GUIKeyboardEvent::KEYCODE_RIGHT)
114  keyRight = isKeyDown;
115 
116  if (event.getKeyCode() == GUIKeyboardEvent::KEYCODE_UP)
117  keyUp = isKeyDown;
118 
119  if (event.getKeyCode() == GUIKeyboardEvent::KEYCODE_DOWN)
120  keyDown = isKeyDown;
121 
122  if (Character::toLowerCase(event.getKeyChar()) == '.')
123  keyPeriod = isKeyDown;
124 
125  if (Character::toLowerCase(event.getKeyChar()) == ',')
126  keyComma = isKeyDown;
127 
128  if (Character::toLowerCase(event.getKeyChar()) == '+')
129  keyPlus = isKeyDown;
130 
131  if (Character::toLowerCase(event.getKeyChar()) == '-')
132  keyMinus = isKeyDown;
133 
134  if (Character::toLowerCase(event.getKeyChar()) == 'r')
135  keyR = isKeyDown;
136 
137  }
138 
139  auto entity = engine->getEntity("model");
140 
141  auto& rotationX = lookFromRotations.getRotation(0);
142  auto& rotationY = lookFromRotations.getRotation(1);
143  auto& rotationZ = lookFromRotations.getRotation(2);
144 
145  if (keyLeft == true) rotationX.setAngle(rotationX.getAngle() - 1.0f);
146  if (keyRight == true) rotationX.setAngle(rotationX.getAngle() + 1.0f);
147  if (keyUp == true) rotationY.setAngle(rotationY.getAngle() + 1.0f);
148  if (keyDown == true) rotationY.setAngle(rotationY.getAngle() - 1.0f);
149  if (keyComma == true) rotationZ.setAngle(rotationZ.getAngle() - 1.0f);
150  if (keyPeriod == true) rotationZ.setAngle(rotationZ.getAngle() + 1.0f);
151 
152  if (keyMinus == true) {
153  scaling = true;
154  scale += 0.05f;
155  }
156  if (keyPlus == true) {
157  scaling = true;
158  scale -= 0.05f;
159  if (scale < 0.0001f) scale = 0.0001f;
160  }
161 
162  if (keyR == true || resetRequested == true) {
163  rotationY.setAngle(-45.0f);
164  rotationZ.setAngle(0.0f);
166  }
167  if (keyLeft == true ||
168  keyRight == true ||
169  keyUp == true ||
170  keyDown == true ||
171  keyComma == true ||
172  keyPeriod == true ||
173  keyR == true ||
174  resetRequested) {
176  if (entity != nullptr) {
177  worldBoundingBox = *entity->getWorldBoundingBox();
178  }
179  }
180  auto cam = engine->getCamera();
181  auto lookAt = cam->getLookAt();
182  if (resetRequested == true) {
183  if (entity != nullptr) {
184  worldBoundingBox = *entity->getWorldBoundingBox();
185  lookAt.set(worldBoundingBox.getCenter());
186  } else {
187  lookAt.set(0.0f, 0.0f, 0.0f);
188  }
189  resetRequested = false;
190  }
191  Vector3 forwardVector(0.0f, 0.0f, 1.0f);
192  auto forwardVectorTransformed = lookFromRotations.getTransformMatrix().multiply(forwardVector).scale(scale);
193  auto upVector = lookFromRotations.getRotation(2).getQuaternion().multiply(Vector3(0.0f, 1.0f, 0.0f)).normalize();
194  auto lookFrom = lookAt.clone().add(forwardVectorTransformed);
195  cam->setLookFrom(lookFrom);
196  cam->setLookAt(lookAt);
197  cam->setUpVector(upVector);
198 
199  if (scaling == true && eventHandler != nullptr) {
201  }
202  if ((rotation == true ||
203  keyLeft == true ||
204  keyRight == true ||
205  keyUp == true ||
206  keyDown == true ||
207  keyComma == true ||
208  keyPeriod == true ||
209  keyR == true ||
210  resetRequested == true) &&
211  eventHandler != nullptr) {
213  }
214 }
#define MOUSE_BUTTON_MIDDLE
const Vector3 & getLookAt() const
Definition: Camera.h:234
Engine main class.
Definition: Engine.h:131
Camera * getCamera()
Definition: Engine.h:1071
Entity * getEntity(const string &id)
Returns a entity by given id.
Definition: Engine.h:1175
void setAngle(const float angle)
Definition: Rotation.h:102
const Quaternion & getQuaternion() const
Definition: Rotation.h:124
const float getAngle() const
Definition: Rotation.h:95
Transform which contain scale, rotations and translation.
Definition: Transform.h:29
Rotation & getRotation(const int idx)
Get rotation at given index.
Definition: Transform.h:95
virtual void update()
Computes transform matrix.
Definition: Transform.cpp:33
void addRotation(const Vector3 &axis, const float angle)
Add rotation.
Definition: Transform.h:113
const Matrix4x4 & getTransformMatrix() const
Definition: Transform.h:169
const Vector3 & getCenter() const
Definition: BoundingBox.h:121
GUI module class.
Definition: GUI.h:64
vector< GUIMouseEvent > & getMouseEvents()
Definition: GUI.h:206
vector< GUIKeyboardEvent > & getKeyboardEvents()
Definition: GUI.h:213
Matrix4x4 class representing matrix4x4 mathematical structure and operations for 3d space.
Definition: Matrix4x4.h:23
Vector3 multiply(const Vector3 &vector3) const
Multiplies this matrix with vector3.
Definition: Matrix4x4.h:225
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 & multiply(const Quaternion quaternion)
Multiplies this quaternion with given quaternion.
Definition: Quaternion.h:278
Quaternion clone() const
Clones this quaternion.
Definition: Quaternion.h:427
Quaternion & normalize()
Normalizes this quaternion.
Definition: Quaternion.h:346
Vector3 class representing vector3 mathematical structure and operations with x, y,...
Definition: Vector3.h:20
Vector3 & scale(float scalar)
Scales by scalar.
Definition: Vector3.h:201
void handleInputEvents() override
Handle input events that have not yet been processed.
Character class.
Definition: Character.h:17
virtual void onCameraRotation()=0
On rotation event to be overloaded.
virtual void onCameraScale()=0
On scale event to be overloaded.