// Hmm, svg perhaps? uniform sampler2D image; varying vec2 TexCoord0; vec4 strokeColour = vec4(1.0, 0.0, 1.0, 0.5); vec4 fillColour = vec4(1.0, 1.0, 1.0, 1.0); vec4 current = vec4(1.0, 1.0, 1.0, 0.0); float lineWidth = 0.01; uniform vec2 pee0, pee1, pee2; // a clipping rectangle. 2 positions follow #define CLIPRECT 1.0 // start a new path, value is length in segments. position follows #define STARTPATH 2.0 // set the line width, value is width #define LINEWIDTH 3.0 // set the line colour, colour value follows #define LINECOL 4.0 // a straight line segment #define SEGMENT_LINE 1.0 // a quadratic curve segment. relative end and #define SEGMENT_QUADRATIC 2.0 // an eliptical line segment #define SEGMENT_ELIPTIC 3.0 // colours in textures are 0-1 in r, g and b components // ieee floats hold 24 bits of data, so we'll just use the rgb part to hold a 24-bit int // then divide by its max value to get float col2float(const vec4 col) { float ret = 0; return ret; } //#define blend(c1, c2) ( vec4( (c1.rgb * (1.0-c2.a)) + (c2.rgb * c2.a)) + vec4(0.0, 0.0, 0.0, c1.a + c2.a)) vec4 blend(const vec4 c1, const vec4 c2) { vec4 ret; ret.rgb = c1.rgb*(1.0-c2.a) + (c2.rgb * c2.a); ret.a = c1.a + c2.a; return ret; } bool clipped(const vec2 low, const vec2 high, const vec2 point) { return (point.x > low.x && point.x < high.x) && (point.y > low.y && point.y < high.y); } float Line_OrientationOfPoint(const vec2 start, const vec2 end, const vec2 point) { return (end.x-start.x) *(point.y-start.y) - (point.x-start.x)*(end.y-start.y); } vec2 Line_ClosestPointTo(const vec2 start, const vec2 end, const vec2 point) { const vec2 c = point - start; vec2 v = end - start; const float d = length(v); v /= d; const float t = dot(v,c); vec2 r; if (t < 0.0) r = start; else if (t > d) r = end; else { v *= t; r = start + v; } return r; } /* cubic bezier curve t = 0 to 1.0 t1 = 1-t; // (1-t)^3*p0 + 3t(1-t)^2*p1 + 3t^2(1-t)p2 + t^3p3 res.x = t1*t1*t1*pos0.x + 3.0*t*t1*t1*pos1.x + 3.0*t*t*t1*off0.x + t*t*t*off1.x; res.y = t1*t1*t1*pos0.y + 3.0*t*t1*t1*pos1.y + 3.0*t*t*t1*off0.y + t*t*t*off1.y; // distance to quadratic */ float Line_Draw(const vec2 start, const vec2 end) { //bool clip = clipped( start - vec2(lineWidth), TexCoord0 + vec2(lineWidth), TexCoord0); float ret = Line_OrientationOfPoint(start, end, TexCoord0); //if (!clip) { vec2 v = Line_ClosestPointTo( start, end, TexCoord0 ); if ( distance(v, TexCoord0) < lineWidth) { ret = 0.0; current = blend(current, strokeColour); } } return ret; } uniform float bleh; void main (void) { vec4 col = texture2D(image, TexCoord0).rgba; if (col.a == 0.0) discard; vec4 result = vec4(1.0, 1.0, 1.0, 0.0); /* for (int n=0; n<30; ++n) { float v = Line_Draw( vec2( 0.0 + (n/30.0), 0.5 ), vec2( 0.2 + (n/30.0) , 0.2 )); } */ vec2 p0 = pee0; //vec2(0.2, 0.5); vec2 p1 = pee1;//vec2(0.5, 0.6); vec2 p2 = pee2; // vec2(0.5, 0.3); /* float d0 = distance(TexCoord0, p2); float d1 = d0 / distance(p0, p2); float d2 = d0 / distance(p1, p2); if (// abs(1.0 - (d1 + d2)) distance(mix(mix(p0, p2, d1), mix(p0, p1, d2), bleh), TexCoord0) < lineWidth ) current = vec4(1,1,1,1); */ /* for (int n=0; n<50; ++n) { float r0 = atan(abs((p0 - p2).x / (p0 - p2).y)); float r1 = atan((p1 - p2).x / (p1 - p2).y); float range = abs(max(r0, r1) - min(r0, r1)); float r2 = atan((TexCoord0 - p2).x / (TexCoord0 - p2).y); float pos = clamp(r2, r0, r1); if (pos < 1.0) current = vec4(pos,pos,1,1); } float d1 = dot( normalize(p2-p1), normalize(p2-p0)); float d2 = dot( normalize(p2-p1), normalize(p2-TexCoord0)); float range = d1; float pos = d2/d1; if (pos > 1.0) current = vec4(pos, 1, 1, 1); if (distance(TexCoord0, p1) < 0.01) current = vec4(1,0,0,1); if (distance(TexCoord0, p0) < 0.01) current = vec4(0,1,0,1); if (distance(TexCoord0, p2) < 0.03) current = vec4(0,0,1,1); // } */ gl_FragColor = blend(col,current); return; }