summaryrefslogtreecommitdiff
path: root/slideshow/opengl
diff options
context:
space:
mode:
authorEmmanuel Gil Peyrot <emmanuel.peyrot@collabora.com>2016-01-15 21:07:56 +0000
committerTomaž Vajngerl <tomaz.vajngerl@collabora.co.uk>2016-01-16 20:52:30 +0100
commit7cca8d3b3f5a9eda0060342fd2576d08a874b1c3 (patch)
tree7a63b9c5863400ac3f706663c0dade1356288132 /slideshow/opengl
parent0fe5a3069b83d6a5e83c6c4df5d874c8802b7f52 (diff)
slideshow: Add some volume to the Honeycomb hexagons, making them look better
Change-Id: Ic0f62f36faccb65ab4fbc7bb5553d096a2658f96
Diffstat (limited to 'slideshow/opengl')
-rw-r--r--slideshow/opengl/honeycombFragmentShader.glsl20
-rw-r--r--slideshow/opengl/honeycombGeometryShader.glsl22
2 files changed, 36 insertions, 6 deletions
diff --git a/slideshow/opengl/honeycombFragmentShader.glsl b/slideshow/opengl/honeycombFragmentShader.glsl
index 25b3e2d02a1c..325e39348581 100644
--- a/slideshow/opengl/honeycombFragmentShader.glsl
+++ b/slideshow/opengl/honeycombFragmentShader.glsl
@@ -12,6 +12,7 @@
in vec2 texturePosition;
in float fuzz;
in vec2 v_center;
+in vec3 normal;
uniform sampler2D slideTexture;
uniform float selectedTexture;
@@ -25,13 +26,15 @@ bool isBorder(vec2 point)
void main()
{
- gl_FragColor = texture2D(slideTexture, texturePosition);
+ vec4 fragment = texture2D(slideTexture, texturePosition);
+ vec3 lightVector = vec3(0.0, 0.0, 1.0);
+ float light = max(dot(lightVector, normal), 0.0);
if (hexagonSize > 1.0) {
// The space in-between hexagons.
if (selectedTexture > 0.5)
- gl_FragColor.a = 1.0 - time * 8 + gl_FragCoord.x / 1024.;
+ fragment.a = 1.0 - time * 8 + gl_FragCoord.x / 1024.;
else
- gl_FragColor.a = time * 8 - 7.7 + gl_FragCoord.x / 1024.;
+ fragment.a = time * 8 - 7.3 + gl_FragCoord.x / 1024.;
} else {
// The hexagons themselves.
@@ -58,8 +61,17 @@ void main()
if (time < 0.8)
actualTime *= time / 0.8;
}
- gl_FragColor.a = actualTime;
+
+ if (selectedTexture > 0.5) {
+ // Leaving texture needs to be transparent to see-through.
+ fragment.a = actualTime;
+ } else {
+ // Entering one though, would look weird with transparency.
+ fragment.rgb *= actualTime;
+ }
}
+ vec4 black = vec4(0.0, 0.0, 0.0, fragment.a);
+ gl_FragColor = mix(black, fragment, light);
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/slideshow/opengl/honeycombGeometryShader.glsl b/slideshow/opengl/honeycombGeometryShader.glsl
index bb2b1f3b3c78..f1c0c7058162 100644
--- a/slideshow/opengl/honeycombGeometryShader.glsl
+++ b/slideshow/opengl/honeycombGeometryShader.glsl
@@ -10,7 +10,7 @@
#version 150
layout(triangles) in;
-layout(triangle_strip, max_vertices=13) out;
+layout(triangle_strip, max_vertices=27) out;
in mat4 modelViewProjectionMatrix[];
@@ -20,6 +20,7 @@ uniform sampler2D permTexture;
out vec2 texturePosition;
out float fuzz;
out vec2 v_center;
+out vec3 normal;
const float expandFactor = 0.0318;
@@ -51,11 +52,28 @@ void main()
v_center = (1 + center.xy) / 2;
fuzz = snoise(center.xy);
+ // Draw “walls” to the hexagons.
+ if (hexagonSize < 1.0) {
+ vec3 rearCenter = vec3(center.xy, -0.3);
+ normal = vec3(0.0, 0.0, 0.3);
+ emitHexagonVertex(center, translateVectors[5]);
+ emitHexagonVertex(rearCenter, translateVectors[5]);
+
+ for (int i = 0; i < 6; ++i) {
+ emitHexagonVertex(center, translateVectors[i]);
+ emitHexagonVertex(rearCenter, translateVectors[i]);
+ }
+
+ EndPrimitive();
+ }
+
+ // Draw the main hexagon part.
+ normal = vec3(0.0, 0.0, 1.0);
emitHexagonVertex(center, translateVectors[5]);
for (int i = 0; i < 6; ++i) {
emitHexagonVertex(center, translateVectors[i]);
- emitHexagonVertex(center, vec2(0, 0));
+ emitHexagonVertex(center, vec2(0.0, 0.0));
}
EndPrimitive();