/*{ "CREDIT": "by VIDVOX", "ISFVSN": "2", "CATEGORIES": [ "Stylize" ], "INPUTS": [ { "NAME": "inputImage", "TYPE": "image" }, { "NAME": "cell_size", "TYPE": "float", "MIN": 0.001, "MAX": 0.5, "DEFAULT": 0.125 }, { "NAME": "style", "VALUES": [ 0, 1 ], "LABELS": [ "Squared", "Diamond" ], "DEFAULT": 0, "TYPE": "long" } ] }*/ #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 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[0]; xy.y = isf_FragNormCoord[1]; // Left and right of tile float CellWidth = cell_size; float CellHeight = cell_size; CellHeight = cell_size * RENDERSIZE.x / RENDERSIZE.y; float x1 = floor(xy.x / CellWidth)*CellWidth; float x2 = clamp((ceil(xy.x / CellWidth)*CellWidth), 0.0, 1.0); // Top and bottom of tile float y1 = floor(xy.y / CellHeight)*CellHeight; float y2 = clamp((ceil(xy.y / CellHeight)*CellHeight), 0.0, 1.0); // get the normalized local coords in the cell float x = (xy.x-x1) / CellWidth; float y = (xy.y-y1) / CellHeight; vec4 avgClr = vec4(0.0); // style 0, two right triangles making a square if (style == 0) { // if above the center line... if (x < y) { // Average bottom left, top left, center and top right pixels vec4 avgL = (IMG_NORM_PIXEL(inputImage, vec2(x1, y1))+(IMG_NORM_PIXEL(inputImage, vec2(x1, y2)))) / 2.0; vec4 avgR = IMG_NORM_PIXEL(inputImage, vec2(x2, y2)); vec4 avgC = IMG_NORM_PIXEL(inputImage, vec2(x1+(CellWidth/2.0), y2+(CellHeight/2.0))); // Average the averages + centre avgClr = (avgL+avgR+avgC) / 3.0; } else { // Average bottom right, bottom left, center and top right pixels vec4 avgR = (IMG_NORM_PIXEL(inputImage, vec2(x2, y1))+(IMG_NORM_PIXEL(inputImage, vec2(x2, y2)))) / 2.0; vec4 avgL = IMG_NORM_PIXEL(inputImage, vec2(x1, y1)); vec4 avgC = IMG_NORM_PIXEL(inputImage, vec2(x1+(CellWidth/2.0), y2+(CellHeight/2.0))); // Average the averages + centre avgClr = (avgL+avgR+avgC) / 3.0; } } // style 1, four triangles making a square else { // if above the B2T center line and below the T2B center line... if ((x > y)&&(x < 1.0 - y)) { // Average bottom left, bottom right, center vec4 avgL = IMG_NORM_PIXEL(inputImage, vec2(x1, y1)); vec4 avgR = IMG_NORM_PIXEL(inputImage, vec2(x2, y1)); vec4 avgC = IMG_NORM_PIXEL(inputImage, vec2(x1+(CellWidth/2.0), y2+(CellHeight/2.0))); // Average the averages + centre avgClr = (avgL+avgR+avgC) / 3.0; } else if ((x < y)&&(x < 1.0 - y)) { // Average bottom left, top left, center vec4 avgL = IMG_NORM_PIXEL(inputImage, vec2(x1, y1)); vec4 avgR = IMG_NORM_PIXEL(inputImage, vec2(x1, y2)); vec4 avgC = IMG_NORM_PIXEL(inputImage, vec2(x1+(CellWidth/2.0), y2+(CellHeight/2.0))); // Average the averages + centre avgClr = (avgL+avgR+avgC) / 3.0; } else if ((x > 1.0 - y)&&(x < y)) { // Average top left, top right, center vec4 avgL = IMG_NORM_PIXEL(inputImage, vec2(x1, y2)); vec4 avgR = IMG_NORM_PIXEL(inputImage, vec2(x2, y2)); vec4 avgC = IMG_NORM_PIXEL(inputImage, vec2(x1+(CellWidth/2.0), y2+(CellHeight/2.0))); // Average the averages + centre avgClr = (avgL+avgR+avgC) / 3.0; //avgClr = vec4(0.0,1.0,0.0,1.0); } else { // Average top right, bottom right, center vec4 avgL = IMG_NORM_PIXEL(inputImage, vec2(x2, y1)); vec4 avgR = IMG_NORM_PIXEL(inputImage, vec2(x2, y2)); vec4 avgC = IMG_NORM_PIXEL(inputImage, vec2(x1+(CellWidth/2.0), y2+(CellHeight/2.0))); // Average the averages + centre avgClr = (avgL+avgR+avgC) / 3.0; //avgClr = vec4(0.0,0.0,1.0,1.0); } } gl_FragColor = avgClr; } }