30 #include <QtOpenGL/QtOpenGL>
61 m_autoRecalcAABBOnResize =
true;
64 CDIRECTOR->createCamera(k_QGLGameEditorViewport_CameraId);
88 if (++m_cameraSpeed == 4) {
97 return m_autoRecalcAABBOnResize;
103 m_autoRecalcAABBOnResize = v;
109 return m_selectedTransformMode;
115 m_selectedTransformMode = value;
121 return m_selectedManipulatorType;
127 m_selectedManipulatorType = value;
136 qglClearColor(Qt::black);
137 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
151 CCamera* active_camera =
CDIRECTOR->setActiveCameraHavingId(k_QGLGameEditorViewport_CameraId);
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;
169 camera_speed = k_QGLGameEditorViewport_CameraSpeed_Level1;
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;
251 glDisable(GL_DEPTH_TEST);
257 if (!manipulator_trans) {
258 LOG(
"Error!: Couldn't find node '__hidden_modifier_trans', manipulator won't be drawn");
259 glEnable(GL_DEPTH_TEST);
263 btVector3 scale = btVector3(k_CLRenderManager_ManipulatorsScaleValue,
264 k_CLRenderManager_ManipulatorsScaleValue,
265 k_CLRenderManager_ManipulatorsScaleValue);
267 CCamera* active_camera =
CDIRECTOR->setActiveCameraHavingId(k_QGLGameEditorViewport_CameraId);
270 scale *= (distance_to_camera * k_QGLGameEditorViewport_SizeFactor);
272 switch (m_selectedManipulatorType) {
279 SCALE, m_selectedTransformMode, scale);
287 m_selectedTransformMode, scale);
290 glEnable(GL_DEPTH_TEST);
300 QColor color_x = Qt::red;
301 QColor color_y = Qt::green;
302 QColor color_z = Qt::blue;
304 std::string manipulator_node_id =
"";
305 switch (manipulator_type) {
307 manipulator_node_id =
"__hidden_modifier_trans";
break;
309 manipulator_node_id =
"__hidden_modifier_scale";
break;
311 manipulator_node_id =
"__hidden_modifier_scale";
312 color_x = QColor(0, 0, 254);
313 color_y = QColor(0, 0, 253);
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);
328 manipulator_type ==
SCALE ||
342 manipulator_type ==
SCALE ||
355 manipulator_type ==
SCALE ||
368 QColor color_x = Qt::red;
369 QColor color_y = Qt::green;
370 QColor color_z = Qt::blue;
372 std::string manipulator_node_id =
"__hidden_modifier_rotation";
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);
421 btVector3 rp = btVector3(_x, _y, _z);
423 float dot_p = btVector3(motion_vec.x, motion_vec.y, 1).dot(rp);
435 scale = btVector3(dot_p, 0, 0);
438 scale = btVector3(0, dot_p, 0);
441 scale = btVector3(0, 0, dot_p);
445 scale = btVector3(1,1,1) * dot_p;
455 btMatrix3x3& object_rotation,
456 float distance_to_camera,
459 btVector3 translation_vec;
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);
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();
473 float dot_p = main_axis_2d.dot(motion_vec);
481 translation_vec *= dot_p;
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;
490 float distance_factor = (distance_to_camera / 2.0f) / 100.0f;
491 translation_vec *= distance_factor;
493 return translation_vec;
506 btQuaternion quat_diff;
508 motion_vec.set(dx, dy);
510 btVector3 translation_vec;
511 btMatrix3x3 rot_mat = btMatrix3x3();
515 rot_mat.setIdentity();
518 rot_mat = rot_mat.transpose();
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);
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);
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);
541 btVector3 b =
CDIRECTOR->getActiveCamera()->transform().localPosition();
543 float distance_to_camera = sqrtf(pow(b.x() - a.x(), 2) + pow(b.y() - a.y(), 2) + pow(b.z() - a.z(), 2));
545 switch (manipulator_type) {
586 y_axis.setZ(y_axis.z() * -1.0f);
589 y_axis = btVector3(tmp.x, tmp.y, tmp.z);
593 quat_diff = btQuaternion(0,
DEGTORAD(dot_p), 0);
598 x_axis.setZ(x_axis.z() * -1.0f);
601 x_axis = btVector3(tmp.x, tmp.y, tmp.z);
605 quat_diff = btQuaternion(
DEGTORAD(dot_p), 0, 0);
610 z_axis.setZ(z_axis.z() * -1.0f);
613 z_axis = btVector3(tmp.x, tmp.y, tmp.z);
617 quat_diff = btQuaternion(0, 0,
DEGTORAD(dot_p));
628 m_isFirstStep =
false;
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]);
639 if (picked_color == Qt::red || picked_color == QColor(0, 0, 254)) {
642 if (picked_color == Qt::green || picked_color == QColor(0, 0, 253)) {
645 if (picked_color == Qt::blue) {
655 uint selected_game_obj = 0;
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]);
665 for (QMap<uint, QColor>::Iterator it =
m_nodesColor.begin();
668 if (it.value() == picked_color) {
669 selected_game_obj = (uint)it.key();
673 return selected_game_obj;
680 GLfloat* color_array =
new GLfloat[3];
681 color_array[0] = color_array[1] = color_array[2] = 0.0f;
706 int x =
event->pos().x();
707 int y = height() -
event->pos().y();
729 dx = (dx > 10 ? 10 : dx);
730 dx = (dx < -10 ? -10 : dx);
731 dy = (dy > 10 ? 10 : dy);
732 dy = (dy < -10 ? -10 : dy);
737 CCamera* active_camera =
CDIRECTOR->setActiveCameraHavingId(k_QGLGameEditorViewport_CameraId);
766 switch (m_selectedManipulatorType) {
774 selected_manipulator =
SCALE;
787 m_isFirstStep =
true;
Matrix4 m_modelViewMatrix
QGLShaderProgram * m_solidColorsProgram
std::string m_previousActiveCameraId
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 mouseMoveEvent(QMouseEvent *event)
void drawRotationManipulatorsForNode(CLNode *node, Transform::TransformMode transform_mode, btVector3 &scale)
virtual void customDraw()
CGameObject * m_selectedGameObject
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.
virtual void drawSkybox()
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 drawCommonManipulatorsForNode(CLNode *node, ManipulatorTypes manipulator_type, Transform::TransformMode transform_mode, btVector3 &scale)
const CameraTransform & constTransform() const
QGLShaderProgram * m_texturedProgram
const Transform & constTransform() const
uint selectedGameObjectUID() const
CameraTransform & transform()
void setSelectedGameObjectUID(uint)
QGLGameEditorViewport(CLScene *collada_scene, CGameScene *game_scene)
void manipulatorMoved(ManipulatorTypes manipulator_type, int dx, int dy)
virtual void drawCrosshair()
virtual void drawGameObject(CGameObject *game_object)
btVector3 getAxisZ(btMatrix3x3 &m)
void mousePressEvent(QMouseEvent *event)
Transform::TransformMode selectedTransformMode() const
void mouseReleaseEvent(QMouseEvent *event)
CLNode * getNodeHavingId(const std::string &node_id)
#define UNDOABLEACTIONSMANAGER
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
btVector3 getAxisY(btMatrix3x3 &m)
void setSelectedTransformMode(const Transform::TransformMode &value)
QColorProvider m_colorProvider
#define SAFE_RELEASE_ARRAY(x)
virtual void customDraw()
QGLShaderProgram * m_selectedProgram
void selectedGameObjectTransformChanged(QGLGameEditorViewport::ManipulatorTypes)
void setSelectedManipulatorType(const ManipulatorTypes &value)
bool autoRecalcAABBOnResize() const
void setAutoRecalcAABBOnResize(bool)
static bool drawNode(QGLShaderProgram *program, CLScene *collada_scene, CLNode *node, QColor *color)
btVector3 getAxisX(btMatrix3x3 &m)