summaryrefslogtreecommitdiffstats
path: root/src/Runtime/res/effectlib/distancefieldtext_dropshadow.vert
blob: 835d34dd955ca97b1535f64fa76cc64802493e2e (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
#ifdef GL_OES_standard_derivatives
#  extension GL_OES_standard_derivatives : enable
#else
#  define use_fallback
#endif

uniform highp mat4 mvp;
uniform highp float fontScale;
uniform int textureWidth;
uniform int textureHeight;
uniform highp vec2 shadowOffset;

attribute highp vec3 vCoord;
attribute highp vec2 tCoord;
attribute highp vec4 textureBounds;

varying highp vec2 sampleCoord;
varying highp vec2 shadowSampleCoord;
varying highp vec4 normalizedTextureBounds;

#ifdef use_fallback
varying highp vec2 alphas;

highp float thresholdFunc(highp float scale)
{
    highp float base = 0.5;
    highp float baseDev = 0.065;
    highp float devScaleMin = 0.15;
    highp float devScaleMax = 0.3;
    return base - ((clamp(scale, devScaleMin, devScaleMax) - devScaleMin)
                   / (devScaleMax - devScaleMin) * -baseDev + baseDev);
}

highp float spreadFunc(highp float scale)
{
    return 0.06 / scale;
}

highp vec2 alphaRange(highp float scale)
{
    highp float base = thresholdFunc(scale);
    highp float range = spreadFunc(scale);
    highp float alphaMin = max(0.0, base - range);
    highp float alphaMax = min(base + range, 1.0);
    return vec2(alphaMin, alphaMax);
}

highp float determinantOfSubmatrix(highp mat4 m, int col0, int col1, int row0, int row1)
{
    return m[col0][row0] * m[col1][row1] - m[col0][row1] * m[col1][row0];
}

highp float determinantOfSubmatrix(highp mat4 m, int col0, int col1, int col2,
                                   int row0, int row1, int row2)
{
    highp float det = m[col0][row0] * determinantOfSubmatrix(m, col1, col2, row1, row2);
    det            -= m[col1][row0] * determinantOfSubmatrix(m, col0, col2, row1, row2);
    det            += m[col2][row0] * determinantOfSubmatrix(m, col0, col1, row1, row2);
    return det;
}

highp float determinant(highp mat4 m)
{
    highp float det = m[0][0] * determinantOfSubmatrix(m, 1, 2, 3, 1, 2, 3);
    det            -= m[1][0] * determinantOfSubmatrix(m, 0, 2, 3, 1, 2, 3);
    det            += m[2][0] * determinantOfSubmatrix(m, 0, 1, 3, 1, 2, 3);
    det            -= m[3][0] * determinantOfSubmatrix(m, 0, 1, 2, 1, 2, 3);
    return det;
}
#endif

void main()
{
#ifdef use_fallback
    highp float scale = fontScale * pow(abs(determinant(mvp)), 1.0 / 3.0);
    alphas = alphaRange(scale);
#endif

    highp vec2 textureSizeMultiplier = vec2(1.0 / highp float(textureWidth),
                                            1.0 / float(textureHeight));

    sampleCoord = tCoord * textureSizeMultiplier;
    shadowSampleCoord = (tCoord - shadowOffset) * textureSizeMultiplier;
    normalizedTextureBounds = highp vec4(textureBounds.xy * textureSizeMultiplier,
                                         textureBounds.zw * textureSizeMultiplier);

    gl_Position = mvp * vec4(vCoord, 1.0);
}