mirror of https://github.com/RPCS3/rpcs3.git
57 lines
1.5 KiB
C++
57 lines
1.5 KiB
C++
#include "glviewer.h"
|
|
#include <QQuickWindow>
|
|
#include <QOpenGLContext>
|
|
#include <QCoreApplication>
|
|
|
|
// This class hooks beforeRendering and allows us to draw a scene and reset GL state.
|
|
// In future, we will likely want to manually control the update rate.
|
|
|
|
void GLRenderer::paint() {
|
|
// Do GL here
|
|
glViewport(0, 0, m_viewportSize.width(), m_viewportSize.height());
|
|
|
|
glDisable(GL_DEPTH_TEST);
|
|
|
|
// Draw blue to the window to show that we work
|
|
glClearColor(0.2, 0, 0.8, 1);
|
|
glClear(GL_COLOR_BUFFER_BIT);
|
|
|
|
glEnable(GL_BLEND);
|
|
glBlendFunc(GL_SRC_ALPHA, GL_ONE);
|
|
// Put the GL state back to how it was in case it makes SceneGraph angry
|
|
((QQuickWindow*)sender())->resetOpenGLState();
|
|
}
|
|
|
|
GLViewer::GLViewer()
|
|
: m_renderer(0)
|
|
{
|
|
connect(this, SIGNAL(windowChanged(QQuickWindow*)), this, SLOT(handleWindowChanged(QQuickWindow*)));
|
|
}
|
|
|
|
void GLViewer::handleWindowChanged(QQuickWindow *win)
|
|
{
|
|
if (win) {
|
|
connect(win, SIGNAL(beforeSynchronizing()), this, SLOT(sync()), Qt::DirectConnection);
|
|
connect(win, SIGNAL(sceneGraphInvalidated()), this, SLOT(cleanup()), Qt::DirectConnection);
|
|
// We will take over from here
|
|
win->setClearBeforeRendering(false);
|
|
}
|
|
}
|
|
|
|
void GLViewer::sync()
|
|
{
|
|
if (!m_renderer) {
|
|
m_renderer = new GLRenderer();
|
|
connect(window(), SIGNAL(beforeRendering()), m_renderer, SLOT(paint()), Qt::DirectConnection);
|
|
}
|
|
m_renderer->setViewportSize(window()->size() * window()->devicePixelRatio());
|
|
}
|
|
|
|
void GLViewer::cleanup() {
|
|
if (m_renderer) {
|
|
delete m_renderer;
|
|
m_renderer = 0;
|
|
}
|
|
}
|
|
|