scene.org File Archive

File download

<root>­/­parties­/­2015­/­tokyodemofest15­/­glsl_graphics/mandelbrot.zip

File size:
3 424 bytes (3.34K)
File date:
2015-02-28 12:03:19
Download count:
all-time: 74

Preview

  • mandelbrot/ dir
  • mandelbrot/mandelbrot.txt 2.40K

file_id.diz

#ifdef GL_ES
precision mediump float;
#endif

uniform float time;
uniform vec2 resolution;

const int ITER = 300;
const float CHOP = 10.;
const vec2 CENTER = vec2(0., -0.65);
const float bpm = 130.;
const float loop = 60. / bpm * 16.;

float diverge(vec2 c)
{
	vec2 z = vec2(0., 0.);

	for (int i = 0; i < ITER; ++i) {
		z = vec2(z.x * z.x - z.y * z.y, 2. * z.x * z.y) + c;
		if (length(z) > 2.) {
			return float(i);
		}
	}
	return -1.;
}

vec3 color(float count, vec2 pos)
{
	float k = 10.;
	if (count < 0.) {
		if (mod(time, loop) <= loop / 2.) {
			return vec3(0., 0., 0.);
		} else {
			if (mod(floor(k * pos.x) + floor(k * pos.y), 2.) > 0.5) {
				return vec3(1., 0., 0.);
			} else {
				return vec3(1., 1., 1.);
			}
		}
	}
	return vec3(1., mod(count, CHOP) / CHOP, 0.);
}

float delta()
{
	float spb = 60. / bpm;
	float rate = 0.25;
	float beat_pos = mod(time, spb) / spb;
	if (0. <= beat_pos && beat_pos <= rate) {
		return 1. + (1. - beat_pos / rate) * 0.2;
	} else {
		return 1. + (beat_pos - rate) / (1. - rate) * 0.2;
	}
}

float flash()
{
	float spb = 60. / bpm;
	return mod(time, spb) / spb * 0.5 + 0.5;
}

vec2 rotate(vec2 src)
{
	float k = 1.;
	src -= CENTER;
	vec2 result = vec2(src.x * sin(k * time) + src.y * cos(k * time), src.x * cos(k * time) - src.y * sin(k * time));
	result += CENTER;
	return result;
}

bool rect(float sx, float sy, float w, float h, vec2 p)
{
	return sx <= p.x && p.x <= sx + w && sy <= p.y && p.y <= sy + h;
}

bool f(vec2 p)
{
	return rect(0., -0.15, 0.02, 0.15, p) || rect(0., 0., 0.12, 0.02, p) || rect(0., -0.06, 0.10, 0.02, p);
}

bool t(vec2 p)
{
	return rect(0.01, 0., 0.13, 0.02, p) || rect(0.065, -0.15, 0.02, 0.15, p);
}

bool d(vec2 p)
{
	float l = length(p - vec2(0, -0.065));
	return (p.x >= 0. && 0.065 <= l && l <= 0.085) || rect(0., -0.15, 0.02, 0.17, p);
}

bool str(vec2 p)
{
	return t(p-vec2(-0.30, 0.05)) || d(p-vec2(-0.12, 0.05)) || f(p-vec2(0., 0.05));
}

void main(void)
{
	float scale = 1. * (pow(1. - abs((mod(time, loop) / loop - 0.5) * 2.), 1.0) * delta());
	vec2 pos = vec2(-1., 1.) * ((gl_FragCoord.xy / resolution.xy) * 2. - 1.) * resolution / resolution.y * scale + CENTER;
	vec2 rotated = rotate(pos);

	vec3 base_color = color(diverge(rotated), rotated);
	float flash_rate = flash();
	if (mod(time, loop) <= loop / 2. && str(rotated)) {
		gl_FragColor = vec4(1., 1., 1., 1.);
	} else {
		gl_FragColor = vec4(base_color * flash_rate + vec3(1.) * (1. - flash_rate), 1.);
	}
}