/*{ "CATEGORIES": [ "Utility" ], "CREDIT": "VIDVOX", "DESCRIPTION": "Shows the current time of day or time since the composition started", "INPUTS": [ { "DEFAULT": [ 1, 0.5899132640831176, 0, 1 ], "LABEL": "Color", "NAME": "colorInput", "TYPE": "color" }, { "DEFAULT": 0, "LABEL": "Clock Mode", "LABELS": [ "Time", "Countdown", "Counter" ], "NAME": "clockMode", "TYPE": "long", "VALUES": [ 0, 1, 2 ] }, { "DEFAULT": 0, "LABEL": "Y Offset", "MAX": 1, "MIN": -1, "NAME": "yOffset", "TYPE": "float" }, { "DEFAULT": 1, "LABEL": "Blink", "NAME": "blinkingColons", "TYPE": "bool" }, { "LABEL": "24 Hour", "NAME": "twentyFourHourStyle", "TYPE": "bool" } ], "ISFVSN": "2", "PASSES": [ { } ] } */ float segment(vec2 uv, bool On) { return (On) ? (1.0 - smoothstep(0.05,0.15,abs(uv.x))) * (1.-smoothstep(0.35,0.55,abs(uv.y)+abs(uv.x))) : 0.; } float digit(vec2 uv,int num) { float seg= 0.; seg += segment(uv.yx+vec2(-1., 0.),num!=-1 && num!=1 && num!=4 ); seg += segment(uv.xy+vec2(-.5,-.5),num!=-1 && num!=1 && num!=2 && num!=3 && num!=7); seg += segment(uv.xy+vec2( .5,-.5),num!=-1 && num!=5 && num!=6 ); seg += segment(uv.yx+vec2( 0., 0.),num!=-1 && num!=0 && num!=1 && num!=7 ); seg += segment(uv.xy+vec2(-.5, .5),num==0 || num==2 || num==6 || num==8 ); seg += segment(uv.xy+vec2( .5, .5),num!=-1 && num!=2 ); seg += segment(uv.yx+vec2( 1., 0.),num!=-1 && num!=1 && num!=4 && num!=7 ); return seg; } float showNum(vec2 uv,int nr, bool zeroTrim) { // nr: 2 digits + sgn . zeroTrim: trim leading "0" if (abs(uv.x)>2.*1.5 || abs(uv.y)>1.2) return 0.; if (nr<0) { nr = -nr; if (uv.x>1.5) { uv.x -= 2.; return segment(uv.yx,true); // minus sign. } } if (uv.x>0.) { nr /= 10; if (nr==0 && zeroTrim) nr = -1; uv -= vec2(.75,0.); } else { uv += vec2(.75,0.); nr = int(mod(float(nr),10.)); } return digit(uv,nr); } float colon(vec2 uv, vec2 cCenter, float cRadius) { float returnMe = distance(uv,cCenter); if (returnMe > cRadius) returnMe = 0.0; else returnMe = 1.0 - pow(returnMe / cRadius,4.0); return returnMe; } // a simplfied version of the number drawing from http://www.interactiveshaderformat.com/sketches/120 void main() { vec4 returnMe = vec4(0.0); vec2 uv = isf_FragNormCoord; float adjustedOffset = (yOffset*1.2*(RENDERSIZE.y/RENDERSIZE.x)); vec2 loc = uv; loc.y = loc.y - adjustedOffset; // The first element of the vector is the year, the second element is the month, // the third element is the day, and the fourth element is the time (in seconds) within the day. vec4 currentDate = DATE; if (clockMode == 1) currentDate.a = 86400.0 - currentDate.a; else if (clockMode == 2) currentDate = vec4(TIME); float tmpVal = currentDate.a; float h = 0.0; float m = 0.0; float s = 0.0; s = mod(tmpVal,60.0); tmpVal = tmpVal / 60.0; m = mod(tmpVal,60.0); tmpVal = tmpVal / 60.0; h = mod(tmpVal,60.0); if ((!twentyFourHourStyle)&&(clockMode == 0)) { h = mod(h,12.0); if (h < 1.0) h = 12.0; } float seg = 0.0; int displayTime = 0; if (loc.x < 0.3) { loc.x = 1.0 - (loc.x + 0.37); loc = (loc * 3.0 - 1.5) * 4.0; displayTime = int(h); } else if (loc.x < 0.6) { loc.x = 1.0 - (loc.x+0.05); loc = (loc * 3.0 - 1.5) * 4.0; displayTime = int(m); } else { loc.x = 1.0 - (loc.x - 0.3); loc = (loc * 3.0 - 1.5) * 4.0; displayTime = int(s); } seg = showNum(loc,displayTime,false); if ((!blinkingColons)||(mod(currentDate.a,1.0)<0.5)) { seg += colon(uv,vec2(0.293,0.53+adjustedOffset),0.015); seg += colon(uv,vec2(0.293,0.47+adjustedOffset),0.015); seg += colon(uv,vec2(0.633,0.53+adjustedOffset),0.015); seg += colon(uv,vec2(0.633,0.47+adjustedOffset),0.015); } if (seg > 0.0) returnMe = colorInput * seg; gl_FragColor = returnMe; }