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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  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. qDebug() << pos.getX() << pos.getY() << pos.getZ();
  60. }
  61. }
  62. void RenderWidget::mouseReleaseEvent(QMouseEvent *event)
  63. {
  64. _camera->mouseReleaseEvent(event);
  65. }
  66. void RenderWidget::mouseMoveEvent(QMouseEvent *event)
  67. {
  68. _camera->mouseMoveEvent(event);
  69. // Vector3D dd = _device->get2DFrom3D(Vector3D(0.5, 0.5, 0.5));
  70. // dd.setY(height() - dd.getY());
  71. // qDebug() << event->pos() << dd;
  72. // pos = _device->get3DFrom2D(event->x(), height() - event->y());
  73. }
  74. void RenderWidget::mouseDoubleClickEvent(QMouseEvent *event)
  75. {
  76. _camera->mouseDoubleClickEvent(event);
  77. }
  78. void RenderWidget::wheelEvent(QWheelEvent *event)
  79. {
  80. _camera->wheelEvent(event);
  81. }
  82. void RenderWidget::keyPressEvent(QKeyEvent *event)
  83. {
  84. _camera->keyPressEvent(event);
  85. }
  86. void RenderWidget::keyReleaseEvent(QKeyEvent *event)
  87. {
  88. _camera->keyReleaseEvent(event);
  89. }
  90. void RenderWidget::paintEvent(QPaintEvent *event)
  91. {
  92. QGLWidget::paintEvent(event);
  93. int r = 20;
  94. QPainter p;
  95. p.begin(this);
  96. QPoint c(width() / 2, height() / 2);
  97. p.drawLine(c.x() - r, c.y(), c.x() + r, c.y());
  98. p.drawLine(c.x(), c.y() - r, c.x(), c.y() + r);
  99. p.end();
  100. swapBuffers();
  101. }
  102. void RenderWidget::animate()
  103. {
  104. // for (int i = 0; i < _entities.size(); ++i) {
  105. // _entities[i]->rotate(Vector3D(0.0, 2.0, 2.0));
  106. // }
  107. QTimer::singleShot(20, this, SLOT(animate()));
  108. update();
  109. }