RioEngine  0.1
My first attempt to create a 3D WYSIWYG Game Engine
qglgameeditorviewport.cpp
Go to the documentation of this file.
1 //--------------------------------------------------------------- @License begins
2 // RioEngine: The late night Coke -without whores- debugging sessions
3 // 2012-2015 Leopoldo Lomas Flores. Torreon, Coahuila. MEXICO
4 // leopoldolomas [at] gmail
5 // www.rioengine.com
6 // www.leopoldolomas.info
7 // "You have a problem, you face it like a man."
8 //
9 // This is free and unencumbered software released into the public domain.
10 //
11 // Anyone is free to copy, modify, publish, use, compile, sell, or distribute this
12 // software, either in source code form or as a compiled binary, for any purpose,
13 // commercial or non-commercial, and by any means.
14 //
15 // In jurisdictions that recognize copyright laws, the author or authors of this
16 // software dedicate any and all copyright interest in the software to the public
17 // domain. We make this dedication for the benefit of the public at large and to
18 // the detriment of our heirs and successors. We intend this dedication to be
19 // an overt act of relinquishment in perpetuity of all present and future
20 // rights to this software under copyright law.
21 //
22 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
23 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,FITNESS
24 // FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE
25 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
26 // CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
27 // SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
28 //--------------------------------------------------------------- @License ends
29 
30 #include <QtOpenGL/QtOpenGL>
31 #include <math.h>
32 #include "constants.h"
33 #include "misc/transform.h"
34 #include "misc/matrixstack.h"
38 #include "cengine/ccamera.h"
39 #include "cengine/cdirector.h"
40 #include "clengine/clscene.h"
41 #include "clengine/clrenderer.h"
43 
44 //-----------------------------------------------------------------------------
45 
46 // WARNING! This file has lots of leftovers, I am aware of that, I really don't
47 // have time to code better solutions anymore.
48 // Continue reading at your own risk :B
49 
50 //-----------------------------------------------------------------------------
51 
52 QGLGameEditorViewport::QGLGameEditorViewport(CLScene* collada_scene, CGameScene* game_scene) : QGLGameViewport(collada_scene, NULL) {
54  m_selectedManipulatorType = NOMANIPULATOR;
55  m_selectedTransformMode = Transform::GLOBAL;
57  m_selectedGameObject = NULL;
60  m_cameraSpeed = 1;
61  m_autoRecalcAABBOnResize = true;
62  m_isFirstStep = true;
63 
64  CDIRECTOR->createCamera(k_QGLGameEditorViewport_CameraId);
65 }
66 
67 //-----------------------------------------------------------------------------
68 
70  m_selectedObjectUID = gameobj_uid;
71 }
72 
73 //-----------------------------------------------------------------------------
74 
76  return m_selectedObjectUID;
77 }
78 
79 //-----------------------------------------------------------------------------
80 
82  return m_cameraSpeed;
83 }
84 
85 //-----------------------------------------------------------------------------
86 
88  if (++m_cameraSpeed == 4) {
89  m_cameraSpeed = 1;
90  }
91  return m_cameraSpeed;
92 }
93 
94 //-----------------------------------------------------------------------------
95 
97  return m_autoRecalcAABBOnResize;
98 }
99 
100 //-----------------------------------------------------------------------------
101 
103  m_autoRecalcAABBOnResize = v;
104 }
105 
106 //-----------------------------------------------------------------------------
107 
109  return m_selectedTransformMode;
110 }
111 
112 //-----------------------------------------------------------------------------
113 
115  m_selectedTransformMode = value;
116 }
117 
118 //-----------------------------------------------------------------------------
119 
121  return m_selectedManipulatorType;
122 }
123 
124 //-----------------------------------------------------------------------------
125 
127  m_selectedManipulatorType = value;
128 }
129 
130 //-----------------------------------------------------------------------------
131 
133  if(CDIRECTOR->gameState() != CDirector::RUNNING) {
135  } else {
136  qglClearColor(Qt::black);
137  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
138  }
139 }
140 
141 //-----------------------------------------------------------------------------
142 
145  m_selectedGameObject = NULL;
146 
147  if (CDIRECTOR->getActiveCameraId() != m_previousActiveCameraId) {
148  m_previousActiveCameraId = CDIRECTOR->getActiveCameraId();
149  }
150 
151  CCamera* active_camera = CDIRECTOR->setActiveCameraHavingId(k_QGLGameEditorViewport_CameraId);
153  m_selectedProgram->bind();
154 
155  if (m_drawMode == SOLIDCOLORS) {
156  m_nodesColor = QMap<uint, QColor>();
159  m_clearColor = Qt::black;
160  }
161 
162  if (hasFocus()) {
163  float camera_speed = 0.0f;
164  switch (m_cameraSpeed) {
165  case 1: camera_speed = k_QGLGameEditorViewport_CameraSpeed_Level1; break;
166  case 2: camera_speed = k_QGLGameEditorViewport_CameraSpeed_Level2; break;
167  case 3: camera_speed = k_QGLGameEditorViewport_CameraSpeed_Level3; break;
168  default:
169  camera_speed = k_QGLGameEditorViewport_CameraSpeed_Level1;
170  }
171 
172  if (INPUTMANAGER->getWheelVelocity() > 0.0f) {
173  active_camera->transform().moveZ(k_QGLGameEditorViewport_DefaultCameraDisplacement * camera_speed * 7.0f, Transform::LOCAL);
174  } else if (INPUTMANAGER->getWheelVelocity() < 0.0f) {
175  active_camera->transform().moveZ(-k_QGLGameEditorViewport_DefaultCameraDisplacement * camera_speed * 7.0f, Transform::LOCAL);
176  }
177 
178  if (INPUTMANAGER->getKeyDown('W')) {
179  active_camera->transform().moveZ(k_QGLGameEditorViewport_DefaultCameraDisplacement * camera_speed, Transform::LOCAL);
180  } else if (INPUTMANAGER->getKeyDown('S')) {
181  active_camera->transform().moveZ(-k_QGLGameEditorViewport_DefaultCameraDisplacement * camera_speed, Transform::LOCAL);
182  }
183 
184  if (INPUTMANAGER->getKeyDown('A')) {
185  active_camera->transform().moveX(-k_QGLGameEditorViewport_DefaultCameraDisplacement * camera_speed, Transform::LOCAL);
186  } else if (INPUTMANAGER->getKeyDown('D'))
187  {
188  active_camera->transform().moveX(k_QGLGameEditorViewport_DefaultCameraDisplacement * camera_speed, Transform::LOCAL);
189  }
190 
191  if (INPUTMANAGER->getKeyDown(VK_UP)) {
192  active_camera->transform().rotateX(-1.0f);
193  } else if (INPUTMANAGER->getKeyDown(VK_DOWN)) {
194  active_camera->transform().rotateX(1.0f);
195  }
196 
197  if (INPUTMANAGER->getKeyDown(VK_LEFT)) {
198  active_camera->transform().rotateY(-1.0f);
199  } else if (INPUTMANAGER->getKeyDown(VK_RIGHT)) {
200  active_camera->transform().rotateY(1.0f);
201  }
202  }
203 }
204 
205 //-----------------------------------------------------------------------------
206 
209 
210  if (m_selectedObjectUID != 0) {
212  }
213 }
214 
215 //-----------------------------------------------------------------------------
216 
219  m_clearColor = QColor(160, 200, 250); // TODO move these values to constants.h?
220 
221  if (m_previousActiveCameraId != "") {
222  CDIRECTOR->setActiveCameraHavingId(m_previousActiveCameraId);
224  }
225 }
226 
227 //-----------------------------------------------------------------------------
228 
230  if (m_drawMode == SOLIDCOLORS) {
231  QColor color = m_colorProvider.nextColor();
232  m_nodesColor.insert(node->uid(), color);
233 
234  GLfloat* color_array = new GLfloat[3];
235  color_array[0] = (float)color.red() / 255.0f;
236  color_array[1] = (float)color.green() / 255.0f;
237  color_array[2] = (float)color.blue() / 255.0f;
238  m_selectedProgram->setAttributeValue(2, (const GLfloat*)color_array, 1, 3);
239  SAFE_RELEASE(color_array);
240  }
242 
243  if (node->uid() == m_selectedObjectUID) {
244  m_selectedGameObject = node;
245  }
246 }
247 
248 //-----------------------------------------------------------------------------
249 
251  glDisable(GL_DEPTH_TEST);
252  const CGameObject* game_obj = CDIRECTOR->currentGameScene()->getGameObject(uid);
253  RE_ASSERT(game_obj);
254 
255  CLNode* manipulator_trans = m_colladaScene->getNodeHavingId("__hidden_modifier_trans");
256 
257  if (!manipulator_trans) {
258  LOG("Error!: Couldn't find node '__hidden_modifier_trans', manipulator won't be drawn");
259  glEnable(GL_DEPTH_TEST);
260  return;
261  }
262 
263  btVector3 scale = btVector3(k_CLRenderManager_ManipulatorsScaleValue,
264  k_CLRenderManager_ManipulatorsScaleValue,
265  k_CLRenderManager_ManipulatorsScaleValue);
266 
267  CCamera* active_camera = CDIRECTOR->setActiveCameraHavingId(k_QGLGameEditorViewport_CameraId);
268 
269  float distance_to_camera = (active_camera->constTransform().localPosition() - (game_obj->constTransform().localPosition() * k_QGLGameEditorViewport_SizeFactor)).length();
270  scale *= (distance_to_camera * k_QGLGameEditorViewport_SizeFactor);
271 
272  switch (m_selectedManipulatorType) {
273  case TRANSLATION:
275  TRANSLATION, m_selectedTransformMode, scale);
276  break;
277  case SCALE:
279  SCALE, m_selectedTransformMode, scale);
280  break;
281  case UNIFORMSCALE:
283  UNIFORMSCALE, m_selectedTransformMode, scale);
284  break;
285  case ROTATION:
287  m_selectedTransformMode, scale);
288  break;
289  }
290  glEnable(GL_DEPTH_TEST);
291 }
292 
293 //-----------------------------------------------------------------------------
294 
295 void QGLGameEditorViewport::drawCommonManipulatorsForNode(CLNode* node, ManipulatorTypes manipulator_type, Transform::TransformMode transform_mode, btVector3 &scale) {
296  if (manipulator_type == NOMANIPULATOR || manipulator_type == ROTATION) {
297  return;
298  }
299 
300  QColor color_x = Qt::red;
301  QColor color_y = Qt::green;
302  QColor color_z = Qt::blue;
303 
304  std::string manipulator_node_id = "";
305  switch (manipulator_type) {
306  case TRANSLATION:
307  manipulator_node_id = "__hidden_modifier_trans"; break;
308  case SCALE:
309  manipulator_node_id = "__hidden_modifier_scale"; break;
310  case UNIFORMSCALE:
311  manipulator_node_id = "__hidden_modifier_scale";
312  color_x = QColor(0, 0, 254);
313  color_y = QColor(0, 0, 253);
314  color_z = Qt::blue;
315  break;
316  }
317 
318  CLNode* manipulator_node = m_colladaScene->getNodeHavingId(manipulator_node_id);
319 
320  if (!manipulator_node) {
321  LOG("Error!: Couldn't find node '%s', manipulator won't be drawn", manipulator_node_id.c_str());
322  glEnable(GL_DEPTH_TEST);
323  return;
324  }
325  MATRIXSTACK->pushMatrix();
326  MATRIXSTACK->translate(node->transform().localPosition());
327  if (transform_mode == Transform::LOCAL ||
328  manipulator_type == SCALE ||
329  manipulator_type == UNIFORMSCALE) {
330  MATRIXSTACK->rotate(node->transform().localRotation());
331  }
332 
333  MATRIXSTACK->rotate(0, DEGTORAD(90.0f),0);
334  MATRIXSTACK->scale(scale);
335  MATRIXSTACK->translate(0.0f,0.0f,2.0f);
336  CLRenderer::drawNode(m_selectedProgram, m_colladaScene, manipulator_node, &color_x);
337  MATRIXSTACK->popMatrix();
338 
339  MATRIXSTACK->pushMatrix();
340  MATRIXSTACK->translate(node->transform().localPosition());
341  if (transform_mode == Transform::LOCAL ||
342  manipulator_type == SCALE ||
343  manipulator_type == UNIFORMSCALE) {
344  MATRIXSTACK->rotate(node->transform().localRotation());
345  }
346  MATRIXSTACK->rotate(DEGTORAD(-90.0f), 0, 0);
347  MATRIXSTACK->scale(scale);
348  MATRIXSTACK->translate(0, 0, 2.0f);
349  CLRenderer::drawNode(m_selectedProgram, m_colladaScene, manipulator_node, &color_y);
350  MATRIXSTACK->popMatrix();
351 
352  MATRIXSTACK->pushMatrix();
353  MATRIXSTACK->translate(node->transform().localPosition());
354  if (transform_mode == Transform::LOCAL ||
355  manipulator_type == SCALE ||
356  manipulator_type == UNIFORMSCALE) {
357  MATRIXSTACK->rotate(node->transform().localRotation());
358  }
359  MATRIXSTACK->scale(scale);
360  MATRIXSTACK->translate(0, 0, 2.0f);
361  CLRenderer::drawNode(m_selectedProgram, m_colladaScene, manipulator_node, &color_z);
362  MATRIXSTACK->popMatrix();
363 }
364 
365 //-----------------------------------------------------------------------------
366 
368  QColor color_x = Qt::red;
369  QColor color_y = Qt::green;
370  QColor color_z = Qt::blue;
371 
372  std::string manipulator_node_id = "__hidden_modifier_rotation";
373  CLNode* manipulator_node = m_colladaScene->getNodeHavingId(manipulator_node_id);
374 
375  if (!manipulator_node) {
376  LOG("Error!: Couldn't find node '%s', manipulator won't be drawn", manipulator_node_id.c_str());
377  glEnable(GL_DEPTH_TEST);
378  return;
379  }
380 
381  // Z
382  MATRIXSTACK->pushMatrix();
383  MATRIXSTACK->translate(node->transform().localPosition());
384  if (transform_mode == Transform::LOCAL) {
385  MATRIXSTACK->rotate(node->transform().localRotation());
386  }
387  MATRIXSTACK->rotate(DEGTORAD(90.0f), 0, 0);
388  MATRIXSTACK->scale(scale * 1.5f);
389  CLRenderer::drawNode(m_selectedProgram, m_colladaScene, manipulator_node, &color_z);
390  MATRIXSTACK->popMatrix();
391 
392  // Y
393  MATRIXSTACK->pushMatrix();
394  MATRIXSTACK->translate(node->transform().localPosition());
395  if (transform_mode == Transform::LOCAL) {
396  MATRIXSTACK->rotate(node->transform().localRotation());
397  }
398  MATRIXSTACK->scale(scale * 1.5f);
399  CLRenderer::drawNode(m_selectedProgram, m_colladaScene, manipulator_node, &color_y);
400  MATRIXSTACK->popMatrix();
401 
402  // X
403  MATRIXSTACK->pushMatrix();
404  MATRIXSTACK->translate(node->transform().localPosition());
405  if (transform_mode == Transform::LOCAL) {
406  MATRIXSTACK->rotate(node->transform().localRotation());
407  }
408  MATRIXSTACK->rotate(0, DEGTORAD(90.0f), 0);
409  MATRIXSTACK->rotate(DEGTORAD(90.0f), 0, 0);
410  MATRIXSTACK->scale(scale * 1.5f);
411  CLRenderer::drawNode(m_selectedProgram, m_colladaScene, manipulator_node, &color_x);
412  MATRIXSTACK->popMatrix();
413 }
414 
415 //-----------------------------------------------------------------------------
416 
417 float QGLGameEditorViewport::getMotionThroughAxis(btVector3 &axis, Vector2 motion_vec) {
418  float _x = btCustom::right().dot(axis);
419  float _y = btCustom::up().dot(axis);
420  float _z = btCustom::forward().dot(axis);
421  btVector3 rp = btVector3(_x, _y, _z);
422  rp.normalize();
423  float dot_p = btVector3(motion_vec.x, motion_vec.y, 1).dot(rp);
424 
425  return dot_p;
426 }
427 
428 //-----------------------------------------------------------------------------
429 
430 btVector3 QGLGameEditorViewport::calcScaleVec(AxisTypes direction, float dot_p, bool uniform) {
431  btVector3 scale;
432  if (!uniform) {
433  switch (direction) {
434  case X:
435  scale = btVector3(dot_p, 0, 0);
436  break;
437  case Y:
438  scale = btVector3(0, dot_p, 0);
439  break;
440  case Z:
441  scale = btVector3(0, 0, dot_p);
442  break;
443  }
444  } else {
445  scale = btVector3(1,1,1) * dot_p;
446  }
447  scale *= 0.05f;
448  return scale;
449 }
450 
451 //-----------------------------------------------------------------------------
452 
453 btVector3 QGLGameEditorViewport::calcTranslationVec(btVector3& main_axis,
454  Vector2 motion_vec,
455  btMatrix3x3& object_rotation,
456  float distance_to_camera,
457  Transform::TransformMode transform_mode,
458  AxisTypes axis) {
459  btVector3 translation_vec;
460 
461  if(main_axis.x() == 0.0f &&
462  main_axis.y() == 0.0f &&
463  main_axis.z() != 0.0f) {
464  main_axis.setY(main_axis.z());
465  main_axis.setZ(0.0f);
466  }
467 
468  Vector2 main_axis_2d = Vector2(main_axis.x(), main_axis.y());
469  if(!(main_axis_2d.x == 0 && main_axis_2d.y == 0)) {
470  main_axis_2d.normalize();
471  }
472 
473  float dot_p = main_axis_2d.dot(motion_vec);
474 
475  if (transform_mode == Transform::LOCAL) {
476  switch (axis) {
477  case X: translation_vec = btCustom::getAxisX(object_rotation); break;
478  case Y: translation_vec = btCustom::getAxisY(object_rotation); break;
479  case Z: translation_vec = btCustom::getAxisZ(object_rotation); break;
480  }
481  translation_vec *= dot_p;
482  } else {
483  switch (axis) {
484  case X: translation_vec = btVector3(dot_p, 0, 0); break;
485  case Y: translation_vec = btVector3(0, dot_p, 0); break;
486  case Z: translation_vec = btVector3(0, 0, dot_p); break;
487  }
488 
489  }
490  float distance_factor = (distance_to_camera / 2.0f) / 100.0f;
491  translation_vec *= distance_factor;
492 
493  return translation_vec;
494 }
495 
496 //-----------------------------------------------------------------------------
497 
498 void QGLGameEditorViewport::manipulatorMoved(ManipulatorTypes manipulator_type, int dx, int dy) {
499  if (manipulator_type == NOMANIPULATOR) {
500  return;
501  }
502 
503  Transform* transform = &m_selectedGameObject->transform();
504  Vector4 tmp;
505 
506  btQuaternion quat_diff;
507  Vector2 motion_vec;
508  motion_vec.set(dx, dy);
509 
510  btVector3 translation_vec;
511  btMatrix3x3 rot_mat = btMatrix3x3();
512  if(m_selectedTransformMode == Transform::LOCAL) {
513  rot_mat = transform->local().getInnerTransform().getBasis();
514  } else {
515  rot_mat.setIdentity();
516  }
517 
518  rot_mat = rot_mat.transpose();
519 
520  if(m_isFirstStep) {
521  x_axis = btCustom::getAxisX(rot_mat);
522  x_axis.setZ(x_axis.getZ() * -1.0f);
523  tmp = m_modelViewMatrix * Vector4(x_axis.getX(), x_axis.getY(), x_axis.getZ(), 0);
524  x_axis = btVector3(tmp.x, tmp.y, tmp.z);
525  x_axis.normalize();
526 
527  y_axis = btCustom::getAxisY(rot_mat);
528  y_axis.setZ(y_axis.getZ() * -1.0f);
529  tmp = m_modelViewMatrix * Vector4(y_axis.getX(), y_axis.getY(), y_axis.getZ(), 0);
530  y_axis = btVector3(tmp.x, tmp.y, tmp.z);
531  y_axis.normalize();
532 
533  z_axis = btCustom::getAxisZ(rot_mat);
534  z_axis.setZ(z_axis.getZ() * -1.0f);
535  tmp = m_modelViewMatrix * Vector4(z_axis.getX(), z_axis.getY(), z_axis.getZ(), 0);
536  z_axis = btVector3(tmp.x, tmp.y, tmp.z);
537  z_axis.normalize();
538  }
539 
540  btVector3 a = transform->localPosition();
541  btVector3 b = CDIRECTOR->getActiveCamera()->transform().localPosition();
542 
543  float distance_to_camera = sqrtf(pow(b.x() - a.x(), 2) + pow(b.y() - a.y(), 2) + pow(b.z() - a.z(), 2));
544 
545  switch (manipulator_type) {
546  case TRANSLATION: {
547  switch (m_selectedAxis) {
548  case X: {
549  translation_vec = calcTranslationVec(x_axis, motion_vec, rot_mat, distance_to_camera,
550  m_selectedTransformMode, m_selectedAxis);
551  } break;
552  case Y: {
553  translation_vec = calcTranslationVec(y_axis, motion_vec, rot_mat,distance_to_camera,
554  m_selectedTransformMode, m_selectedAxis);
555  } break;
556  case Z: {
557  translation_vec = calcTranslationVec(z_axis, motion_vec, rot_mat,distance_to_camera,
558  m_selectedTransformMode, m_selectedAxis);
559  } break;
560  }
561  transform->setLocalPosition(transform->localPosition() + translation_vec);
562  } break;
563  case SCALE:
564  case UNIFORMSCALE: {
565  btVector3 axis;
566  switch (m_selectedAxis) {
567  case X: {
568  axis = x_axis;
569  } break;
570  case Y: {
571  axis = y_axis;
572  } break;
573  case Z: {
574  axis = z_axis;
575  } break;
576  }
577  float dot_p = getMotionThroughAxis(axis, motion_vec);
578  transform->setLocalScale(transform->localScale() + calcScaleVec(m_selectedAxis, dot_p, manipulator_type == UNIFORMSCALE));
579  } break;
580 
581  case ROTATION: {
582  switch (m_selectedAxis) {
583  case X: {
584  if(m_isFirstStep) {
585  y_axis = btCustom::getAxisY(rot_mat);
586  y_axis.setZ(y_axis.z() * -1.0f);
587  }
588  tmp = m_modelViewMatrix * Vector4(y_axis.x(), y_axis.y(), y_axis.z(), 0);
589  y_axis = btVector3(tmp.x, tmp.y, tmp.z);
590  y_axis.normalize();
591 
592  float dot_p = getMotionThroughAxis(y_axis, motion_vec);
593  quat_diff = btQuaternion(0, DEGTORAD(dot_p), 0);
594  } break;
595  case Y: {
596  if(m_isFirstStep) {
597  x_axis = btCustom::getAxisX(rot_mat);
598  x_axis.setZ(x_axis.z() * -1.0f);
599  }
600  tmp = m_modelViewMatrix * Vector4(x_axis.x(), x_axis.y(), x_axis.z(), 0);
601  x_axis = btVector3(tmp.x, tmp.y, tmp.z);
602  x_axis.normalize();
603 
604  float dot_p = getMotionThroughAxis(x_axis, motion_vec);
605  quat_diff = btQuaternion(DEGTORAD(dot_p), 0, 0);
606  } break;
607  case Z: {
608  if(m_isFirstStep) {
609  z_axis = btCustom::getAxisZ(rot_mat);
610  z_axis.setZ(z_axis.z() * -1.0f);
611  }
612  tmp = m_modelViewMatrix * Vector4(z_axis.x(), z_axis.y(), z_axis.z(), 0);
613  z_axis = btVector3(tmp.x, tmp.y, tmp.z);
614  z_axis.normalize();
615 
616  float dot_p = getMotionThroughAxis(z_axis, motion_vec);
617  quat_diff = btQuaternion(0, 0, DEGTORAD(dot_p));
618  } break;
619  }
620  if (m_selectedTransformMode == Transform::LOCAL) {
621  transform->setLocalRotation(transform->localRotation() * quat_diff);
622  } else {
623  transform->setLocalRotation(quat_diff * transform->localRotation());
624  }
625  }
626  break;
627  }
628  m_isFirstStep = false;
629 }
630 
631 //-----------------------------------------------------------------------------
632 
634  GLubyte *data = new GLubyte[3];
635  glReadPixels(x, y, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, data);
636  QColor picked_color = QColor(data[0], data[1], data[2]);
637  SAFE_RELEASE_ARRAY(data);
638 
639  if (picked_color == Qt::red || picked_color == QColor(0, 0, 254)) {
640  return X;
641  }
642  if (picked_color == Qt::green || picked_color == QColor(0, 0, 253)) {
643  return Y;
644  }
645  if (picked_color == Qt::blue) {
646  return Z;
647  }
648 
649  return NOAXIS;
650 }
651 
652 //-----------------------------------------------------------------------------
653 
655  uint selected_game_obj = 0;
657 
658  paintGL(); // redraw the scene using only solid colors
659 
660  GLubyte *data = new GLubyte[3];
661  glReadPixels(x, y, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, data);
662  QColor picked_color = QColor(data[0], data[1], data[2]);
663  SAFE_RELEASE_ARRAY(data);
664 
665  for (QMap<uint, QColor>::Iterator it = m_nodesColor.begin();
666  it != m_nodesColor.end();
667  it++) {
668  if (it.value() == picked_color) {
669  selected_game_obj = (uint)it.key();
670  }
671  }
672 
673  return selected_game_obj;
674 }
675 
676 //-----------------------------------------------------------------------------
677 
679  if (m_drawMode == SOLIDCOLORS) {
680  GLfloat* color_array = new GLfloat[3];
681  color_array[0] = color_array[1] = color_array[2] = 0.0f;
682  m_selectedProgram->setAttributeValue(2, (const GLfloat*)color_array, 1, 3);
683  SAFE_RELEASE(color_array);
684  }
686 }
687 
689  // CDirector->step() will call InputManager->update(), we don't want that to
690  // happen since it is already being called from the GameWindow's Viewport.
691  // So let's call CDIRECTOR->step() only if the game is not running yet.
692  if(CDIRECTOR->gameState() != CDirector::RUNNING) {
693  CDIRECTOR->step();
694  }
695 }
696 
697 //-----------------------------------------------------------------------------
698 
700  // Intentionally overridden, we don't want the crosshair drawn on the Editor
701 }
702 
703 //-----------------------------------------------------------------------------
704 
705 void QGLGameEditorViewport::mousePressEvent(QMouseEvent *event) {
706  int x = event->pos().x();
707  int y = height() - event->pos().y(); // "y" needs to be inverted for OpenGL
708 
709  if (CDIRECTOR->gameState() != CDirector::RUNNING &&
710  event->button() == Qt::LeftButton) {
711  m_selectedAxis = selectAxis(x, y);
712 
713  if (m_selectedAxis == NOAXIS) {
716  } else {
718  }
719  }
720 }
721 
722 //-----------------------------------------------------------------------------
723 
724 void QGLGameEditorViewport::mouseMoveEvent(QMouseEvent *event) {
725  int dx = event->x() - m_lastPos.x();
726  int dy = event->y() - m_lastPos.y();
727 
728  // clamp dx & dy between -10 and +10
729  dx = (dx > 10 ? 10 : dx);
730  dx = (dx < -10 ? -10 : dx);
731  dy = (dy > 10 ? 10 : dy);
732  dy = (dy < -10 ? -10 : dy);
733 
734  if (CDIRECTOR->getActiveCameraId() != m_previousActiveCameraId) {
735  m_previousActiveCameraId = CDIRECTOR->getActiveCameraId();
736  }
737  CCamera* active_camera = CDIRECTOR->setActiveCameraHavingId(k_QGLGameEditorViewport_CameraId);
738 
739  if (m_selectedAxis != NOAXIS) {
740  manipulatorMoved(m_selectedManipulatorType, dx, -dy);
741  } else if (event->buttons() & Qt::MiddleButton) { // if the middle button is pressed then pan the camera
742  active_camera->transform().moveX((float)dx * 0.05f, Transform::LOCAL);
743  active_camera->transform().moveY((float)-dy * 0.05f, Transform::LOCAL);
744  } else if (event->buttons() & Qt::RightButton) {
745  active_camera->transform().rotateX((float)dy * 0.25f);
746  active_camera->transform().rotateY((float)dx * 0.25f);
747  }
748 
749  m_lastPos = event->pos();
750 
751  if (m_previousActiveCameraId != "") {
752  CDIRECTOR->setActiveCameraHavingId(m_previousActiveCameraId);
754  }
755 }
756 
757 //-----------------------------------------------------------------------------
758 
760  TranslateAction* translate_action = NULL;
761  ScaleAction* scale_action = NULL;
762  RotateAction* rotate_action = NULL;
763 
764  if (m_selectedAxis != NOAXIS) {
765  ManipulatorTypes selected_manipulator = NOMANIPULATOR;
766  switch (m_selectedManipulatorType) {
767  case TRANSLATION:
768  selected_manipulator = TRANSLATION;
770  UNDOABLEACTIONSMANAGER->pushUndoAction((IUndoableAction*)translate_action);
771  break;
772  case SCALE:
773  case UNIFORMSCALE:
774  selected_manipulator = SCALE;
775  scale_action = new ScaleAction(m_selectedGameObject, m_oldTransform.localScale(), m_autoRecalcAABBOnResize);
776  UNDOABLEACTIONSMANAGER->pushUndoAction((IUndoableAction*)scale_action);
777  break;
778  case ROTATION:
779  selected_manipulator = ROTATION;
781  UNDOABLEACTIONSMANAGER->pushUndoAction((IUndoableAction*)rotate_action);
782  break;
783  }
784  emit(selectedGameObjectTransformChanged(selected_manipulator));
785  }
787  m_isFirstStep = true;
788 }
789 
790 //-----------------------------------------------------------------------------
791 
792 void QGLGameEditorViewport::wheelEvent(QWheelEvent* event) {
793  INPUTMANAGER->setWheelVelocity((float)event->delta());
794 }
795 
796 //-----------------------------------------------------------------------------
797 
799 }
btCustomTransform & local(bool scale=true) const
Definition: transform.cpp:302
CLScene * m_colladaScene
virtual void paintGL()
#define LOG
Definition: macro.h:43
Matrix4 m_modelViewMatrix
QGLShaderProgram * m_solidColorsProgram
btQuaternion localRotation() const
Definition: transform.cpp:132
void newGameObjectSelected(uint)
btVector3 calcScaleVec(AxisTypes, float, bool)
Calculates the differential scale vector based upon the given axis direction and differential size...
virtual void drawGameObject(CGameObject *game_object)
AxisTypes selectAxis(int x, int y)
Returns the picked axis by the user.
void setLocalScale(float x, float y, float z)
Definition: transform.cpp:180
void mouseMoveEvent(QMouseEvent *event)
void drawRotationManipulatorsForNode(CLNode *node, Transform::TransformMode transform_mode, btVector3 &scale)
virtual void customDraw()
Definition: clnode.h:37
virtual void drawSkybox()
float getMotionThroughAxis(btVector3 &, Vector2)
Determines how parallel is the mouse movement to a manipulator axis.
uint selectObject(int x, int y)
Returns the selected game object (if any) at the given coordinates.
const btVector3 & localPosition(UnitType unit_type=WORLD) const
Definition: transform.cpp:105
btVector3 calcTranslationVec(btVector3 &, Vector2, btMatrix3x3 &, float, Transform::TransformMode, AxisTypes)
Calculates the differential translation vector based upon the object's position, rotation, and the motion vector.
void wheelEvent(QWheelEvent *event)
void moveX(float dx, TransformMode transform_mode=GLOBAL)
Definition: transform.cpp:242
void setLocalRotation(float w, float x, float y, float z)
Definition: transform.cpp:209
void drawCommonManipulatorsForNode(CLNode *node, ManipulatorTypes manipulator_type, Transform::TransformMode transform_mode, btVector3 &scale)
const CameraTransform & constTransform() const
Definition: ccamera.cpp:48
#define MATRIXSTACK
Definition: matrixstack.h:38
QGLShaderProgram * m_texturedProgram
const Transform & constTransform() const
Definition: clnode.cpp:75
void moveY(float dy, TransformMode transform_mode=GLOBAL)
Definition: transform.cpp:250
void moveZ(float dz, TransformMode transform_mode=GLOBAL)
Definition: transform.cpp:258
CameraTransform & transform()
Definition: ccamera.cpp:42
virtual void preDraw()
QGLGameEditorViewport(CLScene *collada_scene, CGameScene *game_scene)
void manipulatorMoved(ManipulatorTypes manipulator_type, int dx, int dy)
btVector3 up()
Definition: btcustom.cpp:49
virtual void drawGameObject(CGameObject *game_object)
btVector3 right()
Definition: btcustom.cpp:32
btVector3 getAxisZ(btMatrix3x3 &m)
Definition: btcustom.cpp:20
void mousePressEvent(QMouseEvent *event)
Transform::TransformMode selectedTransformMode() const
void mouseReleaseEvent(QMouseEvent *event)
bool hasFocus() const
CLNode * getNodeHavingId(const std::string &node_id)
Definition: clscene.cpp:111
#define SAFE_RELEASE(x)
Definition: cobject.h:36
#define UNDOABLEACTIONSMANAGER
btVector3 localScale() const
Definition: transform.cpp:123
void drawManipulatorsForGameObject(uint uid)
Draws the Translation, Rotation or Scale manipulators for the given game object's unique id...
ManipulatorTypes selectedManipulatorType() const
QMap< uint, QColor > m_nodesColor
void rotateX(float angle, TransformMode transform_mode=GLOBAL)
Definition: transform.cpp:277
btVector3 getAxisY(btMatrix3x3 &m)
Definition: btcustom.cpp:14
void setSelectedTransformMode(const Transform::TransformMode &value)
#define RE_ASSERT
Definition: macro.h:57
btTransform & getInnerTransform()
#define DEGTORAD(x)
Definition: macro.h:52
#define SAFE_RELEASE_ARRAY(x)
Definition: cobject.h:37
btVector3 forward()
Definition: btcustom.cpp:66
#define CDIRECTOR
Definition: cdirector.h:37
void setLocalPosition(float x, float y, float z)
Definition: transform.cpp:165
QGLShaderProgram * m_selectedProgram
void selectedGameObjectTransformChanged(QGLGameEditorViewport::ManipulatorTypes)
void setSelectedManipulatorType(const ManipulatorTypes &value)
#define INPUTMANAGER
Definition: inputmanager.h:39
void rotateY(float angle, TransformMode transform_mode=GLOBAL)
Definition: transform.cpp:284
Transform & transform()
Definition: clnode.cpp:69
static bool drawNode(QGLShaderProgram *program, CLScene *collada_scene, CLNode *node, QColor *color)
Definition: clrenderer.cpp:41
btVector3 getAxisX(btMatrix3x3 &m)
Definition: btcustom.cpp:8