Skip to content

Instantly share code, notes, and snippets.

@mrange
Created July 19, 2019 10:08
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mrange/6cc4e5a035edef081637af0f08dda747 to your computer and use it in GitHub Desktop.
Save mrange/6cc4e5a035edef081637af0f08dda747 to your computer and use it in GitHub Desktop.
weird
#version 150
uniform float time;
uniform vec2 resolution;
uniform vec2 mouse;
uniform vec3 spectrum;
uniform sampler2D texture0;
uniform sampler2D texture1;
uniform sampler2D texture2;
uniform sampler2D texture3;
uniform sampler2D prevFrame;
uniform sampler2D prevPass;
in VertexData
{
vec4 v_position;
vec3 v_normal;
vec2 v_texcoord;
} inData;
out vec4 fragColor;
float softBox(vec2 p, float sz)
{
p *= p;
p *= p;
float l8 = dot(p, p);
return pow(l8, 1.0/8.) - sz;
}
float sphere(vec2 p, float sz)
{
return length(p) - sz;
}
float plane(vec2 p, vec2 n, float m)
{
return dot(p, n) + m;
}
void rot(inout vec2 p, float a)
{
float c = cos(a);
float s = sin(a);
p = vec2(c*p.x + s*p.y, -s*p.x + c*p.y);
}
#define PI 3.141592654
#define TAU (2.0*PI)
#define PHI (.5*(1.+sqrt(5.)))
const vec2 n1 = normalize(vec2(-PHI+1.294, 1));
const vec2 n2 = normalize(vec2(1, -PHI));
void sphere_fold(inout vec2 z, inout float dz)
{
float fixed_radius2 = 1.9;
float min_radius2 = 0.1;
float r2 = dot(z, z);
if(r2 < min_radius2)
{
float temp = (fixed_radius2 / min_radius2);
z *= temp;
dz *= temp;
}
else if(r2 < fixed_radius2)
{
float temp = (fixed_radius2 / r2);
z *= temp;
dz *= temp;
}
}
vec2 sphereFold(vec2 p, vec2 c, float r)
{
vec2 d = p - c;
float l = length(d);
if (l > r)
{
p = c + (r - tanh((l - r)/r))*normalize(d);
}
return p;
}
vec2 sphereFoldq(vec2 p, vec2 c, float r)
{
vec2 d = p - c;
float l = length(d);
if (l < r)
{
p = c + (r + (r - l))*normalize(d);
}
return p;
}
float wheels(vec2 uv)
{
uv *= 2;
float t;
vec2 n1 = n1;
vec2 n2 = n2;
rot(n2, time);
t = dot(n2, uv)-1.5; if(t > 0) uv -= 2.0*t*n2;
t = dot(n1, uv)-0.0; if(t > 0) uv -= 2.0*t*n1;
uv = abs(uv);
t = dot(n1, uv); if(t > 0) uv -= 2.0*t*n1;
uv = abs(uv);
t = dot(n1, uv); if(t > 0) uv -= 2.0*t*n1;
//t = dot(n2, uv) - sqrt(0.04); if(t > 0) uv -= 2.0*t*n2;
//uv = -abs(uv);
float d = softBox(uv - vec2(1,0), 0.25);
d = min(d,plane(uv, normalize(vec2(1, 0.0)), -0.5));
float dd = plane(uv, normalize(vec2(1, 0.0)), -1.4);
dd = max(-dd, plane(uv, normalize(vec2(1, 0.0)), -1.5));
d = min(dd, d);
return d;
}
vec2 mod2(inout vec2 p, vec2 size) {
vec2 c = floor((p + size*0.5)/size);
p = mod(p + size*0.5,size) - size*0.5;
return c;
}
float test(vec2 uv)
{
uv *= 3.0;
float sz = 1.0;
float d = 1000.0;
for(int i = 0; i < 8; ++i)
{
uv = abs(uv);
float t;
vec2 n1 = n1;
vec2 n2 = n2;
rot(n1, 0.05*sin(sqrt(2)*time));
rot(n2, 0.05*sin(time));
t = dot(n1, uv); if(t > 0) uv -= 2.0*t*n1;
t = dot(n2, uv); if(t > 0) uv -= 2.0*t*n2;
uv -= vec2(0.9)*sz;
sz *= 0.8;
d = min(d, sphere(uv, 1.3));
d = min(d, -plane(uv, n2, 1));
}
return d+1.2;
}
void main(void)
{
vec2 uv = -1. + 2. * inData.v_texcoord;
uv.x *= resolution.x/resolution.y;
float d = test(uv);
float p = mod(d, 0.1);
vec3 col = abs(p) < 0.01 ? vec3(0.25, 0.5, exp(-15*d*d)) : vec3(0);
if (d < 0) col.xz = col.zx;
col = abs(d) < 0.02 ? vec3(1) : col;
fragColor = vec4(col, 1);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment