ISF - Tile - Kaleidoscope Tile


/*{
	"CATEGORIES": [
		"Tile Effect"
	],
	"CREDIT": "VIDVOX",
	"DESCRIPTION": null,
	"INPUTS": [
		{
			"NAME": "inputImage",
			"TYPE": "image"
		},
		{
			"DEFAULT": 0.5,
			"MAX": 2,
			"MIN": 0,
			"NAME": "size",
			"TYPE": "float"
		},
		{
			"DEFAULT": 6,
			"MAX": 32,
			"MIN": 1,
			"NAME": "sides",
			"TYPE": "float"
		},
		{
			"DEFAULT": 0.125,
			"MAX": 1,
			"MIN": 0,
			"NAME": "rotation",
			"TYPE": "float"
		},
		{
			"DEFAULT": 0,
			"MAX": 1,
			"MIN": 0,
			"NAME": "angle",
			"TYPE": "float"
		},
		{
			"DEFAULT": [
				0,
				0
			],
			"MAX": [
				1,
				1
			],
			"MIN": [
				0,
				0
			],
			"NAME": "slide1",
			"TYPE": "point2D"
		},
		{
			"DEFAULT": [
				0,
				0
			],
			"MAX": [
				1,
				1
			],
			"MIN": [
				0,
				0
			],
			"NAME": "slide2",
			"TYPE": "point2D"
		},
		{
			"DEFAULT": [
				0,
				0
			],
			"MAX": [
				1,
				1
			],
			"MIN": [
				0,
				0
			],
			"NAME": "shift",
			"TYPE": "point2D"
		}
	],
	"ISFVSN": "2",
	"VSN": null
}
*/


const float tau = 6.28318530718;


vec2 pattern() {
float s = sin(tau * rotation);
	float c = cos(tau * rotation);
	vec2 tex = (isf_FragNormCoord.xy) * RENDERSIZE;
	float scale = 1.0 / max(size,0.001);
	vec2 point = vec2( c * tex.x - s * tex.y, s * tex.x + c * tex.y ) * scale;
	point = (point - (shift*RENDERSIZE)) / RENDERSIZE;
	//	do this to repeat
	point = mod(point,1.0);
	if (point.x < 0.5)	{
		point.y = mod(point.y + slide1.y, 1.0);
	}
	else	{
		point.y = mod(point.y + slide2.y, 1.0);
	}
	if (point.y < 0.5)	{
		point.x = mod(point.x + slide1.x, 1.0);
	}
	else	{
		point.x = mod(point.x + slide2.x, 1.0);
	}
	//	do this for relections
	point = 1.0-abs(1.0-2.0*point);

	//	Now let's do a squish based on angle
	//	convert to polar coordinates
	vec2 center = vec2(0.5,0.5);
	float r = distance(center, point);
	float a = atan ((point.y-center.y),(point.x-center.x));

	// now do the kaleidoscope
	a = mod(a, tau/sides);
	a = abs(a - tau/sides/2.);

	s = sin(a + tau * angle);
	c = cos(a + tau * angle);

	float zoom = RENDERSIZE.x / RENDERSIZE.y;

	point.x = (r * c)/zoom + 0.5;
	point.y = (r * s)/zoom + 0.5;

	return point;
}


void main() {

	vec2 pat = pattern();

	gl_FragColor = IMG_NORM_PIXEL(inputImage,pat);
}