qmlfrontend/game_view.cpp
author unC0Rr
Sun, 19 May 2024 15:55:26 +0200
changeset 16015 0e90bdfc2642
parent 16010 a73b9770467a
child 16017 e8afb1bf2779
permissions -rw-r--r--
Handle game view resize
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
14290
92e5682810d4 Prepare to have possibility to pass opengl context to engine
unc0rr
parents: 14154
diff changeset
     1
#include "game_view.h"
14143
745c73e0e644 Start working on frontend to rust engine rewrite
unC0Rr
parents:
diff changeset
     2
745c73e0e644 Start working on frontend to rust engine rewrite
unC0Rr
parents:
diff changeset
     3
#include <QtQuick/qquickwindow.h>
16010
a73b9770467a Port QML frontend to Qt6, use rendering to framebuffer object
unC0Rr
parents: 15895
diff changeset
     4
14143
745c73e0e644 Start working on frontend to rust engine rewrite
unC0Rr
parents:
diff changeset
     5
#include <QCursor>
16010
a73b9770467a Port QML frontend to Qt6, use rendering to framebuffer object
unC0Rr
parents: 15895
diff changeset
     6
#include <QOpenGLFramebufferObjectFormat>
a73b9770467a Port QML frontend to Qt6, use rendering to framebuffer object
unC0Rr
parents: 15895
diff changeset
     7
#include <QQuickOpenGLUtils>
14143
745c73e0e644 Start working on frontend to rust engine rewrite
unC0Rr
parents:
diff changeset
     8
#include <QTimer>
745c73e0e644 Start working on frontend to rust engine rewrite
unC0Rr
parents:
diff changeset
     9
#include <QtGui/QOpenGLContext>
16010
a73b9770467a Port QML frontend to Qt6, use rendering to framebuffer object
unC0Rr
parents: 15895
diff changeset
    10
a73b9770467a Port QML frontend to Qt6, use rendering to framebuffer object
unC0Rr
parents: 15895
diff changeset
    11
class GameViewRenderer : public QQuickFramebufferObject::Renderer {
a73b9770467a Port QML frontend to Qt6, use rendering to framebuffer object
unC0Rr
parents: 15895
diff changeset
    12
 public:
a73b9770467a Port QML frontend to Qt6, use rendering to framebuffer object
unC0Rr
parents: 15895
diff changeset
    13
  explicit GameViewRenderer() = default;
a73b9770467a Port QML frontend to Qt6, use rendering to framebuffer object
unC0Rr
parents: 15895
diff changeset
    14
a73b9770467a Port QML frontend to Qt6, use rendering to framebuffer object
unC0Rr
parents: 15895
diff changeset
    15
  GameViewRenderer(const GameViewRenderer&) = delete;
a73b9770467a Port QML frontend to Qt6, use rendering to framebuffer object
unC0Rr
parents: 15895
diff changeset
    16
  GameViewRenderer(GameViewRenderer&&) = delete;
a73b9770467a Port QML frontend to Qt6, use rendering to framebuffer object
unC0Rr
parents: 15895
diff changeset
    17
  GameViewRenderer& operator=(const GameViewRenderer&) = delete;
a73b9770467a Port QML frontend to Qt6, use rendering to framebuffer object
unC0Rr
parents: 15895
diff changeset
    18
  GameViewRenderer& operator=(GameViewRenderer&&) = delete;
a73b9770467a Port QML frontend to Qt6, use rendering to framebuffer object
unC0Rr
parents: 15895
diff changeset
    19
a73b9770467a Port QML frontend to Qt6, use rendering to framebuffer object
unC0Rr
parents: 15895
diff changeset
    20
  void render() override;
a73b9770467a Port QML frontend to Qt6, use rendering to framebuffer object
unC0Rr
parents: 15895
diff changeset
    21
  QOpenGLFramebufferObject* createFramebufferObject(const QSize& size) override;
a73b9770467a Port QML frontend to Qt6, use rendering to framebuffer object
unC0Rr
parents: 15895
diff changeset
    22
  void synchronize(QQuickFramebufferObject* fbo) override;
a73b9770467a Port QML frontend to Qt6, use rendering to framebuffer object
unC0Rr
parents: 15895
diff changeset
    23
a73b9770467a Port QML frontend to Qt6, use rendering to framebuffer object
unC0Rr
parents: 15895
diff changeset
    24
  QPointer<GameView> m_gameView;
a73b9770467a Port QML frontend to Qt6, use rendering to framebuffer object
unC0Rr
parents: 15895
diff changeset
    25
  QPointer<QQuickWindow> m_window;
16015
0e90bdfc2642 Handle game view resize
unC0Rr
parents: 16010
diff changeset
    26
  bool m_dirty{true};
0e90bdfc2642 Handle game view resize
unC0Rr
parents: 16010
diff changeset
    27
  QSizeF m_gameViewSize;
16010
a73b9770467a Port QML frontend to Qt6, use rendering to framebuffer object
unC0Rr
parents: 15895
diff changeset
    28
};
a73b9770467a Port QML frontend to Qt6, use rendering to framebuffer object
unC0Rr
parents: 15895
diff changeset
    29
