qmlfrontend/game_view.cpp
author unC0Rr
Wed, 01 May 2024 16:49:16 +0200
changeset 16012 caba603f461f
parent 16010 a73b9770467a
child 16015 0e90bdfc2642
permissions -rw-r--r--
Allow to move camera by dragging mouse cursor over game field
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;
a73b9770467a Port QML frontend to Qt6, use rendering to framebuffer object
unC0Rr
parents: 15895
diff changeset
    26
  bool m_inited{false};
a73b9770467a Port QML frontend to Qt6, use rendering to framebuffer object
unC0Rr
parents: 15895
diff changeset
    27
};
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
void GameViewRenderer::render() {
a73b9770467a Port QML frontend to Qt6, use rendering to framebuffer object
unC0Rr
parents: 15895
diff changeset
    30
  const auto engine = m_gameView->engineInstance();
a73b9770467a Port QML frontend to Qt6, use rendering to framebuffer object
unC0Rr
parents: 15895
diff changeset
    31
a73b9770467a Port QML frontend to Qt6, use rendering to framebuffer object
unC0Rr
parents: 15895
diff changeset
    32
  if (!engine) {
a73b9770467a Port QML frontend to Qt6, use rendering to framebuffer object
unC0Rr
parents: 15895
diff changeset
    33
    return;
a73b9770467a Port QML frontend to Qt6, use rendering to framebuffer object
unC0Rr
parents: 15895
diff changeset
    34
  }
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
  if (!m_inited) {
a73b9770467a Port QML frontend to Qt6, use rendering to framebuffer object
unC0Rr
parents: 15895
diff changeset
    37
    m_inited = true;
a73b9770467a Port QML frontend to Qt6, use rendering to framebuffer object
unC0Rr
parents: 15895
diff changeset
    38
    engine->setOpenGLContext(QOpenGLContext::currentContext());
a73b9770467a Port QML frontend to Qt6, use rendering to framebuffer object
unC0Rr
parents: 15895
diff changeset
    39
  }
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
  engine->renderFrame();
a73b9770467a Port QML frontend to Qt6, use rendering to framebuffer object
unC0Rr
parents: 15895
diff changeset
    42
a73b9770467a Port QML frontend to Qt6, use rendering to framebuffer object
unC0Rr
parents: 15895
diff changeset
    43
  QQuickOpenGLUtils::resetOpenGLState();
a73b9770467a Port QML frontend to Qt6, use rendering to framebuffer object
unC0Rr
parents: 15895
diff changeset
    44
}
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
QOpenGLFramebufferObject* GameViewRenderer::createFramebufferObject(
a73b9770467a Port QML frontend to Qt6, use rendering to framebuffer object
unC0Rr
parents: 15895
diff changeset
    47
    const QSize& size) {
a73b9770467a Port QML frontend to Qt6, use rendering to framebuffer object
unC0Rr
parents: 15895
diff changeset
    48
  QOpenGLFramebufferObjectFormat format;
a73b9770467a Port QML frontend to Qt6, use rendering to framebuffer object
unC0Rr
parents: 15895
diff changeset
    49
  format.setAttachment(QOpenGLFramebufferObject::CombinedDepthStencil);
a73b9770467a Port QML frontend to Qt6, use rendering to framebuffer object
unC0Rr
parents: 15895
diff changeset
    50
  format.setSamples(8);
a73b9770467a Port QML frontend to Qt6, use rendering to framebuffer object
unC0Rr
parents: 15895
diff changeset
    51
  auto fbo = new QOpenGLFramebufferObject(size, format);
a73b9770467a Port QML frontend to Qt6, use rendering to framebuffer object
unC0Rr
parents: 15895
diff changeset
    52
  return fbo;
a73b9770467a Port QML frontend to Qt6, use rendering to framebuffer object
unC0Rr
parents: 15895
diff changeset
    53
}
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
void GameViewRenderer::synchronize(QQuickFramebufferObject* fbo) {
a73b9770467a Port QML frontend to Qt6, use rendering to framebuffer object
unC0Rr
parents: 15895
diff changeset
    56
  if (!m_gameView) {
a73b9770467a Port QML frontend to Qt6, use rendering to framebuffer object
unC0Rr
parents: 15895
diff changeset
    57
    m_gameView = qobject_cast<GameView*>(fbo);
a73b9770467a Port QML frontend to Qt6, use rendering to framebuffer object
unC0Rr
parents: 15895
diff changeset
    58
    m_window = fbo->window();
a73b9770467a Port QML frontend to Qt6, use rendering to framebuffer object
unC0Rr
parents: 15895
diff changeset
    59
  }
a73b9770467a Port QML frontend to Qt6, use rendering to framebuffer object
unC0Rr
parents: 15895
diff changeset
    60
}
14143
745c73e0e644 Start working on frontend to rust engine rewrite
unC0Rr
parents:
diff changeset
    61
