summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorTomi Korpipää <tomi.korpipaa@digia.com>2013-11-06 13:45:09 +0200
committerTomi Korpipää <tomi.korpipaa@digia.com>2013-11-06 13:46:26 +0200
commit7132e31f51a9ce79ddcbe780e2ef827d551c1f63 (patch)
treefea634300aa4c7c1f1d393ae3ebd2e8a62818ea6 /src
parentd493ae2fcef2ed63413b78e6afc16d13c82131ac (diff)
ES2 support for scatter points
Task-number: QTRD-2539 Change-Id: I2465322d9a4341ce4c345756fe085a4c5ad2be5b Reviewed-by: Miikka Heikkinen <miikka.heikkinen@digia.com>
Diffstat (limited to 'src')
-rw-r--r--src/datavisualization/engine/engine.qrc1
-rw-r--r--src/datavisualization/engine/scatter3dcontroller.cpp3
-rw-r--r--src/datavisualization/engine/scatter3drenderer.cpp52
-rw-r--r--src/datavisualization/engine/scatter3drenderer_p.h5
-rw-r--r--src/datavisualization/engine/shaders/point_ES2.vert8
5 files changed, 58 insertions, 11 deletions
diff --git a/src/datavisualization/engine/engine.qrc b/src/datavisualization/engine/engine.qrc
index de4a04da..14fb1bc6 100644
--- a/src/datavisualization/engine/engine.qrc
+++ b/src/datavisualization/engine/engine.qrc
@@ -56,6 +56,7 @@
<file alias="vertexSurfaceFlat">shaders/surfaceFlat.vert</file>
<file alias="fragmentSurfaceFlat">shaders/surfaceFlat.frag</file>
<file alias="fragmentSurfaceES2">shaders/surface_ES2.frag</file>
+ <file alias="vertexPointES2">shaders/point_ES2.vert</file>
</qresource>
<qresource prefix="/textures"/>
</RCC>
diff --git a/src/datavisualization/engine/scatter3dcontroller.cpp b/src/datavisualization/engine/scatter3dcontroller.cpp
index 065f1f02..0786ad18 100644
--- a/src/datavisualization/engine/scatter3dcontroller.cpp
+++ b/src/datavisualization/engine/scatter3dcontroller.cpp
@@ -203,6 +203,9 @@ void Scatter3DController::setObjectType(QDataVis::MeshStyle style, bool smooth)
objFile = QStringLiteral(":/defaultMeshes/dot");
} else {
objFile = QString();
+#if defined(QT_OPENGL_ES_2)
+ qWarning("MeshStylePoints is not fully supported on OpenGL ES2");
+#endif
}
Abstract3DController::setMeshFileName(objFile);
}
diff --git a/src/datavisualization/engine/scatter3drenderer.cpp b/src/datavisualization/engine/scatter3drenderer.cpp
index 70c7e107..3ebbbf74 100644
--- a/src/datavisualization/engine/scatter3drenderer.cpp
+++ b/src/datavisualization/engine/scatter3drenderer.cpp
@@ -58,6 +58,9 @@ Scatter3DRenderer::Scatter3DRenderer(Scatter3DController *controller)
m_yFlipped(false),
m_updateLabels(false),
m_dotShader(0),
+ #if defined(QT_OPENGL_ES_2)
+ m_pointShader(0),
+ #endif
m_depthShader(0),
m_selectionShader(0),
m_backgroundShader(0),
@@ -115,6 +118,9 @@ void Scatter3DRenderer::initializeOpenGL()
#if !defined(QT_OPENGL_ES_2)
// Init depth shader (for shadows). Init in any case, easier to handle shadow activation if done via api.
initDepthShader();
+#else
+ // Init point shader
+ initPointShader();
#endif
// Init selection shader
@@ -274,13 +280,14 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle)
QMatrix4x4 depthProjectionMatrix;
QMatrix4x4 depthProjectionViewMatrix;
+#if !defined(QT_OPENGL_ES_2)
if (m_drawingPoints) {
glEnable(GL_POINT_SMOOTH);
glEnable(GL_PROGRAM_POINT_SIZE);
- glPointSize(m_dotSizeScale * 100.0f); // Don't scale points based on zoom for shadows
+ // Scale points based on shadow quality for shadows, not by zoom level
+ glPointSize(m_dotSizeScale * 100.0f * m_shadowQualityMultiplier);
}
-#if !defined(QT_OPENGL_ES_2)
if (m_cachedShadowQuality > QDataVis::ShadowQualityNone) {
// Render scene into a depth texture for using with shadow mapping
// Bind depth shader
@@ -392,16 +399,24 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle)
m_labelShader->release();
#endif
}
-#endif
if (m_drawingPoints)
glPointSize(m_dotSizeScale * activeCamera->zoomLevel()); // Scale points based on zoom
+ ShaderHelper *selectionShader = m_selectionShader;
+#else
+ ShaderHelper *selectionShader;
+ if (m_drawingPoints)
+ selectionShader = m_pointShader;
+ else
+ selectionShader = m_selectionShader;
+#endif
+
// Skip selection mode drawing if we have no selection mode
if (m_cachedSelectionMode > QDataVis::SelectionNone
&& QDataVis::InputStateOnScene == m_inputState) {
// Bind selection shader
- m_selectionShader->bind();
+ selectionShader->bind();
// Draw dots to selection buffer
glBindFramebuffer(GL_FRAMEBUFFER, m_selectionFrameBuffer);
@@ -435,16 +450,16 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle)
QVector3D dotColor = indexToSelectionColor(dot);
dotColor /= 255.0f;
- m_selectionShader->setUniformValue(m_selectionShader->MVP(), MVPMatrix);
- m_selectionShader->setUniformValue(m_selectionShader->color(), dotColor);
+ selectionShader->setUniformValue(selectionShader->MVP(), MVPMatrix);
+ selectionShader->setUniformValue(selectionShader->color(), dotColor);
if (m_drawingPoints) {
- m_drawer->drawPoint(m_selectionShader);
+ m_drawer->drawPoint(selectionShader);
} else {
// 1st attribute buffer : vertices
- glEnableVertexAttribArray(m_selectionShader->posAtt());
+ glEnableVertexAttribArray(selectionShader->posAtt());
glBindBuffer(GL_ARRAY_BUFFER, m_dotObj->vertexBuf());
- glVertexAttribPointer(m_selectionShader->posAtt(), 3, GL_FLOAT, GL_FALSE, 0, (void *)0);
+ glVertexAttribPointer(selectionShader->posAtt(), 3, GL_FLOAT, GL_FALSE, 0, (void *)0);
// Index buffer
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_dotObj->elementBuf());
@@ -456,7 +471,7 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle)
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
- glDisableVertexAttribArray(m_selectionShader->posAtt());
+ glDisableVertexAttribArray(selectionShader->posAtt());
}
}
glEnable(GL_DITHER);
@@ -473,7 +488,7 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle)
glBindFramebuffer(GL_FRAMEBUFFER, defaultFboHandle);
// Release selection shader
- m_selectionShader->release();
+ selectionShader->release();
#if 0 // Use this if you want to see what is being drawn to the framebuffer
m_labelShader->bind();
@@ -507,7 +522,11 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle)
glEnable(GL_TEXTURE_2D);
} else {
// We can use selection shader for points
+#if !defined(QT_OPENGL_ES_2)
dotShader = m_selectionShader;
+#else
+ dotShader = m_pointShader;
+#endif
dotShader->bind();
}
@@ -604,11 +623,13 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle)
// Release dot shader
dotShader->release();
+#if !defined(QT_OPENGL_ES_2)
if (m_drawingPoints) {
glDisable(GL_POINT_SMOOTH);
glDisable(GL_PROGRAM_POINT_SIZE);
glEnable(GL_TEXTURE_2D); // Enable texturing for background
}
+#endif
// Bind background shader
m_backgroundShader->bind();
@@ -1564,6 +1585,15 @@ void Scatter3DRenderer::updateDepthBuffer()
lowerShadowQuality();
}
}
+#else
+void Scatter3DRenderer::initPointShader()
+{
+ if (m_pointShader)
+ delete m_pointShader;
+ m_pointShader = new ShaderHelper(this, QStringLiteral(":/shaders/vertexPointES2"),
+ QStringLiteral(":/shaders/fragmentSelection"));
+ m_pointShader->initialize();
+}
#endif
void Scatter3DRenderer::initBackgroundShaders(const QString &vertexShader,
diff --git a/src/datavisualization/engine/scatter3drenderer_p.h b/src/datavisualization/engine/scatter3drenderer_p.h
index 36492e80..b74f2118 100644
--- a/src/datavisualization/engine/scatter3drenderer_p.h
+++ b/src/datavisualization/engine/scatter3drenderer_p.h
@@ -60,6 +60,9 @@ private:
QRect m_mainViewPort;
bool m_updateLabels;
ShaderHelper *m_dotShader;
+#if defined(QT_OPENGL_ES_2)
+ ShaderHelper *m_pointShader;
+#endif
ShaderHelper *m_depthShader;
ShaderHelper *m_selectionShader;
ShaderHelper *m_backgroundShader;
@@ -122,6 +125,8 @@ private:
#if !defined(QT_OPENGL_ES_2)
void initDepthShader();
void updateDepthBuffer();
+#else
+ void initPointShader();
#endif
void calculateTranslation(ScatterRenderItem &item);
void calculateSceneScalingFactors();
diff --git a/src/datavisualization/engine/shaders/point_ES2.vert b/src/datavisualization/engine/shaders/point_ES2.vert
new file mode 100644
index 00000000..b2dfdd7b
--- /dev/null
+++ b/src/datavisualization/engine/shaders/point_ES2.vert
@@ -0,0 +1,8 @@
+uniform highp mat4 MVP;
+
+attribute highp vec3 vertexPosition_mdl;
+
+void main() {
+ gl_PointSize = 5.0;
+ gl_Position = MVP * vec4(vertexPosition_mdl, 1.0);
+}