diff options
author | Tomi Korpipää <tomi.korpipaa@digia.com> | 2014-05-20 12:58:30 +0300 |
---|---|---|
committer | Tomi Korpipää <tomi.korpipaa@digia.com> | 2014-05-21 06:03:11 +0300 |
commit | 1fe989d12f8fe5c13675158044bb76551fb5eb0f (patch) | |
tree | 7290b159522585b78f57c4fe7f7f30c67b92bfd2 /src/datavisualization | |
parent | b6da9160b2d81283ec9fc082c08987ecc95650da (diff) |
Added support for custom items with absolute coordinates
Task-number: QTRD-3122
Change-Id: Iefd4c4adad45721ed3519bdcecbbfa1e97039f08
Reviewed-by: Mika Salmela <mika.salmela@digia.com>
Diffstat (limited to 'src/datavisualization')
-rw-r--r-- | src/datavisualization/data/customrenderitem_p.h | 3 | ||||
-rw-r--r-- | src/datavisualization/data/qcustom3ditem.cpp | 61 | ||||
-rw-r--r-- | src/datavisualization/data/qcustom3ditem.h | 5 | ||||
-rw-r--r-- | src/datavisualization/data/qcustom3ditem_p.h | 3 | ||||
-rw-r--r-- | src/datavisualization/engine/abstract3drenderer.cpp | 32 | ||||
-rw-r--r-- | src/datavisualization/engine/abstract3drenderer_p.h | 3 | ||||
-rw-r--r-- | src/datavisualization/engine/bars3drenderer.cpp | 24 | ||||
-rw-r--r-- | src/datavisualization/engine/bars3drenderer_p.h | 2 | ||||
-rw-r--r-- | src/datavisualization/engine/scatter3drenderer.cpp | 19 | ||||
-rw-r--r-- | src/datavisualization/engine/scatter3drenderer_p.h | 2 | ||||
-rw-r--r-- | src/datavisualization/engine/surface3drenderer.cpp | 21 | ||||
-rw-r--r-- | src/datavisualization/engine/surface3drenderer_p.h | 2 |
12 files changed, 140 insertions, 37 deletions
diff --git a/src/datavisualization/data/customrenderitem_p.h b/src/datavisualization/data/customrenderitem_p.h index 81a78144..f05540d0 100644 --- a/src/datavisualization/data/customrenderitem_p.h +++ b/src/datavisualization/data/customrenderitem_p.h @@ -51,6 +51,8 @@ public: inline QVector3D scaling() const { return m_scaling; } inline void setPosition(const QVector3D &position) { m_position = position; } inline QVector3D position() const { return m_position; } + inline void setPositionAbsolute(bool absolute) { m_absolute = absolute; } + inline bool isPositionAbsolute() const { return m_absolute; } inline void setBlendNeeded(bool blend) { m_needBlend = blend; } inline bool isBlendNeeded() const { return m_needBlend; } inline void setVisible(bool visible) { m_visible = visible; } @@ -68,6 +70,7 @@ private: GLuint m_texture; QVector3D m_scaling; QVector3D m_position; + bool m_absolute; ObjectHelper *m_object; bool m_needBlend; bool m_visible; diff --git a/src/datavisualization/data/qcustom3ditem.cpp b/src/datavisualization/data/qcustom3ditem.cpp index f39a0478..f1307d7a 100644 --- a/src/datavisualization/data/qcustom3ditem.cpp +++ b/src/datavisualization/data/qcustom3ditem.cpp @@ -62,15 +62,31 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION /*! \qmlproperty vector3d Custom3DItem::position * - * Holds the item \a position as a vector3d. Item position is in data coordinates. Defaults to - * \c {vector3d(0.0, 0.0, 0.0)}. + * Holds the item \a position as a vector3d. Defaults to \c {vector3d(0.0, 0.0, 0.0)}. * - * \note Items positioned outside axis ranges are not rendered. + * Item position is either in data coordinates or in absolute coordinates, depending on + * positionAbsolute property. When using absolute coordinates, values between \c{-1.0...1.0} are + * within axis ranges. + * + * \note Items positioned outside any axis range are not rendered if positionAbsolute is \c{false}. + * + * \sa positionAbsolute + */ + +/*! \qmlproperty bool Custom3DItem::positionAbsolute + * + * This property dictates if item position is to be handled in data coordinates or in absolute + * coordinates. Defaults to \c{false}. Items with absolute cooridnates will always be rendered, + * whereas items with data coordinates are only rendered if they are within axis ranges. + * + * \sa position */ /*! \qmlproperty vector3d Custom3DItem::scaling * * Holds the item \a scaling as a vector3d. Defaults to \c {vector3d(0.1, 0.1, 0.1)}. + * The default value sets the item to 10% of the height of the graph, provided the item size is + * normalized. */ /*! \qmlproperty quaternion Custom3DItem::rotation @@ -148,10 +164,15 @@ QString QCustom3DItem::meshFile() const /*! \property QCustom3DItem::position * - * Holds the item \a position as a QVector3D. Item position is in data coordinates. Defaults to - * \c {QVector3D(0.0, 0.0, 0.0)}. + * Holds the item \a position as a QVector3D. Defaults to \c {QVector3D(0.0, 0.0, 0.0)}. + * + * Item position is either in data coordinates or in absolute coordinates, depending on + * positionAbsolute property. When using absolute coordinates, values between \c{-1.0...1.0} are + * within axis ranges. + * + * \note Items positioned outside any axis range are not rendered if positionAbsolute is \c{false}. * - * \note Items positioned outside axis ranges are not rendered. + * \sa positionAbsolute */ void QCustom3DItem::setPosition(const QVector3D &position) { @@ -168,9 +189,34 @@ QVector3D QCustom3DItem::position() const return d_ptr->m_position; } +/*! \property QCustom3DItem::positionAbsolute + * + * This property dictates if item position is to be handled in data coordinates or in absolute + * coordinates. Defaults to \c{false}. Items with absolute cooridnates will always be rendered, + * whereas items with data coordinates are only rendered if they are within axis ranges. + * + * \sa position + */ +void QCustom3DItem::setPositionAbsolute(bool positionAbsolute) +{ + if (d_ptr->m_positionAbsolute != positionAbsolute) { + d_ptr->m_positionAbsolute = positionAbsolute; + d_ptr->m_dirtyBits.positionAbsoluteDirty = true; + emit positionAbsoluteChanged(positionAbsolute); + emit d_ptr->needUpdate(); + } +} + +bool QCustom3DItem::isPositionAbsolute() const +{ + return d_ptr->m_positionAbsolute; +} + /*! \property QCustom3DItem::scaling * * Holds the item \a scaling as a QVector3D. Defaults to \c {QVector3D(0.1, 0.1, 0.1)}. + * The default value sets the item to 10% of the height of the graph, provided the item size is + * normalized. */ void QCustom3DItem::setScaling(const QVector3D &scaling) { @@ -313,6 +359,7 @@ QCustom3DItemPrivate::QCustom3DItemPrivate(QCustom3DItem *q, QObject *parent) : QObject(parent), q_ptr(q), m_position(QVector3D(0.0f, 0.0f, 0.0f)), + m_positionAbsolute(false), m_scaling(QVector3D(0.1f, 0.1f, 0.1f)), m_rotation(QQuaternion(0.0f, 0.0f, 0.0f, 0.0f)), m_visible(true), @@ -327,6 +374,7 @@ QCustom3DItemPrivate::QCustom3DItemPrivate(QCustom3DItem *q, const QString &mesh q_ptr(q), m_meshFile(meshFile), m_position(position), + m_positionAbsolute(false), m_scaling(scaling), m_rotation(rotation), m_visible(true), @@ -354,6 +402,7 @@ void QCustom3DItemPrivate::resetDirtyBits() m_dirtyBits.textureDirty = false; m_dirtyBits.meshDirty = false; m_dirtyBits.positionDirty = false; + m_dirtyBits.positionAbsoluteDirty = false; m_dirtyBits.scalingDirty = false; m_dirtyBits.rotationDirty = false; m_dirtyBits.visibleDirty = false; diff --git a/src/datavisualization/data/qcustom3ditem.h b/src/datavisualization/data/qcustom3ditem.h index 72aad604..53ec0bcf 100644 --- a/src/datavisualization/data/qcustom3ditem.h +++ b/src/datavisualization/data/qcustom3ditem.h @@ -34,6 +34,7 @@ class QT_DATAVISUALIZATION_EXPORT QCustom3DItem : public QObject Q_PROPERTY(QString meshFile READ meshFile WRITE setMeshFile NOTIFY meshFileChanged) Q_PROPERTY(QString textureFile READ textureFile WRITE setTextureFile NOTIFY textureFileChanged) Q_PROPERTY(QVector3D position READ position WRITE setPosition NOTIFY positionChanged) + Q_PROPERTY(bool positionAbsolute READ isPositionAbsolute WRITE setPositionAbsolute NOTIFY positionAbsoluteChanged) Q_PROPERTY(QVector3D scaling READ scaling WRITE setScaling NOTIFY scalingChanged) Q_PROPERTY(QQuaternion rotation READ rotation WRITE setRotation NOTIFY rotationChanged) Q_PROPERTY(bool visible READ isVisible WRITE setVisible NOTIFY visibleChanged) @@ -55,6 +56,9 @@ public: void setPosition(const QVector3D &position); QVector3D position() const; + void setPositionAbsolute(bool positionAbsolute); + bool isPositionAbsolute() const; + void setScaling(const QVector3D &scaling); QVector3D scaling() const; @@ -75,6 +79,7 @@ signals: void meshFileChanged(const QString &meshFile); void textureFileChanged(const QString &textureFile); void positionChanged(const QVector3D &position); + void positionAbsoluteChanged(bool positionAbsolute); void scalingChanged(const QVector3D &scaling); void rotationChanged(const QQuaternion &rotation); void visibleChanged(bool visible); diff --git a/src/datavisualization/data/qcustom3ditem_p.h b/src/datavisualization/data/qcustom3ditem_p.h index 2523abd4..3e807df3 100644 --- a/src/datavisualization/data/qcustom3ditem_p.h +++ b/src/datavisualization/data/qcustom3ditem_p.h @@ -37,6 +37,7 @@ struct QCustomItemDirtyBitField { bool textureDirty : 1; bool meshDirty : 1; bool positionDirty : 1; + bool positionAbsoluteDirty : 1; bool scalingDirty : 1; bool rotationDirty : 1; bool visibleDirty : 1; @@ -46,6 +47,7 @@ struct QCustomItemDirtyBitField { : textureDirty(false), meshDirty(false), positionDirty(false), + positionAbsoluteDirty(false), scalingDirty(false), rotationDirty(false), visibleDirty(false), @@ -73,6 +75,7 @@ public: QString m_textureFile; QString m_meshFile; QVector3D m_position; + bool m_positionAbsolute; QVector3D m_scaling; QQuaternion m_rotation; bool m_visible; diff --git a/src/datavisualization/engine/abstract3drenderer.cpp b/src/datavisualization/engine/abstract3drenderer.cpp index 684db1a5..988ea21e 100644 --- a/src/datavisualization/engine/abstract3drenderer.cpp +++ b/src/datavisualization/engine/abstract3drenderer.cpp @@ -574,13 +574,15 @@ CustomRenderItem *Abstract3DRenderer::addCustomItem(QCustom3DItem *item) newItem->setMesh(item->meshFile()); newItem->setScaling(item->scaling()); newItem->setPosition(item->position()); + newItem->setPositionAbsolute(item->isPositionAbsolute()); newItem->setRotation(item->rotation()); QImage textureImage = item->d_ptr->textureImage(); newItem->setBlendNeeded(textureImage.hasAlphaChannel()); GLuint texture = m_textureHelper->create2DTexture(textureImage, true, true, true); newItem->setTexture(texture); item->d_ptr->clearTextureImage(); - QVector3D translation = convertPositionToTranslation(item->position()); + QVector3D translation = convertPositionToTranslation(item->position(), + item->isPositionAbsolute()); newItem->setTranslation(translation); newItem->setVisible(item->isVisible()); newItem->setShadowCasting(item->isShadowCasting()); @@ -613,11 +615,14 @@ void Abstract3DRenderer::updateCustomItem(CustomRenderItem *renderItem) item->d_ptr->clearTextureImage(); item->d_ptr->m_dirtyBits.textureDirty = false; } - if (item->d_ptr->m_dirtyBits.positionDirty) { - QVector3D translation = convertPositionToTranslation(item->position()); + if (item->d_ptr->m_dirtyBits.positionDirty || item->d_ptr->m_dirtyBits.positionAbsoluteDirty) { renderItem->setPosition(item->position()); + renderItem->setPositionAbsolute(item->isPositionAbsolute()); + QVector3D translation = convertPositionToTranslation(item->position(), + item->isPositionAbsolute()); renderItem->setTranslation(translation); item->d_ptr->m_dirtyBits.positionDirty = false; + item->d_ptr->m_dirtyBits.positionAbsoluteDirty = false; } if (item->d_ptr->m_dirtyBits.visibleDirty) { renderItem->setVisible(item->isVisible()); @@ -653,16 +658,21 @@ void Abstract3DRenderer::drawCustomItems(RenderingState state, // Draw custom items foreach (CustomRenderItem *item, m_customRenderCache) { - // Check that the render item is visible and within axis ranges, and skip drawing if not - if (!item->isVisible() - || item->position().x() < m_axisCacheX.min() - || item->position().x() > m_axisCacheX.max() - || item->position().z() < m_axisCacheZ.min() - || item->position().z() > m_axisCacheZ.max() - || item->position().y() < m_axisCacheY.min() - || item->position().y() > m_axisCacheY.max()) + // Check that the render item is visible, and skip drawing if not + if (!item->isVisible()) continue; + // Check if the render item is in data coordinates and not within axis ranges, and skip drawing if it is + if (!item->isPositionAbsolute() + && (item->position().x() < m_axisCacheX.min() + || item->position().x() > m_axisCacheX.max() + || item->position().z() < m_axisCacheZ.min() + || item->position().z() > m_axisCacheZ.max() + || item->position().y() < m_axisCacheY.min() + || item->position().y() > m_axisCacheY.max())) { + continue; + } + QMatrix4x4 modelMatrix; QMatrix4x4 itModelMatrix; QMatrix4x4 MVPMatrix; diff --git a/src/datavisualization/engine/abstract3drenderer_p.h b/src/datavisualization/engine/abstract3drenderer_p.h index ebe473b9..f5bf0ff4 100644 --- a/src/datavisualization/engine/abstract3drenderer_p.h +++ b/src/datavisualization/engine/abstract3drenderer_p.h @@ -117,7 +117,8 @@ public: virtual CustomRenderItem *addCustomItem(QCustom3DItem *item); virtual void updateCustomItem(CustomRenderItem *renderItem); - virtual QVector3D convertPositionToTranslation(const QVector3D &position) = 0; + virtual QVector3D convertPositionToTranslation(const QVector3D &position, + bool isAbsolute) = 0; void generateBaseColorTexture(const QColor &color, GLuint *texture); void fixGradientAndGenerateTexture(QLinearGradient *gradient, GLuint *gradientTexture); diff --git a/src/datavisualization/engine/bars3drenderer.cpp b/src/datavisualization/engine/bars3drenderer.cpp index bc49e7ed..4dcf296f 100644 --- a/src/datavisualization/engine/bars3drenderer.cpp +++ b/src/datavisualization/engine/bars3drenderer.cpp @@ -2604,13 +2604,23 @@ void Bars3DRenderer::initLabelShaders(const QString &vertexShader, const QString m_labelShader->initialize(); } -QVector3D Bars3DRenderer::convertPositionToTranslation(const QVector3D &position) { - // Convert row and column to translation on graph - float xTrans = (((position.x() + 0.5f) * m_cachedBarSpacing.width()) - m_rowWidth) - / m_scaleFactor; - float zTrans = (m_columnDepth - ((position.z() + 0.5f) * m_cachedBarSpacing.height())) - / m_scaleFactor; - float yTrans = m_axisCacheY.positionAt(position.y()); +QVector3D Bars3DRenderer::convertPositionToTranslation(const QVector3D &position, bool isAbsolute) +{ + float xTrans = 0.0f; + float yTrans = 0.0f; + float zTrans = 0.0f; + if (!isAbsolute) { + // Convert row and column to translation on graph + xTrans = (((position.x() + 0.5f) * m_cachedBarSpacing.width()) - m_rowWidth) + / m_scaleFactor; + zTrans = (m_columnDepth - ((position.z() + 0.5f) * m_cachedBarSpacing.height())) + / m_scaleFactor; + yTrans = m_axisCacheY.positionAt(position.y()); + } else { + xTrans = position.x() * m_scaleX; + yTrans = position.y(); + zTrans = position.z() * m_scaleZ; + } return QVector3D(xTrans, yTrans, zTrans); } diff --git a/src/datavisualization/engine/bars3drenderer_p.h b/src/datavisualization/engine/bars3drenderer_p.h index 68848673..2e9ec0de 100644 --- a/src/datavisualization/engine/bars3drenderer_p.h +++ b/src/datavisualization/engine/bars3drenderer_p.h @@ -122,7 +122,7 @@ public: void updateScene(Q3DScene *scene); void render(GLuint defaultFboHandle = 0); - QVector3D convertPositionToTranslation(const QVector3D &position); + QVector3D convertPositionToTranslation(const QVector3D &position, bool isAbsolute); protected: virtual void initializeOpenGL(); diff --git a/src/datavisualization/engine/scatter3drenderer.cpp b/src/datavisualization/engine/scatter3drenderer.cpp index 3cf91833..acdd3cb8 100644 --- a/src/datavisualization/engine/scatter3drenderer.cpp +++ b/src/datavisualization/engine/scatter3drenderer.cpp @@ -1967,10 +1967,21 @@ void Scatter3DRenderer::updateRenderItem(const QScatterDataItem &dataItem, Scatt } } -QVector3D Scatter3DRenderer::convertPositionToTranslation(const QVector3D &position) { - float xTrans = m_axisCacheX.positionAt(position.x()); - float yTrans = m_axisCacheY.positionAt(position.y()); - float zTrans = m_axisCacheZ.positionAt(position.z()); +QVector3D Scatter3DRenderer::convertPositionToTranslation(const QVector3D &position, + bool isAbsolute) +{ + float xTrans = 0.0f; + float yTrans = 0.0f; + float zTrans = 0.0f; + if (!isAbsolute) { + xTrans = m_axisCacheX.positionAt(position.x()); + yTrans = m_axisCacheY.positionAt(position.y()); + zTrans = m_axisCacheZ.positionAt(position.z()); + } else { + xTrans = position.x() * m_axisCacheX.scale() / 2.0f; + yTrans = position.y(); + zTrans = position.z() * m_axisCacheZ.scale() / 2.0f; + } return QVector3D(xTrans, yTrans, zTrans); } diff --git a/src/datavisualization/engine/scatter3drenderer_p.h b/src/datavisualization/engine/scatter3drenderer_p.h index 09b8dace..0b58102b 100644 --- a/src/datavisualization/engine/scatter3drenderer_p.h +++ b/src/datavisualization/engine/scatter3drenderer_p.h @@ -108,7 +108,7 @@ public: void updateItems(const QVector<Scatter3DController::ChangeItem> &items); void updateScene(Q3DScene *scene); - QVector3D convertPositionToTranslation(const QVector3D &position); + QVector3D convertPositionToTranslation(const QVector3D &position, bool isAbsolute); inline int clickedIndex() const { return m_clickedIndex; } void resetClickedStatus(); diff --git a/src/datavisualization/engine/surface3drenderer.cpp b/src/datavisualization/engine/surface3drenderer.cpp index cc4cf788..4b5464d5 100644 --- a/src/datavisualization/engine/surface3drenderer.cpp +++ b/src/datavisualization/engine/surface3drenderer.cpp @@ -1212,7 +1212,7 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle) // Draw selection buffer if (!m_cachedIsSlicingActivated && (!m_renderCacheList.isEmpty() - || !m_customRenderCache.isEmpty()) + || !m_customRenderCache.isEmpty()) && m_selectionState == SelectOnScene && m_cachedSelectionMode > QAbstract3DGraph::SelectionNone) { m_selectionShader->bind(); @@ -2682,10 +2682,21 @@ void Surface3DRenderer::updateDepthBuffer() } #endif -QVector3D Surface3DRenderer::convertPositionToTranslation(const QVector3D &position) { - float xTrans = m_axisCacheX.positionAt(position.x()); - float yTrans = m_axisCacheY.positionAt(position.y()); - float zTrans = m_axisCacheZ.positionAt(position.z()); +QVector3D Surface3DRenderer::convertPositionToTranslation(const QVector3D &position, + bool isAbsolute) +{ + float xTrans = 0.0f; + float yTrans = 0.0f; + float zTrans = 0.0f; + if (!isAbsolute) { + xTrans = m_axisCacheX.positionAt(position.x()); + yTrans = m_axisCacheY.positionAt(position.y()); + zTrans = m_axisCacheZ.positionAt(position.z()); + } else { + xTrans = position.x() * m_scaleX; + yTrans = position.y(); + zTrans = position.z() * m_scaleZ; + } return QVector3D(xTrans, yTrans, zTrans); } diff --git a/src/datavisualization/engine/surface3drenderer_p.h b/src/datavisualization/engine/surface3drenderer_p.h index db46a17b..7c3e461d 100644 --- a/src/datavisualization/engine/surface3drenderer_p.h +++ b/src/datavisualization/engine/surface3drenderer_p.h @@ -116,7 +116,7 @@ public: void updateSelectedPoint(const QPoint &position, QSurface3DSeries *series); inline QPoint clickedPosition() const { return m_clickedPosition; } void resetClickedStatus(); - QVector3D convertPositionToTranslation(const QVector3D &position); + QVector3D convertPositionToTranslation(const QVector3D &position, bool isAbsolute); void render(GLuint defaultFboHandle = 0); |