diff options
Diffstat (limited to 'res/effectlib/wireframeCM.glsllib')
-rw-r--r-- | res/effectlib/wireframeCM.glsllib | 169 |
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 |