1// Compatibility #ifdefs needed for parameters
2#ifdef GL_ES
3#define COMPAT_PRECISION mediump
4#else
5#define COMPAT_PRECISION
6#endif
7
8// Parameter lines go here:
9#pragma parameter RETRO_PIXEL_SIZE "Retro Pixel Size" 0.84 0.0 1.0 0.01
10#ifdef PARAMETER_UNIFORM
11// All parameter floats need to have COMPAT_PRECISION in front of them
12uniform COMPAT_PRECISION float RETRO_PIXEL_SIZE;
13#else
14#define RETRO_PIXEL_SIZE 0.84
15#endif
16
17#if defined(VERTEX)
18
19#if __VERSION__ >= 130
20#define COMPAT_VARYING out
21#define COMPAT_ATTRIBUTE in
22#define COMPAT_TEXTURE texture
23#else
24#define COMPAT_VARYING varying
25#define COMPAT_ATTRIBUTE attribute
26#define COMPAT_TEXTURE texture2D
27#endif
28
29#ifdef GL_ES
30#define COMPAT_PRECISION mediump
31#else
32#define COMPAT_PRECISION
33#endif
34
35COMPAT_ATTRIBUTE vec4 VertexCoord;
36COMPAT_ATTRIBUTE vec4 COLOR;
37COMPAT_ATTRIBUTE vec4 TexCoord;
38COMPAT_VARYING vec4 COL0;
39COMPAT_VARYING vec4 TEX0;
40// out variables go here as COMPAT_VARYING whatever
41
42vec4 _oPosition1;
43uniform mat4 MVPMatrix;
44uniform COMPAT_PRECISION int FrameDirection;
45uniform COMPAT_PRECISION int FrameCount;
46uniform COMPAT_PRECISION vec2 OutputSize;
47uniform COMPAT_PRECISION vec2 TextureSize;
48uniform COMPAT_PRECISION vec2 InputSize;
49
50// compatibility #defines
51#define vTexCoord TEX0.xy
52#define SourceSize vec4(TextureSize, 1.0 / TextureSize) //either TextureSize or InputSize
53#define OutSize vec4(OutputSize, 1.0 / OutputSize)
54
55void main()
56{
57    gl_Position = MVPMatrix * VertexCoord;
58    TEX0.xy = VertexCoord.xy;
59// Paste vertex contents here:
60}
61
62#elif defined(FRAGMENT)
63
64#if __VERSION__ >= 130
65#define COMPAT_VARYING in
66#define COMPAT_TEXTURE texture
67out vec4 FragColor;
68#else
69#define COMPAT_VARYING varying
70#define FragColor gl_FragColor
71#define COMPAT_TEXTURE texture2D
72#endif
73
74#ifdef GL_ES
75#ifdef GL_FRAGMENT_PRECISION_HIGH
76precision highp float;
77#else
78precision mediump float;
79#endif
80#define COMPAT_PRECISION mediump
81#else
82#define COMPAT_PRECISION
83#endif
84
85uniform COMPAT_PRECISION int FrameDirection;
86uniform COMPAT_PRECISION int FrameCount;
87uniform COMPAT_PRECISION vec2 OutputSize;
88uniform COMPAT_PRECISION vec2 TextureSize;
89uniform COMPAT_PRECISION vec2 InputSize;
90uniform sampler2D Texture;
91COMPAT_VARYING vec4 TEX0;
92// in variables go here as COMPAT_VARYING whatever
93
94// compatibility #defines
95#define Source Texture
96#define vTexCoord TEX0.xy
97
98#define SourceSize vec4(TextureSize, 1.0 / TextureSize) //either TextureSize or InputSize
99#define OutSize vec4(OutputSize, 1.0 / OutputSize)
100
101// delete all 'params.' or 'registers.' or whatever in the fragment
102float iGlobalTime = float(FrameCount)*0.025;
103vec2 iResolution = OutputSize.xy;
104
105//kirby jump
106// fizzer 2018-01-31
107// https://www.shadertoy.com/view/lt2fD3
108
109// polynomial smooth min (from IQ)
110float smin( float a, float b, float k )
111{
112    float h = clamp( 0.5+0.5*(b-a)/k, 0.0, 1.0 );
113    return mix( b, a, h ) - k*h*(1.0-h);
114}
115
116
117float smax(float a,float b, float k)
118{
119    return -smin(-a,-b,k);
120}
121
122mat2 rotmat(float a)
123{
124    return mat2(cos(a),sin(a),-sin(a),cos(a));
125}
126
127float shoesDist(vec3 p)
128{
129    vec3 op=p;
130    float d=1e4;
131
132    p.y-=1.5;
133
134    // right shoe
135    op=p;
136    p-=vec3(-.5,-.6,-.9);
137    p.yz=rotmat(-.7)*p.yz;
138    p.xz=rotmat(0.1)*p.xz;
139    d=min(d,-smin(p.y,-(length(p*vec3(1.6,1,1))-.64),.2));
140    p=op;
141
142    // left shoe
143    op=p;
144    p-=vec3(.55,-.8,0.4);
145    p.x=-p.x;
146    p.yz=rotmat(1.4)*p.yz;
147    d=min(d,-smin(p.y,-(length(p*vec3(1.6,1,1))-.73),.2));
148    p=op;
149    return d;
150}
151
152float sceneDist(vec3 p)
153{
154    vec3 op=p;
155    float d=shoesDist(p);
156
157    d=min(d,p.y);
158    p.y-=1.5;
159
160    // torso
161    d=min(d,length(p)-1.);
162
163
164    // left arm
165    op=p;
166    p-=vec3(.66,.7,0);
167    p.xz=rotmat(-0.1)*p.xz;
168    d=smin(d,(length(p*vec3(1.8,1,1))-.58),.07);
169    p=op;
170
171    // right arm
172    op=p;
173    p-=vec3(-.75,0.2,0);
174    d=smin(d,(length(p*vec3(1,1.5,1))-.54),.03);
175    p=op;
176
177    // mouth
178    p.y-=.11;
179    float md=smax(p.z+.84,smax(smax(p.x-.2,p.y-.075,.2),dot(p,vec3(.7071,-.7071,0))-.1,.08),.04);
180    p.x=-p.x;
181    md=smax(md,smax(p.z+.84,smax(smax(p.x-.2,p.y-.075,.2),dot(p,vec3(.7071,-.7071,0))-.1,.08),.01),.13);
182    d=smax(d,-md,.012);
183
184    // tongue
185    p=op;
186    d=smin(d,length((p-vec3(0,.03,-.75))*vec3(1,1,1))-.16,.01);
187
188    return min(d,10.);
189}
190
191
192
193vec3 sceneNorm(vec3 p)
194{
195    vec3 e=vec3(1e-3,0,0);
196    float d = sceneDist(p);
197    return normalize(vec3(sceneDist(p + e.xyy) - sceneDist(p - e.xyy), sceneDist(p + e.yxy) - sceneDist(p - e.yxy),
198                          sceneDist(p + e.yyx) - sceneDist(p - e.yyx)));
199}
200
201
202// from simon green and others
203float ambientOcclusion(vec3 p, vec3 n)
204{
205    const int steps = 4;
206    const float delta = 0.15;
207
208    float a = 0.0;
209    float weight = 4.;
210    for(int i=1; i<=steps; i++) {
211        float d = (float(i) / float(steps)) * delta;
212        a += weight*(d - sceneDist(p + n*d));
213        weight *= 0.5;
214    }
215    return clamp(1.0 - a, 0.0, 1.0);
216}
217
218// a re-shaped cosine, to make the peaks more pointy
219float cos2(float x){return cos(x-sin(x)/3.);}
220
221float starShape(vec2 p)
222{
223    float a=atan(p.y,p.x)+iGlobalTime/3.;
224    float l=pow(length(p),.8);
225    float star=1.-smoothstep(0.,(3.-cos2(a*5.*2.))*.02,l-.5+cos2(a*5.)*.1);
226    return star;
227}
228
229
230void mainImage( out vec4 fragColor, in vec2 fragCoord )
231{
232    // Normalized pixel coordinates (from 0 to 1)
233    vec2 uv = fragCoord/iResolution.xy;
234
235    float an=cos(iGlobalTime)*.1;
236
237    vec2 ot=uv*2.-1.;
238    ot.y*=iResolution.y/iResolution.x;
239    vec3 ro=vec3(0.,1.4,4.);
240    vec3 rd=normalize(vec3(ot.xy,-1.3));
241
242    rd.xz=mat2(cos(an),sin(an),sin(an),-cos(an))*rd.xz;
243    ro.xz=mat2(cos(an),sin(an),sin(an),-cos(an))*ro.xz;
244
245    float s=20.;
246
247    // primary ray
248    float t=0.,d=0.;
249    for(int i=0;i<80;++i)
250    {
251        d=sceneDist(ro+rd*t);
252        if(d<1e-4)
253            break;
254        if(t>10.)
255            break;
256        t+=d*.9;
257    }
258
259    t=min(t,10.0);
260
261    // shadow ray
262    vec3 rp=ro+rd*t;
263    vec3 n=sceneNorm(rp);
264    float st=5e-3;
265    vec3 ld=normalize(vec3(2,4,-4));
266    for(int i=0;i<20;++i)
267    {
268        d=sceneDist(rp+ld*st);
269        if(d<1e-5)
270            break;
271        if(st>5.)
272            break;
273        st+=d*2.;
274    }
275
276    // ambient occlusion and shadowing
277    vec3 ao=vec3(ambientOcclusion(rp, n));
278    float shad=mix(.85,1.,step(5.,st));
279
280    ao*=mix(.3,1.,.5+.5*n.y);
281
282    // soft floor shadow
283    if(rp.y<1e-3)
284        ao*=mix(mix(vec3(1,.5,.7),vec3(1),.4)*.6,vec3(1),smoothstep(0.,1.6,length(rp.xz)));
285
286
287
288    vec3 diff=vec3(1);
289    vec3 emit=vec3(0);
290
291    // skin
292    diff*=vec3(1.15,.3,.41)*1.4;
293    diff+=.4*mix(1.,0.,smoothstep(0.,1.,length(rp.xy-vec2(0.,1.9))));
294    diff+=.5*mix(1.,0.,smoothstep(0.,.5,length(rp.xy-vec2(.7,2.5))));
295    diff+=.36*mix(1.,0.,smoothstep(0.,.5,length(rp.xy-vec2(-1.1,1.8))));
296
297    if(rp.y<1e-3)
298        diff=vec3(.6,1,.6);
299
300    // mouth
301    diff*=mix(vec3(1,.3,.2),vec3(1),smoothstep(.97,.99,length(rp-vec3(0,1.5,0))));
302
303    // shoes
304    diff=mix(vec3(1.,.05,.1),diff,smoothstep(0.,0.01,shoesDist(rp)));
305    diff+=.2*mix(1.,0.,smoothstep(0.,.2,length(rp.xy-vec2(-0.5,1.4))));
306    diff+=.12*mix(1.,0.,smoothstep(0.,.25,length(rp.xy-vec2(0.57,.3))));
307
308    // bounce light from the floor
309    diff+=vec3(.25,1.,.25)*smoothstep(-.3,1.7,-rp.y+1.)*max(0.,-n.y)*.7;
310
311    vec3 orp=rp;
312    rp.y-=1.5;
313    rp.x=abs(rp.x);
314
315    // blushes
316    diff*=mix(vec3(1,.5,.5),vec3(1),smoothstep(.1,.15,length((rp.xy-vec2(.4,.2))*vec2(1,1.65))));
317
318    rp.xy-=vec2(.16,.45);
319    rp.xy*=.9;
320    orp=rp;
321    rp.y=pow(abs(rp.y),1.4)*sign(rp.y);
322
323    // eye outline
324    diff*=smoothstep(.058,.067,length((rp.xy)*vec2(.9,.52)));
325
326    rp=orp;
327    rp.y+=.08;
328    rp.y-=pow(abs(rp.x),2.)*16.;
329
330    // eye reflections
331    emit+=vec3(.1,.5,1.)*(1.-smoothstep(.03,.036,length((rp.xy)*vec2(.7,.3))))*max(0.,-rp.y)*10.;
332
333    rp=orp;
334    rp.y-=.12;
335
336    // eye highlights
337    emit+=vec3(1)*(1.-smoothstep(.03,.04,length((rp.xy)*vec2(1.,.48))));
338
339    // fresnel
340    diff+=pow(clamp(1.-dot(-rd,n),0.,.9),4.)*.5;
341
342    // background and floor fade
343    vec3 backg=vec3(1.15,.3,.41)*.9;
344    ot.x+=.6+iGlobalTime/50.;
345    ot.y+=cos(floor(ot.x*2.)*3.)*.1+.2;
346    ot.x=mod(ot.x,.5)-.25;
347    backg=mix(backg,vec3(1.,1.,.5),.1*starShape((ot-vec2(0.,.6))*8.)*smoothstep(9.,10.,t));
348    diff=mix(diff,backg,smoothstep(.9,10.,t));
349
350    fragColor.rgb=mix(vec3(.15,0,0),vec3(1),ao)*shad*diff*1.1;
351    fragColor.rgb+=emit;
352    fragColor.a = 1.0f;
353
354    fragColor.rgb=pow(fragColor.rgb,vec3(1./2.4));
355}
356
357 void main(void)
358{
359  //just some shit to wrap shadertoy's stuff
360  vec2 FragCoord = vTexCoord.xy*OutputSize.xy;
361  mainImage(FragColor,FragCoord);
362}
363#endif
364