summaryrefslogtreecommitdiffstats
path: root/src/Authoring/Studio/Palettes
diff options
context:
space:
mode:
Diffstat (limited to 'src/Authoring/Studio/Palettes')
-rw-r--r--src/Authoring/Studio/Palettes/scenecamera/scenecameraglwidget.cpp66
-rw-r--r--src/Authoring/Studio/Palettes/scenecamera/scenecameraglwidget.h13
-rw-r--r--src/Authoring/Studio/Palettes/scenecamera/scenecamerascrollarea.cpp7
-rw-r--r--src/Authoring/Studio/Palettes/scenecamera/scenecamerascrollarea.h1
-rw-r--r--src/Authoring/Studio/Palettes/scenecamera/scenecameraview.cpp18
-rw-r--r--src/Authoring/Studio/Palettes/scenecamera/scenecameraview.h9
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;