From 6ec2eb3147b02dab62ea8ac3cff0b706628dc353 Mon Sep 17 00:00:00 2001 From: Mika Salmela Date: Wed, 27 Aug 2014 11:36:41 +0300 Subject: Diffuse and specular color for static optimization Change-Id: I2c51ba06c6af9193a70f4a268dfd2fbd6c6910b3 Reviewed-by: Miikka Heikkinen --- .../engine/abstract3drenderer.cpp | 33 ++++++++++++++++------ src/datavisualization/engine/engine.qrc | 2 ++ src/datavisualization/engine/qabstract3dgraph.cpp | 12 ++++---- src/datavisualization/engine/scatter3drenderer.cpp | 17 +---------- .../utils/scatterobjectbufferhelper.cpp | 20 +++++++------ tests/directional/main.cpp | 7 +++++ tests/directional/scatterdatamodifier.cpp | 9 +++++- tests/directional/scatterdatamodifier.h | 1 + 8 files changed, 60 insertions(+), 41 deletions(-) diff --git a/src/datavisualization/engine/abstract3drenderer.cpp b/src/datavisualization/engine/abstract3drenderer.cpp index 9f0e2d8f..090a833a 100644 --- a/src/datavisualization/engine/abstract3drenderer.cpp +++ b/src/datavisualization/engine/abstract3drenderer.cpp @@ -25,6 +25,7 @@ #include "qcustom3ditem_p.h" #include "qcustom3dlabel_p.h" #include "qcustom3dvolume_p.h" +#include "scatter3drenderer_p.h" #include @@ -282,19 +283,35 @@ void Abstract3DRenderer::reInitShaders() { #if !defined(QT_OPENGL_ES_2) if (m_cachedShadowQuality > QAbstract3DGraph::ShadowQualityNone) { - initGradientShaders(QStringLiteral(":/shaders/vertexShadow"), - QStringLiteral(":/shaders/fragmentShadowNoTexColorOnY")); - initShaders(QStringLiteral(":/shaders/vertexShadow"), - QStringLiteral(":/shaders/fragmentShadowNoTex")); + if (m_cachedOptimizationHint.testFlag(QAbstract3DGraph::OptimizationStatic) + && qobject_cast(this)) { + initGradientShaders(QStringLiteral(":/shaders/vertexShadow"), + QStringLiteral(":/shaders/fragmentShadow")); + initShaders(QStringLiteral(":/shaders/vertexShadowNoMatrices"), + QStringLiteral(":/shaders/fragmentShadowNoTex")); + } else { + initGradientShaders(QStringLiteral(":/shaders/vertexShadow"), + QStringLiteral(":/shaders/fragmentShadowNoTexColorOnY")); + initShaders(QStringLiteral(":/shaders/vertexShadow"), + QStringLiteral(":/shaders/fragmentShadowNoTex")); + } initBackgroundShaders(QStringLiteral(":/shaders/vertexShadow"), QStringLiteral(":/shaders/fragmentShadowNoTex")); initCustomItemShaders(QStringLiteral(":/shaders/vertexShadow"), QStringLiteral(":/shaders/fragmentShadow")); } else { - initGradientShaders(QStringLiteral(":/shaders/vertex"), - QStringLiteral(":/shaders/fragmentColorOnY")); - initShaders(QStringLiteral(":/shaders/vertex"), - QStringLiteral(":/shaders/fragment")); + if (m_cachedOptimizationHint.testFlag(QAbstract3DGraph::OptimizationStatic) + && qobject_cast(this)) { + initGradientShaders(QStringLiteral(":/shaders/vertexTexture"), + QStringLiteral(":/shaders/fragmentTexture")); + initShaders(QStringLiteral(":/shaders/vertexNoMatrices"), + QStringLiteral(":/shaders/fragment")); + } else { + initGradientShaders(QStringLiteral(":/shaders/vertex"), + QStringLiteral(":/shaders/fragmentColorOnY")); + initShaders(QStringLiteral(":/shaders/vertex"), + QStringLiteral(":/shaders/fragment")); + } initBackgroundShaders(QStringLiteral(":/shaders/vertex"), QStringLiteral(":/shaders/fragment")); initCustomItemShaders(QStringLiteral(":/shaders/vertexTexture"), diff --git a/src/datavisualization/engine/engine.qrc b/src/datavisualization/engine/engine.qrc index 936ed53f..88440bec 100644 --- a/src/datavisualization/engine/engine.qrc +++ b/src/datavisualization/engine/engine.qrc @@ -62,5 +62,7 @@ shaders/texture3d.frag shaders/texture3d.vert shaders/texture3dslice.frag + shaders/shadowNoMatrices.vert + shaders/defaultNoMatrices.vert diff --git a/src/datavisualization/engine/qabstract3dgraph.cpp b/src/datavisualization/engine/qabstract3dgraph.cpp index 2b9fc92a..c797f554 100644 --- a/src/datavisualization/engine/qabstract3dgraph.cpp +++ b/src/datavisualization/engine/qabstract3dgraph.cpp @@ -148,7 +148,7 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION \value OptimizationDefault Provides the full feature set at a reasonable performance. \value OptimizationStatic - Beta level feature. Optimizes the rendering of static data sets at the expense of some features. + Optimizes the rendering of static data sets at the expense of some features. */ /*! @@ -636,12 +636,10 @@ qreal QAbstract3DGraph::aspectRatio() const * \property QAbstract3DGraph::optimizationHints * * Defines if the rendering optimization is default or static. Default mode provides the full feature set at - * reasonable performance. Static is a beta level feature and currently supports only a subset of the - * features on the Scatter graph. Missing features are both gradient color styles - * for points, and diffuse and specular color on rotations. At this point static is intended just for - * introducing a new feature. It optimizes graph rendering and is ideal for large non-changing data - * sets. It is slower with dynamic data changes and item rotations. Selection is not optimized, so using it - * with massive data sets is not advisable. + * reasonable performance. Static optimizes graph rendering and is ideal for large non-changing data sets. + * It is slower with dynamic data changes and item rotations. Selection is not optimized, so using it with + * massive data sets is not advisable. Static works only on the Scatter graph and lacks the range gradient + * color style for points. * Defaults to \c{OptimizationDefault}. */ void QAbstract3DGraph::setOptimizationHints(OptimizationHints hints) diff --git a/src/datavisualization/engine/scatter3drenderer.cpp b/src/datavisualization/engine/scatter3drenderer.cpp index 94d49e3c..4b6a258e 100644 --- a/src/datavisualization/engine/scatter3drenderer.cpp +++ b/src/datavisualization/engine/scatter3drenderer.cpp @@ -341,22 +341,7 @@ void Scatter3DRenderer::updateOptimizationHint(QAbstract3DGraph::OptimizationHin { Abstract3DRenderer::updateOptimizationHint(hint); - if (m_cachedOptimizationHint.testFlag(QAbstract3DGraph::OptimizationStatic)) { -#if !defined(QT_OPENGL_ES_2) - if (m_cachedShadowQuality > QAbstract3DGraph::ShadowQualityNone) { - initGradientShaders(QStringLiteral(":/shaders/vertexShadow"), - QStringLiteral(":/shaders/fragmentShadow")); - } else { - initGradientShaders(QStringLiteral(":/shaders/vertexTexture"), - QStringLiteral(":/shaders/fragmentTexture")); - } -#else - initGradientShaders(QStringLiteral(":/shaders/vertexTexture"), - QStringLiteral(":/shaders/fragmentTexture")); -#endif - } else { - Abstract3DRenderer::reInitShaders(); - } + Abstract3DRenderer::reInitShaders(); } void Scatter3DRenderer::resetClickedStatus() diff --git a/src/datavisualization/utils/scatterobjectbufferhelper.cpp b/src/datavisualization/utils/scatterobjectbufferhelper.cpp index 1639eb1f..9ecdffdd 100644 --- a/src/datavisualization/utils/scatterobjectbufferhelper.cpp +++ b/src/datavisualization/utils/scatterobjectbufferhelper.cpp @@ -114,23 +114,25 @@ void ScatterObjectBufferHelper::fullLoad(ScatterSeriesRenderCache *cache, qreal int offset = pos * verticeCount; if (item.rotation().isIdentity()) { - for (int j = 0; j < verticeCount; j++) + for (int j = 0; j < verticeCount; j++) { buffered_vertices[j + offset] = scaled_vertices[j] + item.translation(); + buffered_normals[j + offset] = indexed_normals[j]; + } } else { QMatrix4x4 matrix; - matrix.rotate(seriesRotation * item.rotation()); - modelMatrix = matrix.transposed(); - modelMatrix.scale(modelScaler); + QQuaternion totalRotation = seriesRotation * item.rotation(); + matrix.rotate(totalRotation); + matrix.scale(modelScaler); + QMatrix4x4 itModelMatrix = matrix.inverted(); + modelMatrix = matrix.transposed(); // Because of row-column major difference - for (int j = 0; j < verticeCount; j++) + for (int j = 0; j < verticeCount; j++) { buffered_vertices[j + offset] = indexed_vertices[j] * modelMatrix + item.translation(); + buffered_normals[j + offset] = indexed_normals[j] * itModelMatrix; + } } - offset = pos * normalsCount; - for (int j = 0; j < normalsCount; j++) - buffered_normals[j + offset] = indexed_normals[j]; - if (cache->colorStyle() == Q3DTheme::ColorStyleUniform) { offset = pos * uvsCount; for (int j = 0; j < uvsCount; j++) diff --git a/tests/directional/main.cpp b/tests/directional/main.cpp index 2b077b97..551ab141 100644 --- a/tests/directional/main.cpp +++ b/tests/directional/main.cpp @@ -80,6 +80,9 @@ int main(int argc, char **argv) backgroundCheckBox->setText(QStringLiteral("Show background")); backgroundCheckBox->setChecked(true); + QCheckBox *optimizationCheckBox = new QCheckBox(widget); + optimizationCheckBox->setText(QStringLiteral("Optimization static")); + QCheckBox *gridCheckBox = new QCheckBox(widget); gridCheckBox->setText(QStringLiteral("Show grid")); gridCheckBox->setChecked(true); @@ -100,6 +103,7 @@ int main(int argc, char **argv) vLayout->addWidget(labelButton, 0, Qt::AlignTop); vLayout->addWidget(cameraButton, 0, Qt::AlignTop); vLayout->addWidget(toggleRotationButton, 0, Qt::AlignTop); + vLayout->addWidget(optimizationCheckBox); vLayout->addWidget(backgroundCheckBox); vLayout->addWidget(gridCheckBox); vLayout->addWidget(new QLabel(QStringLiteral("Change dot style"))); @@ -127,6 +131,8 @@ int main(int argc, char **argv) QObject::connect(modifier, &ScatterDataModifier::backgroundEnabledChanged, backgroundCheckBox, &QCheckBox::setChecked); + QObject::connect(optimizationCheckBox, &QCheckBox::stateChanged, + modifier, &ScatterDataModifier::enableOptimization); QObject::connect(modifier, &ScatterDataModifier::gridEnabledChanged, gridCheckBox, &QCheckBox::setChecked); QObject::connect(itemStyleList, SIGNAL(currentIndexChanged(int)), modifier, @@ -150,6 +156,7 @@ int main(int argc, char **argv) &QFontComboBox::setCurrentFont); itemStyleList->setCurrentIndex(0); + optimizationCheckBox->setChecked(true); widget->show(); return app.exec(); diff --git a/tests/directional/scatterdatamodifier.cpp b/tests/directional/scatterdatamodifier.cpp index 1422cebb..2d6672b6 100644 --- a/tests/directional/scatterdatamodifier.cpp +++ b/tests/directional/scatterdatamodifier.cpp @@ -119,7 +119,14 @@ void ScatterDataModifier::addData() m_graph->seriesList().at(0)->dataProxy()->resetArray(dataArray); } -//! [8] +void ScatterDataModifier::enableOptimization(int enabled) +{ + if (enabled) + m_graph->setOptimizationHints(QAbstract3DGraph::OptimizationStatic); + else + m_graph->setOptimizationHints(QAbstract3DGraph::OptimizationDefault); +} + void ScatterDataModifier::changeStyle(int style) { QComboBox *comboBox = qobject_cast(sender()); diff --git a/tests/directional/scatterdatamodifier.h b/tests/directional/scatterdatamodifier.h index b87fa89f..20e59cdc 100644 --- a/tests/directional/scatterdatamodifier.h +++ b/tests/directional/scatterdatamodifier.h @@ -39,6 +39,7 @@ public: void changeLabelStyle(); void changeFont(const QFont &font); void changeFontSize(int fontsize); + void enableOptimization(int enabled); void setBackgroundEnabled(int enabled); void setGridEnabled(int enabled); void toggleRotation(); -- cgit v1.2.3