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);
}