summaryrefslogtreecommitdiffstats
path: root/res/effectlib/wireframeCM.glsllib
diff options
context:
space:
mode:
Diffstat (limited to 'res/effectlib/wireframeCM.glsllib')
-rw-r--r--res/effectlib/wireframeCM.glsllib169
1 files changed, 169 insertions, 0 deletions
diff --git a/res/effectlib/wireframeCM.glsllib b/res/effectlib/wireframeCM.glsllib
new file mode 100644
index 0000000..fcbf7e9
--- /dev/null
+++ b/res/effectlib/wireframeCM.glsllib
@@ -0,0 +1,169 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef WIREFRAME_CM_GLSLLIB
+#define WIREFRAME_CM_GLSLLIB
+
+#ifdef GL_ES
+precision highp float;
+precision highp int;
+#endif
+
+#if (TESSELLATION_EVALUATION_SHADER == 1)
+#define VARYING_NAME(varyingName) varyingName##TE
+#else
+#define VARYING_NAME(varyingName) varyingName##VX
+#endif
+
+attribute vec3 VARYING_NAME(varNormal)[];
+attribute vec3 VARYING_NAME(varObjPos)[];
+
+varying vec3 varNormal;
+varying vec3 varObjPos;
+
+#if QT3DS_ENABLE_UV0
+attribute vec3 VARYING_NAME(varTexCoord0)[];
+varying vec3 varTexCoord0;
+#endif
+
+#if QT3DS_ENABLE_TEXTAN
+attribute vec3 VARYING_NAME(varTangent)[];
+attribute vec3 VARYING_NAME(varObjTangent)[];
+varying vec3 varTangent;
+varying vec3 varObjTangent;
+#endif
+
+#if QT3DS_ENABLE_BINORMAL
+attribute vec3 VARYING_NAME(varBinormal)[];
+attribute vec3 VARYING_NAME(varObjBinormal)[];
+varying vec3 varBinormal;
+varying vec3 varObjBinormal;
+#endif
+
+#if QT3DS_ENABLE_WORLD_POSITION
+attribute vec3 VARYING_NAME(varWorldPos)[];
+varying vec3 varWorldPos;
+#endif
+
+varying vec3 varEdgeDistance;
+
+uniform mat4 viewport_matrix;
+
+layout (triangles) in;
+layout (triangle_strip, max_vertices = 3) out;
+
+void main()
+{
+ // how this all work see http://developer.download.nvidia.com/SDK/10.5/direct3d/Source/SolidWireframe/Doc/SolidWireframe.pdf
+ // project points to screen space
+ vec3 p0 = vec3(viewport_matrix * (gl_in[0].gl_Position / gl_in[0].gl_Position.w));
+ vec3 p1 = vec3(viewport_matrix * (gl_in[1].gl_Position / gl_in[1].gl_Position.w));
+ vec3 p2 = vec3(viewport_matrix * (gl_in[2].gl_Position / gl_in[2].gl_Position.w));
+ // compute triangle heights
+ float e1 = length(p1 - p2);
+ float e2 = length(p2 - p0);
+ float e3 = length(p1 - p0);
+ float alpha = acos( (e2*e2 + e3*e3 - e1*e1) / (2.0*e2*e3) );
+ float beta = acos( (e1*e1 + e3*e3 - e2*e2) / (2.0*e1*e3) );
+ float ha = abs( e3 * sin( beta ) );
+ float hb = abs( e3 * sin( alpha ) );
+ float hc = abs( e2 * sin( alpha ) );
+
+
+ // vertex 0
+ varEdgeDistance = vec3(ha*gl_in[0].gl_Position.w, 0.0, 0.0);
+ varNormal = VARYING_NAME(varNormal)[0];
+ varObjPos = VARYING_NAME(varObjPos)[0];
+#if QT3DS_ENABLE_UV0
+ varTexCoord0 = VARYING_NAME(varTexCoord0)[0];
+#endif
+#if QT3DS_ENABLE_TEXTAN
+ varTangent = VARYING_NAME(varTangent)[0];
+ varObjTangent = VARYING_NAME(varObjTangent)[0];
+#endif
+#if QT3DS_ENABLE_BINORMAL
+ varBinormal = VARYING_NAME(varBinormal)[0];
+ varObjBinormal = VARYING_NAME(varObjBinormal)[0];
+#endif
+#if QT3DS_ENABLE_WORLD_POSITION
+ varWorldPos = VARYING_NAME(varWorldPos)[0];
+#endif
+
+ gl_Position = gl_in[0].gl_Position;
+ EmitVertex();
+
+ // vertex 1
+ varEdgeDistance = vec3(0.0, hb*gl_in[1].gl_Position.w, 0.0);
+ varNormal = VARYING_NAME(varNormal)[1];
+ varObjPos = VARYING_NAME(varObjPos)[1];
+#if QT3DS_ENABLE_UV0
+ varTexCoord0 = VARYING_NAME(varTexCoord0)[1];
+#endif
+#if QT3DS_ENABLE_TEXTAN
+ varTangent = VARYING_NAME(varTangent)[1];
+ varObjTangent = VARYING_NAME(varObjTangent)[1];
+#endif
+#if QT3DS_ENABLE_BINORMAL
+ varBinormal = VARYING_NAME(varBinormal)[1];
+ varObjBinormal = VARYING_NAME(varObjBinormal)[1];
+#endif
+#if QT3DS_ENABLE_WORLD_POSITION
+ varWorldPos = VARYING_NAME(varWorldPos)[1];
+#endif
+
+ gl_Position = gl_in[1].gl_Position;
+ EmitVertex();
+
+ // vertex 2
+ varEdgeDistance = vec3(0.0, 0.0, hc*gl_in[2].gl_Position.w);
+ varNormal = VARYING_NAME(varNormal)[2];
+ varObjPos = VARYING_NAME(varObjPos)[2];
+#if QT3DS_ENABLE_UV0
+ varTexCoord0 = VARYING_NAME(varTexCoord0)[2];
+#endif
+#if QT3DS_ENABLE_TEXTAN
+ varTangent = VARYING_NAME(varTangent)[2];
+ varObjTangent = VARYING_NAME(varObjTangent)[2];
+#endif
+#if QT3DS_ENABLE_BINORMAL
+ varBinormal = VARYING_NAME(varBinormal)[2];
+ varObjBinormal = VARYING_NAME(varObjBinormal)[2];
+#endif
+#if QT3DS_ENABLE_WORLD_POSITION
+ varWorldPos = VARYING_NAME(varWorldPos)[2];
+#endif
+
+ gl_Position = gl_in[2].gl_Position;
+ EmitVertex();
+
+ EndPrimitive();
+}
+
+#endif