summaryrefslogtreecommitdiffstats
path: root/src/datavis3d/engine/abstract3dcontroller.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/datavis3d/engine/abstract3dcontroller.cpp')
-rw-r--r--src/datavis3d/engine/abstract3dcontroller.cpp189
1 files changed, 167 insertions, 22 deletions
diff --git a/src/datavis3d/engine/abstract3dcontroller.cpp b/src/datavis3d/engine/abstract3dcontroller.cpp
index 9b6040c1..fcc75915 100644
--- a/src/datavis3d/engine/abstract3dcontroller.cpp
+++ b/src/datavis3d/engine/abstract3dcontroller.cpp
@@ -22,7 +22,10 @@
#include "q3dvalueaxis.h"
#include "q3dcategoryaxis.h"
#include "abstract3drenderer_p.h"
+#include "q3dcamera.h"
+#include "q3dlight.h"
#include "qabstractdataproxy_p.h"
+#include "qabstract3dinputhandler.h"
#if defined(Q_OS_ANDROID)
#include "qtouch3dinputhandler.h"
@@ -46,8 +49,8 @@ Abstract3DController::Abstract3DController(QRect boundRect, QObject *parent) :
m_labelTransparency(QDataVis::TransparencyNoBackground),
m_isBackgroundEnabled(true),
m_isGridEnabled(true),
- m_cameraHelper(new CameraHelper()),
- m_zoomLevel(100),
+ m_scene(new Q3DScene()),
+ m_activeInputHandler(0),
m_axisX(0),
m_axisY(0),
m_axisZ(0),
@@ -57,25 +60,31 @@ Abstract3DController::Abstract3DController(QRect boundRect, QObject *parent) :
m_renderPending(false)
{
m_theme.useColorTheme(QDataVis::ThemeSystem);
+
+ // Populate the scene
+ m_scene->setCamera(new Q3DCamera());
+ m_scene->setLight(new Q3DLight());
+ m_scene->light()->setPosition(defaultLightPos);
+
+ // Create initial default input handler
+ QAbstract3DInputHandler *inputHandler;
#if defined(Q_OS_ANDROID)
- m_inputHandler = new QTouch3DInputHandler();
+ inputHandler = new QTouch3DInputHandler();
#else
- m_inputHandler = new Q3DInputHandler();
+ inputHandler = new Q3DInputHandler();
#endif
- m_inputHandler->setCamera(m_cameraHelper);
+ inputHandler->d_ptr->m_isDefaultHandler = true;
+ setActiveInputHandler(inputHandler);
}
Abstract3DController::~Abstract3DController()
{
- delete m_cameraHelper;
- delete m_inputHandler;
- // Attached axes are children, so no need to explicitly delete them
-
// Renderer can be in another thread, don't delete it directly in that case
if (m_renderer && m_renderer->thread() != QThread::currentThread())
m_renderer->deleteLater();
else
delete m_renderer;
+ delete m_scene;
}
void Abstract3DController::setRenderer(Abstract3DRenderer *renderer)
@@ -89,16 +98,13 @@ void Abstract3DController::synchDataToRenderer()
if (!m_renderer)
return;
+ m_renderer->updateScene(m_scene);
+
if (m_changeTracker.positionChanged) {
m_renderer->updatePosition(m_boundingRect);
m_changeTracker.positionChanged = false;
}
- if (m_changeTracker.zoomLevelChanged) {
- m_renderer->updateZoomLevel(m_zoomLevel);
- m_changeTracker.zoomLevelChanged = false;
- }
-
if (m_changeTracker.themeChanged) {
m_renderer->updateTheme(m_theme);
m_changeTracker.themeChanged = false;
@@ -306,7 +312,7 @@ void Abstract3DController::render(const GLuint defaultFboHandle)
if (!m_renderer)
return;
- m_renderer->render(m_cameraHelper, defaultFboHandle);
+ m_renderer->render(defaultFboHandle);
#ifdef DISPLAY_RENDER_SPEED
// To get meaningful framerate, don't just do render on demand.
@@ -314,10 +320,47 @@ void Abstract3DController::render(const GLuint defaultFboHandle)
#endif
}
+void Abstract3DController::mouseDoubleClickEvent(QMouseEvent *event)
+{
+ m_activeInputHandler->mouseDoubleClickEvent(event);
+ emitNeedRender();
+}
+
+void Abstract3DController::touchEvent(QTouchEvent *event)
+{
+ m_activeInputHandler->touchEvent(event);
+ emitNeedRender();
+}
+
+void Abstract3DController::mousePressEvent(QMouseEvent *event, const QPoint &mousePos)
+{
+ m_activeInputHandler->mousePressEvent(event, mousePos);
+ emitNeedRender();
+}
+
+void Abstract3DController::mouseReleaseEvent(QMouseEvent *event, const QPoint &mousePos)
+{
+ m_activeInputHandler->mouseReleaseEvent(event, mousePos);
+ emitNeedRender();
+}
+
+void Abstract3DController::mouseMoveEvent(QMouseEvent *event, const QPoint &mousePos)
+{
+ m_activeInputHandler->mouseMoveEvent(event, mousePos);
+ emitNeedRender();
+}
+
+void Abstract3DController::wheelEvent(QWheelEvent *event)
+{
+ m_activeInputHandler->wheelEvent(event);
+ emitNeedRender();
+}
+
void Abstract3DController::setSize(const int width, const int height)
{
m_boundingRect.setWidth(width);
m_boundingRect.setHeight(height);
+ m_scene->setViewportSize(width, height);
m_changeTracker.boundingRectChanged = true;
emitNeedRender();
@@ -336,6 +379,7 @@ const QRect Abstract3DController::boundingRect()
void Abstract3DController::setBoundingRect(const QRect boundingRect)
{
m_boundingRect = boundingRect;
+ m_scene->setViewport(boundingRect);
m_changeTracker.boundingRectChanged = true;
emitNeedRender();
@@ -344,6 +388,7 @@ void Abstract3DController::setBoundingRect(const QRect boundingRect)
void Abstract3DController::setWidth(const int width)
{
m_boundingRect.setWidth(width);
+ m_scene->setViewportSize(width, m_scene->viewport().height());
m_changeTracker.sizeChanged = true;
emitNeedRender();
@@ -357,6 +402,7 @@ int Abstract3DController::width()
void Abstract3DController::setHeight(const int height)
{
m_boundingRect.setHeight(height);
+ m_scene->setViewportSize(m_scene->viewport().width(), height);
m_changeTracker.sizeChanged = true;
emitNeedRender();
@@ -393,6 +439,26 @@ int Abstract3DController::y()
return m_boundingRect.y();
}
+QRect Abstract3DController::mainViewport() const
+{
+ return m_scene->mainViewport();
+}
+
+void Abstract3DController::setMainViewport(const QRect &mainViewport)
+{
+ m_scene->setMainViewport(mainViewport);
+}
+
+QRect Abstract3DController::sliceViewport() const
+{
+ return m_scene->sliceViewport();
+}
+
+void Abstract3DController::setSliceViewport(const QRect &sliceViewport)
+{
+ m_scene->setSliceViewport(sliceViewport);
+}
+
void Abstract3DController::setAxisX(Q3DAbstractAxis *axis)
{
setAxisHelper(Q3DAbstractAxis::AxisOrientationX, axis, &m_axisX);
@@ -525,14 +591,68 @@ void Abstract3DController::setActiveDataProxy(QAbstractDataProxy *proxy)
emitNeedRender();
}
+void Abstract3DController::addInputHandler(QAbstract3DInputHandler *inputHandler)
+{
+ Q_ASSERT(inputHandler);
+ Abstract3DController *owner = qobject_cast<Abstract3DController *>(inputHandler->parent());
+ if (owner != this) {
+ Q_ASSERT_X(!owner, "addInputHandler", "Input handler already attached to another component.");
+ inputHandler->setParent(this);
+ }
+
+ if (!m_inputHandlers.contains(inputHandler))
+ m_inputHandlers.append(inputHandler);
+}
+
+void Abstract3DController::releaseInputHandler(QAbstract3DInputHandler *inputHandler)
+{
+ if (inputHandler && m_inputHandlers.contains(inputHandler)) {
+ // Clear the default status from released default input handler
+ if (inputHandler->d_ptr->m_isDefaultHandler)
+ inputHandler->d_ptr->m_isDefaultHandler = false;
+
+ // If the input handler is in use, remove it
+ if (m_activeInputHandler == inputHandler)
+ setActiveInputHandler(0);
+
+ m_inputHandlers.removeAll(inputHandler);
+ inputHandler->setParent(0);
+ }
+}
+
+void Abstract3DController::setActiveInputHandler(QAbstract3DInputHandler *inputHandler)
+{
+ // If existing input handler is the default input handler, delete it
+ if (m_activeInputHandler) {
+ if (m_activeInputHandler->d_ptr->m_isDefaultHandler) {
+ m_inputHandlers.removeAll(m_activeInputHandler);
+ delete m_activeInputHandler;
+ } else {
+ // Disconnect the old input handler from the scene
+ m_activeInputHandler->setScene(0);
+ }
+ }
+
+ // Assume ownership and connect to this controller's scene
+ addInputHandler(inputHandler);
+ m_activeInputHandler = inputHandler;
+ if (m_activeInputHandler)
+ m_activeInputHandler->setScene(m_scene);
+}
+
+QAbstract3DInputHandler* Abstract3DController::activeInputHandler()
+{
+ return m_activeInputHandler;
+}
+
int Abstract3DController::zoomLevel()
{
- return m_zoomLevel;
+ return m_scene->camera()->zoomLevel();
}
void Abstract3DController::setZoomLevel(int zoomLevel)
{
- m_zoomLevel = zoomLevel;
+ m_scene->camera()->setZoomLevel(zoomLevel);
m_changeTracker.zoomLevelChanged = true;
emitNeedRender();
@@ -540,7 +660,7 @@ void Abstract3DController::setZoomLevel(int zoomLevel)
void Abstract3DController::setCameraPreset(QDataVis::CameraPreset preset)
{
- m_cameraHelper->setCameraPreset(preset);
+ m_scene->camera()->setCameraPreset(preset);
emitNeedRender();
}
@@ -548,10 +668,9 @@ void Abstract3DController::setCameraPosition(GLfloat horizontal, GLfloat vertica
{
m_horizontalRotation = qBound(-180.0f, horizontal, 180.0f);
m_verticalRotation = qBound(0.0f, vertical, 90.0f);
- m_zoomLevel = qBound(10, distance, 500);
- m_changeTracker.zoomLevelChanged = true;
- m_cameraHelper->setCameraRotation(QPointF(m_horizontalRotation,
- m_verticalRotation));
+ m_scene->camera()->setZoomLevel(qBound(10, distance, 500));
+ m_scene->camera()->setRotations(QPointF(m_horizontalRotation,
+ m_verticalRotation));
//qDebug() << "camera rotation set to" << m_horizontalRotation << m_verticalRotation;
emitNeedRender();
}
@@ -657,6 +776,27 @@ bool Abstract3DController::gridEnabled()
return m_isGridEnabled;
}
+bool Abstract3DController::isSlicingActive()
+{
+ return m_scene->isSlicingActivated();
+}
+
+void Abstract3DController::setSlicingActive(bool isSlicing)
+{
+ m_scene->setSlicingActivated(isSlicing);
+ emitNeedRender();
+}
+
+QDataVis::InputState Abstract3DController::inputState()
+{
+ return m_activeInputHandler->inputState();
+}
+
+QPoint Abstract3DController::inputPosition()
+{
+ return m_activeInputHandler->inputPosition();
+}
+
void Abstract3DController::setMeshFileName(const QString &fileName)
{
m_objFile = fileName;
@@ -669,6 +809,11 @@ QString Abstract3DController::meshFileName()
return m_objFile;
}
+Q3DScene *Abstract3DController::scene()
+{
+ return m_scene;
+}
+
void Abstract3DController::handleAxisTitleChanged(const QString &title)
{
Q_UNUSED(title)