diff options
Diffstat (limited to 'src/Authoring/Studio/Palettes/scenecamera')
6 files changed, 99 insertions, 15 deletions
diff --git a/src/Authoring/Studio/Palettes/scenecamera/scenecameraglwidget.cpp b/src/Authoring/Studio/Palettes/scenecamera/scenecameraglwidget.cpp index a82f7158..fc3b59bd 100644 --- a/src/Authoring/Studio/Palettes/scenecamera/scenecameraglwidget.cpp +++ b/src/Authoring/Studio/Palettes/scenecamera/scenecameraglwidget.cpp @@ -29,14 +29,19 @@ #include "Qt3DSCommonPrecompile.h" #include "scenecameraglwidget.h" #include "StudioApp.h" -#include "IStudioRenderer.h" #include "WGLRenderContext.h" #include "StudioPreferences.h" +#include "Q3DStudioRenderer.h" +#include "StudioProjectSettings.h" +#include "StudioUtils.h" #include <QtGui/qopenglshaderprogram.h> #include <QtGui/qopengltexture.h> #include <QtGui/qopenglbuffer.h> #include <QtGui/qopenglvertexarrayobject.h> +#include <QtGui/qopenglframebufferobject.h> +#include <QtGui/qoffscreensurface.h> +#include <QtWidgets/qmessagebox.h> const QVector4D defaultTextureOffset = QVector4D(0.0f, 0.0f, 1.0f, 1.0f); const QVector2D defaultGeometryOffset = QVector2D(1.0f, 1.0f); @@ -55,6 +60,13 @@ SceneCameraGlWidget::SceneCameraGlWidget(QWidget *parent) SceneCameraGlWidget::~SceneCameraGlWidget() { cleanup(); + m_renderer = std::shared_ptr<Q3DStudio::IStudioRenderer>(); +} + +void SceneCameraGlWidget::requestRender() +{ + if (m_renderer && m_renderer->IsInitialized()) + m_renderer->RequestRender(); } void SceneCameraGlWidget::initializeGL() @@ -63,6 +75,11 @@ void SceneCameraGlWidget::initializeGL() QObject::connect(context(), &QOpenGLContext::aboutToBeDestroyed, this, &SceneCameraGlWidget::cleanup); + if (!m_renderer) + m_renderer = Q3DStudio::IStudioRenderer::CreateStudioRenderer(true); + if (!m_renderer->IsInitialized()) + m_renderer->initialize(this, m_hasPresentation); + m_program = new QOpenGLShaderProgram(); if (!m_program->addShaderFromSourceCode( QOpenGLShader::Vertex, @@ -154,23 +171,36 @@ void SceneCameraGlWidget::initializeGL() void SceneCameraGlWidget::paintGL() { - Q3DStudio::IStudioRenderer &renderer(g_StudioApp.getRenderer()); - if (renderer.IsInitialized()) { - m_vao->bind(); + if (m_renderer && m_renderer->IsInitialized()) { + m_fboSize = g_StudioApp.GetCore()->GetStudioProjectSettings()->getPresentationSize(); + if (!m_fbo || m_fboSize != m_fbo->size()) { + delete m_fbo; + m_fbo = new QOpenGLFramebufferObject(m_fboSize, + QOpenGLFramebufferObject::CombinedDepthStencil); + m_renderer->SetViewRect(QRect(0, 0, m_fboSize.width(), m_fboSize.height()), m_fboSize); + } + m_fbo->bind(); + m_renderer->renderNow(); + m_fbo->bindDefault(); + // Clean the OpenGL state glDisable(GL_DEPTH_TEST); glDisable(GL_STENCIL_TEST); + glDisable(GL_CULL_FACE); glDisable(GL_SCISSOR_TEST); glDisable(GL_BLEND); + glBindBuffer(GL_ARRAY_BUFFER, 0); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); + glViewport(0, 0, width() * m_pixelRatio, height() * m_pixelRatio); + + m_program->bind(); + m_vao->bind(); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - QSize fboSize; - qt3ds::QT3DSU32 textureId; - renderer.getPreviewFbo(fboSize, textureId); glActiveTexture(GL_TEXTURE0); - glBindTexture(GL_TEXTURE_2D, GLuint(textureId)); + glBindTexture(GL_TEXTURE_2D, m_fbo->texture()); m_program->setUniformValueArray(m_uniformTextureOffset, &m_textureOffset, 1); m_program->setUniformValueArray(m_uniformGeometryOffset, &m_geometryOffset, 1); @@ -178,23 +208,36 @@ void SceneCameraGlWidget::paintGL() glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); m_vao->release(); + m_program->release(); } } -void SceneCameraGlWidget::resizeGL(int, int) +void SceneCameraGlWidget::resizeGL(int w, int h) { // We need to update immediately to avoid flicker - update(); + update(); + + const qreal pixelRatio = StudioUtils::devicePixelRatio(window()->windowHandle()); + if (pixelRatio != m_pixelRatio) { + m_pixelRatio = pixelRatio; + delete m_fbo; + m_fbo = nullptr; + } + + if (m_renderer && m_renderer->IsInitialized()) + m_renderer->RequestRender(); } void SceneCameraGlWidget::cleanup() { makeCurrent(); + delete m_fbo; delete m_program; delete m_vertexBuffer; delete m_uvBuffer; delete m_vao; + m_fbo = nullptr; m_program = nullptr; m_vertexBuffer = nullptr; m_uvBuffer = nullptr; @@ -204,5 +247,8 @@ void SceneCameraGlWidget::cleanup() m_textureOffset = defaultTextureOffset; m_geometryOffset = defaultGeometryOffset; + if (m_renderer) + m_renderer->Close(); + doneCurrent(); } diff --git a/src/Authoring/Studio/Palettes/scenecamera/scenecameraglwidget.h b/src/Authoring/Studio/Palettes/scenecamera/scenecameraglwidget.h index 93becf19..e985c378 100644 --- a/src/Authoring/Studio/Palettes/scenecamera/scenecameraglwidget.h +++ b/src/Authoring/Studio/Palettes/scenecamera/scenecameraglwidget.h @@ -29,6 +29,8 @@ #ifndef SCENE_CAMERA_GLWIDGET_H #define SCENE_CAMERA_GLWIDGET_H +#include "IStudioRenderer.h" + #include <QtWidgets/qopenglwidget.h> #include <QtGui/qopenglfunctions.h> #include <QtGui/qvector2d.h> @@ -37,6 +39,7 @@ QT_FORWARD_DECLARE_CLASS(QOpenGLShaderProgram) QT_FORWARD_DECLARE_CLASS(QOpenGLBuffer) QT_FORWARD_DECLARE_CLASS(QOpenGLVertexArrayObject) +QT_FORWARD_DECLARE_CLASS(QOpenGLFramebufferObject) class SceneCameraGlWidget : public QOpenGLWidget, QOpenGLFunctions { @@ -48,10 +51,13 @@ public: void setTextureOffset(const QVector4D &offset) { m_textureOffset = offset; } void setGeometryOffset(const QVector4D &offset) { m_geometryOffset = offset; } + void requestRender(); + void setPresentationAvailable(bool available) { m_hasPresentation = available; } + protected: void initializeGL() override; void paintGL() override; - void resizeGL(int, int) override; + void resizeGL(int w, int h) override; private: void cleanup(); @@ -60,10 +66,15 @@ private: QOpenGLBuffer *m_vertexBuffer = nullptr; QOpenGLBuffer *m_uvBuffer = nullptr; QOpenGLVertexArrayObject *m_vao = nullptr; + QOpenGLFramebufferObject *m_fbo = nullptr; + QSize m_fboSize; GLint m_uniformTextureOffset = 0; GLint m_uniformGeometryOffset = 0; QVector4D m_textureOffset; QVector4D m_geometryOffset; + std::shared_ptr<Q3DStudio::IStudioRenderer> m_renderer; + qreal m_pixelRatio = 1.; + bool m_hasPresentation = false; }; #endif diff --git a/src/Authoring/Studio/Palettes/scenecamera/scenecamerascrollarea.cpp b/src/Authoring/Studio/Palettes/scenecamera/scenecamerascrollarea.cpp index 035e242c..fbec11a7 100644 --- a/src/Authoring/Studio/Palettes/scenecamera/scenecamerascrollarea.cpp +++ b/src/Authoring/Studio/Palettes/scenecamera/scenecamerascrollarea.cpp @@ -122,6 +122,13 @@ void SceneCameraScrollArea::recalculateOffsets() m_glWidget->setGeometryOffset(geometryOffset); } +void SceneCameraScrollArea::setPresentationAvailable(bool available) +{ + if (available) + setZoom(m_zoom, viewport()->geometry().center()); + m_glWidget->setPresentationAvailable(available); +} + void SceneCameraScrollArea::scrollContentsBy(int, int) { recalculateOffsets(); diff --git a/src/Authoring/Studio/Palettes/scenecamera/scenecamerascrollarea.h b/src/Authoring/Studio/Palettes/scenecamera/scenecamerascrollarea.h index 682dc430..8ba7936c 100644 --- a/src/Authoring/Studio/Palettes/scenecamera/scenecamerascrollarea.h +++ b/src/Authoring/Studio/Palettes/scenecamera/scenecamerascrollarea.h @@ -47,6 +47,7 @@ public: void setPresentationSize(const QSize &size); void recalculateScrollRanges(); void recalculateOffsets(); + void setPresentationAvailable(bool available); Q_SIGNALS: void needUpdate(); diff --git a/src/Authoring/Studio/Palettes/scenecamera/scenecameraview.cpp b/src/Authoring/Studio/Palettes/scenecamera/scenecameraview.cpp index b4470cd6..63da8ef2 100644 --- a/src/Authoring/Studio/Palettes/scenecamera/scenecameraview.cpp +++ b/src/Authoring/Studio/Palettes/scenecamera/scenecameraview.cpp @@ -36,6 +36,7 @@ #include "Q3DSPlayerWnd.h" #include "MouseCursor.h" #include "ResourceCache.h" +#include "Dispatch.h" #include <QtGui/qevent.h> #include <QtWidgets/qscrollbar.h> @@ -50,6 +51,8 @@ SceneCameraView::SceneCameraView(CMainFrame *mainFrame, QWidget *parent) : { m_ui->setupUi(this); + g_StudioApp.GetCore()->GetDispatch()->AddPresentationChangeListener(this); + m_cursorPan = CResourceCache::GetInstance()->GetCursor(CMouseCursor::CURSOR_EDIT_CAMERA_PAN); m_cursorZoom = CResourceCache::GetInstance()->GetCursor(CMouseCursor::CURSOR_EDIT_CAMERA_ZOOM); @@ -59,8 +62,6 @@ SceneCameraView::SceneCameraView(CMainFrame *mainFrame, QWidget *parent) : connect(m_ui->zoomSlider, &QSlider::valueChanged, this, &SceneCameraView::handleSliderValueChange); - connect(mainFrame->GetPlayerWnd(), &Q3DStudio::Q3DSPlayerWnd::newFrame, - this, &SceneCameraView::requestUpdate); connect(m_ui->scrollArea, &SceneCameraScrollArea::needUpdate, this, &SceneCameraView::requestUpdate); connect(&m_updateTimer, &QTimer::timeout, this, &SceneCameraView::doUpdate); @@ -68,9 +69,20 @@ SceneCameraView::SceneCameraView(CMainFrame *mainFrame, QWidget *parent) : SceneCameraView::~SceneCameraView() { + g_StudioApp.GetCore()->GetDispatch()->RemovePresentationChangeListener(this); delete m_ui; } +void SceneCameraView::OnNewPresentation() +{ + m_ui->scrollArea->setPresentationAvailable(true); +} + +void SceneCameraView::OnClosingPresentation() +{ + m_ui->scrollArea->setPresentationAvailable(false); +} + void SceneCameraView::wheelEvent(QWheelEvent *e) { m_zoomPoint = m_ui->scrollArea->viewport()->mapFrom(this, e->pos()); @@ -151,7 +163,7 @@ void SceneCameraView::doUpdate() // There is no event for presentation size change, so update every frame to catch the change m_ui->scrollArea->setPresentationSize( g_StudioApp.GetCore()->GetStudioProjectSettings()->getPresentationSize()); - m_ui->scrollArea->glWidget()->update(); + m_ui->scrollArea->glWidget()->requestRender(); } void SceneCameraView::requestUpdate() diff --git a/src/Authoring/Studio/Palettes/scenecamera/scenecameraview.h b/src/Authoring/Studio/Palettes/scenecamera/scenecameraview.h index e2bfb05b..299115d0 100644 --- a/src/Authoring/Studio/Palettes/scenecamera/scenecameraview.h +++ b/src/Authoring/Studio/Palettes/scenecamera/scenecameraview.h @@ -29,6 +29,8 @@ #ifndef SCENECAMERAVIEW_H #define SCENECAMERAVIEW_H +#include "DispatchListeners.h" + #include <QtWidgets/qwidget.h> #include <QtCore/qtimer.h> @@ -44,7 +46,8 @@ QT_END_NAMESPACE class CMainFrame; -class SceneCameraView : public QWidget +class SceneCameraView : public QWidget, + public CPresentationChangeListener { Q_OBJECT @@ -52,6 +55,10 @@ public: explicit SceneCameraView(CMainFrame *mainFrame, QWidget *parent = 0); ~SceneCameraView(); + // CPresentationChangeListener + void OnNewPresentation() override; + void OnClosingPresentation() override; + protected: void wheelEvent(QWheelEvent *e) override; void resizeEvent(QResizeEvent *e) override; |