Joe Clay | Mar 29, 2018


Where's Sundial? It's said "Coming Soon" for as long as this site has existed.

Fair enough. I've had a few inquiries into this one. The short of it is that it's now available as a name your own price with some caveats. The long of it is that it's incomplete and macOS only.

Boring History Lesson

I developed Sundial in 2014. One of my goals was to make a plugin. I originally tried to remake Pete's Plugins from his source, especially for his legendary halftone effect, but I could never figure out how it all went together. So I went about building my own from scratch.

I had this great idea. Everyone was trying to make long shadows and had developed all of these different hacks. For quick things, I had always cheated by stacking a few drop shadows. But I figured that I could probably turn that process into a way more efficient plugin. How hard can copying a layer over and over a ton of times be? It was difficult. The docs were ancient and my C++ experience is still low. But eventually I got it working. I even optimized it so that it didn't draw a ton of layers, but grouped them and repeated those groups to get to the desired length.

The only setback I faced, and could never recover from, was that it wouldn't work well with raster images. Every once in a while you'd need to purge. And moving the controls around usually seemed to have the effect of stacking the copies, especially if opacity was used.

So I stopped development completely when an alternative hit the market. I found out recently that others had been working on a similar path and had similar setbacks. I think the code they worked on ended up in a viable version somewhere.

So that's where it stands. As I use Macs, it's macOS only. Had I been able to get the kinks worked out, I probably would have ported it to Windows, but that didn't happen. If those two drawbacks aren't a concern feel free to name a price and download it. But please remember, there is no active development on this one, and it's offered as-is with no support available.


Joe Clay | Mar 23, 2018

Today, we're making some changes with how we do some things so that we can bring you guys more value and make Workbench more of a focus for us both. Right now there's a ton of stuff we want to do, but we have to balance that with running Yellow Dog Party. So in that vein, the first big change we're going to make is to switch around our Patreon setup. The goal is to get more content out for our patrons and lower the price of the tiers versus 4 videos a month so that it's a more attractive offer. Obviously we'd rather have more patrons paying less than less patrons paying more.

When I started this thing, it seemed like a good idea to set it up per video. But as I've posted every week consistently for a couple of years now, it makes more sense for us to go monthly, especially with Sev now being more involved. We won't have to bother with explaining that we're not charging for extra videos and we'll have a better idea of what's coming in from Patreon each month. And we might also be able to curb the few people who've joined our highest tier, downloaded our stuff, and then skipped out on paying. We're making free tutorials so it's a little disheartening to be stiffed. But it makes us really happy for all of you who have gone above and beyond to chip in.

One of our other goals is to make sort of a Patreon-lite experience with regards to project files and elements. When we make our tutorials, we build up these project files, and then we strip out what we can't distribute—like music—and then we strip out content destined for Patreon, and then we put up the project file. If you're a patron, you have to go to two places to get everything. If you're not, you get a project file but it's lighter than it could be. And if you're us, you have extra work ahead of you to do all of that and distribute it.

Well, starting with Tutorial 115 we're hoping to change that. We're now putting our project files up on Gumroad—free for patrons and $1+ for everyone else. Our patrons will still get extra content outside of the tutorials of course—we haven't forgotten the displacement maps we owe you guys!—and we won't have to make three versions of everything. The idea is to make is as easy for us to get you guys useful content, and easy for you to get it.

Hopefully this will be a better solution as we grow. And when that time comes we'll probably have more improvements to make!

Easyrig + Simmod Lens S2 Connector

Joe Clay | Mar 7, 2018

Today we're talking about something different—production equipment. While we probably won't get into full on production tutorials as there's plenty of great content out there already, there's not a lot of stuff geared at people who might find their way onto a set for other reasons—VFX supervisors for example—that might wonder about equipment or perhaps even certain practices.

This started because we were asked to do a quick demo for a product that I've personally bought—the Simmod Lens S2 Connector. Full disclosure: I'm getting a discount on future purchases for talking about it, but it's a product I really believe in and recommend from a company—and owner—I really like. The KONG Frog clips are already excellent, and using them to build this solid, purpose-built clip that melds securely with an Easyrig makes a perfect piece of support equipment for anyone who uses similar setups. It also keeps the camera higher than the usual Frog clips with the strap.

That offer led to the idea of talking about things you might find on set. I live in a right-to-work state so our shoots are typically non-union. That means I've often helped out other departments on set—though I work in the camera department—because we're not as regimented as union shoots. That means we often help with other departments' equipment. So I figured it would be helpful for people who are starting out and find themselves in an open set to know about various items they might come across.

Anyway, if there's anything you're curious about, let us know in the comments and maybe we can make a video for it. And I promise that the next intro won't be as long. We felt like having a play shooting with Sev's A7R and some cheap RGB lights I bought a while ago!

