-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathpaper_scroll_timeline.glsl
More file actions
249 lines (205 loc) · 8.1 KB
/
paper_scroll_timeline.glsl
File metadata and controls
249 lines (205 loc) · 8.1 KB
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
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
/*
Another GLSL deep-Refactoring project
Original shader: https://www.shadertoy.com/view/WtjGRc
by Ping2_0
*/
/*
* Ping 2.0 14/06/2019
*
* TODO : Cloud rocking
*/
const vec3 c0 = vec3(.042, 0.530, 0.159);
const vec3 c1 = vec3(.142, 0.630, 0.259);
const vec3 c2 = vec3(0.242, 0.730, 0.359);
const vec3 c3 = vec3(0.342, 0.830, 0.459);
const vec3 c4 = vec3(0.442, 0.930, 0.559);
const vec3 c5 = vec3(1);
const vec3 c6 = vec3(0.95, 0.95, 1.0);
const vec3 c7 = vec3(0.9, 0.9, 1.0);
//const vec3 c8 = vec3(0.85, 0.85 ,1.0);
//const vec3 c9 = vec3(0.8,0.85, 0.95);
// min dist 2 circles (or ellipsis)
#define GRND1 min(length(fract(op)*vec2(1, 3) - vec2(0.5,0.18)) - 0.3, length(fract(op+vec2(0.5, 0))*vec2(1, 2) - vec2(0.5,0.09)) - 0.35)
#define GRND2 min(length(fract(op)*vec2(1.2, 2.5) - vec2(0.5,0.45)) - 0.4, length(fract(op+vec2(0.65, 0))*vec2(1, 1.4) - vec2(0.5,0.25)) - 0.35)
#define GRND3 min(length(fract(op)-vec2(0.5,0.3))-0.35, length(fract(op+vec2(0.5, 0))-vec2(0.5,0.25))-0.3)
#define GRND4 min(length(fract(op)-vec2(0.5,0.1))-0.3, length(fract(op+vec2(0.5, 0))-vec2(0.5,0.1))-0.4)
#define GRND5 min(length(fract(op)-vec2(0.5,0.2))-0.5, length(fract(op+vec2(0.5, 0))-vec2(0.5,0.2))-0.5)
#define txc(c, n, f) c*n + (1.0125-n)*texture(iChannel0, op*f).r
vec3 ground(in vec2 u, in vec3 c, in float shadow_pos) {
if(u.y < 0.4) {
const float b = 0.005; //blur
vec2 op = u * 2.0;
op.x += iTime * 0.05;
c = mix(c, txc(c0, 0.98, vec2(2.5, 2.5)), smoothstep(b * 5.0, -b * 5.0, GRND5));
op = vec2(u.x * 3.0 + iTime * 0.1 - shadow_pos, u.y * 3.0 - 0.5);
c = mix(c, c * 0.75, smoothstep(b * 30.0, -b * 30.0, GRND4));
op.x += shadow_pos;
c = mix(c, txc(c1, 0.98, vec2(1.33, 1.33)), smoothstep(b * 3.0, -b * 3.0, GRND4));
op = vec2(u.x * 4.0 + iTime * 0.2 - shadow_pos, u.y * 3.0 - 0.2);
c = mix(c, c * 0.9, smoothstep(b * 10.0, -b * 10.0, GRND3));
op.x += shadow_pos;
c = mix(c, txc(c2, 0.98, vec2(0.75, 1.0)), smoothstep(b * 0.5, -b * 0.5, GRND3));
op = vec2(u.x * 5.0 + iTime * 0.4 - shadow_pos, u.y * 2.0);
c = mix(c, c * 0.82, smoothstep(b * 20.0, -b * 20.0, GRND2));
op.x += shadow_pos;
c = mix(c, txc(c3, 0.98, vec2(0.4, 1.0)), smoothstep(b * 3.0, -b * 3.0, GRND2));
op = vec2(u.x * 8.0 + iTime - shadow_pos, u.y * 2.0 + 0.02);
c = mix(c, c * 0.75, smoothstep(b * 30.0, -b * 30.0, GRND1));
op += vec2(shadow_pos, -0.02);
c = mix(c, txc(c4, 0.96, vec2(0.5, 1.0)), smoothstep(b * 5.0, -b * 5.0, GRND1));
}
return c;
}
// https://iquilezles.org/articles/distfunctions2d
float sdLine(in vec2 p, in vec2 a, in vec2 b) {
vec2 pa = p - a, ba = b - a;
float h = clamp(dot(pa, ba) / dot(ba, ba), 0.0, 1.0);
return length(pa - ba * h);
}
vec3 cloud(in vec2 u, in vec2 p, in float iscale, in vec3 c, const in vec3 cloud_color, in vec2 shadow_pos, in float shadow_factor, in float blur, in float shadow_blur) {
u *= iscale;
p *= iscale;
// thread shadow
c = mix(c, c * .95, smoothstep(shadow_blur * 0.2, -shadow_blur * 0.2, sdLine(u, p + vec2(shadow_pos.x, 0.07), vec2(p.x + shadow_pos.x, iscale))));
// cloud shadow
vec2 st = u - p - shadow_pos;
float d = length(st) - 0.07;
d = min(d, length((st - vec2(0.06, 0))) - 0.055);
d = min(d, length((st + vec2(0.06, 0))) - 0.055);
c = mix(c, c * shadow_factor, smoothstep(shadow_blur, -shadow_blur, d));
// cloud
st += shadow_pos;
d = length(st) - 0.07;
d = min(d, length((st - vec2(0.06, 0))) - 0.055);
d = min(d, length((st + vec2(0.06, 0))) - 0.055);
vec2 op = st;
c = mix(c, cloud_color * 0.98 + (1.0 - 0.98) * texture(iChannel0, st * 2.5).r, smoothstep(blur, -blur, d));
// thread
c = mix(c, cloud_color * 0.65, smoothstep(blur / (iscale * iscale), -(blur * 0.5) / (iscale * iscale), sdLine(u, p + vec2(0, 0.065), vec2(p.x, iscale))));
return c;
}
const float DONT_CARE = 1000.0;
struct CloudConfig {
float x0;
float xphase;
float xvf;
// float px; // todo: remove
float vx;
float y0, yamp, yphase, yvf;
};
CloudConfig[10] cca = CloudConfig[10](
CloudConfig(1.4, 50.0, 0.005, 1.5, 0.8, 0.0, DONT_CARE, DONT_CARE),
CloudConfig(1.4, 0.0, 0.0055, 1.5, 0.75, 0.01, 0.0, 0.1),
CloudConfig(1.4, 100.0, 0.0045, 1.5, 0.8, 0.02, 0.5, 0.01),
CloudConfig(1.4, 0.75, 0.0045, 1.5, 0.88, 0.03, 0.75, 0.01),
CloudConfig(1.41, 75.0, 0.007, 1.5, 0.88, 0.01, 0.0, 0.05),
CloudConfig(1.41, 50.0, 0.0071, 1.5, 0.85, 0.0095, 0.5, 0.042),
CloudConfig(1.41, 35.0, 0.0067, 1.5, 0.82, 0.012, 0.9, 0.035),
CloudConfig(1.50, 0.0, 0.011, 1.75, 0.85, 0.025, 0.0, 0.2),
CloudConfig(1.50, 50.0, 0.01, 1.75, 0.85, 0.0125, 1.5, 0.08),
CloudConfig(1.50, 35.0, 0.009, 1.75, 0.8, 0.025, 0.5, 0.05)
);
CloudConfig np_cloud_cc(int num1) {
if(num1 - 1 >= 0 && num1 - 1 <= 9) {
return cca[num1 - 1];
}
CloudConfig cc0 = CloudConfig(DONT_CARE, DONT_CARE, DONT_CARE, DONT_CARE, DONT_CARE, DONT_CARE, DONT_CARE, DONT_CARE);
return cc0;
}
vec2 np_cloud2(float t, CloudConfig cc) {
float px = (t + cc.xphase) * cc.xvf;
float y = cc.y0 + sin(cc.yphase + t * cc.yvf) * cc.yamp;
float x = cc.x0 - fract(px) * cc.vx;
vec2 np = vec2(x, y); // x : -1 1
return np;
}
vec2 np_cloud(float t, int num) {
CloudConfig cc = np_cloud_cc(num);
return np_cloud2(t, cc);
}
struct CloudBConf {
int indx1;
vec2 uv;
vec2 p;
float iscale;
vec3 c;
vec3 cloud_color;
float shadow_pos1;
float shadow_factor;
float blur;
float shadow_blur;
};
vec3 cloud1(int idx, CloudBConf cc, vec2 shadow_pos) {
if (idx != cc.indx1) {
return vec3(DONT_CARE, DONT_CARE, DONT_CARE);
}
return cloud(cc.uv, cc.p, cc.iscale, cc.c, cc.cloud_color, cc.shadow_pos1 * shadow_pos, cc.shadow_factor, cc.blur, cc.shadow_blur);
}
vec3 clouds(vec3 c, float iTime, vec2 uv, float shadow_pos) {
CloudBConf[11] ccb;
vec2 np;
// 1
np = np_cloud(iTime, 1);
// 👮 todo: now move np out of this:
ccb[1]=CloudBConf(1,uv, np, 2.0, c, c7, 1.0 * 0.2, 0.8, 0.01, 0.03);
c = cloud1(1,ccb[1], vec2(shadow_pos, -0.1));
// 2
np = np_cloud(iTime, 2);
ccb[2]=CloudBConf(2,uv, np, 2.0, c, c7, 1.0 * 0.2, 0.8, 0.01, 0.03);
c = cloud1(2,ccb[2] , vec2(shadow_pos, -0.1));
// 3
np = np_cloud(iTime, 3);
ccb[3]=CloudBConf(3,uv, np, 2.0, c, c7, 1.0 * 0.2, 0.8, 0.01, 0.03);
c = cloud1(3,ccb[3] , vec2(shadow_pos, -0.1));
// 4
np = np_cloud(iTime, 4);
ccb[4]=CloudBConf(4,uv, np, 2.0, c, c7, 1.0 * 0.2, 0.8, 0.01, 0.03);
c = cloud1(4,ccb[4] , vec2(shadow_pos, -0.1));
// 5
np = np_cloud(iTime, 5);
ccb[5]=CloudBConf(5,uv, np, 1.5, c, c6, 1.0 * 0.2, 0.8, 0.005, 0.04);
c = cloud1(5,ccb[5] , vec2(shadow_pos, -0.1));
// 6
np = np_cloud(iTime, 6);
ccb[6]=CloudBConf(6,uv, np, 1.5, c, c6, 1.0 * 0.2, 0.8, 0.005, 0.04);
c = cloud1(6,ccb[6] , vec2(shadow_pos, -0.1));
np = np_cloud(iTime, 7);
ccb[7]=CloudBConf(7,uv, np, 1.5, c, c6, 1.0 * 0.2, 0.8, 0.005, 0.04);
c = cloud1(7,ccb[7], vec2(shadow_pos, -0.1));
np = np_cloud(iTime, 8);
ccb[8]=CloudBConf(8,uv, np, 1.0, c, c5, 1.0 * 0.2, 0.8, 0.002, 0.04);
c = cloud1(8,ccb[8] , vec2(shadow_pos, -0.1));
np = np_cloud(iTime, 9);
ccb[9]=CloudBConf(9,uv, np, 1.0, c, c5, 1.0 * 0.2, 0.8, 0.002, 0.04);
c = cloud1(9,ccb[9] , vec2(shadow_pos, -0.1));
np = np_cloud(iTime, 10);
ccb[10]=CloudBConf(10,uv, np, 1.0, c, c5, 1.0 * 0.2, 0.8, 0.002, 0.04);
c = cloud1(10,ccb[10] , vec2(shadow_pos, -0.1));
return c;
}
vec3 mainImage1(out vec4 fragColor, in vec2 fragCoord) {
vec2 uv = fragCoord / iResolution.xy;
uv.x *= 4.0 / 3.0; // dev in 4/3 screen
// beautiful sky
float d = length(uv - vec2(0.25, 0.5)); // -0.5;
vec3 c = mix(vec3(.4, 0.4, .8), vec3(0.55, 0.8, 0.8), smoothstep(1.7, 0., d));
// gorgeous ground
float shadow_pos = -smoothstep(1.0, 0.0, uv.x) * 0.06 - 0.1;
c = ground(uv, c, shadow_pos);
// wonderful clouds
c = clouds(c, iTime, uv, shadow_pos);
return c;
}
void mainImage(out vec4 fragColor, in vec2 fragCoord) {
vec3 c3 = mainImage1(fragColor, fragCoord);
fragColor = vec4(c3, 1.0);
}
/*
Precedence:
https://www.shadertoy.com/view/WtjGRc
Paper scroll.
Made with paper, scissors and a little thread.
Soundcloud music : Jamal Green - Equilinox game music
Tags: 2d, paper, cutting
Created by Ping2_0 in 2019-06-14
*/