The Lazy Compositor – Use the BBOX!

You’ve heard it a thousand times!

You should be paying attention to your bounding boxes!

Honestly, you and I both know nobody’s got time to check their bounding boxes, if they want to grow, who are we to tell them no?

But! What if I told you we can use the BBOX to be lazy, wouldn’t that be great?!

OK, allow me to set the scene.

You have just been assigned a shot with three characters dancing around merrily, and your task is to replace the dirt ground they were filmed on with a reflective futuristic cyberpunk dance floor.

You see that you have roto mattes for these three characters.

You are glad.

Until, you have to recreate their shadows and reflections.

A hard working compositor would split each of these characters into their own channel, make a mirror reflection vertically, and animate a transform to attach the reflection back to the original.

But a lazy compositor would never do something like this!

A lazy compositor would use the BBOX to automate this task.

Here’s how!

First, we need to extract each character’s bounding box.

We can do this by splitting them into their own individual layers and running the ‘autocrop’ TCL command.

You can bring up the command dialog box by pressing ‘X’ in the DAG context.

BBOX calculation completed!

Now that we have each character’s BBOX, we can use the attributes of the BBOX to calculate the pivot point where we’re going to mirror our character vertically.

BBOX attributes? What are those you say?

I’m talking about ‘xyrt’!

x = left bound of the bbox

y = bottom bound of the bbox

r = right bound of the bbox

t = top bound of the bbox

Each of these are simply a point on a cartesian plane.

Which means, we can use some quick math to find the bottom center of the BBOX.

Let’s drop down a Transform node, and enter these expressions into the X and Y components of the ‘center’ knob and hook it up to the character:

bbox.r – (bbox.r – bbox.x)/2

bbox.y

You will see that the Transform’s center has now snapped to the center bottom of our character!

Next, let’s mirror our character by setting the scale Y in our Transform node to -1.

And let’s merge the reflection with the original character and hit play to see the result!

Rejoice!

Next, let’s set up a little controller for offsetting our reflection in Y.

Then, let’s copy and paste the Transform node to each of our characters and watch them party!

But we’re not done! What if we want to have finer control over our shadow/reflections?

So, let’s create a little ramp to mult down the opacity of our reflections.

Make a ramp node, and connect it up to the reflection, toggle on ‘replace’ as we don’t need the original reflection baked into our ramp.

Next, we set the ramp’s point0 and point1’s Y value to the top bound and bottom bound of the BBOX.

The ramp now goes from 0 to 1 from the base of our reflection.

We can then use this as a mask for a multiply node.

Let’s duplicate this to the other characters to see the final result!

I’d like to point out here that if you have characters coming in or disappearing off of screen, the bounding box calculations will be incorrect for those frames. You can see this error in our example here:

For unfortunate cases like these, we’d have either manually adjust those frames, or if we have overscanned roto ( I have never had overscanned roto lol), we can use a CurveTool with to calculate the autocrop data with a large enough ROI setting to accommodate for the overscan.

And at last, if you want to be an even LAZIER compositor, you can use this little Python script to automatically autocrop multiple nodes in one go!

def autoCrop():
    """
    Basic Autocrop that operates on more than one selected read node
    """
    try:
        first_frame = int(nuke.root().knob('first_frame').getValue())
        last_frame = int(nuke.root().knob('last_frame').getValue())
        f_range = nuke.getInput("Frame Range To Calculate?\n\nExample: 1001-1230", str(first_frame) + "-" + str(last_frame))
        if len(f_range.strip()) == 0:
            nuke.message("Empty frame range.\n\nGave up!")
            return
        for char in f_range:
            if char.isalpha():
                nuke.message("Invalid characters.\n\nPlease format like this:\n1001-1230")
                return
        f_range_split = f_range.split('-')
        f_first = int(f_range_split[0])
        f_last = int(f_range_split[1])
        layer = 'alpha'

        for n in nuke.selectedNodes():
            nukescripts.autocrop(f_first, f_last, 1, layer)
    except AttributeError:
        nuke.message('Invalid Range.\n\nGave up!')
        return

And that concludes this article.

I hope you enjoyed reading it and have learned something new to help you be more lazy!

Nuke script pasted below!

