TDME2  1.9.200
Gizmo.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include <array>
4 
5 #include <tdme/tdme.h>
6 #include <tdme/engine/fwd-tdme.h>
8 #include <tdme/engine/Camera.h>
9 #include <tdme/engine/Engine.h>
10 #include <tdme/engine/Transform.h>
11 #include <tdme/math/Matrix4x4.h>
12 #include <tdme/math/Vector3.h>
14 
15 using std::array;
16 
25 
26 /**
27  * Gizmo tool for views
28  * @author Andreas Drewke
29  */
31 {
32 public:
33  static constexpr float GIZMO_ORTHO_DEFAULT_SCALE { 150.0f };
34  static constexpr float GIZMO_ORTHO_DEFAULT_Z { -200.0f };
35 
36  enum GizmoAxisIdx {
40  GIZMOAXISIDX_Z = 2
41  };
42  enum GizmoType {
48  };
49  enum GizmoMode {
66  };
67 
68 private:
69  Engine* engine { nullptr };
70  string id;
71  int32_t gizmoTypeMask;
77  array<Vector3, 3> gizmoTranslationHandleDiff;
79  array<Vector3, 3> gizmoTranslationLastResult;
83 
84  /**
85  * Compute orthogonal gizmo coordinate
86  * @param worldCoordinate world coordinate to compute
87  * @return orthogonal gizmo coordinate
88  */
89  inline Vector3 computeOrthogonalGizmoCoordinate(const Vector3& worldCoordinate) {
90  Vector4 orthogonalGizmoCoordinateNDC = engine->getCamera()->getModelViewProjectionMatrix().multiply(Vector4(worldCoordinate, 1.0f));
91  orthogonalGizmoCoordinateNDC.scale(1.0f / orthogonalGizmoCoordinateNDC.getW());
92  Vector3 orthogonalGizmoCoordinate;
93  orthogonalGizmoCoordinate.setX(orthogonalGizmoCoordinateNDC.getX() * (engine->getWidth() * 0.5f));
94  orthogonalGizmoCoordinate.setY(orthogonalGizmoCoordinateNDC.getY() * (engine->getHeight() * 0.5f));
95  orthogonalGizmoCoordinate.setZ(GIZMO_ORTHO_DEFAULT_Z);
96  return orthogonalGizmoCoordinate;
97  }
98 
99 public:
100  // forbid class copy
102 
103  /**
104  * Public constructor
105  * @param engine engine
106  * @param id id
107  * @param gizmoTypeMask gizmo type mask
108  */
110 
111  /**
112  * Destructor
113  */
114  virtual ~Gizmo();
115 
116  /**
117  * Set engine
118  * @param engine engine
119  */
120  inline void setEngine(Engine* engine) {
121  this->engine = engine;
122  }
123 
124  /**
125  * @return GIZMO type mask
126  */
127  inline int32_t getGizmoTypeMask() const {
128  return gizmoTypeMask;
129  }
130 
131  /**
132  * Set GIZMO type mask
133  * @param gizmoTypeMask GIZMO type mask
134  */
135  inline void setGizmoTypeMask(int gizmoTypeMask) {
136  this->gizmoTypeMask = gizmoTypeMask;
138  }
139 
140  /**
141  * @return GIZMO type
142  */
143  inline GizmoType getGizmoType() const {
144  return gizmoType;
145  }
146 
147  /**
148  * Set GIZMO type
149  * @param gizmoType GIZMO type
150  */
152  if (gizmoType != GIZMOTYPE_ALL && (gizmoType & gizmoTypeMask) == 0) return;
153  this->gizmoType = gizmoType;
154  }
155 
156  /**
157  * @return GIZMO mode
158  */
159  inline GizmoMode getGizmoMode() const {
160  return gizmoMode;
161  }
162 
163  /**
164  * Set GIZMO mode
165  * @param gizmoMode gizmo mode
166  */
168  //
169  if (this->gizmoMode == gizmoMode) return;
170  //
171  this->gizmoMode = gizmoMode;
172  //
180  }
181 
182  /**
183  * Update gizmo
184  * @param gizmoTranslation GIZMO translation
185  * @param transformations transformations used for rotation
186  */
187  void updateGizmo(const Vector3& gizmoTranslation, const Transform& transform);
188 
189  /**
190  * @return GIZMO object
191  */
193 
194  /**
195  * Remove gizmo
196  */
197  void removeGizmo();
198 
199  /**
200  * Determine gizmo movement
201  * @param mouseX current mouse X position
202  * @param mouseY current mouse Y position
203  * @param mouseDeltaPosition mouse delta position
204  * @param axisIdx vector axis index
205  * @param axis axis to check movement on
206  * @param deltaMovement delta movement result
207  * @return success
208  */
209  bool determineGizmoMovement(int mouseX, int mouseY, int axisIdx, const Vector3& axis, Vector3& deltaMovement);
210 
211  /**
212  * Determine gizmo scale
213  * @param mouseX current mouse X position
214  * @param mouseY current mouse Y position
215  * @param axisIdx vector axis index
216  * @param axis axis to check movement on
217  * @param deltaScale delta scale result
218  * @return success
219  */
220  bool determineGizmoScale(int mouseX, int mouseY, int axisIdx, const Vector3& axis, Vector3& deltaScale);
221 
222  /**
223  * Determine rotation on a plane given by 4 vertices
224  * @param mouseX current mouse X position
225  * @param mouseY current mouse Y position
226  * @param vertices 4 vertices that span a plane
227  * @param planeNormal plane normal to test rotation against
228  * @param deltaRotation delta rotation result
229  * @return success
230  */
231  bool determineGizmoRotation(int mouseX, int mouseY, const array<Vector3, 4>& vertices, const Vector3& planeNormal, float& deltaRotation);
232 
233  /**
234  * Determine GIZMO delta transform
235  * @param mouseX mouse X position
236  * @param mouseY mouse Y position
237  * @param deltaTranslation determined delta translation
238  * @param deltaRotation determined delta rotations
239  * @param deltaScale determined delta scale
240  */
241  bool determineGizmoDeltaTransformations(int mouseX, int mouseY, Vector3& deltaTranslation, Vector3& deltaRotation, Vector3& deltaScale);
242 
243  /**
244  * Select GIZMO mode
245  * @param selectedEntity selected entity
246  * @param selectedEntityNode selected entity node
247  */
248  bool determineGizmoMode(Entity* selectedEntity, Node* selectedEntityNode);
249 
250  /**
251  * @return gizmo translation
252  */
254  return gizmoTranslation;
255  }
256 
257  /**
258  * Set gizmo rotation
259  * @param transform transform containing rotations
260  */
261  void setGizmoRotation(const Transform& transform);
262 
263 };
const Matrix4x4 & getModelViewProjectionMatrix() const
Definition: Camera.h:263
Engine main class.
Definition: Engine.h:131
Camera * getCamera()
Definition: Engine.h:1071
int32_t getWidth()
Definition: Engine.h:1029
int32_t getHeight()
Definition: Engine.h:1036
Engine entity.
Definition: Entity.h:30
Object to be used with engine class.
Definition: Object.h:60
Transform which contain scale, rotations and translation.
Definition: Transform.h:29
Model node.
Definition: Node.h:32
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
Vector3 class representing vector3 mathematical structure and operations with x, y,...
Definition: Vector3.h:20
Vector3 & setX(float x)
Sets x component.
Definition: Vector3.h:109
Vector3 & setY(float y)
Sets y component.
Definition: Vector3.h:126
Vector3 & setZ(float z)
Sets z component.
Definition: Vector3.h:143
Vector4 class representing vector4 mathematical structure and operations with x, y,...
Definition: Vector4.h:22
float getY() const
Definition: Vector4.h:159
float getX() const
Definition: Vector4.h:142
float getW() const
Definition: Vector4.h:193
Vector4 & scale(float scalar)
Scales this vector4.
Definition: Vector4.h:264
Gizmo tool for views.
Definition: Gizmo.h:31
virtual ~Gizmo()
Destructor.
Definition: Gizmo.cpp:62
void setGizmoRotation(const Transform &transform)
Set gizmo rotation.
Definition: Gizmo.cpp:542
bool determineGizmoMovement(int mouseX, int mouseY, int axisIdx, const Vector3 &axis, Vector3 &deltaMovement)
Determine gizmo movement.
Definition: Gizmo.cpp:216
int32_t getGizmoTypeMask() const
Definition: Gizmo.h:127
void setGizmoMode(GizmoMode gizmoMode)
Set GIZMO mode.
Definition: Gizmo.h:167
void setEngine(Engine *engine)
Set engine.
Definition: Gizmo.h:120
array< Vector3, 3 > gizmoTranslationLastResult
Definition: Gizmo.h:79
array< bool, 3 > gizmoTranslationHandleDiffAvailable
Definition: Gizmo.h:76
bool determineGizmoDeltaTransformations(int mouseX, int mouseY, Vector3 &deltaTranslation, Vector3 &deltaRotation, Vector3 &deltaScale)
Determine GIZMO delta transform.
Definition: Gizmo.cpp:329
bool determineGizmoScale(int mouseX, int mouseY, int axisIdx, const Vector3 &axis, Vector3 &deltaScale)
Determine gizmo scale.
Definition: Gizmo.cpp:265
bool determineGizmoRotation(int mouseX, int mouseY, const array< Vector3, 4 > &vertices, const Vector3 &planeNormal, float &deltaRotation)
Determine rotation on a plane given by 4 vertices.
Definition: Gizmo.cpp:292
array< Vector3, 3 > gizmoTranslationHandleDiff
Definition: Gizmo.h:77
GizmoType getGizmoType() const
Definition: Gizmo.h:143
static constexpr float GIZMO_ORTHO_DEFAULT_Z
Definition: Gizmo.h:34
Vector3 computeOrthogonalGizmoCoordinate(const Vector3 &worldCoordinate)
Compute orthogonal gizmo coordinate.
Definition: Gizmo.h:89
void removeGizmo()
Remove gizmo.
Definition: Gizmo.cpp:208
void updateGizmo(const Vector3 &gizmoTranslation, const Transform &transform)
Update gizmo.
Definition: Gizmo.cpp:65
static constexpr float GIZMO_ORTHO_DEFAULT_SCALE
Definition: Gizmo.h:33
void setGizmoType(GizmoType gizmoType)
Set GIZMO type.
Definition: Gizmo.h:151
Gizmo(Engine *engine, const string &id, int32_t gizmoTypeMask=GIZMOTYPE_TRANSLATE|GIZMOTYPE_ROTATE|GIZMOTYPE_SCALE)
Public constructor.
Definition: Gizmo.cpp:46
GizmoMode getGizmoMode() const
Definition: Gizmo.h:159
bool determineGizmoMode(Entity *selectedEntity, Node *selectedEntityNode)
Select GIZMO mode.
Definition: Gizmo.cpp:515
array< bool, 3 > gizmoTranslationLastResultAvailable
Definition: Gizmo.h:78
void setGizmoTypeMask(int gizmoTypeMask)
Set GIZMO type mask.
Definition: Gizmo.h:135
#define FORBID_CLASS_COPY(CLASS)
Definition: tdme.h:6