a73b9770467a Port QML frontend to Qt6, use rendering to framebuffer object
unC0Rr
parents: 15895
diff changeset
    30
void GameViewRenderer::render() {
a73b9770467a Port QML frontend to Qt6, use rendering to framebuffer object
unC0Rr
parents: 15895
diff changeset
    31
  const auto engine = m_gameView->engineInstance();
a73b9770467a Port QML frontend to Qt6, use rendering to framebuffer object
unC0Rr
parents: 15895
diff changeset
    32
a73b9770467a Port QML frontend to Qt6, use rendering to framebuffer object
unC0Rr
parents: 15895
diff changeset
    33
  if (!engine) {
a73b9770467a Port QML frontend to Qt6, use rendering to framebuffer object
unC0Rr
parents: 15895
diff changeset
    34
    return;
a73b9770467a Port QML frontend to Qt6, use rendering to framebuffer object
unC0Rr
parents: 15895
diff changeset
    35
  }
a73b9770467a Port QML frontend to Qt6, use rendering to framebuffer object
unC0Rr
parents: 15895
diff changeset
    36
16015
0e90bdfc2642 Handle game view resize
unC0Rr
parents: 16010
diff changeset
    37
  if (m_dirty) {
0e90bdfc2642 Handle game view resize
unC0Rr
parents: 16010
diff changeset
    38
    m_dirty = false;
16010
a73b9770467a Port QML frontend to Qt6, use rendering to framebuffer object
unC0Rr
parents: 15895
diff changeset
    39
    engine->setOpenGLContext(QOpenGLContext::currentContext());
a73b9770467a Port QML frontend to Qt6, use rendering to framebuffer object
unC0Rr
parents: 15895
diff changeset
    40
  }
a73b9770467a Port QML frontend to Qt6, use rendering to framebuffer object
unC0Rr
parents: 15895
diff changeset
    41
a73b9770467a Port QML frontend to Qt6, use rendering to framebuffer object
unC0Rr
parents: 15895
diff changeset
    42
  engine->renderFrame();
a73b9770467a Port QML frontend to Qt6, use rendering to framebuffer object
unC0Rr
parents: 15895
diff changeset
    43
a73b9770467a Port QML frontend to Qt6, use rendering to framebuffer object
unC0Rr
parents: 15895
diff changeset
    44
  QQuickOpenGLUtils::resetOpenGLState();
a73b9770467a Port QML frontend to Qt6, use rendering to framebuffer object
unC0Rr
parents: 15895
diff changeset
    45
}
a73b9770467a Port QML frontend to Qt6, use rendering to framebuffer object
unC0Rr
parents: 15895
diff changeset
    46
a73b9770467a Port QML frontend to Qt6, use rendering to framebuffer object
unC0Rr
parents: 15895
diff changeset
    47
