aboutsummaryrefslogtreecommitdiffstats
path: root/src/runtimerender/res/effectlib/morphanim.glsllib
blob: ebcc1e69a77f50a6c9c0ef914cf44496afe61dbe (plain)
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
}