1/****************************************************************************
2**
3** Copyright (C) 2014 NVIDIA Corporation.
4** Copyright (C) 2019 The Qt Company Ltd.
5** Contact: https://www.qt.io/licensing/
6**
7** This file is part of Qt 3D Studio.
8**
9** $QT_BEGIN_LICENSE:GPL$
10** Commercial License Usage
11** Licensees holding valid commercial Qt licenses may use this file in
12** accordance with the commercial license agreement provided with the
13** Software or, alternatively, in accordance with the terms contained in
14** a written agreement between you and The Qt Company. For licensing terms
15** and conditions see https://www.qt.io/terms-conditions. For further
16** information use the contact form at https://www.qt.io/contact-us.
17**
18** GNU General Public License Usage
19** Alternatively, this file may be used under the terms of the GNU
20** General Public License version 3 or (at your option) any later version
21** approved by the KDE Free Qt Foundation. The licenses are as published by
22** the Free Software Foundation and appearing in the file LICENSE.GPL3
23** included in the packaging of this file. Please review the following
24** information to ensure the GNU General Public License requirements will
25** be met: https://www.gnu.org/licenses/gpl-3.0.html.
26**
27** $QT_END_LICENSE$
28**
29****************************************************************************/
30
31#ifndef TESSELLATION_NPATCH_CM_GLSLLIB
32#define TESSELLATION_NPATCH_CM_GLSLLIB GLSLLIB
33
34
35#include "tessellationNPatch.glsllib"
36
37
38#if TESSELLATION_CONTROL_SHADER
39
40uniform float tessLevelOuter;
41uniform float tessLevelInner;
42
43attribute vec3 varNormal[];
44attribute vec3 varObjPos[];
45
46varying vec3 varNormalTC[];
47varying vec3 varObjPosTC[];
48
49#if QSSG_ENABLE_UV0
50attribute vec3 varTexCoord0[];
51varying vec3 varTexCoord0TC[];
52#endif
53
54#if QSSG_ENABLE_TEXTAN
55attribute vec3 varTangent[];
56attribute vec3 varObjTangent[];
57varying vec3 varTangentTC[];
58varying vec3 varObjTangentTC[];
59#endif
60
61#if QSSG_ENABLE_BINORMAL
62attribute vec3 varBinormal[];
63attribute vec3 varObjBinormal[];
64varying vec3 varBinormalTC[];
65varying vec3 varObjBinormalTC[];
66#endif
67
68#if QSSG_ENABLE_WORLD_POSITION
69attribute vec3 varWorldPos[];
70varying vec3 varWorldPosTC[];
71#endif
72
73void main() {
74
75    ctNorm[0] = varNormal[0];
76    ctNorm[1] = varNormal[1];
77    ctNorm[2] = varNormal[2];
78#if QSSG_ENABLE_TEXTAN
79    ctTangent[0] = varObjTangent[0];
80    ctTangent[1] = varObjTangent[1];
81    ctTangent[2] = varObjTangent[2];
82#endif
83#if QSSG_ENABLE_WORLD_POSITION
84    ctWorldPos[0] = varWorldPos[0];
85    ctWorldPos[1] = varWorldPos[1];
86    ctWorldPos[2] = varWorldPos[2];
87#endif
88
89    gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;
90    tessShader( tessLevelOuter, tessLevelInner);
91
92    varObjPosTC[gl_InvocationID] = varObjPos[gl_InvocationID];
93    varNormalTC[gl_InvocationID] = varNormal[gl_InvocationID];
94
95#if QSSG_ENABLE_UV0
96    varTexCoord0TC[gl_InvocationID] = varTexCoord0[gl_InvocationID];
97#endif
98#if QSSG_ENABLE_TEXTAN
99    varTangentTC[gl_InvocationID] = varTangent[gl_InvocationID];
100    varObjTangentTC[gl_InvocationID] = varObjTangent[gl_InvocationID];
101#endif
102#if QSSG_ENABLE_BINORMAL
103    varBinormalTC[gl_InvocationID] = varBinormal[gl_InvocationID];
104    varObjBinormalTC[gl_InvocationID] = varObjBinormal[gl_InvocationID];
105#endif
106#if QSSG_ENABLE_WORLD_POSITION
107    varWorldPosTC[gl_InvocationID] = varWorldPos[gl_InvocationID];
108#endif
109}
110
111#endif
112
113
114#if TESSELLATION_EVALUATION_SHADER
115
116#if (GEOMETRY_SHADER == 1)
117#define VARYING_NAME(varyingName) varyingName##TE
118#else
119#define VARYING_NAME(varyingName) varyingName
120#endif
121
122uniform mat3 normalMatrix;
123uniform mat4 modelViewProjection_matrix;
124
125attribute vec3 varNormalTC[];
126attribute vec3 varObjPosTC[];
127
128varying vec3 VARYING_NAME(varNormal);
129varying vec3 VARYING_NAME(varObjPos);
130
131#if QSSG_ENABLE_UV0
132attribute vec3 varTexCoord0TC[];
133varying vec3 VARYING_NAME(varTexCoord0);
134#endif
135
136#if QSSG_ENABLE_TEXTAN
137attribute vec3 varTangentTC[];
138attribute vec3 varObjTangentTC[];
139varying vec3 VARYING_NAME(varTangent);
140varying vec3 VARYING_NAME(varObjTangent);
141#endif
142
143#if QSSG_ENABLE_BINORMAL
144attribute vec3 varBinormalTC[];
145attribute vec3 varObjBinormalTC[];
146varying vec3 VARYING_NAME(varBinormal);
147varying vec3 VARYING_NAME(varObjBinormal);
148#endif
149
150#if QSSG_ENABLE_WORLD_POSITION
151attribute vec3 varWorldPosTC[];
152varying vec3 VARYING_NAME(varWorldPos);
153#endif
154
155void main() {
156
157    ctNorm[0] = varNormalTC[0];
158    ctNorm[1] = varNormalTC[1];
159    ctNorm[2] = varNormalTC[2];
160#if QSSG_ENABLE_TEXTAN
161    ctTangent[0] = varObjTangentTC[0];
162    ctTangent[1] = varObjTangentTC[1];
163    ctTangent[2] = varObjTangentTC[2];
164#endif
165
166    vec4 pos = tessShader( );
167
168    gl_Position = modelViewProjection_matrix * pos;
169
170    VARYING_NAME(varObjPos) = gl_TessCoord.z * varObjPosTC[0] + gl_TessCoord.x * varObjPosTC[1] + gl_TessCoord.y * varObjPosTC[2];
171
172#if QSSG_ENABLE_UV0
173    VARYING_NAME(varTexCoord0) = gl_TessCoord.z * varTexCoord0TC[0] + gl_TessCoord.x * varTexCoord0TC[1] + gl_TessCoord.y * varTexCoord0TC[2];
174#endif
175#if QSSG_ENABLE_WORLD_POSITION
176    VARYING_NAME(varWorldPos) = gl_TessCoord.z * varWorldPosTC[0] + gl_TessCoord.x * varWorldPosTC[1] + gl_TessCoord.y * varWorldPosTC[2];
177#endif
178
179    VARYING_NAME(varNormal) = normalize(normalMatrix * teNorm);
180
181#if QSSG_ENABLE_TEXTAN
182    VARYING_NAME(varTangent) = normalize(normalMatrix * teTangent);
183    VARYING_NAME(varObjTangent) = gl_TessCoord.z * varObjTangentTC[0] + gl_TessCoord.x * varObjTangentTC[1] + gl_TessCoord.y * varObjTangentTC[2];
184#endif
185#if QSSG_ENABLE_BINORMAL
186    VARYING_NAME(varBinormal) = normalize(normalMatrix * teBinormal);
187    VARYING_NAME(varObjBinormal) = gl_TessCoord.z * varObjBinormalTC[0] + gl_TessCoord.x * varObjBinormalTC[1] + gl_TessCoord.y * varObjBinormalTC[2];
188#endif
189}
190
191#endif
192
193#endif
194
195