File: power-scale.glsl

package info (click to toggle)
python-vispy 0.6.6-3
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 21,344 kB
  • sloc: python: 57,412; javascript: 6,810; makefile: 63; sh: 5
file content (139 lines) | stat: -rw-r--r-- 3,916 bytes parent folder | download | duplicates (5)
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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
// ----------------------------------------------------------------------------
// Copyright (c) 2014, Nicolas P. Rougier. All Rights Reserved.
// Distributed under the (new) BSD License.
// ----------------------------------------------------------------------------
/*
  Power scales are similar to linear scales, except there's an exponential
  transform that is applied to the input domain value before the output range
  value is computed. The mapping to the output range value y can be expressed
  as a function of the input domain value x: y = mx^k + b, where k is the
  exponent value. Power scales also support negative values, in which case the
  input value is multiplied by -1, and the resulting output value is also
  multiplied by -1.
*/

uniform int  power_scale_clamp;
uniform int  power_scale_discard;
uniform vec2 power_scale_range;
uniform vec2 power_scale_domain;
uniform float power_scale_exponent;

float forward(float value)
{
    vec2 domain = power_scale_domain;
    vec2 range = power_scale_range;
    float exponent = power_scale_exponent;
    float v = pow(abs(value), exponent);
    float t = (v - domain.x) /(domain.y - domain.x);

#ifdef __FRAGMENT_SHADER__
    if (power_scale_discard > 0)
        if (t != clamp(t, 0.0, 1.0))
            discard;
#endif

    if (power_scale_clamp > 0)
        t = clamp(t, 0.0, 1.0);

    return sign(value) * (range.x + t*(range.y - range.x));
}

vec2 forward(vec2 value)
{
    vec2 domain = power_scale_domain;
    vec2 range = power_scale_range;
    float exponent = power_scale_exponent;
    vec2 v = pow(abs(value), vec2(exponent));
    vec2 t = (v - domain.x) /(domain.y - domain.x);

#ifdef __FRAGMENT_SHADER__
    if (power_scale_discard > 0)
        if (t != clamp(t, 0.0, 1.0))
            discard;
#endif

    if (power_scale_clamp > 0)
        t = clamp(t, 0.0, 1.0);

    return sign(value) * (range.x + t*(range.y - range.x));
}

vec3 forward(vec3 value)
{
    vec2 domain = power_scale_domain;
    vec2 range = power_scale_range;
    float exponent = power_scale_exponent;
    vec3 v = pow(abs(value), vec3(exponent));
    vec3 t = (v - domain.x) /(domain.y - domain.x);

#ifdef __FRAGMENT_SHADER__
    if (power_scale_discard > 0)
        if (t != clamp(t, 0.0, 1.0))
            discard;
#endif

    if (power_scale_clamp > 0)
        t = clamp(t, 0.0, 1.0);

    return sign(value) * (range.x + t*(range.y - range.x));
}

float inverse(float value)
{
    vec2 domain = power_scale_domain;
    vec2 range = power_scale_range;
    float exponent = power_scale_exponent;
    float t = (abs(value) - range.x) / (range.y - range.x);

#ifdef __FRAGMENT_SHADER__
    if (power_scale_discard > 0)
        if (t != clamp(t, 0.0, 1.0))
            discard;
#endif

    if (power_scale_clamp > 0)
        t = clamp(t, 0.0, 1.0);

    float v = domain.x + t*(domain.y - domain.x);
    return sign(value) * pow(abs(v), 1.0/exponent);
}

vec2 inverse(vec2 value)
{
    vec2 domain = power_scale_domain;
    vec2 range = power_scale_range;
    float exponent = power_scale_exponent;
    vec2 t = (abs(value) - range.x) / (range.y - range.x);

#ifdef __FRAGMENT_SHADER__
    if (power_scale_discard > 0)
        if (t != clamp(t, 0.0, 1.0))
            discard;
#endif

    if (power_scale_clamp > 0)
        t = clamp(t, 0.0, 1.0);

    vec2 v = domain.x + t*(domain.y - domain.x);
    return sign(value) * pow(abs(v), vec2(1.0/exponent));
}

vec3 inverse(vec3 value)
{
    vec2 domain = power_scale_domain;
    vec2 range = power_scale_range;
    float exponent = power_scale_exponent;
    vec3 t = (abs(value) - range.x) / (range.y - range.x);

#ifdef __FRAGMENT_SHADER__
    if (power_scale_discard > 0)
        if (t != clamp(t, 0.0, 1.0))
            discard;
#endif

    if (power_scale_clamp > 0)
        t = clamp(t, 0.0, 1.0);

    vec3 v = domain.x + t*(domain.y - domain.x);
    return sign(value) * pow(abs(v), vec3(1.0/exponent));
}