You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

renderwidget.cpp 3.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. #include "renderwidget.h"
  2. #include <QTimer>
  3. #include <math.h>
  4. #include <QDebug>
  5. #include "entities/ugeentitycube.h"
  6. #include "entities/ugeentityaxes.h"
  7. #include "utils/wavefrontobj.h"
  8. #include "entities/ugeentitywavefrontobj.h"
  9. #include "cameras/rotationcamera.h"
  10. #include "cameras/freeflycamera.h"
  11. #include "gamecube.h"
  12. RenderWidget::RenderWidget(QWidget *parent) :
  13. QGLWidget(QGLFormat(QGL::SampleBuffers), parent)
  14. {
  15. setMouseTracking(true);
  16. setFocusPolicy(Qt::StrongFocus);
  17. setAutoFillBackground(false);
  18. setAutoBufferSwap(false);
  19. _engine = new UGameEngine(new OpenGLRenderDevice(this));
  20. _camera = new FreeFlyCamera(_engine, this);
  21. _engine->addEntity(new UGEEntityAxes(_engine));
  22. for (int i = 0; i < 1000; ++i) {
  23. UGEEntityCube* cube = new GameCube(_engine);
  24. cube->setTextureId("test");
  25. // cube->rotate(Vector3D(0.0, 45.0, 45.0));
  26. cube->move(Vector3D(0, i, i));
  27. // cube->setScale(Vector3D(1.0, 2.0, 1.0));
  28. _engine->addEntity(cube);
  29. _entities.append(cube);
  30. }
  31. WaveFrontObj* wavefrontObj = new WaveFrontObj(this);
  32. wavefrontObj->openFile("/home/robin/Downloads/enterprise/obj/USSEnterprise.obj");
  33. UGEEntityWaveFrontObj* obj = new UGEEntityWaveFrontObj(wavefrontObj, this);
  34. _engine->addEntity(obj);
  35. _entities.append(obj);
  36. animate();
  37. }
  38. void RenderWidget::initializeGL()
  39. {
  40. makeCurrent();
  41. _engine->setClearColor(Qt::gray);
  42. _engine->initialize(70, width(), height());
  43. _engine->loadTextureFromFile("test", "/home/robin/Downloads/test.png");
  44. }
  45. void RenderWidget::paintGL()
  46. {
  47. _camera->updateLookAt();
  48. _engine->draw();
  49. }
  50. void RenderWidget::resizeGL(int width, int height)
  51. {
  52. _engine->resize(width, height);
  53. }
  54. void RenderWidget::mousePressEvent(QMouseEvent *event)
  55. {
  56. _camera->mousePressEvent(event);
  57. if (event->buttons() & Qt::LeftButton) {
  58. // Vector3D pos = _engine->get3DFrom2D(Vector2D(event->x(), height() - event->y()));
  59. Vector3D pos = _camera->getDirection();
  60. qDebug() << pos.getX() << pos.getY() << pos.getZ();
  61. }
  62. }
  63. void RenderWidget::mouseReleaseEvent(QMouseEvent *event)
  64. {
  65. _camera->mouseReleaseEvent(event);
  66. }
  67. void RenderWidget::mouseMoveEvent(QMouseEvent *event)
  68. {
  69. _camera->mouseMoveEvent(event);
  70. // Vector3D dd = _device->get2DFrom3D(Vector3D(0.5, 0.5, 0.5));
  71. // dd.setY(height() - dd.getY());
  72. // qDebug() << event->pos() << dd;
  73. // pos = _device->get3DFrom2D(event->x(), height() - event->y());
  74. }
  75. void RenderWidget::mouseDoubleClickEvent(QMouseEvent *event)
  76. {
  77. _camera->mouseDoubleClickEvent(event);
  78. }
  79. void RenderWidget::wheelEvent(QWheelEvent *event)
  80. {
  81. _camera->wheelEvent(event);
  82. }
  83. void RenderWidget::keyPressEvent(QKeyEvent *event)
  84. {
  85. _camera->keyPressEvent(event);
  86. }
  87. void RenderWidget::keyReleaseEvent(QKeyEvent *event)
  88. {
  89. _camera->keyReleaseEvent(event);
  90. }
  91. void RenderWidget::paintEvent(QPaintEvent *event)
  92. {
  93. QGLWidget::paintEvent(event);
  94. int r = 20;
  95. QPainter p;
  96. p.begin(this);
  97. QPoint c(width() / 2, height() / 2);
  98. p.drawLine(c.x() - r, c.y(), c.x() + r, c.y());
  99. p.drawLine(c.x(), c.y() - r, c.x(), c.y() + r);
  100. p.end();
  101. swapBuffers();
  102. }
  103. void RenderWidget::animate()
  104. {
  105. // for (int i = 0; i < _entities.size(); ++i) {
  106. // _entities[i]->rotate(Vector3D(0.0, 2.0, 2.0));
  107. // }
  108. QTimer::singleShot(20, this, SLOT(animate()));
  109. update();
  110. }