ISF - Distortion - Multi-Pixellate


/*{
	"CATEGORIES": [
		"Stylize"
	],
	"ISFVSN": "2",
	"INPUTS": [
		{
			"NAME": "inputImage",
			"TYPE": "image"
		},
		{
			"NAME": "cell_size",
			"TYPE": "float",
			"MAX": 0.5,
			"DEFAULT": 0.125,
			"MIN": 0.001
		},
		{
			"NAME": "min_cell_size",
			"TYPE": "float",
			"MAX": 0.5,
			"DEFAULT": 0.05000000074505806,
			"MIN": 0.001
		},
		{
			"NAME": "rSeed",
			"TYPE": "float",
			"MAX": 1,
			"DEFAULT": 0.25,
			"MIN": 0
		},
		{
			"VALUES": [
				0,
				1
			],
			"NAME": "shape",
			"TYPE": "long",
			"DEFAULT": 0,
			"LABELS": [
				"Square",
				"Rectangle"
			]
		},
		{
			"VALUES": [
				0,
				2,
				3,
				5
			],
			"NAME": "round_to_divisions",
			"TYPE": "long",
			"DEFAULT": 2,
			"LABELS": [
				"Off",
				"2",
				"3",
				"5"
			]
		}
	],
	"CREDIT": "VIDVOX"
}
*/

#ifndef GL_ES
float distance (vec2 center, vec2 pt)
{
float tmp = pow(center.x-pt.x,2.0)+pow(center.y-pt.y,2.0);
	return pow(tmp,0.5);
}
#endif

float rand(vec2 co){
    return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);
}

void main()
{
// CALCULATE EDGES OF CURRENT CELL
	//	At 0.0 just do a pass-thru
	if (cell_size == 0.0)	{
		gl_FragColor = IMG_THIS_PIXEL(inputImage);
	}
		else	{
		// Position of current pixel
		vec2 xy;
		xy.x = (isf_FragNormCoord.xy)[0];
		xy.y = (isf_FragNormCoord.xy)[1];


		// Left and right of tile
		float max_cell_size = cell_size + min_cell_size;
		float CellWidth = max_cell_size;
		float CellHeight = max_cell_size;
		if (shape==0)	{
			CellHeight = max_cell_size * RENDERSIZE.x / RENDERSIZE.y;
		}

		float x1 = floor(xy.x / CellWidth)*CellWidth;
		// Top and bottom of tile
		float y1 = floor(xy.y / CellHeight)*CellHeight;

		float newCellSize = max_cell_size;

		if (round_to_divisions > 0)	{
			float maxCount = (min_cell_size > 0.0) ? max_cell_size / min_cell_size : 10.0;
			float val = floor(1.0+(maxCount-1.0)*rand(0.1+rSeed+vec2(x1,y1)));
			newCellSize = newCellSize / pow(float(round_to_divisions),val);
		}
		else	{
			newCellSize = min_cell_size + (cell_size - min_cell_size) * rand(0.1+rSeed+vec2(x1,y1));
		}

		CellWidth = newCellSize;
		CellHeight = newCellSize;
		if (shape==0)	{
			CellHeight = newCellSize * RENDERSIZE.x / RENDERSIZE.y;
		}

		x1 = floor(xy.x / CellWidth)*CellWidth;
		float x2 = clamp((ceil(xy.x / CellWidth)*CellWidth), 0.0, 1.0);
		// Top and bottom of tile
		y1 = floor(xy.y / CellHeight)*CellHeight;
		float y2 = clamp((ceil(xy.y / CellHeight)*CellHeight), 0.0, 1.0);

		// GET AVERAGE CELL COLOUR
		// Average left and right pixels
		vec4 avgX = (IMG_NORM_PIXEL(inputImage, vec2(x1, y1))+(IMG_NORM_PIXEL(inputImage, vec2(x2, y1)))) / 2.0;
		// Average top and bottom pixels
		vec4 avgY = (IMG_NORM_PIXEL(inputImage, vec2(x1, y1))+(IMG_NORM_PIXEL(inputImage, vec2(x1, y2)))) / 2.0;
		// Centre pixel
		vec4 avgC = IMG_NORM_PIXEL(inputImage, vec2(x1+(CellWidth/2.0), y2+(CellHeight/2.0)));	// Average the averages + centre
		vec4 avgClr = (avgX+avgY+avgC) / 3.0;

		gl_FragColor = vec4(avgClr);
	}
}