isf 0.1.0

Parsing, Deserialization and Serialization of the Interactive Shader Format.
Documentation
/*{
    "CATEGORIES": [
        "Feedback",
        "Glitch"
    ],
    "CREDIT": "by VIDVOX",
    "DESCRIPTION": "Does a fast faked data-mosh style",
    "INPUTS": [
        {
            "NAME": "inputImage",
            "TYPE": "image"
        },
        {
            "DEFAULT": 1,
            "NAME": "update_keyframe",
            "TYPE": "bool"
        },
        {
            "DEFAULT": 0.95,
            "MAX": 1,
            "MIN": 0.01,
            "NAME": "update_rate",
            "TYPE": "float"
        },
        {
            "DEFAULT": 1,
            "MAX": 10,
            "MIN": 0,
            "NAME": "sharpen",
            "TYPE": "float"
        },
        {
            "DEFAULT": 0.25,
            "MAX": 2,
            "MIN": 0,
            "NAME": "blur",
            "TYPE": "float"
        },
        {
            "DEFAULT": 0.25,
            "MAX": 1,
            "MIN": 0,
            "NAME": "posterize",
            "TYPE": "float"
        },
        {
            "DEFAULT": 0,
            "LABELS": [
                "relative",
                "absolute",
                "difference"
            ],
            "NAME": "mode",
            "TYPE": "long",
            "VALUES": [
                0,
                1,
                2
            ]
        }
    ],
    "ISFVSN": "2",
    "PASSES": [
        {
            "HEIGHT": "$HEIGHT/16.0",
            "PERSISTENT": true,
            "TARGET": "keyFrameBuffer1",
            "WIDTH": "$WIDTH/16.0"
        },
        {
            "HEIGHT": "$HEIGHT",
            "PERSISTENT": true,
            "TARGET": "keyFrameBuffer2",
            "WIDTH": "$WIDTH"
        }
    ]
}
*/

#if __VERSION__ <= 120
varying vec2 left_coord;
varying vec2 right_coord;
varying vec2 above_coord;
varying vec2 below_coord;

varying vec2 lefta_coord;
varying vec2 righta_coord;
varying vec2 leftb_coord;
varying vec2 rightb_coord;
#else
in vec2 left_coord;
in vec2 right_coord;
in vec2 above_coord;
in vec2 below_coord;

in vec2 lefta_coord;
in vec2 righta_coord;
in vec2 leftb_coord;
in vec2 rightb_coord;
#endif

void main()
{

	//	first pass: read the "inputImage"- remember, we're drawing to the persistent buffer "keyFrameBuffer1" on the first pass
	//	store it if we're taking in a new keyframe
	if (PASSINDEX == 0)	{
		vec4		stalePixel = IMG_THIS_NORM_PIXEL(keyFrameBuffer1);		
		vec4		freshPixel = IMG_THIS_NORM_PIXEL(inputImage);
		if (update_keyframe==true)	{
			gl_FragColor = freshPixel;
		}
		else	{
			gl_FragColor = stalePixel;
		}
	}
	//	second pass: read from "bufferVariableNameA".  output looks chunky and low-res.
	else if (PASSINDEX == 1)	{
		vec4		stalePixel1 = IMG_THIS_NORM_PIXEL(keyFrameBuffer1);
		vec4		stalePixel2 = IMG_THIS_NORM_PIXEL(keyFrameBuffer2);
		vec4 color = IMG_THIS_NORM_PIXEL(inputImage);
		vec4 colorL = IMG_NORM_PIXEL(inputImage, left_coord);
		vec4 colorR = IMG_NORM_PIXEL(inputImage, right_coord);
		vec4 colorA = IMG_NORM_PIXEL(inputImage, above_coord);
		vec4 colorB = IMG_NORM_PIXEL(inputImage, below_coord);

		vec4 colorLA = IMG_NORM_PIXEL(inputImage, lefta_coord);
		vec4 colorRA = IMG_NORM_PIXEL(inputImage, righta_coord);
		vec4 colorLB = IMG_NORM_PIXEL(inputImage, leftb_coord);
		vec4 colorRB = IMG_NORM_PIXEL(inputImage, rightb_coord);

		vec4 final = color;
		vec4 diff = (color - stalePixel2);
		if (blur > 0.0)	{
			float blurAmount = blur / 8.0;
			diff = diff * (1.0 - blur) + (colorL + colorR + colorA + colorB + colorLA + colorRA + colorLB + colorRB) * blurAmount;
		}
		
		if (mode == 0)	{
			final = mix(stalePixel2,(diff + stalePixel1),update_rate);
		}
		else if (mode == 1)	{
			final = mix(stalePixel2,abs(diff) + stalePixel1,update_rate);
		}
		else if (mode == 2)	{
			final = mix(stalePixel2,abs(diff + stalePixel2) * stalePixel1,update_rate);
		}
		
		if (posterize > 0.0)	{
			float qLevel = 128.0 - posterize * 126.0;
			final = floor(final*qLevel)/qLevel;
		}
		
		if (sharpen > 0.0)	{
			final = final + sharpen * (8.0*color - colorL - colorR - colorA - colorB - colorLA - colorRA - colorLB - colorRB);
		}
		
		gl_FragColor = final;
	}
}