The Nugget

Joe Clay | Mar 6, 2018

If you've watched a few of my tutorials, you've probably heard me talk about "the nugget." I'm not talking about what you make while browsing Reddit on your phone. I'm talking about a nugget of information! I'm talking about why I still watch After Effects tutorials even if I think I'm going to already understand most of what I'm about to watch.

And Monday's Video Copilot Glitch Tutorial—Andrew just made it in time!—was chock full of useful nuggets. For example, in the past I've made 3D water reflections by masking out a floor layer to see a flipped copy of my animation. But adding in one of my favorite effects that I really should use more frequently, Compound Blur, allows you to easily make those water puddles variable with a floor texture. What a great use for that effect!

Or you have the section where Andrew used Set Matte to matte out saturation to do a targeted glow—and actually make AE's default Glow effect look good. That was an excellent use for such an already useful effect.

But my favorite nuggets are the ones where I see something and it gives me an idea that might not even really have anything to do with the tutorial. And this texture Andrew used did that for me.

What this reminded me of has no real relation to the tutorial. And yet it gave me an excellent idea for this week's tutorial. There's still going to be glitching involved, displacement, and maps. But there's a fun way we're going to build our maps that I hadn't thought of before. I'm really excited about this one because it's a great example of the nugget in action. So don't forget to check back Friday! Better yet, follow us @workbench_tv so you don't miss it!

EDIT: It's up!

15K Giveaway

Joe Clay | Mar 1, 2018

Amazing Music Tracks contacted us and my wife had a great idea about doing a giveaway since we just hit 15K subscribers on YouTube—now just shy of 16K! So to enter, you only have to do a couple of things.

  1. Follow us @workbench_tv.
  2. Tweet out your favorite Workbench tutorial and tag us at the end!

Since we're still pretty small, we'll leave this running for a couple of weeks so we can get a decent amount of entires. But that also means you have a good shot at winning. And what can you win? Free music!

The winner will receive 5 free tracks, a re-usable code for 50% off up to 50 tracks and another re-usable code for 30% off up to 100 tracks. And if you don't win, you can still use our affiliate code: WORKBENCH10 at Amazing Music Tracks.

Thanks for 15K everyone! It's unreal.

Expression Selectors

Joe Clay | Feb 26, 2018

YouTube user Arthur Hakhverdian asked us a great question about Text Selectors. He wanted to know how to select specific text indexes in an Expression Selector. There's two ways to do it. I would imagine the first would be faster since we don't have to traverse an array. However, to speed it up we put a break in the array traversal method so hopefully it works faster for the first few indices at least.

If you don't have a ton of numbers, this works. just put || between each test.

