/*{ "CREDIT": "by VIDVOX", "CATEGORIES": [ "Stylize", "Glitch" ], "INPUTS": [ { "NAME": "inputImage", "TYPE": "image" }, { "NAME": "randomSeed", "LABEL": "Random Seed", "TYPE": "float", "MIN": 0.01, "MAX": 1.0, "DEFAULT": 0.239 }, { "NAME": "sizeSpread", "LABEL": "Poly Size", "TYPE": "float", "MIN": 0.0, "MAX": 0.25, "DEFAULT": 0.025 }, { "NAME": "sizeGain", "LABEL": "Size Gain", "TYPE": "float", "MIN": 1.0, "MAX": 2.0, "DEFAULT": 1.0 }, { "NAME": "sampleMode", "LABEL": "Sample Mode", "VALUES": [ 0, 1 ], "LABELS": [ "Single", "Double" ], "DEFAULT": 0, "TYPE": "long" } ] }*/ const float MaxPointCount = 5.0; float divisions = 1.0 / sizeSpread; float rand(vec2 co){ return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453); } float sign(vec2 p1, vec2 p2, vec2 p3) { return (p1.x - p3.x) * (p2.y - p3.y) - (p2.x - p3.x) * (p1.y - p3.y); } bool PointInTriangle(vec2 pt, vec2 v1, vec2 v2, vec2 v3) { bool b1, b2, b3; b1 = sign(pt, v1, v2) < 0.0; b2 = sign(pt, v2, v3) < 0.0; b3 = sign(pt, v3, v1) < 0.0; return ((b1 == b2) && (b2 == b3)); } vec2 AvgPointForTriangle(vec2 p1, vec2 p2, vec2 p3) { return (p1 + p2 + p3) / 3.0; } float AreaOfTriangle(vec2 p1, vec2 p2, vec2 p3) { return abs(p1.x*(p2.y-p3.y)+p2.x*(p3.y-p1.y)+p3.x*(p1.y-p2.y))/2.0; } vec4 ColorForPtIndex(vec2 index1, vec2 index2, float sizeAmount, float theSeed, vec2 pt) { vec4 returnMe = vec4(0.0); vec2 pt1, pt2, pt3; vec2 offset1 = (index1 + divisions / 2.0) * sizeAmount + sizeAmount / 2.0; vec2 offset2 = (index2 + divisions / 2.0) * sizeAmount + sizeAmount / 2.0; float adjustedSizeAmount = sizeAmount * sizeGain; vec2 inPoint = pt + vec2(0.5); pt1 = vec2(rand(vec2(theSeed+index1.x,2.187*theSeed+index1.x)),rand(vec2(theSeed+index1.y,0.823*theSeed+index1.y))); pt2 = pt1 + vec2(rand(vec2(theSeed+index1.x,5.326*theSeed+index1.x)),rand(vec2(theSeed+index1.y,1.421*theSeed+index1.y))); pt3 = pt1 - vec2(rand(vec2(theSeed+index2.x,1.935*theSeed+index2.x)),rand(vec2(theSeed+index2.y,3.177*theSeed+index2.y))); float area = AreaOfTriangle(pt1,pt2,pt3); if (area < 0.5) { pt1 = 1.0 - pt1; adjustedSizeAmount = adjustedSizeAmount * (2.5-area); } else if (area > 0.5) { //pt3 = 1.0-pt3; } pt1 = clamp(pt1 * adjustedSizeAmount + offset1 - adjustedSizeAmount / 2.0,0.0,1.0); pt2 = clamp(pt2 * adjustedSizeAmount + offset1 - adjustedSizeAmount / 2.0,0.0,1.0); pt3 = clamp(pt3 * adjustedSizeAmount + offset2 - adjustedSizeAmount / 2.0,0.0,1.0); if(PointInTriangle(inPoint,pt1,pt2,pt3)) { vec2 avgPt = AvgPointForTriangle(pt1,pt2,pt3); returnMe = IMG_NORM_PIXEL(inputImage,avgPt); if (sampleMode==1) { returnMe.a = 0.5; returnMe.rgb = returnMe.rgb * returnMe.a; } else { returnMe.a = 1.0; } } return returnMe; } void main() { vec4 result = vec4(0.0); vec2 thisPoint = vv_FragNormCoord - vec2(0.5); float inSpread = sizeSpread; vec2 ptIndex = floor(thisPoint / inSpread); vec4 original = IMG_THIS_NORM_PIXEL(inputImage); float pointCount = MaxPointCount + float(sampleMode); if (sizeSpread > 0.0) { inSpread = sizeSpread * 1.0; for (float i=0.0;i0.667) break; float tmpSpread = inSpread; if (result.a<=0.75) result += ColorForPtIndex(ptIndex,ptIndex+vec2(1.0,0.0),tmpSpread,i+randomSeed,thisPoint); if (result.a<=0.75) result += ColorForPtIndex(ptIndex,ptIndex+vec2(-1.0,0.0),tmpSpread,i+randomSeed,thisPoint); if (result.a<=0.75) result += ColorForPtIndex(ptIndex,ptIndex+vec2(0.0,1.0),tmpSpread,i+randomSeed,thisPoint); if (result.a<=0.75) result += ColorForPtIndex(ptIndex,ptIndex+vec2(0.0,-1.0),tmpSpread,i+randomSeed,thisPoint); if (result.a<=0.75) result += ColorForPtIndex(ptIndex+vec2(-1.0,0.0),ptIndex,tmpSpread,i+randomSeed,thisPoint); if (result.a<=0.75) result += ColorForPtIndex(ptIndex+vec2(0.0,1.0),ptIndex,tmpSpread,i+randomSeed,thisPoint); if (result.a<=0.75) result += ColorForPtIndex(ptIndex+vec2(0.0,-1.0),ptIndex,tmpSpread,i+randomSeed,thisPoint); if (result.a<=0.75) result += ColorForPtIndex(ptIndex+vec2(1.0,0.0),ptIndex,tmpSpread,i+randomSeed,thisPoint); } if (result.a<1.0) result += (2.0 - result.a) * ColorForPtIndex(ptIndex,ptIndex,inSpread,randomSeed,thisPoint); if (sampleMode==0) result.a = original.a; } else { result = original; } gl_FragColor = result; }