set cut_paste_input [stack 0]
version 12.1 v2
push $cut_paste_input
Group {
 name ROTO_MATTES
 selected true
 xpos 164
 ypos 205
 hide_input true
}
 Input {
  inputs 0
  name Input1
  xpos -56
  ypos 129
 }
 Reformat {
  name Reformat1
  xpos -56
  ypos 169
 }
 Roto {
  output alpha
  cliptype none
  curves {{{v x3f99999a}
  {f 0}
  {n
   {layer Root
    {f 2097152}
    {t x44800000 x44428000}
    {a pt1x 0 pt1y 0 pt2x 0 pt2y 0 pt3x 0 pt3y 0 pt4x 0 pt4y 0 ptex00 0 ptex01 0 ptex02 0 ptex03 0 ptex10 0 ptex11 0 ptex12 0 ptex13 0 ptex20 0 ptex21 0 ptex22 0 ptex23 0 ptex30 0 ptex31 0 ptex32 0 ptex33 0 ptof1x 0 ptof1y 0 ptof2x 0 ptof2y 0 ptof3x 0 ptof3y 0 ptof4x 0 ptof4y 0 pterr 0 ptrefset 0 ptmot x40800000 ptref 0}
    {curvegroup Rectangle5 512 bezier
     {{cc
       {f 8192}
       {px
        {1 x41200000 x41a00000 x41f00000}
        {{{0 0 1 x3fbef0ab 1}
       {x410f3480 -}
       {xc0b63080 -}
       {x41340100 x4022a8c0 1 0 1}}
      {{x41d00000 0 1 xbfbff4ab 1}
       {x41880440 -}
       {x4192cf20 -}
       {x41793700 xbed522cd 1 0 1}}}
        {{{x43560000 0 1 x412277d9 1}
       {x43a82ffb x41a3dd62 1 x41a3dd62 1}
       {x4416cb72 x41c249d1 1 x41c249d1 1}
       {x4450861f x41a58e5b 1 0 1}}
      {{x44178000 0 1 x41495082 1}
       {x44314bf3 x4113b33d 1 x4113b33d 1}
       {x44435936 -}
       {x44081de8 xc23bc188 1 0 1}}}
        {{{xc2a80000 0 1 x408d902b 1}
       {xc265d3e0 -}
       {xc2781040 -}
       {xc2528cb0 x3fb4111a 1 0 1}}
      {{0 0 1 x40a15100 1}
       {x41f1f980 -}
       {xc199ec40 -}
       {x421813c0 x41096c53 1 0 1}}}
        {{{x42a80000 0 1 xc08d9040 1}
       {x4265d3d0 -}
       {x42781050 -}
       {x42528cc0 xbfb4111a 1 0 1}}
      {{0 0 1 xc0a15115 1}
       {xc1f1f9a0 -}
       {x4199ec40 -}
       {xc21813d0 xc1096c5d 1 0 1}}}
        {{{xc2180000 0 1 x41ad8597 1}
       {x43240112 x41bfa258 1 x41bfa258 1}
       {x43d090c9 x41c81257 1 x41c81257 1}
       {x44290bba x41c46d40 1 0 1}}
      {{x44178000 0 1 x420148eb 1}
       {x4447fb58 -}
       {x4434eb0e xc12debf6 1 xc12debf6 1}
       {x4424a19b xc17bcb22 1 0 1}}}
        {{{0 0 1 x3fbef0d5 1}
       {x410f34a0 -}
       {xc0b63080 -}
       {x41340180 x4022a90d 1 0 1}}
      {{x41d00000 0 1 xbfbff4ab 1}
       {x41880440 -}
       {x4192cf40 -}
       {x41793740 xbed522cd 1 0 1}}}
        {{{0 0 1 xbfbef0ab 1}
       {xc10f3480 -}
       {x40b630c0 -}
       {xc13400c0 xc022a8ad 1 0 1}}
      {{xc1d00000 0 1 x3fbff4ab 1}
       {xc1880440 -}
       {xc192cf00 -}
       {xc1793700 x3ed5219a 1 0 1}}}
        {{{xc2180000 0 1 x41d4eb41 1}
       {x433edaec x41b87148 1 x41b87148 1}
       {x43c80685 x41cad4e2 1 x41cad4e2 1}
       {x44317bc7 x420005a2 1 0 1}}
      {{x442b0000 0 1 x41de93eb 1}
       {x4454bbbc -}
       {x4442ae76 xc1315830 1 xc1315830 1}
       {x4430502d xc187081f 1 0 1}}}
        {{{x42a80000 0 1 xc08d9035 1}
       {x4265d3d8 -}
       {x42781050 -}
       {x42528cd0 xbfb410cd 1 0 1}}
      {{0 0 1 xc0a15115 1}
       {xc1f1f9a0 -}
       {x4199ec80 -}
       {xc21813b0 xc1096c5d 1 0 1}}}
        {{{xc2a80000 0 1 x408d902b 1}
       {xc265d3e0 -}
       {xc2781040 -}
       {xc2528cc0 x3fb410cd 1 0 1}}
      {{0 0 1 x40a15100 1}
       {x41f1f980 -}
       {xc199ec60 -}
       {x421813b0 x41096c53 1 0 1}}}
        {{{x43560000 0 1 x4171432c 1}
       {x43b59ce7 x419cac4f 1 x419cac4f 1}
       {x4412864f x41c50c59 1 x41c50c59 1}
       {x4458f62a x41e12c5a 1 0 1}}
      {{x442b0000 0 1 x410afe18 1}
       {x443e0c57 x41006065 1 x41006065 1}
       {x44511c9e -}
       {x4413cc7b xc240c054 1 0 1}}}
        {{{0 0 1 xbfbef0ab 1}
       {xc10f3480 -}
       {x40b63080 -}
       {xc13400c0 xc022a89a 1 0 1}}
      {{xc1d00000 0 1 x3fbff500 1}
       {xc1880420 -}
       {xc192cf00 -}
       {xc17936e0 x3ed52233 1 0 1}}}}}
      {cc
       {f 8192}
       {px
        {1 x41200000 x41a00000 x41f00000}
        {{{0 0 1 x3fbef0ab 1}
       {x410f3480 -}
       {xc0b63080 -}
       {x41340100 x4022a8c0 1 0 1}}
      {{x41d00000 0 1 xbfbff4ab 1}
       {x41880440 -}
       {x4192cf20 -}
       {x41793700 xbed522cd 1 0 1}}}
        {{{0 -}}
      {{0 -}}}
        {{{xc2a80000 0 1 x408d902b 1}
       {xc265d3e0 -}
       {xc2781040 -}
       {xc2528cb0 x3fb4111a 1 0 1}}
      {{0 0 1 x40a15100 1}
       {x41f1f980 -}
       {xc199ec40 -}
       {x421813c0 x41096c53 1 0 1}}}
        {{{x42a80000 0 1 xc08d9040 1}
       {x4265d3d0 -}
       {x42781050 -}
       {x42528cc0 xbfb4111a 1 0 1}}
      {{0 0 1 xc0a15115 1}
       {xc1f1f9a0 -}
       {x4199ec40 -}
       {xc21813d0 xc1096c5d 1 0 1}}}
        {{{0 -}}
      {{0 -}}}
        {{{0 0 1 x3fbef0d5 1}
       {x410f34a0 -}
       {xc0b63080 -}
       {x41340180 x4022a90d 1 0 1}}
      {{x41d00000 0 1 xbfbff4ab 1}
       {x41880440 -}
       {x4192cf40 -}
       {x41793740 xbed522cd 1 0 1}}}
        {{{0 0 1 xbfbef0ab 1}
       {xc10f3480 -}
       {x40b630c0 -}
       {xc13400c0 xc022a8ad 1 0 1}}
      {{xc1d00000 0 1 x3fbff4ab 1}
       {xc1880440 -}
       {xc192cf00 -}
       {xc1793700 x3ed5219a 1 0 1}}}
        {{{0 -}}
      {{0 -}}}
        {{{x42a80000 0 1 xc08d9035 1}
       {x4265d3d8 -}
       {x42781050 -}
       {x42528cd0 xbfb410cd 1 0 1}}
      {{0 0 1 xc0a15115 1}
       {xc1f1f9a0 -}
       {x4199ec80 -}
       {xc21813b0 xc1096c5d 1 0 1}}}
        {{{xc2a80000 0 1 x408d902b 1}
       {xc265d3e0 -}
       {xc2781040 -}
       {xc2528cc0 x3fb410cd 1 0 1}}
      {{0 0 1 x40a15100 1}
       {x41f1f980 -}
       {xc199ec60 -}
       {x421813b0 x41096c53 1 0 1}}}
        {{{0 -}}
      {{0 -}}}
        {{{0 0 1 xbfbef0ab 1}
       {xc10f3480 -}
       {x40b63080 -}
       {xc13400c0 xc022a89a 1 0 1}}
      {{xc1d00000 0 1 x3fbff500 1}
       {xc1880420 -}
       {xc192cf00 -}
       {xc17936e0 x3ed52233 1 0 1}}}}}}
     {tx 1 x42b00000 x44214000}
     {a osw x41200000 osf 0 str 1 spx x44800000 spy x44428000 sb 1 tt x41000000}}
    {curvegroup Rectangle4 512 bezier
     {{cc
       {f 8192}
       {px
        {1 x41200000 x41a00000 x41f00000}
        {{{0 0 1 xbf818755 1}
       {xc0c24b00 -}
       {x4091f900 -}
       {xc0889800 xbfa98a33 1 0 1}}
      {{x41900000 0 1 xbf8382ab 1}
       {x413d5e00 -}
       {x4147ed00 x3cfd8000 1 x3cfd8000 1}
       {x41499380 -}}}
        {{{x43cf0000 0 1 x40e8ebd1 1}
       {x43fe89ff x418914bd 1 x418914bd 1}
       {x4438e450 x41c88197 1 x41c88197 1}
       {x447d15fe x41e0adab 1 0 1}}
      {{x44240000 0 1 x40c9445a 1}
       {x44324e90 x40cfe4a2 1 x40cfe4a2 1}
       {x4442dbf0 -}
       {x440aeb45 xc23774ce 1 0 1}}}
        {{{x42c15554 0 1 xc0a0f80b 1}
       {x4284f850 -}
       {x428c6240 x3e320ccd 1 x3e320ccd 1}
       {x428d8b00 xb0cccccd 1 0 1}}
      {{0 0 1 x40b5e800 1}
       {x42086e00 -}
       {xc1cd0040 -}
       {x41bfd440 x40ee191a 1 0 1}}}
        {{{xc2c15558 0 1 x40a0f815 1}
       {xc284f850 -}
       {xc28c6240 xbe320333 1 xbe320333 1}
       {xc28d8af0 xb0cccccd 1 0 1}}
      {{0 0 1 xc0b5e800 1}
       {xc2086e00 -}
       {x41cd0060 -}
       {xc1bfd400 xc0ee1906 1 0 1}}}
        {{{x44300000 0 1 xb2aaaaab 1}
       {x44312220 x3fc16aab 1 x3fc16aab 1}
       {x446d8930 x41cda666 1 x41cda666 1}
       {x44991510 x41e0314d 1 0 1}}
      {{x44240000 0 1 x41d4bbb5 1}
       {x444be332 -}
       {x442fa3e8 xc157f34a 1 xc157f34a 1}
       {x441ce72b xc18659ec 1 0 1}}}
        {{{0 0 1 xbf818755 1}
       {xc0c24b00 -}
       {x4091fa00 -}
       {xc0889800 xbfa98acd 1 0 1}}
      {{x41900000 0 1 xbf8382ab 1}
       {x413d5e00 -}
       {x4147ed40 x3cfd599a 1 x3cfd599a 1}
       {x41499380 xafcccccd 1 0 1}}}
        {{{0 0 1 x3f8187ab 1}
       {x40c24b80 -}
       {xc091f900 -}
       {x40889a00 x3fa98b66 1 0 1}}
      {{xc1900000 0 1 x3f8382ab 1}
       {xc13d5e00 -}
       {xc147ed00 xbcfd3333 1 xbcfd3333 1}
       {xc1499300 xaf4ccccd 1 0 1}}}
        {{{x44300000 0 1 xc011f0ab 1}
       {x442c945c -}
       {x4470f50a x41cfd04d 1 x41cfd04d 1}
       {x44977b46 x41bf524a 1 0 1}}
      {{x44318000 0 1 x41bc1335 1}
       {x4454c39a -}
       {x44390305 xc1561e76 1 xc1561e76 1}
       {x44265a15 xc1867016 1 0 1}}}
        {{{xc2c15558 0 1 x40a0f815 1}
       {xc284f850 -}
       {xc28c6250 xbe31f000 1 xbe31f000 1}
       {xc28d8ae0 -}}
      {{0 0 1 xc0b5e800 1}
       {xc2086e00 -}
       {x41cd0040 -}
       {xc1bfd440 xc0ee191a 1 0 1}}}
        {{{x42c15554 0 1 xc0a0f800 1}
       {x4284f854 -}
       {x428c6250 x3e31f99a 1 x3e31f99a 1}
       {x428d8af0 xb14ccccd 1 0 1}}
      {{0 0 1 x40b5e800 1}
       {x42086e00 -}
       {xc1cd0040 -}
       {x41bfd400 x40ee18f3 1 0 1}}}
        {{{x43cf0000 0 1 x40787ff5 1}
       {x43f56e78 x418ed7d8 1 x418ed7d8 1}
       {x443c5028 x41caab83 1 x41caab83 1}
       {x4479e26e x41bfcec2 1 0 1}}
      {{x44318000 0 1 x406914d5 1}
       {x443b2ef8 x40b41480 1 x40b41480 1}
       {x444c3b0b -}
       {x44145e2d xc2374548 1 0 1}}}
        {{{0 0 1 x3f818780 1}
       {x40c24b40 -}
       {xc091fa00 -}
       {x40889700 x3fa98a33 1 0 1}}
      {{xc1900000 0 1 x3f8382ab 1}
       {xc13d5e00 -}
       {xc147ecc0 xbcfda666 1 xbcfda666 1}
       {xc1499380 xafcccccd 1 0 1}}}}}     idem}
     {tx 1 x440bc000 x442ac000}
     {a osw x41200000 osf 0 str 1 spx x44800000 spy x44428000 sb 1 tt x41000000}}
    {curvegroup Rectangle3 512 bezier
     {{cc
       {f 8192}
       {px
        {1 x41200000 x41a00000 x41f00000}
        {{{0 -}}
      {{xc2d55554 0 1 x40947ae0 1}
       {x 3
        {xc29da740 -}}}}
        {{{x43b80000 0 1 x40b92c70 1}
       {x43e5070b x41938f58 1 x41938f58 1}
       {x44339d1c x41cf851a 1 x41cf851a 1}
       {x44739d1b x41ce51f0 1 0 1}}
      {{x43e90000 0 1 x40b742a6 1}
       {x440671dc x41478faf 1 x41478faf 1}
       {x442fbea8 -}
       {x43c0b084 xc20ab851 1 0 1}}}
        {{{x41c55550 0 1 xbf6ee7ab 1}
       {x 3
        {x419889e0 -}}}
      {{0 -}}}
        {{{xc1c55550 0 1 x3f6ee755 1}
       {x 3
        {xc19889f0 -}}}
      {{0 -}}}
        {{{x43dd0000 0 1 x405b75db 1}
       {x4400d074 x418c7cb4 1 x418c7cb4 1}
       {x4441ea0b x41cf851d 1 x41cf851d 1}
       {x4480f505 x41ce51f3 1 0 1}}
      {{x43e90000 0 1 x40b742a6 1}
       {x440671dc x41478faf 1 x41478faf 1}
       {x442fbea8 -}
       {x43c0b084 xc20ab851 1 0 1}}}
        {{{0 -}}
      {{xc2d55554 0 1 x40947ae0 1}
       {x 3
        {xc29da740 -}}}}
        {{{0 -}}
      {{x42d55554 0 1 xc0947aeb 1}
       {x 3
        {x429da73c -}}}}
        {{{x43dd0000 0 1 x405b75db 1}
       {x4400d074 x418c7cb4 1 x418c7cb4 1}
       {x4441ea0b x41cf851d 1 x41cf851d 1}
       {x4480f505 x41ce51f3 1 0 1}}
      {{x43120000 0 1 x418b9784 1}
       {x4396a645 x4186f268 1 x4186f268 1}
       {x43e93fdc -}
       {x4314e620 xc20ab851 1 0 1}}}
        {{{xc1c55550 0 1 x3f6ee755 1}
       {x 3
        {xc19889f0 -}}}
      {{0 -}}}
        {{{x41c55550 0 1 xbf6ee7ab 1}
       {x 3
        {x419889e0 -}}}
      {{0 -}}}
        {{{x43b80000 0 1 x40b92c70 1}
       {x43e5070b x41938f58 1 x41938f58 1}
       {x44339d1c x41cf851a 1 x41cf851a 1}
       {x44739d1b x41ce51f0 1 0 1}}
      {{x43120000 0 1 x418b9784 1}
       {x4396a645 x4186f268 1 x4186f268 1}
       {x43e93fdc -}
       {x4314e620 xc20ab851 1 0 1}}}
        {{{0 -}}
      {{x42d55554 0 1 xc0947aeb 1}
       {x 3
        {x429da73c -}}}}}}     idem}
     {tx 1 x43ca8000 x43990000}
     {a osw x41200000 osf 0 str 1 spx x44800000 spy x44428000 sb 1 tt x41000000}}
    {curvegroup Rectangle2 512 bezier
     {{cc
       {f 8192}
       {px
        {1 x41200000 x41a00000 x41f00000}
        {{{0 -}}
      {{xc2c80000 0 1 x408b3335 1}
       {x 3
        {xc293cccc -}}}}
        {{{x43480000 0 1 x4153114e 1}
       {x43aa1873 x41a2c66d 1 x41a2c66d 1}
       {x4412a5d1 x41c9eb82 1 x41c9eb82 1}
       {x4453d903 x41d11ebc 1 0 1}}
      {{x43e20000 0 1 x420249e5 1}
       {x4421dbb6 -}
       {x441c421e xc0d70a00 1 xc0d70a00 1}
       {x43f7510b xc1fa8f62 1 0 1}}}
        {{{x41daaaa8 0 1 xbf845dc0 1}
       {x 3
        {x41a90780 -}}}
      {{0 -}}}
        {{{xc1daaaa8 0 1 x3f845d95 1}
       {x 3
        {xc1a90790 -}}}
      {{0 -}}}
        {{{x438d0000 0 1 x4129448b 1}
       {x43c9c9dc x419af00a 1 x419af00a 1}
       {x44227e86 x41c9eb83 1 x41c9eb83 1}
       {x4463b1b8 x41d11ebb 1 0 1}}
      {{x43e20000 0 1 x420249e5 1}
       {x4421dbb6 -}
       {x441c421e xc0d70a00 1 xc0d70a00 1}
       {x43f7510b xc1fa8f62 1 0 1}}}
        {{{0 -}}
      {{xc2c80000 0 1 x408b3335 1}
       {x 3
        {xc293cccc -}}}}
        {{{0 -}}
      {{x42c80000 0 1 xc08b332b 1}
       {x 3
        {x4293ccd0 -}}}}
        {{{x438d0000 0 1 x4129448b 1}
       {x43c9c9dc x419af00a 1 x419af00a 1}
       {x44227e86 x41c9eb83 1 x41c9eb83 1}
       {x4463b1b8 x41d11ebb 1 0 1}}
      {{x43180000 0 1 x42367d18 1}
       {x43d4ddd2 -}
       {x43c9aaa2 xc0d70a00 1 xc0d70a00 1}
       {x43887770 xc1fa8f62 1 0 1}}}
        {{{xc1daaaa8 0 1 x3f845d95 1}
       {x 3
        {xc1a90790 -}}}
      {{0 -}}}
        {{{x41daaaa8 0 1 xbf845dc0 1}
       {x 3
        {x41a90780 -}}}
      {{0 -}}}
        {{{x43480000 0 1 x4153114e 1}
       {x43aa1873 x41a2c66d 1 x41a2c66d 1}
       {x4412a5d1 x41c9eb82 1 x41c9eb82 1}
       {x4453d903 x41d11ebc 1 0 1}}
      {{x43180000 0 1 x42367d18 1}
       {x43d4ddd2 -}
       {x43c9aaa2 xc0d70a00 1 xc0d70a00 1}
       {x43887770 xc1fa8f62 1 0 1}}}
        {{{0 -}}
      {{x42c80000 0 1 xc08b332b 1}
       {x 3
        {x4293ccd0 -}}}}}}     idem}
     {tx 1 x43710000 x43970000}
     {a osw x41200000 osf 0 str 1 spx x44800000 spy x44428000 sb 1 tt x41000000}}
    {curvegroup Rectangle1 512 bezier
     {{cc
       {f 8192}
       {px
        {1 x41200000 x41a00000 x41f00000}
        {{{x 3
        {0 -}}      0}
      {{x42e15554 0 1 xc09cd4f5 1}
       {x 2
        {x42a68578 -}}      x42a68578}}
        {{{x43420000 0 1 x4141cda6 1}
       {x43a3c6c9 x41a2568a 1 x41a2568a 1}
       {x4410e362 x41dd3b15 1 0 1}      x44517cfc}
      {{x43b90000 0 1 x41997159 1}
       {x44023570 x413eae9b 1 x413eae9b 1}
       {x44151bd6 x40ac32a5 1 0 1}      x43b69e13}}
        {{{x42a95554 0 1 xc04d0195 1}
       {x 2
        {x4282e508 -}}      x4282e508}
      {{x 3
        {0 -}}      0}}
        {{{xc2a95554 0 1 x404d0195 1}
       {x 2
        {xc282e508 -}}      xc282e508}
      {{x 3
        {0 -}}      0}}
        {{{x43e00000 0 1 x4080a6c4 1}
       {x4402f948 x418a0f9e 1 x418a0f9e 1}
       {x4441f946 x41e95e8e 1 0 1}      x44814970}
      {{x43b90000 0 1 x41997159 1}
       {x44023570 x413eae9b 1 x413eae9b 1}
       {x44151bd6 x40ac32a5 1 0 1}      x43b69e13}}
        {{{x 3
        {0 -}}      0}
      {{x42e15554 0 1 xc09cd4f5 1}
       {x 2
        {x42a68578 -}}      x42a68578}}
        {{{x 3
        {0 -}}      0}
      {{xc2e15558 0 1 x409cd500 1}
       {x 2
        {xc2a68578 -}}      xc2a68578}}
        {{{x43e00000 0 1 x4080a6c4 1}
       {x4402f948 x418a0f9e 1 x418a0f9e 1}
       {x4441f946 x41e95e8e 1 0 1}      x44814970}
      {{x44310000 0 1 x40d99069 1}
       {x4440a77d x40e8c958 1 x40e8c958 1}
       {x44538de3 x40f67c94 1 0 1}      x4419c116}}
        {{{xc2a95554 0 1 x404d0195 1}
       {x 2
        {xc282e508 -}}      xc282e508}
      {{x 3
        {0 -}}      0}}
        {{{x42a95554 0 1 xc04d0195 1}
       {x 2
        {x4282e508 -}}      x4282e508}
      {{x 3
        {0 -}}      0}}
        {{{x43420000 0 1 x4141cda6 1}
       {x43a3c6c9 x41a2568a 1 x41a2568a 1}
       {x4410e362 x41dd3b15 1 0 1}      x44517cfc}
      {{x44310000 0 1 x40d99069 1}
       {x4440a77d x40e8c958 1 x40e8c958 1}
       {x44538de3 x40f67c94 1 0 1}      x4419c116}}
        {{{x 3
        {0 -}}      0}
      {{xc2e15558 0 1 x409cd500 1}
       {x 2
        {xc2a68578 -}}      xc2a68578}}}}
      {cc
       {f 8192}
       {px
        {1 x41200000 x41a00000 x41f00000}
        {{{x 3
        {0 -}}      0}
      {{x42e15554 0 1 xc09cd4f5 1}
       {x 2
        {x42a68578 -}}      x42a68578}}
        {{{x 3
        {0 -}}      0}
      {{x 3
        {0 -}}      0}}
        {{{x42a95554 0 1 xc04d0195 1}
       {x 2
        {x4282e508 -}}      x4282e508}
      {{x 3
        {0 -}}      0}}
        {{{xc2a95554 0 1 x404d0195 1}
       {x 2
        {xc282e508 -}}      xc282e508}
      {{x 3
        {0 -}}      0}}
        {{{x 3
        {0 -}}      0}
      {{x 3
        {0 -}}      0}}
        {{{x 3
        {0 -}}      0}
      {{x42e15554 0 1 xc09cd4f5 1}
       {x 2
        {x42a68578 -}}      x42a68578}}
        {{{x 3
        {0 -}}      0}
      {{xc2e15558 0 1 x409cd500 1}
       {x 2
        {xc2a68578 -}}      xc2a68578}}
        {{{x 3
        {0 -}}      0}
      {{x 3
        {0 -}}      0}}
        {{{xc2a95554 0 1 x404d0195 1}
       {x 2
        {xc282e508 -}}      xc282e508}
      {{x 3
        {0 -}}      0}}
        {{{x42a95554 0 1 xc04d0195 1}
       {x 2
        {x4282e508 -}}      x4282e508}
      {{x 3
        {0 -}}      0}}
        {{{x 3
        {0 -}}      0}
      {{x 3
        {0 -}}      0}}
        {{{x 3
        {0 -}}      0}
      {{xc2e15558 0 1 x409cd500 1}
       {x 2
        {xc2a68578 -}}      xc2a68578}}}}}
     {tx 1 x43a08000 x4406c000}
     {a osw x41200000 osf 0 str 1 spx x44800000 spy x44428000 sb 1 tt x41000000}}
    {curvegroup Ellipse1 512 bezier
     {{cc
       {f 8192}
       {px
        {1 x41200000 x41a00000 x41f00000}
        {{{xc2449d08 0 1 x3fee0880 1}
       {x 2
        {xc217fb70 -}}      xc217fb70}
      {{x 3
        {0 -}}      0}}
        {{{x43a38000 0 1 x40fc030b 1}
       {x43d72e56 x4195a045 1 x4195a045 1}
       {x442a9729 x41e3963a 1 0 1}      x446b30c3}
      {{x442b8000 0 1 x40f35a4f 1}
       {x443c96fa x40f2750d 1 x40f2750d 1}
       {x444f7d60 x40f1a6ba 1 0 1}      x4415b094}}
        {{{x42449d08 0 1 xbfee0880 1}
       {x 2
        {x4217fb70 -}}      x4217fb70}
      {{x 3
        {0 -}}      0}}
        {{{x 3
        {0 -}}      0}
      {{xc2449d00 0 1 x4008d7ab 1}
       {x 2
        {xc2114c20 -}}      xc2114c20}}
        {{{x43d00000 0 1 x40a1468e 1}
       {x43f9945a x418d1e99 1 x418d1e99 1}
       {x443bca2b x41e7d710 1 0 1}      x447c63c5}
      {{x4441c000 0 1 x408b06a8 1}
       {x444d0852 x40cb55af 1 x40cb55af 1}
       {x445feeb8 x41029b34 1 0 1}      x442621ec}}
        {{{x 3
        {0 -}}      0}
      {{x42449d00 0 1 xc008d7d5 1}
       {x 2
        {x42114c10 -}}      x42114c10}}
        {{{x42449d08 0 1 xbfee0880 1}
       {x 2
        {x4217fb70 -}}      x4217fb70}
      {{x 3
        {0 -}}      0}}
        {{{x43a38000 0 1 x40fc030b 1}
       {x43d72e56 x4195a045 1 x4195a045 1}
       {x442a9729 x41e3963a 1 0 1}      x446b30c3}
      {{x44580000 0 1 x3f8acc09 1}
       {x445d79aa x40a43651 1 x40a43651 1}
       {x44706010 x410c630c 1 0 1}      x44369344}}
        {{{xc2449d08 0 1 x3fee0880 1}
       {x 2
        {xc217fb70 -}}      xc217fb70}
      {{x 3
        {0 -}}      0}}
        {{{x 3
        {0 -}}      0}
      {{x42449d00 0 1 xc008d7d5 1}
       {x 2
        {x42114c10 -}}      x42114c10}}
        {{{x436e0000 0 1 x412b5fc4 1}
       {x43b4c852 x419e21f1 1 x419e21f1 1}
       {x44196427 x41df5564 1 0 1}      x4459fdc1}
      {{x4441c000 0 1 x408b06a8 1}
       {x444d0852 x40cb55af 1 x40cb55af 1}
       {x445feeb8 x41029b34 1 0 1}      x442621ec}}
        {{{x 3
        {0 -}}      0}
      {{xc2449d00 0 1 x4008d7ab 1}
       {x 2
        {xc2114c20 -}}      xc2114c20}}}}
      {cc
       {f 8192}
       {px
        {1 x41200000 x41a00000 x41f00000}
        {{{xc2449d08 0 1 x3fee0880 1}
       {x 2
        {xc217fb70 -}}      xc217fb70}
      {{x 3
        {0 -}}      0}}
        {{{x 3
        {0 -}}      0}
      {{x 3
        {0 -}}      0}}
        {{{x42449d08 0 1 xbfee0880 1}
       {x 2
        {x4217fb70 -}}      x4217fb70}
      {{x 3
        {0 -}}      0}}
        {{{x 3
        {0 -}}      0}
      {{xc2449d00 0 1 x4008d7ab 1}
       {x 2
        {xc2114c20 -}}      xc2114c20}}
        {{{x 3
        {0 -}}      0}
      {{x 3
        {0 -}}      0}}
        {{{x 3
        {0 -}}      0}
      {{x42449d00 0 1 xc008d7d5 1}
       {x 2
        {x42114c10 -}}      x42114c10}}
        {{{x42449d08 0 1 xbfee0880 1}
       {x 2
        {x4217fb70 -}}      x4217fb70}
      {{x 3
        {0 -}}      0}}
        {{{x 3
        {0 -}}      0}
      {{x 3
        {0 -}}      0}}
        {{{xc2449d08 0 1 x3fee0880 1}
       {x 2
        {xc217fb70 -}}      xc217fb70}
      {{x 3
        {0 -}}      0}}
        {{{x 3
        {0 -}}      0}
      {{x42449d00 0 1 xc008d7d5 1}
       {x 2
        {x42114c10 -}}      x42114c10}}
        {{{x 3
        {0 -}}      0}
      {{x 3
        {0 -}}      0}}
        {{{x 3
        {0 -}}      0}
      {{xc2449d00 0 1 x4008d7ab 1}
       {x 2
        {xc2114c20 -}}      xc2114c20}}}}}
     {tx 1 x43a38000 x4441c000}
     {a osw x41200000 osf 0 str 1 spx x44800000 spy x44428000 sb 1 tt x40e00000}}}}}}
  toolbox {selectAll {
  { selectAll str 1 ssx 1 ssy 1 sf 1 }
  { createBezier str 1 ssx 1 ssy 1 sf 1 sb 1 tt 4 }
  { createBezierCusped str 1 ssx 1 ssy 1 sf 1 sb 1 }
  { createBSpline str 1 ssx 1 ssy 1 sf 1 sb 1 }
  { createEllipse str 1 ssx 1 ssy 1 sf 1 sb 1 tt 7 }
  { createRectangle str 1 ssx 1 ssy 1 sf 1 sb 1 tt 8 }
  { createRectangleCusped str 1 ssx 1 ssy 1 sf 1 sb 1 }
  { brush str 1 ssx 1 ssy 1 sf 1 sb 1 }
  { eraser src 2 str 1 ssx 1 ssy 1 sf 1 sb 1 }
  { clone src 1 str 1 ssx 1 ssy 1 sf 1 sb 1 }
  { reveal src 3 str 1 ssx 1 ssy 1 sf 1 sb 1 }
  { dodge src 1 str 1 ssx 1 ssy 1 sf 1 sb 1 }
  { burn src 1 str 1 ssx 1 ssy 1 sf 1 sb 1 }
  { blur src 1 str 1 ssx 1 ssy 1 sf 1 sb 1 }
  { sharpen src 1 str 1 ssx 1 ssy 1 sf 1 sb 1 }
  { smear src 1 str 1 ssx 1 ssy 1 sf 1 sb 1 }
} }
  toolbar_brush_hardness 0.200000003
  toolbar_source_transform_scale {1 1}
  toolbar_source_transform_center {1024 778}
  colorOverlay {0 0 0 0}
  lifetime_type "all frames"
  motionblur_shutter_offset_type centred
  source_black_outside true
  name Roto1
  xpos -56
  ypos 228
 }
