summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/Authoring/Studio/MainFrm.cpp1
-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
-rw-r--r--src/Authoring/Studio/Render/IStudioRenderer.h6
-rw-r--r--src/Authoring/Studio/Render/Q3DSManipulationWidget.cpp5
-rw-r--r--src/Authoring/Studio/Render/Q3DSManipulationWidget.h3
-rw-r--r--src/Authoring/Studio/Render/Q3DSTranslation.cpp220
-rw-r--r--src/Authoring/Studio/Render/Q3DSTranslation.h11
-rw-r--r--src/Authoring/Studio/Render/Q3DSVisualAidWidget.cpp5
-rw-r--r--src/Authoring/Studio/Render/Q3DSVisualAidWidget.h1
-rw-r--r--src/Authoring/Studio/Render/Q3DStudioRenderer.cpp99
-rw-r--r--src/Authoring/Studio/Render/Q3DStudioRenderer.h9
-rw-r--r--src/Authoring/Studio/UI/Q3DSPlayerWidget.cpp2
-rw-r--r--src/Authoring/Studio/UI/Q3DSPlayerWnd.h1
18 files changed, 302 insertions, 175 deletions
diff --git a/src/Authoring/Studio/MainFrm.cpp b/src/Authoring/Studio/MainFrm.cpp
index 9bf14265..334e0936 100644
--- a/src/Authoring/Studio/MainFrm.cpp
+++ b/src/Authoring/Studio/MainFrm.cpp
@@ -1628,7 +1628,6 @@ void CMainFrame::onUpdateViewSceneCamera()
const bool cameraVisible = m_paletteManager->IsControlVisible(
CPaletteManager::CONTROLTYPE_SCENECAMERA);
m_ui->actionSceneCamera->setChecked(cameraVisible);
- g_StudioApp.getRenderer().setFullSizePreview(cameraVisible);
}
//==============================================================================
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;
diff --git a/src/Authoring/Studio/Render/IStudioRenderer.h b/src/Authoring/Studio/Render/IStudioRenderer.h
index afea2f48..bfd8615d 100644
--- a/src/Authoring/Studio/Render/IStudioRenderer.h
+++ b/src/Authoring/Studio/Render/IStudioRenderer.h
@@ -55,10 +55,9 @@ public:
virtual bool IsInitialized() = 0;
- virtual void initialize(QOpenGLWidget *widget) = 0;
+ virtual void initialize(QOpenGLWidget *widget, bool hasPresentation) = 0;
virtual void SetViewRect(const QRect &inRect, const QSize &size) = 0;
- virtual void setFullSizePreview(bool enabled) = 0;
virtual void GetEditCameraList(QStringList &outCameras) = 0;
virtual void SetPolygonFillModeEnabled(bool inEnableFillMode) = 0;
@@ -83,12 +82,11 @@ public:
// synchronously render the content
virtual void renderNow() = 0;
- virtual void getPreviewFbo(QSize &outFboDim, qt3ds::QT3DSU32 &outFboTexture) = 0;
virtual void RegisterSubpresentations(
const QVector<SubPresentationRecord> &subpresentations) = 0;
// Uses the global studio app to get the doc and dispatch.
- static std::shared_ptr<IStudioRenderer> CreateStudioRenderer();
+ static std::shared_ptr<IStudioRenderer> CreateStudioRenderer(bool sceneCameraMode = false);
};
};
diff --git a/src/Authoring/Studio/Render/Q3DSManipulationWidget.cpp b/src/Authoring/Studio/Render/Q3DSManipulationWidget.cpp
index 87232aa7..925d61c3 100644
--- a/src/Authoring/Studio/Render/Q3DSManipulationWidget.cpp
+++ b/src/Authoring/Studio/Render/Q3DSManipulationWidget.cpp
@@ -34,6 +34,11 @@
namespace Q3DStudio {
+Q3DSManipulationWidget::~Q3DSManipulationWidget()
+{
+ destroyManipulators();
+}
+
bool Q3DSManipulationWidget::hasManipulators() const
{
return m_manipulators.size() > 0;
diff --git a/src/Authoring/Studio/Render/Q3DSManipulationWidget.h b/src/Authoring/Studio/Render/Q3DSManipulationWidget.h
index daa8c65b..f4cce682 100644
--- a/src/Authoring/Studio/Render/Q3DSManipulationWidget.h
+++ b/src/Authoring/Studio/Render/Q3DSManipulationWidget.h
@@ -43,6 +43,9 @@ enum class ManipulationWidgetType
class Q3DSManipulationWidget
{
public:
+ Q3DSManipulationWidget() {}
+ ~Q3DSManipulationWidget();
+
bool hasManipulators() const;
bool isXAxis(Q3DSGraphObject *obj) const;
bool isYAxis(Q3DSGraphObject *obj) const;
diff --git a/src/Authoring/Studio/Render/Q3DSTranslation.cpp b/src/Authoring/Studio/Render/Q3DSTranslation.cpp
index 14436ead..311fac57 100644
--- a/src/Authoring/Studio/Render/Q3DSTranslation.cpp
+++ b/src/Authoring/Studio/Render/Q3DSTranslation.cpp
@@ -247,7 +247,8 @@ static inline float makeNiceRotation(float inAngle)
}
Q3DSTranslation::Q3DSTranslation(Q3DStudioRenderer &inRenderer,
- const QSharedPointer<Q3DSUipPresentation> &presentation)
+ const QSharedPointer<Q3DSUipPresentation> &presentation,
+ bool sceneCameraMode)
: m_studioRenderer(inRenderer)
, m_doc(*g_StudioApp.GetCore()->GetDoc())
, m_reader(m_doc.GetDocumentReader())
@@ -258,7 +259,13 @@ Q3DSTranslation::Q3DSTranslation(Q3DStudioRenderer &inRenderer,
, m_assetGraph(*m_doc.GetAssetGraph())
, m_engine(inRenderer.engine())
, m_presentation(presentation)
+ , m_sceneCameraMode(sceneCameraMode)
{
+ if (!m_sceneCameraMode) {
+ m_selectionWidget = new Q3DSSelectionWidget();
+ m_manipulationWidget = new Q3DSManipulationWidget();
+ }
+
qt3dsdm::Qt3DSDMInstanceHandle sceneRoot = m_assetGraph.GetRoot(0);
m_graphIterator.ClearResults();
m_assetGraph.GetDepthFirst(m_graphIterator, sceneRoot);
@@ -354,6 +361,13 @@ Q3DSTranslation::Q3DSTranslation(Q3DStudioRenderer &inRenderer,
enableForegroundLayer();
}
+Q3DSTranslation::~Q3DSTranslation()
+{
+ delete m_manipulationWidget;
+ delete m_selectionWidget;
+ disableVisualAids();
+}
+
Q3DSTranslation::THandleTranslatorPairList &Q3DSTranslation::getTranslatorsForInstance(
qt3dsdm::Qt3DSDMInstanceHandle instance)
{
@@ -481,17 +495,17 @@ QVector4D Q3DSTranslation::calculateWidgetArrowDrag(const QPoint &mousePos,
// Find the direction of the drag and the best plane to map against that is parallel
// to the direction vector
- if (m_manipulationWidget.isXAxis(m_pickedWidget)) {
+ if (m_manipulationWidget->isXAxis(m_pickedWidget)) {
direction = getXAxis(m_dragNodeGlobalTransform);
plane1 = getYAxis(m_dragNodeGlobalTransform);
plane2 = getZAxis(m_dragNodeGlobalTransform);
distanceMultiplier = -1.f;
- } else if (m_manipulationWidget.isYAxis(m_pickedWidget)) {
+ } else if (m_manipulationWidget->isYAxis(m_pickedWidget)) {
plane1 = getXAxis(m_dragNodeGlobalTransform);
direction = getYAxis(m_dragNodeGlobalTransform);
plane2 = getZAxis(m_dragNodeGlobalTransform);
distanceMultiplier = -1.f;
- } else if (m_manipulationWidget.isZAxis(m_pickedWidget)) {
+ } else if (m_manipulationWidget->isZAxis(m_pickedWidget)) {
plane1 = getXAxis(m_dragNodeGlobalTransform);
plane2 = getYAxis(m_dragNodeGlobalTransform);
direction = getZAxis(m_dragNodeGlobalTransform);
@@ -865,7 +879,8 @@ Q3DSGraphObjectTranslator *Q3DSTranslation::createTranslator(
case qt3dsdm::ComposerObjectTypes::Layer: {
Q3DSLayerTranslator *t
= new Q3DSLayerTranslator(instance, *m_presentation->newObject<Q3DSLayerNode>(id));
- m_layerTranslators.push_back(t);
+ if (!m_sceneCameraMode)
+ m_layerTranslators.push_back(t);
translator = t;
break;
}
@@ -876,14 +891,16 @@ Q3DSGraphObjectTranslator *Q3DSTranslation::createTranslator(
case qt3dsdm::ComposerObjectTypes::Camera: {
Q3DSCameraTranslator *t
= new Q3DSCameraTranslator(instance, *m_presentation->newObject<Q3DSCameraNode>(id));
- m_cameraTranslators.push_back(t);
+ if (!m_sceneCameraMode)
+ m_cameraTranslators.push_back(t);
translator = t;
break;
}
case qt3dsdm::ComposerObjectTypes::Light: {
Q3DSLightTranslator *t = new Q3DSLightTranslator(
instance, *m_presentation->newObject<Q3DSLightNode>(id));
- m_lightTranslators.push_back(t);
+ if (!m_sceneCameraMode)
+ m_lightTranslators.push_back(t);
translator = t;
break;
}
@@ -986,6 +1003,10 @@ void Q3DSTranslation::releaseTranslator(Q3DSGraphObjectTranslator *translator)
if (static_cast<Q3DSCameraTranslator *>(translator))
m_cameraTranslators.removeAll(static_cast<Q3DSCameraTranslator *>(translator));
+ if (static_cast<Q3DSLightTranslator *>(translator))
+ m_lightTranslators.removeAll(static_cast<Q3DSLightTranslator *>(translator));
+ if (static_cast<Q3DSLayerTranslator *>(translator))
+ m_layerTranslators.removeAll(static_cast<Q3DSLayerTranslator *>(translator));
if (static_cast<Q3DSReferencedMaterialTranslator *>(translator))
m_refMatTranslators.removeAll(static_cast<Q3DSReferencedMaterialTranslator *>(translator));
@@ -1067,8 +1088,10 @@ void Q3DSTranslation::prepareRender(const QRect &rect, const QSize &size, qreal
m_rect = rect;
m_size = size;
m_pixelRatio = pixelRatio;
- m_manipulationWidget.setDefaultScale(
- QVector3D(float(m_pixelRatio), float(m_pixelRatio), float(m_pixelRatio)));
+ if (m_manipulationWidget) {
+ m_manipulationWidget->setDefaultScale(
+ QVector3D(float(m_pixelRatio), float(m_pixelRatio), float(m_pixelRatio)));
+ }
}
}
@@ -1199,7 +1222,7 @@ void Q3DSTranslation::wheelZoom(qreal factor)
void Q3DSTranslation::enableBackgroundLayer()
{
- if (!m_backgroundLayer) {
+ if (!m_backgroundLayer && !m_sceneCameraMode) {
m_backgroundLayer = m_presentation->newObject<Q3DSLayerNode>("StudioBackgroundLayer_");
m_scene->appendChildNode(m_backgroundLayer);
m_presentation->masterSlide()->addObject(m_backgroundLayer);
@@ -1211,7 +1234,7 @@ void Q3DSTranslation::enableBackgroundLayer()
void Q3DSTranslation::enableForegroundLayer()
{
- if (!m_foregroundLayer && !m_foregroundPickingLayer) {
+ if (!m_foregroundLayer && !m_foregroundPickingLayer && !m_sceneCameraMode) {
m_foregroundLayer = m_presentation->newObject<Q3DSLayerNode>("StudioForegroundLayer_");
m_scene->prependChildNode(m_foregroundLayer);
m_presentation->masterSlide()->addObject(m_foregroundLayer);
@@ -1245,7 +1268,7 @@ void Q3DSTranslation::disableGradient()
void Q3DSTranslation::enableGradient()
{
- if (m_cameraType != m_editCameraInfo.m_cameraType) {
+ if (m_cameraType != m_editCameraInfo.m_cameraType && !m_sceneCameraMode) {
disableGradient();
if (m_backgroundLayer) {
m_gradient = m_presentation->newObject<Q3DSModelNode>("StudioGradient_");
@@ -1333,6 +1356,9 @@ void Q3DSTranslation::enableGradient()
void Q3DSTranslation::selectObject(Qt3DSDMInstanceHandle instance)
{
+ if (m_sceneCameraMode)
+ return;
+
Q3DSGraphObjectTranslator *translator = getOrCreateTranslator(instance);
if (!translator)
return;
@@ -1342,21 +1368,29 @@ void Q3DSTranslation::selectObject(Qt3DSDMInstanceHandle instance)
enableManipulationWidget();
const auto layer = layerForNode(m_selectedObject);
- if (layer)
- m_selectionWidget.select(m_presentation.data(), static_cast<Q3DSNode *>(m_selectedObject));
- else
- m_selectionWidget.deselect();
+ if (layer) {
+ m_selectionWidget->select(m_presentation.data(),
+ static_cast<Q3DSNode *>(m_selectedObject));
+ } else {
+ m_selectionWidget->deselect();
+ }
}
void Q3DSTranslation::unselectObject()
{
+ if (m_sceneCameraMode)
+ return;
+
m_selectedObject = nullptr;
- m_manipulationWidget.destroyManipulators();
- m_selectionWidget.deselect();
+ m_manipulationWidget->destroyManipulators();
+ m_selectionWidget->deselect();
}
void Q3DSTranslation::enableManipulationWidget()
{
+ if (m_sceneCameraMode)
+ return;
+
if (!m_selectedObject || (m_selectedObject->type() != Q3DSGraphObject::Model
&& m_selectedObject->type() != Q3DSGraphObject::Alias
&& m_selectedObject->type() != Q3DSGraphObject::Group
@@ -1364,7 +1398,7 @@ void Q3DSTranslation::enableManipulationWidget()
&& m_selectedObject->type() != Q3DSGraphObject::Camera
&& m_selectedObject->type() != Q3DSGraphObject::Text
&& m_selectedObject->type() != Q3DSGraphObject::Component)) {
- m_manipulationWidget.setEyeballEnabled(false);
+ m_manipulationWidget->setEyeballEnabled(false);
}
updateForegroundLayerProperties();
@@ -1373,22 +1407,22 @@ void Q3DSTranslation::enableManipulationWidget()
void Q3DSTranslation::disableVisualAids()
{
- if (!m_visualAids.empty()) {
- for (int i = 0; i < m_visualAids.size(); ++i)
- m_visualAids[i].destroy();
- m_visualAids.clear();
- }
+ qDeleteAll(m_visualAids);
+ m_visualAids.clear();
}
void Q3DSTranslation::enableVisualAids()
{
+ if (m_sceneCameraMode)
+ return;
+
m_visualAids.reserve(m_cameraTranslators.size() + m_lightTranslators.size());
for (auto &camera : qAsConst(m_cameraTranslators)) {
if (m_selectedLayer != nullptr
&& layerForNode(&camera->graphObject()) == m_selectedLayer) {
bool alreadyCreated = false;
for (auto &visualAid : qAsConst(m_visualAids)) {
- if (visualAid.hasGraphObject(&camera->graphObject())) {
+ if (visualAid->hasGraphObject(&camera->graphObject())) {
alreadyCreated = true;
break;
}
@@ -1396,14 +1430,15 @@ void Q3DSTranslation::enableVisualAids()
if (alreadyCreated)
continue;
- m_visualAids.append(Q3DSVisualAidWidget(m_presentation.data(), m_foregroundLayer,
- m_foregroundPickingLayer,
- VisualAidType::Camera, &camera->graphObject(),
- m_visualAidIndex++));
+ m_visualAids.append(new Q3DSVisualAidWidget(
+ m_presentation.data(), m_foregroundLayer,
+ m_foregroundPickingLayer,
+ VisualAidType::Camera, &camera->graphObject(),
+ m_visualAidIndex++));
} else {
for (int i = m_visualAids.size() - 1; i >= 0; --i) {
- if (m_visualAids[i].hasGraphObject(&camera->graphObject())) {
- m_visualAids[i].destroy();
+ if (m_visualAids[i]->hasGraphObject(&camera->graphObject())) {
+ delete m_visualAids[i];
m_visualAids.remove(i);
}
}
@@ -1424,11 +1459,11 @@ void Q3DSTranslation::enableVisualAids()
bool alreadyCreated = false;
for (int i = m_visualAids.size() - 1; i >= 0; --i) {
- if (m_visualAids[i].hasGraphObject(&light->graphObject())) {
- if (m_visualAids[i].type() == newVisualAidType) {
+ if (m_visualAids[i]->hasGraphObject(&light->graphObject())) {
+ if (m_visualAids[i]->type() == newVisualAidType) {
alreadyCreated = true;
} else {
- m_visualAids[i].destroy();
+ delete m_visualAids[i];
m_visualAids.remove(i);
}
break;
@@ -1438,13 +1473,14 @@ void Q3DSTranslation::enableVisualAids()
if (alreadyCreated)
continue;
- m_visualAids.append(Q3DSVisualAidWidget(m_presentation.data(), m_foregroundLayer,
- m_foregroundPickingLayer, newVisualAidType,
- &light->graphObject(), m_visualAidIndex++));
+ m_visualAids.append(new Q3DSVisualAidWidget(
+ m_presentation.data(), m_foregroundLayer,
+ m_foregroundPickingLayer, newVisualAidType,
+ &light->graphObject(), m_visualAidIndex++));
} else {
for (int i = m_visualAids.size() - 1; i >= 0; --i) {
- if (m_visualAids[i].hasGraphObject(&light->graphObject())) {
- m_visualAids[i].destroy();
+ if (m_visualAids[i]->hasGraphObject(&light->graphObject())) {
+ delete m_visualAids[i];
m_visualAids.remove(i);
}
}
@@ -1485,9 +1521,13 @@ Q3DSCameraNode *Q3DSTranslation::cameraForNode(Q3DSGraphObject *node, bool ignor
void Q3DSTranslation::updateForegroundLayerProperties()
{
+ if (m_sceneCameraMode)
+ return;
+
if (m_foregroundLayer && m_foregroundPickingLayer && !m_foregroundCamera
&& !m_foregroundPickingCamera) {
- m_foregroundCamera = m_presentation->newObject<Q3DSCameraNode>("StudioForegroundCamera_");
+ m_foregroundCamera
+ = m_presentation->newObject<Q3DSCameraNode>("StudioForegroundCamera_");
m_foregroundLayer->appendChildNode(m_foregroundCamera);
m_presentation->masterSlide()->addObject(m_foregroundCamera);
@@ -1580,8 +1620,7 @@ void Q3DSTranslation::updateForegroundLayerProperties()
list.clear();
list.append(m_foregroundPickingLayer->setHorizontalFields(
m_selectedLayer->horizontalFields()));
- list.append(m_foregroundPickingLayer->setVerticalFields(
- m_selectedLayer->verticalFields()));
+ list.append(m_foregroundPickingLayer->setVerticalFields(m_selectedLayer->verticalFields()));
list.append(m_foregroundPickingLayer->setTopUnits(m_selectedLayer->topUnits()));
list.append(m_foregroundPickingLayer->setLeftUnits(m_selectedLayer->leftUnits()));
list.append(m_foregroundPickingLayer->setRightUnits(m_selectedLayer->rightUnits()));
@@ -1600,34 +1639,39 @@ void Q3DSTranslation::updateForegroundLayerProperties()
void Q3DSTranslation::updateWidgetProperties()
{
+ if (m_sceneCameraMode)
+ return;
+
if (m_selectedObject) {
- if (!m_manipulationWidget.hasManipulators()) {
+ if (!m_manipulationWidget->hasManipulators()) {
createManipulationWidget();
} else if (g_StudioApp.GetToolMode() != m_toolMode) {
- m_manipulationWidget.destroyManipulators();
+ m_manipulationWidget->destroyManipulators();
createManipulationWidget();
}
- m_manipulationWidget.setEyeballEnabled(false);
+ m_manipulationWidget->setEyeballEnabled(false);
if (m_foregroundPickingCamera) {
const auto camera = cameraForNode(m_selectedObject, true);
const auto layer = layerForNode(m_selectedObject);
if (camera && layer) {
- m_manipulationWidget.applyProperties(m_selectedObject, camera, layer,
- g_StudioApp.GetManipulationMode() == StudioManipulationModes::Global);
+ m_manipulationWidget->applyProperties(
+ m_selectedObject, camera, layer,
+ g_StudioApp.GetManipulationMode()
+ == StudioManipulationModes::Global);
}
}
- }
- m_selectionWidget.update();
+ m_selectionWidget->update();
- if (m_cameraType == EditCameraTypes::SceneCamera) {
- disableVisualAids();
- } else {
- enableVisualAids();
- if (m_foregroundCamera) {
- for (int i = 0; i < m_visualAids.size(); ++i)
- m_visualAids[i].update(m_foregroundCamera, m_selectedObject);
+ if (m_cameraType == EditCameraTypes::SceneCamera) {
+ disableVisualAids();
+ } else {
+ enableVisualAids();
+ if (m_foregroundCamera) {
+ for (int i = 0; i < m_visualAids.size(); ++i)
+ m_visualAids[i]->update(m_foregroundCamera, m_selectedObject);
+ }
}
}
}
@@ -1636,13 +1680,13 @@ void Q3DSTranslation::createManipulationWidget()
{
m_toolMode = g_StudioApp.GetToolMode();
if (m_toolMode == STUDIO_TOOLMODE_MOVE) {
- m_manipulationWidget.createManipulators(m_presentation.data(), m_foregroundPickingLayer,
+ m_manipulationWidget->createManipulators(m_presentation.data(), m_foregroundPickingLayer,
ManipulationWidgetType::Translation);
} else if (m_toolMode == STUDIO_TOOLMODE_ROTATE) {
- m_manipulationWidget.createManipulators(m_presentation.data(), m_foregroundPickingLayer,
+ m_manipulationWidget->createManipulators(m_presentation.data(), m_foregroundPickingLayer,
ManipulationWidgetType::Rotation);
} else if (m_toolMode == STUDIO_TOOLMODE_SCALE) {
- m_manipulationWidget.createManipulators(m_presentation.data(), m_foregroundPickingLayer,
+ m_manipulationWidget->createManipulators(m_presentation.data(), m_foregroundPickingLayer,
ManipulationWidgetType::Scale);
}
}
@@ -1680,10 +1724,10 @@ void Q3DSTranslation::prepareDrag(const QPoint &mousePos, Q3DSGraphObjectTransla
void Q3DSTranslation::prepareWidgetDrag(const QPoint &mousePos, Q3DSGraphObject *obj)
{
- for (auto &visualAid : qAsConst(m_visualAids)) {
- if (visualAid.hasCollisionBox(obj)) {
+ for (auto visualAid : qAsConst(m_visualAids)) {
+ if (visualAid->hasCollisionBox(obj)) {
auto visualAidTranslator = Q3DSGraphObjectTranslator::translatorForObject(
- visualAid.graphObject());
+ visualAid->graphObject());
m_doc.SelectDataModelObject(visualAidTranslator->instanceHandle());
prepareDrag(mousePos, visualAidTranslator);
return;
@@ -1691,7 +1735,7 @@ void Q3DSTranslation::prepareWidgetDrag(const QPoint &mousePos, Q3DSGraphObject
}
m_pickedWidget = obj;
- m_manipulationWidget.setColor(m_pickedWidget, Qt::yellow);
+ m_manipulationWidget->setColor(m_pickedWidget, Qt::yellow);
prepareDrag(mousePos);
}
@@ -1734,8 +1778,8 @@ void Q3DSTranslation::endDrag(bool dragReset, CUpdateableDocumentEditor &inEdito
void Q3DSTranslation::endPickWidget()
{
if (m_pickedWidget) {
- m_manipulationWidget.resetColor(m_pickedWidget);
- m_manipulationWidget.resetScale(m_pickedWidget);
+ m_manipulationWidget->resetColor(m_pickedWidget);
+ m_manipulationWidget->resetScale(m_pickedWidget);
}
m_pickedWidget = nullptr;
}
@@ -1812,17 +1856,17 @@ void Q3DSTranslation::translateAlongWidget(const QPoint &inMouseCoords,
Q3DSNode *node = m_dragTranslator->graphObject<Q3DSNode>();
- if (m_manipulationWidget.isXAxis(m_pickedWidget)
- || m_manipulationWidget.isYAxis(m_pickedWidget)
- || m_manipulationWidget.isZAxis(m_pickedWidget)) {
+ if (m_manipulationWidget->isXAxis(m_pickedWidget)
+ || m_manipulationWidget->isYAxis(m_pickedWidget)
+ || m_manipulationWidget->isZAxis(m_pickedWidget)) {
m_currentDragState.t = calculateWidgetArrowDrag(mousePos).toVector3D();
} else {
QVector3D planeNormal;
- if (m_manipulationWidget.isXYPlane(m_pickedWidget))
+ if (m_manipulationWidget->isXYPlane(m_pickedWidget))
planeNormal = getZAxis(m_dragNodeGlobalTransform);
- else if (m_manipulationWidget.isYZPlane(m_pickedWidget))
+ else if (m_manipulationWidget->isYZPlane(m_pickedWidget))
planeNormal = getXAxis(m_dragNodeGlobalTransform);
- else if (m_manipulationWidget.isZXPlane(m_pickedWidget))
+ else if (m_manipulationWidget->isZXPlane(m_pickedWidget))
planeNormal = getYAxis(m_dragNodeGlobalTransform);
m_currentDragState.t = mousePointToPlaneIntersection(
mousePos, m_dragCamera, node, m_beginDragState.t, planeNormal, false);
@@ -1903,18 +1947,18 @@ void Q3DSTranslation::scaleAlongWidget(const QPoint &inOriginalCoords, const QPo
Q3DSNode *node = m_dragTranslator->graphObject<Q3DSNode>();
QVector3D scaleVec(1.f, 1.f, 1.f);
- if (m_manipulationWidget.isXAxis(m_pickedWidget)
- || m_manipulationWidget.isYAxis(m_pickedWidget)
- || m_manipulationWidget.isZAxis(m_pickedWidget)) {
+ if (m_manipulationWidget->isXAxis(m_pickedWidget)
+ || m_manipulationWidget->isYAxis(m_pickedWidget)
+ || m_manipulationWidget->isZAxis(m_pickedWidget)) {
float distance = calculateWidgetArrowDrag(mousePos).w();
float scaleAmount = distance / scaleRatio;
float magnitude = 1.f + scaleAmount;
if (g_StudioApp.GetManipulationMode() == StudioManipulationModes::Local) {
- if (m_manipulationWidget.isXAxis(m_pickedWidget))
+ if (m_manipulationWidget->isXAxis(m_pickedWidget))
scaleVec = QVector3D(magnitude, 1.f, 1.f);
- else if (m_manipulationWidget.isYAxis(m_pickedWidget))
+ else if (m_manipulationWidget->isYAxis(m_pickedWidget))
scaleVec = QVector3D(1.f, magnitude, 1.f);
- else if (m_manipulationWidget.isZAxis(m_pickedWidget))
+ else if (m_manipulationWidget->isZAxis(m_pickedWidget))
scaleVec = QVector3D(1.f, 1.f, magnitude);
} else {
scaleVec = QVector3D(1, 1, 1) + calculateWidgetDragScale(mousePos, node, scaleRatio);
@@ -1926,7 +1970,7 @@ void Q3DSTranslation::scaleAlongWidget(const QPoint &inOriginalCoords, const QPo
QVector3D planeNormal;
if (g_StudioApp.GetManipulationMode() == StudioManipulationModes::Local) {
- if (m_manipulationWidget.isXYPlane(m_pickedWidget)) {
+ if (m_manipulationWidget->isXYPlane(m_pickedWidget)) {
planeNormal = getZAxis(m_dragNodeGlobalTransform);
xScale = 1.f + calculateWidgetArrowDrag(
mousePos, planeNormal, getXAxis(m_dragNodeGlobalTransform)).w()
@@ -1935,7 +1979,7 @@ void Q3DSTranslation::scaleAlongWidget(const QPoint &inOriginalCoords, const QPo
mousePos, planeNormal, getYAxis(m_dragNodeGlobalTransform)).w()
/ -scaleRatio;
scaleVec = QVector3D(xScale, yScale, 1.f);
- } else if (m_manipulationWidget.isYZPlane(m_pickedWidget)) {
+ } else if (m_manipulationWidget->isYZPlane(m_pickedWidget)) {
planeNormal = getXAxis(m_dragNodeGlobalTransform);
yScale = 1.f + calculateWidgetArrowDrag(
mousePos, planeNormal, getYAxis(m_dragNodeGlobalTransform)).w()
@@ -1944,7 +1988,7 @@ void Q3DSTranslation::scaleAlongWidget(const QPoint &inOriginalCoords, const QPo
mousePos, planeNormal, getZAxis(m_dragNodeGlobalTransform)).w()
/ scaleRatio;
scaleVec = QVector3D(1.f, yScale, zScale);
- } else if (m_manipulationWidget.isZXPlane(m_pickedWidget)) {
+ } else if (m_manipulationWidget->isZXPlane(m_pickedWidget)) {
planeNormal = getYAxis(m_dragNodeGlobalTransform);
xScale = 1.f + calculateWidgetArrowDrag(
mousePos, planeNormal, getXAxis(m_dragNodeGlobalTransform)).w()
@@ -1955,21 +1999,21 @@ void Q3DSTranslation::scaleAlongWidget(const QPoint &inOriginalCoords, const QPo
scaleVec = QVector3D(xScale, 1.f, zScale);
}
} else {
- if (m_manipulationWidget.isXYPlane(m_pickedWidget)) {
+ if (m_manipulationWidget->isXYPlane(m_pickedWidget)) {
planeNormal = getZAxis(m_dragNodeGlobalTransform);
scaleVec = QVector3D(1, 1, 1)
+ calculateWidgetDragScale(mousePos, node, scaleRatio, planeNormal,
-getXAxis(m_dragNodeGlobalTransform))
+ calculateWidgetDragScale(mousePos, node, scaleRatio, planeNormal,
-getYAxis(m_dragNodeGlobalTransform));
- } else if (m_manipulationWidget.isYZPlane(m_pickedWidget)) {
+ } else if (m_manipulationWidget->isYZPlane(m_pickedWidget)) {
planeNormal = getXAxis(m_dragNodeGlobalTransform);
scaleVec = QVector3D(1, 1, 1)
+ calculateWidgetDragScale(mousePos, node, scaleRatio, planeNormal,
-getYAxis(m_dragNodeGlobalTransform))
+ calculateWidgetDragScale(mousePos, node, scaleRatio, planeNormal,
getZAxis(m_dragNodeGlobalTransform));
- } else if (m_manipulationWidget.isZXPlane(m_pickedWidget)) {
+ } else if (m_manipulationWidget->isZXPlane(m_pickedWidget)) {
planeNormal = getYAxis(m_dragNodeGlobalTransform);
scaleVec = QVector3D(1, 1, 1)
+ calculateWidgetDragScale(mousePos, node, scaleRatio, planeNormal,
@@ -1986,7 +2030,7 @@ void Q3DSTranslation::scaleAlongWidget(const QPoint &inOriginalCoords, const QPo
// TODO: Fix widget scaling. Only the length of the arrow should scale, not the head.
// TODO: Also the beginning of the arrow should not move while scaling.
// TODO: Also widget shouldn't flip around if scaling goes negative in some direction
- //m_selectionWidget.setScale(m_pickedWidget, scaleVec);
+ //m_selectionWidget->setScale(m_pickedWidget, scaleVec);
Q3DSPropertyChangeList list;
list.append(node->setScale(m_currentDragState.s));
@@ -2136,13 +2180,13 @@ void Q3DSTranslation::rotateAlongWidget(const QPoint &inOriginalCoords,
flipZTranslation(origRay);
QVector3D planeNormal;
- if (m_manipulationWidget.isXYCircle(m_pickedWidget))
+ if (m_manipulationWidget->isXYCircle(m_pickedWidget))
planeNormal = getZAxis(m_dragNodeGlobalTransform);
- else if (m_manipulationWidget.isYZCircle(m_pickedWidget))
+ else if (m_manipulationWidget->isYZCircle(m_pickedWidget))
planeNormal = getXAxis(m_dragNodeGlobalTransform);
- else if (m_manipulationWidget.isZXCircle(m_pickedWidget))
+ else if (m_manipulationWidget->isZXCircle(m_pickedWidget))
planeNormal = getYAxis(m_dragNodeGlobalTransform);
- else if (m_manipulationWidget.isCameraCircle(m_pickedWidget))
+ else if (m_manipulationWidget->isCameraCircle(m_pickedWidget))
planeNormal = getZAxis(cameraMatrix);
flipZTranslation(planeNormal);
diff --git a/src/Authoring/Studio/Render/Q3DSTranslation.h b/src/Authoring/Studio/Render/Q3DSTranslation.h
index 1c7ea328..a15c7036 100644
--- a/src/Authoring/Studio/Render/Q3DSTranslation.h
+++ b/src/Authoring/Studio/Render/Q3DSTranslation.h
@@ -72,7 +72,9 @@ class Q3DSTranslation
{
public:
Q3DSTranslation(Q3DStudioRenderer &inRenderer,
- const QSharedPointer<Q3DSUipPresentation> &presentation);
+ const QSharedPointer<Q3DSUipPresentation> &presentation,
+ bool sceneCameraMode);
+ ~Q3DSTranslation();
protected:
void markPropertyDirty(qt3dsdm::Qt3DSDMInstanceHandle instance,
@@ -175,6 +177,7 @@ private:
Q3DStudio::CGraph &m_assetGraph;
QSharedPointer<Q3DSEngine> m_engine;
QSharedPointer<Q3DSUipPresentation> m_presentation;
+ bool m_sceneCameraMode = false;
// All translator related containers must come after the allocator
TInstanceToTranslatorMap m_translatorMap;
@@ -221,10 +224,10 @@ private:
Q3DSGraphObject *m_pickedWidget = nullptr;
QColor m_pickedWidgetColor;
EditCameraTypes m_cameraType = EditCameraTypes::SceneCamera;
- Q3DSManipulationWidget m_manipulationWidget;
- Q3DSSelectionWidget m_selectionWidget;
+ Q3DSManipulationWidget *m_manipulationWidget = nullptr;
+ Q3DSSelectionWidget *m_selectionWidget = nullptr;
- QVector<Q3DSVisualAidWidget> m_visualAids;
+ QVector<Q3DSVisualAidWidget *> m_visualAids;
quint64 m_visualAidIndex = 0;
struct DragState
diff --git a/src/Authoring/Studio/Render/Q3DSVisualAidWidget.cpp b/src/Authoring/Studio/Render/Q3DSVisualAidWidget.cpp
index 6e2d79ba..3dda9f7a 100644
--- a/src/Authoring/Studio/Render/Q3DSVisualAidWidget.cpp
+++ b/src/Authoring/Studio/Render/Q3DSVisualAidWidget.cpp
@@ -204,6 +204,11 @@ Q3DSVisualAidWidget::Q3DSVisualAidWidget(Q3DSUipPresentation *presentation, Q3DS
}
}
+Q3DSVisualAidWidget::~Q3DSVisualAidWidget()
+{
+ destroy();
+}
+
bool Q3DSVisualAidWidget::isCreated() const
{
return m_wireframe && m_icon && m_collisionBox;
diff --git a/src/Authoring/Studio/Render/Q3DSVisualAidWidget.h b/src/Authoring/Studio/Render/Q3DSVisualAidWidget.h
index 8b8155fe..85837a6d 100644
--- a/src/Authoring/Studio/Render/Q3DSVisualAidWidget.h
+++ b/src/Authoring/Studio/Render/Q3DSVisualAidWidget.h
@@ -49,6 +49,7 @@ public:
Q3DSVisualAidWidget(Q3DSUipPresentation *presentation, Q3DSLayerNode *layer,
Q3DSLayerNode *pickingLayer, VisualAidType type,
Q3DSGraphObject *graphObject, quint64 id);
+ ~Q3DSVisualAidWidget();
bool isCreated() const;
Q3DSGraphObject *graphObject() const;
diff --git a/src/Authoring/Studio/Render/Q3DStudioRenderer.cpp b/src/Authoring/Studio/Render/Q3DStudioRenderer.cpp
index a67e4246..48705909 100644
--- a/src/Authoring/Studio/Render/Q3DStudioRenderer.cpp
+++ b/src/Authoring/Studio/Render/Q3DStudioRenderer.cpp
@@ -56,6 +56,7 @@
#include <Qt3DCore/qaspectengine.h>
#include <Qt3DRender/qrenderaspect.h>
#include <Qt3DRender/private/qrenderaspect_p.h>
+#include <Qt3DCore/private/qaspectengine_p.h>
#include <QtGui/private/qopenglcontext_p.h>
#include <QtGui/qopenglframebufferobject.h>
@@ -85,28 +86,32 @@ static SEditCameraDefinition g_editCameraDefinitions[] = {
static int g_numEditCameras = sizeof(g_editCameraDefinitions)
/ sizeof(*g_editCameraDefinitions);
-Q3DStudioRenderer::Q3DStudioRenderer()
+Q3DStudioRenderer::Q3DStudioRenderer(bool sceneCameraMode)
: m_dispatch(*g_StudioApp.GetCore()->GetDispatch())
, m_doc(*g_StudioApp.GetCore()->GetDoc())
+ , m_guidesEnabled(!sceneCameraMode)
, m_updatableEditor(m_doc)
+ , m_sceneCameraMode(sceneCameraMode)
{
m_dispatch.AddReloadListener(this);
m_dispatch.AddDataModelListener(this);
m_dispatch.AddPresentationChangeListener(this);
- m_selectionSignal
- = m_dispatch.ConnectSelectionChange(std::bind(&Q3DStudioRenderer::onSelectionChange,
- this, std::placeholders::_1));
- m_dispatch.AddSceneDragListener(this);
- m_dispatch.AddToolbarChangeListener(this);
-
- m_rulerColor = CStudioPreferences::GetRulerBackgroundColor();
- m_rulerTickColor = CStudioPreferences::GetRulerTickColor();
- m_guideColor = CStudioPreferences::GetGuideColor();
- m_guideSelectedColor = CStudioPreferences::GetGuideSelectedColor();
- m_guideFillColor = CStudioPreferences::GetGuideFillColor();
- m_guideSelectedFillColor = CStudioPreferences::GetGuideFillSelectedColor();
-
- m_editCameraInformation.resize(g_numEditCameras);
+ if (!m_sceneCameraMode) {
+ m_selectionSignal
+ = m_dispatch.ConnectSelectionChange(std::bind(&Q3DStudioRenderer::onSelectionChange,
+ this, std::placeholders::_1));
+ m_dispatch.AddSceneDragListener(this);
+ m_dispatch.AddToolbarChangeListener(this);
+
+ m_rulerColor = CStudioPreferences::GetRulerBackgroundColor();
+ m_rulerTickColor = CStudioPreferences::GetRulerTickColor();
+ m_guideColor = CStudioPreferences::GetGuideColor();
+ m_guideSelectedColor = CStudioPreferences::GetGuideSelectedColor();
+ m_guideFillColor = CStudioPreferences::GetGuideFillColor();
+ m_guideSelectedFillColor = CStudioPreferences::GetGuideFillSelectedColor();
+
+ m_editCameraInformation.resize(g_numEditCameras);
+ }
// Create engine and presentation as RenderBufferManager needs them before presentation is set
m_engine.reset(new Q3DSEngine);
@@ -122,6 +127,12 @@ Q3DStudioRenderer::Q3DStudioRenderer()
Q3DStudioRenderer::~Q3DStudioRenderer()
{
+ m_dispatch.RemoveDataModelListener(this);
+ m_dispatch.RemovePresentationChangeListener(this);
+ if (!m_sceneCameraMode) {
+ m_dispatch.RemoveSceneDragListener(this);
+ m_dispatch.RemoveToolbarChangeListener(this);
+ }
Close();
}
@@ -198,9 +209,10 @@ bool Q3DStudioRenderer::IsInitialized()
return m_widget != nullptr;
}
-void Q3DStudioRenderer::initialize(QOpenGLWidget *widget)
+void Q3DStudioRenderer::initialize(QOpenGLWidget *widget, bool hasPresentation)
{
m_widget = widget;
+ m_hasPresentation = hasPresentation;
if (m_widget && m_translation.isNull() && m_hasPresentation)
initEngineAndTranslation();
@@ -223,11 +235,6 @@ void Q3DStudioRenderer::SetViewRect(const QRect &inRect, const QSize &size)
sendResizeToQt3D();
}
-void Q3DStudioRenderer::setFullSizePreview(bool enabled)
-{
- // TODO
-}
-
void Q3DStudioRenderer::SetPolygonFillModeEnabled(bool inEnableFillMode)
{
@@ -344,12 +351,6 @@ bool Q3DStudioRenderer::isMouseDown() const
void Q3DStudioRenderer::Close()
{
OnClosingPresentation();
- m_engine.reset();
- m_presentation.reset();
- m_dispatch.RemoveDataModelListener(this);
- m_dispatch.RemovePresentationChangeListener(this);
- m_dispatch.RemoveSceneDragListener(this);
- m_dispatch.RemoveToolbarChangeListener(this);
m_widget = nullptr;
}
@@ -591,10 +592,12 @@ void Q3DStudioRenderer::drawRulersAndGuides(QPainter *painter)
void Q3DStudioRenderer::renderNow()
{
- if (m_setSubpresentationsCalled == false)
- return;
+ // TODO: Not needed until QT3DS-2072 is implemented.
+ // TODO: Subpresentations need to be registered for scene camera preview renderer, too.
+// if (m_setSubpresentationsCalled == false)
+// return;
- initialize(m_widget);
+ initialize(m_widget, m_hasPresentation);
QOpenGLContextPrivate *ctxD = QOpenGLContextPrivate::get(m_widget->context());
QScopedValueRollback<GLuint> defaultFboRedirectRollback(ctxD->defaultFboRedirect, 0);
@@ -620,27 +623,6 @@ void Q3DStudioRenderer::renderNow()
}
}
-void Q3DStudioRenderer::getPreviewFbo(QSize &outFboDim, qt3ds::QT3DSU32 &outFboTexture)
-{
-#ifdef RUNTIME_SPLIT_TEMPORARILY_REMOVED
- if (m_Translation) {
- outFboDim = QSize(m_Translation->m_previewFboDimensions.x,
- m_Translation->m_previewFboDimensions.y);
- // The handle is a void * so first cast to size_t to avoid truncating pointer warning
- if (m_Translation->m_previewTexture) {
- outFboTexture = static_cast<qt3ds::QT3DSU32>(reinterpret_cast<size_t>(
- m_Translation->m_previewTexture->GetTextureObjectHandle()));
- } else {
- outFboTexture = 0;
- }
-
- } else {
- outFboDim = QSize(0, 0);
- outFboTexture = 0;
- }
-#endif
-}
-
void Q3DStudioRenderer::RegisterSubpresentations(
const QVector<SubPresentationRecord> &subpresentations){
m_subpresentations = subpresentations;
@@ -691,6 +673,11 @@ void Q3DStudioRenderer::OnClosingPresentation()
if (!m_engine.isNull() && !m_translation.isNull()) {
m_widget->makeCurrent();
+
+ // Exit the aspect engine loop before shutdown to avoid random crashes
+ if (m_engine->aspectEngine())
+ Qt3DCore::QAspectEnginePrivate::get(m_engine->aspectEngine())->exitSimulationLoop();
+
auto renderAspectD = static_cast<Qt3DRender::QRenderAspectPrivate *>(
Qt3DRender::QRenderAspectPrivate::get(m_renderAspect));
renderAspectD->renderShutdown();
@@ -698,8 +685,8 @@ void Q3DStudioRenderer::OnClosingPresentation()
m_renderAspect = nullptr;
// This will destroy render aspect
- m_engine->setPresentation(nullptr);
m_translation.reset();
+ m_engine->setPresentation(nullptr);
m_engine.reset(new Q3DSEngine);
m_presentation.reset(new Q3DSUipPresentation);
m_viewportSettings.reset(new Q3DSViewportSettings);
@@ -1401,7 +1388,7 @@ void Q3DStudioRenderer::initEngineAndTranslation()
createTranslation();
setupTextRenderer();
- if (m_editCameraIndex != m_pendingEditCameraIndex)
+ if (m_editCameraIndex != m_pendingEditCameraIndex && !m_sceneCameraMode)
SetEditCamera(m_pendingEditCameraIndex);
qDeleteAll(m_discardedPickers);
@@ -1410,7 +1397,7 @@ void Q3DStudioRenderer::initEngineAndTranslation()
void Q3DStudioRenderer::createTranslation()
{
- m_translation.reset(new Q3DSTranslation(*this, m_presentation));
+ m_translation.reset(new Q3DSTranslation(*this, m_presentation, m_sceneCameraMode));
}
void Q3DStudioRenderer::reloadFonts()
@@ -1453,9 +1440,9 @@ void Q3DStudioRenderer::scheduleDirtySetUpdate()
}
}
-std::shared_ptr<IStudioRenderer> IStudioRenderer::CreateStudioRenderer()
+std::shared_ptr<IStudioRenderer> IStudioRenderer::CreateStudioRenderer(bool sceneCameraMode)
{
- return std::shared_ptr<IStudioRenderer>(new Q3DStudioRenderer());
+ return std::shared_ptr<IStudioRenderer>(new Q3DStudioRenderer(sceneCameraMode));
}
}
diff --git a/src/Authoring/Studio/Render/Q3DStudioRenderer.h b/src/Authoring/Studio/Render/Q3DStudioRenderer.h
index 2de0a1ad..412f662e 100644
--- a/src/Authoring/Studio/Render/Q3DStudioRenderer.h
+++ b/src/Authoring/Studio/Render/Q3DStudioRenderer.h
@@ -77,7 +77,7 @@ class Q3DStudioRenderer : public QObject,
Q_OBJECT
public:
- Q3DStudioRenderer();
+ Q3DStudioRenderer(bool sceneCameraMode);
~Q3DStudioRenderer() override;
ITextRenderer *GetTextRenderer() override;
QT3DSVec3 GetIntendedPosition(qt3dsdm::Qt3DSDMInstanceHandle inHandle, CPt inPoint) override;
@@ -88,9 +88,8 @@ public:
void RequestRender() override;
void renderNow() override;
bool IsInitialized() override;
- void initialize(QOpenGLWidget *widget) override;
+ void initialize(QOpenGLWidget *widget, bool hasPresentation) override;
void SetViewRect(const QRect &inRect, const QSize &size) override;
- void setFullSizePreview(bool enabled) override;
void GetEditCameraList(QStringList &outCameras) override;
void SetPolygonFillModeEnabled(bool inEnableFillMode) override;
bool IsPolygonFillModeEnabled() const override;
@@ -104,7 +103,6 @@ public:
void EditCameraZoomToFit() override;
bool isMouseDown() const override;
void Close() override;
- void getPreviewFbo(QSize &outFboDim, qt3ds::QT3DSU32 &outFboTexture) override;
void RegisterSubpresentations(
const QVector<SubPresentationRecord> &subpresentations) override;
void drawRulersAndGuides(QPainter *painter) override;
@@ -190,7 +188,7 @@ private:
QColor m_guideSelectedColor;
QColor m_guideFillColor;
QColor m_guideSelectedFillColor;
- bool m_guidesEnabled = true;
+ bool m_guidesEnabled = false;
bool m_hasPresentation = false;
int m_renderRequested = 0;
bool m_setSubpresentationsCalled = false;
@@ -216,6 +214,7 @@ private:
bool m_resizeToQt3DSent = false;
qreal m_parentPixelRatio = 1.0;
QTimer m_asyncRenderTimer;
+ bool m_sceneCameraMode = false;
};
}
diff --git a/src/Authoring/Studio/UI/Q3DSPlayerWidget.cpp b/src/Authoring/Studio/UI/Q3DSPlayerWidget.cpp
index d3f5e875..8374d118 100644
--- a/src/Authoring/Studio/UI/Q3DSPlayerWidget.cpp
+++ b/src/Authoring/Studio/UI/Q3DSPlayerWidget.cpp
@@ -78,7 +78,7 @@ void Q3DSPlayerWidget::initializeGL()
Q3DStudio::IStudioRenderer &renderer(g_StudioApp.getRenderer());
if (!renderer.IsInitialized()) {
try {
- renderer.initialize(this);
+ renderer.initialize(this, false);
} catch (...) {
QMessageBox::critical(this, tr("Fatal Error"),
tr("Unable to initialize OpenGL.\nThis may be because your "
diff --git a/src/Authoring/Studio/UI/Q3DSPlayerWnd.h b/src/Authoring/Studio/UI/Q3DSPlayerWnd.h
index bf80d09a..bb17951d 100644
--- a/src/Authoring/Studio/UI/Q3DSPlayerWnd.h
+++ b/src/Authoring/Studio/UI/Q3DSPlayerWnd.h
@@ -92,7 +92,6 @@ public:
Q_SIGNALS:
void dropReceived();
- void newFrame();
void toolChanged();
private Q_SLOTS: