/*{ "CATEGORIES": [ "Masking", "Geometry Adjustment" ], "CREDIT": "", "DESCRIPTION": "", "INPUTS": [ { "NAME": "inputImage", "TYPE": "image" }, { "DEFAULT": [ 0, 0 ], "LABEL": "Bottom left", "MAX": [ 1, 1 ], "MIN": [ 0, 0 ], "NAME": "pt1", "TYPE": "point2D" }, { "DEFAULT": [ 1, 0 ], "LABEL": "Top left", "MAX": [ 1, 1 ], "MIN": [ 0, 0 ], "NAME": "pt2", "TYPE": "point2D" }, { "DEFAULT": [ 1, 1 ], "LABEL": "Top right", "MAX": [ 1, 1 ], "MIN": [ 0, 0 ], "NAME": "pt3", "TYPE": "point2D" }, { "DEFAULT": [ 0, 1 ], "LABEL": "Bottom right", "MAX": [ 1, 1 ], "MIN": [ 0, 0 ], "NAME": "pt4", "TYPE": "point2D" }, { "DEFAULT": 0, "LABEL": "Invert Mask", "NAME": "invertMask", "TYPE": "bool" }, { "DEFAULT": 0, "LABEL": "Apply Mask", "LABELS": [ "Apply Mask", "Set Alpha", "Show Mask" ], "NAME": "maskApplyMode", "TYPE": "long", "VALUES": [ 0, 1, 2 ] } ], "ISFVSN": "2" } */ 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)); } void main() { vec4 inputPixelColor = IMG_THIS_PIXEL(inputImage); vec2 loc = isf_FragNormCoord; bool drawPixel = false; if ((PointInTriangle(loc,pt1,pt2,pt3))||(PointInTriangle(loc,pt1,pt4,pt3))) { drawPixel = true; } if (invertMask) drawPixel = !drawPixel; if (maskApplyMode == 0) { inputPixelColor = (drawPixel) ? inputPixelColor : vec4(0.0); } // in this mode only the alpha is changed; the rgb remains intact and may still be visible if another filter adjusts the alpha again else if (maskApplyMode == 1) { inputPixelColor.a = (drawPixel) ? inputPixelColor.a : 0.0; } else if (maskApplyMode == 2) { inputPixelColor = (drawPixel) ? vec4(1.0) : vec4(0.0); } gl_FragColor = inputPixelColor; }