set N9827c800 [stack 0]
 Mirror2 {
  flop true
  name Mirror2_1
  xpos 90
  ypos 285
 }
 Transform {
  translate {590 114}
  scale 0.7549999952
  center {960 540}
  name Transform1
  xpos 90
  ypos 309
 }
 Expression {
  expr1 1*a
  name Expression2
  xpos 90
  ypos 362
 }
push $N9827c800
 Expression {
  expr0 1*a
  name Expression1
  xpos -56
  ypos 361
 }
 Merge2 {
  inputs 2
  operation plus
  name Merge1
  xpos -56
  ypos 436
 }
push $N9827c800
 Mirror2 {
  flop true
  name Mirror2_2
  xpos 253
  ypos 283
 }
 Transform {
  translate {-558 306}
  scale 0.7549999952
  center {960 540}
  name Transform2
  xpos 253
  ypos 307
 }
 Expression {
  expr2 1*a
  name Expression3
  xpos 253
  ypos 364
 }
 Merge2 {
  inputs 2
  operation plus
  name Merge2
  xpos -56
  ypos 506
 }
 Expression {
  expr3 a>1?1:0
  name Expression4
  xpos -56
  ypos 542
 }
 Crop {
  box {0 0 1920 1080}
  name Crop1
  xpos -56
  ypos 581
 }
 Output {
  name Output1
  xpos -56
  ypos 658
 }
 Viewer {
  frame 1
  frame_range 1-30
  colour_sample_bbox {-0.2833333313 0.2479166687 -0.2822916806 0.2489583343}
  name Viewer1
  selected true
  xpos -298
  ypos 470
 }
