1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
|
// Copyright (C) 2023 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
// Assimp's animMesh stores complete target attributes,
// so it's littlebit different from the glTF's morphing operation
vec4 getTargetTexValue(ivec3 texCoord)
{
return texelFetch(qt_morphTargetTexture, texCoord, 0);
}
vec4 qt_getTargetValue(vec4 orgValue, int offset)
{
vec4 result = orgValue;
ivec3 texCoord;
int texWidth = textureSize(qt_morphTargetTexture, 0).x;
texCoord.x = gl_VertexIndex % texWidth;
texCoord.y = (gl_VertexIndex - texCoord.x) / texWidth;
for (int i = 0; i < QT_MORPH_MAX_COUNT; ++i) {
texCoord.z = offset + i;
vec4 targetValue = getTargetTexValue(texCoord);
result += qt_morphWeights[i] * (targetValue - orgValue);
}
return result;
}
vec3 qt_getTargetPosition(vec3 pos)
{
#ifdef QT_TARGET_POSITION_OFFSET
return qt_getTargetValue(vec4(pos, 1.0), QT_TARGET_POSITION_OFFSET).xyz;
#else
return pos;
#endif
}
vec3 qt_getTargetNormal(vec3 norm)
{
#ifdef QT_TARGET_NORMAL_OFFSET
return qt_getTargetValue(vec4(norm, 1.0), QT_TARGET_NORMAL_OFFSET).xyz;
#else
return norm;
#endif
}
vec3 qt_getTargetTangent(vec3 tan)
{
#ifdef QT_TARGET_TANGENT_OFFSET
return qt_getTargetValue(vec4(tan, 1.0), QT_TARGET_TANGENT_OFFSET).xyz;
#else
return tan;
#endif
}
vec3 qt_getTargetBinormal(vec3 binorm)
{
#ifdef QT_TARGET_BINORMAL_OFFSET
return qt_getTargetValue(vec4(binorm, 1.0), QT_TARGET_BINORMAL_OFFSET).xyz;
#else
return binorm;
#endif
}
vec2 qt_getTargetTex0(vec2 tex)
{
#ifdef QT_TARGET_TEX0_OFFSET
return qt_getTargetValue(vec4(tex, 1.0, 1.0), QT_TARGET_TEX0_OFFSET).xy;
#else
return tex;
#endif
}
vec2 qt_getTargetTex1(vec2 tex)
{
#ifdef QT_TARGET_TEX1_OFFSET
return qt_getTargetValue(vec4(tex, 1.0, 1.0), QT_TARGET_TEX1_OFFSET).xy;
#else
return tex;
#endif
}
vec4 qt_getTargetColor(vec4 color)
{
#ifdef QT_TARGET_COLOR_OFFSET
return qt_getTargetValue(color, QT_TARGET_COLOR_OFFSET);
#else
return color;
#endif
}
|