summaryrefslogtreecommitdiffstats
path: root/slideshow/opengl/honeycombGeometryShader.glsl
diff options
context:
space:
mode:
Diffstat (limited to 'slideshow/opengl/honeycombGeometryShader.glsl')
-rw-r--r--slideshow/opengl/honeycombGeometryShader.glsl111
1 files changed, 111 insertions, 0 deletions
diff --git a/slideshow/opengl/honeycombGeometryShader.glsl b/slideshow/opengl/honeycombGeometryShader.glsl
new file mode 100644
index 000000000..dedc0df97
--- /dev/null
+++ b/slideshow/opengl/honeycombGeometryShader.glsl
@@ -0,0 +1,111 @@
+/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#version 150
+
+layout(triangles) in;
+layout(triangle_strip, max_vertices=27) out;
+
+in mat4 projectionMatrix[];
+in mat4 modelViewMatrix[];
+in mat4 shadowMatrix[];
+
+uniform float hexagonSize;
+uniform sampler2D permTexture;
+
+out vec2 texturePosition;
+out float fuzz;
+out vec2 v_center;
+out vec3 normal;
+out vec4 shadowCoordinate;
+
+const float expandFactor = 0.0318;
+
+float snoise(vec2 p)
+{
+ return texture(permTexture, p).r;
+}
+
+mat4 identityMatrix(void)
+{
+ return mat4(1.0, 0.0, 0.0, 0.0,
+ 0.0, 1.0, 0.0, 0.0,
+ 0.0, 0.0, 1.0, 0.0,
+ 0.0, 0.0, 0.0, 1.0);
+}
+
+mat4 scaleMatrix(vec3 axis)
+{
+ mat4 matrix = identityMatrix();
+ matrix[0][0] = axis.x;
+ matrix[1][1] = axis.y;
+ matrix[2][2] = axis.z;
+ return matrix;
+}
+
+mat4 translationMatrix(vec3 axis)
+{
+ mat4 matrix = identityMatrix();
+ matrix[3] = vec4(axis, 1.0);
+ return matrix;
+}
+
+void emitHexagonVertex(vec3 center, vec2 translation)
+{
+ vec4 pos = vec4(center + hexagonSize * expandFactor * vec3(translation, 0.0), 1.0);
+ gl_Position = projectionMatrix[0] * modelViewMatrix[0] * pos;
+ shadowCoordinate = translationMatrix(vec3(0.5, 0.5, 0.5)) * scaleMatrix(vec3(0.5, 0.5, 0.5)) * shadowMatrix[0] * modelViewMatrix[0] * pos;
+ texturePosition = vec2((pos.x + 1), (1 - pos.y)) / 2;
+ EmitVertex();
+}
+
+void main()
+{
+ const vec2 translateVectors[6] = vec2[](
+ vec2(-3, -2),
+ vec2(0, -4),
+ vec2(3, -2),
+ vec2(3, 2),
+ vec2(0, 4),
+ vec2(-3, 2)
+ );
+
+ vec3 center = gl_in[0].gl_Position.xyz;
+
+ 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, 0.0));
+ }
+
+ EndPrimitive();
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */