gl_view.cpp 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. #include "gl_view.h"
  2. #include "../app/core/game_engine.h"
  3. #include <QOpenGLFramebufferObject>
  4. #include <QOpenGLFramebufferObjectFormat>
  5. #include <QQuickWindow>
  6. GLView::GLView() { setMirrorVertically(true); }
  7. QQuickFramebufferObject::Renderer *GLView::createRenderer() const {
  8. return new GLRenderer(m_engine);
  9. }
  10. QObject *GLView::engine() const { return m_engine; }
  11. void GLView::setEngine(QObject *eng) {
  12. if (m_engine == eng)
  13. return;
  14. m_engine = qobject_cast<GameEngine *>(eng);
  15. emit engineChanged();
  16. update();
  17. }
  18. GLView::GLRenderer::GLRenderer(QPointer<GameEngine> engine)
  19. : m_engine(engine) {}
  20. void GLView::GLRenderer::render() {
  21. if (!m_engine)
  22. return;
  23. m_engine->ensureInitialized();
  24. m_engine->update(1.0f / 60.0f);
  25. m_engine->render(m_size.width(), m_size.height());
  26. update();
  27. }
  28. QOpenGLFramebufferObject *
  29. GLView::GLRenderer::createFramebufferObject(const QSize &size) {
  30. m_size = size;
  31. QOpenGLFramebufferObjectFormat fmt;
  32. fmt.setAttachment(QOpenGLFramebufferObject::Depth);
  33. fmt.setSamples(0);
  34. return new QOpenGLFramebufferObject(size, fmt);
  35. }
  36. void GLView::GLRenderer::synchronize(QQuickFramebufferObject *item) {
  37. auto *view = static_cast<GLView *>(item);
  38. m_engine = qobject_cast<GameEngine *>(view->engine());
  39. }