14842
ef9630519491 Fix some minor problems with new frontend code
unc0rr
parents: 14713
diff changeset
    62
GameView::GameView(QQuickItem* parent)
16010
a73b9770467a Port QML frontend to Qt6, use rendering to framebuffer object
unC0Rr
parents: 15895
diff changeset
    63
    : QQuickFramebufferObject(parent), m_delta(0) {
a73b9770467a Port QML frontend to Qt6, use rendering to framebuffer object
unC0Rr
parents: 15895
diff changeset
    64
  setMirrorVertically(true);
14143
745c73e0e644 Start working on frontend to rust engine rewrite
unC0Rr
parents:
diff changeset
    65
}
745c73e0e644 Start working on frontend to rust engine rewrite
unC0Rr
parents:
diff changeset
    66
745c73e0e644 Start working on frontend to rust engine rewrite
unC0Rr
parents:
diff changeset
    67
void GameView::tick(quint32 delta) {
745c73e0e644 Start working on frontend to rust engine rewrite
unC0Rr
parents:
diff changeset
    68
  m_delta = delta;
745c73e0e644 Start working on frontend to rust engine rewrite
unC0Rr
parents:
diff changeset
    69
745c73e0e644 Start working on frontend to rust engine rewrite
unC0Rr
parents:
diff changeset
    70
  if (window()) {
745c73e0e644 Start working on frontend to rust engine rewrite
unC0Rr
parents:
diff changeset
    71
    QTimer* timer = new QTimer(this);
16010
a73b9770467a Port QML frontend to Qt6, use rendering to framebuffer object
unC0Rr
parents: 15895
diff changeset
    72
    connect(timer, &QTimer::timeout, this, &GameView::update);
14143
745c73e0e644 Start working on frontend to rust engine rewrite
unC0Rr
parents:
diff changeset
    73
    timer->start(100);
745c73e0e644 Start working on frontend to rust engine rewrite
unC0Rr
parents:
diff changeset
    74
  }
745c73e0e644 Start working on frontend to rust engine rewrite
unC0Rr
parents:
diff changeset
    75
}
745c73e0e644 Start working on frontend to rust engine rewrite
unC0Rr
parents:
diff changeset
    76
14290
92e5682810d4 Prepare to have possibility to pass opengl context to engine
unc0rr
parents: 14154
diff changeset
    77
EngineInstance* GameView::engineInstance() const { return m_engineInstance; }
92e5682810d4 Prepare to have possibility to pass opengl context to engine
unc0rr
parents: 14154
diff changeset
    78
16010
a73b9770467a Port QML frontend to Qt6, use rendering to framebuffer object
unC0Rr
parents: 15895
diff changeset
    79
QQuickFramebufferObject::Renderer* GameView::createRenderer() const {
a73b9770467a Port QML frontend to Qt6, use rendering to framebuffer object
unC0Rr
parents: 15895
diff changeset
    80
  return new GameViewRenderer{};
14143
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
14290
92e5682810d4 Prepare to have possibility to pass opengl context to engine
unc0rr
parents: 14154
diff changeset
    83
void GameView::setEngineInstance(EngineInstance* engineInstance) {
15894
ebc50f21e849 Code formatting, enable c++17 for qmlfrontend
unC0Rr
parents: 14842
diff changeset
    84
  if (m_engineInstance == engineInstance) {
ebc50f21e849 Code formatting, enable c++17 for qmlfrontend
unC0Rr
parents: 14842
diff changeset
    85
    return;
ebc50f21e849 Code formatting, enable c++17 for qmlfrontend
unC0Rr
parents: 14842
diff changeset
    86
  }
14290
92e5682810d4 Prepare to have possibility to pass opengl context to engine
unc0rr
parents: 14154
diff changeset
    87
92e5682810d4 Prepare to have possibility to pass opengl context to engine
unc0rr
parents: 14154
diff changeset
    88
  m_engineInstance = engineInstance;
14298
00b56ec8b7df Pass opengl context to engine
unC0Rr
parents: 14290
diff changeset
    89
16010
a73b9770467a Port QML frontend to Qt6, use rendering to framebuffer object
unC0Rr
parents: 15895
diff changeset
    90
  Q_EMIT engineInstanceChanged(m_engineInstance);
14143
745c73e0e644 Start working on frontend to rust engine rewrite
unC0Rr
parents:
diff changeset
    91
}