end_group
set N5fecd600 [stack 0]
Dot {
 name Dot2
 selected true
 xpos -253
 ypos 227
}
Dot {
 name Dot1
 selected true
 xpos -253
 ypos 590
}
push $N5fecd600
Expression {
 expr0 0
 expr1 0
 expr2 b
 expr3 b
 name Expression3
 tile_color 0xffff
 selected true
 xpos 431
 ypos 298
}
Crop {
 box {{curve x1 595 594 594 594 594 594 593 592 592 591 586 577 562 544 523 500 472 445 419 398 379 359 340 321 302 284 265 244 222 201} {curve x1 548 561 574 587 600 613 626 639 652 665 679 694 710 727 743 755 753 750 746 742 736 729 721 712 701 686 654 620 586 549} {curve x1 1127 1127 1124 1107 1090 1074 1056 1039 1022 1004 985 967 948 929 910 893 878 862 844 825 806 785 762 739 716 696 676 656 637 617} {curve x1 1080 1080 1080 1080 1080 1080 1080 1080 1080 1080 1080 1080 1080 1080 1080 1080 1080 1080 1080 1080 1080 1080 1080 1080 1080 1080 1067 1042 1016 991}}
 name Crop3
 label AutoCrop
 selected true
 xpos 431
 ypos 322
 icon warning.xpm
}
Transform {
 scale {1 -1}
 center {{"bbox.r - (bbox.r - bbox.x)/2"} {bbox.y+yOffset}}
 name Transform3
 selected true
 xpos 431
 ypos 449
 addUserKnob {20 User}
 addUserKnob {7 yOffset}
 yOffset 10
}
set N31461800 [stack 0]
Ramp {
 replace true
 p0 {{curve} {bbox.t}}
 p1 {{curve} {bbox.y}}
 name Ramp1
 selected true
 xpos 572
 ypos 449
}
push $N31461800
Multiply {
 inputs 1+1
 value 0
 name Multiply1
 selected true
 xpos 439
 ypos 524
}
push 0
push $N5fecd600
Expression {
 expr0 0
 expr1 g
 expr2 0
 expr3 g
 name Expression2
 tile_color 0xff00ff
 selected true
 xpos 164
 ypos 296
}
Crop {
 box {{curve x1 1743 1742 1742 1742 1742 1742 1741 1740 1740 1739 1734 1725 1710 1692 1671 1648 1620 1593 1567 1546 1527 1507 1488 1469 1450 1432 1413 1392 1370 1349} {curve x1 741 748 755 760 764 594 434 447 460 473 487 502 518 535 551 563 561 558 554 550 544 537 529 520 509 494 462 428 394 357} {curve x1 1920 1920 1920 1920 1920 1920 1920 1920 1920 1920 1920 1920 1920 1920 1920 1920 1920 1920 1920 1920 1920 1920 1910 1887 1864 1844 1824 1804 1785 1765} {curve x1 783 801 818 834 849 863 874 883 892 908 919 927 934 942 950 957 963 969 972 973 971 963 952 937 919 898 875 850 824 799}}
 name Crop2
 label AutoCrop
 selected true
 xpos 164
 ypos 320
 icon warning.xpm
}
Transform {
 scale {1 -1}
 center {{"bbox.r - (bbox.r - bbox.x)/2"} {bbox.y+yOffset}}
 name Transform2
 selected true
 xpos 164
 ypos 435
 addUserKnob {20 User}
 addUserKnob {7 yOffset}
 yOffset 10
}
set N31461c00 [stack 0]
Ramp {
 replace true
 p0 {{curve} {bbox.t}}
 p1 {{curve} {bbox.y}}
 name Ramp2
 selected true
 xpos 244
 ypos 463
}
push $N31461c00
Multiply {
 inputs 1+1
 value 0
 name Multiply2
 selected true
 xpos 164
 ypos 522
}
push $N5fecd600
Expression {
 expr0 r
 expr1 0
 expr2 0
 expr3 r
 name Expression1
 tile_color 0xff0000ff
 selected true
 xpos -96
 ypos 313
}
Crop {
 box {{curve x1 0 0 5 27 49 71 94 117 140 164 188 212 237 263 288 311 331 352 375 400 426 454 484 514 545 572 598 624 650 676} {curve x1 146 163 180 198 215 232 250 267 284 301 319 340 361 383 404 420 418 414 409 403 395 386 375 363 349 329 287 242 196 148} {curve x1 704 705 705 705 705 705 706 707 708 709 715 728 747 771 799 830 867 902 936 964 990 1016 1041 1066 1091 1115 1141 1169 1197 1225} {curve x1 864 866 867 868 870 872 875 878 882 886 893 901 910 920 931 940 949 956 960 962 959 949 934 914 890 862 832 799 765 731}}
 name Crop1
 label AutoCrop
 selected true
 xpos -96
 ypos 337
 icon warning.xpm
}
Transform {
 scale {1 -1}
 center {{"bbox.r - (bbox.r - bbox.x)/2"} {bbox.y+yOffset}}
 name Transform1
 selected true
 xpos -96
 ypos 411
 addUserKnob {20 User}
 addUserKnob {7 yOffset}
 yOffset 10
}
set N26c3e800 [stack 0]
Ramp {
 replace true
 p0 {{curve} {bbox.t}}
 p1 {{curve} {bbox.y}}
 name Ramp3
 selected true
 xpos -7
 ypos 469
}
push $N26c3e800
Multiply {
 inputs 1+1
 value 0
 name Multiply3
 selected true
 xpos -96
 ypos 528
}
Merge2 {
 inputs 4+1
 name Merge1
 selected true
 xpos 164
 ypos 625
}
Viewer {
 frame 1
 frame_range 1-100
 colour_sample_bbox {-0.3541666567 0.2947916687 -0.353125006 0.2958333194}
 name Viewer1
 selected true
 xpos 164
 ypos 784
}