author | Grigory Ustinov <grenka@altlinux.org> |
Wed, 28 Nov 2018 17:25:29 +0300 | |
changeset 14352 | 80a4283a58b1 |
parent 14319 | 00b56ec8b7df |
child 14733 | 57293f34ce59 |
permissions | -rw-r--r-- |
14311
92e5682810d4
Prepare to have possibility to pass opengl context to engine
unc0rr
parents:
14175
diff
changeset
|
1 |
#include "game_view.h" |
14164 | 2 |
|
3 |
#include <QtQuick/qquickwindow.h> |
|
4 |
#include <QCursor> |
|
5 |
#include <QTimer> |
|
6 |
#include <QtGui/QOpenGLContext> |
|
7 |
#include <QtGui/QOpenGLShaderProgram> |
|
8 |
||
14311
92e5682810d4
Prepare to have possibility to pass opengl context to engine
unc0rr
parents:
14175
diff
changeset
|
9 |
GameView::GameView() : m_delta(0), m_windowChanged(true) { |
14164 | 10 |
connect(this, &QQuickItem::windowChanged, this, |
11 |
&GameView::handleWindowChanged); |
|
12 |
} |
|
13 |
||
14 |
void GameView::tick(quint32 delta) { |
|
15 |
m_delta = delta; |
|
16 |
||
17 |
if (window()) { |
|
18 |
QTimer* timer = new QTimer(this); |
|
19 |
connect(timer, &QTimer::timeout, window(), &QQuickWindow::update); |
|
20 |
timer->start(100); |
|
21 |
||
22 |
// window()->update(); |
|
23 |
} |
|
24 |
} |
|
25 |
||
14311
92e5682810d4
Prepare to have possibility to pass opengl context to engine
unc0rr
parents:
14175
diff
changeset
|
26 |
EngineInstance* GameView::engineInstance() const { return m_engineInstance; } |
92e5682810d4
Prepare to have possibility to pass opengl context to engine
unc0rr
parents:
14175
diff
changeset
|
27 |
|
14164 | 28 |
void GameView::handleWindowChanged(QQuickWindow* win) { |
29 |
if (win) { |
|
30 |
connect(win, &QQuickWindow::beforeSynchronizing, this, &GameView::sync, |
|
31 |
Qt::DirectConnection); |
|
32 |
connect(win, &QQuickWindow::sceneGraphInvalidated, this, &GameView::cleanup, |
|
33 |
Qt::DirectConnection); |
|
34 |
||
35 |
win->setClearBeforeRendering(false); |
|
36 |
||
37 |
m_windowChanged = true; |
|
38 |
} |
|
39 |
} |
|
40 |
||
14311
92e5682810d4
Prepare to have possibility to pass opengl context to engine
unc0rr
parents:
14175
diff
changeset
|
41 |
void GameView::cleanup() { m_renderer.reset(); } |
92e5682810d4
Prepare to have possibility to pass opengl context to engine
unc0rr
parents:
14175
diff
changeset
|
42 |
|
92e5682810d4
Prepare to have possibility to pass opengl context to engine
unc0rr
parents:
14175
diff
changeset
|
43 |
void GameView::setEngineInstance(EngineInstance* engineInstance) { |
92e5682810d4
Prepare to have possibility to pass opengl context to engine
unc0rr
parents:
14175
diff
changeset
|
44 |
if (m_engineInstance == engineInstance) return; |
92e5682810d4
Prepare to have possibility to pass opengl context to engine
unc0rr
parents:
14175
diff
changeset
|
45 |
|
92e5682810d4
Prepare to have possibility to pass opengl context to engine
unc0rr
parents:
14175
diff
changeset
|
46 |
cleanup(); |
92e5682810d4
Prepare to have possibility to pass opengl context to engine
unc0rr
parents:
14175
diff
changeset
|
47 |
m_engineInstance = engineInstance; |
14319 | 48 |
|
14311
92e5682810d4
Prepare to have possibility to pass opengl context to engine
unc0rr
parents:
14175
diff
changeset
|
49 |
emit engineInstanceChanged(m_engineInstance); |
14164 | 50 |
} |
51 |
||
52 |
void GameView::sync() { |
|
14319 | 53 |
if (!m_renderer && m_engineInstance) { |
54 |
m_engineInstance->setOpenGLContext(window()->openglContext()); |
|
14311
92e5682810d4
Prepare to have possibility to pass opengl context to engine
unc0rr
parents:
14175
diff
changeset
|
55 |
m_renderer.reset(new GameViewRenderer()); |
14319 | 56 |
m_renderer->setEngineInstance(m_engineInstance); |
14311
92e5682810d4
Prepare to have possibility to pass opengl context to engine
unc0rr
parents:
14175
diff
changeset
|
57 |
connect(window(), &QQuickWindow::beforeRendering, m_renderer.data(), |
14164 | 58 |
&GameViewRenderer::paint, Qt::DirectConnection); |
59 |
} |
|
60 |
||
61 |
if (m_windowChanged) { |
|
62 |
QSize windowSize = window()->size(); |
|
63 |
m_renderer->setViewportSize(windowSize * window()->devicePixelRatio()); |
|
64 |
m_centerX = windowSize.width() / 2; |
|
65 |
m_centerY = windowSize.height() / 2; |
|
66 |
} |
|
67 |
||
14311
92e5682810d4
Prepare to have possibility to pass opengl context to engine
unc0rr
parents:
14175
diff
changeset
|
68 |
// QPoint mousePos = mapFromGlobal(QCursor::pos()).toPoint(); |
92e5682810d4
Prepare to have possibility to pass opengl context to engine
unc0rr
parents:
14175
diff
changeset
|
69 |
// if (flibUpdateMousePosition(m_centerX, m_centerY, mousePos.x(), |
92e5682810d4
Prepare to have possibility to pass opengl context to engine
unc0rr
parents:
14175
diff
changeset
|
70 |
// mousePos.y())) |
92e5682810d4
Prepare to have possibility to pass opengl context to engine
unc0rr
parents:
14175
diff
changeset
|
71 |
// QCursor::setPos(mapToGlobal(QPointF(m_centerX, m_centerY)).toPoint()); |
14164 | 72 |
|
14319 | 73 |
if (m_renderer) m_renderer->tick(m_delta); |
14164 | 74 |
} |
75 |
||
14311
92e5682810d4
Prepare to have possibility to pass opengl context to engine
unc0rr
parents:
14175
diff
changeset
|
76 |
GameViewRenderer::GameViewRenderer() |
92e5682810d4
Prepare to have possibility to pass opengl context to engine
unc0rr
parents:
14175
diff
changeset
|
77 |
: QObject(), m_delta(0), m_engineInstance(nullptr) {} |
92e5682810d4
Prepare to have possibility to pass opengl context to engine
unc0rr
parents:
14175
diff
changeset
|
78 |
|
14164 | 79 |
GameViewRenderer::~GameViewRenderer() {} |
80 |
||
14311
92e5682810d4
Prepare to have possibility to pass opengl context to engine
unc0rr
parents:
14175
diff
changeset
|
81 |
void GameViewRenderer::tick(quint32 delta) { m_delta = delta; } |
92e5682810d4
Prepare to have possibility to pass opengl context to engine
unc0rr
parents:
14175
diff
changeset
|
82 |
|
14164 | 83 |
void GameViewRenderer::setViewportSize(const QSize& size) { |
14311
92e5682810d4
Prepare to have possibility to pass opengl context to engine
unc0rr
parents:
14175
diff
changeset
|
84 |
// flibResizeWindow(size.width(), size.height()); |
92e5682810d4
Prepare to have possibility to pass opengl context to engine
unc0rr
parents:
14175
diff
changeset
|
85 |
} |
92e5682810d4
Prepare to have possibility to pass opengl context to engine
unc0rr
parents:
14175
diff
changeset
|
86 |
|
92e5682810d4
Prepare to have possibility to pass opengl context to engine
unc0rr
parents:
14175
diff
changeset
|
87 |
void GameViewRenderer::setEngineInstance(EngineInstance* engineInstance) { |
92e5682810d4
Prepare to have possibility to pass opengl context to engine
unc0rr
parents:
14175
diff
changeset
|
88 |
m_engineInstance = engineInstance; |
14164 | 89 |
} |
90 |
||
91 |
void GameViewRenderer::paint() { |
|
92 |
if (m_delta == 0) return; |
|
93 |
||
14311
92e5682810d4
Prepare to have possibility to pass opengl context to engine
unc0rr
parents:
14175
diff
changeset
|
94 |
if (m_engineInstance) { |
92e5682810d4
Prepare to have possibility to pass opengl context to engine
unc0rr
parents:
14175
diff
changeset
|
95 |
m_engineInstance->advance(m_delta); |
92e5682810d4
Prepare to have possibility to pass opengl context to engine
unc0rr
parents:
14175
diff
changeset
|
96 |
m_engineInstance->renderFrame(); |
92e5682810d4
Prepare to have possibility to pass opengl context to engine
unc0rr
parents:
14175
diff
changeset
|
97 |
} |
14164 | 98 |
|
99 |
// m_window->resetOpenGLState(); |
|
100 |
} |