QOpenGLFramebufferObject* GameViewRenderer::createFramebufferObject(
a73b9770467a Port QML frontend to Qt6, use rendering to framebuffer object
unC0Rr
parents: 15895
diff changeset
    48
    const QSize& size) {
a73b9770467a Port QML frontend to Qt6, use rendering to framebuffer object
unC0Rr
parents: 15895
diff changeset
    49
  QOpenGLFramebufferObjectFormat format;
a73b9770467a Port QML frontend to Qt6, use rendering to framebuffer object
unC0Rr
parents: 15895
diff changeset
    50
  format.setAttachment(QOpenGLFramebufferObject::CombinedDepthStencil);
a73b9770467a Port QML frontend to Qt6, use rendering to framebuffer object
unC0Rr
parents: 15895
diff changeset
    51
  format.setSamples(8);
a73b9770467a Port QML frontend to Qt6, use rendering to framebuffer object
unC0Rr
parents: 15895
diff changeset
    52
  auto fbo = new QOpenGLFramebufferObject(size, format);
a73b9770467a Port QML frontend to Qt6, use rendering to framebuffer object
unC0Rr
parents: 15895
diff changeset
    53
  return fbo;
a73b9770467a Port QML frontend to Qt6, use rendering to framebuffer object
unC0Rr
parents: 15895
diff changeset
    54
}
a73b9770467a Port QML frontend to Qt6, use rendering to framebuffer object
unC0Rr
parents: 15895
diff changeset
    55
a73b9770467a Port QML frontend to Qt6, use rendering to framebuffer object
unC0Rr
parents: 15895
diff changeset
    56
void GameViewRenderer::synchronize(QQuickFramebufferObject* fbo) {
a73b9770467a Port QML frontend to Qt6, use rendering to framebuffer object
unC0Rr
parents: 15895
diff changeset
    57
  if (!m_gameView) {
a73b9770467a Port QML frontend to Qt6, use rendering to framebuffer object
unC0Rr
parents: 15895
diff changeset
    58
    m_gameView = qobject_cast<GameView*>(fbo);
a73b9770467a Port QML frontend to Qt6, use rendering to framebuffer object
unC0Rr
parents: 15895
diff changeset
    59
    m_window = fbo->window();
a73b9770467a Port QML frontend to Qt6, use rendering to framebuffer object
unC0Rr
parents: 15895
diff changeset
    60
  }
16015
0e90bdfc2642 Handle game view resize
unC0Rr
parents: 16010
diff changeset
    61
0e90bdfc2642 Handle game view resize
unC0Rr
parents: 16010
diff changeset
    62
  if (const auto currentSize = m_gameView->size();
0e90bdfc2642 Handle game view resize
unC0Rr
parents: 16010
diff changeset
    63
      currentSize != m_gameViewSize) {
0e90bdfc2642 Handle game view resize
unC0Rr
parents: 16010
diff changeset
    64
    m_gameViewSize = currentSize;
0e90bdfc2642 Handle game view resize
unC0Rr
parents: 16010
diff changeset
    65
    m_dirty = true;
0e90bdfc2642 Handle game view resize
unC0Rr
parents: 16010
diff changeset
    66
  }
16010
a73b9770467a Port QML frontend to Qt6, use rendering to framebuffer object
unC0Rr
parents: 15895
diff changeset
    67
}
14143
745c73e0e644 Start working on frontend to rust engine rewrite
unC0Rr
parents:
diff changeset
    68
14842
ef9630519491 Fix some minor problems with new frontend code
unc0rr
parents: 14713
diff changeset
    69
GameView::GameView(QQuickItem* parent)
16010
a73b9770467a Port QML frontend to Qt6, use rendering to framebuffer object
unC0Rr
parents: 15895
diff changeset
    70
    : QQuickFramebufferObject(parent), m_delta(0) {
a73b9770467a Port QML frontend to Qt6, use rendering to framebuffer object
unC0Rr
parents: 15895
diff changeset
    71
  setMirrorVertically(true);
14143
745c73e0e644 Start working on frontend to rust engine rewrite
unC0Rr
parents:
diff changeset
    72
}
745c73e0e644 Start working on frontend to rust engine rewrite
unC0Rr
parents:
diff changeset
    73
