summaryrefslogtreecommitdiffstats
path: root/src/datavisualization
diff options
context:
space:
mode:
Diffstat (limited to 'src/datavisualization')
-rw-r--r--src/datavisualization/engine/engine.qrc1
-rw-r--r--src/datavisualization/engine/selectionpointer.cpp4
-rw-r--r--src/datavisualization/engine/shaders/surface.vert2
-rw-r--r--src/datavisualization/engine/shaders/surfaceGrid.frag10
-rw-r--r--src/datavisualization/engine/shaders/surfaceGrid.vert20
-rw-r--r--src/datavisualization/engine/shaders/surface_ES2.frag39
-rw-r--r--src/datavisualization/engine/surface3drenderer.cpp77
7 files changed, 86 insertions, 67 deletions
diff --git a/src/datavisualization/engine/engine.qrc b/src/datavisualization/engine/engine.qrc
index af6e899d..7420ae51 100644
--- a/src/datavisualization/engine/engine.qrc
+++ b/src/datavisualization/engine/engine.qrc
@@ -56,6 +56,7 @@
<file alias="vertexSurfaceGrid">shaders/surfaceGrid.vert</file>
<file alias="vertexSurfaceFlat">shaders/surfaceFlat.vert</file>
<file alias="fragmentSurfaceFlat">shaders/surfaceFlat.frag</file>
+ <file alias="fragmentSurfaceES2">shaders/surface_ES2.frag</file>
</qresource>
<qresource prefix="/textures"/>
</RCC>
diff --git a/src/datavisualization/engine/selectionpointer.cpp b/src/datavisualization/engine/selectionpointer.cpp
index 3ea6c83c..ecd47b93 100644
--- a/src/datavisualization/engine/selectionpointer.cpp
+++ b/src/datavisualization/engine/selectionpointer.cpp
@@ -42,9 +42,9 @@ SelectionPointer::SelectionPointer(Surface3DController *controller, Drawer *draw
m_pointObj(0),
m_textureHelper(0),
m_isInitialized(false),
- m_cachedScene(0),
m_labelTransparency(QDataVis::TransparencyFromTheme),
- m_drawer(drawer)
+ m_drawer(drawer),
+ m_cachedScene(0)
{
initializeOpenGL();
diff --git a/src/datavisualization/engine/shaders/surface.vert b/src/datavisualization/engine/shaders/surface.vert
index cbfb7569..a44d413b 100644
--- a/src/datavisualization/engine/shaders/surface.vert
+++ b/src/datavisualization/engine/shaders/surface.vert
@@ -1,5 +1,3 @@
-#version 120
-
attribute highp vec3 vertexPosition_mdl;
attribute highp vec2 vertexUV;
attribute highp vec3 vertexNormal_mdl;
diff --git a/src/datavisualization/engine/shaders/surfaceGrid.frag b/src/datavisualization/engine/shaders/surfaceGrid.frag
index 20b923fb..1658b316 100644
--- a/src/datavisualization/engine/shaders/surfaceGrid.frag
+++ b/src/datavisualization/engine/shaders/surfaceGrid.frag
@@ -1,14 +1,4 @@
-varying highp vec2 UV;
-varying highp vec2 coords_mdl;
-varying highp vec3 position_wrld;
-varying highp vec3 normal_cmr;
-varying highp vec3 eyeDirection_cmr;
-varying highp vec3 lightDirection_cmr;
-
-uniform highp vec3 lightPosition_wrld;
uniform highp vec3 color_mdl;
-uniform highp float lightStrength;
-uniform highp float ambientStrength;
void main() {
gl_FragColor.rgb = color_mdl;
diff --git a/src/datavisualization/engine/shaders/surfaceGrid.vert b/src/datavisualization/engine/shaders/surfaceGrid.vert
index efb40862..5582d633 100644
--- a/src/datavisualization/engine/shaders/surfaceGrid.vert
+++ b/src/datavisualization/engine/shaders/surfaceGrid.vert
@@ -1,26 +1,6 @@
attribute highp vec3 vertexPosition_mdl;
-attribute highp vec2 vertexUV;
-attribute highp vec3 vertexNormal_mdl;
-
uniform highp mat4 MVP;
-uniform highp mat4 V;
-uniform highp mat4 M;
-uniform highp mat4 itM;
-uniform highp vec3 lightPosition_wrld;
-
-varying highp vec3 position_wrld;
-varying highp vec3 normal_cmr;
-varying highp vec3 eyeDirection_cmr;
-varying highp vec3 lightDirection_cmr;
-varying highp vec2 coords_mdl;
void main() {
gl_Position = MVP * vec4(vertexPosition_mdl, 1.0);
- coords_mdl = vertexPosition_mdl.xy;
- position_wrld = (M * vec4(vertexPosition_mdl, 1.0)).xyz;
- vec3 vertexPosition_cmr = (V * M * vec4(vertexPosition_mdl, 1.0)).xyz;
- eyeDirection_cmr = vec3(0.0, 0.0, 0.0) - vertexPosition_cmr;
- vec3 lightPosition_cmr = (V * vec4(lightPosition_wrld, 1.0)).xyz;
- lightDirection_cmr = lightPosition_cmr + eyeDirection_cmr;
- normal_cmr = (V * itM * vec4(vertexNormal_mdl, 0.0)).xyz;
}
diff --git a/src/datavisualization/engine/shaders/surface_ES2.frag b/src/datavisualization/engine/shaders/surface_ES2.frag
new file mode 100644
index 00000000..a9aec528
--- /dev/null
+++ b/src/datavisualization/engine/shaders/surface_ES2.frag
@@ -0,0 +1,39 @@
+varying highp vec2 UV;
+varying highp vec3 coords_mdl;
+varying highp vec3 position_wrld;
+varying highp vec3 normal_cmr;
+varying highp vec3 eyeDirection_cmr;
+varying highp vec3 lightDirection_cmr;
+
+uniform sampler2D textureSampler;
+uniform highp vec3 lightPosition_wrld;
+uniform highp float lightStrength;
+uniform highp float ambientStrength;
+
+void main() {
+ highp vec2 gradientUV = vec2(0.5, (coords_mdl.y + 1.0) / 2.0);
+ highp vec3 materialDiffuseColor = texture2D(textureSampler, gradientUV).xyz;
+ highp vec3 materialAmbientColor = vec3(ambientStrength, ambientStrength, ambientStrength) * materialDiffuseColor;
+ highp vec3 materialSpecularColor = vec3(1.0, 1.0, 1.0);
+
+ highp float distance = length(lightPosition_wrld - position_wrld);
+
+ highp vec3 n = normalize(normal_cmr);
+ highp vec3 l = normalize(lightDirection_cmr);
+ highp float cosTheta = dot(n, l);
+ if (cosTheta < 0.0) cosTheta = 0.0;
+ else if (cosTheta > 1.0) cosTheta = 1.0;
+
+ highp vec3 E = normalize(eyeDirection_cmr);
+ highp vec3 R = reflect(-l, n);
+ highp float cosAlpha = dot(E, R);
+ if (cosAlpha < 0.0) cosAlpha = 0.0;
+ else if (cosAlpha > 1.0) cosAlpha = 1.0;
+
+ gl_FragColor.rgb =
+ materialAmbientColor +
+ materialDiffuseColor * lightStrength * cosTheta * cosTheta / distance +
+ materialSpecularColor * lightStrength * cosAlpha * cosAlpha * cosAlpha * cosAlpha * cosAlpha * cosAlpha * cosAlpha * cosAlpha * cosAlpha * cosAlpha / distance;
+ gl_FragColor.a = 1.0;
+}
+
diff --git a/src/datavisualization/engine/surface3drenderer.cpp b/src/datavisualization/engine/surface3drenderer.cpp
index 4023c4ce..64e18c27 100644
--- a/src/datavisualization/engine/surface3drenderer.cpp
+++ b/src/datavisualization/engine/surface3drenderer.cpp
@@ -570,15 +570,16 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle)
// Draw grid lines
if (m_cachedIsGridEnabled && m_surfaceObj /*&& m_heightNormalizer*/) {
+ ShaderHelper *lineShader = m_backgroundShader;
// Bind shader
- m_shader->bind();
+ lineShader->bind();
// Set unchanging shader bindings
QVector3D color = Utils::vectorFromColor(m_cachedTheme.m_gridLine);
- m_shader->setUniformValue(m_shader->lightP(), lightPos);
- m_shader->setUniformValue(m_shader->view(), viewMatrix);
- m_shader->setUniformValue(m_shader->color(), color);
- m_shader->setUniformValue(m_shader->ambientS(), m_cachedTheme.m_ambientStrength);
+ lineShader->setUniformValue(lineShader->lightP(), lightPos);
+ lineShader->setUniformValue(lineShader->view(), viewMatrix);
+ lineShader->setUniformValue(lineShader->color(), color);
+ lineShader->setUniformValue(lineShader->ambientS(), m_cachedTheme.m_ambientStrength);
GLfloat yPos = -backgroundBottom;
if (m_yFlipped)
@@ -603,17 +604,17 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle)
depthMVPMatrix = depthProjectionMatrix * depthViewMatrix * modelMatrix;
// Set the rest of the shader bindings
- m_shader->setUniformValue(m_shader->model(), modelMatrix);
- m_shader->setUniformValue(m_shader->nModel(),
+ lineShader->setUniformValue(lineShader->model(), modelMatrix);
+ lineShader->setUniformValue(lineShader->nModel(),
itModelMatrix.inverted().transposed());
- m_shader->setUniformValue(m_shader->MVP(), MVPMatrix);
+ lineShader->setUniformValue(lineShader->MVP(), MVPMatrix);
#if !defined(QT_OPENGL_ES_2)
if (m_cachedShadowQuality > QDataVis::ShadowNone) {
// Set shadow shader bindings
- m_shader->setUniformValue(m_shader->shadowQ(), m_shadowQualityToShader);
- m_shader->setUniformValue(m_shader->depth(), depthMVPMatrix);
- m_shader->setUniformValue(m_shader->lightS(),
+ lineShader->setUniformValue(lineShader->shadowQ(), m_shadowQualityToShader);
+ lineShader->setUniformValue(lineShader->depth(), depthMVPMatrix);
+ lineShader->setUniformValue(lineShader->lightS(),
m_cachedTheme.m_lightStrength / 10.0f);
// Draw the object
@@ -622,7 +623,7 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle)
#endif
{
// Set shadowless shader bindings
- m_shader->setUniformValue(m_shader->lightS(),
+ lineShader->setUniformValue(lineShader->lightS(),
m_cachedTheme.m_lightStrength);
// Draw the object
@@ -653,17 +654,17 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle)
depthMVPMatrix = depthProjectionMatrix * depthViewMatrix * modelMatrix;
// Set the rest of the shader bindings
- m_shader->setUniformValue(m_shader->model(), modelMatrix);
- m_shader->setUniformValue(m_shader->nModel(),
+ lineShader->setUniformValue(lineShader->model(), modelMatrix);
+ lineShader->setUniformValue(lineShader->nModel(),
itModelMatrix.inverted().transposed());
- m_shader->setUniformValue(m_shader->MVP(), MVPMatrix);
+ lineShader->setUniformValue(lineShader->MVP(), MVPMatrix);
#if !defined(QT_OPENGL_ES_2)
if (m_cachedShadowQuality > QDataVis::ShadowNone) {
// Set shadow shader bindings
- m_shader->setUniformValue(m_shader->shadowQ(), m_shadowQualityToShader);
- m_shader->setUniformValue(m_shader->depth(), depthMVPMatrix);
- m_shader->setUniformValue(m_shader->lightS(),
+ lineShader->setUniformValue(lineShader->shadowQ(), m_shadowQualityToShader);
+ lineShader->setUniformValue(lineShader->depth(), depthMVPMatrix);
+ lineShader->setUniformValue(lineShader->lightS(),
m_cachedTheme.m_lightStrength / 10.0f);
// Draw the object
@@ -672,7 +673,7 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle)
#endif
{
// Set shadowless shader bindings
- m_shader->setUniformValue(m_shader->lightS(),
+ lineShader->setUniformValue(lineShader->lightS(),
m_cachedTheme.m_lightStrength);
// Draw the object
@@ -707,17 +708,17 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle)
depthMVPMatrix = depthProjectionMatrix * depthViewMatrix * modelMatrix;
// Set the rest of the shader bindings
- m_shader->setUniformValue(m_shader->model(), modelMatrix);
- m_shader->setUniformValue(m_shader->nModel(),
+ lineShader->setUniformValue(lineShader->model(), modelMatrix);
+ lineShader->setUniformValue(lineShader->nModel(),
itModelMatrix.inverted().transposed());
- m_shader->setUniformValue(m_shader->MVP(), MVPMatrix);
+ lineShader->setUniformValue(lineShader->MVP(), MVPMatrix);
#if !defined(QT_OPENGL_ES_2)
if (m_cachedShadowQuality > QDataVis::ShadowNone) {
// Set shadow shader bindings
- m_shader->setUniformValue(m_shader->shadowQ(), m_shadowQualityToShader);
- m_shader->setUniformValue(m_shader->depth(), depthMVPMatrix);
- m_shader->setUniformValue(m_shader->lightS(),
+ lineShader->setUniformValue(lineShader->shadowQ(), m_shadowQualityToShader);
+ lineShader->setUniformValue(lineShader->depth(), depthMVPMatrix);
+ lineShader->setUniformValue(lineShader->lightS(),
m_cachedTheme.m_lightStrength / 10.0f);
// Draw the object
@@ -726,7 +727,7 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle)
#endif
{
// Set shadowless shader bindings
- m_shader->setUniformValue(m_shader->lightS(),
+ lineShader->setUniformValue(lineShader->lightS(),
m_cachedTheme.m_lightStrength);
// Draw the object
@@ -758,17 +759,17 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle)
depthMVPMatrix = depthProjectionMatrix * depthViewMatrix * modelMatrix;
// Set the rest of the shader bindings
- m_shader->setUniformValue(m_shader->model(), modelMatrix);
- m_shader->setUniformValue(m_shader->nModel(),
+ lineShader->setUniformValue(lineShader->model(), modelMatrix);
+ lineShader->setUniformValue(lineShader->nModel(),
itModelMatrix.inverted().transposed());
- m_shader->setUniformValue(m_shader->MVP(), MVPMatrix);
+ lineShader->setUniformValue(lineShader->MVP(), MVPMatrix);
#if !defined(QT_OPENGL_ES_2)
if (m_cachedShadowQuality > QDataVis::ShadowNone) {
// Set shadow shader bindings
- m_shader->setUniformValue(m_shader->shadowQ(), m_shadowQualityToShader);
- m_shader->setUniformValue(m_shader->depth(), depthMVPMatrix);
- m_shader->setUniformValue(m_shader->lightS(),
+ lineShader->setUniformValue(lineShader->shadowQ(), m_shadowQualityToShader);
+ lineShader->setUniformValue(lineShader->depth(), depthMVPMatrix);
+ lineShader->setUniformValue(lineShader->lightS(),
m_cachedTheme.m_lightStrength / 10.0f);
// Draw the object
@@ -777,7 +778,7 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle)
#endif
{
// Set shadowless shader bindings
- m_shader->setUniformValue(m_shader->lightS(),
+ lineShader->setUniformValue(lineShader->lightS(),
m_cachedTheme.m_lightStrength);
// Draw the object
@@ -1347,7 +1348,9 @@ void Surface3DRenderer::updateShadowQuality(QDataVis::ShadowQuality quality)
break;
}
+#if !defined(QT_OPENGL_ES_2)
updateDepthBuffer();
+#endif
}
void Surface3DRenderer::loadLabelMesh()
@@ -1388,6 +1391,8 @@ void Surface3DRenderer::initSurfaceShaders()
{
if (m_surfaceShader)
delete m_surfaceShader;
+
+#if !defined(QT_OPENGL_ES_2)
if (m_cachedSmoothSurface) {
m_surfaceShader = new ShaderHelper(this, QStringLiteral(":/shaders/vertexSurface"),
QStringLiteral(":/shaders/fragmentSurface"));
@@ -1395,12 +1400,18 @@ void Surface3DRenderer::initSurfaceShaders()
m_surfaceShader = new ShaderHelper(this, QStringLiteral(":/shaders/vertexSurfaceFlat"),
QStringLiteral(":/shaders/fragmentSurfaceFlat"));
}
+#else
+ m_surfaceShader = new ShaderHelper(this, QStringLiteral(":/shaders/vertexSurface"),
+ QStringLiteral(":/shaders/fragmentSurfaceES2"));
+#endif
m_surfaceShader->initialize();
if (m_surfaceGridShader)
delete m_surfaceGridShader;
+
m_surfaceGridShader = new ShaderHelper(this, QStringLiteral(":/shaders/vertexSurfaceGrid"),
QStringLiteral(":/shaders/fragmentSurfaceGrid"));
+
m_surfaceGridShader->initialize();
}