if(textIndex === 1 || textIndex ===3) {
} else {

Obviously that gets tedious to input a ton of numbers, so you can build an array with a set of numbers to check.

i = [1,3,5,7,10,11];

function inArray(obj) {
    b = 0;
    for(i = 0; i < obj.length; i++) {
        if(obj[i] === textIndex) {
            b = 100;
    return b;

That second one could be tons shorter, but unfortunately AE doesn't have a modern javascript implementation. They seem to still be using 1.2 which is about 20 years old at this point. So I put in a request for them to update it through Adobe's bug/wish form and you should too!

Layer Inputs

Joe Clay | Feb 4, 2018

Whenever I'm experimenting in After Effects, I'm often trying to use a map layer to drive some effect. Of course I always have old standbys like Displacement Map, but there's a bunch of other effects that take a layer input and spit something out. So I decided to make a list of all built-in effects that take a layer input—including those that don't fit this purpose—so that I can have a reference of alternate effects to audition. Hopefully you'll find this helpful as well!

One day I might turn this into a searchable reference for all standard effects. The only issue is that sometimes similar controls fall under different names. But for now, here's an easy to read list.

3D Channel

  • Fog 3D

Blur & Sharpen

  • Camera Lens Blur
  • CC Vector Blur
  • Compound Blur


  • Blend
  • Calculations
  • Channel Combiner
  • Compound Arithmetic
  • Set Channels
  • Set Matte

Color Correction

  • Color Link
  • Colorama


  • CC Page Turn
  • Displacement Map

Expression Controls

  • Layer Control


  • Audio Spectrum
  • Audio Waveform
  • Radio Waves
  • Vegas


  • Difference Matte

Noise & Grain

  • Match Grain


  • 3D Glasses
  • CC Environment


  • Card Dance
  • Caustics
  • CC Particle World
  • Particle Playground
  • Shatter
  • Wave World


  • CC Glass
  • CC Mr. Smoothie
  • CC Plastic
  • Texturize


  • Timecode


  • Time Difference
  • Time Displacement
  • Timewarp


  • Card Wipe
  • CC Glass Wipe
  • CC Image Wipe
  • CC Twister
  • CC WarpoMatic
  • Gradient Wipe

Color Sampler

Joe Clay | Jan 25, 2018

You've probably had to color match footage in After Effects, or maybe you're trying to remove something from an image like a colored mark. Or maybe you've had to remove a color cast from something. That's generally pretty easy in Photoshop where you can set up a color sampler. But AE doesn't have that functionality—at least as far as I've seen. You can sample colors under your cursor in the info palette, but as soon as you move your cursor, the information is gone.

So let's use a little expression magic to set up a color sampler. The code below (which might scroll on your screen) is added to a text layer's Source Text property. We have two sliders set up. One is a Layer Control—appropirately called Layer. And the other is a Slider Control called Radius.

r = effect("Radius")("Slider");
target = effect("Layer")("Layer");
color = target.sampleImage(position, [r,r], true);
color = [Math.round(color[0]*255), Math.round(color[1]*255), Math.round(color[2]*255), Math.round(color[3]*255)];
"+\t\t\tR: " + color[0] + "\n\t\t\tG: " + color[1] + "\n\t\t\tB: " + color[2] + "\n\t\t\tA: " + color[3];

The first two lines set up variables for our sliders. Then we take the layer we have selected in the Layer Control, and run sampleImage() on that. We pass it the position of this layer, our text layer, and give it our Radius value as an array using the same value for each dimension. Generally I want this to be tiny. You can't set it to zero though. It'll throw an error so be aware of that. The third argument is for post effect. That is, after the effects have been added. Since we usually want to sample the colors as they are, not before effects are applied, we set this to true. This gets us an RGBA array with colors from 0-1. If you're working in a higher color space, I think this will continue past 1 and you'd likely want to ignore the next line.

color = [Math.round(color[0]*255), Math.round(color[1]*255), Math.round(color[2]*255), Math.round(color[3]*255)];

The next line converts the original array's range of 0-1 into 0-255. First, we would normally divide each value in the array by the highest number in the range we have, but in this case it's 1 so we don't need to. So instead we just multiply each value by the highest number in the range we're mapping to—255. We also round each value with Math.round().

"+\t\t\tR: " + color[0] + "\n\t\t\tG: " + color[1] + "\n\t\t\tB: " + color[2] + "\n\t\t\tA: " + color[3];

This final line is our text output. We put a plus in, which is where I set the anchor point of the layer, so it serves as a marker for our sample point, then we add in some tabs—at least the best we can hope for in After Effects—using \t and then a color channel, a colon and space and then a color. We do that for each piece adding in a newline character—\t—for each new color channel. And that's that.

Now, you can only sample one layer at a time. What if you need to sample how different layers interact, like transparency or blend modes? Put a blank Adjustment Layer above the others and select that layer in your Layer Control. The Adjustment Layer kind of takes on the values of the underlying layers, which is pretty useful. But it's also nice that you can sample specific layers without worrying about what's on top of them if you want to. So in the end, it's pretty flexible compared to the Photoshop version.

If you want to make this really helpful, turn it into a preset. Depending upon the font, font size, and font weight you choose, you may need to modify the amount of tabs—\t—you use in the final line of the expression. If you're Patron, you don't need to worry about that as I've made a preset for you. It's available in the same folder as all of the other presets!

Sweat Equity Podcast Appearance

Joe Clay | Jan 12, 2018

Yesterday, I had a blast hanging out with the dudes of Tocobaga Consulting (aka TocoWorks) and 208 Monkeys for a little bit to talk shop! We talked about the origin of Workbench, why you shouldn't use tutorials in your reel, advice for people in the industry, and a whole lot more. There's some hilarious NSFW bits in there, so if you work in an office that's lame, throw on some headphones!

If you're curious, Law and I went to high school together. That's not really what led to this appearance, but it's interesting information. We were even on the track team. Before I was 30 pounds overweight! Here's another odd piece of trivia—a few months ago I weighed almost 100 pounds over what I weighed back then. Insane. Anyway, check it out and have a great weekend!

Number Format

Joe Clay | Jan 10, 2018

Let's format some numbers

Often there's a need to make a ticker-style number growing from some number into another number. If you haven't had that request you haven't been working in this industry for more than five minutes. The problem is, while you can make a slider cycle through numbers from -1,000,000 to 1,000,000, you can't get those commas in there without some work. And unless you truncate the decimals you can get some really long decimal values too. Unfortunately, After Effects's available functions are sometimes limited so there's no number format function.

So I made a reasonable facsimile. Enter my number format expression. Here's what it looks like.

//Apply to SourceText
m = effect("Multiplier")("Slider");
e = Math.round(Math.log(m)/Math.log(10));
n = effect("Number")("Slider").value;
neg = n < 0 ? '-' : '';
n = Math.abs(n).toFixed(e)*m;
s = n.toString();
n = '';
for(i = s.length; i > 0; i--) {
    if((s.length-i) % 3 == 0) { n += ',' }
    n += s.charAt(i-1);
n = n.split('').reverse().join('');
neg + n.substr(0,n.length-1);

To use this, you need to add two sliders to your text layer. Call them Number and Multiplier. The multiplier is used to get numbers higher than one million. If you have 1234.567 as your value for example, if your multiplier is 1,000 you'll get 1,234,567 which is obviously over one million. You can enter numbers to a ton of decimal places though AE will usually only display 2-3 depending upon how you've interacted with the UI. You can also double click on a keyframe to see a slightly more precise value.

Note, I'd keep that Multiplier slider set to powers of 10—100 is 1 by the way so if you want the number to be exactly the same as the number slider without decimals, set the multiplier to 1.

How it works

m = effect("Multiplier")("Slider");
e = Math.round(Math.log(m)/Math.log(10));

First we grab our Multiplier slider. Then we see how many factors of 10 we're going to multiply by. This is necessary to truncate our Number value later on so that we don't end up with decimals or other weird formatting in our number. Even though you may only see 2 decimal places, there can be about twenty digits AE holds onto in the background.

Since there's also no Math.log10() function in AE for some reason, we have to calulate that ourselves. So we take the log of our Multiplier, and divide it by log10. We're also using Math.round()—it could also be Math.ceil() for our purposes—because sometimes Javascript math is odd. For example, taking log10 of 1000 is 2.999999999... instead of 3 for some reason and we need it to be dead on 3. This value is stored in e for exponent.

n = effect("Number")("Slider").value;
neg = n < 0 ? '-' : '';
n = Math.abs(n).toFixed(e)*m;
s = n.toString();

Next, we'll grab our Number slider. We need to add .value to the end of this one because it has to be a float and not some other type of variable. Then we do a quick check with a ternary structure so that we can conditionally set a variable in one line. If n is negative, we save - to the neg variable, otherwise it's an empty string. That will be tacked on to the front of our number later.

Then we take the absolute value of our number, since that sign—the dash—will mess us up. You could just truncate that character off, but dropping the sign with Math.abs()—taking the absolute value—should be a faster operation. Then we convert that number to a fixed string with e decimals. And that final result is multiplied by our multiplier m and saved back to n.

Even though we've converted our floating point number to a string using toFixed(), that math still works thankfully. But we need a string for what we're going to do next.

s = n.toString();
n = '';

So we convert n to a string and save it to s for, uh, string. Then we clear out n because there's no point to making another variable and n makes sense since it'll hold our number again at the end.

for(i = s.length; i > 0; i--) {
    if((s.length-i) % 3 == 0) { n += ',' }
    n += s.charAt(i-1);

In this for loop, we're going to loop backwards from the end of the string to the front. This will allow us to place commas every three characters. You could do this forwards, but going backwards is simpler and probably faster to execute.

So we'll start by setting i equal to the amount of characters in the string—the length—and while i is greater than zero this loop will function. Every time through the loop we'll decrement i by 1.

Each time through the loop, we'll check to see if the original string length minus the current value of i is a multiple of 3. We do that by using modulo and checking if our value is 0. If it is, we're at a third character and we'll concatenate or append a comma to the end of variable n. On the first time through this loop, the value we'll modulus will be zero so it will append a comma as the first character of string n. We'll drop that off later.

Then we append the charcter at position i-1 to the variable n. We have to subtract one because character position is zero-indexed while length is 1 indexed. For example if we have ten characters the tenth character is 9, because we start counting character position at 0.

At this point we'll be left with a number that looks like: ,987,654,321

n = n.split('').reverse().join('');
neg + n.substr(0,n.length-1);

So then we'll use split to convert our string into an array of characters, then we'll reverse that array and join it back together with an empty string. This would leave us with 123,456,789,. So in the next line we add that negative sign—if there was one—back in and then truncate off that last comma using substring.

And that's it. It took a bit of fiddling, and it's not as perfect as just having a number format function like many languages do. But it works when you need it. The only thing this won't do is decimals. If you need decimals with large numbers, it'd be easier to add another slider and deal with them separately. If I have a need for that, I'll make it and make it available. But that's unlikely. Most of the time you do that with smaller numbers so just use a simple toFixed(2) on the value from the slider and call it a day. This mainly helps for larger numbers where the specificty of decimals are less important.

This is also a Quiver file for this expression available to Patrons. It's available in the general Quiver folder. The link can be found on a prior Patreon post!

I feel like this is a good way to explore some expressions in a little more depth. If you enjoyed this format, leave a comment below, or message me on twitter @workbench_tv.