745c73e0e644 Start working on frontend to rust engine rewrite
unC0Rr
parents:
diff changeset
    74
void GameView::tick(quint32 delta) {
745c73e0e644 Start working on frontend to rust engine rewrite
unC0Rr
parents:
diff changeset
    75
  m_delta = delta;
745c73e0e644 Start working on frontend to rust engine rewrite
unC0Rr
parents:
diff changeset
    76
745c73e0e644 Start working on frontend to rust engine rewrite
unC0Rr
parents:
diff changeset
    77
  if (window()) {
745c73e0e644 Start working on frontend to rust engine rewrite
unC0Rr
parents:
diff changeset
    78
    QTimer* timer = new QTimer(this);
16010
a73b9770467a Port QML frontend to Qt6, use rendering to framebuffer object
unC0Rr
parents: 15895
diff changeset
    79
    connect(timer, &QTimer::timeout, this, &GameView::update);
14143
745c73e0e644 Start working on frontend to rust engine rewrite
unC0Rr
parents:
diff changeset
    80
    timer->start(100);
745c73e0e644 Start working on frontend to rust engine rewrite
unC0Rr
parents:
diff changeset
    81
  }
745c73e0e644 Start working on frontend to rust engine rewrite
unC0Rr
parents:
diff changeset
    82
}
745c73e0e644 Start working on frontend to rust engine rewrite
unC0Rr
parents:
diff changeset
    83
14290
92e5682810d4 Prepare to have possibility to pass opengl context to engine
unc0rr
parents: 14154
diff changeset
    84
EngineInstance* GameView::engineInstance() const { return m_engineInstance; }
92e5682810d4 Prepare to have possibility to pass opengl context to engine
unc0rr
parents: 14154
diff changeset
    85
16010
a73b9770467a Port QML frontend to Qt6, use rendering to framebuffer object
unC0Rr
parents: 15895
diff changeset
    86
QQuickFramebufferObject::Renderer* GameView::createRenderer() const {
a73b9770467a Port QML frontend to Qt6, use rendering to framebuffer object
unC0Rr
parents: 15895
diff changeset
    87
  return new GameViewRenderer{};
14143
745c73e0e644 Start working on frontend to rust engine rewrite
unC0Rr
parents:
diff changeset
    88
}
745c73e0e644 Start working on frontend to rust engine rewrite
unC0Rr
parents:
diff changeset
    89
14290
92e5682810d4 Prepare to have possibility to pass opengl context to engine
unc0rr
parents: 14154
diff changeset
    90
void GameView::setEngineInstance(EngineInstance* engineInstance) {
15894
ebc50f21e849 Code formatting, enable c++17 for qmlfrontend
unC0Rr
parents: 14842
diff changeset
    91
  if (m_engineInstance == engineInstance) {
ebc50f21e849 Code formatting, enable c++17 for qmlfrontend
unC0Rr
parents: 14842
diff changeset
    92
    return;
ebc50f21e849 Code formatting, enable c++17 for qmlfrontend
unC0Rr
parents: 14842
diff changeset
    93
  }
14290
92e5682810d4 Prepare to have possibility to pass opengl context to engine
unc0rr
parents: 14154
diff changeset
    94
92e5682810d4 Prepare to have possibility to pass opengl context to engine
unc0rr
parents: 14154
diff changeset
    95
  m_engineInstance = engineInstance;
14298
00b56ec8b7df Pass opengl context to engine
unC0Rr
parents: 14290
diff changeset
    96
16010
a73b9770467a Port QML frontend to Qt6, use rendering to framebuffer object
unC0Rr
parents: 15895
diff changeset
    97
  Q_EMIT engineInstanceChanged(m_engineInstance);
14143
745c73e0e644 Start working on frontend to rust engine rewrite
unC0Rr
parents:
diff changeset
    98
}