summaryrefslogtreecommitdiffstats
path: root/src/datavisualization/engine
diff options
context:
space:
mode:
Diffstat (limited to 'src/datavisualization/engine')
-rw-r--r--src/datavisualization/engine/abstract3drenderer.cpp32
-rw-r--r--src/datavisualization/engine/abstract3drenderer_p.h3
-rw-r--r--src/datavisualization/engine/bars3drenderer.cpp24
-rw-r--r--src/datavisualization/engine/bars3drenderer_p.h2
-rw-r--r--src/datavisualization/engine/scatter3drenderer.cpp19
-rw-r--r--src/datavisualization/engine/scatter3drenderer_p.h2
-rw-r--r--src/datavisualization/engine/surface3drenderer.cpp21
-rw-r--r--src/datavisualization/engine/surface3drenderer_p.h2
8 files changed, 74 insertions, 31 deletions
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);